ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzU4MzEKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjYgQEAKKyoucHljCisqLnB5bworLyoucGF0Y2gKK2J1aWxkKi8KK3B5c2h0YWJsZXMucHkKK3BzdGFnZS8KK3NjcmlwdHMvb2UtZ2l0LXByb3h5LXNvY2tzCitzb3VyY2VzLworbWV0YS0qLworIW1ldGEtc2tlbGV0b24KKyFtZXRhLXNlbGZ0ZXN0Citob2ItaW1hZ2UtKi5iYgorKi5zd3AKKyoub3JpZworKi5yZWoKKyp+CishbWV0YS15b2N0bworIW1ldGEteW9jdG8tYnNwCishbWV0YS15b2N0by1pbXBvcnRlZAorZG9jdW1lbnRhdGlvbi91c2VyLW1hbnVhbC91c2VyLW1hbnVhbC5odG1sCitkb2N1bWVudGF0aW9uL3VzZXItbWFudWFsL3VzZXItbWFudWFsLnBkZgorZG9jdW1lbnRhdGlvbi91c2VyLW1hbnVhbC91c2VyLW1hbnVhbC50Z3oKK3B1bGwtKi8KK2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvYmFja2xvZy50eHQKK2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvbG9nLyoKK2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvLmNhY2hlLyoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8udGVtcGxhdGVjb25mIGIvLnRlbXBsYXRlY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUwYTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvLnRlbXBsYXRlY29uZgpAQCAtMCwwICsxLDIgQEAKKyMgVGVtcGxhdGUgc2V0dGluZ3MKK1RFTVBMQVRFQ09ORj0ke1RFTVBMQVRFQ09ORjotbWV0YS15b2N0by9jb25mfQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYTZlNgotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSwxNCBAQAorRGlmZmVyZW50IGNvbXBvbmVudHMgb2YgT3BlbkVtYmVkZGVkIGFyZSB1bmRlciBkaWZmZXJlbnQgbGljZW5zZXMgKGEgbWl4CitvZiBNSVQgYW5kIEdQTHYyKS4gUGxlYXNlIHNlZToKKworbWV0YS9DT1BZSU5HLkdQTHYyIChHUEx2MikKK21ldGEvQ09QWUlORy5NSVQgKE1JVCkKK21ldGEtc2VsZnRlc3QvQ09QWUlORy5NSVQgKE1JVCkKK21ldGEtc2tlbGV0b24vQ09QWUlORy5NSVQgKE1JVCkKKworQWxsIG1ldGFkYXRhIGlzIE1JVCBsaWNlbnNlZCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZC4gU291cmNlIGNvZGUKK2luY2x1ZGVkIGluIHRyZWUgZm9yIGluZGl2aWR1YWwgcmVjaXBlcyBpcyB1bmRlciB0aGUgTElDRU5TRSBzdGF0ZWQgaW4KK3RoZSBhc3NvY2lhdGVkIHJlY2lwZSAoLmJiIGZpbGUpIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLgorCitMaWNlbnNlIGluZm9ybWF0aW9uIGZvciBhbnkgb3RoZXIgZmlsZXMgaXMgZWl0aGVyIGV4cGxpY2l0bHkgc3RhdGVkIAorb3IgZGVmYXVsdHMgdG8gR1BMIHZlcnNpb24gMi4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQ5MzA5Ci0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsNTggQEAKK1Bva3kKKz09PT0KKworUG9reSBpcyBhbiBpbnRlZ3JhdGlvbiBvZiB2YXJpb3VzIGNvbXBvbmVudHMgdG8gZm9ybSBhIGNvbXBsZXRlIHByZXBhY2thZ2VkCitidWlsZCBzeXN0ZW0gYW5kIGRldmVsb3BtZW50IGVudmlyb25tZW50LiBJdCBmZWF0dXJlcyBzdXBwb3J0IGZvciBidWlsZGluZworY3VzdG9taXNlZCBlbWJlZGRlZCBkZXZpY2Ugc3R5bGUgaW1hZ2VzLiBUaGVyZSBhcmUgcmVmZXJlbmNlIGRlbW8gaW1hZ2VzCitmZWF0dXJpbmcgYSBYMTEvTWF0Y2hib3gvR1RLIHRoZW1lZCBVSSBjYWxsZWQgU2F0by4gVGhlIHN5c3RlbSBzdXBwb3J0cworY3Jvc3MtYXJjaGl0ZWN0dXJlIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHVzaW5nIFFFTVUgZW11bGF0aW9uIGFuZCBhCitzdGFuZGFsb25lIHRvb2xjaGFpbiBhbmQgU0RLIHdpdGggSURFIGludGVncmF0aW9uLgorCitBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSBzcGVjaWZpY3Mgb2YgaGFyZHdhcmUgdGhhdCBQb2t5IHN1cHBvcnRzCitpcyBhdmFpbGFibGUgaW4gUkVBRE1FLmhhcmR3YXJlLiBGdXJ0aGVyIGhhcmR3YXJlIHN1cHBvcnQgY2FuIGVhc2lseSBiZSBhZGRlZAoraW4gdGhlIGZvcm0gb2YgbGF5ZXJzIHdoaWNoIGV4dGVuZCB0aGUgc3lzdGVtcyBjYXBhYmlsaXRpZXMgaW4gYSBtb2R1bGFyIHdheS4KKworQXMgYW4gaW50ZWdyYXRpb24gbGF5ZXIgUG9reSBjb25zaXN0cyBvZiBzZXZlcmFsIHVwc3RyZWFtIHByb2plY3RzIHN1Y2ggYXMgCitCaXRCYWtlLCBPcGVuRW1iZWRkZWQtQ29yZSwgWW9jdG8gZG9jdW1lbnRhdGlvbiBhbmQgdmFyaW91cyBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIAorZS5nLiBmb3IgdGhlIGhhcmR3YXJlIHN1cHBvcnQuIFBva3kgaXMgaW4gdHVybiBhIGNvbXBvbmVudCBvZiB0aGUgWW9jdG8gUHJvamVjdC4KKworVGhlIFlvY3RvIFByb2plY3QgaGFzIGV4dGVuc2l2ZSBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBzeXN0ZW0gaW5jbHVkaW5nIGEgCityZWZlcmVuY2UgbWFudWFsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdDoKKyAgICBodHRwOi8veW9jdG9wcm9qZWN0Lm9yZy9kb2N1bWVudGF0aW9uCisKK09wZW5FbWJlZGRlZC1Db3JlIGlzIGEgbGF5ZXIgY29udGFpbmluZyB0aGUgY29yZSBtZXRhZGF0YSBmb3IgY3VycmVudCB2ZXJzaW9ucworb2YgT3BlbkVtYmVkZGVkLiBJdCBpcyBkaXN0cm8tbGVzcyAoY2FuIGJ1aWxkIGEgZnVuY3Rpb25hbCBpbWFnZSB3aXRoCitESVNUUk8gPSAibm9kaXN0cm8iKSBhbmQgY29udGFpbnMgb25seSBlbXVsYXRlZCBtYWNoaW5lIHN1cHBvcnQuCisKK0ZvciBpbmZvcm1hdGlvbiBhYm91dCBPcGVuRW1iZWRkZWQsIHNlZSB0aGUgT3BlbkVtYmVkZGVkIHdlYnNpdGU6CisgICAgaHR0cDovL3d3dy5vcGVuZW1iZWRkZWQub3JnLworCitXaGVyZSB0byBTZW5kIFBhdGNoZXMKKz09PT09PT09PT09PT09PT09PT09PQorCitBcyBQb2t5IGlzIGFuIGludGVncmF0aW9uIHJlcG9zaXRvcnkgKGJ1aWx0IHVzaW5nIGEgdG9vbCBjYWxsZWQgY29tYm8tbGF5ZXIpLAorcGF0Y2hlcyBhZ2FpbnN0IHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgc2hvdWxkIGJlIHNlbnQgdG8gdGhlaXIgcmVzcGVjdGl2ZQordXBzdHJlYW1zOgorCitiaXRiYWtlOgorICAgIEdpdCByZXBvc2l0b3J5OiBodHRwOi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZS8KKyAgICBNYWlsaW5nIGxpc3Q6IGJpdGJha2UtZGV2ZWxAbGlzdHMub3BlbmVtYmVkZGVkLm9yZworCitkb2N1bWVudGF0aW9uOgorICAgIEdpdCByZXBvc2l0b3J5OiBodHRwOi8vZ2l0LnlvY3RvcHJvamVjdC5vcmcvY2dpdC9jZ2l0LmNnaS95b2N0by1kb2NzLworICAgIE1haWxpbmcgbGlzdDogeW9jdG9AeW9jdG9wcm9qZWN0Lm9yZworCittZXRhLXlvY3RvKC1ic3ApOgorICAgIEdpdCByZXBvc2l0b3J5OiBodHRwOi8vZ2l0LnlvY3RvcHJvamVjdC5vcmcvY2dpdC9jZ2l0LmNnaS9tZXRhLXlvY3RvKC1ic3ApCisgICAgTWFpbGluZyBsaXN0OiBwb2t5QHlvY3RvcHJvamVjdC5vcmcKKworRXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBzZW50IHRvIHRoZSBPcGVuRW1iZWRkZWQgQ29yZSBtYWlsaW5nIGxpc3QuICBJZiBpbgorZG91YnQsIGNoZWNrIHRoZSBvZS1jb3JlIGdpdCByZXBvc2l0b3J5IGZvciB0aGUgY29udGVudCB5b3UgaW50ZW5kIHRvIG1vZGlmeS4KK0JlZm9yZSBzZW5kaW5nLCBiZSBzdXJlIHRoZSBwYXRjaGVzIGFwcGx5IGNsZWFubHkgdG8gdGhlIGN1cnJlbnQgb2UtY29yZSBnaXQKK3JlcG9zaXRvcnkuCisKKyAgICBHaXQgcmVwb3NpdG9yeTogaHR0cDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL29wZW5lbWJlZGRlZC1jb3JlLworICAgIE1haWxpbmcgbGlzdDogb3BlbmVtYmVkZGVkLWNvcmVAbGlzdHMub3BlbmVtYmVkZGVkLm9yZworCitOb3RlOiBUaGUgc2NyaXB0cyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyZWF0ZWQgd2l0aCBleHRyYSBjYXJlIGFzIGl0IGlzIGEgbWl4IG9mCitvZS1jb3JlIGFuZCBwb2t5LXNwZWNpZmljIGZpbGVzLgpkaWZmIC0tZ2l0IGEvUkVBRE1FLmhhcmR3YXJlIGIvUkVBRE1FLmhhcmR3YXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzRjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUuaGFyZHdhcmUKQEAgLTAsMCArMSw1MDAgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUG9reSBIYXJkd2FyZSBSRUFETUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBmaWxlIGdpdmVzIGRldGFpbHMgYWJvdXQgdXNpbmcgUG9reSB3aXRoIHRoZSByZWZlcmVuY2UgbWFjaGluZXMKK3N1cHBvcnRlZCBvdXQgb2YgdGhlIGJveC4gQSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIHJlZmVyZW5jZSB0YXJnZXQgbWFjaGluZXMKK2NhbiBiZSBmb3VuZCBieSBsb29raW5nIGluIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXM6CisKKyAgIG1ldGEvY29uZi9tYWNoaW5lLworICAgbWV0YS15b2N0by1ic3AvY29uZi9tYWNoaW5lLworCitJZiB5b3UgYXJlIGluIGRvdWJ0IGFib3V0IHVzaW5nIFBva3kvT3BlbkVtYmVkZGVkIHdpdGggeW91ciBoYXJkd2FyZSwgY29uc3VsdAordGhlIGRvY3VtZW50YXRpb24gZm9yIHlvdXIgYm9hcmQvZGV2aWNlLgorCitTdXBwb3J0IGZvciBhZGRpdGlvbmFsIGRldmljZXMgaXMgbm9ybWFsbHkgYWRkZWQgYnkgY3JlYXRpbmcgQlNQIGxheWVycyAtIGZvcgorbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIHRoZSBZb2N0byBCb2FyZCBTdXBwb3J0IFBhY2thZ2UgKEJTUCkgRGV2ZWxvcGVyJ3MKK0d1aWRlIC0gZG9jdW1lbnRhdGlvbiBzb3VyY2UgaXMgaW4gZG9jdW1lbnRhdGlvbi9ic3BndWlkZSBvciBkb3dubG9hZCB0aGUgUERGCitmcm9tOgorCisgICBodHRwOi8veW9jdG9wcm9qZWN0Lm9yZy9kb2N1bWVudGF0aW9uCisKK1N1cHBvcnQgZm9yIHBoeXNpY2FsIHJlZmVyZW5jZSBoYXJkd2FyZSBoYXMgbm93IGJlZW4gc3BsaXQgb3V0IGludG8gYQorbWV0YS15b2N0by1ic3AgbGF5ZXIgd2hpY2ggY2FuIGJlIHJlbW92ZWQgc2VwYXJhdGVseSBmcm9tIG90aGVyIGxheWVycyBpZiBub3QKK25lZWRlZC4KKworCitRRU1VIEVtdWxhdGlvbiBUYXJnZXRzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RvIHNpbXBsaWZ5IGRldmVsb3BtZW50LCB0aGUgYnVpbGQgc3lzdGVtIHN1cHBvcnRzIGJ1aWxkaW5nIGltYWdlcyB0bword29yayB3aXRoIHRoZSBRRU1VIGVtdWxhdG9yIGluIHN5c3RlbSBlbXVsYXRpb24gbW9kZS4gU2V2ZXJhbCBhcmNoaXRlY3R1cmVzCithcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKKworICAqIEFSTSAocWVtdWFybSkKKyAgKiB4ODYgKHFlbXV4ODYpCisgICogeDg2LTY0IChxZW11eDg2LTY0KQorICAqIFBvd2VyUEMgKHFlbXVwcGMpCisgICogTUlQUyAocWVtdW1pcHMpCisKK1VzZSBvZiB0aGUgUUVNVSBpbWFnZXMgaXMgY292ZXJlZCBpbiB0aGUgWW9jdG8gUHJvamVjdCBSZWZlcmVuY2UgTWFudWFsLgorVGhlIGFwcHJvcHJpYXRlIE1BQ0hJTkUgdmFyaWFibGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgdGFyZ2V0IGlzIGdpdmVuCitpbiBicmFja2V0cy4KKworCitIYXJkd2FyZSBSZWZlcmVuY2UgQm9hcmRzCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgYm9hcmRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIG1ldGEteW9jdG8tYnNwIGxheWVyOgorCisgICogVGV4YXMgSW5zdHJ1bWVudHMgQmVhZ2xlYm9uZSAoYmVhZ2xlYm9uZSkKKyAgKiBGcmVlc2NhbGUgTVBDODMxNUUtUkRCIChtcGM4MzE1ZS1yZGIpCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgYm9hcmQncyBzZWN0aW9uIGJlbG93LiBUaGUgYXBwcm9wcmlhdGUgTUFDSElORQordmFyaWFibGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgYm9hcmQgaXMgZ2l2ZW4gaW4gYnJhY2tldHMuCisKK1JlZmVyZW5jZSBCb2FyZCBNYWludGVuYW5jZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NlbmQgcHVsbCByZXF1ZXN0cywgcGF0Y2hlcywgY29tbWVudHMgb3IgcXVlc3Rpb25zIGFib3V0IG1ldGEteW9jdG8tYnNwcyB0byBwb2t5QHlvY3RvcHJvamVjdC5vcmcKKworTWFpbnRhaW5lcnM6IEtldmluIEhhbyA8a2V4aW4uaGFvQHdpbmRyaXZlci5jb20+CisgICAgICAgICAgICAgQnJ1Y2UgQXNoZmllbGQgPGJydWNlLmFzaGZpZWxkQHdpbmRyaXZlci5jb20+CisKK0NvbnN1bWVyIERldmljZXMKKz09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBjb25zdW1lciBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIG1ldGEteW9jdG8tYnNwIGxheWVyOgorCisgICogSW50ZWwgeDg2IGJhc2VkIFBDcyBhbmQgZGV2aWNlcyAoZ2VuZXJpY3g4NikKKyAgKiBVYmlxdWl0aSBOZXR3b3JrcyBFZGdlUm91dGVyIExpdGUgKGVkZ2Vyb3V0ZXIpCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgZGV2aWNlJ3Mgc2VjdGlvbiBiZWxvdy4gVGhlIGFwcHJvcHJpYXRlIE1BQ0hJTkUKK3ZhcmlhYmxlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRldmljZSBpcyBnaXZlbiBpbiBicmFja2V0cy4KKworCisKKyAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpYyBIYXJkd2FyZSBEb2N1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0ludGVsIHg4NiBiYXNlZCBQQ3MgYW5kIGRldmljZXMgKGdlbmVyaWN4ODYpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGdlbmVyaWN4ODYgTUFDSElORSBpcyB0ZXN0ZWQgb24gdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6CisKK0ludGVsIFhlb24vQ29yZSBpLVNlcmllczoKKyAgKyBJbnRlbCBSb21sZXkgU2VydmVyOiBTYW5keSBCcmlkZ2UgWGVvbiBwcm9jZXNzb3IsIEM2MDAgUENIIChQYXRzYnVyZyksIChDYW5vZSBQYXNzIENSQikKKyAgKyBJbnRlbCBSb21sZXkgU2VydmVyOiBJdnkgQnJpZGdlIFhlb24gcHJvY2Vzc29yLCBDNjAwIFBDSCAoUGF0c2J1cmcpLCAoSW50ZWwgU0RQIFMyUjMpCisgICsgSW50ZWwgQ3J5c3RhbCBGb3Jlc3QgU2VydmVyOiBTYW5keSBCcmlkZ2UgWGVvbiBwcm9jZXNzb3IsIERIODl4eCBQQ0ggKENhdmUgQ3JlZWspLCAoU3RhcmdvIENSQikKKyAgKyBJbnRlbCBDaGllZiBSaXZlciBNb2JpbGU6IEl2eSBCcmlkZ2UgTW9iaWxlIHByb2Nlc3NvciwgUU03NyBQQ0ggKFBhbnRoZXIgUG9pbnQtTSksIChFbWVyYWxkIExha2UgSUkgQ1JCLCBTYWJpbm8gQ2FueW9uIENSQikKKyAgKyBJbnRlbCBIdXJvbiBSaXZlciBNb2JpbGU6IFNhbmR5IEJyaWRnZSBwcm9jZXNzb3IsIFFNNjcgUENIIChDb3VnYXIgUG9pbnQpLCAoRW1lcmFsZCBMYWtlIENSQiwgRVZPQyBFQzctMTgxN0xOQVIgYm9hcmQpCisgICsgSW50ZWwgQ2FscGVsbGEgUGxhdGZvcm06IENvcmUgaTcgcHJvY2Vzc29yLCBRTTU3IFBDSCAoSWJleCBQZWFrLU0pLCAoUmVkIEZvcnQgQ1JCLCBFbWVyc29uIE1BVFhNIENPUkUtNDExLUIpCisgICsgSW50ZWwgTmVoYWxlbS9XZXN0bWVyZS1FUCBTZXJ2ZXI6IFhlb24gNTZ4eC81NXh4IHByb2Nlc3NvcnMsIDU1MjAgY2hpcHNldCwgSUNIMTBSIElPSCAoODI4MDEpLCAoSGFubGFuIENyZWVrIENSQikKKyAgKyBJbnRlbCBOZWhhbGVtIFdvcmtzdGF0aW9uOiBYZW9uIDU2eHgvNTV4eCBwcm9jZXNzb3JzLCBTeXN0ZW0gU0M1NjUwU0NXUyAoR3JlZW5jaXR5IENSQikKKyAgKyBJbnRlbCBQaWNrZXQgUG9zdCBTZXJ2ZXI6IFhlb24gNTZ4eC81NXh4IHByb2Nlc3NvcnMgKEphc3BlciBGb3Jlc3QpLCAzNDIwIGNoaXBzZXQgKEliZXggUGVhayksIChPc2FnZSBDUkIpCisgICsgSW50ZWwgU3RvcmFnZSBQbGF0Zm9ybTogU2FuZHkgQnJpZGdlIFhlb24gcHJvY2Vzc29yLCBDNjAwIFBDSCAoUGF0c2J1cmcpLCAoT2FrIENyZWVrIENhbnlvbiBDUkIpCisgICsgSW50ZWwgU2hhcmsgQmF5IENsaWVudCBQbGF0Zm9ybTogSGFzd2VsbCBwcm9jZXNzb3IsIEx5bnhQb2ludCBQQ0gsIChXYWxudXQgQ2FueW9uIENSQiwgTGF2YSBDYW55b24gQ1JCLCBCYXNraW5nIFJpZGdlIENSQiwgRmxhdGhlYWQgQ3JlZWsgQ1JCKQorICArIEludGVsIFNoYXJrIEJheSBVbHRyYWJvb2sgUGxhdGZvcm06IEhhc3dlbGwgVUxUIHByb2Nlc3NvciwgTHlueCBQb2ludC1MUCBQQ0gsIChXaGl0ZVRpcCBNb3VudGFpbiAxIENSQikKKworSW50ZWwgQXRvbSBwbGF0Zm9ybXM6CisgICsgSW50ZWwgZW1iZWRkZWQgTWVubG93OiBJbnRlbCBBdG9tIFo1MTAvNTMwIENQVSwgU3lzdGVtIENvbnRyb2xsZXIgSHViIFVTMTVXIChQb3J0d2VsbCBOQU5PLTgwNDQpCisgICsgSW50ZWwgTHVuYSBQaWVyOiBJbnRlbCBBdG9tIE40eHgvRDV4eCBzZXJpZXMgQ1BVIChha2E6IFBpbmV2aWV3LUQgJiAtTSksIDgyODAxSE0gSS9PIEh1YiAoSUNIOE0pLCAoQWR2YW50ZWNoIEFJTUItMjEyLCBNb29uIENyZWVrIENSQikKKyAgKyBJbnRlbCBRdWVlbnMgQmF5IHBsYXRmb3JtOiBJbnRlbCBBdG9tIEU2eHggQ1BVIChha2E6IFR1bm5lbCBDcmVlayksIFRvcGNsaWZmIEVHMjBUIEkvTyBIdWIgKEVtZXJzb24gTklUWC0zMTUsIENyb3duIEJheSBDUkIsIE1pbm5vdyBCb2FyZCkKKyAgKyBJbnRlbCBGaXNoIFJpdmVyIElzbGFuZCBwbGF0Zm9ybTogSW50ZWwgQXRvbSBFNnh4IENQVSAoYWthOiBUdW5uZWwgQ3JlZWspLCBUb3BjbGlmZiBFRzIwVCBJL08gSHViIChLb250cm9uIEtNMk04MDYpCisgICsgSW50ZWwgQ2VkYXIgVHJhaWwgcGxhdGZvcm06IEludGVsIEF0b20gTjIwMDAgJiBEMjAwMCBzZXJpZXMgQ1BVIChha2E6IENlZGFydmlldyksIE5NMTAgRXhwcmVzcyBDaGlwc2V0IChOb3JjbyBraXQgQklTLTY2MzAsIENlZGFyIFJvY2sgQ1JCKQorCithbmQgaXMgbGlrZWx5IHRvIHdvcmsgb24gbWFueSB1bmxpc3RlZCBBdG9tL0NvcmUvWGVvbiBiYXNlZCBkZXZpY2VzLiBUaGUgTUFDSElORQordHlwZSBzdXBwb3J0cyBldGhlcm5ldCwgd2lmaSwgc291bmQsIGFuZCBJbnRlbC92ZXNhIGdyYXBoaWNzIGJ5IGRlZmF1bHQgaW4KK2FkZGl0aW9uIHRvIGNvbW1vbiBQQyBpbnB1dCBkZXZpY2VzLCBidXNzZXMsIGFuZCBzbyBvbi4KKworRGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UsIGl0IGNhbiBib290IGZyb20gYSB0cmFkaXRpb25hbCBoYXJkLWRpc2ssIGEgVVNCIGRldmljZSwKK29yIG92ZXIgdGhlIG5ldHdvcmsuIFdyaXRpbmcgZ2VuZXJhdGVkIGltYWdlcyB0byBwaHlzaWNhbCBtZWRpYSBpcworc3RyYWlnaHRmb3J3YXJkIHdpdGggYSBjYXZlYXQgZm9yIFVTQiBkZXZpY2VzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIGFzc3VtZSB0aGUKK3RhcmdldCBib290IGRldmljZSBpcyAvZGV2L3NkYiwgYmUgc3VyZSB0byB2ZXJpZnkgdGhpcyBhbmQgdXNlIHRoZSBjb3JyZWN0CitkZXZpY2UgYXMgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgcnVuIGFzIHJvb3QgYW5kIGFyZSBub3QgcmV2ZXJzYWJsZS4KKworVVNCIERldmljZToKKyAgMS4gQnVpbGQgYSBsaXZlIGltYWdlLiBUaGlzIGltYWdlIHR5cGUgY29uc2lzdHMgb2YgYSBzaW1wbGUgZmlsZXN5c3RlbQorICAgICB3aXRob3V0IGEgcGFydGl0aW9uIHRhYmxlLCB3aGljaCBpcyBzdWl0YWJsZSBmb3IgVVNCIGtleXMsIGFuZCB3aXRoIHRoZQorICAgICBkZWZhdWx0IHNldHVwIGZvciB0aGUgZ2VuZXJpY3g4NiBtYWNoaW5lLCB0aGlzIGltYWdlIHR5cGUgaXMgYnVpbHQKKyAgICAgYXV0b21hdGljYWxseSBmb3IgYW55IGltYWdlIHlvdSBidWlsZC4gRm9yIGV4YW1wbGU6CisKKyAgICAgJCBiaXRiYWtlIGNvcmUtaW1hZ2UtbWluaW1hbAorCisgIDIuIFVzZSB0aGUgImRkIiB1dGlsaXR5IHRvIHdyaXRlIHRoZSBpbWFnZSB0byB0aGUgcmF3IGJsb2NrIGRldmljZS4gRm9yCisgICAgIGV4YW1wbGU6CisKKyAgICAgIyBkZCBpZj1jb3JlLWltYWdlLW1pbmltYWwtZ2VuZXJpY3g4Ni5oZGRpbWcgb2Y9L2Rldi9zZGIKKworICBJZiB0aGUgZGV2aWNlIGZhaWxzIHRvIGJvb3Qgd2l0aCAiQm9vdCBlcnJvciIgZGlzcGxheWVkLCBvciBhcHBhcmVudGx5CisgIHN0b3BzIGp1c3QgYWZ0ZXIgdGhlIFNZU0xJTlVYIHZlcnNpb24gYmFubmVyLCBpdCBpcyBsaWtlbHkgdGhlIEJJT1MgY2Fubm90CisgIHVuZGVyc3RhbmQgdGhlIHBoeXNpY2FsIGxheW91dCBvZiB0aGUgZGlzayAob3IgcmF0aGVyIGl0IGV4cGVjdHMgYQorICBwYXJ0aWN1bGFyIGxheW91dCBhbmQgY2Fubm90IGhhbmRsZSBhbnl0aGluZyBlbHNlKS4gVGhlcmUgYXJlIHR3byBwb3NzaWJsZQorICBzb2x1dGlvbnMgdG8gdGhpcyBwcm9ibGVtOgorCisgIDEuIENoYW5nZSB0aGUgQklPUyBVU0IgRGV2aWNlIHNldHRpbmcgdG8gSEREIG1vZGUuIFRoZSBsYWJlbCB3aWxsIHZhcnkgYnkKKyAgICAgZGV2aWNlLCBidXQgdGhlIGlkZWEgaXMgdG8gZm9yY2UgQklPUyB0byByZWFkIHRoZSBDeWxpbmRlci9IZWFkL1NlY3RvcgorICAgICBnZW9tZXRyeSBmcm9tIHRoZSBkZXZpY2UuCisKKyAgMi4gV2l0aG91dCBzdWNoIGFuIG9wdGlvbiwgdGhlIEJJT1MgZ2VuZXJhbGx5IGJvb3RzIHRoZSBkZXZpY2UgaW4gVVNCLVpJUAorICAgICBtb2RlLiBUbyB3cml0ZSBhbiBpbWFnZSB0byBhIFVTQiBkZXZpY2UgdGhhdCB3aWxsIGJlIGJvb3RhYmxlIGluCisgICAgIFVTQi1aSVAgbW9kZSwgY2Fycnkgb3V0IHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKworICAgICBhLiBEZXRlcm1pbmUgdGhlIGdlb21ldHJ5IG9mIHlvdXIgVVNCIGRldmljZSB1c2luZyBmZGlzazoKKworICAgICAjIGZkaXNrIC9kZXYvc2RiCisgICAgIENvbW1hbmQgKG0gZm9yIGhlbHApOiBwCisKKyAgICAgRGlzayAvZGV2L3NkYjogNDAxMSBNQiwgNDAxMTQ5MTMyOCBieXRlcworICAgICAxMjQgaGVhZHMsIDYyIHNlY3RvcnMvdHJhY2ssIDEwMTkgY3lsaW5kZXJzLCB0b3RhbCA3ODM0OTQ0IHNlY3RvcnMKKyAgICAgLi4uCisKKyAgICAgQ29tbWFuZCAobSBmb3IgaGVscCk6IHEKKworICAgICBiLiBDb25maWd1cmUgdGhlIFVTQiBkZXZpY2UgZm9yIFVTQi1aSVAgbW9kZToKKyAgICAgCisgICAgICMgbWtkaXNraW1hZ2UgLTQgL2Rldi9zZGIgMTAxOSAxMjQgNjIKKworICAgICBXaGVyZSAxMDE5LCAxMjQgYW5kIDYyIGFyZSB0aGUgY3lsaW5kZXIsIGhlYWQgYW5kIHNlY3RvcnMvdHJhY2sgY291bnRzCisgICAgIGFzIHJlcG9ydGVkIGJ5IGZkaXNrIChzdWJzdGl0dXRlIHRoZSB2YWx1ZXMgcmVwb3J0ZWQgZm9yIHlvdXIgZGV2aWNlKS4KKyAgICAgV2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBmaW5pc2hlZCBhbmQgdGhlIGFjY2VzcyBMRUQgKGlmIGFueSkgb24gdGhlCisgICAgIGRldmljZSBzdG9wcyBmbGFzaGluZywgcmVtb3ZlIGFuZCByZWluc2VydCB0aGUgZGV2aWNlIHRvIGFsbG93IHRoZQorICAgICBrZXJuZWwgdG8gZGV0ZWN0IHRoZSBuZXcgcGFydGl0aW9uIGxheW91dC4KKworICAgICBjLiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgaW1hZ2UgdG8gdGhlIFVTQi1aSVAgbW9kZSBkZXZpY2U6CisKKyAgICAgIyBta2RpciAvdG1wL2ltYWdlCisgICAgICMgbWtkaXIgL3RtcC91c2JrZXkKKyAgICAgIyBtb3VudCAtbyBsb29wIGNvcmUtaW1hZ2UtbWluaW1hbC1nZW5lcmljeDg2LmhkZGltZyAgL3RtcC9pbWFnZQorICAgICAjIG1vdW50IC9kZXYvc2RiNCAvdG1wL3VzYmtleQorICAgICAjIGNwIC1yZiAvdG1wL2ltYWdlLyogL3RtcC91c2JrZXkKKworICAgICBkLiBJbnN0YWxsIHRoZSBzeXNsaW51eCBib290IGxvYWRlcjoKKworICAgICAjIHN5c2xpbnV4IC9kZXYvc2RiNAorCisgICAgIGUuIFVubW91bnQgZXZlcnl0aGluZzoKKworICAgICAjIHVtb3VudCAvdG1wL2ltYWdlCisgICAgICMgdW1vdW50IC90bXAvdXNia2V5CisKKyAgSW5zdGFsbCB0aGUgYm9vdCBkZXZpY2UgaW4gdGhlIHRhcmdldCBib2FyZCBhbmQgY29uZmlndXJlIHRoZSBCSU9TIHRvIGJvb3QKKyAgZnJvbSBpdC4KKworICBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBVU0ItWklQIHNjZW5hcmlvLCBzZWUgdGhlIHN5c2xpbnV4IGRvY3VtZW50YXRpb246CisgIGh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1ib290L3N5c2xpbnV4L3N5c2xpbnV4LmdpdDthPWJsb2JfcGxhaW47Zj1kb2MvdXNia2V5LnR4dDtoYj1IRUFECisKKworVGV4YXMgSW5zdHJ1bWVudHMgQmVhZ2xlYm9uZSAoYmVhZ2xlYm9uZSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBCZWFnbGVib25lIGlzIGFuIEFSTSBDb3J0ZXgtQTggZGV2ZWxvcG1lbnQgYm9hcmQgd2l0aCBVU0IsIEV0aGVybmV0LCAyRC8zRAorYWNjZWxlcmF0ZWQgZ3JhcGhpY3MsIGF1ZGlvLCBzZXJpYWwsIEpUQUcsIGFuZCBTRC9NTUMuIFRoZSBCbGFjayBhZGRzIGEgZmFzdGVyCitDUFUsIG1vcmUgUkFNLCBlTU1DIGZsYXNoIGFuZCBhIG1pY3JvIEhETUkgcG9ydC4gVGhlIGJlYWdsZWJvbmUgTUFDSElORSBpcwordGVzdGVkIG9uIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zOgorCisgIG8gQmVhZ2xlYm9uZSBCbGFjayBBNgorICBvIEJlYWdsZWJvbmUgQTYgKHRoZSBvcmlnaW5hbCAiV2hpdGUiIG1vZGVsKQorCitUaGUgQmVhZ2xlYm9uZSBCbGFjayBoYXMgZU1NQywgd2hpbGUgdGhlIFdoaXRlIGRvZXMgbm90LiBQcmVzc2luZyB0aGUgVVNFUi9CT09UCitidXR0b24gd2hlbiBwb3dlcmluZyBvbiB3aWxsIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgYm9vdCBvcmRlci4gQnV0IGZvciB0aGUgc2FrZQorb2Ygc2ltcGxpY2l0eSwgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFzc3VtZSB5b3UgaGF2ZSBlcmFzZWQgdGhlIGVNTUMgb24gdGhlIEJsYWNrLAorc28gaXRzIGJvb3QgYmVoYXZpb3IgbWF0Y2hlcyB0aGF0IG9mIHRoZSBXaGl0ZSBhbmQgYm9vdHMgb2ZmIG9mIFNEIGNhcmQuIFRvIGRvCit0aGlzLCBpc3N1ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGZyb20gdGhlIHUtYm9vdCBwcm9tcHQ6CisKKyAgICAjIG1tYyBkZXYgMQorICAgICMgbW1jIGVyYXNlIDAgNTEyCisKK1RvIGZ1cnRoZXIgdGFpbG9yIHRoZXNlIGluc3RydWN0aW9ucyBmb3IgeW91ciBib2FyZCwgcGxlYXNlIHJlZmVyIHRvIHRoZQorZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vd3d3LmJlYWdsZWJvYXJkLm9yZy9ib25lIGFuZCBodHRwOi8vd3d3LmJlYWdsZWJvYXJkLm9yZy9ibGFjaworCitGcm9tIGEgTGludXggc3lzdGVtIHdpdGggYWNjZXNzIHRvIHRoZSBpbWFnZSBmaWxlcyBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHMKK2FzIHJvb3QsIHJlcGxhY2luZyBtbWNibGswKiB3aXRoIHRoZSBTRCBjYXJkIGRldmljZSBvbiB5b3VyIG1hY2hpbmUgKHN1Y2ggYXMgc2RjCitpZiB1c2VkIHZpYSBhIHVzYiBjYXJkIHJlYWRlcik6CisKKyAgMS4gUGFydGl0aW9uIGFuZCBmb3JtYXQgYW4gU0QgY2FyZDoKKyAgICAgIyBmZGlzayAtbHUgL2Rldi9tbWNibGswCisKKyAgICAgRGlzayAvZGV2L21tY2JsazA6IDM5NTEgTUIsIDM5NTEwMzQzNjggYnl0ZXMKKyAgICAgMjU1IGhlYWRzLCA2MyBzZWN0b3JzL3RyYWNrLCA0ODAgY3lsaW5kZXJzLCB0b3RhbCA3NzE2ODY0IHNlY3RvcnMKKyAgICAgVW5pdHMgPSBzZWN0b3JzIG9mIDEgKiA1MTIgPSA1MTIgYnl0ZXMKKworICAgICAgICAgICAgIERldmljZSBCb290ICAgICAgU3RhcnQgICAgICAgICBFbmQgICAgICBCbG9ja3MgIElkIFN5c3RlbQorICAgICAvZGV2L21tY2JsazBwMSAgICogICAgICAgICAgNjMgICAgICAxNDQ1ODQgICAgICAgNzIyNjEgICBjIFdpbjk1IEZBVDMyIChMQkEpCisgICAgIC9kZXYvbW1jYmxrMHAyICAgICAgICAgIDE0NDU4NSAgICAgIDQ2NTg4NCAgICAgIDE2MDY1MCAgODMgTGludXgKKworICAgICAjIG1rZnMudmZhdCAtRiAxNiAtbiAiYm9vdCIgL2Rldi9tbWNibGswcDEKKyAgICAgIyBta2UyZnMgLWogLUwgInJvb3QiIC9kZXYvbW1jYmxrMHAyCisKKyAgVGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoZSBTRCBjYXJkIHBhcnRpdGlvbnMgMSBhbmQgMiBhcmUgbW91bnRlZCBhdAorICAvbWVkaWEvYm9vdCBhbmQgL21lZGlhL3Jvb3QgcmVzcGVjdGl2ZWx5LiBSZW1vdmluZyB0aGUgY2FyZCBhbmQgcmVpbnNlcnRpbmcKKyAgaXQgd2lsbCBkbyBqdXN0IHRoYXQgb24gbW9zdCBtb2Rlcm4gTGludXggZGVza3RvcCBlbnZpcm9ubWVudHMuCisKKyAgVGhlIGZpbGVzIHJlZmVyZW5jZWQgYmVsb3cgYXJlIG1hZGUgYXZhaWxhYmxlIGFmdGVyIHRoZSBidWlsZCBpbgorICBidWlsZC90bXAvZGVwbG95L2ltYWdlcy4KKworICAyLiBJbnN0YWxsIHRoZSBib290IGxvYWRlcnMKKyAgICAgIyBjcCBNTE8tYmVhZ2xlYm9uZSAvbWVkaWEvYm9vdC9NTE8KKyAgICAgIyBjcCB1LWJvb3QtYmVhZ2xlYm9uZS5pbWcgL21lZGlhL2Jvb3QvdS1ib290LmltZworCisgIDMuIEluc3RhbGwgdGhlIHJvb3QgZmlsZXN5c3RlbQorICAgICAjIHRhciB4IC1DIC9tZWRpYS9yb290IC1mIGNvcmUtaW1hZ2UtJElNQUdFX1RZUEUtYmVhZ2xlYm9uZS50YXIuYnoyCisKKyAgNC4gSWYgdXNpbmcgY29yZS1pbWFnZS1iYXNlIG9yIGNvcmUtaW1hZ2Utc2F0byBpbWFnZXMsIHRoZSBTRCBjYXJkIGlzIHJlYWR5CisgICAgIGFuZCByb290ZnMgYWxyZWFkeSBjb250YWlucyB0aGUga2VybmVsLCBtb2R1bGVzIGFuZCBkZXZpY2UgdHJlZSAoRFRCKQorICAgICBmaWxlcyBuZWNlc3NhcnkgdG8gYmUgYm9vdGVkIHdpdGggVS1ib290J3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBzbworICAgICBza2lwIGRpcmVjdGx5IHRvIHN0ZXAgOC4KKyAgICAgRm9yIGNvcmUtaW1hZ2UtbWluaW1hbCwgcHJvY2VlZCB0aHJvdWdoIG5leHQgc3RlcHMuCisKKyAgNS4gSWYgdXNpbmcgY29yZS1pbWFnZS1taW5pbWFsIHJvb3RmcywgaW5zdGFsbCB0aGUgbW9kdWxlcworICAgICAjIHRhciB4IC1DIC9tZWRpYS9yb290IC1mIG1vZHVsZXMtYmVhZ2xlYm9uZS50Z3oKKworICA2LiBJZiB1c2luZyBjb3JlLWltYWdlLW1pbmltYWwgcm9vdGZzLCBpbnN0YWxsIHRoZSBrZXJuZWwgekltYWdlIGludG8gL2Jvb3QKKyAgICAgZGlyZWN0b3J5IG9mIHJvb3RmcworICAgICAjIGNwIHpJbWFnZS1iZWFnbGVib25lLmJpbiAvbWVkaWEvcm9vdC9ib290L3pJbWFnZQorCisgIDcuIElmIHVzaW5nIGNvcmUtaW1hZ2UtbWluaW1hbCByb290ZnMsIGFsc28gaW5zdGFsbCBkZXZpY2UgdHJlZSAoRFRCKSBmaWxlcworICAgICBpbnRvIC9ib290IGRpcmVjdG9yeSBvZiByb290ZnMKKyAgICAgIyBjcCB6SW1hZ2UtYW0zMzV4LWJvbmUuZHRiIC9tZWRpYS9yb290L2Jvb3QvYW0zMzV4LWJvbmUuZHRiCisgICAgICMgY3AgekltYWdlLWFtMzM1eC1ib25lYmxhY2suZHRiIC9tZWRpYS9yb290L2Jvb3QvYW0zMzV4LWJvbmVibGFjay5kdGIKKworICA4LiBVbm1vdW50IHRoZSBTRCBwYXJ0aXRpb25zLCBpbnNlcnQgdGhlIFNEIGNhcmQgaW50byB0aGUgQmVhZ2xlYm9uZSwgYW5kCisgICAgIGJvb3QgdGhlIEJlYWdsZWJvbmUKKworCitGcmVlc2NhbGUgTVBDODMxNUUtUkRCIChtcGM4MzE1ZS1yZGIpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNUEM4MzE1IFBvd2VyUEMgcmVmZXJlbmNlIHBsYXRmb3JtIChNUEM4MzE1RS1SREIpIGlzIGFpbWVkIGF0IGhhcmR3YXJlIGFuZAorc29mdHdhcmUgZGV2ZWxvcG1lbnQgb2YgbmV0d29yayBhdHRhY2hlZCBzdG9yYWdlIChOQVMpIGFuZCBkaWdpdGFsIG1lZGlhIHNlcnZlcgorYXBwbGljYXRpb25zLiBUaGUgTVBDODMxNUUtUkRCIGZlYXR1cmVzIHRoZSBQb3dlclFVSUNDIElJIFBybyBwcm9jZXNzb3IsIHdoaWNoCitpbmNsdWRlcyBhIGJ1aWx0LWluIHNlY3VyaXR5IGFjY2VsZXJhdG9yLgorCisoTm90ZTogeW91IG1heSBmaW5kIGl0IGVhc2llciB0byBvcmRlciBNUEM4MzE1RS1SREJBOyB0aGlzIGFwcGVhcnMgdG8gYmUgdGhlCitzYW1lIGJvYXJkIGluIGFuIGVuY2xvc3VyZSB3aXRoIGFjY2Vzc29yaWVzLiBJbiBhbnkgY2FzZSBpdCBpcyBmdWxseQorY29tcGF0aWJsZSB3aXRoIHRoZSBpbnN0cnVjdGlvbnMgZ2l2ZW4gaGVyZS4pCisKK1NldHVwIGluc3RydWN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1lvdSB3aWxsIG5lZWQgdGhlIGZvbGxvd2luZzoKKyogTkZTIHJvb3Qgc2V0dXAgb24geW91ciB3b3Jrc3RhdGlvbgorKiBURlRQIHNlcnZlciBpbnN0YWxsZWQgb24geW91ciB3b3Jrc3RhdGlvbgorKiBTdHJhaWdodC10aHJ1IDktY29uZHVjdG9yIHNlcmlhbCBjYWJsZSAoREI5LCBNL0YpIGNvbm5lY3RlZCBmcm9tIHlvdXIgCisgIFBDIHRvIFVBUlQxCisqIEV0aGVybmV0IGNvbm5lY3RlZCB0byB0aGUgZmlyc3QgZXRoZXJuZXQgcG9ydCBvbiB0aGUgYm9hcmQKKworLS0tIFByZXBhcmF0aW9uIC0tLQorCitOb3RlOiBpZiB5b3UgaGF2ZSBhbHRlcmVkIHlvdXIgYm9hcmQncyBldGhlcm5ldCBNQUMgYWRkcmVzcyhlcykgZnJvbSB0aGUKK2RlZmF1bHRzLCBvciB5b3UgbmVlZCB0byBkbyBzbyBiZWNhdXNlIHlvdSB3YW50IG11bHRpcGxlIGJvYXJkcyBvbiB0aGUgc2FtZQorbmV0d29yaywgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZSBkdHMgZmlsZSAocGF0Y2gKK2xpbnV4L2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzE1ZXJkYi5kdHMgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlKS4gSWYKK3lvdSBoYXZlIGxlZnQgdGhlbSBhdCB0aGUgZmFjdG9yeSBkZWZhdWx0IHRoZW4geW91IHNob3VsZG4ndCBuZWVkIHRvIGRvCithbnl0aGluZyBoZXJlLgorCistLS0gQm9vdGluZyBmcm9tIE5GUyByb290IC0tLQorCitMb2FkIHRoZSBrZXJuZWwgYW5kIGR0YiAoZGV2aWNlIHRyZWUgYmxvYiksIGFuZCBib290IHRoZSBzeXN0ZW0gYXMgZm9sbG93czoKKworIDEuIEdldCB0aGUga2VybmVsICh1SW1hZ2UtbXBjODMxNWUtcmRiLmJpbikgYW5kIGR0YiAodUltYWdlLW1wYzgzMTVlLXJkYi5kdGIpCisgICAgZmlsZXMgZnJvbSB0aGUgdG1wL2RlcGxveSBkaXJlY3RvcnksIGFuZCBtYWtlIHRoZW0gYXZhaWxhYmxlIG9uIHlvdXIgVEZUUAorICAgIHNlcnZlci4KKworIDIuIENvbm5lY3QgdGhlIGJvYXJkJ3MgZmlyc3Qgc2VyaWFsIHBvcnQgdG8geW91ciB3b3Jrc3RhdGlvbiBhbmQgdGhlbiBzdGFydCB1cAorICAgIHlvdXIgZmF2b3VyaXRlIHNlcmlhbCB0ZXJtaW5hbCBzbyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gaW50ZXJhY3Qgd2l0aAorICAgIHRoZSBzZXJpYWwgY29uc29sZS4gSWYgeW91IGRvbid0IGhhdmUgYSBmYXZvdXJpdGUsIHBpY29jb20gaXMgc3VnZ2VzdGVkOgorCisgICQgcGljb2NvbSAvZGV2L3R0eVVTQjAgLWIgMTE1MjAwCisKKyAzLiBQb3dlciB1cCBvciByZXNldCB0aGUgYm9hcmQgYW5kIHByZXNzIGEga2V5IG9uIHRoZSB0ZXJtaW5hbCB3aGVuIHByb21wdGVkCisgICAgdG8gZ2V0IHRvIHRoZSBVLUJvb3QgY29tbWFuZCBsaW5lCisKKyA0LiBTZXQgdXAgdGhlIGVudmlyb25tZW50IGluIFUtQm9vdDoKKworID0+IHNldGVudiBpcGFkZHIgPGJvYXJkIGlwPgorID0+IHNldGVudiBzZXJ2ZXJpcCA8dGZ0cCBzZXJ2ZXIgaXA+CisgPT4gc2V0ZW52IGJvb3RhcmdzIHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD08bmZzcm9vdCBpcD46PHJvb3RmcyBwYXRoPiBpcD08Ym9hcmQgaXA+OjxzZXJ2ZXIgaXA+OjxnYXRld2F5IGlwPjoyNTUuMjU1LjI1NS4wOm1wYzgzMTVlOmV0aDA6b2ZmIGNvbnNvbGU9dHR5UzAsMTE1MjAwCisKKyA1LiBEb3dubG9hZCB0aGUga2VybmVsIGFuZCBkdGIsIGFuZCBib290OgorCisgPT4gdGZ0cCAxMDAwMDAwIHVJbWFnZS1tcGM4MzE1ZS1yZGIuYmluCisgPT4gdGZ0cCAyMDAwMDAwIHVJbWFnZS1tcGM4MzE1ZS1yZGIuZHRiCisgPT4gYm9vdG0gMTAwMDAwMCAtIDIwMDAwMDAKKworLS0tIEJvb3RpbmcgZnJvbSBKRkZTMiByb290IC0tLQorCisgMS4gRmlyc3QgYm9vdCB0aGUgYm9hcmQgd2l0aCBORlMgcm9vdC4KKworIDIuIEVyYXNlIHRoZSBNVEQgcGFydGl0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyByb290OgorCisgICAgJCBmbGFzaF9lcmFzZWFsbCAgL2Rldi9tdGQzCisKKyAzLiBDb3B5IHRoZSBKRkZTMiBpbWFnZSB0byB0aGUgTVREIHBhcnRpdGlvbjoKKworICAgICQgZmxhc2hjcCBjb3JlLWltYWdlLW1pbmltYWwtbXBjODMxNWUtcmRiLmpmZnMyIC9kZXYvbXRkMworCisgNC4gVGhlbiByZWJvb3QgdGhlIGJvYXJkIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50IGluIFUtQm9vdDoKKworICAgID0+IHNldGVudiBib290YXJncyByb290PS9kZXYvbXRkYmxvY2szIHJvb3Rmc3R5cGU9amZmczIgY29uc29sZT10dHlTMCwxMTUyMDAKKworCitVYmlxdWl0aSBOZXR3b3JrcyBFZGdlUm91dGVyIExpdGUgKGVkZ2Vyb3V0ZXIpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBFZGdlUm91dGVyIExpdGUgaXMgcGFydCBvZiB0aGUgRWRnZU1heCBzZXJpZXMuIEl0IGlzIGEgTUlQUzY0IHJvdXRlcgorKGJhc2VkIG9uIHRoZSBDYXZpdW0gT2N0ZW9uIHByb2Nlc3Nvcikgd2l0aCA1MTJNQiBvZiBSQU0sIHdoaWNoIHVzZXMgYW4KK2ludGVybmFsIFVTQiBwZW5kcml2ZSBmb3Igc3RvcmFnZS4KKworU2V0dXAgaW5zdHJ1Y3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IHdpbGwgbmVlZCB0aGUgZm9sbG93aW5nOgorKiBSSjQ1IC0+IHNlcmlhbCAoInJvbGxvdmVyIikgY2FibGUgY29ubmVjdGVkIGZyb20geW91ciBQQyB0byB0aGUgQ09OU09MRQorICBwb3J0IG9uIHRoZSBkZXZpY2UKKyogRXRoZXJuZXQgY29ubmVjdGVkIHRvIHRoZSBmaXJzdCBldGhlcm5ldCBwb3J0IG9uIHRoZSBib2FyZAorCitJZiB1c2luZyBORlMgYXMgcGFydCBvZiB0aGUgc2V0dXAgcHJvY2VzcywgeW91IHdpbGwgYWxzbyBuZWVkOgorKiBORlMgcm9vdCBzZXR1cCBvbiB5b3VyIHdvcmtzdGF0aW9uCisqIFRGVFAgc2VydmVyIGluc3RhbGxlZCBvbiB5b3VyIHdvcmtzdGF0aW9uIChpZiBmZXRjaGluZyB0aGUga2VybmVsIGZyb20KKyAgVEZUUCwgc2VlIGJlbG93KS4KKworLS0tIFByZXBhcmF0aW9uIC0tLQorCitCdWlsZCBhbiBpbWFnZSAoZS5nLiBjb3JlLWltYWdlLW1pbmltYWwpIHVzaW5nICJlZGdlcm91dGVyIiBhcyB0aGUgTUFDSElORS4KK0luIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gaXQgaXMgYmFzZWQgb24gY29yZS1pbWFnZS1taW5pbWFsLiBBbm90aGVyIHRhcmdldAorbWF5IGJlIHNpbWlsaWFyIHdpdGggaXQuCisKKy0tLSBCb290aW5nIGZyb20gTkZTIHJvb3QgLyBrZXJuZWwgdmlhIFRGVFAgLS0tCisKK0xvYWQgdGhlIGtlcm5lbCwgYW5kIGJvb3QgdGhlIHN5c3RlbSBhcyBmb2xsb3dzOgorCisgMS4gR2V0IHRoZSBrZXJuZWwgKHZtbGludXgpIGZpbGUgZnJvbSB0aGUgdG1wL2RlcGxveS9pbWFnZXMvZWRnZXJvdXRlcgorICAgIGRpcmVjdG9yeSwgYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUgb24geW91ciBURlRQIHNlcnZlci4KKworIDIuIENvbm5lY3QgdGhlIGJvYXJkJ3MgZmlyc3Qgc2VyaWFsIHBvcnQgdG8geW91ciB3b3Jrc3RhdGlvbiBhbmQgdGhlbiBzdGFydCB1cAorICAgIHlvdXIgZmF2b3VyaXRlIHNlcmlhbCB0ZXJtaW5hbCBzbyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gaW50ZXJhY3Qgd2l0aAorICAgIHRoZSBzZXJpYWwgY29uc29sZS4gSWYgeW91IGRvbid0IGhhdmUgYSBmYXZvdXJpdGUsIHBpY29jb20gaXMgc3VnZ2VzdGVkOgorCisgICQgcGljb2NvbSAvZGV2L3R0eVMwIC1iIDExNTIwMAorCisgMy4gUG93ZXIgdXAgb3IgcmVzZXQgdGhlIGJvYXJkIGFuZCBwcmVzcyBhIGtleSBvbiB0aGUgdGVybWluYWwgd2hlbiBwcm9tcHRlZAorICAgIHRvIGdldCB0byB0aGUgVS1Cb290IGNvbW1hbmQgbGluZQorCisgNC4gU2V0IHVwIHRoZSBlbnZpcm9ubWVudCBpbiBVLUJvb3Q6CisKKyA9PiBzZXRlbnYgaXBhZGRyIDxib2FyZCBpcD4KKyA9PiBzZXRlbnYgc2VydmVyaXAgPHRmdHAgc2VydmVyIGlwPgorCisgNS4gRG93bmxvYWQgdGhlIGtlcm5lbCBhbmQgYm9vdDoKKworID0+IHRmdHAgdGZ0cCAkbG9hZGFkZHIgdm1saW51eAorID0+IGJvb3RvY3RsaW51eCAkbG9hZGFkZHIgY29yZW1hc2s9MHgzIHJvb3Q9L2Rldi9uZnMgcncgbmZzcm9vdD08bmZzcm9vdCBpcD46PHJvb3RmcyBwYXRoPiBpcD08Ym9hcmQgaXA+OjxzZXJ2ZXIgaXA+OjxnYXRld2F5IGlwPjo8bmV0bWFzaz46ZWRnZXJvdXRlcjpldGgwOm9mZiBtdGRwYXJ0cz1waHlzX21hcHBlZF9mbGFzaDo1MTJrKGJvb3QwKSw1MTJrKGJvb3QxKSw2NGtAMzA3MmsoZWVwcm9tKQorCistLS0gQm9vdGluZyBmcm9tIFVTQiByb290IC0tLQorCitUbyBib290IGZyb20gdGhlIFVTQiBkaXNrLCB5b3UgZWl0aGVyIG5lZWQgdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGVkZ2Vyb3V0ZXIKK2JveCBhbmQgcG9wdWxhdGUgaXQgZnJvbSBhbm90aGVyIGNvbXB1dGVyLCBvciB1c2UgYSBwcmV2aW91c2x5IGJvb3RlZCBORlMKK2ltYWdlIGFuZCBwb3B1bGF0ZSBmcm9tIHRoZSBlZGdlcm91dGVyIGl0c2VsZi4KKworVHlwZSAxOiBNb3VudGVkIFVTQiBkaXNrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYm9vdCBmcm9tIHRoZSBVU0IgZGlzayB0aGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBwYXJ0aXRpb25zIG9uIHRoZSBmYWN0b3J5CitVU0Igc3RvcmFnZS4gVGhlIHJlc3Qgb2YgdGhpcyBndWlkZSBhc3N1bWVzIHRoYXQgdGhlc2UgcGFydGl0aW9ucyBhcmUgbGVmdAoraW50YWN0LiBJZiB5b3UgY2hhbmdlIHRoZSBwYXJ0aXRpb24gc2NoZW1lLCB5b3UgbXVzdCB1cGRhdGUgeW91ciBib290IG1ldGhvZAorYXBwcm9wcmlhdGVseS4KKworVGhlIHN0YW5kYXJkIHBhcnRpdGlvbnMgYXJlOgorCisgIC0gMTogdmZhdCBwYXJ0aXRpb24gY29udGFpbmluZyBmYWN0b3J5IGtlcm5lbHMKKyAgLSAyOiBleHQzIHBhcnRpdGlvbiBmb3IgdGhlIHJvb3QgZmlsZXN5c3RlbS4KKworWW91IGNhbiBwbGFjZSB0aGUga2VybmVsIG9uIGVpdGhlciBwYXJ0aXRpb24gMSwgb3IgcGFydGl0aW9uIDIsIGJ1dCB0aGUgcm9vZnMKK211c3QgZ28gb24gcGFydGl0aW9uIDIgKGR1ZSB0byBpdHMgc2l6ZSkuCisKK05vdGU6IElmIHlvdSBwbGFjZSB0aGUga2VybmVsIG9uIHRoZSBleHQzIHBhcnRpdGlvbiwgeW91IG11c3QgcmUtY3JlYXRlIHRoZQorICAgICAgZXh0MyBmaWxlc3lzdGVtLCBzaW5jZSB0aGUgZmFjdG9yeSB1LWJvb3QgY2FuIG9ubHkgaGFuZGxlIDEyOCBieXRlIGlub2RlcyBhbmQKKyAgICAgIGNhbm5vdCByZWFkIHRoZSBwYXJ0aXRpb24gb3RoZXJ3aXNlLgorCitTdGVwczoKKworIDEuIFJlbW92ZSB0aGUgVVNCIGRpc2sgZnJvbSB0aGUgZWRnZXJvdXRlciBhbmQgaW5zZXJ0IGl0IGludG8gYSBjb21wdXRlcgorICAgIHRoYXQgaGFzIGFjY2VzcyB0byB5b3VyIGJ1aWxkIGFydGlmYWN0cy4KKworIDIuIENvcHkgdGhlIGtlcm5lbCBpbWFnZSB0byB0aGUgVVNCIHN0b3JhZ2UgKGFzc3VtaW5nIGRpc2NvdmVyZWQgYXMgJ3NkYicgb24KKyAgICB0aGUgZGV2ZWxvcG1lbnQgbWFjaGluZSk6CisKKyAgICAyYSkgaWYgYm9vdGluZyBmcm9tIHZmYXQKKyAKKyAgICAgICAgIyBtb3VudCAvZGV2L3NkYjEgL21udAorICAgICAgICAjIGNwIHRtcC9kZXBsb3kvaW1hZ2VzL2VkZ2Vyb3V0ZXIvdm1saW51eCAvbW50CisgICAgICAgICMgdW1vdW50IC9tbnQKKworICAgIDJiKSBpZiBib290aW5nIGZyb20gZXh0MworCisgICAgICAgICMgbWtmcy5leHQzIC1JIDEyOCAvZGV2L3NkYjIKKyAgICAgICAgIyBtb3VudCAvZGV2L3NkYjIgL21udAorICAgICAgICAjIG1rZGlyIC9tbnQvYm9vdAorICAgICAgICAjIGNwIHRtcC9kZXBsb3kvaW1hZ2VzL2VkZ2Vyb3V0ZXIvdm1saW51eCAvbW50L2Jvb3QKKyAgICAgICAgIyB1bW91bnQgL21udAorCisgMy4gRXh0cmFjdCB0aGUgcm9vdGZzIHRvIHRoZSBVU0Igc3RvcmFnZSBleHQzIHBhcnRpdGlvbgorCisgICAgICAgICMgbW91bnQgL2Rldi9zZGIyIC9tbnQKKyAgICAgICAgIyB0YXIgLXh2anBmIGNvcmUtaW1hZ2UtbWluaW1hbC1YWFgudGFyLmJ6MiAtQyAvbW50CisgICAgICAgICMgdW1vdW50IC9tbnQKKworIDQuIFJlYm9vdCB0aGUgYm9hcmQgYW5kIHByZXNzIGEga2V5IG9uIHRoZSB0ZXJtaW5hbCB3aGVuIHByb21wdGVkIHRvIGdldCB0byB0aGUgVS1Cb290CisgICAgY29tbWFuZCBsaW5lOgorCisgNS4gTG9hZCB0aGUga2VybmVsIGFuZCBib290OgorCisgICAgNWEpIHZmYXQgYm9vdAorCisgICAgICAgICA9PiBmYXRsb2FkIHVzYiAwOjEgJGxvYWRhZGRyIHZtbGludXgKKworICAgIDViKSBleHQzIGJvb3QKKworICAgICAgICAgPT4gZXh0MmxvYWQgdXNiIDA6MiAkbG9hZGFkZHIgYm9vdC92bWxpbnV4CisgCisgICAgPT4gYm9vdG9jdGxpbnV4ICRsb2FkYWRkciBjb3JlbWFzaz0weDMgcm9vdD0vZGV2L3NkYTIgcncgcm9vdHdhaXQgbXRkcGFydHM9cGh5c19tYXBwZWRfZmxhc2g6NTEyayhib290MCksNTEyayhib290MSksNjRrQDMwNzJrKGVlcHJvbSkKKyAKKworVHlwZSAyOiBORlMKKy0tLS0tLS0tLS0tCisKK05vdGU6IElmIHlvdSBwbGFjZSB0aGUga2VybmVsIG9uIHRoZSBleHQzIHBhcnRpdGlvbiwgeW91IG11c3QgcmUtY3JlYXRlIHRoZQorICAgICAgZXh0MyBmaWxlc3lzdGVtLCBzaW5jZSB0aGUgZmFjdG9yeSB1LWJvb3QgY2FuIG9ubHkgaGFuZGxlIDEyOCBieXRlIGlub2RlcyBhbmQKKyAgICAgIGNhbm5vdCByZWFkIHRoZSBwYXJ0aXRpb24gb3RoZXJ3aXNlLgorCisgICAgICBUaGVzZSBib290IGluc3RydWN0aW9ucyBhc3N1bWUgdGhhdCB5b3UgaGF2ZSByZWNyZWF0ZWQgdGhlIGV4dDMgZmlsZXN5c3RlbSB3aXRoCisgICAgICAxMjggYnl0ZSBpbm9kZXMsIHlvdSBoYXZlIGFuIHVwZGF0ZWQgdWJvb3Qgb3IgeW91IGFyZSBydW5uaW5nIGFuZCBpbWFnZSBjYXBhYmxlCisgICAgICBvZiBtYWtpbmcgdGhlIGZpbGVzeXN0ZW0gb24gdGhlIGJvYXJkIGl0c2VsZi4KKworCisgMS4gQm9vdCBmcm9tIE5GUyByb290CisKKyAyLiBNb3VudCB0aGUgVVNCIGRpc2sgcGFydGl0aW9uIDIgYW5kIHRoZW4gZXh0cmFjdCB0aGUgY29udGVudHMgb2YKKyAgICB0bXAvZGVwbG95L2NvcmUtaW1hZ2UtWFhYWC50YXIuYnoyIGludG8gaXQuCisKKyAgICBCZWZvcmUgc3RhcnRpbmcsIGNvcHkgY29yZS1pbWFnZS1taW5pbWFsLXh4eC50YXIuYnoyIGFuZCB2bWxpbnV4IGludG8KKyAgICByb290ZnMgcGF0aCBvbiB5b3VyIHdvcmtzdGF0aW9uLgorCisgICAgYW5kIHRoZW4sCisgIAorICAgICAgIyBtb3VudCAvZGV2L3NkYTIgL21lZGlhL3NkYTIKKyAgICAgICMgdGFyIC14dmpwZiBjb3JlLWltYWdlLW1pbmltYWwtWFhYLnRhci5iejIgLUMgL21lZGlhL3NkYTIKKyAgICAgICMgY3Agdm1saW51eCAvbWVkaWEvc2RhMi9ib290L3ZtbGludXgKKyAgICAgICMgdW1vdW50IC9tZWRpYS9zZGEyCisgICAgICAjIHJlYm9vdAorCisgMy4gUmVib290IHRoZSBib2FyZCBhbmQgcHJlc3MgYSBrZXkgb24gdGhlIHRlcm1pbmFsIHdoZW4gcHJvbXB0ZWQgdG8gZ2V0IHRvIHRoZSBVLUJvb3QKKyAgICBjb21tYW5kIGxpbmU6CisKKyAgICAjIHJlYm9vdAorCisgNC4gTG9hZCB0aGUga2VybmVsIGFuZCBib290OgorCisgICAgICA9PiBleHQybG9hZCB1c2IgMDoyICRsb2FkYWRkciBib290L3ZtbGludXgKKyAgICAgID0+IGJvb3RvY3RsaW51eCAkbG9hZGFkZHIgY29yZW1hc2s9MHgzIHJvb3Q9L2Rldi9zZGEyIHJ3IHJvb3R3YWl0IG10ZHBhcnRzPXBoeXNfbWFwcGVkX2ZsYXNoOjUxMmsoYm9vdDApLDUxMmsoYm9vdDEpLDY0a0AzMDcyayhlZXByb20pCmRpZmYgLS1naXQgYS9iaXRiYWtlL0FVVEhPUlMgYi9iaXRiYWtlL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmZDc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvQVVUSE9SUwpAQCAtMCwwICsxLDEwIEBACitUaW0gQW5zZWxsIDxtaXRocm9AbWl0aGlzLm5ldD4KK1BoaWwgQmx1bmRlbGwgPHBiQGhhbmRoZWxkcy5vcmc+CitTZWIgRnJhbmtlbmd1bCA8c2ViQGZyYW5rZW5ndWwub3JnPgorSG9sZ2VyIEZyZXl0aGVyIDxob2xnZXJAbW9pamktbW9iaWxlLmNvbT4KK01hcmNpbiBKdXN6a2lld2ljeiA8bWFyY2luQGp1c3praWV3aWN6LmNvbS5wbD4KK0NocmlzIExhcnNvbiA8a2VyZ290aEBoYW5kaGVsZHMub3JnPgorVWxyaWNoIEx1Y2thcyA8bHVja2FzQG11c29mdC5kZT4KK01pY2tleSBMYXVlciA8bWlja2V5QFZhbmlsbGUuZGU+CitSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBycHN5cy5uZXQ+CitIb2xnZXIgU2NodXJpZyA8aG9sZ2Vyc2NodXJpZ0BnbXguZGU+CmRpZmYgLS1naXQgYS9iaXRiYWtlL0NPUFlJTkcgYi9iaXRiYWtlL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxMTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvQ09QWUlORwpAQCAtMCwwICsxLDMzOSBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9iaXRiYWtlL0NoYW5nZUxvZyBiL2JpdGJha2UvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzJhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL0NoYW5nZUxvZwpAQCAtMCwwICsxLDMxNyBAQAorQ2hhbmdlcyBpbiBCaXRiYWtlIDEuOS54OgorCS0gQWRkIFBFIChQYWNrYWdlIEVwb2NoKSBzdXBwb3J0IGZyb20gUGhpbGlwcCBaYWJlbCAocEg1KQorCS0gVHJlYXQgcHl0aG9uIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBzaGVsbCBmdW5jdGlvbnMgZm9yIGxvZ2dpbmcKKwktIFVzZSBUTVBESVIvYW5vbmZ1bmMgYXMgYSBfX2Fub25mdW5jIHRlbXAgZGlyZWN0b3J5IChUKQorCS0gQ2F0Y2ggdHJ1bmNhdGVkIGNhY2hlIGZpbGUgZXJyb3JzCisJLSBBbGxvdyBvcGVyYXRpb25zIG90aGVyIHRoYW4gYXNzaWdubWVudCBvbiBmbGFnIHZhcmlhYmxlcworCS0gQWRkIGNvZGUgdG8gaGFuZGxlIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzCisJLSBGaXggY2FjaGUgZXJyb3JzIHdoZW4gZ2VuZXJhdGlvbiBkb3RHcmFwaHMKKwktIE1ha2Ugc3VyZSBfX2luaGVyaXRfY2FjaGUgaXMgdXBkYXRlZCBiZWZvcmUgY2FsbGluZyBpbmNsdWRlKCkgKGZyb20gTWljaGFlbCBLcmVsaW4pCisJLSBGaXggYnVnIHdoZW4gdGFyZ2V0IHdhcyBpbiBBU1NVTUVfUFJPVklERUQgKCMyMjM2KQorCS0gUmFpc2UgUGFyc2VFcnJvciBmb3IgZmlsZW5hbWVzIHdpdGggbXVsdGlwbGUgdW5kZXJzY29yZXMgaW5zdGVhZCBvZiBpbmZpbml0ZWx5IGxvb3BpbmcgKCMyMDYyKQorCS0gRml4IGludmFsaWQgcmVnZXhwIGluIEJCTUFTSyBlcnJvciBoYW5kbGluZyAobWlzc2luZyBpbXBvcnQpICgjMTEyNCkKKwktIFByb21vdGUgY2VydGFpbiB3YXJuaW5ncyBmcm9tIGRlYnVnIHRvIG5vdGUgMiBsZXZlbAorCS0gVXBkYXRlIG1hbnVhbAorCS0gQ29ycmVjdGx5IHJlZGlyZWN0IHN0ZGluIHdoZW4gZm9ya2luZworCS0gSWYgcGFyc2luZyBlcnJvcnMgYXJlIGZvdW5kLCBleGl0LCB0b28gbWFueSB1c2VycyBtaXNzIHRoZSBlcnJvcnMKKwktIFJlbW92ZSBzdXByaW91cnMgUFJFRkVSUkVEX1BST1ZJREVSIHdhcm5pbmdzCisJLSBzdm4gZmV0Y2hlcjogQWRkIF9idWlsZHN2bmNvbW1hbmQgZnVuY3Rpb24KKwktIEltcHJvdmUgY2VydGFpbiBlcnJvciBtZXNzYWdlcworCS0gUmV3cml0ZSBzdm4gZmV0Y2hlciB0byBtYWtlIGFkZGluZyBleHRyYSBvcGVyYXRpb25zIGVhc2llciAKKwkgIGFzIHBhcnQgb2YgZnV0dXJlIFNSQ0RBVEU9Im5vdyIgZml4ZXMKKwkgIChyZXF1aXJlcyBuZXcgRkVUQ0hDTURfc3ZuIGRlZmluaXRpb24gaW4gYml0YmFrZS5jb25mKQorCS0gQ2hhbmdlIFNWTkRJUiBsYXlvdXQgdG8gYmUgbW9yZSB1bmlxdWUgKGZpeGVzICMyNjQ0IGFuZCAjMjYyNCkKKwktIEFkZCBDb25maWdQYXJzZWQgRXZlbnQgYWZ0ZXIgY29uZmlndXJhdGlvbiBwYXJzaW5nIGlzIGNvbXBsZXRlCisJLSBBZGQgU1JDUkVWIHN1cHBvcnQgZm9yIHN2biBmZXRjaGVyCisJLSBkYXRhLmVtaXRfdmFyKCkgLSBvbmx5IGNhbGwgZ2V0VmFyIGlmIHdlIG5lZWQgdGhlIHZhcmlhYmxlCisJLSBTdG9wIGdlbmVyYXRpbmcgdGhlIEEgdmFyaWFibGUgKHNlZW1zIHRvIGJlIGxlZ2FjeSBjb2RlKQorCS0gTWFrZSBzdXJlIGludGVydGFzayBkZXBlbmRzIGdldCBwcm9jZXNzZWQgY29ycmVjdGluZyBpbiByZWN1cnNpdmUgZGVwZW5kcworCS0gQWRkIHBuLVBOIHRvIG92ZXJyaWRlcyB3aGVuIGV2YWx1YXRpbmcgUFJFRkVSUkVEX1ZFUlNJT04KKwktIEltcHJvdmUgdGhlIHByb2dyZXNzIGluZGljYXRvciBieSBza2lwcGluZyB0YXNrcyB0aGF0IGhhdmUgCisJICBhbHJlYWR5IHJ1biBiZWZvcmUgc3RhcnRpbmcgdGhlIGJ1aWxkIHJhdGhlciB0aGFuIGR1cmluZyBpdAorCS0gQWRkIHByb2ZpbGluZyBvcHRpb24gKC1QKQorCS0gQWRkIEJCX1NSQ1JFVl9QT0xJQ1kgdmFyaWFibGUgKGNsZWFyIG9yIGNhY2hlKSB0byBjb250cm9sIFNSQ1JFViBjYWNoZQorCS0gQWRkIFNSQ1JFVl9GT1JNQVQgc3VwcG9ydAorCS0gRml4IGxvY2FsIGZldGNoZXIncyBsb2NhbHBhdGggcmV0dXJuIHZhbHVlcworCS0gQXBwbHkgT1ZFUlJJREVTIGJlZm9yZSBwZXJmb3JtaW5nIGltbWVkaWF0ZSBleHBhbnNpb25zCisJLSBBbGxvdyB0aGUgLWIgLWUgb3B0aW9uIGNvbWJpbmF0aW9uIHRvIHRha2UgcmVndWxhciBleHByZXNzaW9ucworCS0gRml4IGhhbmRsaW5nIG9mIHZhcmlhYmxlcyB3aXRoIGV4cGFuc2lvbiBpbiB0aGUgbmFtZSB1c2luZyBfYXBwZW5kL19wcmVwZW5kCisJICBlLmcuIFJSRUNPTU1FTkRTXyR7UE59X2FwcGVuZF94eXogPSAiYWJjIgorCS0gQWRkIHBsYWluIG1lc3NhZ2UgZnVuY3Rpb24gdG8gYmIubXNnCisJLSBTb3J0IHRoZSBsaXN0IG9mIHByb3ZpZGVycyBiZWZvcmUgcHJvY2Vzc2luZyBzbyBkZXBlbmRlbmN5IHByb2JsZW1zIGFyZSAKKwkgIHJlcHJvZHVjaWJsZSByYXRoZXIgdGhhbiBlZmZlY3RpdmVseSByYW5kb20KKwktIEZpeC9pbXByb3ZlIGJpdGJha2UgLXMgb3V0cHV0CisJLSBBZGQgbG9ja2luZyBmb3IgZmV0Y2hlcnMgc28gb25seSBvbmUgdHJpZXMgdG8gZmV0Y2ggYSBnaXZlbiBmaWxlIGF0IGEgZ2l2ZW4gdGltZQorCS0gRml4IGludCgwKS9Ob25lIGNvbmZ1c2lvbiBpbiBydW5xdWV1ZS5weSB3aGljaCBjYXVzZXMgcmFuZG9tIGdhcHMgaW4gZGVwZW5kZW5jeSBjaGFpbnMJICAKKwktIEV4cGFuZCBkYXRhIGluIGFkZHRhc2tzCisJLSBQcmludCB0aGUgbGlzdCBvZiBtaXNzaW5nIERFUEVORFMsUkRFUEVORFMgZm9yIHRoZSAiTm8gYnVpbGRhYmxlIHByb3ZpZGVycyBhdmFpbGFibGUgZm9yIHJlcXVpcmVkLi4uLiIKKwkgIGVycm9yIG1lc3NhZ2UuCisJLSBSZXdvcmsgYWRkX3Rhc2sgdG8gYmUgbW9yZSBlZmZpY2llbnQgKDYlIHNwZWVkdXAsIDclIG51bWJlciBvZiBmdW5jdGlvbiBjYWxscyByZWR1Y3Rpb24pCisJLSBTb3J0IGRpZ3JhcGggb3V0cHV0IHRvIG1ha2UgYnVpbGRzIG1vcmUgcmVwcm9kdWNpYmxlCisJLSBTcGxpdCBleHBhbmRLZXlzIGludG8gdHdvIGZvciBsb29wcyB0byBiZW5lZml0IGZyb20gdGhlIGV4cGFuZF9jYWNoZSAoMTIlIHNwZWVkdXApCisJLSBydW5xdWV1ZS5weTogRml4IGlkZXBlbmRzIGhhbmRsaW5nIHRvIGF2b2lkIGRlcGVuZGVuY3kgZXJyb3JzCisJLSBDbGVhciB0aGUgdGVybWluYWwgVE9TVE9QIGZsYWcgaWYgc2V0IChhbmQgd2FybiB0aGUgdXNlcikKKwktIEZpeCByZWdyZXNzaW9uIGZyb20gcjY1MyBhbmQgbWFrZSBTUkNEQVRFL0NWU0RBVEUgd29yayBmb3IgcGFja2FnZXMgYWdhaW4KKwktIEZpeCBhIGJ1ZyBpbiBiYi5kZWNvZGV1cmwgd2hlcmUgaHR0cDovL3NvbWUud2hlcmUuY29tL3NvbWVmaWxlLnRneiBkZWNvZGVkIHRvIGhvc3Q9IiIgKCMxNTMwKQorCS0gV2FybiBhYm91dCBtYWxmb3JtZWQgUFJFRkVSUkVEX1BST1ZJREVSUyAoIzEwNzIpCisJLSBBZGQgc3VwcG9ydCBmb3IgQkJfTklDRV9MRVZFTCBvcHRpb24gKCMxNjI3KQorCS0gUHN5Y28gaXMgdXNlZCBvbmx5IG9uIHg4NiBhcyB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBvdGhlciBhcmNoaXRlY3R1cmVzLgorCS0gU29ydCBpbml0aWFsIHByb3ZpZGVycyBsaXN0IGJ5IGRlZmF1bHQgcHJlZmVyZW5jZSAoIzExNDUsICMyMDI0KQorCS0gSW1wcm92ZSBwcm92aWRlciBzb3J0aW5nIHNvIHByZWZlcmVkIHZlcnNpb25zIGhhdmUgcHJlZmVyZW5jZSBvdmVyIGxhdGVzdCB2ZXJzaW9ucyAoIzc2OCkKKwktIERldGVjdCBidWlsZHMgb2YgdGFza3Mgd2l0aCBvdmVybGFwcGluZyBwcm92aWRlcnMgYW5kIHdhcm4gKHdpbGwgYmVjb21lIGEgZmF0YWwgZXJyb3IpICgjMTM1OSkKKwktIEFkZCBNVUxUSV9QUk9WSURFUl9XSElURUxJU1QgdmFyaWFibGUgdG8gYWxsb3cga25vd24gc2FmZSBtdWx0aXBsZSBwcm92aWRlcnMgdG8gYmUgbGlzdGVkCisJLSBIYW5kbGUgcGF0aHMgaW4gc3ZuIGZldGNoZXIgbW9kdWxlIHBhcmFtZXRlcgorCS0gU3VwcG9ydCB0aGUgc3ludGF4ICJleHBvcnQgVkFSSUFCTEUiCisJLSBBZGQgYnpyIGZldGNoZXIKKwktIEFkZCBzdXBwb3J0IGZvciBjbGVhbmluZyBkaXJlY3RvcmllcyBiZWZvcmUgYSB0YXNrIGluIHRoZSBmb3JtOgorCSAgZG9fdGFza25hbWVbY2xlYW5kaXJzXSA9ICJkaXIiCisJLSBienIgZmV0Y2hlciB0d2Vha3MgZnJvbSBSb2JlcnQgU2NodXN0ZXIgKCMyOTEzKQorCS0gQWRkIG1lcmN1cmlhbCAoaGcpIGZldGNoZXIgZnJvbSBSb2JlcnQgU2NodXN0ZXIgKCMyOTEzKQorCS0gRG9uJ3QgYWRkIGR1cGxpY2F0ZXMgdG8gQkJQQVRICisJLSBGaXggcHJlZmVycmVkX3ZlcnNpb24gcmV0dXJuIHZhbHVlcyAocHJvdmlkZXJzLnB5KQorCS0gRml4ICdkZXBlbmRzJyBmbGFnIHNwbGl0dGluZworCS0gRml4IHVuZXhwb3J0IGhhbmRsaW5nICgjMzEzNSkKKwktIEFkZCBiYi5jb3B5ZmlsZSBmdW5jdGlvbiBzaW1pbGFyIHRvIGJiLm1vdmVmaWxlIChhbmQgaW1wcm92ZSBtb3ZlZmlsZSBlcnJvciByZXBvcnRpbmcpCisJLSBBbGxvdyBtdWx0aXBsZSBvcHRpb25zIGZvciBkZXB0YXNrIGZsYWcKKwktIFVzZSBnaXQtZmV0Y2ggaW5zdGVhZCBvZiBnaXQtcHVsbCByZW1vdmluZyBhbnkgbmVlZCBmb3IgbWVyZ2VzIHdoZW4gCisJICBmZXRjaGluZyAod2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgaW5kZXgpLiBGaXhlcyBmZXRjaCBlcnJvcnMuCisJLSBBZGQgQkJfR0VORVJBVEVfTUlSUk9SX1RBUkJBTExTIG9wdGlvbiwgc2V0IHRvIDAgdG8gbWFrZSBnaXQgZmV0Y2hlcyAKKwkgIGZhc3RlciBhdCB0aGUgZXhwZW5zZSBvZiBub3QgY3JlYXRpbmcgbWlycm9yIHRhcmJhbGxzLgorCS0gU1JDUkVWIGhhbmRsaW5nIHVwZGF0ZXMsIGltcHJvdmVtZW50cyBhbmQgZml4ZXMgZnJvbSBQb2t5CisJLSBBZGQgYmIudXRpbHMubG9ja2ZpbGUoKSBhbmQgYmIudXRpbHMudW5sb2NrZmlsZSgpIGZyb20gUG9reQorCS0gQWRkIHN1cHBvcnQgZm9yIHRhc2sgc2VsZnN0YW1wIGFuZCBsb2NrZmlsZXMgZmxhZ3MKKwktIERpc2FibGUgdGFzayBudW1iZXIgYWNjZWxlcmF0aW9uIHNpbmNlIGl0IGNhbiBhbGxvdyB0aGUgdGFza3MgdG8gcnVuIAorCSAgb3V0IG9mIHNlcXVlbmNlCisJLSBJbXByb3ZlIHJ1bnF1ZXVlIGNvZGUgY29tbWVudHMKKwktIEFkZCB0YXNrIHNjaGVkdWxlciBhYnN0cmFjdGlvbiBhbmQgc29tZSBleGFtcGxlIHNjaGVkdWxlcnMKKwktIEltcHJvdmUgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGFpbiBkZWJ1Z2dpbmcgY29kZSBhbmQgdXNlciBmZWVkYmFjaworCS0gRG9uJ3QgZ2l2ZSBhIHN0YWNrdHJhY2UgZm9yIGludmFsaWQgdGFza3MsIGhhdmUgYSB1c2VyIGZyaWVuZGx5IG1lc3NhZ2UgKCMzNDMxKQorCS0gQWRkIHN1cHBvcnQgZm9yICItZSB0YXJnZXQiICgjMzQzMikKKwktIEZpeCBzaGVsbCBzaG93ZGF0YSBjb21tYW5kICgjMzI1OSkKKwktIEZpeCBzaGVsbCBkYXRhIHVwZGF0aW5nIHByb2JsZW1zICgjMTg4MCkKKwktIFByb3Blcmx5IHJhaXNlIGVycm9ycyBmb3IgaW52YWxpZCBzb3VyY2UgVVJJIHByb3RvY29scworCS0gQ2hhbmdlIHRoZSB3Z2V0IGZldGNoZXIgZmFpbHVyZSBoYW5kbGluZyB0byBhdm9pZCBsb2NrZmlsZSBwcm9ibGVtcworCS0gQWRkIHN1cHBvcnQgZm9yIGJyYW5jaGVzIGluIGdpdCBmZXRjaGVyIChPdGF2aW8gU2FsdmFkb3IsIE1pY2hhZWwgTGF1ZXIpCisJLSBNYWtlIHRhc2tkYXRhIGFuZCBydW5xdWV1ZSBlcnJvcnMgbW9yZSB1c2VyIGZyaWVuZGx5CisJLSBBZGQgbm9yZWN1cnNlIGFuZCBmdWxscGF0aCBvcHRpb25zIHRvIGN2cyBmZXRjaGVyCisJLSBGaXggZXhpdCBjb2RlIGZvciBidWlsZCBmYWlsdXJlcyBpbiAtLWNvbnRpbnVlIG1vZGUKKwktIEZpeCBnaXQgYnJhbmNoIHRhZ3MgZmV0Y2hpbmcKKwktIENoYW5nZSBwYXJzZUNvbmZpZ3VyYXRpb25GaWxlIHNvIGl0IHdvcmtzIG9uIHJlYWwgZGF0YSwgbm90IGEgY29weQorCS0gSGFuZGxlICdiYXNlJyBpbmhlcml0IGFuZCBhbGwgb3RoZXIgSU5IRVJJVHMgZnJvbSBwYXJzZUNvbmZpZ3VyYXRpb25GaWxlIAorCSAgaW5zdGVhZCBvZiBCQkhhbmRsZXIKKwktIEZpeCBnZXRWYXJGbGFncyBidWcgaW4gZGF0YV9zbWFydAorCS0gT3B0bWlzZSBjYWNoZSBoYW5kbGluZyBieSBtb3JlIHF1aWNrbHkgZGV0ZWN0aW5nIGFuIGludmFsaWQgY2FjaGUsIG9ubHkgCisJICBzYXZpbmcgdGhlIGNhY2hlIHdoZW4gaXRzIGNoYW5nZWQsIG1vdmluZyB0aGUgY2FjaGUgdmFsaWRpdHkgY2hlY2sgaW50bworCSAgdGhlIHBhcnNpbmcgbG9vcCBhbmQgZmFjdG9yaW5nIHNvbWUgZ2V0VmFyIGNhbGxzIG91dHNpZGUgYSBmb3IgbG9vcAorCS0gQ29va2VyOiBSZW1vdmUgYSBkZWJ1ZyBtZXNzYWdlIGZyb20gdGhlIHBhcnNpbmcgbG9vcCB0byBsb3dlciBvdmVyaGVhZAorCS0gQ29udmVydCBidWlsZC5weSBleGVjX3Rhc2sgdG8gdXNlIGdldFZhckZsYWdzCisJLSBVcGRhdGUgc2hlbGwgdG8gdXNlIGNvb2tlci5idWlsZEZpbGUKKwktIEFkZCBTdGFtcFVwZGF0ZSBldmVudAorCS0gQ29udmVydCAtYiBvcHRpb24gdG8gdXNlIHRhc2tkYXRhL3J1bnF1ZXVlCisJLSBSZW1vdmUgZGlncmFwaCBhbmQgc3dpdGNoIHRvIG5ldyBzdGFtcCBjaGVja2luZyBjb2RlLiBleGVjX3Rhc2sgbm8gbG9uZ2VyCisJICBob25vdXJzIGRlcGVuZGVuY2llcworCS0gTWFrZSBmZXRjaGVyIHRpbWVzdGFtcCB1cGRhdGluZyBub24tZmF0YWwgd2hlbiBwZXJtaXNzaW9ucyBkb24ndCBhbGxvdyAKKwkgIHVwZGF0ZXMKKwktIEFkZCBCQl9TQ0hFRFVMRVIgdmFyaWFibGUvb3B0aW9uICgiY29tcGxldGlvbiIgb3IgInNwZWVkIikgY29udHJvbGxpbmcKKwkgIHRoZSB3YXkgYml0YmFrZSBzY2hlZHVsZXMgdGFza3MKKwktIEFkZCBCQl9TVEFNUF9QT0xJQ1kgdmFyaWFibGUvb3B0aW9uICgicGVyZmlsZSIgb3IgImZ1bGwiKSBjb250cm9sbGluZworCSAgaG93IGV4dGVuc2l2ZWx5IHN0YW1wcyBhcmUgbG9va2VkIGF0IGZvciB2YWxpZGl0eQorCS0gV2hlbiBoYW5kbGluZyBidWlsZCB0YXJnZXQgZmFpbHVyZXMgbWFrZSBzdXJlIGlkZXBlbmRzIGFyZSBjaGVja2VkIGFuZAorCSAgZmFpbGVkIHdoZXJlIG5lZWRlZC4gRml4ZXMgLS1jb250aW51ZSBtb2RlIGNyYXNoZXMuCisJLSBGaXggLWYgKGZvcmNlKSBpbiBjb25qdW5jdGlvbiB3aXRoIC1iCisJLSBGaXggcHJvYmxlbXMgd2l0aCByZWNyZGVwdGFzayBoYW5kbGluZyB3aGVyZSBzb21lIGlkZXBlbmRzIHdlcmVuJ3QgaGFuZGxlZAorCSAgY29ycmVjdGx5LgorCS0gSGFuZGxlIGV4aXQgY29kZXMgY29ycmVjdGx5IChmcm9tIHBINSkKKwktIFdvcmsgYXJvdW5kIHJlZnMvSEVBRCBpc3N1ZXMgd2l0aCBnaXQgb3ZlciBodHRwICgjMzQxMCkKKwktIEFkZCBwcm94eSBzdXBwb3J0IHRvIHRoZSBDVlMgZmV0Y2hlciAoZnJvbSBDeXJpbCBDaGVtcGFyYXRoeSkKKwktIEltcHJvdmUgcnVuZmV0Y2hjbWQgc28gZXJyb3JzIGFyZSBzZWVuIGFuZCB2YXJpb3VzIEdJVCB2YXJpYWJsZXMgYXJlIGV4cG9ydGVkCisJLSBBZGQgYWJpbGl0eSB0byBmZXRjaGVycyB0byBjaGVjayBVUkwgdmFsaWRpdHkgd2l0aG91dCBkb3dubG9hZGluZworCS0gSW1wcm92ZSBydW50aW1lIFBSRUZFUlJFRF9QUk9WSURFUlMgd2FybmluZyBtZXNzYWdlCisJLSBBZGQgQkJfU1RBTVBfV0hJVEVMSVNUIG9wdGlvbiB3aGljaCBjb250YWlucyBhIGxpc3Qgb2Ygc3RhbXBzIHRvIGlnbm9yZSB3aGVuCisJICBjaGVja2luZyBzdGFtcCBkZXBlbmRlbmNpZXMgYW5kIHVzaW5nIGEgQkJfU1RBTVBfUE9MSUNZIG9mICJ3aGl0ZWxpc3QiCisJLSBObyBsb25nZXIgd2VpZ2h0IHByb3ZpZGVycyBvbiB0aGUgYmFzaXMgb2YgYSBwYWNrYWdlIGJlaW5nICJhbHJlYWR5IHN0YWdlZCIuIFRoaXMKKwkgIGxlYWRzIHRvIGJ1aWxkcyBiZWluZyBub24tZGV0ZXJtaW5pc3RpYy4KKwktIEZsdXNoIHN0ZG91dC9zdGRlcnIgYmVmb3JlIGZvcmtpbmcgdG8gZml4IGR1cGxpY2F0ZSBjb25zb2xlIG91dHB1dAorCS0gTWFrZSBzdXJlIHJlY3JkZXBzIHRhc2tzIGluY2x1ZGUgYWxsIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzIG9mIGEgZ2l2ZW4gZm4KKwktIEFkZCBiYi5ydW5xdWV1ZS5jaGVja19zdGFtcF9mbigpIGZvciB1c2UgYnkgcGFja2FnZWQtc3RhZ2luZworCS0gQWRkIFBFUlNJU1RFTlRfRElSIHRvIHN0b3JlIHRoZSBQZXJzaXN0RGF0YSBpbiBhIHBlcnNpc3RlbnQKKwkgIGRpcmVjdG9yeSAhPSB0aGUgY2FjaGUgZGlyLgorCS0gQWRkIG1kNSBhbmQgc2hhMjU2IGNoZWNrc3VtIGdlbmVyYXRpb24gZnVuY3Rpb25zIHRvIHV0aWxzLnB5CisJLSBDb3JyZWN0bHkgaGFuZGxlICctJyBjaGFyYWN0ZXJzIGluIGNsYXNzIG5hbWVzICgjMjk1OCkKKwktIE1ha2Ugc3VyZSBleHBhbmRLZXlzIGhhcyBiZWVuIGNhbGxlZCBvbiB0aGUgZGF0YSBkaWN0aW9uYXJ5IGJlZm9yZSBydW5uaW5nIHRhc2tzCisJLSBDb3JyZWN0bHkgYWRkIGEgdGFzayBvdmVycmlkZSBpbiB0aGUgZm9ybSB0YXNrLVRBU0tOQU1FLgorCS0gUmV2ZXJ0IHRoZSAnLScgY2hhcmFjdGVyIGZpeCBpbiBjbGFzcyBuYW1lcyBzaW5jZSBpdCBicmVha3MgdGhpbmdzCisJLSBXaGVuIGEgcmVnZXhwIGZhaWxzIHRvIGNvbXBpbGUgZm9yIFBBQ0tBR0VTX0RZTkFNSUMsIHByaW50IGEgbW9yZSB1c2VmdWwgZXJyb3IgKCM0NDQ0KQorCS0gQWxsb3cgdG8gY2hlY2tvdXQgQ1ZTIGJ5IERhdGUgYW5kIFRpbWUuIEp1c3QgYWRkIEhIbW0gdG8gdGhlIFNSQ0RBVEUuCisJLSBNb3ZlIHBydW5lZGlyIGZ1bmN0aW9uIHRvIHV0aWxzLnB5IGFuZCBhZGQgZXhwbG9kZV9kZXBfdmVyc2lvbnMgZnVuY3Rpb24KKwktIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBTUkNSRVYgPT0gJ0lOVkFMSUQnCisJLSBGaXggaGcgZmV0Y2hlciB1c2VybmFtZS9wYXNzd29yZCBoYW5kbGluZyBhbmQgZml4IGNyYXNoCisJLSBGaXggUEFDS0FHRVNfRFlOQU1JQyBoYW5kbGluZyBvZiBwYWNrYWdlcyB3aXRoICcrKycgaW4gdGhlIG5hbWUKKwktIFJlbmFtZSBfX2RlcGVuZHMgdG8gX19iYXNlX2RlcGVuZHMgYWZ0ZXIgY29uZmlndXJhdGlvbiBwYXJzaW5nIHNvIHdlIGRvbid0CisJICByZWNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29uZmlnIGZpbGVzIHRpbWUgYWZ0ZXIgdGltZQorCS0gQWRkIGJldHRlciBlbnZpcm9ubWVudGFsIHZhcmlhYmxlIGhhbmRsaW5nLiBCeSBkZWZhdWx0IGl0IHdpbGwgbm93IG9ubHkgcGFzcyBjZXJ0YWluIAorCSAgd2hpdGVsaXN0ZWQgdmFyaWFibGVzIGludG8gdGhlIGRhdGEgc3RvcmUuIElmIEJCX1BSRVNFUlZFX0VOViBpcyBzZXQgYml0YmFrZSB3aWxsIHVzZQorCSAgYWxsIHZhcmlhYmxlIGZyb20gdGhlIGVudmlyb25tZW50LiBJZiBCQl9FTlZfV0hJVEVMSVNUIGlzIHNldCwgdGhhdCB3aGl0ZWxpc3Qgd2lsbCBiZQorCSAgdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBiaXRiYWtlIG9uZS4gQWx0ZXJuYXRpdmVseSwgQkJfRU5WX0VYVFJBV0hJVEUgY2FuIGJlIHVzZWQKKwkgIHRvIGV4dGVuZCB0aGUgaW50ZXJuYWwgd2hpdGVsaXN0LgorCS0gUGVyZm9yY2UgZmV0Y2hlciBmaXggdG8gdXNlIGNvbW1hbmRsaW5lIG9wdGlvbnMgaW5zdGVhZCBvZiBiZWluZyBvdmVycmlkZW4gYnkgdGhlIGVudmlyb25tZW50CisJLSBiYi51dGlscy5wcnVuZWRpciBjYW4gY29wZSB3aXRoIHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVlcyB3aXRob3V0IGV4Y2VwdGlvbnMKKwktIHVzZSBAcmV2IHdoZW4gZG9pbmcgYSBzdm4gY2hlY2tvdXQKKwktIEFkZCBvc2MgZmV0Y2hlciAoZnJvbSBKb3NodWEgTG9jayBpbiBQb2t5KQorCS0gV2hlbiBTUkNSRVYgYXV0b3JldmlzaW9uaW5nIGZvciBhIHJlY2lwZSBpcyBpbiB1c2UsIGRvbid0IGNhY2hlIHRoZSByZWNpcGUKKwktIEFkZCB0cnlhbHRjb25maWdzIG9wdGlvbiB0byBjb250cm9sIHdoZXRoZXIgYml0YmFrZSB0cnlzIHVzaW5nIGFsdGVybmF0aXZlIHByb3ZpZGVycworCSAgdG8gZnVsZmlsIGZhaWxlZCBkZXBlbmRlbmNpZXMuIEl0IGRlZmF1bHRzIHRvIG9mZiwgY2hhbmdpbmcgdGhlIGRlZmF1bHQgc2luY2UgdGhpcworCSAgYmVoYXZpb3VyIGNvbmZ1c2VzIG1hbnkgdXNlcnMgYW5kIGlzbid0IG9mdGVuIHVzZWZ1bC4KKwktIEltcHJvdmUgbG9jayBmaWxlIGZ1bmN0aW9uIGVycm9yIGhhbmRsaW5nCisJLSBBZGQgdXNlcm5hbWUgaGFuZGxpbmcgdG8gdGhlIGdpdCBmZXRjaGVyIChSb2JlcnQgQnJhZ2cpCisJLSBBZGQgc3VwcG9ydCBmb3IgSFRUUF9QUk9YWSBhbmQgSFRUUF9QUk9YWV9JR05PUkUgdmFyaWFibGVzIHRvIHRoZSB3Z2V0IGZldGNoZXIKKwktIEV4cG9ydCBtb3JlIHZhcmlhYmxlcyB0byB0aGUgZmV0Y2hlciBjb21tYW5kcyB0byBhbGxvdyBzc2ggY2hlY2tvdXRzIGFuZCBjaGVja291dHMgdGhyb3VnaCAKKwkgIHByb3hpZXMgdG8gd29yayBiZXR0ZXIuIChmcm9tIFBva3kpCisJLSBBbHNvIGFsbG93IHVzZXIgYW5kIHBzd2Qgb3B0aW9ucyBpbiBTUkNfVVJJcyBnbG9iYWxseSAoZnJvbSBQb2t5KQorCS0gSW1wcm92ZSBwcm94eSBoYW5kbGluZyB3aGVuIHVzaW5nIG1pcnJvcnMgKGZyb20gUG9reSkKKwktIEFkZCBiYi51dGlscy5wcnVuZV9zdWZmaXggZnVuY3Rpb24KKwktIEZpeCBoZyBjaGVja291dHMgb2Ygc3BlY2lmaWMgcmV2aXNpb25zIChmcm9tIFBva3kpCisJLSBGaXggd2dldCBmZXRjaGluZyBvZiB1cmxzIHdpdGggcGFyYW1ldGVycyBzcGVjaWZpZWQgKGZyb20gUG9reSkKKwktIEFkZCB1c2VybmFtZSBoYW5kbGluZyB0byBnaXQgZmV0Y2hlciAoZnJvbSBQb2t5KQorCS0gU2V0IEhPTUUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgZmV0Y2hlciBjb21tYW5kcyAoZnJvbSBQb2t5KQorCS0gTWFrZSBzdXJlIGFsbG93ZWQgdmFyaWFibGVzIGluaGVyaXRlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCBhcmUgZXhwb3J0ZWQgYWdhaW4gKGZyb20gUG9reSkKKwktIFdoZW4gcnVubmluZyBhIHN0YWdlIHRhc2sgaW4gYmJzaGVsbCwgcnVuIHBvcHVsYXRlX3N0YWdpbmcsIG5vdCB0aGUgc3RhZ2UgdGFzayAoZnJvbSBQb2t5KQorCS0gRml4ICsgY2hhcmFjdGVyIGVzY2FwaW5nIGZyb20gUEFDS0FHRVNfRFlOQU1JQyAodGhhbmtzIE90YXZpbyBTYWx2YWRvcikKKwktIEFkZGl0aW9uIG9mIEJCQ0xBU1NFWFRFTkQgc3VwcG9ydCBmb3IgYWxsb3dpbmcgb25lIHJlY2lwZSB0byBwcm92aWRlIG11bHRpcGxlIHRhcmdldHMgKGZyb20gUG9reSkKKworQ2hhbmdlcyBpbiBCaXRiYWtlIDEuOC4wOgorCS0gUmVsZWFzZSAxLjcueCBhcyBhIHN0YWJsZSBzZXJpZXMKKworQ2hhbmdlcyBpbiBCaXRCYWtlIDEuNy54OgorCS0gTWFqb3IgdXBkYXRlcyBvZiB0aGUgZGVwZW5kZW5jeSBoYW5kbGluZyBhbmQgZXhlY3V0aW9uCisJICBvZiB0YXNrcy4gQ29kZSBmcm9tIGJpbi9iaXRiYWtlIHJlcGxhY2VkIHdpdGggcnVucXVldWUucHkKKwkgIGFuZCB0YXNrZGF0YS5weQorCS0gTmV3IHRhc2sgZXhlY3V0aW9uIGNvZGUgc3VwcG9ydHMgbXVsdGl0aHJlYWRpbmcgd2l0aCBhIHNpbXBsaXN0aWMKKwkgIHRocmVhZGluZyBhbGdvcml0aG0gY29udHJvbGxlZCBieSBCQl9OVU1CRVJfVEhSRUFEUworCS0gQ2hhbmdlIG9mIHRoZSBTVk4gRmV0Y2hlciB0byBrZWVwIHRoZSBjaGVja291dCBhcm91bmQKKwkgIGNvdXJ0c2V5IG9mIFBhdWwgU29rb2xvdnNreSAoIzEzNjcpCisJLSBQQVRIIGZpeCB0byBiYmltYWdlICgjMTEwOCkKKwktIEFsbG93IGRlYnVnIGRvbWFpbnMgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSAoLWwpCisJLSBBbGxvdyAnaW50ZXJhY3RpdmUnIHRhc2tzCisJLSBMb2dnaW5nIG1lc3NhZ2UgaW1wcm92ZW1lbnRzCisJLSBEcm9wIG5vdyB1bmVlZGVkIEJVSUxEX0FMTF9ERVBTIHZhcmlhYmxlCisJLSBBZGQgc3VwcG9ydCBmb3Igd2lsZGNhcmRzIHRvIC1iIG9wdGlvbgorCS0gTWFqb3Igb3ZlcmhhdWwgb2YgdGhlIGZldGNoZXJzIG1ha2luZyBhIGxhcmdlIGFtb3VudCBvZiBjb2RlIGNvbW1vbgorCSAgaW5jbHVkaW5nIG1pcnJvcmluZyBjb2RlCisJLSBGZXRjaGVycyBub3cgdG91Y2ggbWQ1IHN0YW1wcyB1cG9uIGFjY2VzcyAodG8gc2hvdyBhY3Rpdml0eSkKKwktIEZpeCAtZiBmb3JjZSBvcHRpb24gd2hlbiB1c2VkIHdpdGhvdXQgLWIgKGxvbmcgc3RhbmRpbmcgYnVnKQorCS0gQWRkIGV4cGFuZF9jYWNoZSB0byBkYXRhX2NhY2hlLnB5LCBjYWNoaW5nIGV4cGFuZGVkIGRhdGEgKHNwZWVkdXApCisJLSBBbGxvdyB2ZXJzaW9uIGZpZWxkIGluIERFUEVORFMgKGlnbm9yZWQgZm9yIG5vdykKKwktIEFkZCBhYm9ydCBmbGFnIHN1cHBvcnQgdG8gdGhlIHNoZWxsCisJLSBNYWtlIGluaGVyaXQgZmFpbCBpZiB0aGUgY2xhc3MgZG9lc24ndCBleGlzdCAoIzE0NzgpCisJLSBGaXggZGF0YS5lbWl0X2VudigpIHRvIGV4cGFuZCBrZXluYW1lcyBhcyB3ZWxsIGFzIHZhbHVlcworCS0gQWRkIHNzaCBmZXRjaGVyCisJLSBBZGQgcGVyZm9yY2UgZmV0Y2hlcgorCS0gTWFrZSBQUkVGRVJSRURfUFJPVklERVJfZm9vYmFyIGRlZmF1bHRzIHRvIGZvb2JhciBpZiBhdmFpbGFibGUKKwktIFNoYXJlIHRoZSBwYXJzZXIncyBtdGltZV9jYWNoZSwgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBzdGF0IHN5c2NhbGxzCisJLSBDb21waWxlIGFsbCBhbm9uZnVuY3MgYXQgb25jZSEgCisJICAqKiogQW5vbmZ1bmNzIG11c3Qgbm93IHVzZSBjb21tb24gc3BhY2luZyBmb3JtYXQgKioqCisJLSBNZW1vcmlzZSB0aGUgbGlzdCBvZiBoYW5kbGVycyBpbiBfX0JCSEFORExFUlMgYW5kIHRhc2tzIGluIF9fQkJUQVNLUworCSAgVGhpcyByZW1vdmVzIDIgbWlsbGlvbiBmdW5jdGlvbiBjYWxscyByZXN1bHRpbmcgaW4gYSA1LTEwJSBzcGVlZHVwCisJLSBBZGQgbWFucGFnZQorCS0gVXBkYXRlIGdlbmVyYXRlRG90R3JhcGggdG8gdXNlIHRhc2tEYXRhL3J1blF1ZXVlIGltcHJvdmluZyBhY2N1cmFjeQorCSAgYW5kIGFsc28gYWRkaW5nIGEgdGFzayBkZXBlbmRlbmN5IGdyYXBoCisJLSBGaXgvc3RhbmRhcmRpc2Ugb24gR1BMdjIgbGljZW5jZQorCS0gTW92ZSBtb3N0IGZ1bmN0aW9uYWxpdHkgZnJvbSBiaW4vYml0YmFrZSB0byBjb29rZXIucHkgYW5kIHNwbGl0IGludG8KKwkgIHNlcGFyYXRlIGZ1bmNpdG9ucworCS0gQ1ZTIGZldGNoZXI6IEFkZGVkIHN1cHBvcnQgZm9yIG5vbi1kZWZhdWx0IHBvcnQKKwktIEFkZCBCQklOQ0xVREVMT0dTX0xJTkVTLCB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHJlYWQgZnJvbSBhbnkgbG9nZmlsZQorCS0gRHJvcCBzaGViYW5ncyBmcm9tIGxpYi9iYiBzY3JpcHRzCisKK0NoYW5nZXMgaW4gQml0YmFrZSAxLjYuMDoKKwktIEJldHRlciBtc2cgaGFuZGxpbmcKKwktIENPVyBkaWN0IGltcGxlbWVudGF0aW9uIGZyb20gVGltIEFuc2VsbCAobWl0aHJvKSBsZWFkaW5nCisJICB0byBiZXR0ZXIgcGVyZm9ybWFuY2UKKwktIFNwZWVkIHVwIG9mIC1zCisKK0NoYW5nZXMgaW4gQml0YmFrZSAxLjQuNDoKKwktIFNSQ0RBVEUgbm93IGhhbmRsaW5nIGNvdXJ0c2V5IEp1c3RpbiBQYXRyaW4KKwktICMxMDE3IGZpeCB0byB3b3JrIHdpdGggcm1fd29yaworCitDaGFuZ2VzIGluIEJpdEJha2UgMS40LjI6CisJLSBTZW5kIGxvZ3MgdG8gb2UucGFzdGViaW4uY29tIGluc3RlYWQgb2YgcGFzdGViaW4uY29tCisJICBmaXhlcyAjODU2CisJLSBDb3B5IHRoZSBpbnRlcm5hbCBiaXRiYWtlIGRhdGEgYmVmb3JlIGJ1aWxkaW5nIHRoZQorCSAgZGVwZW5kZW5jeSBncmFwaC4gVGhpcyBmaXhlcyBuYW5vIG5vdCBoYXZpbmcgYQorCSAgdmlydHVhbC9saWJjIGRlcGVuZGVuY3kKKwktIEFsbG93IG11bHRpcGxlIFRBUkJBTExfU1RBU0ggZW50cmllcworCS0gQ2FjaGUsIGNoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzIGJlZm9yZSBjaGFuZ2luZworCSAgaW50byBpdAorCS0gZ2l0IHNwZWVkdXAgY2xvbmluZyBieSBub3QgZG9pbmcgYSBjaGVja291dAorCS0gYWxsb3cgdG8gaGF2ZSBzcGFjZXMgaW4gZmlsZW5hbWVzICguY29uZiwgLmJiLCAuYmJjbGFzcykKKworQ2hhbmdlcyBpbiBCaXRCYWtlIDEuNC4wOgorCS0gRml4IHRvIGNoZWNrIGJvdGggUkRFUEVORFMgYW5kIFJERVBFTkRTXyR7UE59CisJLSBGaXggYSBSREVQRU5EUyBwYXJzaW5nIGJ1ZyBpbiB1dGlsczpleHBsb2RlX2RlcHMoKQorCS0gVXBkYXRlIGdpdCBmZXRjaGVyIGJlaGF2aW91ciB0byBtYXRjaCBnaXQgY2hhbmdlcworCS0gQVNTVU1FX1BST1ZJREVEIGFsbG93ZWQgdG8gaW5jbHVkZSBydW50aW1lIHBhY2thZ2VzCisJLSBnaXQgZmV0Y2hlciBjbGVhbnVwIGFuZCBlZmZpY2VuY3kgaW1wcm92ZW1lbnRzCisJLSBDaGFuZ2UgdGhlIGZvcm1hdCBvZiB0aGUgY2FjaGUKKwktIFVwZGF0ZSB1c2VybWFudWFsIHRvIGRvY3VtZW50IHRoZSBGZXRjaGVycworCS0gTWFqb3IgY2hhbmdlcyB0byBjYWNoaW5nIHdpdGggYSBuZXcgc3RyYXRlZ3kKKwkgIGdpdmluZyBhIG1ham9yIHBlcmZvcm1hbmNlIGluY3JlYXNlIHdoZW4gcmVwYXJzaW5nCisJICB3aXRoIGZldyBkYXRhIGNoYW5nZXMKKworQ2hhbmdlcyBpbiBCaXRCYWtlIDEuMy4zOgorCS0gQ3JlYXRlIGEgbmV3IEZldGNoZXIgbW9kdWxlIHRvIGVhc2UgdGhlCisJICBkZXZlbG9wbWVudCBvZiBuZXcgRmV0Y2hlcnMuCisJICBJc3N1ZSAjNDM4IGZpeGVkIGJ5IHJwdXJkaWVAb3BlbmVkaGFuZC5jb20KKwktIE1ha2UgdGhlIFN1YnZlcnNpb24gZmV0Y2hlciBob25vciB0aGUgU1JDIERhdGUKKwkgIChDVlNEQVRFKS4KKwkgIElzc3VlICM1NTUgZml4ZWQgYnkgY2hyaXNAb3BlbmVkaGFuZC5jb20KKwktIEV4cGFuZCBQUkVGRVJSRURfUFJPVklERVIgcHJvcGVybHkKKwkgIElzc3VlICM0MzYgZml4ZWQgYnkgcnBydWRpZUBvcGVuZWRoYW5kLmNvbQorCS0gVHlwbyBmaXggZm9yIElzc3VlICM1MzEgYnkgUGhpbGlwcCBaYWJlbCBmb3IgdGhlCisJICBCaXRCYWtlIFNoZWxsCisJLSBJbnRyb2R1Y2UgYSBuZXcgc3BlY2lhbCB2YXJpYWJsZSBTUkNEQVRFIGFzCisJICBhIGdlbmVyaWMgbmFtaW5nIHRvIHJlcGxhY2UgQ1ZTREFURS4KKwktIEludHJvZHVjZSBhIG5ldyBrZXl3b3JkICdyZXF1aXJlZCcuIEluIGNvbnRyYXN0CisJICB0byAnaW5jbHVkZScgcGFyc2luZyB3aWxsIGZhaWwgaWYgYSB0byBiZSBpbmNsdWRlZAorCSAgZmlsZSBjYW4gbm90IGJlIGZvdW5kLgorCS0gUmVtb3ZlIGhhcmRjb2Rpbmcgb2YgdGhlIFNUQU1QIGRpcmVjdG9yeS4gUGF0Y2gKKwkgIGNvdXJ0c2V5IHBIaWxpcHAgWmFiZWwKKwktIFRyYWNrIHRoZSBSREVQRU5EUyBvZiBlYWNoIHBhY2thZ2UgKHJwdXJkaWVAb3BlbmVkaGFuZC5jb20pCisJLSBJbnRyb2R1Y2UgQlVJTERfQUxMX0RFUFMgdG8gYnVpbGQgYWxsIFJERVBFTkRTLiBFLmcKKwkgIHRoaXMgaXMgdXNlZCBieSB0aGUgT3BlbkVtYmVkZGVkIE1ldGEgUGFja2FnZXMuCisJICAocnB1cmRpZUBvcGVuZWRoYW5kLmNvbSkuCisKK0NoYW5nZXMgaW4gQml0QmFrZSAxLjMuMjoKKwktIHJlaW50ZWdyYXRpb24gb2YgbWFrZS5weSBpbnRvIEJpdEJha2UKKwktIGJicmVhZCBpcyBnb25lLCB1c2UgYml0YmFrZSAtZQorCS0gbG90cyBvZiBzaGVsbCB1cGRhdGVzIGFuZCBidWdmaXhlcworCS0gSW50cm9kdWN0aW9uIG9mIHRoZSAuPSBhbmQgPS4gb3BlcmF0b3IKKwktIFNvcnQgdmFyaWFibGVzLCBrZXlzIGFuZCBncm91cHMgaW4gYml0ZG9jCisJLSBGaXggcmVncmVzc2lvbiBpbiB0aGUgaGFuZGxpbmcgb2YgQkJDT0xMRUNUSU9OUworCS0gVXBkYXRlIHRoZSBiaXRiYWtlIHVzZXJtYW51YWwKKworQ2hhbmdlcyBpbiBCaXRCYWtlIDEuMy4wOgorCS0gYWRkIGJpdGJha2UgaW50ZXJhY3RpdmUgc2hlbGwgKGJpdGJha2UgLWkpCisJLSByZWZhY3RvciBiaXRiYWtlIHV0aWxpdHkgaW4gT08gc3R5bGUKKwktIGtpbGwgZGVmYXVsdCBhcmd1bWVudHMgaW4gbWV0aG9kcyBpbiB0aGUgYmIuZGF0YSBtb2R1bGUKKwktIGtpbGwgZGVmYXVsdCBhcmd1bWVudHMgaW4gbWV0aG9kcyBpbiB0aGUgYmIuZmV0Y2ggbW9kdWxlCisJLSB0aGUgaHR0cC9odHRwcy9mdHAgZmV0Y2hlciB3aWxsIGZhaWwgaWYgdGhlIHRvIGJlIAorCSAgZG93bmxvYWRlZCBmaWxlIHdhcyBub3QgZm91bmQgaW4gRExfRElSICh0aGlzIGlzIG5lZWRlZAorCSAgdG8gYXZvaWQgdW5wYWNraW5nIHRoZSBzb3VyY2Vmb3JnZSBtaXJyb3IgcGFnZSkKKwktIFN3aXRjaCB0byBhIGNvdyBsaWtlIGRhdGEgaW5zdGFuY2UgZm9yIHBlcnNpc3RlbnQgYW5kIG5vbgorCSAgcGVyc2lzdGluZyBtb2RlIChjYWxsZWQgZGF0YV9zbWFydC5weSkKKwktIENoYW5nZWQgdGhlIGNhbGxiYWNrIG9mIGJiLm1ha2UuY29sbGVjdF9iYmZpbGVzIHRvIGNhcnJ5CisJICBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKKwktIERyYXN0aWNhbGx5IHJlZHVjZWQgdGhlIGFtb3VudCBvZiBuZWVkZWQgUkFNIGJ5IG5vdCBob2xkaW5nCisJICBlYWNoIGRhdGEgaW5zdGFuY2UgaW4gbWVtb3J5IHdoZW4gdXNpbmcgYSBjYWNoZS9wZXJzaXN0ZW50CisJICBzdG9yYWdlCisKK0NoYW5nZXMgaW4gQml0QmFrZSAxLjIuMToKKwlUaGUgMS4yLjEgcmVsZWFzZSBpcyBtZWFudCBhcyBhIGludGVybWVkaWF0ZSByZWxlYXNlIHRvIGxheSB0aGUKKwlncm91bmQgZm9yIG1vcmUgcmFkaWNhbCBjaGFuZ2VzLiBUaGUgbW9zdCBub3RhYmxlIGNoYW5nZXMgYXJlOgorCisJLSBEbyBub3QgaGFyZGNvZGUge30sIHVzZSBiYi5kYXRhLmluaXQoKSBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCisJICBnZXQgYSBpbnN0YW5jZSBvZiBhIGRhdGEgY2xhc3MKKwktIGJiLmRhdGEuaW5pdCgpIGlzIGEgZmFjdG9yeSBhbmQgdGhlIG9sZCBiYi5kYXRhIG1ldGhvZHMgYXJlIGRlbGVnYXRlcworCS0gRG8gbm90IHVzZSBkZWVwY29weSB1c2UgYmIuZGF0YS5jcmVhdGVDb3B5KCkgaW5zdGVhZC4KKwktIFJlbW92ZWQgZGVmYXVsdCBhcmd1bWVudHMgaW4gYmIuZmV0Y2gKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9IRUFERVIgYi9iaXRiYWtlL0hFQURFUgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU5MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9IRUFERVIKQEAgLTAsMCArMSwxOSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyMgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvTElDRU5TRSBiL2JpdGJha2UvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAxNDBjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9MSUNFTlNFCkBAIC0wLDAgKzEsMTAgQEAKK0JpdEJha2UgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4wLiBTZWUgQ09QWUlORyBmb3IgZnVydGhlciBkZXRhaWxzLgorCitUaGUgZm9sbG93aW5nIGV4dGVybmFsIGNvbXBvbmVudHMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZToKKworKiBUaGUgVG9hc3RlciBTaW1wbGUgVUkgYXBwbGljYXRpb24gaXMgYmFzZWQgdXBvbiB0aGUgRGphbmdvIHByb2plY3QgdGVtcGxhdGUsIHRoZSBmaWxlcyBvZiB3aGljaCBhcmUgY292ZXJlZCBieSB0aGUgQlNEIGxpY2Vuc2UgYW5kIGFyZSBjb3B5cmlnaHQgKGMpIERqYW5nbyBTb2Z0d2FyZQorRm91bmRhdGlvbiBhbmQgaW5kaXZpZHVhbCBjb250cmlidXRvcnMuCisKKyogVHdpdHRlciBCb290c3RyYXAgKGluY2x1ZGluZyBHbHlwaGljb25zKSwgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4wLgorCisqIGpRdWVyeSBpcyByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvYmluL2JpdGJha2UgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzZDEzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlCkBAIC0wLDAgKzEsNTMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgUk9BRCBHbWJICisjIENvcHlyaWdodCAoQykgMjAwNiAgICAgICAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpYicpKQordHJ5OgorICAgIGltcG9ydCBiYgorZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBleGM6CisgICAgc3lzLmV4aXQoc3RyKGV4YykpCisKK2Zyb20gYmIgaW1wb3J0IGNvb2tlcmRhdGEKK2Zyb20gYmIubWFpbiBpbXBvcnQgYml0YmFrZV9tYWluLCBCaXRCYWtlQ29uZmlnUGFyYW1ldGVycywgQkJNYWluRXhjZXB0aW9uCisKK19fdmVyc2lvbl9fID0gIjEuMjcuMSIKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpZiBfX3ZlcnNpb25fXyAhPSBiYi5fX3ZlcnNpb25fXzoKKyAgICAgICAgc3lzLmV4aXQoIkJpdGJha2UgY29yZSB2ZXJzaW9uIGFuZCBwcm9ncmFtIHZlcnNpb24gbWlzbWF0Y2ghIikKKyAgICB0cnk6CisgICAgICAgIHN5cy5leGl0KGJpdGJha2VfbWFpbihCaXRCYWtlQ29uZmlnUGFyYW1ldGVycyhzeXMuYXJndiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZXJkYXRhLkNvb2tlckNvbmZpZ3VyYXRpb24oKSkpCisgICAgZXhjZXB0IEJCTWFpbkV4Y2VwdGlvbiBhcyBlcnI6CisgICAgICAgIHN5cy5leGl0KGVycikKKyAgICBleGNlcHQgYmIuQkJIYW5kbGVkRXhjZXB0aW9uOgorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9iaXRiYWtlLWRpZmZzaWdzIGIvYml0YmFrZS9iaW4vYml0YmFrZS1kaWZmc2lncwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTZmMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9iaW4vYml0YmFrZS1kaWZmc2lncwpAQCAtMCwwICsxLDEzOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgYml0YmFrZS1kaWZmc2lncworIyBCaXRCYWtlIHRhc2sgc2lnbmF0dXJlIGRhdGEgY29tcGFyaXNvbiB1dGlsaXR5CisjCisjIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IGZubWF0Y2gKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IGxvZ2dpbmcKKworc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSksICdsaWInKSkKKworaW1wb3J0IGJiLnRpbmZvaWwKK2ltcG9ydCBiYi5zaWdnZW4KKworZGVmIGxvZ2dlcl9jcmVhdGUobmFtZSwgb3V0cHV0PXN5cy5zdGRlcnIpOgorICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihvdXRwdXQpCisgICAgZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpCisgICAgaWYgb3V0cHV0LmlzYXR0eSgpOgorICAgICAgICBmb3JtYXQuZW5hYmxlX2NvbG9yKCkKKyAgICBjb25zb2xlLnNldEZvcm1hdHRlcihmb3JtYXQpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKKyAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIHJldHVybiBsb2dnZXIKKworbG9nZ2VyID0gbG9nZ2VyX2NyZWF0ZSgnYml0YmFrZS1kaWZmc2lncycpCisKK2RlZiBmaW5kX2NvbXBhcmVfdGFzayhiYmhhbmRsZXIsIHBuLCB0YXNrbmFtZSk6CisgICAgIiIiIEZpbmQgdGhlIG1vc3QgcmVjZW50IHNpZ25hdHVyZSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBQTi90YXNrIGFuZCBjb21wYXJlIHRoZW0gIiIiCisKKyAgICBkZWYgZ2V0X2hhc2h2YWwoc2lnaW5mbyk6CisgICAgICAgIGlmIHNpZ2luZm8uZW5kc3dpdGgoJy5zaWdpbmZvJyk6CisgICAgICAgICAgICByZXR1cm4gc2lnaW5mby5ycGFydGl0aW9uKCc6JylbMl0ucGFydGl0aW9uKCdfJylbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzaWdpbmZvLnJwYXJ0aXRpb24oJy4nKVsyXQorCisgICAgaWYgbm90IGhhc2F0dHIoYmIuc2lnZ2VuLCAnZmluZF9zaWdpbmZvJyk6CisgICAgICAgIGxvZ2dlci5lcnJvcignTWV0YWRhdGEgZG9lcyBub3Qgc3VwcG9ydCBmaW5kaW5nIHNpZ25hdHVyZSBkYXRhIGZpbGVzJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlmIG5vdCB0YXNrbmFtZS5zdGFydHN3aXRoKCdkb18nKToKKyAgICAgICAgdGFza25hbWUgPSAnZG9fJXMnICUgdGFza25hbWUKKworICAgIGZpbGVkYXRlcyA9IGJiLnNpZ2dlbi5maW5kX3NpZ2luZm8ocG4sIHRhc2tuYW1lLCBOb25lLCBiYmhhbmRsZXIuY29uZmlnX2RhdGEpCisgICAgbGF0ZXN0ZmlsZXMgPSBzb3J0ZWQoZmlsZWRhdGVzLmtleXMoKSwga2V5PWxhbWJkYSBmOiBmaWxlZGF0ZXNbZl0pWy0zOl0KKyAgICBpZiBub3QgbGF0ZXN0ZmlsZXM6CisgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc2lnZGF0YSBmaWxlcyBmb3VuZCBtYXRjaGluZyAlcyAlcycgJSAocG4sIHRhc2tuYW1lKSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBlbGlmIGxlbihsYXRlc3RmaWxlcykgPCAyOgorICAgICAgICBsb2dnZXIuZXJyb3IoJ09ubHkgb25lIG1hdGNoaW5nIHNpZ2RhdGEgZmlsZSBmb3VuZCBmb3IgdGhlIHNwZWNpZmllZCB0YXNrICglcyAlcyknICUgKHBuLCB0YXNrbmFtZSkpCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZWxzZToKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgbGF0ZXN0ZmlsZXMgY29udGFpbiAzIGVsZW1lbnRzIGFuZCB0aGUgZmlyc3QgdHdvIGhhdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZS4KKyAgICAgICAgIyBJbiB0aGlzIGNhc2UsIHdlIGRlbGV0ZSB0aGUgc2Vjb25kIGVsZW1lbnQuCisgICAgICAgICMgVGhlIGFib3ZlIGNhc2UgaXMgYWN0dWFsbHkgdGhlIG1vc3QgY29tbW9uIG9uZS4gQmVjYXVzZSB3ZSBtYXkgaGF2ZSBzaWdkYXRhIGZpbGUgYW5kIHNpZ2luZm8KKyAgICAgICAgIyBmaWxlIGhhdmluZyB0aGUgc2FtZSBoYXNoIHZhbHVlLiBDb21wYXJpbmcgc3VjaCB0d28gZmlsZXMgbWFrZXMgbm8gc2Vuc2UuCisgICAgICAgIGlmIGxlbihsYXRlc3RmaWxlcykgPT0gMzoKKyAgICAgICAgICAgIGhhc2gwID0gZ2V0X2hhc2h2YWwobGF0ZXN0ZmlsZXNbMF0pCisgICAgICAgICAgICBoYXNoMSA9IGdldF9oYXNodmFsKGxhdGVzdGZpbGVzWzFdKQorICAgICAgICAgICAgaWYgaGFzaDAgPT0gaGFzaDE6CisgICAgICAgICAgICAgICAgbGF0ZXN0ZmlsZXMucG9wKDEpCisKKyAgICAgICAgIyBEZWZpbmUgcmVjdXJzaW9uIGNhbGxiYWNrCisgICAgICAgIGRlZiByZWN1cnNlY2Ioa2V5LCBoYXNoMSwgaGFzaDIpOgorICAgICAgICAgICAgaGFzaGVzID0gW2hhc2gxLCBoYXNoMl0KKyAgICAgICAgICAgIGhhc2hmaWxlcyA9IGJiLnNpZ2dlbi5maW5kX3NpZ2luZm8oa2V5LCBOb25lLCBoYXNoZXMsIGJiaGFuZGxlci5jb25maWdfZGF0YSkKKworICAgICAgICAgICAgcmVjb3V0ID0gW10KKyAgICAgICAgICAgIGlmIGxlbihoYXNoZmlsZXMpID09IDI6CisgICAgICAgICAgICAgICAgb3V0MiA9IGJiLnNpZ2dlbi5jb21wYXJlX3NpZ2ZpbGVzKGhhc2hmaWxlc1toYXNoMV0sIGhhc2hmaWxlc1toYXNoMl0sIHJlY3Vyc2VjYikKKyAgICAgICAgICAgICAgICByZWNvdXQuZXh0ZW5kKGxpc3QoJyAgJyArIGwgZm9yIGwgaW4gb3V0MikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlY291dC5hcHBlbmQoIlVuYWJsZSB0byBmaW5kIG1hdGNoaW5nIHNpZ2RhdGEgZm9yICVzIHdpdGggaGFzaGVzICVzIG9yICVzIiAlIChrZXksIGhhc2gxLCBoYXNoMikpCisKKyAgICAgICAgICAgIHJldHVybiByZWNvdXQKKworICAgICAgICAjIFJlY3Vyc2UgaW50byBzaWduYXR1cmUgY29tcGFyaXNvbgorICAgICAgICBvdXRwdXQgPSBiYi5zaWdnZW4uY29tcGFyZV9zaWdmaWxlcyhsYXRlc3RmaWxlc1swXSwgbGF0ZXN0ZmlsZXNbMV0sIHJlY3Vyc2VjYikKKyAgICAgICAgaWYgb3V0cHV0OgorICAgICAgICAgICAgcHJpbnQgJ1xuJy5qb2luKG91dHB1dCkKKyAgICBzeXMuZXhpdCgwKQorCisKKworcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKAorICAgIGRlc2NyaXB0aW9uID0gIkNvbXBhcmVzIHNpZ2luZm8vc2lnZGF0YSBmaWxlcyB3cml0dGVuIG91dCBieSBCaXRCYWtlIiwKKyAgICB1c2FnZSA9ICIiIgorICAlcHJvZyAtdCByZWNpcGVuYW1lIHRhc2tuYW1lCisgICVwcm9nIHNpZ2RhdGFmaWxlMSBzaWdkYXRhZmlsZTIKKyAgJXByb2cgc2lnZGF0YWZpbGUxIiIiKQorCitwYXJzZXIuYWRkX29wdGlvbigiLXQiLCAiLS10YXNrIiwKKyAgICAgICAgaGVscCA9ICJmaW5kIHRoZSBzaWduYXR1cmUgZGF0YSBmaWxlcyBmb3IgbGFzdCB0d28gcnVucyBvZiB0aGUgc3BlY2lmaWVkIHRhc2sgYW5kIGNvbXBhcmUgdGhlbSIsCisgICAgICAgIGFjdGlvbj0ic3RvcmUiLCBkZXN0PSJ0YXNrYXJncyIsIG5hcmdzPTIsIG1ldGF2YXI9J3JlY2lwZW5hbWUgdGFza25hbWUnKQorCitvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3Moc3lzLmFyZ3YpCisKK2lmIG9wdGlvbnMudGFza2FyZ3M6CisgICAgdGluZm9pbCA9IGJiLnRpbmZvaWwuVGluZm9pbCgpCisgICAgdGluZm9pbC5wcmVwYXJlKGNvbmZpZ19vbmx5ID0gVHJ1ZSkKKyAgICBmaW5kX2NvbXBhcmVfdGFzayh0aW5mb2lsLCBvcHRpb25zLnRhc2thcmdzWzBdLCBvcHRpb25zLnRhc2thcmdzWzFdKQorZWxzZToKKyAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBjUGlja2xlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgICAgIG91dHB1dCA9IGJiLnNpZ2dlbi5kdW1wX3NpZ2ZpbGUoc3lzLmFyZ3ZbMV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dHB1dCA9IGJiLnNpZ2dlbi5jb21wYXJlX3NpZ2ZpbGVzKHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZSkpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBleGNlcHQgY1BpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZSBkYXRhIC0gZW5zdXJlIHlvdSBhcmUgc3BlY2lmeWluZyBzaWdkYXRhL3NpZ2luZm8gZmlsZXMnKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICBwcmludCAnXG4nLmpvaW4ob3V0cHV0KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vYml0YmFrZS1kdW1wc2lnIGIvYml0YmFrZS9iaW4vYml0YmFrZS1kdW1wc2lnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1NmQ5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLWR1bXBzaWcKQEAgLTAsMCArMSw2NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgYml0YmFrZS1kdW1wc2lnCisjIEJpdEJha2UgdGFzayBzaWduYXR1cmUgZHVtcCB1dGlsaXR5CisjCisjIENvcHlyaWdodCAoQykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IGxvZ2dpbmcKKworc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSksICdsaWInKSkKKworaW1wb3J0IGJiLnNpZ2dlbgorCitkZWYgbG9nZ2VyX2NyZWF0ZShuYW1lLCBvdXRwdXQ9c3lzLnN0ZGVycik6CisgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIobmFtZSkKKyAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKG91dHB1dCkKKyAgICBmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikKKyAgICBpZiBvdXRwdXQuaXNhdHR5KCk6CisgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQorICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlKQorICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgcmV0dXJuIGxvZ2dlcgorCitsb2dnZXIgPSBsb2dnZXJfY3JlYXRlKCdiaXRiYWtlLWR1bXBzaWcnKQorCitwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoCisgICAgZGVzY3JpcHRpb24gPSAiRHVtcHMgc2lnaW5mby9zaWdkYXRhIGZpbGVzIHdyaXR0ZW4gb3V0IGJ5IEJpdEJha2UiLAorICAgIHVzYWdlID0gIiIiCisgICVwcm9nIHNpZ2RhdGFmaWxlIiIiKQorCitvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3Moc3lzLmFyZ3YpCisKK2lmIGxlbihhcmdzKSA9PSAxOgorICAgIHBhcnNlci5wcmludF9oZWxwKCkKK2Vsc2U6CisgICAgaW1wb3J0IGNQaWNrbGUKKyAgICB0cnk6CisgICAgICAgIG91dHB1dCA9IGJiLnNpZ2dlbi5kdW1wX3NpZ2ZpbGUoYXJnc1sxXSkKKyAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGUpKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGV4Y2VwdCBjUGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3I6CisgICAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBzaWduYXR1cmUgZGF0YSAtIGVuc3VyZSB5b3UgYXJlIHNwZWNpZnlpbmcgYSBzaWdkYXRhL3NpZ2luZm8gZmlsZScpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBpZiBvdXRwdXQ6CisgICAgICAgIHByaW50ICdcbicuam9pbihvdXRwdXQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi9iaXRiYWtlLWxheWVycyBiL2JpdGJha2UvYmluL2JpdGJha2UtbGF5ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZiMTMwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLWxheWVycwpAQCAtMCwwICsxLDEwNzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIFRoaXMgc2NyaXB0IGhhcyBzdWJjb21tYW5kcyB3aGljaCBvcGVyYXRlIGFnYWluc3QgeW91ciBiaXRiYWtlIGxheWVycywgZWl0aGVyCisjIGRpc3BsYXlpbmcgdXNlZnVsIGluZm9ybWF0aW9uLCBvciBhY3RpbmcgYWdhaW5zdCB0aGVtLgorIyBTZWUgdGhlIGhlbHAgb3V0cHV0IGZvciBkZXRhaWxzIG9uIGF2YWlsYWJsZSBjb21tYW5kcy4KKworIyBDb3B5cmlnaHQgKEMpIDIwMTEgTWVudG9yIEdyYXBoaWNzIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDE1IEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgZm5tYXRjaAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgaHR0cGxpYiwgdXJscGFyc2UsIGpzb24KK2ltcG9ydCBzdWJwcm9jZXNzCisKK2JpbmRpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKK3RvcGRpciA9IG9zLnBhdGguZGlybmFtZShiaW5kaXIpCitzeXMucGF0aFswOjBdID0gW29zLnBhdGguam9pbih0b3BkaXIsICdsaWInKV0KKworaW1wb3J0IGJiLmNhY2hlCitpbXBvcnQgYmIuY29va2VyCitpbXBvcnQgYmIucHJvdmlkZXJzCitpbXBvcnQgYmIudXRpbHMKK2ltcG9ydCBiYi50aW5mb2lsCisKKworZGVmIGxvZ2dlcl9jcmVhdGUobmFtZSwgb3V0cHV0PXN5cy5zdGRlcnIpOgorICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihvdXRwdXQpCisgICAgZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpCisgICAgaWYgb3V0cHV0LmlzYXR0eSgpOgorICAgICAgICBmb3JtYXQuZW5hYmxlX2NvbG9yKCkKKyAgICBjb25zb2xlLnNldEZvcm1hdHRlcihmb3JtYXQpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKKyAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIHJldHVybiBsb2dnZXIKKworbG9nZ2VyID0gbG9nZ2VyX2NyZWF0ZSgnYml0YmFrZS1sYXllcnMnLCBzeXMuc3Rkb3V0KQorCitjbGFzcyBVc2VyRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIENvbW1hbmRzKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmJiaGFuZGxlciA9IE5vbmUKKyAgICAgICAgc2VsZi5iYmxheWVycyA9IFtdCisKKyAgICBkZWYgaW5pdF9iYmhhbmRsZXIoc2VsZiwgY29uZmlnX29ubHkgPSBGYWxzZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmJiaGFuZGxlcjoKKyAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyID0gYmIudGluZm9pbC5UaW5mb2lsKHRyYWNraW5nPVRydWUpCisgICAgICAgICAgICBzZWxmLmJibGF5ZXJzID0gKHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLmdldFZhcignQkJMQVlFUlMnLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIucHJlcGFyZShjb25maWdfb25seSkKKyAgICAgICAgICAgIGxheWVyY29uZnMgPSBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS52YXJoaXN0b3J5LmdldF92YXJpYWJsZV9pdGVtc19maWxlcygnQkJGSUxFX0NPTExFQ1RJT05TJywgc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEpCisgICAgICAgICAgICBzZWxmLmJiZmlsZV9jb2xsZWN0aW9ucyA9IHtsYXllcjogb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShwYXRoKSkgZm9yIGxheWVyLCBwYXRoIGluIGxheWVyY29uZnMuaXRlcml0ZW1zKCl9CisKKworICAgIGRlZiBkb19zaG93X2xheWVycyhzZWxmLCBhcmdzKToKKyAgICAgICAgIiIic2hvdyBjdXJyZW50IGNvbmZpZ3VyZWQgbGF5ZXJzIiIiCisgICAgICAgIHNlbGYuaW5pdF9iYmhhbmRsZXIoY29uZmlnX29ubHkgPSBUcnVlKQorICAgICAgICBsb2dnZXIucGxhaW4oIiVzICAlcyAgJXMiICUgKCJsYXllciIubGp1c3QoMjApLCAicGF0aCIubGp1c3QoNDApLCAicHJpb3JpdHkiKSkKKyAgICAgICAgbG9nZ2VyLnBsYWluKCc9JyAqIDc0KQorICAgICAgICBmb3IgbGF5ZXIsIF8sIHJlZ2V4LCBwcmkgaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLnJlY2lwZWNhY2hlLmJiZmlsZV9jb25maWdfcHJpb3JpdGllczoKKyAgICAgICAgICAgIGxheWVyZGlyID0gc2VsZi5iYmZpbGVfY29sbGVjdGlvbnMuZ2V0KGxheWVyLCBOb25lKQorICAgICAgICAgICAgbGF5ZXJuYW1lID0gc2VsZi5nZXRfbGF5ZXJfbmFtZShsYXllcmRpcikKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgICVzICAlZCIgJSAobGF5ZXJuYW1lLmxqdXN0KDIwKSwgbGF5ZXJkaXIubGp1c3QoNDApLCBwcmkpKQorCisKKyAgICBkZWYgZG9fYWRkX2xheWVyKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJBZGQgYSBsYXllciB0byBiYmxheWVycy5jb25mCisKK0FkZHMgdGhlIHNwZWNpZmllZCBsYXllciB0byBiYmxheWVycy5jb25mCisiIiIKKyAgICAgICAgbGF5ZXJkaXIgPSBvcy5wYXRoLmFic3BhdGgoYXJncy5sYXllcmRpcikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxheWVyZGlyKToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlNwZWNpZmllZCBsYXllciBkaXJlY3RvcnkgZG9lc24ndCBleGlzdFxuIikKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgbGF5ZXJfY29uZiA9IG9zLnBhdGguam9pbihsYXllcmRpciwgJ2NvbmYnLCAnbGF5ZXIuY29uZicpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsYXllcl9jb25mKToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlNwZWNpZmllZCBsYXllciBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGEgY29uZi9sYXllci5jb25mIGZpbGVcbiIpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGJibGF5ZXJzX2NvbmYgPSBvcy5wYXRoLmpvaW4oJ2NvbmYnLCAnYmJsYXllcnMuY29uZicpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhiYmxheWVyc19jb25mKToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVuYWJsZSB0byBmaW5kIGJibGF5ZXJzLmNvbmZcbiIpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIChub3RhZGRlZCwgXykgPSBiYi51dGlscy5lZGl0X2JibGF5ZXJzX2NvbmYoYmJsYXllcnNfY29uZiwgbGF5ZXJkaXIsIE5vbmUpCisgICAgICAgIGlmIG5vdGFkZGVkOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbm90YWRkZWQ6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU3BlY2lmaWVkIGxheWVyICVzIGlzIGFscmVhZHkgaW4gQkJMQVlFUlNcbiIgJSBpdGVtKQorCisKKyAgICBkZWYgZG9fcmVtb3ZlX2xheWVyKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJSZW1vdmUgYSBsYXllciBmcm9tIGJibGF5ZXJzLmNvbmYKKworUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGxheWVyIGZyb20gYmJsYXllcnMuY29uZgorIiIiCisgICAgICAgIGJibGF5ZXJzX2NvbmYgPSBvcy5wYXRoLmpvaW4oJ2NvbmYnLCAnYmJsYXllcnMuY29uZicpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhiYmxheWVyc19jb25mKToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVuYWJsZSB0byBmaW5kIGJibGF5ZXJzLmNvbmZcbiIpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGlmIGFyZ3MubGF5ZXJkaXIuc3RhcnRzd2l0aCgnKicpOgorICAgICAgICAgICAgbGF5ZXJkaXIgPSBhcmdzLmxheWVyZGlyCisgICAgICAgIGVsaWYgbm90ICcvJyBpbiBhcmdzLmxheWVyZGlyOgorICAgICAgICAgICAgbGF5ZXJkaXIgPSAnKi8lcycgJSBhcmdzLmxheWVyZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYXllcmRpciA9IG9zLnBhdGguYWJzcGF0aChhcmdzLmxheWVyZGlyKQorICAgICAgICAoXywgbm90cmVtb3ZlZCkgPSBiYi51dGlscy5lZGl0X2JibGF5ZXJzX2NvbmYoYmJsYXllcnNfY29uZiwgTm9uZSwgbGF5ZXJkaXIpCisgICAgICAgIGlmIG5vdHJlbW92ZWQ6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RyZW1vdmVkOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIk5vIGxheWVycyBtYXRjaGluZyAlcyBmb3VuZCBpbiBCQkxBWUVSU1xuIiAlIGl0ZW0pCisgICAgICAgICAgICByZXR1cm4gMQorCisKKyAgICBkZWYgZ2V0X2pzb25fZGF0YShzZWxmLCBhcGl1cmwpOgorICAgICAgICBwcm94eV9zZXR0aW5ncyA9IG9zLmVudmlyb24uZ2V0KCJodHRwX3Byb3h5IiwgTm9uZSkKKyAgICAgICAgY29ubiA9IE5vbmUKKyAgICAgICAgX3BhcnNlZHVybCA9IHVybHBhcnNlLnVybHBhcnNlKGFwaXVybCkKKyAgICAgICAgcGF0aCA9IF9wYXJzZWR1cmwucGF0aAorICAgICAgICBxdWVyeSA9IF9wYXJzZWR1cmwucXVlcnkKKyAgICAgICAgZGVmIHBhcnNlX3VybCh1cmwpOgorICAgICAgICAgICAgcGFyc2VkdXJsID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgICAgICAgICAgaWYgcGFyc2VkdXJsLm5ldGxvY1swXSA9PSAnWyc6CisgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHBhcnNlZHVybC5uZXRsb2NbMTpdLnNwbGl0KCddJywgMSkKKyAgICAgICAgICAgICAgICBpZiAnOicgaW4gcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHBvcnQucnNwbGl0KCc6JywgMSlbMV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBwYXJzZWR1cmwubmV0bG9jLmNvdW50KCc6JykgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgKGhvc3QsIHBvcnQpID0gcGFyc2VkdXJsLm5ldGxvYy5zcGxpdCgiOiIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IHBhcnNlZHVybC5uZXRsb2MKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybiAoaG9zdCwgODAgaWYgcG9ydCBpcyBOb25lIGVsc2UgaW50KHBvcnQpKQorCisgICAgICAgIGlmIHByb3h5X3NldHRpbmdzIGlzIE5vbmU6CisgICAgICAgICAgICBob3N0LCBwb3J0ID0gcGFyc2VfdXJsKGFwaXVybCkKKyAgICAgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKGhvc3QsIHBvcnQpCisgICAgICAgICAgICBjb25uLnJlcXVlc3QoIkdFVCIsIHBhdGggKyAiPyIgKyBxdWVyeSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBwYXJzZV91cmwocHJveHlfc2V0dGluZ3MpCisgICAgICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihob3N0LCBwb3J0KQorICAgICAgICAgICAgY29ubi5yZXF1ZXN0KCJHRVQiLCBhcGl1cmwpCisKKyAgICAgICAgciA9IGNvbm4uZ2V0cmVzcG9uc2UoKQorICAgICAgICBpZiByLnN0YXR1cyAhPSAyMDA6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZhaWxlZCB0byByZWFkICIgKyBwYXRoICsgIjogJWQgJXMiICUgKHIuc3RhdHVzLCByLnJlYXNvbikpCisgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHIucmVhZCgpKQorCisKKyAgICBkZWYgZ2V0X2xheWVyX2RlcHMoc2VsZiwgbGF5ZXJuYW1lLCBsYXllcml0ZW1zLCBsYXllcmJyYW5jaGVzLCBsYXllcmRlcGVuZGVuY2llcywgYnJhbmNobnVtLCBzZWxmbmFtZT1GYWxzZSk6CisgICAgICAgIGRlZiBsYXllcml0ZW1zX2luZm9faWQoaXRlbXNfbmFtZSwgbGF5ZXJpdGVtcyk6CisgICAgICAgICAgICBsaXRlbXNfaWQgPSBOb25lCisgICAgICAgICAgICBmb3IgbGkgaW4gbGF5ZXJpdGVtczoKKyAgICAgICAgICAgICAgICBpZiBsaVsnbmFtZSddID09IGl0ZW1zX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGxpdGVtc19pZCA9IGxpWydpZCddCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4gbGl0ZW1zX2lkCisKKyAgICAgICAgZGVmIGxheWVyYnJhbmNoZXNfaW5mbyhpdGVtc19pZCwgbGF5ZXJicmFuY2hlcyk6CisgICAgICAgICAgICBsYnJhbmNoID0ge30KKyAgICAgICAgICAgIGZvciBsYiBpbiBsYXllcmJyYW5jaGVzOgorICAgICAgICAgICAgICAgIGlmIGxiWydsYXllciddID09IGl0ZW1zX2lkIGFuZCBsYlsnYnJhbmNoJ10gPT0gYnJhbmNobnVtOgorICAgICAgICAgICAgICAgICAgICBsYnJhbmNoWydpZCddID0gbGJbJ2lkJ10KKyAgICAgICAgICAgICAgICAgICAgbGJyYW5jaFsndmNzX3N1YmRpciddID0gbGJbJ3Zjc19zdWJkaXInXQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmV0dXJuIGxicmFuY2gKKworICAgICAgICBkZWYgbGF5ZXJkZXBlbmRlbmNpZXNfaW5mbyhsYl9pZCwgbGF5ZXJkZXBlbmRlbmNpZXMpOgorICAgICAgICAgICAgbGRfZGVwcyA9IFtdCisgICAgICAgICAgICBmb3IgbGQgaW4gbGF5ZXJkZXBlbmRlbmNpZXM6CisgICAgICAgICAgICAgICAgaWYgbGRbJ2xheWVyYnJhbmNoJ10gPT0gbGJfaWQgYW5kIG5vdCBsZFsnZGVwZW5kZW5jeSddIGluIGxkX2RlcHM6CisgICAgICAgICAgICAgICAgICAgIGxkX2RlcHMuYXBwZW5kKGxkWydkZXBlbmRlbmN5J10pCisgICAgICAgICAgICBpZiBub3QgbGRfZGVwczoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRoZSBkZXBlbmRlbmN5IG9mIGxheWVyRGVwZW5kZW5jaWVzIGlzIG5vdCBmb3VuZC4iKQorICAgICAgICAgICAgcmV0dXJuIGxkX2RlcHMKKworICAgICAgICBkZWYgbGF5ZXJpdGVtc19pbmZvX25hbWVfc3ViZGlyKGl0ZW1zX2lkLCBsYXllcml0ZW1zKToKKyAgICAgICAgICAgIGxpdGVtcyA9IHt9CisgICAgICAgICAgICBmb3IgbGkgaW4gbGF5ZXJpdGVtczoKKyAgICAgICAgICAgICAgICBpZiBsaVsnaWQnXSA9PSBpdGVtc19pZDoKKyAgICAgICAgICAgICAgICAgICAgbGl0ZW1zWyd2Y3NfdXJsJ10gPSBsaVsndmNzX3VybCddCisgICAgICAgICAgICAgICAgICAgIGxpdGVtc1snbmFtZSddID0gbGlbJ25hbWUnXQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmV0dXJuIGxpdGVtcworCisgICAgICAgIGlmIHNlbGZuYW1lOgorICAgICAgICAgICAgc2VsZmlkID0gbGF5ZXJpdGVtc19pbmZvX2lkKGxheWVybmFtZSwgbGF5ZXJpdGVtcykKKyAgICAgICAgICAgIGxiaW5mbyA9IGxheWVyYnJhbmNoZXNfaW5mbyhzZWxmaWQsIGxheWVyYnJhbmNoZXMpCisgICAgICAgICAgICBpZiBsYmluZm86CisgICAgICAgICAgICAgICAgc2VsZnN1YmRpciA9IGxiaW5mb1sndmNzX3N1YmRpciddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiJXMgaXMgbm90IGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgYnJhbmNoIiAlIGxheWVybmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGZ1cmwgPSBsYXllcml0ZW1zX2luZm9fbmFtZV9zdWJkaXIoc2VsZmlkLCBsYXllcml0ZW1zKVsndmNzX3VybCddCisgICAgICAgICAgICBpZiBzZWxmdXJsOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmdXJsLCBzZWxmc3ViZGlyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGdldCBsYXllciAlcyBnaXQgcmVwbyBhbmQgc3ViZGlyIiAlIGxheWVybmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbGRpY3QgPSB7fQorICAgICAgICBpdGVtc2lkID0gbGF5ZXJpdGVtc19pbmZvX2lkKGxheWVybmFtZSwgbGF5ZXJpdGVtcykKKyAgICAgICAgaWYgbm90IGl0ZW1zaWQ6CisgICAgICAgICAgICByZXR1cm4gbGF5ZXJuYW1lLCBOb25lCisgICAgICAgIGxiaWQgPSBsYXllcmJyYW5jaGVzX2luZm8oaXRlbXNpZCwgbGF5ZXJicmFuY2hlcykKKyAgICAgICAgaWYgbGJpZDoKKyAgICAgICAgICAgIGxiaWQgPSBsYXllcmJyYW5jaGVzX2luZm8oaXRlbXNpZCwgbGF5ZXJicmFuY2hlcylbJ2lkJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiJXMgaXMgbm90IGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgYnJhbmNoIiAlIGxheWVybmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgIGZvciBkZXBlbmRlbmN5IGluIGxheWVyZGVwZW5kZW5jaWVzX2luZm8obGJpZCwgbGF5ZXJkZXBlbmRlbmNpZXMpOgorICAgICAgICAgICAgbG5hbWUgPSBsYXllcml0ZW1zX2luZm9fbmFtZV9zdWJkaXIoZGVwZW5kZW5jeSwgbGF5ZXJpdGVtcylbJ25hbWUnXQorICAgICAgICAgICAgbHVybCA9IGxheWVyaXRlbXNfaW5mb19uYW1lX3N1YmRpcihkZXBlbmRlbmN5LCBsYXllcml0ZW1zKVsndmNzX3VybCddCisgICAgICAgICAgICBsc3ViZGlyID0gbGF5ZXJicmFuY2hlc19pbmZvKGRlcGVuZGVuY3ksIGxheWVyYnJhbmNoZXMpWyd2Y3Nfc3ViZGlyJ10KKyAgICAgICAgICAgIGxkaWN0W2xuYW1lXSA9IGx1cmwsIGxzdWJkaXIKKyAgICAgICAgcmV0dXJuIE5vbmUsIGxkaWN0CisKKworICAgIGRlZiBnZXRfZmV0Y2hfbGF5ZXIoc2VsZiwgZmV0Y2hkaXIsIHVybCwgc3ViZGlyLCBmZXRjaF9sYXllcik6CisgICAgICAgIGxheWVybmFtZSA9IHNlbGYuZ2V0X2xheWVyX25hbWUodXJsKQorICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KGxheWVybmFtZSlbMV0gPT0gJy5naXQnOgorICAgICAgICAgICAgbGF5ZXJuYW1lID0gb3MucGF0aC5zcGxpdGV4dChsYXllcm5hbWUpWzBdCisgICAgICAgIHJlcG9kaXIgPSBvcy5wYXRoLmpvaW4oZmV0Y2hkaXIsIGxheWVybmFtZSkKKyAgICAgICAgbGF5ZXJkaXIgPSBvcy5wYXRoLmpvaW4ocmVwb2Rpciwgc3ViZGlyKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVwb2Rpcik6CisgICAgICAgICAgICBpZiBmZXRjaF9sYXllcjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdWJwcm9jZXNzLmNhbGwoJ2dpdCBjbG9uZSAlcyAlcycgJSAodXJsLCByZXBvZGlyKSwgc2hlbGwgPSBUcnVlKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gZG93bmxvYWQgJXMiICUgdXJsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXllcm5hbWUsIGxheWVyZGlyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiUmVwb3NpdG9yeSAlcyBuZWVkcyB0byBiZSBmZXRjaGVkIiAlIHVybCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGF5ZXJuYW1lLCBsYXllcmRpcgorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGxheWVyZGlyKToKKyAgICAgICAgICAgIHJldHVybiBsYXllcm5hbWUsIGxheWVyZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIiVzIGlzIG5vdCBpbiAlcyIgJSAodXJsLCBzdWJkaXIpKQorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisKKyAgICBkZWYgZG9fbGF5ZXJpbmRleF9mZXRjaChzZWxmLCBhcmdzKToKKyAgICAgICAgIiIiRmV0Y2hlcyBhIGxheWVyIGZyb20gYSBsYXllciBpbmRleCBhbG9uZyB3aXRoIGl0cyBkZXBlbmRlbnQgbGF5ZXJzLCBhbmQgYWRkcyB0aGVtIHRvIGNvbmYvYmJsYXllcnMuY29uZi4KKyIiIgorICAgICAgICBzZWxmLmluaXRfYmJoYW5kbGVyKGNvbmZpZ19vbmx5ID0gVHJ1ZSkKKyAgICAgICAgYXBpdXJsID0gc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQkxBWUVSU19MQVlFUklOREVYX1VSTCcsIFRydWUpCisgICAgICAgIGlmIG5vdCBhcGl1cmw6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNhbm5vdCBnZXQgQkJMQVlFUlNfTEFZRVJJTkRFWF9VUkwiKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGFwaXVybFstMV0gIT0gJy8nOgorICAgICAgICAgICAgICAgIGFwaXVybCArPSAnLycKKyAgICAgICAgICAgIGFwaXVybCArPSAiYXBpLyIKKyAgICAgICAgYXBpbGlua3MgPSBzZWxmLmdldF9qc29uX2RhdGEoYXBpdXJsKQorICAgICAgICBicmFuY2hlcyA9IHNlbGYuZ2V0X2pzb25fZGF0YShhcGlsaW5rc1snYnJhbmNoZXMnXSkKKworICAgICAgICBicmFuY2hudW0gPSAwCisgICAgICAgIGZvciBicmFuY2ggaW4gYnJhbmNoZXM6CisgICAgICAgICAgICBpZiBicmFuY2hbJ25hbWUnXSA9PSBhcmdzLmJyYW5jaDoKKyAgICAgICAgICAgICAgICBicmFuY2hudW0gPSBicmFuY2hbJ2lkJ10KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBicmFuY2hudW0gPT0gMDoKKyAgICAgICAgICAgIHZhbGlkYnJhbmNoZXMgPSAnLCAnLmpvaW4oW2JyYW5jaFsnbmFtZSddIGZvciBicmFuY2ggaW4gYnJhbmNoZXNdKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdJbnZhbGlkIGxheWVyIGJyYW5jaCBuYW1lICIlcyIuIFZhbGlkIGJyYW5jaGVzOiAlcycgJSAoYXJncy5icmFuY2gsIHZhbGlkYnJhbmNoZXMpKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBpZ25vcmVfbGF5ZXJzID0gW10KKyAgICAgICAgZm9yIGNvbGxlY3Rpb24gaW4gc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQkZJTEVfQ09MTEVDVElPTlMnLCBUcnVlKS5zcGxpdCgpOgorICAgICAgICAgICAgbG5hbWUgPSBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YS5nZXRWYXIoJ0JCTEFZRVJTX0xBWUVSSU5ERVhfTkFNRV8lcycgJSBjb2xsZWN0aW9uLCBUcnVlKQorICAgICAgICAgICAgaWYgbG5hbWU6CisgICAgICAgICAgICAgICAgaWdub3JlX2xheWVycy5hcHBlbmQobG5hbWUpCisKKyAgICAgICAgaWYgYXJncy5pZ25vcmU6CisgICAgICAgICAgICBpZ25vcmVfbGF5ZXJzLmV4dGVuZChhcmdzLmlnbm9yZS5zcGxpdCgnLCcpKQorCisgICAgICAgIGxheWVyaXRlbXMgPSBzZWxmLmdldF9qc29uX2RhdGEoYXBpbGlua3NbJ2xheWVySXRlbXMnXSkKKyAgICAgICAgbGF5ZXJicmFuY2hlcyA9IHNlbGYuZ2V0X2pzb25fZGF0YShhcGlsaW5rc1snbGF5ZXJCcmFuY2hlcyddKQorICAgICAgICBsYXllcmRlcGVuZGVuY2llcyA9IHNlbGYuZ2V0X2pzb25fZGF0YShhcGlsaW5rc1snbGF5ZXJEZXBlbmRlbmNpZXMnXSkKKyAgICAgICAgaW52YWx1ZW5hbWVzID0gW10KKyAgICAgICAgcmVwb3VybHMgPSB7fQorICAgICAgICBwcmludGxheWVycyA9IFtdCisgICAgICAgIGRlZiBxdWVyeV9kZXBlbmRlbmNpZXMobGF5ZXJzLCBsYXllcml0ZW1zLCBsYXllcmJyYW5jaGVzLCBsYXllcmRlcGVuZGVuY2llcywgYnJhbmNobnVtKToKKyAgICAgICAgICAgIGRlcHNsYXllciA9IFtdCisgICAgICAgICAgICBmb3IgbGF5ZXJuYW1lIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBpbnZhbHVlbmFtZSwgbGF5ZXJkaWN0ID0gc2VsZi5nZXRfbGF5ZXJfZGVwcyhsYXllcm5hbWUsIGxheWVyaXRlbXMsIGxheWVyYnJhbmNoZXMsIGxheWVyZGVwZW5kZW5jaWVzLCBicmFuY2hudW0pCisgICAgICAgICAgICAgICAgaWYgbGF5ZXJkaWN0OgorICAgICAgICAgICAgICAgICAgICByZXBvdXJsc1tsYXllcm5hbWVdID0gc2VsZi5nZXRfbGF5ZXJfZGVwcyhsYXllcm5hbWUsIGxheWVyaXRlbXMsIGxheWVyYnJhbmNoZXMsIGxheWVyZGVwZW5kZW5jaWVzLCBicmFuY2hudW0sIHNlbGZuYW1lPVRydWUpCisgICAgICAgICAgICAgICAgICAgIGZvciBsYXllciBpbiBsYXllcmRpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGF5ZXIgaW4gaWdub3JlX2xheWVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzbGF5ZXIuYXBwZW5kKGxheWVyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRsYXllcnMuYXBwZW5kKChsYXllcm5hbWUsIGxheWVyLCBsYXllcmRpY3RbbGF5ZXJdWzBdLCBsYXllcmRpY3RbbGF5ZXJdWzFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsYXllciBpbiBpZ25vcmVfbGF5ZXJzIGFuZCBub3QgbGF5ZXIgaW4gcmVwb3VybHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3VybHNbbGF5ZXJdID0gKGxheWVyZGljdFtsYXllcl1bMF0sIGxheWVyZGljdFtsYXllcl1bMV0pCisgICAgICAgICAgICAgICAgaWYgaW52YWx1ZW5hbWUgYW5kIG5vdCBpbnZhbHVlbmFtZSBpbiBpbnZhbHVlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGludmFsdWVuYW1lcy5hcHBlbmQoaW52YWx1ZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gZGVwc2xheWVyCisKKyAgICAgICAgZGVwc2xheWVycyA9IHF1ZXJ5X2RlcGVuZGVuY2llcyhhcmdzLmxheWVybmFtZSwgbGF5ZXJpdGVtcywgbGF5ZXJicmFuY2hlcywgbGF5ZXJkZXBlbmRlbmNpZXMsIGJyYW5jaG51bSkKKyAgICAgICAgd2hpbGUgZGVwc2xheWVyczoKKyAgICAgICAgICAgIGRlcHNsYXllciA9IHF1ZXJ5X2RlcGVuZGVuY2llcyhkZXBzbGF5ZXJzLCBsYXllcml0ZW1zLCBsYXllcmJyYW5jaGVzLCBsYXllcmRlcGVuZGVuY2llcywgYnJhbmNobnVtKQorICAgICAgICAgICAgZGVwc2xheWVycyA9IGRlcHNsYXllcgorICAgICAgICBpZiBpbnZhbHVlbmFtZXM6CisgICAgICAgICAgICBmb3IgaW52YWx1ZW5hbWUgaW4gaW52YWx1ZW5hbWVzOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTGF5ZXIgIiVzIiBub3QgZm91bmQgaW4gbGF5ZXIgaW5kZXgnICUgaW52YWx1ZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBsb2dnZXIucGxhaW4oIiVzICAlcyAgJXMgICVzIiAlICgiTGF5ZXIiLmxqdXN0KDE5KSwgIlJlcXVpcmVkIGJ5Ii5sanVzdCgxOSksICJHaXQgcmVwb3NpdG9yeSIubGp1c3QoNTQpLCAiU3ViZGlyZWN0b3J5IikpCisgICAgICAgIGxvZ2dlci5wbGFpbignPScgKiAxMTUpCisgICAgICAgIGZvciBsYXllcm5hbWUgaW4gYXJncy5sYXllcm5hbWU6CisgICAgICAgICAgICBsYXllcnVybCA9IHJlcG91cmxzW2xheWVybmFtZV0KKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgJXMgJXMgJXMiICUgKGxheWVybmFtZS5sanVzdCgyMCksICctJy5sanVzdCgyMCksIGxheWVydXJsWzBdLmxqdXN0KDU1KSwgbGF5ZXJ1cmxbMV0pKQorICAgICAgICBwcmludGVkbGF5ZXJzID0gW10KKyAgICAgICAgZm9yIGxheWVyLCBkZXBlbmRlbmN5LCBnaXRyZXBvLCBzdWJkaXJlY3RvcnkgaW4gcHJpbnRsYXllcnM6CisgICAgICAgICAgICBpZiBkZXBlbmRlbmN5IGluIHByaW50ZWRsYXllcnM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgJXMgJXMgJXMiICUgKGRlcGVuZGVuY3kubGp1c3QoMjApLCBsYXllci5sanVzdCgyMCksIGdpdHJlcG8ubGp1c3QoNTUpLCBzdWJkaXJlY3RvcnkpKQorICAgICAgICAgICAgcHJpbnRlZGxheWVycy5hcHBlbmQoZGVwZW5kZW5jeSkKKworICAgICAgICBpZiByZXBvdXJsczoKKyAgICAgICAgICAgIGZldGNoZGlyID0gc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQkxBWUVSU19GRVRDSF9ESVInLCBUcnVlKQorICAgICAgICAgICAgaWYgbm90IGZldGNoZGlyOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IGdldCBCQkxBWUVSU19GRVRDSF9ESVIiKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmV0Y2hkaXIpOgorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKGZldGNoZGlyKQorICAgICAgICAgICAgYWRkbGF5ZXJzID0gW10KKyAgICAgICAgICAgIGZvciByZXBvdXJsLCBzdWJkaXIgaW4gcmVwb3VybHMudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgbmFtZSwgbGF5ZXJkaXIgPSBzZWxmLmdldF9mZXRjaF9sYXllcihmZXRjaGRpciwgcmVwb3VybCwgc3ViZGlyLCBub3QgYXJncy5zaG93X29ubHkpCisgICAgICAgICAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICAgICAgICAgICMgRXJyb3IgYWxyZWFkeSBzaG93bgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgICAgIGFkZGxheWVycy5hcHBlbmQoKHN1YmRpciwgbmFtZSwgbGF5ZXJkaXIpKQorICAgICAgICBpZiBub3QgYXJncy5zaG93X29ubHk6CisgICAgICAgICAgICBmb3Igc3ViZGlyLCBuYW1lLCBsYXllcmRpciBpbiBzZXQoYWRkbGF5ZXJzKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsYXllcmRpcik6CisgICAgICAgICAgICAgICAgICAgIGlmIHN1YmRpcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiQWRkaW5nIGxheWVyIFwiJXNcIiB0byBjb25mL2JibGF5ZXJzLmNvbmYiICUgc3ViZGlyKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCJBZGRpbmcgbGF5ZXIgXCIlc1wiIHRvIGNvbmYvYmJsYXllcnMuY29uZiIgJSBuYW1lKQorICAgICAgICAgICAgICAgICAgICBsb2NhbGFyZ3MgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKQorICAgICAgICAgICAgICAgICAgICBsb2NhbGFyZ3MubGF5ZXJkaXIgPSBsYXllcmRpcgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRvX2FkZF9sYXllcihsb2NhbGFyZ3MpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworCisgICAgZGVmIGRvX2xheWVyaW5kZXhfc2hvd19kZXBlbmRzKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJGaW5kIGxheWVyIGRlcGVuZGVuY2llcyBmcm9tIGxheWVyIGluZGV4LgorIiIiCisgICAgICAgIGFyZ3Muc2hvd19vbmx5ID0gVHJ1ZQorICAgICAgICBhcmdzLmlnbm9yZSA9IFtdCisgICAgICAgIHNlbGYuZG9fbGF5ZXJpbmRleF9mZXRjaChhcmdzKQorCisKKyAgICBkZWYgdmVyc2lvbl9zdHIoc2VsZiwgcGUsIHB2LCBwciA9IE5vbmUpOgorICAgICAgICB2ZXJzdHIgPSAiJXMiICUgcHYKKyAgICAgICAgaWYgcHI6CisgICAgICAgICAgICB2ZXJzdHIgPSAiJXMtJXMiICUgKHZlcnN0ciwgcHIpCisgICAgICAgIGlmIHBlOgorICAgICAgICAgICAgdmVyc3RyID0gIiVzOiVzIiAlIChwZSwgdmVyc3RyKQorICAgICAgICByZXR1cm4gdmVyc3RyCisKKworICAgIGRlZiBkb19zaG93X292ZXJsYXllZChzZWxmLCBhcmdzKToKKyAgICAgICAgIiIibGlzdCBvdmVybGF5ZWQgcmVjaXBlcyAod2hlcmUgdGhlIHNhbWUgcmVjaXBlIGV4aXN0cyBpbiBhbm90aGVyIGxheWVyKQorCitMaXN0cyB0aGUgbmFtZXMgb2Ygb3ZlcmxheWVkIHJlY2lwZXMgYW5kIHRoZSBhdmFpbGFibGUgdmVyc2lvbnMgaW4gZWFjaAorbGF5ZXIsIHdpdGggdGhlIHByZWZlcnJlZCB2ZXJzaW9uIGZpcnN0LiBOb3RlIHRoYXQgc2tpcHBlZCByZWNpcGVzIHRoYXQKK2FyZSBvdmVybGF5ZWQgd2lsbCBhbHNvIGJlIGxpc3RlZCwgd2l0aCBhICIgKHNraXBwZWQpIiBzdWZmaXguCisiIiIKKyAgICAgICAgc2VsZi5pbml0X2JiaGFuZGxlcigpCisKKyAgICAgICAgaXRlbXNfbGlzdGVkID0gc2VsZi5saXN0X3JlY2lwZXMoJ092ZXJsYXllZCByZWNpcGVzJywgTm9uZSwgVHJ1ZSwgYXJncy5zYW1lX3ZlcnNpb24sIGFyZ3MuZmlsZW5hbWVzLCBUcnVlLCBOb25lKQorCisgICAgICAgICMgQ2hlY2sgZm9yIG92ZXJsYXllZCAuYmJjbGFzcyBmaWxlcworICAgICAgICBjbGFzc2VzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgZm9yIGxheWVyZGlyIGluIHNlbGYuYmJsYXllcnM6CisgICAgICAgICAgICBjbGFzc2RpciA9IG9zLnBhdGguam9pbihsYXllcmRpciwgJ2NsYXNzZXMnKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY2xhc3NkaXIpOgorICAgICAgICAgICAgICAgIGZvciBjbGFzc2ZpbGUgaW4gb3MubGlzdGRpcihjbGFzc2Rpcik6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoY2xhc3NmaWxlKVsxXSA9PSAnLmJiY2xhc3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlc1tjbGFzc2ZpbGVdLmFwcGVuZChjbGFzc2RpcikKKworICAgICAgICAjIExvY2F0aW5nIGNsYXNzZXMgYW5kIG90aGVyIGZpbGVzIGlzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiByZWNpcGVzIC0KKyAgICAgICAgIyBsYXllciBwcmlvcml0eSBpcyBub3QgYSBmYWN0b3I7IGluc3RlYWQgQml0QmFrZSB1c2VzIHRoZSBmaXJzdCBtYXRjaGluZworICAgICAgICAjIGZpbGUgaW4gQkJQQVRILCB3aGljaCBpcyBtYW5pcHVsYXRlZCBkaXJlY3RseSBieSBlYWNoIGxheWVyJ3MKKyAgICAgICAgIyBjb25mL2xheWVyLmNvbmYgaW4gdHVybiwgdGh1cyB0aGUgb3JkZXIgb2YgbGF5ZXJzIGluIGJibGF5ZXJzLmNvbmYgaXMgYQorICAgICAgICAjIGZhY3RvciAtIGhvd2V2ZXIsIGVhY2ggbGF5ZXIuY29uZiBpcyBmcmVlIHRvIGVpdGhlciBwcmVwZW5kIG9yIGFwcGVuZCB0bworICAgICAgICAjIEJCUEFUSCAob3IgaW5kZWVkIGRvIGNyYXp5IHN0dWZmIHdpdGggaXQpLiBUaHVzIHRoZSBvcmRlciBpbiBCQlBBVEggbWlnaHQKKyAgICAgICAgIyBub3QgYmUgZXhhY3RseSB0aGUgb3JkZXIgcHJlc2VudCBpbiBiYmxheWVycy5jb25mIGVpdGhlci4KKyAgICAgICAgYmJwYXRoID0gc3RyKHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLmdldFZhcignQkJQQVRIJywgVHJ1ZSkpCisgICAgICAgIG92ZXJsYXllZF9jbGFzc19mb3VuZCA9IEZhbHNlCisgICAgICAgIGZvciAoY2xhc3NmaWxlLCBjbGFzc2RpcnMpIGluIGNsYXNzZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGxlbihjbGFzc2RpcnMpID4gMToKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3ZlcmxheWVkX2NsYXNzX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJz09PSBPdmVybGF5ZWQgY2xhc3NlcyA9PT0nKQorICAgICAgICAgICAgICAgICAgICBvdmVybGF5ZWRfY2xhc3NfZm91bmQgPSBUcnVlCisKKyAgICAgICAgICAgICAgICBtYWluZmlsZSA9IGJiLnV0aWxzLndoaWNoKGJicGF0aCwgb3MucGF0aC5qb2luKCdjbGFzc2VzJywgY2xhc3NmaWxlKSkKKyAgICAgICAgICAgICAgICBpZiBhcmdzLmZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCclcycgJSBtYWluZmlsZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIFdlIGVmZmVjdGl2ZWx5IGhhdmUgdG8gZ3Vlc3MgdGhlIGxheWVyIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCclczonICUgY2xhc3NmaWxlKQorICAgICAgICAgICAgICAgICAgICBtYWlubGF5ZXJuYW1lID0gJz8nCisgICAgICAgICAgICAgICAgICAgIGZvciBsYXllcmRpciBpbiBzZWxmLmJibGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NkaXIgPSBvcy5wYXRoLmpvaW4obGF5ZXJkaXIsICdjbGFzc2VzJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1haW5maWxlLnN0YXJ0c3dpdGgoY2xhc3NkaXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5sYXllcm5hbWUgPSBzZWxmLmdldF9sYXllcl9uYW1lKGxheWVyZGlyKQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyAgJXMnICUgbWFpbmxheWVybmFtZSkKKyAgICAgICAgICAgICAgICBmb3IgY2xhc3NkaXIgaW4gY2xhc3NkaXJzOgorICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihjbGFzc2RpciwgY2xhc3NmaWxlKQorICAgICAgICAgICAgICAgICAgICBpZiBmdWxscGF0aCAhPSBtYWluZmlsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFyZ3MuZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCcgICVzJyAlIGZ1bGxwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnICAlcycgJSBzZWxmLmdldF9sYXllcl9uYW1lKG9zLnBhdGguZGlybmFtZShjbGFzc2RpcikpKQorCisgICAgICAgIGlmIG92ZXJsYXllZF9jbGFzc19mb3VuZDoKKyAgICAgICAgICAgIGl0ZW1zX2xpc3RlZCA9IFRydWU7CisKKyAgICAgICAgaWYgbm90IGl0ZW1zX2xpc3RlZDoKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbignTm8gb3ZlcmxheWVkIGZpbGVzIGZvdW5kLicpCisKKworICAgIGRlZiBkb19zaG93X3JlY2lwZXMoc2VsZiwgYXJncyk6CisgICAgICAgICIiImxpc3QgYXZhaWxhYmxlIHJlY2lwZXMsIHNob3dpbmcgdGhlIGxheWVyIHRoZXkgYXJlIHByb3ZpZGVkIGJ5CisKK0xpc3RzIHRoZSBuYW1lcyBvZiByZWNpcGVzIGFuZCB0aGUgYXZhaWxhYmxlIHZlcnNpb25zIGluIGVhY2gKK2xheWVyLCB3aXRoIHRoZSBwcmVmZXJyZWQgdmVyc2lvbiBmaXJzdC4gT3B0aW9uYWxseSB5b3UgbWF5IHNwZWNpZnkKK3Buc3BlYyB0byBtYXRjaCBhIHNwZWNpZmllZCByZWNpcGUgbmFtZSAoc3VwcG9ydHMgd2lsZGNhcmRzKS4gTm90ZSB0aGF0Citza2lwcGVkIHJlY2lwZXMgd2lsbCBhbHNvIGJlIGxpc3RlZCwgd2l0aCBhICIgKHNraXBwZWQpIiBzdWZmaXguCisiIiIKKyAgICAgICAgc2VsZi5pbml0X2JiaGFuZGxlcigpCisKKyAgICAgICAgaW5oZXJpdGxpc3QgPSBhcmdzLmluaGVyaXRzLnNwbGl0KCcsJykgaWYgYXJncy5pbmhlcml0cyBlbHNlIFtdCisgICAgICAgIGlmIGluaGVyaXRsaXN0IG9yIGFyZ3MucG5zcGVjIG9yIGFyZ3MubXVsdGlwbGU6CisgICAgICAgICAgICB0aXRsZSA9ICdNYXRjaGluZyByZWNpcGVzOicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRpdGxlID0gJ0F2YWlsYWJsZSByZWNpcGVzOicKKyAgICAgICAgc2VsZi5saXN0X3JlY2lwZXModGl0bGUsIGFyZ3MucG5zcGVjLCBGYWxzZSwgRmFsc2UsIGFyZ3MuZmlsZW5hbWVzLCBhcmdzLm11bHRpcGxlLCBpbmhlcml0bGlzdCkKKworCisgICAgZGVmIGxpc3RfcmVjaXBlcyhzZWxmLCB0aXRsZSwgcG5zcGVjLCBzaG93X292ZXJsYXllZF9vbmx5LCBzaG93X3NhbWVfdmVyX29ubHksIHNob3dfZmlsZW5hbWVzLCBzaG93X211bHRpX3Byb3ZpZGVyX29ubHksIGluaGVyaXRzKToKKyAgICAgICAgaWYgaW5oZXJpdHM6CisgICAgICAgICAgICBiYnBhdGggPSBzdHIoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdCQlBBVEgnLCBUcnVlKSkKKyAgICAgICAgICAgIGZvciBjbGFzc25hbWUgaW4gaW5oZXJpdHM6CisgICAgICAgICAgICAgICAgY2xhc3NmaWxlID0gJ2NsYXNzZXMvJXMuYmJjbGFzcycgJSBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICBpZiBub3QgYmIudXRpbHMud2hpY2goYmJwYXRoLCBjbGFzc2ZpbGUsIGhpc3Rvcnk9RmFsc2UpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBVc2VyRXJyb3IoJ05vIGNsYXNzIG5hbWVkICVzIGZvdW5kIGluIEJCUEFUSCcgJSBjbGFzc2ZpbGUpCisKKyAgICAgICAgcGtnX3BuID0gc2VsZi5iYmhhbmRsZXIuY29va2VyLnJlY2lwZWNhY2hlLnBrZ19wbgorICAgICAgICAobGF0ZXN0X3ZlcnNpb25zLCBwcmVmZXJyZWRfdmVyc2lvbnMpID0gYmIucHJvdmlkZXJzLmZpbmRQcm92aWRlcnMoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEsIHNlbGYuYmJoYW5kbGVyLmNvb2tlci5yZWNpcGVjYWNoZSwgcGtnX3BuKQorICAgICAgICBhbGxwcm92aWRlcnMgPSBiYi5wcm92aWRlcnMuYWxsUHJvdmlkZXJzKHNlbGYuYmJoYW5kbGVyLmNvb2tlci5yZWNpcGVjYWNoZSkKKworICAgICAgICAjIEVuc3VyZSB3ZSBsaXN0IHNraXBwZWQgcmVjaXBlcworICAgICAgICAjIFdlIGFyZSBsYXJnZWx5IGd1ZXNzaW5nIGFib3V0IFBOLCBQViBhbmQgdGhlIHByZWZlcnJlZCB2ZXJzaW9uIGhlcmUsCisgICAgICAgICMgYnV0IHdlIGhhdmUgbm8gY2hvaWNlIHNpbmNlIHNraXBwZWQgcmVjaXBlcyBhcmUgbm90IGZ1bGx5IHBhcnNlZAorICAgICAgICBza2lwbGlzdCA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlci5za2lwbGlzdC5rZXlzKCkKKyAgICAgICAgc2tpcGxpc3Quc29ydCgga2V5PWxhbWJkYSBmaWxlaXRlbTogc2VsZi5iYmhhbmRsZXIuY29va2VyLmNvbGxlY3Rpb24uY2FsY19iYmZpbGVfcHJpb3JpdHkoZmlsZWl0ZW0pICkKKyAgICAgICAgc2tpcGxpc3QucmV2ZXJzZSgpCisgICAgICAgIGZvciBmbiBpbiBza2lwbGlzdDoKKyAgICAgICAgICAgIHJlY2lwZV9wYXJ0cyA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmbikpWzBdLnNwbGl0KCdfJykKKyAgICAgICAgICAgIHAgPSByZWNpcGVfcGFydHNbMF0KKyAgICAgICAgICAgIGlmIGxlbihyZWNpcGVfcGFydHMpID4gMToKKyAgICAgICAgICAgICAgICB2ZXIgPSAoTm9uZSwgcmVjaXBlX3BhcnRzWzFdLCBOb25lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2ZXIgPSAoTm9uZSwgJ3Vua25vd24nLCBOb25lKQorICAgICAgICAgICAgYWxscHJvdmlkZXJzW3BdLmFwcGVuZCgodmVyLCBmbikpCisgICAgICAgICAgICBpZiBub3QgcCBpbiBwa2dfcG46CisgICAgICAgICAgICAgICAgcGtnX3BuW3BdID0gJ2R1bW15JworICAgICAgICAgICAgICAgIHByZWZlcnJlZF92ZXJzaW9uc1twXSA9ICh2ZXIsIGZuKQorCisgICAgICAgIGRlZiBwcmludF9pdGVtKGYsIHBuLCB2ZXIsIGxheWVyLCBpc3ByZWYpOgorICAgICAgICAgICAgaWYgZiBpbiBza2lwbGlzdDoKKyAgICAgICAgICAgICAgICBza2lwcGVkID0gJyAoc2tpcHBlZCknCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNraXBwZWQgPSAnJworICAgICAgICAgICAgaWYgc2hvd19maWxlbmFtZXM6CisgICAgICAgICAgICAgICAgaWYgaXNwcmVmOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oIiVzJXMiLCBmLCBza2lwcGVkKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiICAlcyVzIiwgZiwgc2tpcHBlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgaXNwcmVmOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oIiVzOiIsIHBuKQorICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiICAlcyAlcyVzIiwgbGF5ZXIubGp1c3QoMjApLCB2ZXIsIHNraXBwZWQpCisKKyAgICAgICAgZ2xvYmFsX2luaGVyaXQgPSAoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdJTkhFUklUJywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKyAgICAgICAgY2xzX3JlID0gcmUuY29tcGlsZSgnY2xhc3Nlcy8nKQorCisgICAgICAgIHByZWZmaWxlcyA9IFtdCisgICAgICAgIGl0ZW1zX2xpc3RlZCA9IEZhbHNlCisgICAgICAgIGZvciBwIGluIHNvcnRlZChwa2dfcG4pOgorICAgICAgICAgICAgaWYgcG5zcGVjOgorICAgICAgICAgICAgICAgIGlmIG5vdCBmbm1hdGNoLmZubWF0Y2gocCwgcG5zcGVjKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbGVuKGFsbHByb3ZpZGVyc1twXSkgPiAxIG9yIG5vdCBzaG93X211bHRpX3Byb3ZpZGVyX29ubHk6CisgICAgICAgICAgICAgICAgcHJlZiA9IHByZWZlcnJlZF92ZXJzaW9uc1twXQorICAgICAgICAgICAgICAgIHJlYWxmbiA9IGJiLmNhY2hlLkNhY2hlLnZpcnR1YWxmbjJyZWFsZm4ocHJlZlsxXSkKKyAgICAgICAgICAgICAgICBwcmVmZmlsZSA9IHJlYWxmblswXQorCisgICAgICAgICAgICAgICAgIyBXZSBvbmx5IGRpc3BsYXkgb25jZSBwZXIgcmVjaXBlLCB3ZSBzaG91bGQgcHJlZmVyIG5vbiBleHRlbmRlZCB2ZXJzaW9ucyBvZiB0aGUKKyAgICAgICAgICAgICAgICAjIHJlY2lwZSBpZiBwcmVzZW50IChzbyBlLmcuIGluIE9wZW5FbWJlZGRlZCwgb3BlbnNzbCByYXRoZXIgdGhhbiBuYXRpdmVzZGstb3BlbnNzbAorICAgICAgICAgICAgICAgICMgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHNvcnQgZmlyc3QpLgorICAgICAgICAgICAgICAgIGlmIHJlYWxmblsxXSBhbmQgcmVhbGZuWzBdIGluIHNlbGYuYmJoYW5kbGVyLmNvb2tlci5yZWNpcGVjYWNoZS5wa2dfZm46CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBpbmhlcml0czoKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hjb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlX2luaGVyaXRzID0gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEuaW5oZXJpdHMuZ2V0KHByZWZmaWxlLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNscyBpbiByZWNpcGVfaW5oZXJpdHM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbHNfcmUubWF0Y2goY2xzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGNscykpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbGFzc25hbWUgaW4gZ2xvYmFsX2luaGVyaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgY2xhc3NuYW1lIGluIGluaGVyaXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaGNvdW50ICE9IGxlbihpbmhlcml0cyk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1hdGNoIC0gc2tpcCB0aGlzIHJlY2lwZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHByZWZmaWxlIG5vdCBpbiBwcmVmZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIHByZWZsYXllciA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXIocHJlZmZpbGUpCisgICAgICAgICAgICAgICAgICAgIG11bHRpbGF5ZXIgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBzYW1lX3ZlciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcHJvdnMgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgcHJvdiBpbiBhbGxwcm92aWRlcnNbcF06CisgICAgICAgICAgICAgICAgICAgICAgICBwcm92ZmlsZSA9IGJiLmNhY2hlLkNhY2hlLnZpcnR1YWxmbjJyZWFsZm4ocHJvdlsxXSlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZsYXllciA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXIocHJvdmZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm92cy5hcHBlbmQoKHByb3ZmaWxlLCBwcm92bGF5ZXIsIHByb3ZbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvdmxheWVyICE9IHByZWZsYXllcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxheWVyID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvdlswXSAhPSBwcmVmWzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVfdmVyID0gRmFsc2UKKworICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlsYXllciBvciBub3Qgc2hvd19vdmVybGF5ZWRfb25seSkgYW5kIChzYW1lX3ZlciBvciBub3Qgc2hvd19zYW1lX3Zlcl9vbmx5KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpdGVtc19saXN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCc9PT0gJXMgPT09JyAlIHRpdGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zX2xpc3RlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2l0ZW0ocHJlZmZpbGUsIHAsIHNlbGYudmVyc2lvbl9zdHIocHJlZlswXVswXSwgcHJlZlswXVsxXSksIHByZWZsYXllciwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJvdmZpbGUsIHByb3ZsYXllciwgcHJvdnZlcikgaW4gcHJvdnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvdmZpbGUgIT0gcHJlZmZpbGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2l0ZW0ocHJvdmZpbGUsIHAsIHNlbGYudmVyc2lvbl9zdHIocHJvdnZlclswXSwgcHJvdnZlclsxXSksIHByb3ZsYXllciwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAjIEVuc3VyZSB3ZSBkb24ndCBzaG93IHR3byBlbnRyaWVzIGZvciBCQkNMQVNTRVhURU5EZWQgcmVjaXBlcworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmZpbGVzLmFwcGVuZChwcmVmZmlsZSkKKworICAgICAgICByZXR1cm4gaXRlbXNfbGlzdGVkCisKKworICAgIGRlZiBkb19mbGF0dGVuKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJmbGF0dGVuIGxheWVyIGNvbmZpZ3VyYXRpb24gaW50byBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkuCisKK1Rha2VzIHRoZSBzcGVjaWZpZWQgbGF5ZXJzIChvciBhbGwgbGF5ZXJzIGluIHRoZSBjdXJyZW50IGxheWVyCitjb25maWd1cmF0aW9uIGlmIG5vbmUgYXJlIHNwZWNpZmllZCkgYW5kIGJ1aWxkcyBhICJmbGF0dGVuZWQiIGRpcmVjdG9yeQorY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYWxsIGxheWVycywgd2l0aCBhbnkgb3ZlcmxheWVkIHJlY2lwZXMgcmVtb3ZlZAorYW5kIGJiYXBwZW5kcyBhcHBlbmRlZCB0byB0aGUgY29ycmVzcG9uZGluZyByZWNpcGVzLiBOb3RlIHRoYXQgc29tZSBtYW51YWwKK2NsZWFudXAgbWF5IHN0aWxsIGJlIG5lY2Vzc2FyeSBhZnRlcndhcmRzLCBpbiBwYXJ0aWN1bGFyOgorCisqIHdoZXJlIG5vbi1yZWNpcGUgZmlsZXMgKHN1Y2ggYXMgcGF0Y2hlcykgYXJlIG92ZXJ3cml0dGVuICh0aGUgZmxhdHRlbgorICBjb21tYW5kIHdpbGwgc2hvdyBhIHdhcm5pbmcgZm9yIHRoZXNlKQorKiB3aGVyZSBhbnl0aGluZyBiZXlvbmQgdGhlIG5vcm1hbCBsYXllciBzZXR1cCBoYXMgYmVlbiBhZGRlZCB0bworICBsYXllci5jb25mIChvbmx5IHRoZSBsb3dlc3QgcHJpb3JpdHkgbnVtYmVyIGxheWVyJ3MgbGF5ZXIuY29uZiBpcyB1c2VkKQorKiBvdmVycmlkZGVuL2FwcGVuZGVkIGl0ZW1zIGZyb20gYmJhcHBlbmRzIHdpbGwgbmVlZCB0byBiZSB0aWRpZWQgdXAKKyogd2hlbiB0aGUgZmxhdHRlbmVkIGxheWVycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlICh0aGUKKyAgZmxhdHRlbiBjb21tYW5kIHNob3VsZCBzaG93IGEgd2FybmluZyB3aGVuIHRoaXMgd2lsbCBjYXVzZSBhIHByb2JsZW0pCisKK1dhcm5pbmc6IGlmIHlvdSBmbGF0dGVuIHNldmVyYWwgbGF5ZXJzIHdoZXJlIGFub3RoZXIgbGF5ZXIgaXMgaW50ZW5kZWQgdG8KK2JlIHVzZWQgImluYmV0d2VlbiIgdGhlbSAoaW4gbGF5ZXIgcHJpb3JpdHkgb3JkZXIpIHN1Y2ggdGhhdCByZWNpcGVzIC8KK2JiYXBwZW5kcyBpbiB0aGUgbGF5ZXJzIGludGVyYWN0LCBhbmQgdGhlbiBhdHRlbXB0IHRvIHVzZSB0aGUgbmV3IG91dHB1dAorbGF5ZXIgdG9nZXRoZXIgd2l0aCB0aGF0IG90aGVyIGxheWVyLCB5b3UgbWF5IG5vIGxvbmdlciBnZXQgdGhlIHNhbWUKK2J1aWxkIHJlc3VsdHMgKGFzIHRoZSBsYXllciBwcmlvcml0eSBvcmRlciBoYXMgZWZmZWN0aXZlbHkgY2hhbmdlZCkuCisiIiIKKyAgICAgICAgaWYgbGVuKGFyZ3MubGF5ZXIpID09IDE6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0lmIHlvdSBzcGVjaWZ5IGxheWVycyB0byBmbGF0dGVuIHlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3QgdHdvJykKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgb3V0cHV0ZGlyID0gYXJncy5vdXRwdXRkaXIKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3V0cHV0ZGlyKSBhbmQgb3MubGlzdGRpcihvdXRwdXRkaXIpOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdEaXJlY3RvcnkgJXMgZXhpc3RzIGFuZCBpcyBub24tZW1wdHksIHBsZWFzZSBjbGVhciBpdCBvdXQgZmlyc3QnICUgb3V0cHV0ZGlyKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBzZWxmLmluaXRfYmJoYW5kbGVyKCkKKyAgICAgICAgbGF5ZXJzID0gc2VsZi5iYmxheWVycworICAgICAgICBpZiBsZW4oYXJncy5sYXllcikgPiAyOgorICAgICAgICAgICAgbGF5ZXJuYW1lcyA9IGFyZ3MubGF5ZXIKKyAgICAgICAgICAgIGZvdW5kX2xheWVybmFtZXMgPSBbXQorICAgICAgICAgICAgZm91bmRfbGF5ZXJkaXJzID0gW10KKyAgICAgICAgICAgIGZvciBsYXllcmRpciBpbiBsYXllcnM6CisgICAgICAgICAgICAgICAgbGF5ZXJuYW1lID0gc2VsZi5nZXRfbGF5ZXJfbmFtZShsYXllcmRpcikKKyAgICAgICAgICAgICAgICBpZiBsYXllcm5hbWUgaW4gbGF5ZXJuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfbGF5ZXJkaXJzLmFwcGVuZChsYXllcmRpcikKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfbGF5ZXJuYW1lcy5hcHBlbmQobGF5ZXJuYW1lKQorCisgICAgICAgICAgICBmb3IgbGF5ZXJuYW1lIGluIGxheWVybmFtZXM6CisgICAgICAgICAgICAgICAgaWYgbm90IGxheWVybmFtZSBpbiBmb3VuZF9sYXllcm5hbWVzOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBmaW5kIGxheWVyICVzIGluIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgcGxlYXNlIHJ1biAiJXMgc2hvdy1sYXllcnMiIHRvIGxpc3QgY29uZmlndXJlZCBsYXllcnMnICUgKGxheWVybmFtZSwgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGxheWVycyA9IGZvdW5kX2xheWVyZGlycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGF5ZXJuYW1lcyA9IFtdCisKKyAgICAgICAgIyBFbnN1cmUgYSBzcGVjaWZpZWQgcGF0aCBtYXRjaGVzIG91ciBsaXN0IG9mIGxheWVycworICAgICAgICBkZWYgbGF5ZXJfcGF0aF9tYXRjaChwYXRoKToKKyAgICAgICAgICAgIGZvciBsYXllcmRpciBpbiBsYXllcnM6CisgICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKG9zLnBhdGguam9pbihsYXllcmRpciwgJycpKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxheWVyZGlyCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGFwcGxpZWRfYXBwZW5kcyA9IFtdCisgICAgICAgIGZvciBsYXllciBpbiBsYXllcnM6CisgICAgICAgICAgICBvdmVybGF5ZWQgPSBbXQorICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLmNvbGxlY3Rpb24ub3ZlcmxheWVkLml0ZXJrZXlzKCk6CisgICAgICAgICAgICAgICAgZm9yIG9mIGluIHNlbGYuYmJoYW5kbGVyLmNvb2tlci5jb2xsZWN0aW9uLm92ZXJsYXllZFtmXToKKyAgICAgICAgICAgICAgICAgICAgaWYgb2Yuc3RhcnRzd2l0aChsYXllcik6CisgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5ZWQuYXBwZW5kKG9mKQorCisgICAgICAgICAgICBsb2dnZXIucGxhaW4oJ0NvcHlpbmcgZmlsZXMgZnJvbSAlcy4uLicgJSBsYXllciApCisgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhsYXllcik6CisgICAgICAgICAgICAgICAgZm9yIGYxIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBmMWZ1bGwgPSBvcy5zZXAuam9pbihbcm9vdCwgZjFdKQorICAgICAgICAgICAgICAgICAgICBpZiBmMWZ1bGwgaW4gb3ZlcmxheWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCcgIFNraXBwaW5nIG92ZXJsYXllZCBmaWxlICVzJyAlIGYxZnVsbCApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGYxKVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0ICE9ICcuYmJhcHBlbmQnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkZXN0ID0gZjFmdWxsW2xlbihsYXllcik6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkZXN0ID0gb3MucGF0aC5ub3JtcGF0aChvcy5zZXAuam9pbihbb3V0cHV0ZGlyLGZkZXN0XSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShmZGVzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmRlc3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmMSA9PSAnbGF5ZXIuY29uZicgYW5kIHJvb3QuZW5kc3dpdGgoJy9jb25mJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyAgU2tpcHBpbmcgbGF5ZXIgY29uZmlnIGZpbGUgJXMnICUgZjFmdWxsICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignT3ZlcndyaXRpbmcgZmlsZSAlcycsIGZkZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLnV0aWxzLmNvcHlmaWxlKGYxZnVsbCwgZmRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0ID09ICcuYmInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXBwZW5kIGluIHNlbGYuYmJoYW5kbGVyLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZjFmdWxsKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxheWVyX3BhdGhfbWF0Y2goYXBwZW5kKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyAgQXBwbHlpbmcgYXBwZW5kICVzIHRvICVzJyAlIChhcHBlbmQsIGZkZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5X2FwcGVuZChhcHBlbmQsIGZkZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWRfYXBwZW5kcy5hcHBlbmQoYXBwZW5kKQorCisgICAgICAgICMgVGFrZSBjYXJlIG9mIHdoZW4gc29tZSBsYXllcnMgYXJlIGV4Y2x1ZGVkIGFuZCB5ZXQgd2UgaGF2ZSBpbmNsdWRlZCBiYmFwcGVuZHMgZm9yIHRob3NlIHJlY2lwZXMKKyAgICAgICAgZm9yIGIgaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLmNvbGxlY3Rpb24uYmJhcHBlbmRzOgorICAgICAgICAgICAgKHJlY2lwZW5hbWUsIGFwcGVuZG5hbWUpID0gYgorICAgICAgICAgICAgaWYgYXBwZW5kbmFtZSBub3QgaW4gYXBwbGllZF9hcHBlbmRzOgorICAgICAgICAgICAgICAgIGZpcnN0X2FwcGVuZCA9IE5vbmUKKyAgICAgICAgICAgICAgICBsYXllciA9IGxheWVyX3BhdGhfbWF0Y2goYXBwZW5kbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBsYXllcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfYXBwZW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hcHBseV9hcHBlbmQoYXBwZW5kbmFtZSwgZmlyc3RfYXBwZW5kKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmRlc3QgPSBhcHBlbmRuYW1lW2xlbihsYXllcik6XQorICAgICAgICAgICAgICAgICAgICAgICAgZmRlc3QgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnNlcC5qb2luKFtvdXRwdXRkaXIsZmRlc3RdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoZmRlc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgYmIudXRpbHMuY29weWZpbGUoYXBwZW5kbmFtZSwgZmRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9hcHBlbmQgPSBmZGVzdAorCisgICAgICAgICMgR2V0IHRoZSByZWdleCBmb3IgdGhlIGZpcnN0IGxheWVyIGluIG91ciBsaXN0ICh3aGljaCBpcyB3aGVyZSB0aGUgY29uZi9sYXllci5jb25mIGZpbGUgd2lsbAorICAgICAgICAjIGhhdmUgY29tZSBmcm9tKQorICAgICAgICBmaXJzdF9yZWdleCA9IE5vbmUKKyAgICAgICAgbGF5ZXJkaXIgPSBsYXllcnNbMF0KKyAgICAgICAgZm9yIGxheWVybmFtZSwgcGF0dGVybiwgcmVnZXgsIF8gaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyLnJlY2lwZWNhY2hlLmJiZmlsZV9jb25maWdfcHJpb3JpdGllczoKKyAgICAgICAgICAgIGlmIHJlZ2V4Lm1hdGNoKG9zLnBhdGguam9pbihsYXllcmRpciwgJ3Rlc3QnKSk6CisgICAgICAgICAgICAgICAgZmlyc3RfcmVnZXggPSByZWdleAorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgZmlyc3RfcmVnZXg6CisgICAgICAgICAgICAjIEZpbmQgdGhlIEJCRklMRVMgZW50cmllcyB0aGF0IG1hdGNoICh3aGljaCB3aWxsIGhhdmUgY29tZSBmcm9tIHRoaXMgY29uZi9sYXllci5jb25mIGZpbGUpCisgICAgICAgICAgICBiYmZpbGVzID0gc3RyKHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLmdldFZhcignQkJGSUxFUycsIFRydWUpKS5zcGxpdCgpCisgICAgICAgICAgICBiYmZpbGVzX2xheWVyID0gW10KKyAgICAgICAgICAgIGZvciBpdGVtIGluIGJiZmlsZXM6CisgICAgICAgICAgICAgICAgaWYgZmlyc3RfcmVnZXgubWF0Y2goaXRlbSk6CisgICAgICAgICAgICAgICAgICAgIG5ld3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLCBpdGVtW2xlbihsYXllcmRpcikrMTpdKQorICAgICAgICAgICAgICAgICAgICBiYmZpbGVzX2xheWVyLmFwcGVuZChuZXdwYXRoKQorCisgICAgICAgICAgICBpZiBiYmZpbGVzX2xheWVyOgorICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCBhbGwgaW1wb3J0YW50IGxheWVyIGZpbGVzIG1hdGNoIEJCRklMRVMKKyAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhvdXRwdXRkaXIpOgorICAgICAgICAgICAgICAgICAgICBmb3IgZjEgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGYxKVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0IGluIFsnLmJiJywgJy5iYmFwcGVuZCddOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYxZnVsbCA9IG9zLnNlcC5qb2luKFtyb290LCBmMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfZm91bmQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIGJiZmlsZXNfbGF5ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaChmMWZ1bGwsIGl0ZW0pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlbnRyeV9mb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkZpbGUgJXMgZG9lcyBub3QgbWF0Y2ggdGhlIGZsYXR0ZW5lZCBsYXllcidzIEJCRklMRVMgc2V0dGluZywgeW91IG1heSBuZWVkIHRvIGVkaXQgY29uZi9sYXllci5jb25mIG9yIG1vdmUgdGhlIGZpbGUgZWxzZXdoZXJlIiAlIGYxZnVsbCkKKworICAgIGRlZiBnZXRfZmlsZV9sYXllcihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGxheWVyZGlyID0gc2VsZi5nZXRfZmlsZV9sYXllcmRpcihmaWxlbmFtZSkKKyAgICAgICAgaWYgbGF5ZXJkaXI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfbGF5ZXJfbmFtZShsYXllcmRpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnPycKKworICAgIGRlZiBnZXRfZmlsZV9sYXllcmRpcihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGxheWVyID0gYmIudXRpbHMuZ2V0X2ZpbGVfbGF5ZXIoZmlsZW5hbWUsIHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhKQorICAgICAgICByZXR1cm4gc2VsZi5iYmZpbGVfY29sbGVjdGlvbnMuZ2V0KGxheWVyLCBOb25lKQorCisgICAgZGVmIHJlbW92ZV9sYXllcl9wcmVmaXgoc2VsZiwgZik6CisgICAgICAgICIiIlJlbW92ZSB0aGUgbGF5ZXJfZGlyIHByZWZpeCwgZS5nLiwgZiA9IC9wYXRoL3RvL2xheWVyX2Rpci9mb28vYmxhaCwgdGhlCisgICAgICAgICAgIHJldHVybiB2YWx1ZSB3aWxsIGJlOiBsYXllcl9kaXIvZm9vL2JsYWgiIiIKKyAgICAgICAgZl9sYXllcmRpciA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXJkaXIoZikKKyAgICAgICAgaWYgbm90IGZfbGF5ZXJkaXI6CisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGZfbGF5ZXJkaXIpLCAnJykKKyAgICAgICAgcmV0dXJuIGZbbGVuKHByZWZpeCk6XSBpZiBmLnN0YXJ0c3dpdGgocHJlZml4KSBlbHNlIGYKKworICAgIGRlZiBnZXRfbGF5ZXJfbmFtZShzZWxmLCBsYXllcmRpcik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKGxheWVyZGlyLnJzdHJpcChvcy5zZXApKQorCisgICAgZGVmIGFwcGx5X2FwcGVuZChzZWxmLCBhcHBlbmRuYW1lLCByZWNpcGVuYW1lKToKKyAgICAgICAgd2l0aCBvcGVuKGFwcGVuZG5hbWUsICdyJykgYXMgYXBwZW5kZmlsZToKKyAgICAgICAgICAgIHdpdGggb3BlbihyZWNpcGVuYW1lLCAnYScpIGFzIHJlY2lwZWZpbGU6CisgICAgICAgICAgICAgICAgcmVjaXBlZmlsZS53cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgIHJlY2lwZWZpbGUud3JpdGUoJyMjIyMjIGJiYXBwZW5kZWQgZnJvbSAlcyAjIyMjI1xuJyAlIHNlbGYuZ2V0X2ZpbGVfbGF5ZXIoYXBwZW5kbmFtZSkpCisgICAgICAgICAgICAgICAgcmVjaXBlZmlsZS53cml0ZWxpbmVzKGFwcGVuZGZpbGUucmVhZGxpbmVzKCkpCisKKyAgICBkZWYgZG9fc2hvd19hcHBlbmRzKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJsaXN0IGJiYXBwZW5kIGZpbGVzIGFuZCByZWNpcGUgZmlsZXMgdGhleSBhcHBseSB0bworCitMaXN0cyByZWNpcGVzIHdpdGggdGhlIGJiYXBwZW5kcyB0aGF0IGFwcGx5IHRvIHRoZW0gYXMgc3ViaXRlbXMuCisiIiIKKyAgICAgICAgc2VsZi5pbml0X2JiaGFuZGxlcigpCisKKyAgICAgICAgbG9nZ2VyLnBsYWluKCc9PT0gQXBwZW5kZWQgcmVjaXBlcyA9PT0nKQorCisgICAgICAgIHBubGlzdCA9IGxpc3Qoc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucGtnX3BuLmtleXMoKSkKKyAgICAgICAgcG5saXN0LnNvcnQoKQorICAgICAgICBhcHBlbmRzID0gRmFsc2UKKyAgICAgICAgZm9yIHBuIGluIHBubGlzdDoKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvd19hcHBlbmRzX2Zvcl9wbihwbik6CisgICAgICAgICAgICAgICAgYXBwZW5kcyA9IFRydWUKKworICAgICAgICBpZiBzZWxmLnNob3dfYXBwZW5kc19mb3Jfc2tpcHBlZCgpOgorICAgICAgICAgICAgYXBwZW5kcyA9IFRydWUKKworICAgICAgICBpZiBub3QgYXBwZW5kczoKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbignTm8gYXBwZW5kIGZpbGVzIGZvdW5kJykKKworICAgIGRlZiBzaG93X2FwcGVuZHNfZm9yX3BuKHNlbGYsIHBuKToKKyAgICAgICAgZmlsZW5hbWVzID0gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucGtnX3BuW3BuXQorCisgICAgICAgIGJlc3QgPSBiYi5wcm92aWRlcnMuZmluZEJlc3RQcm92aWRlcihwbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5wa2dfcG4pCisgICAgICAgIGJlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGJlc3RbM10pCisKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hvd19hcHBlbmRzX291dHB1dChmaWxlbmFtZXMsIGJlc3RfZmlsZW5hbWUpCisKKyAgICBkZWYgc2hvd19hcHBlbmRzX2Zvcl9za2lwcGVkKHNlbGYpOgorICAgICAgICBmaWxlbmFtZXMgPSBbb3MucGF0aC5iYXNlbmFtZShmKQorICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXIuc2tpcGxpc3QuaXRlcmtleXMoKV0KKyAgICAgICAgcmV0dXJuIHNlbGYuc2hvd19hcHBlbmRzX291dHB1dChmaWxlbmFtZXMsIE5vbmUsICIgKHNraXBwZWQpIikKKworICAgIGRlZiBzaG93X2FwcGVuZHNfb3V0cHV0KHNlbGYsIGZpbGVuYW1lcywgYmVzdF9maWxlbmFtZSwgbmFtZV9zdWZmaXggPSAnJyk6CisgICAgICAgIGFwcGVuZGVkLCBtaXNzaW5nID0gc2VsZi5nZXRfYXBwZW5kc19mb3JfZmlsZXMoZmlsZW5hbWVzKQorICAgICAgICBpZiBhcHBlbmRlZDoKKyAgICAgICAgICAgIGZvciBiYXNlbmFtZSwgYXBwZW5kcyBpbiBhcHBlbmRlZDoKKyAgICAgICAgICAgICAgICBsb2dnZXIucGxhaW4oJyVzJXM6JywgYmFzZW5hbWUsIG5hbWVfc3VmZml4KQorICAgICAgICAgICAgICAgIGZvciBhcHBlbmQgaW4gYXBwZW5kczoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCcgICVzJywgYXBwZW5kKQorCisgICAgICAgICAgICBpZiBiZXN0X2ZpbGVuYW1lOgorICAgICAgICAgICAgICAgIGlmIGJlc3RfZmlsZW5hbWUgaW4gbWlzc2luZzoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJyVzOiBtaXNzaW5nIGFwcGVuZCBmb3IgcHJlZmVycmVkIHZlcnNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2ZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdldF9hcHBlbmRzX2Zvcl9maWxlcyhzZWxmLCBmaWxlbmFtZXMpOgorICAgICAgICBhcHBlbmRlZCwgbm90YXBwZW5kZWQgPSBbXSwgW10KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIF8sIGNscyA9IGJiLmNhY2hlLkNhY2hlLnZpcnR1YWxmbjJyZWFsZm4oZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBjbHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICAgICAgYXBwZW5kcyA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoYmFzZW5hbWUpCisgICAgICAgICAgICBpZiBhcHBlbmRzOgorICAgICAgICAgICAgICAgIGFwcGVuZGVkLmFwcGVuZCgoYmFzZW5hbWUsIGxpc3QoYXBwZW5kcykpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub3RhcHBlbmRlZC5hcHBlbmQoYmFzZW5hbWUpCisgICAgICAgIHJldHVybiBhcHBlbmRlZCwgbm90YXBwZW5kZWQKKworICAgIGRlZiBkb19zaG93X2Nyb3NzX2RlcGVuZHMoc2VsZiwgYXJncyk6CisgICAgICAgICIiIlNob3cgZGVwZW5kZW5jaWVzIGJldHdlZW4gcmVjaXBlcyB0aGF0IGNyb3NzIGxheWVyIGJvdW5kYXJpZXMuCisKK0ZpZ3VyZSBvdXQgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHJlY2lwZXMgdGhhdCBjcm9zcyBsYXllciBib3VuZGFyaWVzLgorCitOT1RFOiAuYmJhcHBlbmQgZmlsZXMgY2FuIGltcGFjdCB0aGUgZGVwZW5kZW5jaWVzLgorIiIiCisgICAgICAgIGlnbm9yZV9sYXllcnMgPSAoYXJncy5pZ25vcmUgb3IgJycpLnNwbGl0KCcsJykKKworICAgICAgICBzZWxmLmluaXRfYmJoYW5kbGVyKCkKKworICAgICAgICBwa2dfZm4gPSBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5wa2dfZm4KKyAgICAgICAgYmJwYXRoID0gc3RyKHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLmdldFZhcignQkJQQVRIJywgVHJ1ZSkpCisgICAgICAgIHNlbGYucmVxdWlyZV9yZSA9IHJlLmNvbXBpbGUociJyZXF1aXJlXHMrKC4rKSIpCisgICAgICAgIHNlbGYuaW5jbHVkZV9yZSA9IHJlLmNvbXBpbGUociJpbmNsdWRlXHMrKC4rKSIpCisgICAgICAgIHNlbGYuaW5oZXJpdF9yZSA9IHJlLmNvbXBpbGUociJpbmhlcml0XHMrKC4rKSIpCisKKyAgICAgICAgZ2xvYmFsX2luaGVyaXQgPSAoc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEuZ2V0VmFyKCdJTkhFUklUJywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKworICAgICAgICAjIFRoZSBiYidzIERFUEVORFMgYW5kIFJERVBFTkRTCisgICAgICAgIGZvciBmIGluIHBrZ19mbjoKKyAgICAgICAgICAgIGYgPSBiYi5jYWNoZS5DYWNoZS52aXJ0dWFsZm4ycmVhbGZuKGYpWzBdCisgICAgICAgICAgICAjIEdldCB0aGUgbGF5ZXJuYW1lIHRoYXQgdGhlIGZpbGUgaXMgaW4KKyAgICAgICAgICAgIGxheWVybmFtZSA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXIoZikKKworICAgICAgICAgICAgIyBUaGUgREVQRU5EUworICAgICAgICAgICAgZGVwcyA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLmRlcHNbZl0KKyAgICAgICAgICAgIGZvciBwbiBpbiBkZXBzOgorICAgICAgICAgICAgICAgIGlmIHBuIGluIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLnBrZ19wbjoKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGJiLnByb3ZpZGVycy5maW5kQmVzdFByb3ZpZGVyKHBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvbmZpZ19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLnBrZ19wbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19jcm9zc19kZXBlbmRzKCJERVBFTkRTIiwgbGF5ZXJuYW1lLCBmLCBiZXN0WzNdLCBhcmdzLmZpbGVuYW1lcywgaWdub3JlX2xheWVycykKKworICAgICAgICAgICAgIyBUaGUgUkRQRU5EUworICAgICAgICAgICAgYWxsX3JkZXBzID0gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucnVuZGVwc1tmXS52YWx1ZXMoKQorICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGR1cGxpY2F0ZWQgb3IgbnVsbCBvbmUuCisgICAgICAgICAgICBzb3J0ZWRfcmRlcHMgPSB7fQorICAgICAgICAgICAgIyBUaGUgYWxsX3JkZXBzIGlzIHRoZSBsaXN0IGluIGxpc3QsIHNvIHdlIG5lZWQgdHdvIGZvciBsb29wcworICAgICAgICAgICAgZm9yIGsxIGluIGFsbF9yZGVwczoKKyAgICAgICAgICAgICAgICBmb3IgazIgaW4gazE6CisgICAgICAgICAgICAgICAgICAgIHNvcnRlZF9yZGVwc1trMl0gPSAxCisgICAgICAgICAgICBhbGxfcmRlcHMgPSBzb3J0ZWRfcmRlcHMua2V5cygpCisgICAgICAgICAgICBmb3IgcmRlcCBpbiBhbGxfcmRlcHM6CisgICAgICAgICAgICAgICAgYWxsX3AgPSBiYi5wcm92aWRlcnMuZ2V0UnVudGltZVByb3ZpZGVycyhzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YSwgcmRlcCkKKyAgICAgICAgICAgICAgICBpZiBhbGxfcDoKKyAgICAgICAgICAgICAgICAgICAgaWYgZiBpbiBhbGxfcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHJlY2lwZSBwcm92aWRlcyB0aGlzIG9uZSBpdHNlbGYsIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGJiLnByb3ZpZGVycy5maWx0ZXJQcm92aWRlcnNSdW5UaW1lKGFsbF9wLCByZGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iYmhhbmRsZXIuY29uZmlnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YSlbMF1bMF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19jcm9zc19kZXBlbmRzKCJSREVQRU5EUyIsIGxheWVybmFtZSwgZiwgYmVzdCwgYXJncy5maWxlbmFtZXMsIGlnbm9yZV9sYXllcnMpCisKKyAgICAgICAgICAgICMgVGhlIFJSRUNPTU1FTkRTCisgICAgICAgICAgICBhbGxfcnJlY3MgPSBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5ydW5yZWNzW2ZdLnZhbHVlcygpCisgICAgICAgICAgICAjIFJlbW92ZSB0aGUgZHVwbGljYXRlZCBvciBudWxsIG9uZS4KKyAgICAgICAgICAgIHNvcnRlZF9ycmVjcyA9IHt9CisgICAgICAgICAgICAjIFRoZSBhbGxfcnJlY3MgaXMgdGhlIGxpc3QgaW4gbGlzdCwgc28gd2UgbmVlZCB0d28gZm9yIGxvb3BzCisgICAgICAgICAgICBmb3IgazEgaW4gYWxsX3JyZWNzOgorICAgICAgICAgICAgICAgIGZvciBrMiBpbiBrMToKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkX3JyZWNzW2syXSA9IDEKKyAgICAgICAgICAgIGFsbF9ycmVjcyA9IHNvcnRlZF9ycmVjcy5rZXlzKCkKKyAgICAgICAgICAgIGZvciBycmVjIGluIGFsbF9ycmVjczoKKyAgICAgICAgICAgICAgICBhbGxfcCA9IGJiLnByb3ZpZGVycy5nZXRSdW50aW1lUHJvdmlkZXJzKHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLCBycmVjKQorICAgICAgICAgICAgICAgIGlmIGFsbF9wOgorICAgICAgICAgICAgICAgICAgICBpZiBmIGluIGFsbF9wOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcmVjaXBlIHByb3ZpZGVzIHRoaXMgb25lIGl0c2VsZiwgaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBiZXN0ID0gYmIucHJvdmlkZXJzLmZpbHRlclByb3ZpZGVyc1J1blRpbWUoYWxsX3AsIHJyZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJiaGFuZGxlci5jb25maWdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhKVswXVswXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2Nyb3NzX2RlcGVuZHMoIlJSRUNPTU1FTkRTIiwgbGF5ZXJuYW1lLCBmLCBiZXN0LCBhcmdzLmZpbGVuYW1lcywgaWdub3JlX2xheWVycykKKworICAgICAgICAgICAgIyBUaGUgaW5oZXJpdCBjbGFzcworICAgICAgICAgICAgY2xzX3JlID0gcmUuY29tcGlsZSgnY2xhc3Nlcy8nKQorICAgICAgICAgICAgaWYgZiBpbiBzZWxmLmJiaGFuZGxlci5jb29rZXJfZGF0YS5pbmhlcml0czoKKyAgICAgICAgICAgICAgICBpbmhlcml0cyA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLmluaGVyaXRzW2ZdCisgICAgICAgICAgICAgICAgZm9yIGNscyBpbiBpbmhlcml0czoKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgaW5oZXJpdHMnIGZvcm1hdCBpcyBbY2xhc3Nlcy9jbHMsIC9wYXRoL3RvL2NsYXNzZXMvY2xzXQorICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSB0aGUgY2xhc3Nlcy9jbHMuCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjbHNfcmUubWF0Y2goY2xzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShjbHMpKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2xhc3NuYW1lIGluIGdsb2JhbF9pbmhlcml0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0X2xheWVybmFtZSA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXIoY2xzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5oZXJpdF9sYXllcm5hbWUgIT0gbGF5ZXJuYW1lIGFuZCBub3QgaW5oZXJpdF9sYXllcm5hbWUgaW4gaWdub3JlX2xheWVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgYXJncy5maWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfc2hvcnQgPSBzZWxmLnJlbW92ZV9sYXllcl9wcmVmaXgoZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gc2VsZi5yZW1vdmVfbGF5ZXJfcHJlZml4KGNscykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX3Nob3J0ID0gZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgaW5oZXJpdHMgJXMiICUgKGZfc2hvcnQsIGNscykpCisKKyAgICAgICAgICAgICMgVGhlICdyZXF1aXJlL2luY2x1ZGUgeHh4JyBpbiB0aGUgYmIgZmlsZQorICAgICAgICAgICAgcHZfcmUgPSByZS5jb21waWxlKHIiXCR7UFZ9IikKKyAgICAgICAgICAgIHdpdGggb3BlbihmLCAncicpIGFzIGZuZmlsZToKKyAgICAgICAgICAgICAgICBsaW5lID0gZm5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICB3aGlsZSBsaW5lOgorICAgICAgICAgICAgICAgICAgICBtLCBrZXl3b3JkID0gc2VsZi5tYXRjaF9yZXF1aXJlX2luY2x1ZGUobGluZSkKKyAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCB0aGUgJ3JlcXVpcmUvaW5jbHVkZSB4eHh4JworICAgICAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkX2ZpbGUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlICR7UFZ9IHdpdGggdGhlIHJlYWwgUFYKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHB2X3JlLnNlYXJjaChuZWVkZWRfZmlsZSkgYW5kIGYgaW4gc2VsZi5iYmhhbmRsZXIuY29va2VyX2RhdGEucGtnX3BlcHZwcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHNlbGYuYmJoYW5kbGVyLmNvb2tlcl9kYXRhLnBrZ19wZXB2cHJbZl1bMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWRfZmlsZSA9IHJlLnN1YihyIlwke1BWfSIsIHB2LCBuZWVkZWRfZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY3Jvc3NfZmlsZXMoYmJwYXRoLCBrZXl3b3JkLCBsYXllcm5hbWUsIGYsIG5lZWRlZF9maWxlLCBhcmdzLmZpbGVuYW1lcywgaWdub3JlX2xheWVycykKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGZuZmlsZS5yZWFkbGluZSgpCisKKyAgICAgICAgIyBUaGUgInJlcXVpcmUvaW5jbHVkZSB4eHgiIGluIGNvbmYvbWFjaGluZS8qLmNvbmYsIC5pbmMgYW5kIC5iYmNsYXNzCisgICAgICAgIGNvbmZfcmUgPSByZS5jb21waWxlKCIuKi9jb25mL21hY2hpbmUvW15cL10qXC5jb25mJCIpCisgICAgICAgIGluY19yZSA9IHJlLmNvbXBpbGUoIi4qXC5pbmMkIikKKyAgICAgICAgIyBUaGUgImluaGVyaXQgeHh4IiBpbiAuYmJjbGFzcworICAgICAgICBiYmNsYXNzX3JlID0gcmUuY29tcGlsZSgiLipcLmJiY2xhc3MkIikKKyAgICAgICAgZm9yIGxheWVyZGlyIGluIHNlbGYuYmJsYXllcnM6CisgICAgICAgICAgICBsYXllcm5hbWUgPSBzZWxmLmdldF9sYXllcl9uYW1lKGxheWVyZGlyKQorICAgICAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhsYXllcmRpcik6CisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHMgPSBjb25mX3JlLm1hdGNoKGYpIG9yIGluY19yZS5tYXRjaChmKSBvciBiYmNsYXNzX3JlLm1hdGNoKGYpCisgICAgICAgICAgICAgICAgICAgIGlmIHM6CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZiwgJ3InKSBhcyBmZmlsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gZmZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGxpbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIGtleXdvcmQgPSBzZWxmLm1hdGNoX3JlcXVpcmVfaW5jbHVkZShsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgYmJjbGFzcyBoYXMgdGhlICJpbmhlcml0IHh4eCIgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmJjbGFzcz0iIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbSBhbmQgZi5lbmRzd2l0aCgiLmJiY2xhc3MiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIGtleXdvcmQgPSBzZWxmLm1hdGNoX2luaGVyaXQobGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiY2xhc3M9Ii5iYmNsYXNzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZpbmQgYSAncmVxdWlyZS9pbmNsdWRlIHh4eHgnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2Nyb3NzX2ZpbGVzKGJicGF0aCwga2V5d29yZCwgbGF5ZXJuYW1lLCBmLCBtLmdyb3VwKDEpICsgYmJjbGFzcywgYXJncy5maWxlbmFtZXMsIGlnbm9yZV9sYXllcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmZmlsZS5yZWFkbGluZSgpCisKKyAgICBkZWYgcHJpbnRfY3Jvc3NfZmlsZXMoc2VsZiwgYmJwYXRoLCBrZXl3b3JkLCBsYXllcm5hbWUsIGYsIG5lZWRlZF9maWxlbmFtZSwgc2hvd19maWxlbmFtZXMsIGlnbm9yZV9sYXllcnMpOgorICAgICAgICAiIiJQcmludCB0aGUgZGVwZW5kcyB0aGF0IGNyb3NzZXMgYSBsYXllciBib3VuZGFyeSIiIgorICAgICAgICBuZWVkZWRfZmlsZSA9IGJiLnV0aWxzLndoaWNoKGJicGF0aCwgbmVlZGVkX2ZpbGVuYW1lKQorICAgICAgICBpZiBuZWVkZWRfZmlsZToKKyAgICAgICAgICAgICMgV2hpY2ggbGF5ZXIgaXMgdGhpcyBmaWxlIGZyb20KKyAgICAgICAgICAgIG5lZWRlZF9sYXllcm5hbWUgPSBzZWxmLmdldF9maWxlX2xheWVyKG5lZWRlZF9maWxlKQorICAgICAgICAgICAgaWYgbmVlZGVkX2xheWVybmFtZSAhPSBsYXllcm5hbWUgYW5kIG5vdCBuZWVkZWRfbGF5ZXJuYW1lIGluIGlnbm9yZV9sYXllcnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNob3dfZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgICAgICBmID0gc2VsZi5yZW1vdmVfbGF5ZXJfcHJlZml4KGYpCisgICAgICAgICAgICAgICAgICAgIG5lZWRlZF9maWxlID0gc2VsZi5yZW1vdmVfbGF5ZXJfcHJlZml4KG5lZWRlZF9maWxlKQorICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJXMgJXMgJXMiICUoZiwga2V5d29yZCwgbmVlZGVkX2ZpbGUpKQorCisgICAgZGVmIG1hdGNoX2luaGVyaXQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIk1hdGNoIHRoZSBpbmhlcml0IHh4eCBsaW5lIiIiCisgICAgICAgIHJldHVybiAoc2VsZi5pbmhlcml0X3JlLm1hdGNoKGxpbmUpLCAiaW5oZXJpdHMiKQorCisgICAgZGVmIG1hdGNoX3JlcXVpcmVfaW5jbHVkZShzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiTWF0Y2ggdGhlIHJlcXVpcmUvaW5jbHVkZSB4eHggbGluZSIiIgorICAgICAgICBtID0gc2VsZi5yZXF1aXJlX3JlLm1hdGNoKGxpbmUpCisgICAgICAgIGtleXdvcmQgPSAicmVxdWlyZXMiCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgbSA9IHNlbGYuaW5jbHVkZV9yZS5tYXRjaChsaW5lKQorICAgICAgICAgICAga2V5d29yZCA9ICJpbmNsdWRlcyIKKyAgICAgICAgcmV0dXJuIChtLCBrZXl3b3JkKQorCisgICAgZGVmIGNoZWNrX2Nyb3NzX2RlcGVuZHMoc2VsZiwga2V5d29yZCwgbGF5ZXJuYW1lLCBmLCBuZWVkZWRfZmlsZSwgc2hvd19maWxlbmFtZXMsIGlnbm9yZV9sYXllcnMpOgorICAgICAgICAiIiJQcmludCB0aGUgREVQRU5EUy9SREVQRU5EUyBmaWxlIHRoYXQgY3Jvc3NlcyBhIGxheWVyIGJvdW5kYXJ5IiIiCisgICAgICAgIGJlc3RfcmVhbGZuID0gYmIuY2FjaGUuQ2FjaGUudmlydHVhbGZuMnJlYWxmbihuZWVkZWRfZmlsZSlbMF0KKyAgICAgICAgbmVlZGVkX2xheWVybmFtZSA9IHNlbGYuZ2V0X2ZpbGVfbGF5ZXIoYmVzdF9yZWFsZm4pCisgICAgICAgIGlmIG5lZWRlZF9sYXllcm5hbWUgIT0gbGF5ZXJuYW1lIGFuZCBub3QgbmVlZGVkX2xheWVybmFtZSBpbiBpZ25vcmVfbGF5ZXJzOgorICAgICAgICAgICAgaWYgbm90IHNob3dfZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIGYgPSBzZWxmLnJlbW92ZV9sYXllcl9wcmVmaXgoZikKKyAgICAgICAgICAgICAgICBiZXN0X3JlYWxmbiA9IHNlbGYucmVtb3ZlX2xheWVyX3ByZWZpeChiZXN0X3JlYWxmbikKKworICAgICAgICAgICAgbG9nZ2VyLnBsYWluKCIlcyAlcyAlcyIgJSAoZiwga2V5d29yZCwgYmVzdF9yZWFsZm4pKQorCisKK2RlZiBtYWluKCk6CisKKyAgICBjbWRzID0gQ29tbWFuZHMoKQorCisgICAgZGVmIGFkZF9jb21tYW5kKGNtZG5hbWUsIGZ1bmN0aW9uLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAjIENvbnZlcnQgZG9jc3RyaW5nIGZvciBmdW5jdGlvbiB0byBoZWxwIChvbmUtbGluZXIgc2hvd24gaW4gbWFpbiAtLWhlbHApIGFuZCBkZXNjcmlwdGlvbiAoc2hvd24gaW4gc3ViY29tbWFuZCAtLWhlbHApCisgICAgICAgIGRvY3NwbGl0ID0gZnVuY3Rpb24uX19kb2NfXy5zcGxpdGxpbmVzKCkKKyAgICAgICAgaGVscCA9IGRvY3NwbGl0WzBdCisgICAgICAgIGlmIGxlbihkb2NzcGxpdCkgPiAxOgorICAgICAgICAgICAgZGVzYyA9ICdcbicuam9pbihkb2NzcGxpdFsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXNjID0gaGVscAorICAgICAgICBzdWJwYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoY21kbmFtZSwgKmFyZ3MsIGhlbHA9aGVscCwgZGVzY3JpcHRpb249ZGVzYywgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd1RleHRIZWxwRm9ybWF0dGVyLCAqKmt3YXJncykKKyAgICAgICAgc3VicGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWZ1bmN0aW9uKQorICAgICAgICByZXR1cm4gc3VicGFyc2VyCisKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iQml0QmFrZSBsYXllcnMgdXRpbGl0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBpbG9nPSJVc2UgJShwcm9nKXMgPHN1YmNvbW1hbmQ+IC0taGVscCB0byBnZXQgaGVscCBvbiBhIHNwZWNpZmljIGNvbW1hbmQiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kJywgJy0tZGVidWcnLCBoZWxwPSdFbmFibGUgZGVidWcgb3V0cHV0JywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcScsICctLXF1aWV0JywgaGVscD0nUHJpbnQgb25seSBlcnJvcnMnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnModGl0bGU9J3N1YmNvbW1hbmRzJywgbWV0YXZhcj0nPHN1YmNvbW1hbmQ+JykKKworICAgIHBhcnNlcl9zaG93X2xheWVycyA9IGFkZF9jb21tYW5kKCdzaG93LWxheWVycycsIGNtZHMuZG9fc2hvd19sYXllcnMpCisKKyAgICBwYXJzZXJfYWRkX2xheWVyID0gYWRkX2NvbW1hbmQoJ2FkZC1sYXllcicsIGNtZHMuZG9fYWRkX2xheWVyKQorICAgIHBhcnNlcl9hZGRfbGF5ZXIuYWRkX2FyZ3VtZW50KCdsYXllcmRpcicsIGhlbHA9J0xheWVyIGRpcmVjdG9yeSB0byBhZGQnKQorCisgICAgcGFyc2VyX3JlbW92ZV9sYXllciA9IGFkZF9jb21tYW5kKCdyZW1vdmUtbGF5ZXInLCBjbWRzLmRvX3JlbW92ZV9sYXllcikKKyAgICBwYXJzZXJfcmVtb3ZlX2xheWVyLmFkZF9hcmd1bWVudCgnbGF5ZXJkaXInLCBoZWxwPSdMYXllciBkaXJlY3RvcnkgdG8gcmVtb3ZlICh3aWxkY2FyZHMgYWxsb3dlZCwgZW5jbG9zZSBpbiBxdW90ZXMgdG8gYXZvaWQgc2hlbGwgZXhwYW5zaW9uKScpCisgICAgcGFyc2VyX3JlbW92ZV9sYXllci5zZXRfZGVmYXVsdHMoZnVuYz1jbWRzLmRvX3JlbW92ZV9sYXllcikKKworICAgIHBhcnNlcl9zaG93X292ZXJsYXllZCA9IGFkZF9jb21tYW5kKCdzaG93LW92ZXJsYXllZCcsIGNtZHMuZG9fc2hvd19vdmVybGF5ZWQpCisgICAgcGFyc2VyX3Nob3dfb3ZlcmxheWVkLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1maWxlbmFtZXMnLCBoZWxwPSdpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvcm1hdHRpbmcsIGxpc3QgZmlsZW5hbWVzIG9mIGhpZ2hlciBwcmlvcml0eSByZWNpcGVzIHdpdGggdGhlIG9uZXMgdGhleSBvdmVybGF5IGluZGVudGVkIHVuZGVybmVhdGgnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlcl9zaG93X292ZXJsYXllZC5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2FtZS12ZXJzaW9uJywgaGVscD0nb25seSBsaXN0IG92ZXJsYXllZCByZWNpcGVzIHdoZXJlIHRoZSB2ZXJzaW9uIGlzIHRoZSBzYW1lJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKworICAgIHBhcnNlcl9zaG93X3JlY2lwZXMgPSBhZGRfY29tbWFuZCgnc2hvdy1yZWNpcGVzJywgY21kcy5kb19zaG93X3JlY2lwZXMpCisgICAgcGFyc2VyX3Nob3dfcmVjaXBlcy5hZGRfYXJndW1lbnQoJy1mJywgJy0tZmlsZW5hbWVzJywgaGVscD0naW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3JtYXR0aW5nLCBsaXN0IGZpbGVuYW1lcyBvZiBoaWdoZXIgcHJpb3JpdHkgcmVjaXBlcyB3aXRoIHRoZSBvbmVzIHRoZXkgb3ZlcmxheSBpbmRlbnRlZCB1bmRlcm5lYXRoJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBwYXJzZXJfc2hvd19yZWNpcGVzLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tdWx0aXBsZScsIGhlbHA9J29ubHkgbGlzdCB3aGVyZSBtdWx0aXBsZSByZWNpcGVzIChpbiB0aGUgc2FtZSBsYXllciBvciBkaWZmZXJlbnQgbGF5ZXJzKSBleGlzdCBmb3IgdGhlIHNhbWUgcmVjaXBlIG5hbWUnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlcl9zaG93X3JlY2lwZXMuYWRkX2FyZ3VtZW50KCctaScsICctLWluaGVyaXRzJywgaGVscD0nb25seSBsaXN0IHJlY2lwZXMgdGhhdCBpbmhlcml0IHRoZSBuYW1lZCBjbGFzcycsIG1ldGF2YXI9J0NMQVNTJywgZGVmYXVsdD0nJykKKyAgICBwYXJzZXJfc2hvd19yZWNpcGVzLmFkZF9hcmd1bWVudCgncG5zcGVjJywgbmFyZ3M9Jz8nLCBoZWxwPSdvcHRpb25hbCByZWNpcGUgbmFtZSBzcGVjaWZpY2F0aW9uICh3aWxkY2FyZHMgYWxsb3dlZCwgZW5jbG9zZSBpbiBxdW90ZXMgdG8gYXZvaWQgc2hlbGwgZXhwYW5zaW9uKScpCisKKyAgICBwYXJzZXJfc2hvd19hcHBlbmRzID0gYWRkX2NvbW1hbmQoJ3Nob3ctYXBwZW5kcycsIGNtZHMuZG9fc2hvd19hcHBlbmRzKQorCisgICAgcGFyc2VyX2ZsYXR0ZW4gPSBhZGRfY29tbWFuZCgnZmxhdHRlbicsIGNtZHMuZG9fZmxhdHRlbikKKyAgICBwYXJzZXJfZmxhdHRlbi5hZGRfYXJndW1lbnQoJ2xheWVyJywgbmFyZ3M9JyonLCBoZWxwPSdPcHRpb25hbCBsYXllcihzKSB0byBmbGF0dGVuIChvdGhlcndpc2UgYWxsIGFyZSBmbGF0dGVuZWQpJykKKyAgICBwYXJzZXJfZmxhdHRlbi5hZGRfYXJndW1lbnQoJ291dHB1dGRpcicsIGhlbHA9J091dHB1dCBkaXJlY3RvcnknKQorCisgICAgcGFyc2VyX3Nob3dfY3Jvc3NfZGVwZW5kcyA9IGFkZF9jb21tYW5kKCdzaG93LWNyb3NzLWRlcGVuZHMnLCBjbWRzLmRvX3Nob3dfY3Jvc3NfZGVwZW5kcykKKyAgICBwYXJzZXJfc2hvd19jcm9zc19kZXBlbmRzLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1maWxlbmFtZXMnLCBoZWxwPSdzaG93IGZ1bGwgZmlsZSBwYXRoJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBwYXJzZXJfc2hvd19jcm9zc19kZXBlbmRzLmFkZF9hcmd1bWVudCgnLWknLCAnLS1pZ25vcmUnLCBoZWxwPSdpZ25vcmUgZGVwZW5kZW5jaWVzIG9uIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGF5ZXIocykgKHNwbGl0IG11bHRpcGxlIGxheWVyIG5hbWVzIHdpdGggY29tbWFzLCBubyBzcGFjZXMpJywgbWV0YXZhcj0nTEFZRVJOQU1FJykKKworICAgIHBhcnNlcl9sYXllcmluZGV4X2ZldGNoID0gYWRkX2NvbW1hbmQoJ2xheWVyaW5kZXgtZmV0Y2gnLCBjbWRzLmRvX2xheWVyaW5kZXhfZmV0Y2gpCisgICAgcGFyc2VyX2xheWVyaW5kZXhfZmV0Y2guYWRkX2FyZ3VtZW50KCctbicsICctLXNob3ctb25seScsIGhlbHA9J3Nob3cgZGVwZW5kZW5jaWVzIGFuZCBkbyBub3RoaW5nIGVsc2UnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlcl9sYXllcmluZGV4X2ZldGNoLmFkZF9hcmd1bWVudCgnLWInLCAnLS1icmFuY2gnLCBoZWxwPSdicmFuY2ggbmFtZSB0byBmZXRjaCAoZGVmYXVsdCAlKGRlZmF1bHQpcyknLCBkZWZhdWx0PSdtYXN0ZXInKQorICAgIHBhcnNlcl9sYXllcmluZGV4X2ZldGNoLmFkZF9hcmd1bWVudCgnLWknLCAnLS1pZ25vcmUnLCBoZWxwPSdhc3N1bWUgdGhlIHNwZWNpZmllZCBsYXllcnMgZG8gbm90IG5lZWQgdG8gYmUgZmV0Y2hlZC9hZGRlZCAoc2VwYXJhdGUgbXVsdGlwbGUgbGF5ZXJzIHdpdGggY29tbWFzLCBubyBzcGFjZXMpJywgbWV0YXZhcj0nTEFZRVInKQorICAgIHBhcnNlcl9sYXllcmluZGV4X2ZldGNoLmFkZF9hcmd1bWVudCgnbGF5ZXJuYW1lJywgbmFyZ3M9JysnLCBoZWxwPSdsYXllciB0byBmZXRjaCcpCisKKyAgICBwYXJzZXJfbGF5ZXJpbmRleF9zaG93X2RlcGVuZHMgPSBhZGRfY29tbWFuZCgnbGF5ZXJpbmRleC1zaG93LWRlcGVuZHMnLCBjbWRzLmRvX2xheWVyaW5kZXhfc2hvd19kZXBlbmRzKQorICAgIHBhcnNlcl9sYXllcmluZGV4X3Nob3dfZGVwZW5kcy5hZGRfYXJndW1lbnQoJy1iJywgJy0tYnJhbmNoJywgaGVscD0nYnJhbmNoIG5hbWUgdG8gZmV0Y2ggKGRlZmF1bHQgJShkZWZhdWx0KXMpJywgZGVmYXVsdD0nbWFzdGVyJykKKyAgICBwYXJzZXJfbGF5ZXJpbmRleF9zaG93X2RlcGVuZHMuYWRkX2FyZ3VtZW50KCdsYXllcm5hbWUnLCBuYXJncz0nKycsIGhlbHA9J2xheWVyIHRvIHF1ZXJ5JykKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBhcmdzLmRlYnVnOgorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKKyAgICBlbGlmIGFyZ3MucXVpZXQ6CisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkVSUk9SKQorCisgICAgdHJ5OgorICAgICAgICByZXQgPSBhcmdzLmZ1bmMoYXJncykKKyAgICBleGNlcHQgVXNlckVycm9yIGFzIGVycjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKHN0cihlcnIpKQorICAgICAgICByZXQgPSAxCisKKyAgICByZXR1cm4gcmV0CisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0cnk6CisgICAgICAgIHJldCA9IG1haW4oKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHJldCA9IDEKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKDUpCisgICAgc3lzLmV4aXQocmV0KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vYml0YmFrZS1wcnNlcnYgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLXByc2VydgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOGQ3YWNiCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9iaW4vYml0YmFrZS1wcnNlcnYKQEAgLTAsMCArMSw1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMsbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCisKK3N5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCdsaWInKSkKKworaW1wb3J0IHByc2VydgoraW1wb3J0IHByc2Vydi5zZXJ2CisKK19fdmVyc2lvbl9fPSIxLjAuMCIKKworUFJIT1NUX0RFRkFVTFQ9JzAuMC4wLjAnCitQUlBPUlRfREVGQVVMVD04NTg1CisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKAorICAgICAgICB2ZXJzaW9uPSJCaXRiYWtlIFBSIFNlcnZpY2UgQ29yZSB2ZXJzaW9uICVzLCAlJXByb2cgdmVyc2lvbiAlcyIgJSAocHJzZXJ2Ll9fdmVyc2lvbl9fLCBfX3ZlcnNpb25fXyksCisgICAgICAgIHVzYWdlID0gIiVwcm9nIDwgLS1zdGFydCB8IC0tc3RvcCA+IFtvcHRpb25zXSIpCisKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwgaGVscD0iZGF0YWJhc2UgZmlsZW5hbWUoZGVmYXVsdDogcHJzZXJ2LnNxbGl0ZTMpIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iZGJmaWxlIiwgdHlwZT0ic3RyaW5nIiwgZGVmYXVsdD0icHJzZXJ2LnNxbGl0ZTMiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbCIsICItLWxvZyIsIGhlbHA9ImxvZyBmaWxlbmFtZShkZWZhdWx0OiBwcnNlcnYubG9nKSIsIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImxvZ2ZpbGUiLCB0eXBlPSJzdHJpbmciLCBkZWZhdWx0PSJwcnNlcnYubG9nIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1sb2dsZXZlbCIsIGhlbHA9ImxvZ2dpbmcgbGV2ZWwsIGkuZS4gQ1JJVElDQUwsIEVSUk9SLCBXQVJOSU5HLCBJTkZPLCBERUJVRyIsCisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0ibG9nbGV2ZWwiLCBkZWZhdWx0ID0gIklORk8iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXN0YXJ0IiwgaGVscD0ic3RhcnQgZGFlbW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzdGFydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc3RvcCIsIGhlbHA9InN0b3AgZGFlbW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzdG9wIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1ob3N0IiwgaGVscD0iaXAgYWRkcmVzcyB0byBiaW5kIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iaG9zdCIsIHR5cGU9InN0cmluZyIsIGRlZmF1bHQ9UFJIT1NUX0RFRkFVTFQpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIGhlbHA9InBvcnQgbnVtYmVyKGRlZmF1bHQ6IDg1ODUpIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0icG9ydCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9UFJQT1JUX0RFRkFVTFQpCisKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3Moc3lzLmFyZ3YpCisgICAgcHJzZXJ2LmluaXRfbG9nZ2VyKG9zLnBhdGguYWJzcGF0aChvcHRpb25zLmxvZ2ZpbGUpLG9wdGlvbnMubG9nbGV2ZWwpCisKKyAgICBpZiBvcHRpb25zLnN0YXJ0OgorICAgICAgICByZXQ9cHJzZXJ2LnNlcnYuc3RhcnRfZGFlbW9uKG9wdGlvbnMuZGJmaWxlLCBvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCxvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5sb2dmaWxlKSkKKyAgICBlbGlmIG9wdGlvbnMuc3RvcDoKKyAgICAgICAgcmV0PXByc2Vydi5zZXJ2LnN0b3BfZGFlbW9uKG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgIGVsc2U6CisgICAgICAgIHJldD1wYXJzZXIucHJpbnRfaGVscCgpCisgICAgcmV0dXJuIHJldAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRyeToKKyAgICAgICAgcmV0ID0gbWFpbigpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcmV0ID0gMQorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoNSkKKyAgICBzeXMuZXhpdChyZXQpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvYmluL2JpdGJha2Utc2VsZnRlc3QgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLXNlbGZ0ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ2MmViMWIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLXNlbGZ0ZXN0CkBAIC0wLDAgKzEsNTUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cywgbG9nZ2luZworc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICdsaWInKSkKKworaW1wb3J0IHVuaXR0ZXN0Cit0cnk6CisgICAgaW1wb3J0IGJiCitleGNlcHQgUnVudGltZUVycm9yIGFzIGV4YzoKKyAgICBzeXMuZXhpdChzdHIoZXhjKSkKKworZGVmIHVzYWdlKCk6CisgICAgcHJpbnQoJ3VzYWdlOiBbQkJfU0tJUF9ORVRURVNUUz15ZXNdICVzIFstdl0gW3Rlc3RuYW1lMSBbdGVzdG5hbWUyXS4uLl0nICUgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkpCisKK3ZlcmJvc2l0eSA9IDEKKwordGVzdHMgPSBzeXMuYXJndlsxOl0KK2lmICctdicgaW4gc3lzLmFyZ3Y6CisgICAgdGVzdHMucmVtb3ZlKCctdicpCisgICAgdmVyYm9zaXR5ID0gMgorCitpZiB0ZXN0czoKKyAgICBpZiAnLS1oZWxwJyBpbiBzeXMuYXJndlsxOl06CisgICAgICAgIHVzYWdlKCkKKyAgICAgICAgc3lzLmV4aXQoMCkKK2Vsc2U6CisgICAgdGVzdHMgPSBbImJiLnRlc3RzLmNvZGVwYXJzZXIiLAorICAgICAgICAgICAgICJiYi50ZXN0cy5jb3ciLAorICAgICAgICAgICAgICJiYi50ZXN0cy5kYXRhIiwKKyAgICAgICAgICAgICAiYmIudGVzdHMuZmV0Y2giLAorICAgICAgICAgICAgICJiYi50ZXN0cy5wYXJzZSIsCisgICAgICAgICAgICAgImJiLnRlc3RzLnV0aWxzIl0KKworZm9yIHQgaW4gdGVzdHM6CisgICAgdCA9ICcuJy5qb2luKHQuc3BsaXQoJy4nKVs6M10pCisgICAgX19pbXBvcnRfXyh0KQorCit1bml0dGVzdC5tYWluKGFyZ3Y9WyJiaXRiYWtlLXNlbGZ0ZXN0Il0gKyB0ZXN0cywgdmVyYm9zaXR5PXZlcmJvc2l0eSkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vYml0YmFrZS13b3JrZXIgYi9iaXRiYWtlL2Jpbi9iaXRiYWtlLXdvcmtlcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjE3Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9iaW4vYml0YmFrZS13b3JrZXIKQEAgLTAsMCArMSw0MzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSksICdsaWInKSkKK2Zyb20gYmIgaW1wb3J0IGZldGNoMgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgoraW1wb3J0IHNlbGVjdAoraW1wb3J0IGVycm5vCitpbXBvcnQgc2lnbmFsCisKKyMgVXNlcnMgc2hvdWxkbid0IGJlIHJ1bm5pbmcgdGhpcyBjb2RlIGRpcmVjdGx5CitpZiBsZW4oc3lzLmFyZ3YpICE9IDIgb3Igbm90IHN5cy5hcmd2WzFdLnN0YXJ0c3dpdGgoImRlY2FmYmFkIik6CisgICAgcHJpbnQoImJpdGJha2Utd29ya2VyIGlzIG1lYW50IGZvciBpbnRlcm5hbCBleGVjdXRpb24gYnkgYml0YmFrZSBpdHNlbGYsIHBsZWFzZSBkb24ndCB1c2UgaXQgc3RhbmRhbG9uZS4iKQorICAgIHN5cy5leGl0KDEpCisKK3Byb2ZpbGluZyA9IEZhbHNlCitpZiBzeXMuYXJndlsxXSA9PSAiZGVjYWZiYWRiYWQiOgorICAgIHByb2ZpbGluZyA9IFRydWUKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjUHJvZmlsZSBhcyBwcm9maWxlCisgICAgZXhjZXB0OgorICAgICAgICBpbXBvcnQgcHJvZmlsZQorCisjIFVuYnVmZmVyIHN0ZG91dCB0byBhdm9pZCBsb2cgdHJ1bmNhdGlvbiBpbiB0aGUgZXZlbnQKKyMgb2YgYW4gdW5vcmRlcmx5IGV4aXQgYXMgd2VsbCBhcyB0byBwcm92aWRlIHRpbWVseQorIyB1cGRhdGVzIHRvIGxvZyBmaWxlcyBmb3IgdXNlIHdpdGggdGFpbAordHJ5OgorICAgIGlmIHN5cy5zdGRvdXQubmFtZSA9PSAnPHN0ZG91dD4nOgorICAgICAgICBzeXMuc3Rkb3V0ID0gb3MuZmRvcGVuKHN5cy5zdGRvdXQuZmlsZW5vKCksICd3JywgMCkKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKyAgICBiYi5tc2cubm90ZSgxLCBiYi5tc2cuZG9tYWluLkNhY2hlLCAiSW1wb3J0aW5nIGNQaWNrbGUgZmFpbGVkLiBGYWxsaW5nIGJhY2sgdG8gYSB2ZXJ5IHNsb3cgaW1wbGVtZW50YXRpb24uIikKKworCit3b3JrZXJfcGlwZSA9IHN5cy5zdGRvdXQuZmlsZW5vKCkKK2JiLnV0aWxzLm5vbmJsb2NraW5nZmQod29ya2VyX3BpcGUpCisKK2hhbmRsZXIgPSBiYi5ldmVudC5Mb2dIYW5kbGVyKCkKK2xvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCisKK2lmIDA6CisgICAgIyBDb2RlIHRvIHdyaXRlIG91dCBhIGxvZyBmaWxlIG9mIGFsbCBldmVudHMgcGFzc2luZyB0aHJvdWdoIHRoZSB3b3JrZXIKKyAgICBsb2dmaWxlbmFtZSA9ICIvdG1wL3dvcmtlcmxvZ2ZpbGUiCisgICAgZm9ybWF0X3N0ciA9ICIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICBjb25sb2dmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoZm9ybWF0X3N0cikKKyAgICBjb25zb2xlbG9nID0gbG9nZ2luZy5GaWxlSGFuZGxlcihsb2dmaWxlbmFtZSkKKyAgICBiYi5tc2cuYWRkRGVmYXVsdGxvZ0ZpbHRlcihjb25zb2xlbG9nKQorICAgIGNvbnNvbGVsb2cuc2V0Rm9ybWF0dGVyKGNvbmxvZ2Zvcm1hdCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlbG9nKQorCit3b3JrZXJfcXVldWUgPSAiIgorCitkZWYgd29ya2VyX2ZpcmUoZXZlbnQsIGQpOgorICAgIGRhdGEgPSAiPGV2ZW50PiIgKyBwaWNrbGUuZHVtcHMoZXZlbnQpICsgIjwvZXZlbnQ+IgorICAgIHdvcmtlcl9maXJlX3ByZXBpY2tsZWQoZGF0YSkKKworZGVmIHdvcmtlcl9maXJlX3ByZXBpY2tsZWQoZXZlbnQpOgorICAgIGdsb2JhbCB3b3JrZXJfcXVldWUKKworICAgIHdvcmtlcl9xdWV1ZSA9IHdvcmtlcl9xdWV1ZSArIGV2ZW50CisgICAgd29ya2VyX2ZsdXNoKCkKKworZGVmIHdvcmtlcl9mbHVzaCgpOgorICAgIGdsb2JhbCB3b3JrZXJfcXVldWUsIHdvcmtlcl9waXBlCisKKyAgICBpZiBub3Qgd29ya2VyX3F1ZXVlOgorICAgICAgICByZXR1cm4KKworICAgIHRyeToKKyAgICAgICAgd3JpdHRlbiA9IG9zLndyaXRlKHdvcmtlcl9waXBlLCB3b3JrZXJfcXVldWUpCisgICAgICAgIHdvcmtlcl9xdWV1ZSA9IHdvcmtlcl9xdWV1ZVt3cml0dGVuOl0KKyAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpIGFzIGU6CisgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUFHQUlOIGFuZCBlLmVycm5vICE9IGVycm5vLkVQSVBFOgorICAgICAgICAgICAgcmFpc2UKKworZGVmIHdvcmtlcl9jaGlsZF9maXJlKGV2ZW50LCBkKToKKyAgICBnbG9iYWwgd29ya2VyX3BpcGUKKworICAgIGRhdGEgPSAiPGV2ZW50PiIgKyBwaWNrbGUuZHVtcHMoZXZlbnQpICsgIjwvZXZlbnQ+IgorICAgIHRyeToKKyAgICAgICAgd29ya2VyX3BpcGUud3JpdGUoZGF0YSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgc2lndGVybV9oYW5kbGVyKE5vbmUsIE5vbmUpCisgICAgICAgIHJhaXNlCisKK2JiLmV2ZW50Lndvcmtlcl9maXJlID0gd29ya2VyX2ZpcmUKKworbGYgPSBOb25lCisjbGYgPSBvcGVuKCIvdG1wL3dvcmtlcmNvbW1hbmRsb2ciLCAidysiKQorZGVmIHdvcmtlcmxvZ193cml0ZShtc2cpOgorICAgIGlmIGxmOgorICAgICAgICBsZi53cml0ZShtc2cpCisgICAgICAgIGxmLmZsdXNoKCkKKworZGVmIHNpZ3Rlcm1faGFuZGxlcihzaWdudW0sIGZyYW1lKToKKyAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdURVJNLCBzaWduYWwuU0lHX0RGTCkKKyAgICBvcy5raWxscGcoMCwgc2lnbmFsLlNJR1RFUk0pCisgICAgc3lzLmV4aXQoKQorCitkZWYgZm9ya19vZmZfdGFzayhjZmcsIGRhdGEsIHdvcmtlcmRhdGEsIGZuLCB0YXNrLCB0YXNrbmFtZSwgYXBwZW5kcywgdGFza2RlcGRhdGEsIHF1aWV0ZXJyb3JzPUZhbHNlKToKKyAgICAjIFdlIG5lZWQgdG8gc2V0dXAgdGhlIGVudmlyb25tZW50IEJFRk9SRSB0aGUgZm9yaywgc2luY2UKKyAgICAjIGEgZm9yaygpIG9yIGV4ZWMqKCkgYWN0aXZhdGVzIFBTRVVETy4uLgorCisgICAgZW52YmFja3VwID0ge30KKyAgICBmYWtlZW52ID0ge30KKyAgICB1bWFzayA9IE5vbmUKKworICAgIHRhc2tkZXAgPSB3b3JrZXJkYXRhWyJ0YXNrZGVwcyJdW2ZuXQorICAgIGlmICd1bWFzaycgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsndW1hc2snXToKKyAgICAgICAgIyB1bWFzayBtaWdodCBjb21lIGluIGFzIGEgbnVtYmVyIG9yIHRleHQgc3RyaW5nLi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIHVtYXNrID0gaW50KHRhc2tkZXBbJ3VtYXNrJ11bdGFza25hbWVdLDgpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgdW1hc2sgPSB0YXNrZGVwWyd1bWFzayddW3Rhc2tuYW1lXQorCisgICAgIyBXZSBjYW4ndCB1c2UgdGhlIGZha2Vyb290IGVudmlyb25tZW50IGluIGEgZHJ5IHJ1biBhcyBpdCBwb3NzaWJseSBoYXNuJ3QgYmVlbiBidWlsdAorICAgIGlmICdmYWtlcm9vdCcgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnZmFrZXJvb3QnXSBhbmQgbm90IGNmZy5kcnlfcnVuOgorICAgICAgICBlbnZ2YXJzID0gKHdvcmtlcmRhdGFbImZha2Vyb290ZW52Il1bZm5dIG9yICIiKS5zcGxpdCgpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluICh2YXIuc3BsaXQoJz0nKSBmb3IgdmFyIGluIGVudnZhcnMpOgorICAgICAgICAgICAgZW52YmFja3VwW2tleV0gPSBvcy5lbnZpcm9uLmdldChrZXkpCisgICAgICAgICAgICBvcy5lbnZpcm9uW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgZmFrZWVudltrZXldID0gdmFsdWUKKworICAgICAgICBmYWtlZGlycyA9ICh3b3JrZXJkYXRhWyJmYWtlcm9vdGRpcnMiXVtmbl0gb3IgIiIpLnNwbGl0KCkKKyAgICAgICAgZm9yIHAgaW4gZmFrZWRpcnM6CisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIocCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICdSdW5uaW5nICVzOiVzIHVuZGVyIGZha2Vyb290LCBmYWtlZGlyczogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbiwgdGFza25hbWUsICcsICcuam9pbihmYWtlZGlycykpKQorICAgIGVsc2U6CisgICAgICAgIGVudnZhcnMgPSAod29ya2VyZGF0YVsiZmFrZXJvb3Rub2VudiJdW2ZuXSBvciAiIikuc3BsaXQoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiAodmFyLnNwbGl0KCc9JykgZm9yIHZhciBpbiBlbnZ2YXJzKToKKyAgICAgICAgICAgIGVudmJhY2t1cFtrZXldID0gb3MuZW52aXJvbi5nZXQoa2V5KQorICAgICAgICAgICAgb3MuZW52aXJvbltrZXldID0gdmFsdWUKKyAgICAgICAgICAgIGZha2VlbnZba2V5XSA9IHZhbHVlCisKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKworICAgIHRyeToKKyAgICAgICAgcGlwZWluLCBwaXBlb3V0ID0gb3MucGlwZSgpCisgICAgICAgIHBpcGVpbiA9IG9zLmZkb3BlbihwaXBlaW4sICdyYicsIDQwOTYpCisgICAgICAgIHBpcGVvdXQgPSBvcy5mZG9wZW4ocGlwZW91dCwgJ3diJywgMCkKKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJmb3JrIGZhaWxlZDogJWQgKCVzKSIgJSAoZS5lcnJubywgZS5zdHJlcnJvcikpCisKKyAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgZGVmIGNoaWxkKCk6CisgICAgICAgICAgICBnbG9iYWwgd29ya2VyX3BpcGUKKyAgICAgICAgICAgIHBpcGVpbi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sIHNpZ3Rlcm1faGFuZGxlcikKKyAgICAgICAgICAgICMgTGV0IFNJR0hVUCBleGl0IGFzIFNJR1RFUk0KKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgc2lndGVybV9oYW5kbGVyKQorICAgICAgICAgICAgYmIudXRpbHMuc2lnbmFsX29uX3BhcmVudF9leGl0KCJTSUdURVJNIikKKworICAgICAgICAgICAgIyBTYXZlIG91dCB0aGUgUElEIHNvIHRoYXQgdGhlIGV2ZW50IGNhbiBpbmNsdWRlIGl0IHRoZQorICAgICAgICAgICAgIyBldmVudHMKKyAgICAgICAgICAgIGJiLmV2ZW50Lndvcmtlcl9waWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgYmIuZXZlbnQud29ya2VyX2ZpcmUgPSB3b3JrZXJfY2hpbGRfZmlyZQorICAgICAgICAgICAgd29ya2VyX3BpcGUgPSBwaXBlb3V0CisKKyAgICAgICAgICAgICMgTWFrZSB0aGUgY2hpbGQgdGhlIHByb2Nlc3MgZ3JvdXAgbGVhZGVyIGFuZCBlbnN1cmUgbm8KKyAgICAgICAgICAgICMgY2hpbGQgcHJvY2VzcyB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgdGhlIGN1cnJlbnQgdGVybWluYWwKKyAgICAgICAgICAgICMgVGhpcyBlbnN1cmVzIHNpZ25hbHMgc2VudCB0byB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgbGlrZSBDdHJsK0MKKyAgICAgICAgICAgICMgZG9uJ3Qgc3RvcCB0aGUgY2hpbGQgcHJvY2Vzc2VzLgorICAgICAgICAgICAgb3Muc2V0c2lkKCkKKyAgICAgICAgICAgICMgTm8gc3RkaW4KKyAgICAgICAgICAgIG5ld3NpID0gb3Mub3Blbihvcy5kZXZudWxsLCBvcy5PX1JEV1IpCisgICAgICAgICAgICBvcy5kdXAyKG5ld3NpLCBzeXMuc3RkaW4uZmlsZW5vKCkpCisKKyAgICAgICAgICAgIGlmIHVtYXNrOgorICAgICAgICAgICAgICAgIG9zLnVtYXNrKHVtYXNrKQorCisgICAgICAgICAgICBkYXRhLnNldFZhcigiQkJfV09SS0VSQ09OVEVYVCIsICIxIikKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJCQl9UQVNLREVQREFUQSIsIHRhc2tkZXBkYXRhKQorICAgICAgICAgICAgZGF0YS5zZXRWYXIoIkJVSUxETkFNRSIsIHdvcmtlcmRhdGFbImJ1aWxkbmFtZSJdKQorICAgICAgICAgICAgZGF0YS5zZXRWYXIoIkRBVEUiLCB3b3JrZXJkYXRhWyJkYXRlIl0pCisgICAgICAgICAgICBkYXRhLnNldFZhcigiVElNRSIsIHdvcmtlcmRhdGFbInRpbWUiXSkKKyAgICAgICAgICAgIGJiLnBhcnNlLnNpZ2dlbi5zZXRfdGFza2RhdGEod29ya2VyZGF0YVsic2lnZGF0YSJdKQorICAgICAgICAgICAgcmV0ID0gMAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRoZV9kYXRhID0gYmIuY2FjaGUuQ2FjaGUubG9hZERhdGFGdWxsKGZuLCBhcHBlbmRzLCBkYXRhKQorICAgICAgICAgICAgICAgIHRoZV9kYXRhLnNldFZhcignQkJfVEFTS0hBU0gnLCB3b3JrZXJkYXRhWyJydW5xX2hhc2giXVt0YXNrXSkKKworICAgICAgICAgICAgICAgICMgZXhwb3J0ZWRfdmFycygpIHJldHVybnMgYSBnZW5lcmF0b3Igd2hpY2ggKmNhbm5vdCogYmUgcGFzc2VkIHRvIG9zLmVudmlyb24udXBkYXRlKCkgCisgICAgICAgICAgICAgICAgIyBzdWNjZXNzZnVsbHkuIFdlIGFsc28gbmVlZCB0byB1bnNldCBhbnl0aGluZyBmcm9tIHRoZSBlbnZpcm9ubWVudCB3aGljaCBzaG91bGRuJ3QgYmUgdGhlcmUgCisgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGJiLmRhdGEuZXhwb3J0ZWRfdmFycyh0aGVfZGF0YSkKKyAgICAgICAgICAgICAgICBiYi51dGlscy5lbXB0eV9lbnZpcm9ubWVudCgpCisgICAgICAgICAgICAgICAgZm9yIGUsIHYgaW4gZXhwb3J0czoKKyAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvbltlXSA9IHYKKyAgICAgICAgICAgICAgICBmb3IgZSBpbiBmYWtlZW52OgorICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uW2VdID0gZmFrZWVudltlXQorICAgICAgICAgICAgICAgICAgICB0aGVfZGF0YS5zZXRWYXIoZSwgZmFrZWVudltlXSkKKyAgICAgICAgICAgICAgICAgICAgdGhlX2RhdGEuc2V0VmFyRmxhZyhlLCAnZXhwb3J0JywgIjEiKQorCisgICAgICAgICAgICAgICAgaWYgcXVpZXRlcnJvcnM6CisgICAgICAgICAgICAgICAgICAgIHRoZV9kYXRhLnNldFZhckZsYWcodGFza25hbWUsICJxdWlldGVycm9ycyIsICIxIikKKworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICAgICAgaWYgbm90IHF1aWV0ZXJyb3JzOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoc3RyKGV4YykpCisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBjZmcuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgICAgICByZXR1cm4gYmIuYnVpbGQuZXhlY190YXNrKGZuLCB0YXNrbmFtZSwgdGhlX2RhdGEsIGNmZy5wcm9maWxlKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG9zLl9leGl0KDEpCisgICAgICAgIGlmIG5vdCBwcm9maWxpbmc6CisgICAgICAgICAgICBvcy5fZXhpdChjaGlsZCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvZm5hbWUgPSAicHJvZmlsZS0lcy5sb2ciICUgKGZuLnJlcGxhY2UoIi8iLCAiLSIpICsgIi0iICsgdGFza25hbWUpCisgICAgICAgICAgICBwcm9mID0gcHJvZmlsZS5Qcm9maWxlKCkKKyAgICAgICAgICAgIHRyeTogCisgICAgICAgICAgICAgICAgcmV0ID0gcHJvZmlsZS5Qcm9maWxlLnJ1bmNhbGwocHJvZiwgY2hpbGQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHByb2YuZHVtcF9zdGF0cyhwcm9mbmFtZSkKKyAgICAgICAgICAgICAgICBiYi51dGlscy5wcm9jZXNzX3Byb2ZpbGVsb2cocHJvZm5hbWUpCisgICAgICAgICAgICAgICAgb3MuX2V4aXQocmV0KQorICAgIGVsc2U6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGVudmJhY2t1cC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25ba2V5XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5lbnZpcm9uW2tleV0gPSB2YWx1ZQorCisgICAgcmV0dXJuIHBpZCwgcGlwZWluLCBwaXBlb3V0CisKK2NsYXNzIHJ1blF1ZXVlV29ya2VyUGlwZSgpOgorICAgICIiIgorICAgIEFic3RyYWN0aW9uIGZvciBhIHBpcGUgYmV0d2VlbiBhIHdvcmtlciB0aHJlYWQgYW5kIHRoZSB3b3JrZXIgc2VydmVyCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBpcGVpbiwgcGlwZW91dCk6CisgICAgICAgIHNlbGYuaW5wdXQgPSBwaXBlaW4KKyAgICAgICAgaWYgcGlwZW91dDoKKyAgICAgICAgICAgIHBpcGVvdXQuY2xvc2UoKQorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKHNlbGYuaW5wdXQpCisgICAgICAgIHNlbGYucXVldWUgPSAiIgorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHN0YXJ0ID0gbGVuKHNlbGYucXVldWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucXVldWUgPSBzZWxmLnF1ZXVlICsgc2VsZi5pbnB1dC5yZWFkKDEwMjQwMCkKKyAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKSBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQUdBSU46CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBlbmQgPSBsZW4oc2VsZi5xdWV1ZSkKKyAgICAgICAgaW5kZXggPSBzZWxmLnF1ZXVlLmZpbmQoIjwvZXZlbnQ+IikKKyAgICAgICAgd2hpbGUgaW5kZXggIT0gLTE6CisgICAgICAgICAgICB3b3JrZXJfZmlyZV9wcmVwaWNrbGVkKHNlbGYucXVldWVbOmluZGV4KzhdKQorICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHNlbGYucXVldWVbaW5kZXgrODpdCisgICAgICAgICAgICBpbmRleCA9IHNlbGYucXVldWUuZmluZCgiPC9ldmVudD4iKQorICAgICAgICByZXR1cm4gKGVuZCA+IHN0YXJ0KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLnJlYWQoKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGxlbihzZWxmLnF1ZXVlKSA+IDA6CisgICAgICAgICAgICBwcmludCgiV2FybmluZywgd29ya2VyIGNoaWxkIGxlZnQgcGFydGlhbCBtZXNzYWdlOiAlcyIgJSBzZWxmLnF1ZXVlKQorICAgICAgICBzZWxmLmlucHV0LmNsb3NlKCkKKworbm9ybWFsZXhpdCA9IEZhbHNlCisKK2NsYXNzIEJpdGJha2VXb3JrZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGluKToKKyAgICAgICAgc2VsZi5pbnB1dCA9IGRpbgorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKHNlbGYuaW5wdXQpCisgICAgICAgIHNlbGYucXVldWUgPSAiIgorICAgICAgICBzZWxmLmNvb2tlcmNmZyA9IE5vbmUKKyAgICAgICAgc2VsZi5kYXRhYnVpbGRlciA9IE5vbmUKKyAgICAgICAgc2VsZi5kYXRhID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3BpZHMgPSB7fQorICAgICAgICBzZWxmLmJ1aWxkX3BpcGVzID0ge30KKyAgICAKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgc2VsZi5zaWd0ZXJtX2V4Y2VwdGlvbikKKyAgICAgICAgIyBMZXQgU0lHSFVQIGV4aXQgYXMgU0lHVEVSTQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuc2lndGVybV9leGNlcHRpb24pCisKKyAgICBkZWYgc2lndGVybV9leGNlcHRpb24oc2VsZiwgc2lnbnVtLCBzdGFja2ZyYW1lKToKKyAgICAgICAgaWYgc2lnbnVtID09IHNpZ25hbC5TSUdURVJNOgorICAgICAgICAgICAgYmIud2FybigiV29ya2VyIHJlY2lldmVkIFNJR1RFUk0sIHNodXR0aW5nIGRvd24uLi4iKQorICAgICAgICBlbGlmIHNpZ251bSA9PSBzaWduYWwuU0lHSFVQOgorICAgICAgICAgICAgYmIud2FybigiV29ya2VyIHJlY2lldmVkIFNJR0hVUCwgc2h1dHRpbmcgZG93bi4uLiIpCisgICAgICAgIHNlbGYuaGFuZGxlX2ZpbmlzaG5vdyhOb25lKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdURVJNLCBzaWduYWwuU0lHX0RGTCkKKyAgICAgICAgb3Mua2lsbChvcy5nZXRwaWQoKSwgc2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYgc2VydmUoc2VsZik6ICAgICAgICAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIChyZWFkeSwgXywgXykgPSBzZWxlY3Quc2VsZWN0KFtzZWxmLmlucHV0XSArIFtpLmlucHV0IGZvciBpIGluIHNlbGYuYnVpbGRfcGlwZXMudmFsdWVzKCldLCBbXSAsIFtdLCAxKQorICAgICAgICAgICAgaWYgc2VsZi5pbnB1dCBpbiByZWFkeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHIgPSBzZWxmLmlucHV0LnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocikgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRU9GIG9uIHBpcGUsIHNlcnZlciBtdXN0IGhhdmUgdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd0ZXJtX2V4Y2VwdGlvbihzaWduYWwuU0lHVEVSTSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHNlbGYucXVldWUgKyByCisgICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbGVuKHNlbGYucXVldWUpOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2l0ZW0oImNvb2tlcmNvbmZpZyIsIHNlbGYuaGFuZGxlX2Nvb2tlcmNmZykKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9pdGVtKCJ3b3JrZXJkYXRhIiwgc2VsZi5oYW5kbGVfd29ya2VyZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9pdGVtKCJydW50YXNrIiwgc2VsZi5oYW5kbGVfcnVudGFzaykKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9pdGVtKCJmaW5pc2hub3ciLCBzZWxmLmhhbmRsZV9maW5pc2hub3cpCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfaXRlbSgicGluZyIsIHNlbGYuaGFuZGxlX3BpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfaXRlbSgicXVpdCIsIHNlbGYuaGFuZGxlX3F1aXQpCisKKyAgICAgICAgICAgIGZvciBwaXBlIGluIHNlbGYuYnVpbGRfcGlwZXM6CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZF9waXBlc1twaXBlXS5yZWFkKCkKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmJ1aWxkX3BpZHMpOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc193YWl0cGlkKCkKKyAgICAgICAgICAgIHdvcmtlcl9mbHVzaCgpCisKKworICAgIGRlZiBoYW5kbGVfaXRlbShzZWxmLCBpdGVtLCBmdW5jKToKKyAgICAgICAgaWYgc2VsZi5xdWV1ZS5zdGFydHN3aXRoKCI8IiArIGl0ZW0gKyAiPiIpOgorICAgICAgICAgICAgaW5kZXggPSBzZWxmLnF1ZXVlLmZpbmQoIjwvIiArIGl0ZW0gKyAiPiIpCisgICAgICAgICAgICB3aGlsZSBpbmRleCAhPSAtMToKKyAgICAgICAgICAgICAgICBmdW5jKHNlbGYucXVldWVbKGxlbihpdGVtKSArIDIpOmluZGV4XSkKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlID0gc2VsZi5xdWV1ZVsoaW5kZXggKyBsZW4oaXRlbSkgKyAzKTpdCisgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLnF1ZXVlLmZpbmQoIjwvIiArIGl0ZW0gKyAiPiIpCisKKyAgICBkZWYgaGFuZGxlX2Nvb2tlcmNmZyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5jb29rZXJjZmcgPSBwaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgc2VsZi5kYXRhYnVpbGRlciA9IGJiLmNvb2tlcmRhdGEuQ29va2VyRGF0YUJ1aWxkZXIoc2VsZi5jb29rZXJjZmcsIHdvcmtlcj1UcnVlKQorICAgICAgICBzZWxmLmRhdGFidWlsZGVyLnBhcnNlQmFzZUNvbmZpZ3VyYXRpb24oKQorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFidWlsZGVyLmRhdGEKKworICAgIGRlZiBoYW5kbGVfd29ya2VyZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi53b3JrZXJkYXRhID0gcGlja2xlLmxvYWRzKGRhdGEpCisgICAgICAgIGJiLm1zZy5sb2dnZXJEZWZhdWx0RGVidWdMZXZlbCA9IHNlbGYud29ya2VyZGF0YVsibG9nZGVmYXVsdGRlYnVnIl0KKyAgICAgICAgYmIubXNnLmxvZ2dlckRlZmF1bHRWZXJib3NlID0gc2VsZi53b3JrZXJkYXRhWyJsb2dkZWZhdWx0dmVyYm9zZSJdCisgICAgICAgIGJiLm1zZy5sb2dnZXJWZXJib3NlTG9ncyA9IHNlbGYud29ya2VyZGF0YVsibG9nZGVmYXVsdHZlcmJvc2Vsb2dzIl0KKyAgICAgICAgYmIubXNnLmxvZ2dlckRlZmF1bHREb21haW5zID0gc2VsZi53b3JrZXJkYXRhWyJsb2dkZWZhdWx0ZG9tYWluIl0KKyAgICAgICAgc2VsZi5kYXRhLnNldFZhcigiUFJTRVJWX0hPU1QiLCBzZWxmLndvcmtlcmRhdGFbInByaG9zdCJdKQorCisgICAgZGVmIGhhbmRsZV9waW5nKHNlbGYsIF8pOgorICAgICAgICB3b3JrZXJsb2dfd3JpdGUoIkhhbmRsaW5nIHBpbmdcbiIpCisKKyAgICAgICAgbG9nZ2VyLndhcm4oIlBvbmcgZnJvbSBiaXRiYWtlLXdvcmtlciEiKQorCisgICAgZGVmIGhhbmRsZV9xdWl0KHNlbGYsIGRhdGEpOgorICAgICAgICB3b3JrZXJsb2dfd3JpdGUoIkhhbmRsaW5nIHF1aXRcbiIpCisKKyAgICAgICAgZ2xvYmFsIG5vcm1hbGV4aXQKKyAgICAgICAgbm9ybWFsZXhpdCA9IFRydWUKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIGRlZiBoYW5kbGVfcnVudGFzayhzZWxmLCBkYXRhKToKKyAgICAgICAgZm4sIHRhc2ssIHRhc2tuYW1lLCBxdWlldGVycm9ycywgYXBwZW5kcywgdGFza2RlcGRhdGEgPSBwaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgd29ya2VybG9nX3dyaXRlKCJIYW5kbGluZyBydW50YXNrICVzICVzICVzXG4iICUgKHRhc2ssIGZuLCB0YXNrbmFtZSkpCisKKyAgICAgICAgcGlkLCBwaXBlaW4sIHBpcGVvdXQgPSBmb3JrX29mZl90YXNrKHNlbGYuY29va2VyY2ZnLCBzZWxmLmRhdGEsIHNlbGYud29ya2VyZGF0YSwgZm4sIHRhc2ssIHRhc2tuYW1lLCBhcHBlbmRzLCB0YXNrZGVwZGF0YSwgcXVpZXRlcnJvcnMpCisKKyAgICAgICAgc2VsZi5idWlsZF9waWRzW3BpZF0gPSB0YXNrCisgICAgICAgIHNlbGYuYnVpbGRfcGlwZXNbcGlkXSA9IHJ1blF1ZXVlV29ya2VyUGlwZShwaXBlaW4sIHBpcGVvdXQpCisKKyAgICBkZWYgcHJvY2Vzc193YWl0cGlkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIG5vbmUgaXMgdGhlcmUgYXJlIG5vIHByb2Nlc3NlcyBhd2FpdGluZyByZXN1bHQgY29sbGVjdGlvbiwgb3RoZXJ3aXNlCisgICAgICAgIGNvbGxlY3QgdGhlIHByb2Nlc3MgZXhpdCBjb2RlcyBhbmQgY2xvc2UgdGhlIGluZm9ybWF0aW9uIHBpcGUuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoLTEsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBwaWQgPT0gMCBvciBvcy5XSUZTVE9QUEVEKHN0YXR1cyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHdvcmtlcmxvZ193cml0ZSgiRXhpdCBjb2RlIG9mICVzIGZvciBwaWQgJXNcbiIgJSAoc3RhdHVzLCBwaWQpKQorCisgICAgICAgIGlmIG9zLldJRkVYSVRFRChzdGF0dXMpOgorICAgICAgICAgICAgc3RhdHVzID0gb3MuV0VYSVRTVEFUVVMoc3RhdHVzKQorICAgICAgICBlbGlmIG9zLldJRlNJR05BTEVEKHN0YXR1cyk6CisgICAgICAgICAgICAjIFBlciBzaGVsbCBjb252ZW50aW9ucyBmb3IgJD8sIHdoZW4gYSBwcm9jZXNzIGV4aXRzIGR1ZSB0bworICAgICAgICAgICAgIyBhIHNpZ25hbCwgd2UgcmV0dXJuIGFuIGV4aXQgY29kZSBvZiAxMjggKyBTSUdOVU0KKyAgICAgICAgICAgIHN0YXR1cyA9IDEyOCArIG9zLldURVJNU0lHKHN0YXR1cykKKworICAgICAgICB0YXNrID0gc2VsZi5idWlsZF9waWRzW3BpZF0KKyAgICAgICAgZGVsIHNlbGYuYnVpbGRfcGlkc1twaWRdCisKKyAgICAgICAgc2VsZi5idWlsZF9waXBlc1twaWRdLmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuYnVpbGRfcGlwZXNbcGlkXQorCisgICAgICAgIHdvcmtlcl9maXJlX3ByZXBpY2tsZWQoIjxleGl0Y29kZT4iICsgcGlja2xlLmR1bXBzKCh0YXNrLCBzdGF0dXMpKSArICI8L2V4aXRjb2RlPiIpCisKKyAgICBkZWYgaGFuZGxlX2ZpbmlzaG5vdyhzZWxmLCBfKToKKyAgICAgICAgaWYgc2VsZi5idWlsZF9waWRzOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNlbmRpbmcgU0lHVEVSTSB0byByZW1haW5pbmcgJXMgdGFza3MiLCBsZW4oc2VsZi5idWlsZF9waWRzKSkKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYuYnVpbGRfcGlkcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLmtpbGwoLWssIHNpZ25hbC5TSUdURVJNKQorICAgICAgICAgICAgICAgICAgICBvcy53YWl0cGlkKC0xLCAwKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgcGlwZSBpbiBzZWxmLmJ1aWxkX3BpcGVzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9waXBlc1twaXBlXS5yZWFkKCkKKwordHJ5OgorICAgIHdvcmtlciA9IEJpdGJha2VXb3JrZXIoc3lzLnN0ZGluKQorICAgIGlmIG5vdCBwcm9maWxpbmc6CisgICAgICAgIHdvcmtlci5zZXJ2ZSgpCisgICAgZWxzZToKKyAgICAgICAgcHJvZm5hbWUgPSAicHJvZmlsZS13b3JrZXIubG9nIgorICAgICAgICBwcm9mID0gcHJvZmlsZS5Qcm9maWxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvZmlsZS5Qcm9maWxlLnJ1bmNhbGwocHJvZiwgd29ya2VyLnNlcnZlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcHJvZi5kdW1wX3N0YXRzKHByb2ZuYW1lKQorICAgICAgICAgICAgYmIudXRpbHMucHJvY2Vzc19wcm9maWxlbG9nKHByb2ZuYW1lKQorZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKKyAgICBpZiBub3Qgbm9ybWFsZXhpdDoKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKGUpKQord2hpbGUgbGVuKHdvcmtlcl9xdWV1ZSk6CisgICAgd29ya2VyX2ZsdXNoKCkKK3dvcmtlcmxvZ193cml0ZSgiZXhpdHRpbmciKQorc3lzLmV4aXQoMCkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vYml0ZG9jIGIvYml0YmFrZS9iaW4vYml0ZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3NmQ4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9iaXRkb2MKQEAgLTAsMCArMSw1MzEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3B0cGFyc2UsIG9zLCBzeXMKKworIyBiaXRiYWtlCitzeXMucGF0aC5hcHBlbmQob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnbGliJykpCitpbXBvcnQgYmIKK2ltcG9ydCBiYi5wYXJzZQorZnJvbSAgIHN0cmluZyBpbXBvcnQgc3BsaXQsIGpvaW4KKworX192ZXJzaW9uX18gPSAiMC4wLjIiCisKK2NsYXNzIEhUTUxGb3JtYXR0ZXI6CisgICAgIiIiCisgICAgU2ltcGxlIGNsYXNzIHRvIGhlbHAgdG8gZ2VuZXJhdGUgc29tZSBzb3J0IG9mIEhUTUwgZmlsZXMuIEl0IGlzCisgICAgcXVpdGUgaW5mZXJpb3Igc29sdXRpb24gY29tcGFyZWQgdG8gZG9jYm9vaywgZ3RrZG9jLCBkb3h5Z2VuIGJ1dCBpdAorICAgIHNob3VsZCB3b3JrIGZvciBub3cuCisgICAgV2UndmUgYSBnbG9iYWwgaW50cm9kdWN0aW9uIHNpdGUgKGluZGV4Lmh0bWwpIGFuZCB0aGVuIG9uZSBzaXRlIGZvcgorICAgIHRoZSBsaXN0IG9mIGtleXMgKGFscGhhYmV0aWNhbCBzb3J0ZWQpIGFuZCBvbmUgZm9yIHRoZSBsaXN0IG9mIGdyb3VwcywKKyAgICBvbmUgc2l0ZSBmb3IgZWFjaCBrZXkgd2l0aCBsaW5rcyB0byB0aGUgcmVsYXRpb25zIGFuZCBncm91cHMuCisKKyAgICAgICAgaW5kZXguaHRtbAorICAgICAgICBhbGxfa2V5cy5odG1sCisgICAgICAgIGFsbF9ncm91cHMuaHRtbAorICAgICAgICBncm91cE5BTUUuaHRtbAorICAgICAgICBrZXlOQU1FLmh0bWwKKyAgICAiIiIKKworICAgIGRlZiByZXBsYWNlKHNlbGYsIHRleHQsICpwYWlycyk6CisgICAgICAgICIiIgorICAgICAgICBGcm9tIHB5ZG9jLi4uIGFsbW9zdCBpZGVudGljYWwgYXQgbGVhc3QKKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIHBhaXJzOgorICAgICAgICAgICAgKGEsIGIpID0gcGFpcnNbMF0KKyAgICAgICAgICAgIHRleHQgPSBqb2luKHNwbGl0KHRleHQsIGEpLCBiKQorICAgICAgICAgICAgcGFpcnMgPSBwYWlyc1sxOl0KKyAgICAgICAgcmV0dXJuIHRleHQKKyAgICBkZWYgZXNjYXBlKHNlbGYsIHRleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgRXNjYXBlIHN0cmluZyB0byBiZSBjb25mb3JtIEhUTUwKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnJlcGxhY2UodGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcmJywgJyZhbXA7JyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnPCcsICcmbHQ7JyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnPicsICcmZ3Q7JyApICkKKyAgICBkZWYgY3JlYXRlTmF2aWdhdG9yKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIHRoZSBuYXZnaWF0b3IKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiIiI8dGFibGUgY2xhc3M9Im5hdmlnYXRpb24iIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGhlYWRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKzx0ciB2YWxpZ249Im1pZGRsZSI+Cis8dGQ+PGEgYWNjZXNza2V5PSJnIiBocmVmPSJpbmRleC5odG1sIj5Ib21lPC9hPjwvdGQ+Cis8dGQ+PGEgYWNjZXNza2V5PSJuIiBocmVmPSJhbGxfZ3JvdXBzLmh0bWwiPkdyb3VwczwvYT48L3RkPgorPHRkPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iYWxsX2tleXMuaHRtbCI+S2V5czwvYT48L3RkPgorPC90cj48L3RhYmxlPgorIiIiCisKKyAgICBkZWYgcmVsYXRlZEtleXMoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgSFRNTCB0byBsaW5rIHRvIGZvcmVpZ24ga2V5cworICAgICAgICAiIiIKKworICAgICAgICBpZiBsZW4oaXRlbS5yZWxhdGVkKCkpID09IDA6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgICAgICB0eHQgPSAiPHA+PGI+U2VlIGFsc286PC9iPjxicj4iCisgICAgICAgIHR4dHMgPSBbXQorICAgICAgICBmb3IgaXQgaW4gaXRlbS5yZWxhdGVkKCk6CisgICAgICAgICAgICB0eHRzLmFwcGVuZCgiIiI8YSBocmVmPSJrZXklKGl0KXMuaHRtbCI+JShpdClzPC9hPiIiIiAlIHZhcnMoKSApCisKKyAgICAgICAgcmV0dXJuIHR4dCArICIsIi5qb2luKHR4dHMpCisKKyAgICBkZWYgZ3JvdXBzKHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIEhUTUwgdG8gbGluayB0byByZWxhdGVkIGdyb3VwcworICAgICAgICAiIiIKKworICAgICAgICBpZiBsZW4oaXRlbS5ncm91cHMoKSkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAiIgorCisKKyAgICAgICAgdHh0ID0gIjxwPjxiPlNlZSBhbHNvOjwvYj48YnI+IgorICAgICAgICB0eHRzID0gW10KKyAgICAgICAgZm9yIGdyb3VwIGluIGl0ZW0uZ3JvdXBzKCk6CisgICAgICAgICAgICB0eHRzLmFwcGVuZCggIiIiPGEgaHJlZj0iZ3JvdXAlcy5odG1sIj4lczwvYT4gIiIiICUgKGdyb3VwLCBncm91cCkgKQorCisgICAgICAgIHJldHVybiB0eHQgKyAiLCIuam9pbih0eHRzKQorCisKKyAgICBkZWYgY3JlYXRlS2V5U2l0ZShzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIHNpdGUgZm9yIGEga2V5LiBJdCBjb250YWlucyB0aGUgaGVhZGVyL25hdmlnYXRvciwgYSBoZWFkaW5nLAorICAgICAgICB0aGUgZGVzY3JpcHRpb24sIGxpbmtzIHRvIHJlbGF0ZWQga2V5cyBhbmQgdG8gdGhlIGdyb3Vwcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuICIiIjwhZG9jdHlwZSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+S2V5ICVzPC90aXRsZT48L2hlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgorJXMKKzxoMj48c3BhbiBjbGFzcz0icmVmZW50cnl0aXRsZSI+JXM8L3NwYW4+PC9oMj4KKworPGRpdiBjbGFzcz0icmVmc3lub3BzaXNkaXYiPgorPGgyPlN5bm9wc2lzPC9oMj4KKzxwPgorJXMKKzwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJyZWZzeW5vcHNpc2RpdiI+Cis8aDI+UmVsYXRlZCBLZXlzPC9oMj4KKzxwPgorJXMKKzwvcD4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJyZWZzeW5vcHNpc2RpdiI+Cis8aDI+R3JvdXBzPC9oMj4KKzxwPgorJXMKKzwvcD4KKzwvZGl2PgorCisKKzwvYm9keT4KKyIiIiAgICAgJSAoaXRlbS5uYW1lKCksIHNlbGYuY3JlYXRlTmF2aWdhdG9yKCksIGl0ZW0ubmFtZSgpLCAKKyAgICAgICAgICAgc2VsZi5lc2NhcGUoaXRlbS5kZXNjcmlwdGlvbigpKSwgc2VsZi5yZWxhdGVkS2V5cyhpdGVtKSwgc2VsZi5ncm91cHMoaXRlbSkpCisKKyAgICBkZWYgY3JlYXRlR3JvdXBzU2l0ZShzZWxmLCBkb2MpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIHRoZSBHcm91cCBPdmVydmlldyBzaXRlCisgICAgICAgICIiIgorCisgICAgICAgIGdyb3VwcyA9ICIiCisgICAgICAgIHNvcnRlZF9ncm91cHMgPSBzb3J0ZWQoZG9jLmdyb3VwcygpKQorICAgICAgICBmb3IgZ3JvdXAgaW4gc29ydGVkX2dyb3VwczoKKyAgICAgICAgICAgIGdyb3VwcyArPSAiIiI8YSBocmVmPSJncm91cCVzLmh0bWwiPiVzPC9hPjxicj4iIiIgJSAoZ3JvdXAsIGdyb3VwKQorCisgICAgICAgIHJldHVybiAiIiI8IWRvY3R5cGUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+PGhlYWQ+PHRpdGxlPkdyb3VwIG92ZXJ2aWV3PC90aXRsZT48L2hlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPgorJXMKKzxoMj5BdmFpbGFibGUgR3JvdXBzPC9oMj4KKyVzCis8L2JvZHk+CisiIiIgJSAoc2VsZi5jcmVhdGVOYXZpZ2F0b3IoKSwgZ3JvdXBzKQorCisgICAgZGVmIGNyZWF0ZUluZGV4KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIHRoZSBpbmRleCBmaWxlCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiAiIiI8IWRvY3R5cGUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+PGhlYWQ+PHRpdGxlPkJpdGJha2UgRG9jdW1lbnRhdGlvbjwvdGl0bGU+PC9oZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKyVzCis8aDI+RG9jdW1lbnRhdGlvbiBFbnRyYW5jZTwvaDI+Cis8YSBocmVmPSJhbGxfZ3JvdXBzLmh0bWwiPkFsbCBhdmFpbGFibGUgZ3JvdXBzPC9hPjxicj4KKzxhIGhyZWY9ImFsbF9rZXlzLmh0bWwiPkFsbCBhdmFpbGFibGUga2V5czwvYT48YnI+Cis8L2JvZHk+CisiIiIgJSBzZWxmLmNyZWF0ZU5hdmlnYXRvcigpCisKKyAgICBkZWYgY3JlYXRlS2V5c1NpdGUoc2VsZiwgZG9jKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBPdmVydmlldyBvZiBhbGwgYXZpbGFibGUga2V5cworICAgICAgICAiIiIKKyAgICAgICAga2V5cyA9ICIiCisgICAgICAgIHNvcnRlZF9rZXlzID0gc29ydGVkKGRvYy5kb2Nfa2V5cygpKQorICAgICAgICBmb3Iga2V5IGluIHNvcnRlZF9rZXlzOgorICAgICAgICAgICAga2V5cyArPSAiIiI8YSBocmVmPSJrZXklcy5odG1sIj4lczwvYT48YnI+IiIiICUgKGtleSwga2V5KQorCisgICAgICAgIHJldHVybiAiIiI8IWRvY3R5cGUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+PGhlYWQ+PHRpdGxlPktleSBvdmVydmlldzwvdGl0bGU+PC9oZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj4KKzxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KKyVzCis8aDI+QXZhaWxhYmxlIEtleXM8L2gyPgorJXMKKzwvYm9keT4KKyIiIiAlIChzZWxmLmNyZWF0ZU5hdmlnYXRvcigpLCBrZXlzKQorCisgICAgZGVmIGNyZWF0ZUdyb3VwU2l0ZShzZWxmLCBnciwgaXRlbXMsIF9kZXNjcmlwdGlvbiA9IE5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgc2l0ZSBmb3IgYSBncm91cDoKKyAgICAgICAgR3JvdXAgdGhlIG5hbWUgb2YgdGhlIGdyb3VwLCBpdGVtcyBjb250YWluIHRoZSBuYW1lIG9mIHRoZSBrZXlzCisgICAgICAgIGluc2lkZSB0aGlzIGdyb3VwCisgICAgICAgICIiIgorICAgICAgICBncm91cHMgPSAiIgorICAgICAgICBkZXNjcmlwdGlvbiA9ICIiCisKKyAgICAgICAgIyBjcmVhdGUgYSBzZWN0aW9uIHdpdGggdGhlIGdyb3VwIGRlc2NyaXB0aW9ucworICAgICAgICBpZiBfZGVzY3JpcHRpb246CisgICAgICAgICAgICBkZXNjcmlwdGlvbiAgKz0gIjxoMiBEZXNjcmlwdGlvbiBvZiBHcm96cCAlczwvaDI+IiAlIGdyCisgICAgICAgICAgICBkZXNjcmlwdGlvbiAgKz0gX2Rlc2NyaXB0aW9uCisKKyAgICAgICAgaXRlbXMuc29ydChsYW1iZGEgeCwgeTpjbXAoeC5uYW1lKCksIHkubmFtZSgpKSkKKyAgICAgICAgZm9yIGdyb3VwIGluIGl0ZW1zOgorICAgICAgICAgICAgZ3JvdXBzICs9ICIiIjxhIGhyZWY9ImtleSVzLmh0bWwiPiVzPC9hPjxicj4iIiIgJSAoZ3JvdXAubmFtZSgpLCBncm91cC5uYW1lKCkpCisKKyAgICAgICAgcmV0dXJuICIiIjwhZG9jdHlwZSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+R3JvdXAgJXM8L3RpdGxlPjwvaGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGUuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+CislcworJXMKKzxkaXYgY2xhc3M9InJlZnN5bm9wc2lzZGl2Ij4KKzxoMj5LZXlzIGluIEdyb3VwICVzPC9oMj4KKzxwcmUgY2xhc3M9InN5bm9wc2lzIj4KKyVzCis8L3ByZT4KKzwvZGl2PgorPC9ib2R5PgorIiIiICUgKGdyLCBzZWxmLmNyZWF0ZU5hdmlnYXRvcigpLCBkZXNjcmlwdGlvbiwgZ3IsIGdyb3VwcykKKworCisKKyAgICBkZWYgY3JlYXRlQ1NTKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIHRoZSBDU1MgZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICIiIi5zeW5vcHNpcywgLmNsYXNzc3lub3BzaXMKK3sKKyAgYmFja2dyb3VuZDogI2VlZWVlZTsKKyAgYm9yZGVyOiBzb2xpZCAxcHggI2FhYWFhYTsKKyAgcGFkZGluZzogMC41ZW07Cit9CisucHJvZ3JhbWxpc3RpbmcKK3sKKyAgYmFja2dyb3VuZDogI2VlZWVmZjsKKyAgYm9yZGVyOiBzb2xpZCAxcHggI2FhYWFmZjsKKyAgcGFkZGluZzogMC41ZW07Cit9CisudmFyaWFibGVsaXN0Cit7CisgIHBhZGRpbmc6IDRweDsKKyAgbWFyZ2luLWxlZnQ6IDNlbTsKK30KKy52YXJpYWJsZWxpc3QgdGQ6Zmlyc3QtY2hpbGQKK3sKKyAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KK3RhYmxlLm5hdmlnYXRpb24KK3sKKyAgYmFja2dyb3VuZDogI2ZmZWVlZTsKKyAgYm9yZGVyOiBzb2xpZCAxcHggI2ZmYWFhYTsKKyAgbWFyZ2luLXRvcDogMC41ZW07CisgIG1hcmdpbi1ib3R0b206IDAuNWVtOworfQorLm5hdmlnYXRpb24gYQoreworICBjb2xvcjogIzc3MDAwMDsKK30KKy5uYXZpZ2F0aW9uIGE6dmlzaXRlZAoreworICBjb2xvcjogIzU1MDAwMDsKK30KKy5uYXZpZ2F0aW9uIC50aXRsZQoreworICBmb250LXNpemU6IDIwMCU7Cit9CitkaXYucmVmbmFtZWRpdgoreworICBtYXJnaW4tdG9wOiAyZW07Cit9CitkaXYuZ2FsbGVyeS1mbG9hdAoreworICBmbG9hdDogbGVmdDsKKyAgcGFkZGluZzogMTBweDsKK30KK2Rpdi5nYWxsZXJ5LWZsb2F0IGltZworeworICBib3JkZXItc3R5bGU6IG5vbmU7Cit9CitkaXYuZ2FsbGVyeS1zcGFjZXIKK3sKKyAgY2xlYXI6IGJvdGg7Cit9CithCit7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KK2E6aG92ZXIKK3sKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIGNvbG9yOiAjRkYwMDAwOworfQorIiIiCisKKworCitjbGFzcyBEb2N1bWVudGF0aW9uSXRlbToKKyAgICAiIiIKKyAgICBBIGNsYXNzIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgYSBjb25maWd1cmF0aW9uCisgICAgaXRlbS4gSXQgY29udGFpbnMgdGhlIGtleSBuYW1lLCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHJlbGF0ZWQgbmFtZXMsCisgICAgYW5kIHRoZSBncm91cCB0aGlzIGl0ZW0gaXMgY29udGFpbmVkIGluLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9ncm91cHMgID0gW10KKyAgICAgICAgc2VsZi5fcmVsYXRlZCA9IFtdCisgICAgICAgIHNlbGYuX25hbWUgICAgPSAiIgorICAgICAgICBzZWxmLl9kZXNjICAgID0gIiIKKworICAgIGRlZiBncm91cHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9ncm91cHMKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIGRlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGVzYworCisgICAgZGVmIHJlbGF0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZWxhdGVkCisKKyAgICBkZWYgc2V0TmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKworICAgIGRlZiBzZXREZXNjcmlwdGlvbihzZWxmLCBkZXNjKToKKyAgICAgICAgc2VsZi5fZGVzYyA9IGRlc2MKKworICAgIGRlZiBhZGRHcm91cChzZWxmLCBncm91cCk6CisgICAgICAgIHNlbGYuX2dyb3Vwcy5hcHBlbmQoZ3JvdXApCisKKyAgICBkZWYgYWRkUmVsYXRpb24oc2VsZiwgcmVsYXRpb24pOgorICAgICAgICBzZWxmLl9yZWxhdGVkLmFwcGVuZChyZWxhdGlvbikKKworICAgIGRlZiBzb3J0KHNlbGYpOgorICAgICAgICBzZWxmLl9yZWxhdGVkLnNvcnQoKQorICAgICAgICBzZWxmLl9ncm91cHMuc29ydCgpCisKKworY2xhc3MgRG9jdW1lbnRhdGlvbjoKKyAgICAiIiIKKyAgICBIb2xkcyB0aGUgZG9jdW1lbnRhdGlvbi4uLiB3aXRoIG1hcHBpbmdzIGZyb20ga2V5IHRvIGl0ZW1zLi4uCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX19rZXlzICAgPSB7fQorICAgICAgICBzZWxmLl9fZ3JvdXBzID0ge30KKworICAgIGRlZiBpbnNlcnRfZG9jX2l0ZW0oc2VsZiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBJbnNlcnQgdGhlIERvYyBJdGVtIGludG8gdGhlIGludGVybmFsIGxpc3QKKyAgICAgICAgb2YgcmVwcmVzZW50YXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIGl0ZW0uc29ydCgpCisgICAgICAgIHNlbGYuX19rZXlzW2l0ZW0ubmFtZSgpXSA9IGl0ZW0KKworICAgICAgICBmb3IgZ3JvdXAgaW4gaXRlbS5ncm91cHMoKToKKyAgICAgICAgICAgIGlmIG5vdCBncm91cCBpbiBzZWxmLl9fZ3JvdXBzOgorICAgICAgICAgICAgICAgIHNlbGYuX19ncm91cHNbZ3JvdXBdID0gW10KKyAgICAgICAgICAgIHNlbGYuX19ncm91cHNbZ3JvdXBdLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgc2VsZi5fX2dyb3Vwc1tncm91cF0uc29ydCgpCisKKworICAgIGRlZiBkb2NfaXRlbShzZWxmLCBrZXkpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBEb2N1bWVudGF0aW9uSW5zdGFuY2UgZGVzY3JpYmluZyB0aGUga2V5CisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2tleXNba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGRvY19rZXlzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkb2N1bWVudGVkIEtFWVMgKG5hbWVzKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19rZXlzLmtleXMoKQorCisgICAgZGVmIGdyb3VwcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbmFtZXMgb2YgYXZhaWxhYmxlIGdyb3VwcworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19ncm91cHMua2V5cygpCisKKyAgICBkZWYgZ3JvdXBfY29udGVudChzZWxmLCBncm91cF9uYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2Yga2V5cy9uYW1lcyB0aGF0IGFyZSBpbiBhIHNwZWNlZmljCisgICAgICAgIGdyb3VwIG9yIHRoZSBlbXB0eSBsaXN0CisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2dyb3Vwc1tncm91cF9uYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gW10KKworCitkZWYgcGFyc2VfY21kbGluZShhcmdzKToKKyAgICAiIiIKKyAgICBQYXJzZSB0aGUgQ01EIGxpbmUgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgbi10dXBsZQorICAgICIiIgorCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKCB2ZXJzaW9uID0gIkJpdGJha2UgRG9jdW1lbnRhdGlvbiBUb29sIENvcmUgdmVyc2lvbiAlcywgJSVwcm9nIHZlcnNpb24gJXMiICUgKGJiLl9fdmVyc2lvbl9fLCBfX3ZlcnNpb25fXykpCisgICAgdXNhZ2UgID0gIiIiJXByb2cgW29wdGlvbnNdCisKK0NyZWF0ZSBhIHNldCBvZiBodG1sIHBhZ2VzIChkb2N1bWVudGF0aW9uKSBmb3IgYSBiaXRiYWtlLmNvbmYuLi4uCisiIiIKKworICAgICMgQWRkIHRoZSBuZWVkZWQgb3B0aW9ucworICAgIHBhcnNlci5hZGRfb3B0aW9uKCAiLWMiLCAiLS1jb25maWciLCBoZWxwID0gIlVzZSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gZmlsZSBhcyBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCBkZXN0ID0gImNvbmZpZyIsIGRlZmF1bHQgPSBvcy5wYXRoLmpvaW4oImNvbmYiLCAiZG9jdW1lbnRhdGlvbi5jb25mIikgKQorCisgICAgcGFyc2VyLmFkZF9vcHRpb24oICItbyIsICItLW91dHB1dCIsIGhlbHAgPSAiT3V0cHV0IGRpcmVjdG9yeSBmb3IgaHRtbCBmaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAib3V0cHV0IiwgZGVmYXVsdCA9ICJodG1sLyIgKQorCisgICAgcGFyc2VyLmFkZF9vcHRpb24oICItRCIsICAiLS1kZWJ1ZyIsIGhlbHAgPSAiSW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gImNvdW50IiwgZGVzdCA9ICJkZWJ1ZyIsIGRlZmF1bHQgPSAwICkKKworICAgIHBhcnNlci5hZGRfb3B0aW9uKCAiLXYiLCAiLS12ZXJib3NlIiwgaGVscCA9ICJvdXRwdXQgbW9yZSBjaGl0LWNoYXIgdG8gdGhlIHRlcm1pbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gInZlcmJvc2UiLCBkZWZhdWx0ID0gRmFsc2UgKQorCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCBzeXMuYXJndiApCisgCisgICAgYmIubXNnLmluaXRfbXNnY29uZmlnKG9wdGlvbnMudmVyYm9zZSwgb3B0aW9ucy5kZWJ1ZykKKworICAgIHJldHVybiBvcHRpb25zLmNvbmZpZywgb3B0aW9ucy5vdXRwdXQKKworZGVmIG1haW4oKToKKyAgICAiIiIKKyAgICBUaGUgbWFpbiBNZXRob2QKKyAgICAiIiIKKworICAgIChjb25maWdfZmlsZSwgb3V0cHV0X2RpcikgPSBwYXJzZV9jbWRsaW5lKCBzeXMuYXJndiApCisKKyAgICAjIHJpZ2h0IHRvIGxldCB1cyBsb2FkIHRoZSBmaWxlIG5vdworICAgIHRyeToKKyAgICAgICAgZG9jdW1lbnRhdGlvbiA9IGJiLnBhcnNlLmhhbmRsZSggY29uZmlnX2ZpbGUsIGJiLmRhdGEuaW5pdCgpICkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgYmIuZmF0YWwoICJVbmFibGUgdG8gb3BlbiAlcyIgJSBjb25maWdfZmlsZSApCisgICAgZXhjZXB0IGJiLnBhcnNlLlBhcnNlRXJyb3I6CisgICAgICAgIGJiLmZhdGFsKCAiVW5hYmxlIHRvIHBhcnNlICVzIiAlIGNvbmZpZ19maWxlICkKKworICAgIGlmIGlzaW5zdGFuY2UoZG9jdW1lbnRhdGlvbiwgZGljdCk6CisgICAgICAgIGRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uWyIiXQorCisgICAgIyBBc3N1bWluZyB3ZSd2ZSB0aGUgZmlsZSBsb2FkZWQgbm93LCB3ZSB3aWxsIGluaXRpYWxpemUgdGhlICd0cmVlJworICAgIGRvYyA9IERvY3VtZW50YXRpb24oKQorCisgICAgIyBkZWZpbmVkIHN0YXRlcworICAgIHN0YXRlX2JlZ2luID0gMAorICAgIHN0YXRlX3NlZSAgID0gMQorICAgIHN0YXRlX2dyb3VwID0gMgorCisgICAgZm9yIGtleSBpbiBiYi5kYXRhLmtleXMoZG9jdW1lbnRhdGlvbik6CisgICAgICAgIGRhdGEgICA9IGRvY3VtZW50YXRpb24uZ2V0VmFyRmxhZyhrZXksICJkb2MiKQorICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgIyBUaGUgRG9jdW1lbnRhdGlvbiBub3cgc3RhcnRzCisgICAgICAgIGRvY19pbnMgPSBEb2N1bWVudGF0aW9uSXRlbSgpCisgICAgICAgIGRvY19pbnMuc2V0TmFtZShrZXkpCisKKworICAgICAgICB0b2tlbnMgPSBkYXRhLnNwbGl0KCcgJykKKyAgICAgICAgc3RhdGUgPSBzdGF0ZV9iZWdpbgorICAgICAgICBzdHJpbmc9ICIiCisgICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CisgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN0cmlwKCcsJykKKworICAgICAgICAgICAgaWYgbm90IHN0YXRlID09IHN0YXRlX3NlZSBhbmQgdG9rZW4gPT0gIkBzZWUiOgorICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVfc2VlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgbm90IHN0YXRlID09IHN0YXRlX2dyb3VwIGFuZCB0b2tlbiAgPT0gIkBncm91cCI6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZV9ncm91cAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHN0YXRlID09IHN0YXRlX2JlZ2luOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAiICVzIiAlIHRva2VuCisgICAgICAgICAgICBlbGlmIHN0YXRlID09IHN0YXRlX3NlZToKKyAgICAgICAgICAgICAgICBkb2NfaW5zLmFkZFJlbGF0aW9uKHRva2VuKQorICAgICAgICAgICAgZWxpZiBzdGF0ZSA9PSBzdGF0ZV9ncm91cDoKKyAgICAgICAgICAgICAgICBkb2NfaW5zLmFkZEdyb3VwKHRva2VuKQorCisgICAgICAgICMgc2V0IHRoZSBkZXNjcmlwdGlvbgorICAgICAgICBkb2NfaW5zLnNldERlc2NyaXB0aW9uKHN0cmluZykKKyAgICAgICAgZG9jLmluc2VydF9kb2NfaXRlbShkb2NfaW5zKQorCisgICAgIyBsZXQgdXMgY3JlYXRlIHRoZSBIVE1MIG5vdworICAgIGJiLnV0aWxzLm1rZGlyaGllcihvdXRwdXRfZGlyKQorICAgIG9zLmNoZGlyKG91dHB1dF9kaXIpCisKKyAgICAjIExldCB1cyBjcmVhdGUgdGhlIHNpdGVzIG5vdy4gV2UgZG8gaXQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcgorICAgICMgU3RhcnQgd2l0aCB0aGUgaW5kZXguaHRtbC4gSXQgd2lsbCBwb2ludCB0byBzaXRlcyBleHBsYWluaW5nIGFsbAorICAgICMga2V5cyBhbmQgZ3JvdXBzCisgICAgaHRtbF9zbGF2ZSA9IEhUTUxGb3JtYXR0ZXIoKQorCisgICAgZiA9IGZpbGUoJ3N0eWxlLmNzcycsICd3JykKKyAgICBwcmludCA+PiBmLCBodG1sX3NsYXZlLmNyZWF0ZUNTUygpCisKKyAgICBmID0gZmlsZSgnaW5kZXguaHRtbCcsICd3JykKKyAgICBwcmludCA+PiBmLCBodG1sX3NsYXZlLmNyZWF0ZUluZGV4KCkKKworICAgIGYgPSBmaWxlKCdhbGxfZ3JvdXBzLmh0bWwnLCAndycpCisgICAgcHJpbnQgPj4gZiwgaHRtbF9zbGF2ZS5jcmVhdGVHcm91cHNTaXRlKGRvYykKKworICAgIGYgPSBmaWxlKCdhbGxfa2V5cy5odG1sJywgJ3cnKQorICAgIHByaW50ID4+IGYsIGh0bWxfc2xhdmUuY3JlYXRlS2V5c1NpdGUoZG9jKQorCisgICAgIyBub3cgZm9yIGVhY2ggZ3JvdXAgY3JlYXRlIHRoZSBzaXRlCisgICAgZm9yIGdyb3VwIGluIGRvYy5ncm91cHMoKToKKyAgICAgICAgZiA9IGZpbGUoJ2dyb3VwJXMuaHRtbCcgJSBncm91cCwgJ3cnKQorICAgICAgICBwcmludCA+PiBmLCBodG1sX3NsYXZlLmNyZWF0ZUdyb3VwU2l0ZShncm91cCwgZG9jLmdyb3VwX2NvbnRlbnQoZ3JvdXApKQorCisgICAgIyBub3cgZm9yIHRoZSBrZXlzCisgICAgZm9yIGtleSBpbiBkb2MuZG9jX2tleXMoKToKKyAgICAgICAgZiA9IGZpbGUoJ2tleSVzLmh0bWwnICUgZG9jLmRvY19pdGVtKGtleSkubmFtZSgpLCAndycpCisgICAgICAgIHByaW50ID4+IGYsIGh0bWxfc2xhdmUuY3JlYXRlS2V5U2l0ZShkb2MuZG9jX2l0ZW0oa2V5KSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9iaW4vaW1hZ2Utd3JpdGVyIGIvYml0YmFrZS9iaW4vaW1hZ2Utd3JpdGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkNzExNjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi9pbWFnZS13cml0ZXIKQEAgLTAsMCArMSwxMjIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAoYykgMjAxMiBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKSwgJ2xpYicpKQordHJ5OgorICAgIGltcG9ydCBiYgorZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBleGM6CisgICAgc3lzLmV4aXQoc3RyKGV4YykpCisKK2ltcG9ydCBndGsKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IHB5Z3RrCisKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iQWx0QnV0dG9uLCBIb2JCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNtZXNzYWdlZGlhbG9nIGltcG9ydCBDcnVtYnNNZXNzYWdlRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuZGVwbG95aW1hZ2VkaWFsb2cgaW1wb3J0IERlcGxveUltYWdlRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuaW1hZ2VzZWxlY3Rpb25kaWFsb2cgaW1wb3J0IEltYWdlU2VsZWN0aW9uRGlhbG9nCisKKyMgSSBwdXQgYWxsIHRoZSBmcyBiaXRiYWtlIHN1cHBvcnRlZCBoZXJlLiBOZWVkIG1vcmUgdGVzdC4KK0RFUExPWUFCTEVfSU1BR0VfVFlQRVMgPSBbImpmZnMyIiwgImNyYW1mcyIsICJleHQyIiwgImV4dDMiLCAiZXh0NCIsICJidHJmcyIsICJzcXVhc2hmcyIsICJ1YmkiLCAidm1kayJdCitUaXRsZSA9ICJVU0IgSW1hZ2UgV3JpdGVyIgorCitjbGFzcyBEZXBsb3lXaW5kb3coZ3RrLldpbmRvdyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGltYWdlX3BhdGg9JycpOgorICAgICAgICBzdXBlcihEZXBsb3lXaW5kb3csIHNlbGYpLl9faW5pdF9fKCkKKworICAgICAgICBpZiBsZW4oaW1hZ2VfcGF0aCkgPiAwOgorICAgICAgICAgICAgdmFsaWQgPSBUcnVlCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW1hZ2VfcGF0aCk6CisgICAgICAgICAgICAgICAgdmFsaWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGxibCA9ICI8Yj5JbnZhbGlkIGltYWdlIGZpbGUgcGF0aDogJXMuPC9iPlxuUHJlc3MgPGI+U2VsZWN0IEltYWdlPC9iPiB0byBzZWxlY3QgYW4gaW1hZ2UuIiAlIGltYWdlX3BhdGgKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW1hZ2VfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChpbWFnZV9wYXRoKQorICAgICAgICAgICAgICAgIGV4dGVuZF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChpbWFnZV9wYXRoKVsxXVsxOl0KKyAgICAgICAgICAgICAgICBpZiBleHRlbmRfbmFtZSBub3QgaW4gREVQTE9ZQUJMRV9JTUFHRV9UWVBFUzoKKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBsYmwgPSAiPGI+VW5kZXBsb3lhYmxlIGltZ2UgdHlwZTogJXM8L2I+XG5QcmVzcyA8Yj5TZWxlY3QgSW1hZ2U8L2I+IHRvIHNlbGVjdCBhbiBpbWFnZS4iICUgZXh0ZW5kX25hbWUKKworICAgICAgICAgICAgaWYgbm90IHZhbGlkOgorICAgICAgICAgICAgICAgIGltYWdlX3BhdGggPSAnJworICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLlNUT0NLX0RJQUxPR19JTkZPKQorICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGNydW1ic19kaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5ydW4oKQorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cuZGVzdHJveSgpCisKKyAgICAgICAgc2VsZi5kZXBsb3lfZGlhbG9nID0gRGVwbG95SW1hZ2VEaWFsb2coVGl0bGUsIGltYWdlX3BhdGgsIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLkRJQUxPR19NT0RBTCB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19OT19TRVBBUkFUT1IsIE5vbmUsIHN0YW5kYWxvbmU9VHJ1ZSkKKyAgICAgICAgY2xvc2VfYnV0dG9uID0gc2VsZi5kZXBsb3lfZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGNsb3NlX2J1dHRvbikKKyAgICAgICAgY2xvc2VfYnV0dG9uLmNvbm5lY3QoJ2NsaWNrZWQnLCBndGsubWFpbl9xdWl0KQorCisgICAgICAgIHdyaXRlX2J1dHRvbiA9IHNlbGYuZGVwbG95X2RpYWxvZy5hZGRfYnV0dG9uKCJXcml0ZSBVU0IgaW1hZ2UiLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKHdyaXRlX2J1dHRvbikKKworICAgICAgICBzZWxmLmRlcGxveV9kaWFsb2cuY29ubmVjdCgnc2VsZWN0X2ltYWdlX2NsaWNrZWQnLCBzZWxmLnNlbGVjdF9pbWFnZV9jbGlja2VkX2NiKQorICAgICAgICBzZWxmLmRlcGxveV9kaWFsb2cuY29ubmVjdCgnZGVzdHJveScsIGd0ay5tYWluX3F1aXQpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5kZXBsb3lfZGlhbG9nLnNob3coKQorCisgICAgZGVmIHNlbGVjdF9pbWFnZV9jbGlja2VkX2NiKHNlbGYsIGRpYWxvZyk6CisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIGRpYWxvZyA9IEltYWdlU2VsZWN0aW9uRGlhbG9nKGN3ZCwgREVQTE9ZQUJMRV9JTUFHRV9UWVBFUywgVGl0bGUsIHNlbGYsIGd0ay5GSUxFX0NIT09TRVJfQUNUSU9OX1NBVkUgKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIk9wZW4iLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKworICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgaWYgbm90IGRpYWxvZy5pbWFnZV9uYW1lczoKKyAgICAgICAgICAgICAgICBsYmwgPSAiPGI+Tm8gc2VsZWN0aW9ucyBtYWRlPC9iPlxuQ2xpY2tlZCB0aGUgcmFkaW8gYnV0dG9uIHRvIHNlbGVjdCBhIGltYWdlLiIKKyAgICAgICAgICAgICAgICBjcnVtYnNfZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5TVE9DS19ESUFMT0dfSU5GTykKKyAgICAgICAgICAgICAgICBidXR0b24gPSBjcnVtYnNfZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cucnVuKCkKKyAgICAgICAgICAgICAgICBjcnVtYnNfZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBnZXQgdGhlIGZ1bGwgcGF0aCBvZiBpbWFnZQorICAgICAgICAgICAgaW1hZ2VfcGF0aCA9IG9zLnBhdGguam9pbihkaWFsb2cuaW1hZ2VfZm9sZGVyLCBkaWFsb2cuaW1hZ2VfbmFtZXNbMF0pCisgICAgICAgICAgICBzZWxmLmRlcGxveV9kaWFsb2cuc2V0X2ltYWdlX3RleHRfYnVmZmVyKGltYWdlX3BhdGgpCisgICAgICAgICAgICBzZWxmLmRlcGxveV9kaWFsb2cuc2V0X2ltYWdlX3BhdGgoaW1hZ2VfcGF0aCkKKworICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKAorICAgICAgICAgICAgICAgIHVzYWdlID0gIiIiJXByb2cgWy1oXSBbaW1hZ2VfZmlsZV0KKworJXByb2cgd3JpdGVzIGJvb3RhYmxlIGltYWdlcyB0byBVU0IgZGV2aWNlcy4gWW91IGNhbgorcHJvdmlkZSB0aGUgaW1hZ2UgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIHNlbGVjdCBpdCB1c2luZyB0aGUgR1VJLiIiIikKKworICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndikKKyAgICBpbWFnZV9maWxlID0gYXJnc1sxXSBpZiBsZW4oYXJncykgPiAxIGVsc2UgJycKKyAgICBkdyA9IERlcGxveVdpbmRvdyhpbWFnZV9maWxlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRyeToKKyAgICAgICAgbWFpbigpCisgICAgICAgIGd0ay5tYWluKCkKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoMykKZGlmZiAtLWdpdCBhL2JpdGJha2UvYmluL3RvYXN0ZXIgYi9iaXRiYWtlL2Jpbi90b2FzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxMWNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2Jpbi90b2FzdGVyCkBAIC0wLDAgKzEsMzUyIEBACisjIS9iaW4vc2gKKyMgKGMpIDIwMTMgSW50ZWwgQ29ycC4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworIyBUaGlzIHNjcmlwdCBjYW4gYmUgcnVuIGluIHR3byBtb2Rlcy4KKworIyBXaGVuIHVzZWQgd2l0aCAic291cmNlIiwgZnJvbSBhIGJ1aWxkIGRpcmVjdG9yeSwKKyMgaXQgZW5hYmxlcyB0b2FzdGVyIGV2ZW50IGxvZ2dpbmcgYW5kIHN0YXJ0cyB0aGUgYml0YmFrZSByZXNpZGVudCBzZXJ2ZXIuCisjIHVzZSBhczogIHNvdXJjZSB0b2FzdGVyIFtzdGFydHxzdG9wXSBbbm93ZWJdIFtub3VpXQorCisjIFdoZW4gaXQgaXMgY2FsbGVkIGFzIGEgc3RhbmQtYWxvbmUgc2NyaXB0LCBpdCBzdGFydHMganVzdCB0aGUKKyMgd2ViIHNlcnZlciwgYW5kIHRoZSBidWlsZGluZyBzaGFsbCBiZSBkb25lIHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2UuCisjIEFzIHNjcmlwdCwgaXQgd2lsbCBub3QgcmV0dXJuIHRvIHRoZSBjb21tYW5kIHByb21wdC4gU3RvcCB3aXRoIEN0cmwtQy4KKworIyBIZWxwZXIgZnVuY3Rpb24gdG8ga2lsbCBhIGJhY2tncm91bmQgdG9hc3RlciBkZXZlbG9wbWVudCBzZXJ2ZXIKKword2Vic2VydmVyS2lsbEFsbCgpCit7CisgICAgbG9jYWwgcGlkZmlsZQorICAgIGZvciBwaWRmaWxlIGluICR7QlVJTERESVJ9Ly50b2FzdGVybWFpbi5waWQ7IGRvCisgICAgICAgIGlmIFsgLWYgJHtwaWRmaWxlfSBdOyB0aGVuCisgICAgICAgICAgICBwaWQ9YGNhdCAke3BpZGZpbGV9YAorICAgICAgICAgICAgd2hpbGUga2lsbCAtMCAkcGlkIDI+L2Rldi9udWxsOyBkbworICAgICAgICAgICAgICAgIGtpbGwgLVNJR1RFUk0gLSRwaWQgMj4vZGV2L251bGwKKyAgICAgICAgICAgICAgICBzbGVlcCAxCisgICAgICAgICAgICAgICAgIyBLaWxsIHByb2Nlc3NlcyBpZiB0aGV5IGFyZSBzdGlsbCBydW5uaW5nIC0gbWF5IGhhcHBlbiBpbiBpbnRlcmFjdGl2ZSBzaGVsbHMKKyAgICAgICAgICAgICAgICBwcyBmdXggfCBncmVwICJweXRob24uKm1hbmFnZS5weSBydW5zZXJ2ZXIiIHwgYXdrICd7cHJpbnQgJDJ9JyB8IHhhcmdzIGtpbGwKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIHJtICAke3BpZGZpbGV9CisgICAgICAgIGZpCisgICAgZG9uZQorfQorCit3ZWJzZXJ2ZXJTdGFydEFsbCgpCit7CisgICAgIyBkbyBub3Qgc3RhcnQgaWYgdG9hc3Rlcm1haW4gcG9pbnRzIHRvIGEgdmFsaWQgcHJvY2VzcworICAgIGlmICEgY2F0ICIke0JVSUxERElSfS8udG9hc3Rlcm1haW4ucGlkIiAyPi9kZXYvbnVsbCB8IHhhcmdzIC1Je30ga2lsbCAtMCB7fSA7IHRoZW4KKyAgICAgICAgcmV0dmFsPTEKKyAgICAgICAgcm0gIiR7QlVJTERESVJ9Ly50b2FzdGVybWFpbi5waWQiCisgICAgZmkKKworICAgIHJldHZhbD0wCisgICAgaWYgWyAiJFRPQVNURVJfTUFOQUdFRCIgJz0nICcxJyBdOyB0aGVuCisgICAgICAgIHB5dGhvbiAkQkJCQVNFRElSL2xpYi90b2FzdGVyL21hbmFnZS5weSBzeW5jZGIgfHwgcmV0dmFsPTEKKyAgICBlbHNlCisgICAgICAgIHB5dGhvbiAkQkJCQVNFRElSL2xpYi90b2FzdGVyL21hbmFnZS5weSBzeW5jZGIgLS1ub2lucHV0IHx8IHJldHZhbD0xCisgICAgZmkKKyAgICBweXRob24gJEJCQkFTRURJUi9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbWlncmF0ZSBvcm0gfHwgcmV0dmFsPTIKKyAgICBpZiBbICRyZXR2YWwgLWVxIDEgXTsgdGhlbgorICAgICAgICBlY2hvICJGYWlsZWQgZGIgc3luYywgc3RvcHBpbmcgc3lzdGVtIHN0YXJ0IiAxPiYyCisgICAgZWxpZiBbICRyZXR2YWwgLWVxIDIgXTsgdGhlbgorICAgICAgICBwcmludGYgIlxuRXJyb3Igb24gbWlncmF0aW9uLCB0cnlpbmcgdG8gcmVjb3Zlci4uLiBcbiIKKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IG1pZ3JhdGUgb3JtIDAwMDFfaW5pdGlhbCAtLWZha2UKKyAgICAgICAgcmV0dmFsPTAKKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IG1pZ3JhdGUgb3JtIHx8IHJldHZhbD0xCisgICAgZmkKKyAgICBpZiBbICIkVE9BU1RFUl9NQU5BR0VEIiA9ICcxJyBdOyB0aGVuCisgICAgICAgIHB5dGhvbiAkQkJCQVNFRElSL2xpYi90b2FzdGVyL21hbmFnZS5weSBtaWdyYXRlIGJsZGNvbnRyb2wgfHwgcmV0dmFsPTEKKyAgICAgICAgcHl0aG9uICRCQkJBU0VESVIvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IGNoZWNrc2V0dGluZ3MgIC0tdHJhY2ViYWNrIHx8IHJldHZhbD0xCisgICAgZmkKKyAgICBpZiBbICRyZXR2YWwgLWVxIDAgXTsgdGhlbgorICAgICAgICBlY2hvICJTdGFydGluZyB3ZWJzZXJ2ZXIuLi4iCisgICAgICAgIHB5dGhvbiAkQkJCQVNFRElSL2xpYi90b2FzdGVyL21hbmFnZS5weSBydW5zZXJ2ZXIgIjAuMC4wLjA6JFdFQl9QT1JUIiA8L2Rldi9udWxsID4+JHtCVUlMRERJUn0vdG9hc3Rlcl93ZWIubG9nIDI+JjEgJiBlY2hvICQhID4ke0JVSUxERElSfS8udG9hc3Rlcm1haW4ucGlkCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaWYgISBjYXQgIiR7QlVJTERESVJ9Ly50b2FzdGVybWFpbi5waWQiIHwgeGFyZ3MgLUl7fSBraWxsIC0wIHt9IDsgdGhlbgorICAgICAgICAgICAgcmV0dmFsPTEKKyAgICAgICAgICAgIHJtICIke0JVSUxERElSfS8udG9hc3Rlcm1haW4ucGlkIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJXZWJzZXJ2ZXIgYWRkcmVzczogIGh0dHA6Ly8wLjAuMC4wOiRXRUJfUE9SVC8iCisgICAgICAgIGZpCisgICAgZmkKKyAgICByZXR1cm4gJHJldHZhbAorfQorCisjIEhlbHBlciBmdW5jdGlvbnMgdG8gYWRkIGEgc3BlY2lhbCBjb25maWd1cmF0aW9uIGZpbGUKKworYWRkdG9Db25maWd1cmF0aW9uKCkKK3sKKyAgICBmaWxlPSQxCisgICAgc2hpZnQKKyAgICBlY2hvICIjQ3JlYXRlZCBieSB0b2FzdGVyIHN0YXJ0IHNjcmlwdCIgPiAke0JVSUxERElSfS9jb25mLyRmaWxlCisgICAgZm9yIHZhciBpbiAiJEAiOyBkbyBlY2hvICR2YXIgPj4gJHtCVUlMRERJUn0vY29uZi8kZmlsZTsgZG9uZQorfQorCitJTlNUT1BTWVNURU09MAorCisjIGRlZmluZSB0aGUgc3RvcCBjb21tYW5kCitzdG9wX3N5c3RlbSgpCit7CisgICAgIyBwcmV2ZW50IHJlZW50cnkKKyAgICBpZiBbICRJTlNUT1BTWVNURU0gLWVxIDEgXTsgdGhlbiByZXR1cm47IGZpCisgICAgSU5TVE9QU1lTVEVNPTEKKyAgICBpZiBbIC1mICR7QlVJTERESVJ9Ly50b2FzdGVydWkucGlkIF07IHRoZW4KKyAgICAgICAga2lsbCBgY2F0ICR7QlVJTERESVJ9Ly50b2FzdGVydWkucGlkYCAyPi9kZXYvbnVsbAorICAgICAgICBybSAke0JVSUxERElSfS8udG9hc3RlcnVpLnBpZAorICAgIGZpCisgICAgQkJTRVJWRVI9MC4wLjAuMDotMSBiaXRiYWtlIC1tCisgICAgdW5zZXQgQkJTRVJWRVIKKyAgICB3ZWJzZXJ2ZXJLaWxsQWxsCisgICAgIyBmb3JjZSBzdG9wIGFueSBtaXNiZWhhdmluZyBiaXRiYWtlIHNlcnZlcgorICAgIGxzb2YgYml0YmFrZS5sb2NrIHwgYXdrICd7cHJpbnQgJDJ9JyB8IGdyZXAgIlswLTldXCsiIHwgeGFyZ3MgLW4xIC1yIGtpbGwKKyAgICB0cmFwIC0gU0lHSFVQCisgICAgI3RyYXAgLSBTSUdDSExECisgICAgSU5TVE9QU1lTVEVNPTAKK30KKworY2hlY2tfcGlkYnlmaWxlKCkgeworICAgIFsgLWUgJDEgXSAmJiBraWxsIC0wIGBjYXQgJDFgIDI+L2Rldi9udWxsCit9CisKKworbm90aWZ5X2NobGRleGl0KCkgeworICAgIGlmIFsgJE5PVE9BU1RFUlVJIC1lcSAwIF07IHRoZW4KKyAgICAgICAgY2hlY2tfcGlkYnlmaWxlICR7QlVJTERESVJ9Ly50b2FzdGVydWkucGlkICYmIHJldHVybgorICAgICAgICBzdG9wX3N5c3RlbQorICAgIGZpCit9CisKKwordmVyaWZ5X3ByZXJlcSgpIHsKKyAgICAjIFZlcmlmeSBwcmVyZXF1aXNpdGVzCisKKyAgICBpZiAhIGVjaG8gImltcG9ydCBkamFuZ287IHByaW50ICgxLCkgPT0gZGphbmdvLlZFUlNJT05bMDoxXSBhbmQgZGphbmdvLlZFUlNJT05bMToyXVswXSBpbiAoNiwpIiB8IHB5dGhvbiAyPi9kZXYvbnVsbCB8IGdyZXAgVHJ1ZSA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIHByaW50ZiAiVGhpcyBwcm9ncmFtIG5lZWRzIERqYW5nbyAxLjYuIFBsZWFzZSBpbnN0YWxsIHdpdGhcblxucGlwIGluc3RhbGwgZGphbmdvPT0xLjZcbiIKKyAgICAgICAgcmV0dXJuIDIKKyAgICBmaQorCisgICAgaWYgISBlY2hvICJpbXBvcnQgc291dGg7IHByaW50IHJlZHVjZShsYW1iZGEgeCwgeTogMiBpZiB4PT0yIGVsc2UgMCBpZiB4ID09IDAgZWxzZSB5LCBtYXAobGFtYmRhIHg6IDErY21wKHhbMV0teFswXSwwKSwgemlwKFswLDgsNF0sIG1hcChpbnQsc291dGguX192ZXJzaW9uX18uc3BsaXQoXCIuXCIpKSkpKSA+IDAiIHwgcHl0aG9uIDI+L2Rldi9udWxsIHwgZ3JlcCBUcnVlID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgcHJpbnRmICJUaGlzIHByb2dyYW0gbmVlZHMgU291dGggMC44LjQuIFBsZWFzZSBpbnN0YWxsIHdpdGhcblxucGlwIGluc3RhbGwgc291dGg9PTAuOC40XG4iCisgICAgICAgIHJldHVybiAyCisgICAgZmkKKyAgICByZXR1cm4gMAorfQorCisKKyMgcmVhZCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycworaWYgWyAtbiAiJEJBU0hfU09VUkNFIiBdIDsgdGhlbgorICAgIFRPQVNURVI9JHtCQVNIX1NPVVJDRX0KK2VsaWYgWyAtbiAiJFpTSF9OQU1FIiBdIDsgdGhlbgorICAgIFRPQVNURVI9JHsoJSk6LSV4fQorZWxzZQorICAgIFRPQVNURVI9JDAKK2ZpCisKK0JCQkFTRURJUj1gZGlybmFtZSAkVE9BU1RFUmAvLi4KKworUlVOTklORz0wCisKK05PVE9BU1RFUlVJPTAKK1dFQlNFUlZFUj0xCitUT0FTVEVSX0JSQkU9IiIKK1dFQl9QT1JUPSI4MDAwIgorTk9CUk9XU0VSPTAKKworZm9yIHBhcmFtIGluICQqOyBkbworICAgIGNhc2UgJHBhcmFtIGluCisgICAgbm91aSApCisgICAgICAgICAgICBOT1RPQVNURVJVST0xCisgICAgOzsKKyAgICBub3dlYiApCisgICAgICAgICAgICBXRUJTRVJWRVI9MAorICAgIDs7CisgICAgbm9icm93c2VyICkKKyAgICAgICAgICAgIE5PQlJPV1NFUj0xCisgICAgOzsKKyAgICBicmJlPSogKQorICAgICAgICAgICAgVE9BU1RFUl9CUkJFPSQnXG4nIlRPQVNURVJfQlJCRT1cIiIke3BhcmFtIyo9fSJcIiIKKyAgICA7OworICAgIHdlYnBvcnQ9KikKKyAgICAgICAgICAgIFdFQl9QT1JUPSIke3BhcmFtIyo9fSIKKyAgICBlc2FjCitkb25lCisKK1sgLW4gIiR7QkFTSF9TT1VSQ0V9IiBdICYmIFNSQ0ZJTEU9JHtCQVNIX1NPVVJDRX0gfHwgU1JDRklMRT0kXworCitpZiBbIGBiYXNlbmFtZSBcIiQwXCJgID0gYGJhc2VuYW1lIFwiJHtTUkNGSUxFfVwiYCBdOyB0aGVuCisgICAgIyBXZSBhcmUgY2FsbGVkIGFzIHN0YW5kYWxvbmUuIFdlIHJlZnVzZSB0byBydW4gaW4gYSBidWlsZCBlbnZpcm9ubWVudCAtIHdlIG5lZWQgdGhlIGludGVyYWN0aXZlIG1vZGUgZm9yIHRoYXQuCisgICAgIyBTdGFydCBqdXN0IHRoZSB3ZWIgc2VydmVyLCBwb2ludCB0aGUgd2ViIGJyb3dzZXIgdG8gdGhlIGludGVyZmFjZSwgYW5kIHN0YXJ0IGFueSBEamFuZ28gc2VydmljZXMuCisKKyAgICBpZiAhIHZlcmlmeV9wcmVyZXE7IHRoZW4KKyAgICAgICAgZWNobyAiRXJyb3I6IENvdWxkIG5vdCB2ZXJpZnkgdGhhdCB0aGUgbmVlZGVkIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHZpcnR1YWxlbnYgYW5kIHBpcCB0byBpbnN0YWxsIGRlcGVuZGVuY2llcyBsaXN0ZWQgaW4gdG9hc3Rlci1yZXF1aXJlbWVudHMudHh0IiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiBbIC1uICIkQlVJTERESVIiIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICJFcnJvcjogSXQgbG9va3MgbGlrZSB5b3Ugc291cmNlZCBvZS1pbml0LWJ1aWxkLWVudi4gVG9hc3RlciBjYW5ub3Qgc3RhcnQgaW4gYnVpbGQgbW9kZSBmcm9tIGFuIG9lLWNvcmUgYnVpbGQgZW52aXJvbm1lbnQuXG4gWW91IHNob3VsZCBiZSBzdGFydGluZyBUb2FzdGVyIGZyb20gYSBuZXcgdGVybWluYWwgd2luZG93LiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyBEZWZpbmUgYSBmYWtlIGJ1aWxkZGlyIHdoZXJlIG9ubHkgdGhlIHBpZCBmaWxlcyBhcmUgYWN0dWFsbHkgY3JlYXRlZC4gTm8gcmVhbCBidWlsZHMgd2lsbCB0YWtlIHBsYWNlIGhlcmUuCisgICAgQlVJTERESVI9L3RtcC90b2FzdGVyXyQkCisgICAgaWYgWyAtZCAiJEJVSUxERElSIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIlByZXZpb3VzIHRvYXN0ZXIgcnVuIGRpcmVjdG9yeSAkQlVJTERESVIgZm91bmQsIGNvd2FyZGx5IHJlZnVzaW5nIHRvIHN0YXJ0LiBQbGVhc2UgcmVtb3ZlIHRoZSBkaXJlY3Rvcnkgd2hlbiB0aGF0IHRvYXN0ZXIgaW5zdGFuY2UgaXMgb3ZlciIgMj4mMQorICAgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgbWtkaXIgLXAgIiRCVUlMRERJUiIKKworICAgIFJVTk5JTkc9MQorICAgIHRyYXBfY3RybGMoKSB7CisgICAgICAgIGVjaG8gIioqIFN0b3BwaW5nIHN5c3RlbSIKKyAgICAgICAgd2Vic2VydmVyS2lsbEFsbAorICAgICAgICBSVU5OSU5HPTAKKyAgICB9CisKKyAgICBkb19jbGVhbnVwKCkgeworICAgICAgICBmaW5kICIkQlVJTERESVIiIC10eXBlIGYgfCB4YXJncyBybQorICAgICAgICBybWRpciAiJEJVSUxERElSIgorICAgIH0KKyAgICBjbGVhbnVwKCkgeworICAgICAgICBpZiBncmVwIC1pciBlcnJvciAiJEJVSUxERElSIiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgICBpZiBncmVwIC1pcm4gIlRoYXQgcG9ydCBpcyBhbHJlYWR5IGluIHVzZSIgIiRCVUlMRERJUiI7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJZb3UgY2FuIHVzZSB0aGUgXCJ3ZWJwb3J0PVBPUlROVU1CRVJcIiBwYXJhbWV0ZXIgdG8gc3RhcnQgVG9hc3RlciBvbiBhIGRpZmZlcmVudCBwb3J0IChwb3J0ICRXRUJfUE9SVCBpcyBhbHJlYWR5IGluIHVzZSkiCisgICAgICAgICAgICAgICAgZG9fY2xlYW51cAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZiAiXG5FcnJvcnMgZm91bmQgaW4gdGhlIFRvYXN0ZXIgbG9nIGZpbGVzIHByZXNlbnQgaW4gJyRCVUlMRERJUicuIERpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkLlxuIFBsZWFzZSByZXZpZXcgdGhlIGVycm9ycyBhbmQgbm90aWZ5IHRvYXN0ZXJAeW9jdG9wcm9qZWN0Lm9yZyBvciBzdWJtaXQgYSBidWcgaHR0cHM6Ly9idWd6aWxsYS55b2N0b3Byb2plY3Qub3JnL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1Ub2FzdGVyIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiTm8gZXJyb3JzIGZvdW5kLCByZW1vdmluZyB0aGUgcnVuIGRpcmVjdG9yeSAnJEJVSUxERElSJyIKKyAgICAgICAgICAgIGRvX2NsZWFudXAKKyAgICAgICAgZmkKKyAgICB9CisgICAgVE9BU1RFUl9NQU5BR0VEPTEKKyAgICBleHBvcnQgVE9BU1RFUl9NQU5BR0VEPTEKKyAgICBpZiBbICRXRUJTRVJWRVIgLWd0IDAgXSAmJiAhIHdlYnNlcnZlclN0YXJ0QWxsOyB0aGVuCisgICAgICAgIGVjaG8gIkZhaWxlZCB0byBzdGFydCB0aGUgd2ViIHNlcnZlciwgc3RvcHBpbmciIDE+JjIKKyAgICAgICAgY2xlYW51cAorICAgICAgICBleGl0IDEKKyAgICBmaQorICAgIGlmIFsgJFdFQlNFUlZFUiAtZ3QgMCBdICYmIFsgJE5PQlJPV1NFUiAtZXEgMCBdICA7IHRoZW4KKyAgICAgICAgZWNobyAiU3RhcnRpbmcgYnJvd3Nlci4uLiIKKyAgICAgICAgeGRnLW9wZW4gaHR0cDovLzEyNy4wLjAuMTokV0VCX1BPUlQvID4vZGV2L251bGwgMj4mMSAmCisgICAgZmkKKyAgICB0cmFwIHRyYXBfY3RybGMgMgorICAgIGVjaG8gIlRvYXN0ZXIgaXMgbm93IHJ1bm5pbmcuIFlvdSBjYW4gc3RvcCBpdCB3aXRoIEN0cmwtQyIKKyAgICB3aGlsZSBbICRSVU5OSU5HIC1ndCAwIF07IGRvCisgICAgICAgIHB5dGhvbiAkQkJCQVNFRElSL2xpYi90b2FzdGVyL21hbmFnZS5weSBydW5idWlsZHMgMj4mMSB8IHRlZSAtYSAiJEJVSUxERElSL3RvYXN0ZXIubG9nIgorICAgICAgICBzbGVlcCAxCisgICAgZG9uZQorICAgIGNsZWFudXAKKyAgICBlY2hvICIqKioqIEV4aXQiCisgICAgZXhpdCAwCitmaQorCisKK2lmICEgdmVyaWZ5X3ByZXJlcTsgdGhlbgorICAgIGVjaG8gIkVycm9yOiBDb3VsZCBub3QgdmVyaWZ5IHRoYXQgdGhlIG5lZWRlZCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZC4gUGxlYXNlIHVzZSB2aXJ0dWFsZW52IGFuZCBwaXAgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXMgbGlzdGVkIGluIHRvYXN0ZXItcmVxdWlyZW1lbnRzLnR4dCIgMT4mMgorICAgIHJldHVybiAxCitmaQorCisKKyMgV2UgbWFrZSBzdXJlIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlIGN1cnJlbnQgc2hlbGwgYW5kIGluIGEgZ29vZCBlbnZpcm9ubWVudAoraWYgWyAteiAiJEJVSUxERElSIiBdIHx8ICAhIHdoaWNoIGJpdGJha2UgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorICAgIGVjaG8gIkVycm9yOiBCdWlsZCBlbnZpcm9ubWVudCBpcyBub3Qgc2V0dXAgb3IgYml0YmFrZSBpcyBub3QgaW4gcGF0aC4iIDE+JjIKKyAgICByZXR1cm4gMgorZmkKKworCisjIERldGVybWluZSB0aGUgYWN0aW9uLiBJZiBzcGVjaWZpZWQgYnkgYXJndW1lbnRzLCBmaW5lLCBpZiBub3QsIHRvZ2dsZSBpdAoraWYgWyAiJDEiID0gJ3N0YXJ0JyBdIHx8IFsgIiQxIiA9ICdzdG9wJyBdOyB0aGVuCisgICAgQ01EPSIkMSIKK2Vsc2UKKyAgICBpZiBbIC16ICIkQkJTRVJWRVIiIF07IHRoZW4KKyAgICAgICAgQ01EPSJzdGFydCIKKyAgICBlbHNlCisgICAgICAgIENNRD0ic3RvcCIKKyAgICBmaQorZmkKKworZWNobyAiVGhlIHN5c3RlbSB3aWxsICRDTUQuIgorCisjIE1ha2Ugc3VyZSBpdCdzIHNhZmUgdG8gcnVuIGJ5IGNoZWNraW5nIGJpdGJha2UgbG9jaworCitsb2NrPTEKK2lmIFsgLWUgJEJVSUxERElSL2JpdGJha2UubG9jayBdOyB0aGVuCisgICAgcHl0aG9uIC1jICJpbXBvcnQgZmNudGw7IGZjbnRsLmZsb2NrKG9wZW4oXCIkQlVJTERESVIvYml0YmFrZS5sb2NrXCIpLCBmY250bC5MT0NLX0VYfGZjbnRsLkxPQ0tfTkIpIiAyPi9kZXYvbnVsbCB8fCBsb2NrPTAKK2ZpCisKK2lmIFsgJHtDTUR9ID0gJ3N0YXJ0JyBdICYmIFsgJGxvY2sgLWVxIDAgXTsgdGhlbgorICAgIGVjaG8gIkVycm9yOiBiaXRiYWtlIGxvY2sgc3RhdGUgZXJyb3IuIEZpbGUgbG9ja3Mgc2hvdyB0aGF0IHRoZSBzeXN0ZW0gaXMgb24uIiAxPiYyCisgICAgZWNobyAiUGxlYXNlIHdhaXQgZm9yIHRoZSBjdXJyZW50IGJ1aWxkIHRvIGZpbmlzaCwgc3RvcCBhbmQgdGhlbiBzdGFydCB0aGUgc3lzdGVtIGFnYWluLiIgMT4mMgorICAgIHJldHVybiAzCitmaQorCitpZiBbICR7Q01EfSA9ICdzdGFydCcgXSAmJiBbIC1lICRCVUlMRERJUi8udG9hc3Rlcm1haW4ucGlkIF0gJiYga2lsbCAtMCBgY2F0ICRCVUlMRERJUi8udG9hc3Rlcm1haW4ucGlkYDsgdGhlbgorICAgIGVjaG8gIldhcm5pbmc6IGJpdGJha2UgYXBwZWFycyB0byBiZSBkZWFkLCBidXQgdGhlIFRvYXN0ZXIgd2ViIHNlcnZlciBpcyBydW5uaW5nLiBTb21ldGhpbmcgZmlzaHkgaXMgZ29pbmcgb24uIiAxPiYyCisgICAgZWNobyAiQ2xlYW5pbmcgdXAgdGhlIHdlYiBzZXJ2ZXIgdG8gc3RhcnQgZnJvbSBhIGNsZWFuIHNsYXRlLiIKKyAgICB3ZWJzZXJ2ZXJLaWxsQWxsCitmaQorCisKKyMgRXhlY3V0ZSB0aGUgY29tbWFuZHMKKworY2FzZSAkQ01EIGluCisgICAgc3RhcnQgKQorICAgICAgICBzdGFydF9zdWNjZXNzPTEKKyAgICAgICAgYWRkdG9Db25maWd1cmF0aW9uIHRvYXN0ZXIuY29uZiAiSU5IRVJJVCs9XCJ0b2FzdGVyIGJ1aWxkaGlzdG9yeVwiIiAkVE9BU1RFUl9CUkJFCisgICAgICAgIGlmIFsgJFdFQlNFUlZFUiAtZ3QgMCBdICYmICEgd2Vic2VydmVyU3RhcnRBbGw7IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkZhaWxlZCAke0NNRH0uIgorICAgICAgICAgICAgcmV0dXJuIDQKKyAgICAgICAgZmkKKyAgICAgICAgdW5zZXQgQkJTRVJWRVIKKyAgICAgICAgUFJFUkVBRD0iIgorICAgICAgICBpZiBbIC1lICR7QlVJTERESVJ9L2NvbmYvdG9hc3Rlci1wcmUuY29uZiBdOyB0aGVuCisgICAgICAgICAgICBybSAke0JVSUxERElSfS9jb25mL3RvYXN0ZXItcHJlLmNvbmYKKyAgICAgICAgZmkKKyAgICAgICAgYml0YmFrZSAkUFJFUkVBRCAtLXBvc3RyZWFkIGNvbmYvdG9hc3Rlci5jb25mIC0tc2VydmVyLW9ubHkgLXQgeG1scnBjIC1CIDAuMC4wLjA6MAorICAgICAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICAgICAgICAgIHN0YXJ0X3N1Y2Nlc3M9MAorICAgICAgICAgICAgZWNobyAiQml0YmFrZSBzZXJ2ZXIgc3RhcnQgZmFpbGVkIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBleHBvcnQgQkJTRVJWRVI9MC4wLjAuMDotMQorICAgICAgICAgICAgaWYgWyAkTk9UT0FTVEVSVUkgLWVxIDAgXTsgdGhlbiAgICAgICAgIyB3ZSBzdGFydCB0aGUgVE9BU1RFUlVJIG9ubHkgaWYgbm90IGluaGliaXRlZAorICAgICAgICAgICAgICAgIGJpdGJha2UgLS1vYnNlcnZlLW9ubHkgLXUgdG9hc3RlcnVpID4+JHtCVUlMRERJUn0vdG9hc3Rlcl91aS5sb2cgMj4mMSAmIGVjaG8gJCEgPiR7QlVJTERESVJ9Ly50b2FzdGVydWkucGlkCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICBpZiBbICRzdGFydF9zdWNjZXNzIC1lcSAxIF07IHRoZW4KKyAgICAgICAgICAgICMgc2V0IGZhaWwgc2FmZSBzdG9wIHN5c3RlbSBvbiB0ZXJtaW5hbCBleGl0CisgICAgICAgICAgICB0cmFwIHN0b3Bfc3lzdGVtIFNJR0hVUAorICAgICAgICAgICAgZWNobyAiU3VjY2Vzc2Z1bCAke0NNRH0uIgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBmYWlsZWQgc3RhcnQsIGRvIHN0b3AKKyAgICAgICAgICAgIHN0b3Bfc3lzdGVtCisgICAgICAgICAgICBlY2hvICJGYWlsZWQgJHtDTUR9LiIKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGZpCisgICAgICAgICMgc3RvcCBzeXN0ZW0gb24gdGVybWluYWwgZXhpdAorICAgICAgICBzZXQgLW8gbW9uaXRvcgorICAgICAgICB0cmFwIHN0b3Bfc3lzdGVtIFNJR0hVUAorICAgICAgICAjdHJhcCBub3RpZnlfY2hsZGV4aXQgU0lHQ0hMRAorICAgIDs7CisgICAgc3RvcCApCisgICAgICAgIHN0b3Bfc3lzdGVtCisgICAgICAgIGVjaG8gIlN1Y2Nlc3NmdWwgJHtDTUR9LiIKKyAgICA7OworZXNhYworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2Jpbi90b2FzdGVyLWV2ZW50cmVwbGF5IGIvYml0YmFrZS9iaW4vdG9hc3Rlci1ldmVudHJlcGxheQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTVhN2FlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9iaW4vdG9hc3Rlci1ldmVudHJlcGxheQpAQCAtMCwwICsxLDE3NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgICAgICAgIEFsZXggRGFtaWFuCisjCisjIFRoaXMgZmlsZSByZS11c2VzIGNvZGUgc3ByZWFkIHRocm91Z2hvdXQgb3RoZXIgQml0YmFrZSBzb3VyY2UgZmlsZXMuCisjIEFzIHN1Y2gsIGFsbCBvdGhlciBjb3B5cmlnaHRzIGJlbG9uZyB0byB0aGVpciBvd24gcmlnaHQgaG9sZGVycy4KKyMKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworIyBUaGlzIGNvbW1hbmQgdGFrZXMgYSBmaWxlbmFtZSBhcyBhIHNpbmdsZSBwYXJhbWV0ZXIuIFRoZSBmaWxlbmFtZSBpcyByZWFkCisjIGFzIGEgYnVpbGQgZXZlbnRsb2csIGFuZCB0aGUgVG9hc3RlclVJIGlzIHVzZWQgdG8gcHJvY2VzcyBldmVudHMgaW4gdGhlIGZpbGUKKyMgYW5kIGxvZyBkYXRhIGluIHRoZSBkYXRhYmFzZQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMsIGxvZ2dpbmcKKworIyBtYW5nbGUgc3lzcGF0aCB0byBhbGxvdyBlYXN5IGltcG9ydCBvZiBtb2R1bGVzCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGliJykpCisKKworaW1wb3J0IGJiLmNvb2tlcgorZnJvbSBiYi51aSBpbXBvcnQgdG9hc3RlcnVpCitpbXBvcnQgc3lzCitpbXBvcnQgbG9nZ2luZworCitpbXBvcnQganNvbiwgcGlja2xlCisKKworY2xhc3MgRmlsZVJlYWRFdmVudHNTZXJ2ZXJDb25uZWN0aW9uKCk6CisgICAgIiIiICBFbXVsYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBiaXRiYWtlIHNlcnZlciB0aGF0IGZlZWRzCisgICAgICAgIGV2ZW50cyBjb21pbmcgYWN0dWFsbHkgcmVhZCBmcm9tIGEgc2F2ZWQgbG9nIGZpbGUuCisgICAgIiIiCisKKyAgICBjbGFzcyBNb2NrQ29ubmVjdGlvbigpOgorICAgICAgICAiIiIgZmlsbC1pbiBmb3IgdGhlIHByb3h5IHRvIHRoZSBzZXJ2ZXIuIHdlIGp1c3QgcmV0dXJuIGdlbmVyaWMgZGF0YQorICAgICAgICAiIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjKToKKyAgICAgICAgICAgIHNlbGYuX3NjID0gc2MKKworICAgICAgICBkZWYgcnVuQ29tbWFuZChzZWxmLCBjb21tYW5kQXJyYXkpOgorICAgICAgICAgICAgIiIiIGVtdWxhdGVzIHJ1bm5pbmcgYSBjb21tYW5kIG9uIHRoZSBzZXJ2ZXI7IG9ubHkgcmVhZC1vbmx5IGNvbW1hbmRzIGFyZSBhY2NlcHRlZCAiIiIKKyAgICAgICAgICAgIGNvbW1hbmRfbmFtZSA9IGNvbW1hbmRBcnJheVswXQorCisgICAgICAgICAgICBpZiBjb21tYW5kX25hbWUgPT0gImdldFZhcmlhYmxlIjoKKyAgICAgICAgICAgICAgICBpZiBjb21tYW5kQXJyYXlbMV0gaW4gc2VsZi5fc2MuX3ZhcmlhYmxlczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9zYy5fdmFyaWFibGVzW2NvbW1hbmRBcnJheVsxXV1bJ3YnXSwgTm9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5vbmUsICJNaXNzaW5nIHZhcmlhYmxlIikKKworICAgICAgICAgICAgZWxpZiBjb21tYW5kX25hbWUgPT0gImdldEFsbEtleXNXaXRoRmxhZ3MiOgorICAgICAgICAgICAgICAgIGR1bXAgPSB7fQorICAgICAgICAgICAgICAgIGZsYWdsaXN0ID0gY29tbWFuZEFycmF5WzFdCisgICAgICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5fc2MuX3ZhcmlhYmxlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBrLnN0YXJ0c3dpdGgoIl9fIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHNlbGYuX3NjLl92YXJpYWJsZXNba11bJ3YnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBba10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JyA6IHYgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGlzdG9yeScgOiBzZWxmLl9zYy5fdmFyaWFibGVzW2tdWydoaXN0b3J5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkIGluIGZsYWdsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wW2tdW2RdID0gc2VsZi5fc2MuX3ZhcmlhYmxlc1trXVtkXQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludChlKQorICAgICAgICAgICAgICAgIHJldHVybiAoZHVtcCwgTm9uZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDb21tYW5kICVzIG5vdCBpbXBsZW1lbnRlZCIgJSBjb21tYW5kQXJyYXlbMF0pCisKKyAgICAgICAgZGVmIHRlcm1pbmF0ZVNlcnZlcihzZWxmKToKKyAgICAgICAgICAgICIiIiBkbyBub3QgZG8gYW55dGhpbmcgIiIiCisgICAgICAgICAgICBwYXNzCisKKworCisgICAgY2xhc3MgRXZlbnRSZWFkZXIoKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjKToKKyAgICAgICAgICAgIHNlbGYuX3NjID0gc2MKKyAgICAgICAgICAgIHNlbGYuZmlyc3RyYWlzZSA9IDAKKworICAgICAgICBkZWYgX2NyZWF0ZV9ldmVudChzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIGRlZiBfaW1wb3J0X2NsYXNzKG5hbWUpOgorICAgICAgICAgICAgICAgIGFzc2VydCBsZW4obmFtZSkgPiAwCisgICAgICAgICAgICAgICAgYXNzZXJ0ICIuIiBpbiBuYW1lLCBuYW1lCisKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzID0gbmFtZS5zdHJpcCgpLnNwbGl0KCIuIikKKyAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gIi4iLmpvaW4oY29tcG9uZW50c1s6LTFdKQorICAgICAgICAgICAgICAgIG1vZHVsZWtsYXNzID0gY29tcG9uZW50c1stMV0KKworICAgICAgICAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSwgZnJvbWxpc3Q9W3N0cihtb2R1bGVrbGFzcyldKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgbW9kdWxla2xhc3MpCisKKyAgICAgICAgICAgICMgd2UgYnVpbGQgYSB0b2FzdGVyIGV2ZW50IG91dCBvZiBjdXJyZW50IGV2ZW50IGxvZyBsaW5lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXZlbnRfZGF0YSA9IGpzb24ubG9hZHMobGluZS5zdHJpcCgpKQorICAgICAgICAgICAgICAgIGV2ZW50X2NsYXNzID0gX2ltcG9ydF9jbGFzcyhldmVudF9kYXRhWydjbGFzcyddKQorICAgICAgICAgICAgICAgIGV2ZW50X29iamVjdCA9IHBpY2tsZS5sb2Fkcyhqc29uLmxvYWRzKGV2ZW50X2RhdGFbJ3ZhcnMnXSkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHByaW50KCJGYWlsZWQgbG9hZGluZyAiLCBsaW5lKQorICAgICAgICAgICAgICAgIHJhaXNlIGUKKworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXZlbnRfb2JqZWN0LCBldmVudF9jbGFzcyk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFcnJvciBsb2FkaW5nIG9iamVjdHMgJXMgY2xhc3MgJXMgIiwgZXZlbnRfb2JqZWN0LCBldmVudF9jbGFzcykKKworICAgICAgICAgICAgcmV0dXJuIGV2ZW50X29iamVjdAorCisgICAgICAgIGRlZiB3YWl0RXZlbnQoc2VsZiwgdGltZW91dCk6CisKKyAgICAgICAgICAgIG5leHRsaW5lID0gc2VsZi5fc2MuX2V2ZW50ZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsZW4obmV4dGxpbmUpID09IDA6CisgICAgICAgICAgICAgICAgIyB0aGUgYnVpbGQgZGF0YSBlbmRlZCwgd2hpbGUgdG9hc3RlcnVpIHN0aWxsIHdhaXRzIGZvciBldmVudHMuCisgICAgICAgICAgICAgICAgIyB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgc2VydmVyIHdhcyBhYnJ1cHRseSBzdG9wcGVkLCBzbyB3ZSBzaW11bGF0ZSB0aGlzCisgICAgICAgICAgICAgICAgc2VsZi5maXJzdHJhaXNlICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZpcnN0cmFpc2UgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3NjLmxpbmVubyArPSAxCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2V2ZW50KG5leHRsaW5lKQorCisKKyAgICBkZWYgX3JlYWRWYXJpYWJsZXMoc2VsZiwgdmFyaWFibGVsaW5lKToKKyAgICAgICAgc2VsZi5fdmFyaWFibGVzID0ganNvbi5sb2Fkcyh2YXJpYWJsZWxpbmUuc3RyaXAoKSlbJ2FsbHZhcmlhYmxlcyddCisKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlX25hbWUpOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBGaWxlUmVhZEV2ZW50c1NlcnZlckNvbm5lY3Rpb24uTW9ja0Nvbm5lY3Rpb24oc2VsZikKKyAgICAgICAgc2VsZi5fZXZlbnRmaWxlID0gb3BlbihmaWxlX25hbWUsICJyIikKKworICAgICAgICAjIHdlIGV4cGVjdCB0byBoYXZlIHRoZSB2YXJpYWJsZSBkdW1wIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZQorICAgICAgICBzZWxmLmxpbmVubyA9IDEKKyAgICAgICAgc2VsZi5fcmVhZFZhcmlhYmxlcyhzZWxmLl9ldmVudGZpbGUucmVhZGxpbmUoKSkKKworICAgICAgICBzZWxmLmV2ZW50cyA9IEZpbGVSZWFkRXZlbnRzU2VydmVyQ29ubmVjdGlvbi5FdmVudFJlYWRlcihzZWxmKQorCisKKworCisKK2NsYXNzIE1vY2tDb25maWdQYXJhbWV0ZXJzKCk6CisgICAgIiIiIHN0YW5kLWluIGZvciBjb29rZXJkYXRhLkNvbmZpZ1BhcmFtZXRlcnM7IGFzIHdlIGRvbid0IHJlYWxseSBjb25maWcgYSBjb29rZXIsIHRoaXMKKyAgICAgICAgc2VydmVzIGp1c3QgdG8gc3VwcGx5IG5lZWRlZCBpbnRlcmZhY2VzIGZvciB0aGUgdG9hc3RlciB1aSB0byB3b3JrICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5vYnNlcnZlX29ubHkgPSBUcnVlICAgICAgICAgICAgIyB3ZSBjYW4gb25seSByZWFkIGZpbGVzCisKKworIyBydW4gdG9hc3RlciB1aSBvbiBvdXIgbW9jayBiaXRiYWtlIGNsYXNzCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICBwcmludCgiVXNhZ2U6ICVzIGV2ZW50LmxvZyAiICUgc3lzLmFyZ3ZbMF0pCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBmaWxlX25hbWUgPSBzeXMuYXJndlstMV0KKyAgICBtb2NrX2Nvbm5lY3Rpb24gPSBGaWxlUmVhZEV2ZW50c1NlcnZlckNvbm5lY3Rpb24oZmlsZV9uYW1lKQorICAgIGNvbmZpZ1BhcmFtcyA9IE1vY2tDb25maWdQYXJhbWV0ZXJzKCkKKworICAgICMgcnVuIHRoZSBtYWluIHByb2dyYW0gYW5kIHNldCBleGl0IGNvZGUgdG8gdGhlIHJldHVybmVkIHZhbHVlCisgICAgc3lzLmV4aXQodG9hc3RlcnVpLm1haW4obW9ja19jb25uZWN0aW9uLmNvbm5lY3Rpb24sIG1vY2tfY29ubmVjdGlvbi5ldmVudHMsIGNvbmZpZ1BhcmFtcykpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvUkVBRE1FIGIvYml0YmFrZS9jb250cmliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWU1MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9jb250cmliL1JFQURNRQpAQCAtMCwwICsxIEBACitUaGlzIGRpcmVjdG9yeSBpcyBmb3IgYWRkaXRpb25hbCBjb250cmlidXRlZCBmaWxlcyB3aGljaCBtYXkgYmUgdXNlZnVsLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9jb250cmliL2JiZGV2LnNoIGIvYml0YmFrZS9jb250cmliL2JiZGV2LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTc4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2NvbnRyaWIvYmJkZXYuc2gKQEAgLTAsMCArMSwzMSBAQAorIyBUaGlzIGlzIGEgc2hlbGwgZnVuY3Rpb24gdG8gYmUgc291cmNlZCBpbnRvIHlvdXIgc2hlbGwgb3IgcGxhY2VkIGluIHlvdXIgLnByb2ZpbGUsCisjIHdoaWNoIG1ha2VzIHNldHRpbmcgdGhpbmdzIHVwIGZvciBCaXRCYWtlIGEgYml0IGVhc2llci4KKyMKKyMgVGhlIGF1dGhvciBkaXNjbGFpbXMgY29weXJpZ2h0IHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYW5kIHBsYWNlcyBpdCBpbiB0aGUKKyMgcHVibGljIGRvbWFpbi4KKworYmJkZXYgKCkgeworCWxvY2FsIEJCRElSIFBLR0RJUiBCVUlMRERJUgorCWlmIHRlc3QgeCIkMSIgPSAieC0taGVscCI7IHRoZW4gZWNobyA+JjIgInN5bnRheDogYmJkZXYgW2JiZGlyIFtwa2dkaXIgW2J1aWxkZGlyXV1dIjsgcmV0dXJuIDE7IGZpCisJaWYgdGVzdCB4IiQxIiA9IHg7IHRoZW4gQkJESVI9YHB3ZGA7IGVsc2UgQkJESVI9JDE7IGZpCisJaWYgdGVzdCB4IiQyIiA9IHg7IHRoZW4gUEtHRElSPWBwd2RgOyBlbHNlIFBLR0RJUj0kMjsgZmkKKwlpZiB0ZXN0IHgiJDMiID0geDsgdGhlbiBCVUlMRERJUj1gcHdkYDsgZWxzZSBCVUlMRERJUj0kMzsgZmkKKworCUJCRElSPWByZWFkbGluayAtZiAkQkJESVJgCisJUEtHRElSPWByZWFkbGluayAtZiAkUEtHRElSYAorCUJVSUxERElSPWByZWFkbGluayAtZiAkQlVJTERESVJgCisJaWYgISAodGVzdCAtZCAkQkJESVIgJiYgdGVzdCAtZCAkUEtHRElSICYmIHRlc3QgLWQgJEJVSUxERElSKTsgdGhlbgorCQllY2hvID4mMiAic3ludGF4OiBiYmRldiBbYmJkaXIgW3BrZ2RpciBbYnVpbGRkaXJdXV0iCisJCXJldHVybiAxCisJZmkKKwkKKwlQQVRIPSRCQkRJUi9iaW46JFBBVEgKKwlCQlBBVEg9JEJCRElSCisJaWYgdGVzdCB4IiRCQkRJUiIgIT0geCIkUEtHRElSIjsgdGhlbgorCQlCQlBBVEg9JFBLR0RJUjokQkJQQVRICisJZmkKKwlpZiB0ZXN0IHgiJFBLR0RJUiIgIT0geCIkQlVJTERESVIiOyB0aGVuCisJCUJCUEFUSD0kQlVJTERESVI6JEJCUEFUSAorCWZpCisJZXhwb3J0IEJCUEFUSAorfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9jb250cmliL2R1bXBfY2FjaGUucHkgYi9iaXRiYWtlL2NvbnRyaWIvZHVtcF9jYWNoZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMWYyMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9jb250cmliL2R1bXBfY2FjaGUucHkKQEAgLTAsMCArMSw2OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgV2luZCBSaXZlciBTeXN0ZW1zLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisjCisjIFRoaXMgaXMgdXNlZCBmb3IgZHVtcGluZyB0aGUgYmJfY2FjaGUuZGF0LCB0aGUgb3V0cHV0IGZvcm1hdCBpczoKKyMgcmVjaXBlX3BhdGggUE4gUFYgUEFDS0FHRVMKKyMKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCisKKyMgRm9yIGltcG9ydGluZyBiYi5jYWNoZQorc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSksICcuLi9saWInKSkKK2Zyb20gYmIuY2FjaGUgaW1wb3J0IENvcmVSZWNpcGVJbmZvCisKK2ltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorCitkZWYgbWFpbihhcmd2PU5vbmUpOgorICAgICIiIgorICAgIEdldCB0aGUgbWFwcGluZyBmb3IgdGhlIHRhcmdldCByZWNpcGUuCisgICAgIiIiCisgICAgaWYgbGVuKGFyZ3YpICE9IDE6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkVycm9yLCBuZWVkIG9uZSBhcmd1bWVudCEiCisgICAgICAgIHJldHVybiAyCisKKyAgICBjYWNoZWZpbGUgPSBhcmd2WzBdCisKKyAgICB3aXRoIG9wZW4oY2FjaGVmaWxlLCAicmIiKSBhcyBjYWNoZWZpbGU6CisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuVW5waWNrbGVyKGNhY2hlZmlsZSkKKyAgICAgICAgd2hpbGUgY2FjaGVmaWxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGtleSA9IHBpY2tsZWQubG9hZCgpCisgICAgICAgICAgICAgICAgdmFsID0gcGlja2xlZC5sb2FkKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBDb3JlUmVjaXBlSW5mbykgYW5kIChub3QgdmFsLnNraXBwZWQpOgorICAgICAgICAgICAgICAgIHBuID0gdmFsLnBuCisgICAgICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IHRoZSBuYXRpdmUgcmVjaXBlcy4KKyAgICAgICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aCgndmlydHVhbDpuYXRpdmU6Jykgb3IgcG4uZW5kc3dpdGgoIi1uYXRpdmUiKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgMS4wIGlzIHRoZSBkZWZhdWx0IHZlcnNpb24gZm9yIGEgbm8gUFYgcmVjaXBlLgorICAgICAgICAgICAgICAgIGlmIHZhbC5fX2RpY3RfXy5oYXNfa2V5KCJwdiIpOgorICAgICAgICAgICAgICAgICAgICBwdiA9IHZhbC5wdgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHB2ID0gIjEuMCIKKworICAgICAgICAgICAgICAgIHByaW50KCIlcyAlcyAlcyAlcyIgJSAoa2V5LCBwbiwgcHYsICcgJy5qb2luKHZhbC5wYWNrYWdlcykpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9jb250cmliL3ZpbS9mdGRldGVjdC9iaXRiYWtlLnZpbSBiL2JpdGJha2UvY29udHJpYi92aW0vZnRkZXRlY3QvYml0YmFrZS52aW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZjhhZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvY29udHJpYi92aW0vZnRkZXRlY3QvYml0YmFrZS52aW0KQEAgLTAsMCArMSwyNCBAQAorIiBWaW0gZmlsZXR5cGUgZGV0ZWN0aW9uIGZpbGUKKyIgTGFuZ3VhZ2U6ICAgICBCaXRCYWtlCisiIEF1dGhvcjogICAgICAgUmljYXJkbyBTYWx2ZXRpIDxyc2FsdmV0aUByc2FsdmV0aS5uZXQ+CisiIENvcHlyaWdodDogICAgQ29weXJpZ2h0IChDKSAyMDA4ICBSaWNhcmRvIFNhbHZldGkgPHJzYWx2ZXRpQHJzYWx2ZXRpLm5ldD4KKyIgTGljZW5jZTogICAgICBZb3UgbWF5IHJlZGlzdHJpYnV0ZSB0aGlzIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFZpbSBpdHNlbGYKKyIKKyIgVGhpcyBzZXRzIHVwIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciBCaXRCYWtlIGZpbGVzLCBsaWtlIC5iYiwgLmJiY2xhc3MgYW5kIC5pbmMKKworaWYgJmNvbXBhdGlibGUgfHwgdmVyc2lvbiA8IDYwMAorICAgIGZpbmlzaAorZW5kaWYKKworIiAuYmIsIC5iYmFwcGVuZCBhbmQgLmJiY2xhc3MKK2F1IEJ1Zk5ld0ZpbGUsQnVmUmVhZCAqLntiYixiYmFwcGVuZCxiYmNsYXNzfQlzZXQgZmlsZXR5cGU9Yml0YmFrZQorCisiIC5pbmMKK2F1IEJ1Zk5ld0ZpbGUsQnVmUmVhZCAqLmluYwkJc2V0IGZpbGV0eXBlPWJpdGJha2UKKworIiAuY29uZgorYXUgQnVmTmV3RmlsZSxCdWZSZWFkICouY29uZgorICAgIFwgaWYgKG1hdGNoKGV4cGFuZCgiJTpwOmgiKSwgImNvbmYiKSA+IDApIHwKKyAgICBcICAgICBzZXQgZmlsZXR5cGU9Yml0YmFrZSB8CisgICAgXCBlbmRpZgorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2NvbnRyaWIvdmltL2Z0cGx1Z2luL2JpdGJha2UudmltIGIvYml0YmFrZS9jb250cmliL3ZpbS9mdHBsdWdpbi9iaXRiYWtlLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjBkNzUzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9jb250cmliL3ZpbS9mdHBsdWdpbi9iaXRiYWtlLnZpbQpAQCAtMCwwICsxLDIgQEAKK3NldCBzdHM9NCBzdz00IGV0CitzZXQgY21zPSMlcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9jb250cmliL3ZpbS9wbHVnaW4vbmV3YmIudmltIGIvYml0YmFrZS9jb250cmliL3ZpbS9wbHVnaW4vbmV3YmIudmltCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3NGUzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2NvbnRyaWIvdmltL3BsdWdpbi9uZXdiYi52aW0KQEAgLTAsMCArMSw4NCBAQAorIiBWaW0gcGx1Z2luIGZpbGUKKyIgUHVycG9zZToJQ3JlYXRlIGEgdGVtcGxhdGUgZm9yIG5ldyBiYiBmaWxlcworIiBBdXRob3I6CVJpY2FyZG8gU2FsdmV0aSA8cnNhbHZldGlAZ21haWwuY29tPgorIiBDb3B5cmlnaHQ6CUNvcHlyaWdodCAoQykgMjAwOCBSaWNhcmRvIFNhbHZldGkgPHJzYWx2ZXRpQGdtYWlsLmNvbT4KKyIKKyIgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIENPUFlJTkcuTUlUIGluCisiIHRoaXMgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHRlcm1zLgorIgorIiBCYXNlZCBvbiB0aGUgZ2VudG9vLXN5bnRheCBwYWNrYWdlCisiCisiIFdpbGwgdHJ5IHRvIHVzZSBnaXQgdG8gZmluZCB0aGUgdXNlciBuYW1lIGFuZCBlbWFpbAorCitpZiAmY29tcGF0aWJsZSB8fCB2OnZlcnNpb24gPCA2MDAKKyAgICBmaW5pc2gKK2VuZGlmCisKK2Z1biEgPFNJRD5HZXRVc2VyTmFtZSgpCisgICAgbGV0IGw6dXNlcl9uYW1lID0gc3lzdGVtKCJnaXQgY29uZmlnIC0tZ2V0IHVzZXIubmFtZSIpCisgICAgaWYgdjpzaGVsbF9lcnJvcgorICAgICAgICByZXR1cm4gIlVua25vd24gVXNlciIKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBzdWJzdGl0dXRlKGw6dXNlcl9uYW1lLCAiXG4iLCAiIiwgIiIpCitlbmRmdW4KKworZnVuISA8U0lEPkdldFVzZXJFbWFpbCgpCisgICAgbGV0IGw6dXNlcl9lbWFpbCA9IHN5c3RlbSgiZ2l0IGNvbmZpZyAtLWdldCB1c2VyLmVtYWlsIikKKyAgICBpZiB2OnNoZWxsX2Vycm9yCisgICAgICAgIHJldHVybiAidW5rbm93QHVzZXIub3JnIgorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUobDp1c2VyX2VtYWlsLCAiXG4iLCAiIiwgIiIpCitlbmRmdW4KKworZnVuISBCQkhlYWRlcigpCisgICAgbGV0IGw6Y3VycmVudF95ZWFyID0gc3RyZnRpbWUoIiVZIikKKyAgICBsZXQgbDp1c2VyX25hbWUgPSA8U0lEPkdldFVzZXJOYW1lKCkKKyAgICBsZXQgbDp1c2VyX2VtYWlsID0gPFNJRD5HZXRVc2VyRW1haWwoKQorICAgIDAgcHV0ID0nIyBDb3B5cmlnaHQgKEMpICcgLiBsOmN1cnJlbnRfeWVhciAuCisgICAgICAgICAgICAgICAgXCAnICcgLiBsOnVzZXJfbmFtZSAuICcgPCcgLiBsOnVzZXJfZW1haWwgLiAnPicKKyAgICBwdXQgPScjIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAoc2VlIENPUFlJTkcuTUlUIGZvciB0aGUgdGVybXMpJworICAgICQKK2VuZGZ1bgorCitmdW4hIE5ld0JCVGVtcGxhdGUoKQorICAgIGxldCBsOnBhc3RlID0gJnBhc3RlCisgICAgc2V0IG5vcGFzdGUKKyAgICAKKyAgICAiIEdldCB0aGUgaGVhZGVyCisgICAgY2FsbCBCQkhlYWRlcigpCisKKyAgICAiIE5ldyB0aGUgYmIgdGVtcGxhdGUKKyAgICBwdXQgPSdERVNDUklQVElPTiA9IFwiXCInCisgICAgcHV0ID0nSE9NRVBBR0UgPSBcIlwiJworICAgIHB1dCA9J0xJQ0VOU0UgPSBcIlwiJyAKKyAgICBwdXQgPSdTRUNUSU9OID0gXCJcIicKKyAgICBwdXQgPSdERVBFTkRTID0gXCJcIicKKyAgICBwdXQgPScnCisgICAgcHV0ID0nU1JDX1VSSSA9IFwiXCInCisKKyAgICAiIEdvIHRvIHRoZSBmaXJzdCBwbGFjZSB0byBlZGl0CisgICAgMAorICAgIC9eREVTQ1JJUFRJT04gPS8KKyAgICBleGVjICJub3JtYWwgMmZcIiIKKworICAgIGlmIHBhc3RlID09IDEKKyAgICAgICAgc2V0IHBhc3RlCisgICAgZW5kaWYKK2VuZGZ1bgorCitpZiAhZXhpc3RzKCJnOmJiX2NyZWF0ZV9vbl9lbXB0eSIpCisgICAgbGV0IGc6YmJfY3JlYXRlX29uX2VtcHR5ID0gMQorZW5kaWYKKworIiBkaXNhYmxlIGluIGNhc2Ugb2YgdmltZGlmZgoraWYgdjpwcm9nbmFtZSA9fiAidmltZGlmZiIKKyAgICBsZXQgZzpiYl9jcmVhdGVfb25fZW1wdHkgPSAwCitlbmRpZgorCithdWdyb3VwIE5ld0JCCisgICAgYXUgQnVmTmV3RmlsZSAqLmJiCisgICAgICAgICAgICAgICAgXCBpZiBnOmJiX2NyZWF0ZV9vbl9lbXB0eSB8CisgICAgICAgICAgICAgICAgXCAgICBjYWxsIE5ld0JCVGVtcGxhdGUoKSB8CisgICAgICAgICAgICAgICAgXCBlbmRpZgorYXVncm91cCBFTkQKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9jb250cmliL3ZpbS9zeW50YXgvYml0YmFrZS52aW0gYi9iaXRiYWtlL2NvbnRyaWIvdmltL3N5bnRheC9iaXRiYWtlLnZpbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU1ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9jb250cmliL3ZpbS9zeW50YXgvYml0YmFrZS52aW0KQEAgLTAsMCArMSwxMjYgQEAKKyIgVmltIHN5bnRheCBmaWxlCisiIExhbmd1YWdlOiAgICAgQml0QmFrZSBiYi9iYmNsYXNzZXMvaW5jCisiIEF1dGhvcjogICAgICAgQ2hyaXMgTGFyc29uIDxrZXJnb3RoQGhhbmRoZWxkcy5vcmc+CisiICAgICAgICAgICAgICAgUmljYXJkbyBTYWx2ZXRpIDxyc2FsdmV0aUByc2FsdmV0aS5uZXQ+CisiIENvcHlyaWdodDogICAgQ29weXJpZ2h0IChDKSAyMDA0ICBDaHJpcyBMYXJzb24gPGtlcmdvdGhAaGFuZGhlbGRzLm9yZz4KKyIgICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDggIFJpY2FyZG8gU2FsdmV0aSA8cnNhbHZldGlAcnNhbHZldGkubmV0PgorIgorIiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgQ09QWUlORy5NSVQgaW4KKyIgdGhpcyBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvciB0aGUgdGVybXMuCisiCisiIFN5bnRheCBoaWdobGlnaHRpbmcgZm9yIGJiLCBiYmNsYXNzZXMgYW5kIGluYyBmaWxlcy4KKyIKKyIgSXQncyBhbiBlbnRpcmVseSBuZXcgdHlwZSwganVzdCBoYXMgc3BlY2lmaWMgc3ludGF4IGluIHNoZWxsIGFuZCBweXRob24gY29kZQorCitpZiAmY29tcGF0aWJsZSB8fCB2OnZlcnNpb24gPCA2MDAKKyAgICBmaW5pc2gKK2VuZGlmCitpZiBleGlzdHMoImI6Y3VycmVudF9zeW50YXgiKQorICAgIGZpbmlzaAorZW5kaWYKKworc3luIGluY2x1ZGUgQHB5dGhvbiBzeW50YXgvcHl0aG9uLnZpbQoraWYgZXhpc3RzKCJiOmN1cnJlbnRfc3ludGF4IikKKyAgdW5sZXQgYjpjdXJyZW50X3N5bnRheAorZW5kaWYKKworIiBCaXRCYWtlIHN5bnRheAorCisiIE1hdGNoaW5nIGNhc2UKK3N5biBjYXNlIG1hdGNoCisKKyIgSW5kaWNhdGVzIHRoZSBlcnJvciB3aGVuIG5vdGhpbmcgaXMgbWF0Y2hlZAorc3luIG1hdGNoIGJiVW5tYXRjaGVkICAgICAgICAgICAiLiIKKworIiBDb21tZW50cworc3luIGNsdXN0ZXIgYmJDb21tZW50R3JvdXAgICAgICBjb250YWlucz1iYlRvZG8sQFNwZWxsCitzeW4ga2V5d29yZCBiYlRvZG8gICAgICAgICAgICAgIENPTUJBSyBGSVhNRSBUT0RPIFhYWCBjb250YWluZWQKK3N5biBtYXRjaCBiYkNvbW1lbnQgICAgICAgICAgICAgIiMuKiQiIGNvbnRhaW5zPUBiYkNvbW1lbnRHcm91cAorCisiIFN0cmluZyBoZWxwZXJzCitzeW4gbWF0Y2ggYmJRdW90ZSAgICAgICAgICAgICAgICtbJyJdKyBjb250YWluZWQgCitzeW4gbWF0Y2ggYmJEZWxpbWl0ZXIgICAgICAgICAgICJbKCl7fT1dIiBjb250YWluZWQKK3N5biBtYXRjaCBiYkFycmF5QnJhY2tldHMgICAgICAgIltcW1xdXSIgY29udGFpbmVkCisKKyIgQml0QmFrZSBzdHJpbmdzCitzeW4gbWF0Y2ggYmJDb250aW51ZSAgICAgICAgICAgICJcXCQiCitzeW4gcmVnaW9uIGJiU3RyaW5nICAgICAgICAgICAgIG1hdGNoZ3JvdXA9YmJRdW90ZSBzdGFydD0rIisgc2tpcD0rXFwkKyBlbmQ9KyIrIGNvbnRhaW5lZCBjb250YWlucz1iYlRvZG8sYmJDb250aW51ZSxiYlZhckRlcmVmLGJiVmFyUHlWYWx1ZSxAU3BlbGwKK3N5biByZWdpb24gYmJTdHJpbmcgICAgICAgICAgICAgbWF0Y2hncm91cD1iYlF1b3RlIHN0YXJ0PSsnKyBza2lwPStcXCQrIGVuZD0rJysgY29udGFpbmVkIGNvbnRhaW5zPWJiVG9kbyxiYkNvbnRpbnVlLGJiVmFyRGVyZWYsYmJWYXJQeVZhbHVlLEBTcGVsbAorCisiIFZhcnMgZGVmaW5pdGlvbgorc3luIG1hdGNoIGJiRXhwb3J0ICAgICAgICAgICAgIl5leHBvcnQiIG5leHRncm91cD1iYklkZW50aWZpZXIgc2tpcHdoaXRlCitzeW4ga2V5d29yZCBiYkV4cG9ydEZsYWcgICAgICAgIGV4cG9ydCBjb250YWluZWQgbmV4dGdyb3VwPWJiSWRlbnRpZmllciBza2lwd2hpdGUKK3N5biBtYXRjaCBiYklkZW50aWZpZXIgICAgICAgICAgIlthLXpBLVowLTlcLV9cLlwvXCtdXCsiIGRpc3BsYXkgY29udGFpbmVkCitzeW4gbWF0Y2ggYmJWYXJEZXJlZiAgICAgICAgICAgICIke1thLXpBLVowLTlcLV9cLlwvXCtdXCt9IiBjb250YWluZWQKK3N5biBtYXRjaCBiYlZhckVxICAgICAgICAgICAgICAgIlwoOj1cfCs9XHw9K1x8XC49XHw9XC5cfD89XHw/Pz1cfD1cKSIgY29udGFpbmVkIG5leHRncm91cD1iYlZhclZhbHVlCitzeW4gbWF0Y2ggYmJWYXJEZWYgICAgICAgICAgICAgICJeXChleHBvcnRccypcKVw/XChbYS16QS1aMC05XC1fXC5cL1wrXVwrXChfWyR7fWEtekEtWjAtOVwtX1wuXC9cK11cK1wpXD9cKVxzKlwoOj1cfCs9XHw9K1x8XC49XHw9XC5cfD89XHw/Pz1cfD1cKVxAPSIgY29udGFpbnM9YmJFeHBvcnRGbGFnLGJiSWRlbnRpZmllcixiYlZhckRlcmVmIG5leHRncm91cD1iYlZhckVxCitzeW4gbWF0Y2ggYmJWYXJWYWx1ZSAgICAgICAgICAgICIuKiQiIGNvbnRhaW5lZCBjb250YWlucz1iYlN0cmluZyxiYlZhckRlcmVmLGJiVmFyUHlWYWx1ZQorc3luIHJlZ2lvbiBiYlZhclB5VmFsdWUgICAgICAgICBzdGFydD0rJHtAKyBza2lwPStcXCQrIGVuZD0rfSsgY29udGFpbmVkIGNvbnRhaW5zPUBweXRob24KKworIiBWYXJzIG1ldGFkYXRhIGZsYWdzCitzeW4gbWF0Y2ggYmJWYXJGbGFnRGVmICAgICAgICAgICJeXChbYS16QS1aMC05XC1fXC5dXCtcKVwoXFtbYS16QS1aMC05XC1fXC5dXCtcXVwpXEA9IiBjb250YWlucz1iYklkZW50aWZpZXIgbmV4dGdyb3VwPWJiVmFyRmxhZ0ZsYWcKK3N5biByZWdpb24gYmJWYXJGbGFnRmxhZyAgICAgICAgbWF0Y2hncm91cD1iYkFycmF5QnJhY2tldHMgc3RhcnQ9IlxbIiBlbmQ9IlxdXHMqXCg9XHwrPVx8PStcfD89XClcQD0iIGNvbnRhaW5lZCBjb250YWlucz1iYklkZW50aWZpZXIgbmV4dGdyb3VwPWJiVmFyRXEKKworIiBJbmNsdWRlcyBhbmQgcmVxdWlyZXMKK3N5biBrZXl3b3JkIGJiSW5jbHVkZSAgICAgICAgICAgaW5oZXJpdCBpbmNsdWRlIHJlcXVpcmUgY29udGFpbmVkIAorc3luIG1hdGNoIGJiSW5jbHVkZVJlc3QgICAgICAgICAiLiokIiBjb250YWluZWQgY29udGFpbnM9YmJTdHJpbmcsYmJWYXJEZXJlZgorc3luIG1hdGNoIGJiSW5jbHVkZUxpbmUgICAgICAgICAiXlwoaW5oZXJpdFx8aW5jbHVkZVx8cmVxdWlyZVwpXHNcKyIgY29udGFpbnM9YmJJbmNsdWRlIG5leHRncm91cD1iYkluY2x1ZGVSZXN0CisKKyIgQWRkIHRha3MgYW5kIHNpbWlsYXIKK3N5biBrZXl3b3JkIGJiU3RhdGVtZW50ICAgICAgICAgYWRkdGFzayBhZGRoYW5kbGVyIGFmdGVyIGJlZm9yZSBFWFBPUlRfRlVOQ1RJT05TIGNvbnRhaW5lZAorc3luIG1hdGNoIGJiU3RhdGVtZW50UmVzdCAgICAgICAiLiokIiBza2lwd2hpdGUgY29udGFpbmVkIGNvbnRhaW5zPWJiU3RhdGVtZW50CitzeW4gbWF0Y2ggYmJTdGF0ZW1lbnRMaW5lICAgICAgICJeXChhZGR0YXNrXHxhZGRoYW5kbGVyXHxhZnRlclx8YmVmb3JlXHxFWFBPUlRfRlVOQ1RJT05TXClcc1wrIiBjb250YWlucz1iYlN0YXRlbWVudCBuZXh0Z3JvdXA9YmJTdGF0ZW1lbnRSZXN0CisKKyIgT0UgSW1wb3J0YW50IEZ1bmN0aW9ucworc3luIGtleXdvcmQgYmJPRUZ1bmN0aW9ucyAgICAgICBkb19mZXRjaCBkb191bnBhY2sgZG9fcGF0Y2ggZG9fY29uZmlndXJlIGRvX2NvbXBpbGUgZG9fc3RhZ2UgZG9faW5zdGFsbCBkb19wYWNrYWdlIGNvbnRhaW5lZAorCisiIEdlbmVyaWMgRnVuY3Rpb25zCitzeW4gbWF0Y2ggYmJGdW5jdGlvbiAgICAgICAgICAgICJcaFswLTlBLVphLXpfLV0qIiBkaXNwbGF5IGNvbnRhaW5lZCBjb250YWlucz1iYk9FRnVuY3Rpb25zCisKKyIgQml0QmFrZSBzaGVsbCBtZXRhZGF0YQorc3luIGluY2x1ZGUgQHNoZWxsIHN5bnRheC9zaC52aW0KK2lmIGV4aXN0cygiYjpjdXJyZW50X3N5bnRheCIpCisgIHVubGV0IGI6Y3VycmVudF9zeW50YXgKK2VuZGlmCitzeW4ga2V5d29yZCBiYlNoRmFrZVJvb3RGbGFnICAgIGZha2Vyb290IGNvbnRhaW5lZAorc3luIG1hdGNoIGJiU2hGdW5jRGVmICAgICAgICAgICAiXlwoZmFrZXJvb3RccypcKVw/XChbMC05QS1aYS16XyR7fS1dXCtcKVwocHl0aG9uXClcQDwhXChccyooKVxzKlwpXCh7XClcQD0iIGNvbnRhaW5zPWJiU2hGYWtlUm9vdEZsYWcsYmJGdW5jdGlvbixiYlZhckRlcmVmLGJiRGVsaW1pdGVyIG5leHRncm91cD1iYlNoRnVuY1JlZ2lvbiBza2lwd2hpdGUKK3N5biByZWdpb24gYmJTaEZ1bmNSZWdpb24gICAgICAgbWF0Y2hncm91cD1iYkRlbGltaXRlciBzdGFydD0ie1xzKiQiIGVuZD0iXn1ccyokIiBjb250YWluZWQgY29udGFpbnM9QHNoZWxsCisKKyIgUHl0aG9uIHZhbHVlIGluc2lkZSBzaGVsbCBmdW5jdGlvbnMKK3N5biByZWdpb24gc2hEZXJlZiAgICAgICAgIHN0YXJ0PSske0ArIHNraXA9K1xcJCsgZXhjbHVkZW5sIGVuZD0rfSsgY29udGFpbmVkIGNvbnRhaW5zPUBweXRob24KKworIiBCaXRCYWtlIHB5dGhvbiBtZXRhZGF0YQorc3luIGtleXdvcmQgYmJQeUZsYWcgICAgICAgICAgICBweXRob24gY29udGFpbmVkCitzeW4gbWF0Y2ggYmJQeUZ1bmNEZWYgICAgICAgICAgICJeXChweXRob25cc1wrXClcKFswLTlBLVphLXpfJHt9LV1cK1wpXD9cKFxzKigpXHMqXClcKHtcKVxAPSIgY29udGFpbnM9YmJQeUZsYWcsYmJGdW5jdGlvbixiYlZhckRlcmVmLGJiRGVsaW1pdGVyIG5leHRncm91cD1iYlB5RnVuY1JlZ2lvbiBza2lwd2hpdGUKK3N5biByZWdpb24gYmJQeUZ1bmNSZWdpb24gICAgICAgbWF0Y2hncm91cD1iYkRlbGltaXRlciBzdGFydD0ie1xzKiQiIGVuZD0iXn1ccyokIiBjb250YWluZWQgY29udGFpbnM9QHB5dGhvbgorCisiIEJpdEJha2UgJ2RlZidkIHB5dGhvbiBmdW5jdGlvbnMKK3N5biBrZXl3b3JkIGJiUHlEZWYgICAgICAgICAgICAgZGVmIGNvbnRhaW5lZAorc3luIHJlZ2lvbiBiYlB5RGVmUmVnaW9uICAgICAgICBzdGFydD0nXlwoZGVmXHNcK1wpXChbMC05QS1aYS16Xy1dXCtcKVwoXHMqKC4qKVxzKlwpOlxzKiQnIGVuZD0nXlwoXHNcfCRcKVxAIScgY29udGFpbnM9QHB5dGhvbgorCisiIEhpZ2hsaWdodGluZyBEZWZpbml0aW9ucworaGkgZGVmIGxpbmsgYmJVbm1hdGNoZWQgICAgICAgICBFcnJvcgoraGkgZGVmIGxpbmsgYmJJbmNsdWRlICAgICAgICAgICBJbmNsdWRlCitoaSBkZWYgbGluayBiYlRvZG8gICAgICAgICAgICAgIFRvZG8KK2hpIGRlZiBsaW5rIGJiQ29tbWVudCAgICAgICAgICAgQ29tbWVudAoraGkgZGVmIGxpbmsgYmJRdW90ZSAgICAgICAgICAgICBTdHJpbmcKK2hpIGRlZiBsaW5rIGJiU3RyaW5nICAgICAgICAgICAgU3RyaW5nCitoaSBkZWYgbGluayBiYkRlbGltaXRlciAgICAgICAgIEtleXdvcmQKK2hpIGRlZiBsaW5rIGJiQXJyYXlCcmFja2V0cyAgICAgU3RhdGVtZW50CitoaSBkZWYgbGluayBiYkNvbnRpbnVlICAgICAgICAgIFNwZWNpYWwKK2hpIGRlZiBsaW5rIGJiRXhwb3J0ICAgICAgICAgICAgVHlwZQoraGkgZGVmIGxpbmsgYmJFeHBvcnRGbGFnICAgICAgICBUeXBlCitoaSBkZWYgbGluayBiYklkZW50aWZpZXIJICAgIElkZW50aWZpZXIKK2hpIGRlZiBsaW5rIGJiVmFyRGVyZWYgICAgICAgICAgUHJlUHJvYworaGkgZGVmIGxpbmsgYmJWYXJEZWYgICAgICAgICAgICBJZGVudGlmaWVyCitoaSBkZWYgbGluayBiYlZhclZhbHVlICAgICAgICAgIFN0cmluZworaGkgZGVmIGxpbmsgYmJTaEZha2VSb290RmxhZyAgICBUeXBlCitoaSBkZWYgbGluayBiYkZ1bmN0aW9uICAgICAgICAgIEZ1bmN0aW9uCitoaSBkZWYgbGluayBiYlB5RmxhZyAgICAgICAgICAgIFR5cGUKK2hpIGRlZiBsaW5rIGJiUHlEZWYgICAgICAgICAgICAgU3RhdGVtZW50CitoaSBkZWYgbGluayBiYlN0YXRlbWVudCAgICAgICAgIFN0YXRlbWVudAoraGkgZGVmIGxpbmsgYmJTdGF0ZW1lbnRSZXN0ICAgICBJZGVudGlmaWVyCitoaSBkZWYgbGluayBiYk9FRnVuY3Rpb25zICAgICAgIFNwZWNpYWwKK2hpIGRlZiBsaW5rIGJiVmFyUHlWYWx1ZSAgICAgICAgUHJlUHJvYworCitsZXQgYjpjdXJyZW50X3N5bnRheCA9ICJiYiIKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL0NPUFlJTkcuR1BMIGIvYml0YmFrZS9kb2MvQ09QWUlORy5HUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxMTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL0NPUFlJTkcuR1BMCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL0NPUFlJTkcuTUlUIGIvYml0YmFrZS9kb2MvQ09QWUlORy5NSVQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3ZDU3NAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL0NPUFlJTkcuTUlUCkBAIC0wLDAgKzEsMTcgQEAKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQKK1NIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCitPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKK1RIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvTWFrZWZpbGUgYi9iaXRiYWtlL2RvYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI4ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvTWFrZWZpbGUKQEAgLTAsMCArMSw5MSBAQAorIyBUaGlzIGlzIGEgc2luZ2xlIE1ha2VmaWxlIHRvIGhhbmRsZSBhbGwgZ2VuZXJhdGVkIEJpdEJha2UgZG9jdW1lbnRzLgorIyBUaGUgTWFrZWZpbGUgbmVlZHMgdG8gbGl2ZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkgYW5kIGFsbCBmaWd1cmVzIHVzZWQKKyMgaW4gYW55IG1hbnVhbHMgbXVzdCBiZSAuUE5HIGZpbGVzIGFuZCBsaXZlIGluIHRoZSBpbmRpdmlkdWFsIGJvb2sncyBmaWd1cmVzCisjIGRpcmVjdG9yeS4KKyMKKyMgVGhlIE1ha2VmaWxlIGhhcyB0aGVzZSB0YXJnZXRzOgorIworIyAgICBwZGY6ICAgICAgZ2VuZXJhdGVzIGEgUERGIHZlcnNpb24gb2YgYSBtYW51YWwuCisjICAgIGh0bWw6ICAgICBnZW5lcmF0ZXMgYW4gSFRNTCB2ZXJzaW9uIG9mIGEgbWFudWFsLgorIyAgICB0YXJiYWxsOiAgY3JlYXRlcyBhIHRhcmJhbGwgZm9yIHRoZSBkb2MgZmlsZXMuCisjICAgIHZhbGlkYXRlOiB2YWxpZGF0ZXMKKyMgICAgY2xlYW46ICAgIHJlbW92ZXMgZmlsZXMKKyMKKyMgVGhlIE1ha2VmaWxlIGdlbmVyYXRlcyBhbiBIVE1MIHZlcnNpb24gb2YgZXZlcnkgZG9jdW1lbnQuICBUaGUKKyMgdmFyaWFibGUgRE9DIGluZGljYXRlcyB0aGUgZm9sZGVyIG5hbWUgZm9yIGEgZ2l2ZW4gbWFudWFsLgorIworIyBUbyBidWlsZCBhIG1hbnVhbCwgeW91IG11c3QgaW52b2tlICdtYWtlJyB3aXRoIHRoZSBET0MgYXJndW1lbnQuCisjCisjIEV4YW1wbGVzOgorIworIyAgICAgbWFrZSBET0M9Yml0YmFrZS11c2VyLW1hbnVhbAorIyAgICAgbWFrZSBwZGYgRE9DPWJpdGJha2UtdXNlci1tYW51YWwKKyMKKyMgVGhlIGZpcnN0IGV4YW1wbGUgZ2VuZXJhdGVzIHRoZSBIVE1MIHZlcnNpb24gb2YgdGhlIFVzZXIgTWFudWFsLgorIyBUaGUgc2Vjb25kIGV4YW1wbGUgZ2VuZXJhdGVzIHRoZSBQREYgdmVyc2lvbiBvZiB0aGUgVXNlciBNYW51YWwuCisjCisKK2lmZXEgKCQoRE9DKSxiaXRiYWtlLXVzZXItbWFudWFsKQorWFNMVE9QVFMgPSAtLXN0cmluZ3BhcmFtIGh0bWwuc3R5bGVzaGVldCBiaXRiYWtlLXVzZXItbWFudWFsLXN0eWxlLmNzcyBcCisgICAgICAgICAgIC0tc3RyaW5ncGFyYW0gIGNoYXB0ZXIuYXV0b2xhYmVsIDEgXAorICAgICAgICAgICAtLXN0cmluZ3BhcmFtICBzZWN0aW9uLmF1dG9sYWJlbCAxIFwKKyAgICAgICAgICAgLS1zdHJpbmdwYXJhbSAgc2VjdGlvbi5sYWJlbC5pbmNsdWRlcy5jb21wb25lbnQubGFiZWwgMSBcCisgICAgICAgICAgIC0teGluY2x1ZGUKK0FMTFBSRVEgPSBodG1sIHRhcmJhbGwKK1RBUkZJTEVTID0gYml0YmFrZS11c2VyLW1hbnVhbC1zdHlsZS5jc3MgYml0YmFrZS11c2VyLW1hbnVhbC5odG1sIGZpZ3VyZXMvYml0YmFrZS10aXRsZS5wbmcKK01BTlVBTFMgPSAkKERPQykvJChET0MpLmh0bWwKK0ZJR1VSRVMgPSBmaWd1cmVzCitTVFlMRVNIRUVUID0gJChET0MpLyouY3NzCisKK2VuZGlmCisKKyMjCisjIFRoZXNlIFVSSSBzaG91bGQgYmUgcmV3cml0dGVuIGJ5IHlvdXIgZGlzdHJpYnV0aW9uJ3MgeG1sIGNhdGFsb2cgdG8KKyMgbWF0Y2ggeW91ciBsb2NhbHkgaW5zdGFsbGVkIFhTTCBzdHlsZXNoZWV0cy4KK1hTTF9CQVNFX1VSSSAgPSBodHRwOi8vZG9jYm9vay5zb3VyY2Vmb3JnZS5uZXQvcmVsZWFzZS94c2wvY3VycmVudAorWFNMX1hIVE1MX1VSSSA9ICQoWFNMX0JBU0VfVVJJKS94aHRtbC9kb2Nib29rLnhzbAorCithbGw6ICQoQUxMUFJFUSkKKworcGRmOgoraWZlcSAoJChET0MpLGJpdGJha2UtdXNlci1tYW51YWwpCisJQGVjaG8gIiAiCisJQGVjaG8gIioqKioqKioqKiogQnVpbGRpbmcuIiQoRE9DKQorCUBlY2hvICIgIgorCWNkICQoRE9DKTsgLi4vdG9vbHMvZG9jYm9vay10by1wZGYgJChET0MpLnhtbCAuLi90ZW1wbGF0ZTsgY2QgLi4KK2VuZGlmCisKK2h0bWw6CitpZmVxICgkKERPQyksYml0YmFrZS11c2VyLW1hbnVhbCkKKyMgICAgICAgU2VlIGh0dHA6Ly93d3cuc2FnZWhpbGwubmV0L2RvY2Jvb2t4c2wvSHRtbE91dHB1dC5odG1sCisJQGVjaG8gIiAiCisJQGVjaG8gIioqKioqKioqIEJ1aWxkaW5nICIkKERPQykKKwlAZWNobyAiICIKKwljZCAkKERPQyk7IHhzbHRwcm9jICQoWFNMVE9QVFMpIC1vICQoRE9DKS5odG1sICQoRE9DKS1jdXN0b21pemF0aW9uLnhzbCAkKERPQykueG1sOyBjZCAuLgorZW5kaWYKKwordGFyYmFsbDogaHRtbAorCUBlY2hvICIgIgorCUBlY2hvICIqKioqKioqKiBDcmVhdGluZyBUYXJiYWxsIG9mIGRvY3VtZW50IGZpbGVzIgorCUBlY2hvICIgIgorCWNkICQoRE9DKTsgdGFyIC1jdnpmICQoRE9DKS50Z3ogJChUQVJGSUxFUyk7IGNkIC4uCisKK3ZhbGlkYXRlOgorCWNkICQoRE9DKTsgeG1sbGludCAtLXBvc3R2YWxpZCAtLXhpbmNsdWRlIC0tbm9vdXQgJChET0MpLnhtbDsgY2QgLi4KKworcHVibGlzaDoKKwlAaWYgdGVzdCAtZiAkKERPQykvJChET0MpLmh0bWw7IFwKKwkgIHRoZW4gXAorICAgICAgICAgICAgZWNobyAiICI7IFwKKyAgICAgICAgICAgIGVjaG8gIioqKioqKioqIFB1Ymxpc2hpbmcgIiQoRE9DKSIuaHRtbCI7IFwKKyAgICAgICAgICAgIGVjaG8gIiAiOyBcCisgICAgICAgICAgICBzY3AgLXIgJChNQU5VQUxTKSAkKFNUWUxFU0hFRVQpIGRvY3MueXA6L3Zhci93d3cvd3d3LnlvY3RvcHJvamVjdC5vcmctZG9jcy8kKFZFUikvJChET0MpOyBcCisgICAgICAgICAgICBjZCAkKERPQyk7IHNjcCAtciAkKEZJR1VSRVMpIGRvY3MueXA6L3Zhci93d3cvd3d3LnlvY3RvcHJvamVjdC5vcmctZG9jcy8kKFZFUikvJChET0MpOyBcCisJZWxzZSBcCisgICAgICAgICAgZWNobyAiICI7IFwKKyAgICAgICAgICBlY2hvICQoRE9DKSIuaHRtbCBtaXNzaW5nLiAgR2VuZXJhdGUgdGhlIGZpbGUgZmlyc3QgdGhlbiB0cnkgYWdhaW4uIjsgXAorICAgICAgICAgIGVjaG8gIiAiOyBcCisJZmkKKworY2xlYW46CisJcm0gLXJmICQoTUFOVUFMUyk7IHJtICQoRE9DKS8kKERPQykudGd6OwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvUkVBRE1FIGIvYml0YmFrZS9kb2MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2NmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9SRUFETUUKQEAgLTAsMCArMSwzOSBAQAorRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PQorCitUaGlzIGlzIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgQml0QmFrZSBkb2N1bWVudGF0aW9uLiAKKworTWFudWFsIE9yZ2FuaXphdGlvbgorPT09PT09PT09PT09PT09PT09PQorCitGb2xkZXJzIGV4aXN0IGZvciBpbmRpdmlkdWFsIG1hbnVhbHMgYXMgZm9sbG93czoKKworKiBiaXRiYWtlLXVzZXItbWFudWFsICAgICAgLSBUaGUgQml0QmFrZSBVc2VyIE1hbnVhbCAKKworRWFjaCBmb2xkZXIgaXMgc2VsZi1jb250YWluZWQgcmVnYXJkaW5nIGNvbnRlbnQgYW5kIGZpZ3VyZXMuCisKK0lmIHlvdSB3YW50IHRvIGZpbmQgSFRNTCB2ZXJzaW9ucyBvZiB0aGUgQml0QmFrZSBtYW51YWxzIG9uIHRoZSB3ZWIsIAorZ28gdG8gaHR0cDovL3d3dy5vcGVuZW1iZWRkZWQub3JnL3dpa2kvRG9jdW1lbnRhdGlvbi4gCisKK01ha2VmaWxlCis9PT09PT09PQorCitUaGUgTWFrZWZpbGUgcHJvY2Vzc2VzIG1hbnVhbCBkaXJlY3RvcmllcyB0byBjcmVhdGUgSFRNTCwgUERGLAordGFyYmFsbHMsIGV0Yy4gIERldGFpbHMgb24gaG93IHRoZSBNYWtlZmlsZSB3b3JrIGFyZSBkb2N1bWVudGVkCitpbnNpZGUgdGhlIE1ha2VmaWxlLiAgU2VlIHRoYXQgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVG8gYnVpbGQgYSBtYW51YWwsIHlvdSBydW4gdGhlIG1ha2UgY29tbWFuZCBhbmQgcGFzcyBpdCB0aGUgbmFtZQorb2YgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBtYW51YWwncyBjb250ZW50cy4gCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb21tYW5kIHJ1biBmcm9tIHRoZSBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeSAKK2NyZWF0ZXMgYW4gSFRNTCBhbmQgYSBQREYgdmVyc2lvbiBvZiB0aGUgQml0QmFrZSBVc2VyIE1hbnVhbC4KK1RoZSBET0MgdmFyaWFibGUgc3BlY2lmaWVzIHRoZSBtYW51YWwgeW91IGFyZSBtYWtpbmc6CisKKyAgICAgJCBtYWtlIERPQz1iaXRiYWtlLXVzZXItbWFudWFsCisKK3RlbXBsYXRlCis9PT09PT09PQorQ29udGFpbnMgdmFyaW91cyB0ZW1wbGF0ZXMsIGZvbnRzLCBhbmQgc29tZSBvbGQgUE5HIGZpbGVzLgorCit0b29scworPT09PT0KK0NvbnRhaW5zIGEgdG9vbCB0byBjb252ZXJ0IHRoZSBEb2NCb29rIGZpbGVzIHRvIFBERiBmb3JtYXQuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtY3VzdG9taXphdGlvbi54c2wgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtY3VzdG9taXphdGlvbi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4NWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1jdXN0b21pemF0aW9uLnhzbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiIHZlcnNpb249IjEuMCI+CisKKyAgPHhzbDppbXBvcnQgaHJlZj0iaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL21pcnJvci9kb2Nib29rLW1pcnJvci9kb2Nib29rLXhzbC0xLjc2LjEveGh0bWwvZG9jYm9vay54c2wiIC8+CisKKzwhLS0KKworICA8eHNsOmltcG9ydCBocmVmPSIuLi90ZW1wbGF0ZS8xLjc2LjEvZG9jYm9vay14c2wtMS43Ni4xL3hodG1sL2RvY2Jvb2sueHNsIiAvPgorCisgIDx4c2w6aW1wb3J0IGhyZWY9Imh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC8xLjc2LjEveGh0bWwvZG9jYm9vay54c2wiIC8+CisKKy0tPgorCisgIDx4c2w6aW5jbHVkZSBocmVmPSIuLi90ZW1wbGF0ZS9wZXJtYWxpbmtzLnhzbCIvPgorICA8eHNsOmluY2x1ZGUgaHJlZj0iLi4vdGVtcGxhdGUvc2VjdGlvbi50aXRsZS54c2wiLz4KKyAgPHhzbDppbmNsdWRlIGhyZWY9Ii4uL3RlbXBsYXRlL2NvbXBvbmVudC50aXRsZS54c2wiLz4KKyAgPHhzbDppbmNsdWRlIGhyZWY9Ii4uL3RlbXBsYXRlL2RpdmlzaW9uLnRpdGxlLnhzbCIvPgorICA8eHNsOmluY2x1ZGUgaHJlZj0iLi4vdGVtcGxhdGUvZm9ybWFsLm9iamVjdC5oZWFkaW5nLnhzbCIvPgorICA8eHNsOmluY2x1ZGUgaHJlZj0iLi4vdGVtcGxhdGUvZ2xvc3MtcGVybWFsaW5rcy54c2wiLz4KKworICA8eHNsOnBhcmFtIG5hbWU9Imh0bWwuc3R5bGVzaGVldCIgc2VsZWN0PSIndXNlci1tYW51YWwtc3R5bGUuY3NzJyIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJjaGFwdGVyLmF1dG9sYWJlbCIgc2VsZWN0PSIxIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9InNlY3Rpb24uYXV0b2xhYmVsIiBzZWxlY3Q9IjEiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0ic2VjdGlvbi5sYWJlbC5pbmNsdWRlcy5jb21wb25lbnQubGFiZWwiIHNlbGVjdD0iMSIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJhcHBlbmRpeC5hdXRvbGFiZWwiPkE8L3hzbDpwYXJhbT4KKworPCEtLSAgPHhzbDpwYXJhbSBuYW1lPSJnZW5lcmF0ZS50b2MiIHNlbGVjdD0iJ2FydGljbGUgbm9wJyI+PC94c2w6cGFyYW0+ICAtLT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1leGVjdXRpb24ueG1sIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWV4ZWN1dGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1MmUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1leGVjdXRpb24ueG1sCkBAIC0wLDAgKzEsOTEyIEBACis8IURPQ1RZUEUgY2hhcHRlciBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMi8vRU4iCisiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjIvZG9jYm9va3guZHRkIj4KKworPGNoYXB0ZXIgaWQ9ImJpdGJha2UtdXNlci1tYW51YWwtZXhlY3V0aW9uIj4KKyAgICA8dGl0bGU+RXhlY3V0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgICBUaGUgcHJpbWFyeSBwdXJwb3NlIGZvciBydW5uaW5nIEJpdEJha2UgaXMgdG8gcHJvZHVjZSBzb21lIGtpbmQKKyAgICAgICAgb2Ygb3V0cHV0IHN1Y2ggYXMgYSBzaW5nbGUgaW5zdGFsbGFibGUgcGFja2FnZSwgYSBrZXJuZWwsIGEgc29mdHdhcmUKKyAgICAgICAgZGV2ZWxvcG1lbnQga2l0LCBvciBldmVuIGEgZnVsbCwgYm9hcmQtc3BlY2lmaWMgYm9vdGFibGUgTGludXggaW1hZ2UsCisgICAgICAgIGNvbXBsZXRlIHdpdGggYm9vdGxvYWRlciwga2VybmVsLCBhbmQgcm9vdCBmaWxlc3lzdGVtLgorICAgICAgICBPZiBjb3Vyc2UsIHlvdSBjYW4gZXhlY3V0ZSB0aGUgPGZpbGVuYW1lPmJpdGJha2U8L2ZpbGVuYW1lPgorICAgICAgICBjb21tYW5kIHdpdGggb3B0aW9ucyB0aGF0IGNhdXNlIGl0IHRvIGV4ZWN1dGUgc2luZ2xlIHRhc2tzLAorICAgICAgICBjb21waWxlIHNpbmdsZSByZWNpcGUgZmlsZXMsIGNhcHR1cmUgb3IgY2xlYXIgZGF0YSwgb3Igc2ltcGx5CisgICAgICAgIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgICBUaGlzIGNoYXB0ZXIgZGVzY3JpYmVzIEJpdEJha2UncyBleGVjdXRpb24gcHJvY2VzcyBmcm9tIHN0YXJ0CisgICAgICAgIHRvIGZpbmlzaCB3aGVuIHlvdSB1c2UgaXQgdG8gY3JlYXRlIGFuIGltYWdlLgorICAgICAgICBUaGUgZXhlY3V0aW9uIHByb2Nlc3MgaXMgbGF1bmNoZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kCisgICAgICAgIGZvcm06CisgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIDxyZXBsYWNlYWJsZT50YXJnZXQ8L3JlcGxhY2VhYmxlPgorICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgQml0QmFrZSBjb21tYW5kIGFuZCBpdHMgb3B0aW9ucywKKyAgICAgICAgc2VlCisgICAgICAgICI8bGluayBsaW5rZW5kPSdiaXRiYWtlLXVzZXItbWFudWFsLWNvbW1hbmQnPlRoZSBCaXRCYWtlIENvbW1hbmQ8L2xpbms+IgorICAgICAgICBzZWN0aW9uLgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFByaW9yIHRvIGV4ZWN1dGluZyBCaXRCYWtlLCB5b3Ugc2hvdWxkIHRha2UgYWR2YW50YWdlIG9mIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIHBhcmFsbGVsIHRocmVhZCBleGVjdXRpb24gb24geW91ciBidWlsZCBob3N0IGJ5IHNldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX05VTUJFUl9USFJFQURTJz48ZmlsZW5hbWU+QkJfTlVNQkVSX1RIUkVBRFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICB2YXJpYWJsZSBpbiB5b3VyIHByb2plY3QncyA8ZmlsZW5hbWU+bG9jYWwuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBIGNvbW1vbiBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUgZm9yIHlvdXIgYnVpbGQgaG9zdCBpcyB0byBydW4KKyAgICAgICAgICAgICAgICB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBncmVwIHByb2Nlc3NvciAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoaXMgY29tbWFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycywgd2hpY2ggdGFrZXMgaW50byAKKyAgICAgICAgICAgICAgICBhY2NvdW50IGh5cGVyLXRocmVhZGluZy4gCisgICAgICAgICAgICAgICAgVGh1cywgYSBxdWFkLWNvcmUgYnVpbGQgaG9zdCB3aXRoIGh5cGVyLXRocmVhZGluZyBtb3N0IGxpa2VseSAKKyAgICAgICAgICAgICAgICBzaG93cyBlaWdodCBwcm9jZXNzb3JzLCB3aGljaCBpcyB0aGUgdmFsdWUgeW91IHdvdWxkIHRoZW4gYXNzaWduIHRvCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkJCX05VTUJFUl9USFJFQURTPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEEgcG9zc2libHkgc2ltcGxlciBzb2x1dGlvbiBpcyB0aGF0IHNvbWUgTGludXggZGlzdHJpYnV0aW9ucworICAgICAgICAgICAgICAgIChlLmcuIERlYmlhbiBhbmQgVWJ1bnR1KSBwcm92aWRlIHRoZSA8ZmlsZW5hbWU+bmNwdXM8L2ZpbGVuYW1lPiBjb21tYW5kLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisgICAgPC9wYXJhPgorCisgICAgPHNlY3Rpb24gaWQ9J3BhcnNpbmctdGhlLWJhc2UtY29uZmlndXJhdGlvbi1tZXRhZGF0YSc+CisgICAgICAgIDx0aXRsZT5QYXJzaW5nIHRoZSBCYXNlIENvbmZpZ3VyYXRpb24gTWV0YWRhdGE8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGZpcnN0IHRoaW5nIEJpdEJha2UgZG9lcyBpcyBwYXJzZSBiYXNlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIG1ldGFkYXRhLgorICAgICAgICAgICAgQmFzZSBjb25maWd1cmF0aW9uIG1ldGFkYXRhIGNvbnNpc3RzIG9mIHlvdXIgcHJvamVjdCdzCisgICAgICAgICAgICA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGZpbGUgdG8gZGV0ZXJtaW5lIHdoYXQKKyAgICAgICAgICAgIGxheWVycyBCaXRCYWtlIG5lZWRzIHRvIHJlY29nbml6ZSwgYWxsIG5lY2Vzc2FyeQorICAgICAgICAgICAgPGZpbGVuYW1lPmxheWVyLmNvbmY8L2ZpbGVuYW1lPiBmaWxlcyAob25lIGZyb20gZWFjaCBsYXllciksCisgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+LgorICAgICAgICAgICAgVGhlIGRhdGEgaXRzZWxmIGlzIG9mIHZhcmlvdXMgdHlwZXM6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UmVjaXBlczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBEZXRhaWxzIGFib3V0IHBhcnRpY3VsYXIgcGllY2VzIG9mIHNvZnR3YXJlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkNsYXNzIERhdGE6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQW4gYWJzdHJhY3Rpb24gb2YgY29tbW9uIGJ1aWxkIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgIChlLmcuIGhvdyB0byBidWlsZCBhIExpbnV4IGtlcm5lbCkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Q29uZmlndXJhdGlvbiBEYXRhOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmUtc3BlY2lmaWMgc2V0dGluZ3MsIHBvbGljeSBkZWNpc2lvbnMsCisgICAgICAgICAgICAgICAgICAgIGFuZCBzbyBmb3J0aC4KKyAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBkYXRhIGFjdHMgYXMgdGhlIGdsdWUgdG8gYmluZCBldmVyeXRoaW5nCisgICAgICAgICAgICAgICAgICAgIHRvZ2V0aGVyLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+bGF5ZXIuY29uZjwvZmlsZW5hbWU+IGZpbGVzIGFyZSB1c2VkIHRvCisgICAgICAgICAgICBjb25zdHJ1Y3Qga2V5IHZhcmlhYmxlcyBzdWNoIGFzCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJQQVRIJz48ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVTJz48ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiBpcyB1c2VkIHRvIHNlYXJjaCBmb3IKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gYW5kIGNsYXNzIGZpbGVzIHVuZGVyIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPmNvbmY8L2ZpbGVuYW1lPiBhbmQgPGZpbGVuYW1lPmNsYXNzZXM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgZGlyZWN0b3JpZXMsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgIDxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT4gaXMgdXNlZCB0byBsb2NhdGUgYm90aCByZWNpcGUKKyAgICAgICAgICAgIGFuZCByZWNpcGUgYXBwZW5kIGZpbGVzCisgICAgICAgICAgICAoPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+LmJiYXBwZW5kPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gPGZpbGVuYW1lPmJibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPiBmaWxlLAorICAgICAgICAgICAgaXQgaXMgYXNzdW1lZCB0aGUgdXNlciBoYXMgc2V0IHRoZSA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4KKyAgICAgICAgICAgIGFuZCA8ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+IGRpcmVjdGx5IGluIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTmV4dCwgdGhlIDxmaWxlbmFtZT5iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPiBmaWxlIGlzIGxvY2F0ZWQKKyAgICAgICAgICAgIHVzaW5nIHRoZSA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gdmFyaWFibGUgdGhhdCB3YXMKKyAgICAgICAgICAgIGp1c3QgY29uc3RydWN0ZWQuCisgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+IGZpbGUgbWF5IGFsc28gaW5jbHVkZSBvdGhlcgorICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcyB1c2luZyB0aGUKKyAgICAgICAgICAgIDxmaWxlbmFtZT5pbmNsdWRlPC9maWxlbmFtZT4gb3IKKyAgICAgICAgICAgIDxmaWxlbmFtZT5yZXF1aXJlPC9maWxlbmFtZT4gZGlyZWN0aXZlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgUHJpb3IgdG8gcGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGVzLCBCaXRiYWtlIGxvb2tzCisgICAgICAgICAgICBhdCBjZXJ0YWluIHZhcmlhYmxlcywgaW5jbHVkaW5nOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0ndmFyLUJCX0VOVl9XSElURUxJU1QnPjxmaWxlbmFtZT5CQl9FTlZfV0hJVEVMSVNUPC9maWxlbmFtZT48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9QUkVTRVJWRV9FTlYnPjxmaWxlbmFtZT5CQl9QUkVTRVJWRV9FTlY8L2ZpbGVuYW1lPjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0ndmFyLUJCX0VOVl9FWFRSQVdISVRFJz48ZmlsZW5hbWU+QkJfRU5WX0VYVFJBV0hJVEU8L2ZpbGVuYW1lPjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CSVRCQUtFX1VJJz48ZmlsZW5hbWU+QklUQkFLRV9VSTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgWW91IGNhbiBmaW5kIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwYXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbnRvIHRoZSBCaXRCYWtlCisgICAgICAgICAgICBleGVjdXRpb24gZW52aXJvbm1lbnQgaW4gdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ncGFzc2luZy1pbmZvcm1hdGlvbi1pbnRvLXRoZS1idWlsZC10YXNrLWVudmlyb25tZW50Jz5QYXNzaW5nIEluZm9ybWF0aW9uIEludG8gdGhlIEJ1aWxkIFRhc2sgRW52aXJvbm1lbnQ8L2xpbms+IiBzZWN0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgYmFzZSBjb25maWd1cmF0aW9uIG1ldGFkYXRhIGlzIGdsb2JhbAorICAgICAgICAgICAgYW5kIHRoZXJlZm9yZSBhZmZlY3RzIGFsbCByZWNpcGVzIGFuZCB0YXNrcyB0aGF0IGFyZSBleGVjdXRlZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSBmaXJzdCBzZWFyY2hlcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgYW4KKyAgICAgICAgICAgIG9wdGlvbmFsIDxmaWxlbmFtZT5jb25mL2JibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPiBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICAgICAgICBUaGlzIGZpbGUgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBhCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJMQVlFUlMnPjxmaWxlbmFtZT5CQkxBWUVSUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUgdGhhdCBpcyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mICdsYXllcicgZGlyZWN0b3JpZXMuCisgICAgICAgICAgICBSZWNhbGwgdGhhdCBpZiBCaXRCYWtlIGNhbm5vdCBmaW5kIGEgPGZpbGVuYW1lPmJibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgZmlsZSwgdGhlbiBpdCBpcyBhc3N1bWVkIHRoZSB1c2VyIGhhcyBzZXQgdGhlIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPgorICAgICAgICAgICAgYW5kIDxmaWxlbmFtZT5CQkZJTEVTPC9maWxlbmFtZT4gdmFyaWFibGVzIGRpcmVjdGx5IGluIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRm9yIGVhY2ggZGlyZWN0b3J5IChsYXllcikgaW4gdGhpcyBsaXN0LCBhIDxmaWxlbmFtZT5jb25mL2xheWVyLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgZmlsZSBpcyBsb2NhdGVkIGFuZCBwYXJzZWQgd2l0aCB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1MQVlFUkRJUic+PGZpbGVuYW1lPkxBWUVSRElSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSBiZWluZyBzZXQgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGF5ZXIgd2FzIGZvdW5kLgorICAgICAgICAgICAgVGhlIGlkZWEgaXMgdGhlc2UgZmlsZXMgYXV0b21hdGljYWxseSBzZXQgdXAKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQlBBVEgnPjxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGFuZCBvdGhlciB2YXJpYWJsZXMgY29ycmVjdGx5IGZvciBhIGdpdmVuIGJ1aWxkIGRpcmVjdG9yeS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSB0aGVuIGV4cGVjdHMgdG8gZmluZCB0aGUgPGZpbGVuYW1lPmNvbmYvYml0YmFrZS5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgIGZpbGUgc29tZXdoZXJlIGluIHRoZSB1c2VyLXNwZWNpZmllZCA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4uCisgICAgICAgICAgICBUaGF0IGNvbmZpZ3VyYXRpb24gZmlsZSBnZW5lcmFsbHkgaGFzIGluY2x1ZGUgZGlyZWN0aXZlcyB0byBwdWxsCisgICAgICAgICAgICBpbiBhbnkgb3RoZXIgbWV0YWRhdGEgc3VjaCBhcyBmaWxlcyBzcGVjaWZpYyB0byB0aGUgYXJjaGl0ZWN0dXJlLAorICAgICAgICAgICAgdGhlIG1hY2hpbmUsIHRoZSBsb2NhbCBlbnZpcm9ubWVudCwgYW5kIHNvIGZvcnRoLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbmx5IHZhcmlhYmxlIGRlZmluaXRpb25zIGFuZCBpbmNsdWRlIGRpcmVjdGl2ZXMgYXJlIGFsbG93ZWQKKyAgICAgICAgICAgIGluIEJpdEJha2UgPGZpbGVuYW1lPi5jb25mPC9maWxlbmFtZT4gZmlsZXMuCisgICAgICAgICAgICBTb21lIHZhcmlhYmxlcyBkaXJlY3RseSBpbmZsdWVuY2UgQml0QmFrZSdzIGJlaGF2aW9yLgorICAgICAgICAgICAgVGhlc2UgdmFyaWFibGVzIG1pZ2h0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHByZXZpb3VzbHkKKyAgICAgICAgICAgIG1lbnRpb25lZCBvciBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICAgICAgICBUaGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdyZWYtdmFyaWFibGVzLWdsb3MnPlZhcmlhYmxlcyBHbG9zc2FyeTwvbGluaz4iCisgICAgICAgICAgICBjaGFwdGVyIHByZXNlbnRzIGEgZnVsbCBsaXN0IG9mIHZhcmlhYmxlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQWZ0ZXIgcGFyc2luZyBjb25maWd1cmF0aW9uIGZpbGVzLCBCaXRCYWtlIHVzZXMgaXRzIHJ1ZGltZW50YXJ5CisgICAgICAgICAgICBpbmhlcml0YW5jZSBtZWNoYW5pc20sIHdoaWNoIGlzIHRocm91Z2ggY2xhc3MgZmlsZXMsIHRvIGluaGVyaXQKKyAgICAgICAgICAgIHNvbWUgc3RhbmRhcmQgY2xhc3Nlcy4KKyAgICAgICAgICAgIEJpdEJha2UgcGFyc2VzIGEgY2xhc3Mgd2hlbiB0aGUgaW5oZXJpdCBkaXJlY3RpdmUgcmVzcG9uc2libGUKKyAgICAgICAgICAgIGZvciBnZXR0aW5nIHRoYXQgY2xhc3MgaXMgZW5jb3VudGVyZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+YmFzZS5iYmNsYXNzPC9maWxlbmFtZT4gZmlsZSBpcyBhbHdheXMgaW5jbHVkZWQuCisgICAgICAgICAgICBPdGhlciBjbGFzc2VzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiB1c2luZyB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1JTkhFUklUJz48ZmlsZW5hbWU+SU5IRVJJVDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUgYXJlIGFsc28gaW5jbHVkZWQuCisgICAgICAgICAgICBCaXRCYWtlIHNlYXJjaGVzIGZvciBjbGFzcyBmaWxlcyBpbiBhCisgICAgICAgICAgICA8ZmlsZW5hbWU+Y2xhc3NlczwvZmlsZW5hbWU+IHN1YmRpcmVjdG9yeSB1bmRlcgorICAgICAgICAgICAgdGhlIHBhdGhzIGluIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiBpbiB0aGUgc2FtZSB3YXkgYXMKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgZ29vZCB3YXkgdG8gZ2V0IGFuIGlkZWEgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kCisgICAgICAgICAgICB0aGUgY2xhc3MgZmlsZXMgdXNlZCBpbiB5b3VyIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpcyB0bworICAgICAgICAgICAgcnVuIHRoZSBmb2xsb3dpbmcgQml0QmFrZSBjb21tYW5kOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGJpdGJha2UgLWUgPiBteWJiLmxvZworICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgRXhhbWluaW5nIHRoZSB0b3Agb2YgdGhlIDxmaWxlbmFtZT5teWJiLmxvZzwvZmlsZW5hbWU+CisgICAgICAgICAgICBzaG93cyB5b3UgdGhlIG1hbnkgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgY2xhc3MgZmlsZXMKKyAgICAgICAgICAgIHVzZWQgaW4geW91ciBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFlvdSBuZWVkIHRvIGJlIGF3YXJlIG9mIGhvdyBCaXRCYWtlIHBhcnNlcyBjdXJseSBicmFjZXMuCisgICAgICAgICAgICAgICAgSWYgYSByZWNpcGUgdXNlcyBhIGNsb3NpbmcgY3VybHkgYnJhY2Ugd2l0aGluIHRoZSBmdW5jdGlvbiBhbmQKKyAgICAgICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGhhcyBubyBsZWFkaW5nIHNwYWNlcywgQml0QmFrZSBwcm9kdWNlcyBhIHBhcnNpbmcKKyAgICAgICAgICAgICAgICBlcnJvci4KKyAgICAgICAgICAgICAgICBJZiB5b3UgdXNlIGEgcGFpciBvZiBjdXJseSBicmFjZXMgaW4gYSBzaGVsbCBmdW5jdGlvbiwgdGhlCisgICAgICAgICAgICAgICAgY2xvc2luZyBjdXJseSBicmFjZSBtdXN0IG5vdCBiZSBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZQorICAgICAgICAgICAgICAgIHdpdGhvdXQgbGVhZGluZyBzcGFjZXMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IGNhdXNlcyBCaXRCYWtlIHRvIHByb2R1Y2UgYSBwYXJzaW5nCisgICAgICAgICAgICAgICAgZXJyb3I6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBmYWtlcm9vdCBjcmVhdGVfc2hhcigpIHsKKyAgICAgICAgIGNhdCAmbHQ7Jmx0OyAiRU9GIiAmZ3Q7ICR7U0RLX0RFUExPWX0vJHtUT09MQ0hBSU5fT1VUUFVUTkFNRX0uc2gKKyAgICAgdXNhZ2UoKQorICAgICB7CisgICAgICAgZWNobyAidGVzdCIKKyAgICAgICAjIyMjIyMgVGhlIGZvbGxvd2luZyAifSIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGNhdXNlcyBhIHBhcnNpbmcgZXJyb3IgIyMjIyMjCisgICAgIH0KKyAgICAgRU9GCisgICAgIH0KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgV3JpdGluZyB0aGUgcmVjaXBlIHRoaXMgd2F5IGF2b2lkcyB0aGUgZXJyb3I6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBmYWtlcm9vdCBjcmVhdGVfc2hhcigpIHsKKyAgICAgICAgIGNhdCAmbHQ7Jmx0OyAiRU9GIiAmZ3Q7ICR7U0RLX0RFUExPWX0vJHtUT09MQ0hBSU5fT1VUUFVUTkFNRX0uc2gKKyAgICAgdXNhZ2UoKQorICAgICB7CisgICAgICAgZWNobyAidGVzdCIKKyAgICAgICAjIyMjIyNUaGUgZm9sbG93aW5nICJ9IiB3aXRoIGEgbGVhZGluZyBzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgYXZvaWRzIHRoZSBlcnJvciAjIyMjIyMKKyAgICAgIH0KKyAgICAgRU9GCisgICAgIH0KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nbG9jYXRpbmctYW5kLXBhcnNpbmctcmVjaXBlcyc+CisgICAgICAgIDx0aXRsZT5Mb2NhdGluZyBhbmQgUGFyc2luZyBSZWNpcGVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIER1cmluZyB0aGUgY29uZmlndXJhdGlvbiBwaGFzZSwgQml0QmFrZSB3aWxsIGhhdmUgc2V0CisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJGSUxFUyc+PGZpbGVuYW1lPkJCRklMRVM8L2ZpbGVuYW1lPjwvbGluaz4uCisgICAgICAgICAgICBCaXRCYWtlIG5vdyB1c2VzIGl0IHRvIGNvbnN0cnVjdCBhIGxpc3Qgb2YgcmVjaXBlcyB0byBwYXJzZSwKKyAgICAgICAgICAgIGFsb25nIHdpdGggYW55IGFwcGVuZCBmaWxlcyAoPGZpbGVuYW1lPi5iYmFwcGVuZDwvZmlsZW5hbWU+KQorICAgICAgICAgICAgdG8gYXBwbHkuCisgICAgICAgICAgICA8ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+IGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKKyAgICAgICAgICAgIGF2YWlsYWJsZSBmaWxlcyBhbmQgc3VwcG9ydHMgd2lsZGNhcmRzLgorICAgICAgICAgICAgQW4gZXhhbXBsZSB3b3VsZCBiZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJGSUxFUyA9ICIvcGF0aC90by9iYmZpbGVzLyouYmIgL3BhdGgvdG8vYXBwZW5kcy8qLmJiYXBwZW5kIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgQml0QmFrZSBwYXJzZXMgZWFjaCByZWNpcGUgYW5kIGFwcGVuZCBmaWxlIGxvY2F0ZWQKKyAgICAgICAgICAgIHdpdGggPGZpbGVuYW1lPkJCRklMRVM8L2ZpbGVuYW1lPiBhbmQgc3RvcmVzIHRoZSB2YWx1ZXMgb2YKKyAgICAgICAgICAgIHZhcmlvdXMgdmFyaWFibGVzIGludG8gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIEFwcGVuZCBmaWxlcyBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZW5jb3VudGVyZWQgaW4KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgRm9yIGVhY2ggZmlsZSwgYSBmcmVzaCBjb3B5IG9mIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gaXMKKyAgICAgICAgICAgIG1hZGUsIHRoZW4gdGhlIHJlY2lwZSBpcyBwYXJzZWQgbGluZSBieSBsaW5lLgorICAgICAgICAgICAgQW55IGluaGVyaXQgc3RhdGVtZW50cyBjYXVzZSBCaXRCYWtlIHRvIGZpbmQgYW5kCisgICAgICAgICAgICB0aGVuIHBhcnNlIGNsYXNzIGZpbGVzICg8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPikKKyAgICAgICAgICAgIHVzaW5nCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJQQVRIJz48ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICBhcyB0aGUgc2VhcmNoIHBhdGguCisgICAgICAgICAgICBGaW5hbGx5LCBCaXRCYWtlIHBhcnNlcyBpbiBvcmRlciBhbnkgYXBwZW5kIGZpbGVzIGZvdW5kIGluCisgICAgICAgICAgICA8ZmlsZW5hbWU+QkJGSUxFUzwvZmlsZW5hbWU+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbmUgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gdXNlIHRoZSByZWNpcGUgZmlsZW5hbWUgdG8gZGVmaW5lCisgICAgICAgICAgICBwaWVjZXMgb2YgbWV0YWRhdGEuCisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaW4gPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+IHRoZSByZWNpcGUKKyAgICAgICAgICAgIG5hbWUgYW5kIHZlcnNpb24gYXJlIHVzZWQgdG8gc2V0IHRoZSB2YXJpYWJsZXMKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+PGZpbGVuYW1lPlBOPC9maWxlbmFtZT48L2xpbms+IGFuZAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBWJz48ZmlsZW5hbWU+UFY8L2ZpbGVuYW1lPjwvbGluaz46CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBOID0gIiR7QGJiLnBhcnNlLkJCSGFuZGxlci52YXJzX2Zyb21fZmlsZShkLmdldFZhcignRklMRScsIEZhbHNlKSxkKVswXSBvciAnZGVmYXVsdHBrZ25hbWUnfSIKKyAgICAgUFYgPSAiJHtAYmIucGFyc2UuQkJIYW5kbGVyLnZhcnNfZnJvbV9maWxlKGQuZ2V0VmFyKCdGSUxFJywgRmFsc2UpLGQpWzFdIG9yICcxLjAnfSIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgYSByZWNpcGUgY2FsbGVkICJzb21ldGhpbmdfMS4yLjMuYmIiIHdvdWxkIHNldAorICAgICAgICAgICAgPGZpbGVuYW1lPlBOPC9maWxlbmFtZT4gdG8gInNvbWV0aGluZyIgYW5kCisgICAgICAgICAgICA8ZmlsZW5hbWU+UFY8L2ZpbGVuYW1lPiB0byAiMS4yLjMiLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCeSB0aGUgdGltZSBwYXJzaW5nIGlzIGNvbXBsZXRlIGZvciBhIHJlY2lwZSwgQml0QmFrZQorICAgICAgICAgICAgaGFzIGEgbGlzdCBvZiB0YXNrcyB0aGF0IHRoZSByZWNpcGUgZGVmaW5lcyBhbmQgYSBzZXQgb2YKKyAgICAgICAgICAgIGRhdGEgY29uc2lzdGluZyBvZiBrZXlzIGFuZCB2YWx1ZXMgYXMgd2VsbCBhcworICAgICAgICAgICAgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFza3MuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgZG9lcyBub3QgbmVlZCBhbGwgb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIEl0IG9ubHkgbmVlZHMgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIGluZm9ybWF0aW9uIHRvIG1ha2UKKyAgICAgICAgICAgIGRlY2lzaW9ucyBhYm91dCB0aGUgcmVjaXBlLgorICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBCaXRCYWtlIGNhY2hlcyB0aGUgdmFsdWVzIGluIHdoaWNoIGl0IGlzCisgICAgICAgICAgICBpbnRlcmVzdGVkIGFuZCBkb2VzIG5vdCBzdG9yZSB0aGUgcmVzdCBvZiB0aGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICBFeHBlcmllbmNlIGhhcyBzaG93biBpdCBpcyBmYXN0ZXIgdG8gcmUtcGFyc2UgdGhlIG1ldGFkYXRhIHRoYW4gdG8KKyAgICAgICAgICAgIHRyeSBhbmQgd3JpdGUgaXQgb3V0IHRvIHRoZSBkaXNrIGFuZCB0aGVuIHJlbG9hZCBpdC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlcmUgcG9zc2libGUsIHN1YnNlcXVlbnQgQml0QmFrZSBjb21tYW5kcyByZXVzZSB0aGlzIGNhY2hlIG9mCisgICAgICAgICAgICByZWNpcGUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICBUaGUgdmFsaWRpdHkgb2YgdGhpcyBjYWNoZSBpcyBkZXRlcm1pbmVkIGJ5IGZpcnN0IGNvbXB1dGluZyBhCisgICAgICAgICAgICBjaGVja3N1bSBvZiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRhdGEgKHNlZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0hBU0hDT05GSUdfV0hJVEVMSVNUJz48ZmlsZW5hbWU+QkJfSEFTSENPTkZJR19XSElURUxJU1Q8L2ZpbGVuYW1lPjwvbGluaz4pCisgICAgICAgICAgICBhbmQgdGhlbiBjaGVja2luZyBpZiB0aGUgY2hlY2tzdW0gbWF0Y2hlcy4KKyAgICAgICAgICAgIElmIHRoYXQgY2hlY2tzdW0gbWF0Y2hlcyB3aGF0IGlzIGluIHRoZSBjYWNoZSBhbmQgdGhlIHJlY2lwZQorICAgICAgICAgICAgYW5kIGNsYXNzIGZpbGVzIGhhdmUgbm90IGNoYW5nZWQsIEJpdGJha2UgaXMgYWJsZSB0byB1c2UKKyAgICAgICAgICAgIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIEJpdEJha2UgdGhlbiByZWxvYWRzIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2lwZQorICAgICAgICAgICAgaW5zdGVhZCBvZiByZXBhcnNpbmcgaXQgZnJvbSBzY3JhdGNoLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBSZWNpcGUgZmlsZSBjb2xsZWN0aW9ucyBleGlzdCB0byBhbGxvdyB0aGUgdXNlciB0bworICAgICAgICAgICAgaGF2ZSBtdWx0aXBsZSByZXBvc2l0b3JpZXMgb2YKKyAgICAgICAgICAgIDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPiBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIHNhbWUKKyAgICAgICAgICAgIGV4YWN0IHBhY2thZ2UuCisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGVhc2lseSB1c2UgdGhlbSB0byBtYWtlIG9uZSdzCisgICAgICAgICAgICBvd24gbG9jYWwgY29weSBvZiBhbiB1cHN0cmVhbSByZXBvc2l0b3J5LCBidXQgd2l0aAorICAgICAgICAgICAgY3VzdG9tIG1vZGlmaWNhdGlvbnMgdGhhdCBvbmUgZG9lcyBub3Qgd2FudCB1cHN0cmVhbS4KKyAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICBCQkZJTEVTID0gIi9zdHVmZi9vcGVuZW1iZWRkZWQvKi8qLmJiIC9zdHVmZi9vcGVuZW1iZWRkZWQubW9kaWZpZWQvKi8qLmJiIgorICAgIEJCRklMRV9DT0xMRUNUSU9OUyA9ICJ1cHN0cmVhbSBsb2NhbCIKKyAgICBCQkZJTEVfUEFUVEVSTl91cHN0cmVhbSA9ICJeL3N0dWZmL29wZW5lbWJlZGRlZC8iCisgICAgQkJGSUxFX1BBVFRFUk5fbG9jYWwgPSAiXi9zdHVmZi9vcGVuZW1iZWRkZWQubW9kaWZpZWQvIgorICAgIEJCRklMRV9QUklPUklUWV91cHN0cmVhbSA9ICI1IgorICAgIEJCRklMRV9QUklPUklUWV9sb2NhbCA9ICIxMCIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIFRoZSBsYXllcnMgbWVjaGFuaXNtIGlzIG5vdyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiBjb2xsZWN0aW5nCisgICAgICAgICAgICAgICAgY29kZS4KKyAgICAgICAgICAgICAgICBXaGlsZSB0aGUgY29sbGVjdGlvbnMgY29kZSByZW1haW5zLCBpdHMgbWFpbiB1c2UgaXMgdG8gc2V0IGxheWVyCisgICAgICAgICAgICAgICAgcHJpb3JpdGllcyBhbmQgdG8gZGVhbCB3aXRoIG92ZXJsYXAgKGNvbmZsaWN0cykgYmV0d2VlbiBsYXllcnMuCisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nYmItYml0YmFrZS1wcm92aWRlcnMnPgorICAgICAgICA8dGl0bGU+UHJvdmlkZXJzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzc3VtaW5nIEJpdEJha2UgaGFzIGJlZW4gaW5zdHJ1Y3RlZCB0byBleGVjdXRlIGEgdGFyZ2V0CisgICAgICAgICAgICBhbmQgdGhhdCBhbGwgdGhlIHJlY2lwZSBmaWxlcyBoYXZlIGJlZW4gcGFyc2VkLCBCaXRCYWtlCisgICAgICAgICAgICBzdGFydHMgdG8gZmlndXJlIG91dCBob3cgdG8gYnVpbGQgdGhlIHRhcmdldC4KKyAgICAgICAgICAgIEJpdEJha2UgbG9va3MgdGhyb3VnaCB0aGUgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4gbGlzdAorICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIHJlY2lwZXMuCisgICAgICAgICAgICBBIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+IGxpc3QgaXMgdGhlIGxpc3Qgb2YgbmFtZXMgYnkgd2hpY2gKKyAgICAgICAgICAgIHRoZSByZWNpcGUgY2FuIGJlIGtub3duLgorICAgICAgICAgICAgRWFjaCByZWNpcGUncyA8ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPiBsaXN0IGlzIGNyZWF0ZWQKKyAgICAgICAgICAgIGltcGxpY2l0bHkgdGhyb3VnaCB0aGUgcmVjaXBlJ3MKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+PGZpbGVuYW1lPlBOPC9maWxlbmFtZT48L2xpbms+IHZhcmlhYmxlCisgICAgICAgICAgICBhbmQgZXhwbGljaXRseSB0aHJvdWdoIHRoZSByZWNpcGUncworICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBST1ZJREVTJz48ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlLCB3aGljaCBpcyBvcHRpb25hbC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlbiBhIHJlY2lwZSB1c2VzIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+LCB0aGF0IHJlY2lwZSdzCisgICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGNhbiBiZSBmb3VuZCB1bmRlciBhbiBhbHRlcm5hdGl2ZSBuYW1lIG9yIG5hbWVzIG90aGVyCisgICAgICAgICAgICB0aGFuIHRoZSBpbXBsaWNpdCA8ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPiBuYW1lLgorICAgICAgICAgICAgQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSBhIHJlY2lwZSBuYW1lZCA8ZmlsZW5hbWU+a2V5Ym9hcmRfMS4wLmJiPC9maWxlbmFtZT4KKyAgICAgICAgICAgIGNvbnRhaW5lZCB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBQUk9WSURFUyArPSAiZnVsbGtleWJvYXJkIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+IGxpc3QgZm9yIHRoaXMgcmVjaXBlIGJlY29tZXMKKyAgICAgICAgICAgICJrZXlib2FyZCIsIHdoaWNoIGlzIGltcGxpY2l0LCBhbmQgImZ1bGxrZXlib2FyZCIsIHdoaWNoIGlzIGV4cGxpY2l0LgorICAgICAgICAgICAgQ29uc2VxdWVudGx5LCB0aGUgZnVuY3Rpb25hbGl0eSBmb3VuZCBpbgorICAgICAgICAgICAgPGZpbGVuYW1lPmtleWJvYXJkXzEuMC5iYjwvZmlsZW5hbWU+IGNhbiBiZSBmb3VuZCB1bmRlciB0d28KKyAgICAgICAgICAgIGRpZmZlcmVudCBuYW1lcy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdiYi1iaXRiYWtlLXByZWZlcmVuY2VzJz4KKyAgICAgICAgPHRpdGxlPlByZWZlcmVuY2VzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPiBsaXN0IGlzIG9ubHkgcGFydCBvZiB0aGUgc29sdXRpb24KKyAgICAgICAgICAgIGZvciBmaWd1cmluZyBvdXQgYSB0YXJnZXQncyByZWNpcGVzLgorICAgICAgICAgICAgQmVjYXVzZSB0YXJnZXRzIG1pZ2h0IGhhdmUgbXVsdGlwbGUgcHJvdmlkZXJzLCBCaXRCYWtlIG5lZWRzCisgICAgICAgICAgICB0byBwcmlvcml0aXplIHByb3ZpZGVycyBieSBkZXRlcm1pbmluZyBwcm92aWRlciBwcmVmZXJlbmNlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSBjb21tb24gZXhhbXBsZSBpbiB3aGljaCBhIHRhcmdldCBoYXMgbXVsdGlwbGUgcHJvdmlkZXJzCisgICAgICAgICAgICBpcyAidmlydHVhbC9rZXJuZWwiLCB3aGljaCBpcyBvbiB0aGUKKyAgICAgICAgICAgIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+IGxpc3QgZm9yIGVhY2gga2VybmVsIHJlY2lwZS4KKyAgICAgICAgICAgIEVhY2ggbWFjaGluZSBvZnRlbiBzZWxlY3RzIHRoZSBiZXN0IGtlcm5lbCBwcm92aWRlciBieSB1c2luZyBhCisgICAgICAgICAgICBsaW5lIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBpbiB0aGUgbWFjaGluZSBjb25maWd1cmF0aW9uIGZpbGU6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRUZFUlJFRF9QUk9WSURFUl92aXJ0dWFsL2tlcm5lbCA9ICJsaW51eC15b2N0byIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoZSBkZWZhdWx0CisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFJFRkVSUkVEX1BST1ZJREVSJz48ZmlsZW5hbWU+UFJFRkVSUkVEX1BST1ZJREVSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICBpcyB0aGUgcHJvdmlkZXIgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSB0YXJnZXQuCisgICAgICAgICAgICBCaXRiYWtlIGl0ZXJhdGVzIHRocm91Z2ggZWFjaCB0YXJnZXQgaXQgbmVlZHMgdG8gYnVpbGQgYW5kCisgICAgICAgICAgICByZXNvbHZlcyB0aGVtIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdXNpbmcgdGhpcyBwcm9jZXNzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBVbmRlcnN0YW5kaW5nIGhvdyBwcm92aWRlcnMgYXJlIGNob3NlbiBpcyBtYWRlIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0CisgICAgICAgICAgICB0aGF0IG11bHRpcGxlIHZlcnNpb25zIG1pZ2h0IGV4aXN0IGZvciBhIGdpdmVuIHByb3ZpZGVyLgorICAgICAgICAgICAgQml0QmFrZSBkZWZhdWx0cyB0byB0aGUgaGlnaGVzdCB2ZXJzaW9uIG9mIGEgcHJvdmlkZXIuCisgICAgICAgICAgICBWZXJzaW9uIGNvbXBhcmlzb25zIGFyZSBtYWRlIHVzaW5nIHRoZSBzYW1lIG1ldGhvZCBhcyBEZWJpYW4uCisgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QUkVGRVJSRURfVkVSU0lPTic+PGZpbGVuYW1lPlBSRUZFUlJFRF9WRVJTSU9OPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSB0byBzcGVjaWZ5IGEgcGFydGljdWxhciB2ZXJzaW9uLgorICAgICAgICAgICAgWW91IGNhbiBpbmZsdWVuY2UgdGhlIG9yZGVyIGJ5IHVzaW5nIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURFRkFVTFRfUFJFRkVSRU5DRSc+PGZpbGVuYW1lPkRFRkFVTFRfUFJFRkVSRU5DRTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJ5IGRlZmF1bHQsIGZpbGVzIGhhdmUgYSBwcmVmZXJlbmNlIG9mICIwIi4KKyAgICAgICAgICAgIFNldHRpbmcgPGZpbGVuYW1lPkRFRkFVTFRfUFJFRkVSRU5DRTwvZmlsZW5hbWU+IHRvICItMSIgbWFrZXMgdGhlCisgICAgICAgICAgICByZWNpcGUgdW5saWtlbHkgdG8gYmUgdXNlZCB1bmxlc3MgaXQgaXMgZXhwbGljaXRseSByZWZlcmVuY2VkLgorICAgICAgICAgICAgU2V0dGluZyA8ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT4gdG8gIjEiIG1ha2VzIGl0CisgICAgICAgICAgICBsaWtlbHkgdGhlIHJlY2lwZSBpcyB1c2VkLgorICAgICAgICAgICAgPGZpbGVuYW1lPlBSRUZFUlJFRF9WRVJTSU9OPC9maWxlbmFtZT4gb3ZlcnJpZGVzIGFueQorICAgICAgICAgICAgPGZpbGVuYW1lPkRFRkFVTFRfUFJFRkVSRU5DRTwvZmlsZW5hbWU+IHNldHRpbmcuCisgICAgICAgICAgICA8ZmlsZW5hbWU+REVGQVVMVF9QUkVGRVJFTkNFPC9maWxlbmFtZT4gaXMgb2Z0ZW4gdXNlZCB0byBtYXJrIG5ld2VyCisgICAgICAgICAgICBhbmQgbW9yZSBleHBlcmltZW50YWwgcmVjaXBlIHZlcnNpb25zIHVudGlsIHRoZXkgaGF2ZSB1bmRlcmdvbmUKKyAgICAgICAgICAgIHN1ZmZpY2llbnQgdGVzdGluZyB0byBiZSBjb25zaWRlcmVkIHN0YWJsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUg4oCcdmVyc2lvbnPigJ0gb2YgYSBnaXZlbiByZWNpcGUsCisgICAgICAgICAgICBCaXRCYWtlIGRlZmF1bHRzIHRvIHNlbGVjdGluZyB0aGUgbW9zdCByZWNlbnQKKyAgICAgICAgICAgIHZlcnNpb24sIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLgorICAgICAgICAgICAgSWYgdGhlIHJlY2lwZSBpbiBxdWVzdGlvbiBoYXMgYQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURFRkFVTFRfUFJFRkVSRU5DRSc+PGZpbGVuYW1lPkRFRkFVTFRfUFJFRkVSRU5DRTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgc2V0IGxvd2VyIHRoYW4gdGhlIG90aGVyIHJlY2lwZXMgKGRlZmF1bHQgaXMgMCksIHRoZW4KKyAgICAgICAgICAgIGl0IHdpbGwgbm90IGJlIHNlbGVjdGVkLgorICAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIHBlcnNvbiBvciBwZXJzb25zIG1haW50YWluaW5nCisgICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBvZiByZWNpcGUgZmlsZXMgdG8gc3BlY2lmeQorICAgICAgICAgICAgdGhlaXIgcHJlZmVyZW5jZSBmb3IgdGhlIGRlZmF1bHQgc2VsZWN0ZWQgdmVyc2lvbi4KKyAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgdGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhlaXIgcHJlZmVycmVkIHZlcnNpb24uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIHRoZSBmaXJzdCByZWNpcGUgaXMgbmFtZWQgPGZpbGVuYW1lPmFfMS4xLmJiPC9maWxlbmFtZT4sIHRoZW4gdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUE4nPjxmaWxlbmFtZT5QTjwvZmlsZW5hbWU+PC9saW5rPiB2YXJpYWJsZQorICAgICAgICAgICAgd2lsbCBiZSBzZXQgdG8g4oCcYeKAnSwgYW5kIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBWJz48ZmlsZW5hbWU+UFY8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIDEuMS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGh1cywgaWYgYSByZWNpcGUgbmFtZWQgPGZpbGVuYW1lPmFfMS4yLmJiPC9maWxlbmFtZT4gZXhpc3RzLCBCaXRCYWtlCisgICAgICAgICAgICB3aWxsIGNob29zZSAxLjIgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIEhvd2V2ZXIsIGlmIHlvdSBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpbiBhCisgICAgICAgICAgICA8ZmlsZW5hbWU+LmNvbmY8L2ZpbGVuYW1lPiBmaWxlIHRoYXQgQml0QmFrZSBwYXJzZXMsIHlvdQorICAgICAgICAgICAgY2FuIGNoYW5nZSB0aGF0IHByZWZlcmVuY2U6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRUZFUlJFRF9WRVJTSU9OX2EgPSAiMS4xIgorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJdCBpcyBjb21tb24gZm9yIGEgcmVjaXBlIHRvIHByb3ZpZGUgdHdvIHZlcnNpb25zIC0tIGEgc3RhYmxlLAorICAgICAgICAgICAgICAgIG51bWJlcmVkIChhbmQgcHJlZmVycmVkKSB2ZXJzaW9uLCBhbmQgYSB2ZXJzaW9uIHRoYXQgaXMKKyAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGNoZWNrZWQgb3V0IGZyb20gYSBzb3VyY2UgY29kZSByZXBvc2l0b3J5IHRoYXQKKyAgICAgICAgICAgICAgICBpcyBjb25zaWRlcmVkIG1vcmUgImJsZWVkaW5nIGVkZ2UiIGJ1dCBjYW4gYmUgc2VsZWN0ZWQgb25seQorICAgICAgICAgICAgICAgIGV4cGxpY2l0bHkuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpbiB0aGUgT3BlbkVtYmVkZGVkIGNvZGViYXNlLCB0aGVyZSBpcyBhIHN0YW5kYXJkLAorICAgICAgICAgICAgICAgIHZlcnNpb25lZCByZWNpcGUgZmlsZSBmb3IgQnVzeUJveCwKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YnVzeWJveF8xLjIyLjEuYmI8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICBidXQgdGhlcmUgaXMgYWxzbyBhIEdpdC1iYXNlZCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5idXN5Ym94X2dpdC5iYjwvZmlsZW5hbWU+LCB3aGljaCBleHBsaWNpdGx5IGNvbnRhaW5zIHRoZSBsaW5lCisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgIERFRkFVTFRfUFJFRkVSRU5DRSA9ICItMSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgdG8gZW5zdXJlIHRoYXQgdGhlIG51bWJlcmVkLCBzdGFibGUgdmVyc2lvbiBpcyBhbHdheXMgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgdW5sZXNzIHRoZSBkZXZlbG9wZXIgc2VsZWN0cyBvdGhlcndpc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nYmItYml0YmFrZS1kZXBlbmRlbmNpZXMnPgorICAgICAgICA8dGl0bGU+RGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEVhY2ggdGFyZ2V0IEJpdEJha2UgYnVpbGRzIGNvbnNpc3RzIG9mIG11bHRpcGxlIHRhc2tzIHN1Y2ggYXMKKyAgICAgICAgICAgIDxmaWxlbmFtZT5mZXRjaDwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+dW5wYWNrPC9maWxlbmFtZT4sCisgICAgICAgICAgICA8ZmlsZW5hbWU+cGF0Y2g8L2ZpbGVuYW1lPiwgPGZpbGVuYW1lPmNvbmZpZ3VyZTwvZmlsZW5hbWU+LAorICAgICAgICAgICAgYW5kIDxmaWxlbmFtZT5jb21waWxlPC9maWxlbmFtZT4uCisgICAgICAgICAgICBGb3IgYmVzdCBwZXJmb3JtYW5jZSBvbiBtdWx0aS1jb3JlIHN5c3RlbXMsIEJpdEJha2UgY29uc2lkZXJzIGVhY2gKKyAgICAgICAgICAgIHRhc2sgYXMgYW4gaW5kZXBlbmRlbnQKKyAgICAgICAgICAgIGVudGl0eSB3aXRoIGl0cyBvd24gc2V0IG9mIGRlcGVuZGVuY2llcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRGVwZW5kZW5jaWVzIGFyZSBkZWZpbmVkIHRocm91Z2ggc2V2ZXJhbCB2YXJpYWJsZXMuCisgICAgICAgICAgICBZb3UgY2FuIGZpbmQgaW5mb3JtYXRpb24gYWJvdXQgdmFyaWFibGVzIEJpdEJha2UgdXNlcyBpbgorICAgICAgICAgICAgdGhlIDxsaW5rIGxpbmtlbmQ9J3JlZi12YXJpYWJsZXMtZ2xvcyc+VmFyaWFibGVzIEdsb3NzYXJ5PC9saW5rPgorICAgICAgICAgICAgbmVhciB0aGUgZW5kIG9mIHRoaXMgbWFudWFsLgorICAgICAgICAgICAgQXQgYSBiYXNpYyBsZXZlbCwgaXQgaXMgc3VmZmljaWVudCB0byBrbm93IHRoYXQgQml0QmFrZSB1c2VzIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURFUEVORFMnPjxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT48L2xpbms+IGFuZAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVJERVBFTkRTJz48ZmlsZW5hbWU+UkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4gdmFyaWFibGVzIHdoZW4KKyAgICAgICAgICAgIGNhbGN1bGF0aW5nIGRlcGVuZGVuY2llcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IEJpdEJha2UgaGFuZGxlcyBkZXBlbmRlbmNpZXMsIHNlZSB0aGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdkZXBlbmRlbmNpZXMnPkRlcGVuZGVuY2llczwvbGluaz4iIHNlY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0ncmVmLWJpdGJha2UtdGFza2xpc3QnPgorICAgICAgICA8dGl0bGU+VGhlIFRhc2sgTGlzdDwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCYXNlZCBvbiB0aGUgZ2VuZXJhdGVkIGxpc3Qgb2YgcHJvdmlkZXJzIGFuZCB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiwKKyAgICAgICAgICAgIEJpdEJha2UgY2FuIG5vdyBjYWxjdWxhdGUgZXhhY3RseSB3aGF0IHRhc2tzIGl0IG5lZWRzIHRvIHJ1biBhbmQgaW4gd2hhdAorICAgICAgICAgICAgb3JkZXIgaXQgbmVlZHMgdG8gcnVuIHRoZW0uCisgICAgICAgICAgICBUaGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdleGVjdXRpbmctdGFza3MnPkV4ZWN1dGluZyBUYXNrczwvbGluaz4iIHNlY3Rpb24gaGFzIG1vcmUKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIG9uIGhvdyBCaXRCYWtlIGNob29zZXMgd2hpY2ggdGFzayB0byBleGVjdXRlIG5leHQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBidWlsZCBub3cgc3RhcnRzIHdpdGggQml0QmFrZSBmb3JraW5nIG9mZiB0aHJlYWRzIHVwIHRvIHRoZSBsaW1pdCBzZXQgaW4gdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfTlVNQkVSX1RIUkVBRFMnPjxmaWxlbmFtZT5CQl9OVU1CRVJfVEhSRUFEUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICBCaXRCYWtlIGNvbnRpbnVlcyB0byBmb3JrIHRocmVhZHMgYXMgbG9uZyBhcyB0aGVyZSBhcmUgdGFza3MgcmVhZHkgdG8gcnVuLAorICAgICAgICAgICAgdGhvc2UgdGFza3MgaGF2ZSBhbGwgdGhlaXIgZGVwZW5kZW5jaWVzIG1ldCwgYW5kIHRoZSB0aHJlYWQgdGhyZXNob2xkIGhhcyBub3QgYmVlbgorICAgICAgICAgICAgZXhjZWVkZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHlvdSBjYW4gZ3JlYXRseSBzcGVlZCB1cCB0aGUgYnVpbGQgdGltZSBieSBwcm9wZXJseSBzZXR0aW5nCisgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPkJCX05VTUJFUl9USFJFQURTPC9maWxlbmFtZT4gdmFyaWFibGUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzIGVhY2ggdGFzayBjb21wbGV0ZXMsIGEgdGltZXN0YW1wIGlzIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU1RBTVAnPjxmaWxlbmFtZT5TVEFNUDwvZmlsZW5hbWU+PC9saW5rPiB2YXJpYWJsZS4KKyAgICAgICAgICAgIE9uIHN1YnNlcXVlbnQgcnVucywgQml0QmFrZSBsb29rcyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5IHdpdGhpbgorICAgICAgICAgICAgPGZpbGVuYW1lPnRtcC9zdGFtcHM8L2ZpbGVuYW1lPiBhbmQgZG9lcyBub3QgcmVydW4KKyAgICAgICAgICAgIHRhc2tzIHRoYXQgYXJlIGFscmVhZHkgY29tcGxldGVkIHVubGVzcyBhIHRpbWVzdGFtcCBpcyBmb3VuZCB0byBiZSBpbnZhbGlkLgorICAgICAgICAgICAgQ3VycmVudGx5LCBpbnZhbGlkIHRpbWVzdGFtcHMgYXJlIG9ubHkgY29uc2lkZXJlZCBvbiBhIHBlcgorICAgICAgICAgICAgcmVjaXBlIGZpbGUgYmFzaXMuCisgICAgICAgICAgICBTbywgZm9yIGV4YW1wbGUsIGlmIHRoZSBjb25maWd1cmUgc3RhbXAgaGFzIGEgdGltZXN0YW1wIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIGNvbXBpbGUgdGltZXN0YW1wIGZvciBhIGdpdmVuIHRhcmdldCwgdGhlbiB0aGUgY29tcGlsZSB0YXNrIHdvdWxkIHJlcnVuLgorICAgICAgICAgICAgUnVubmluZyB0aGUgY29tcGlsZSB0YXNrIGFnYWluLCBob3dldmVyLCBoYXMgbm8gZWZmZWN0IG9uIG90aGVyIHByb3ZpZGVycworICAgICAgICAgICAgdGhhdCBkZXBlbmQgb24gdGhhdCB0YXJnZXQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBleGFjdCBmb3JtYXQgb2YgdGhlIHN0YW1wcyBpcyBwYXJ0bHkgY29uZmlndXJhYmxlLgorICAgICAgICAgICAgSW4gbW9kZXJuIHZlcnNpb25zIG9mIEJpdEJha2UsIGEgaGFzaCBpcyBhcHBlbmRlZCB0byB0aGUKKyAgICAgICAgICAgIHN0YW1wIHNvIHRoYXQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgdGhlIHN0YW1wIGJlY29tZXMKKyAgICAgICAgICAgIGludmFsaWQgYW5kIHRoZSB0YXNrIGlzIGF1dG9tYXRpY2FsbHkgcmVydW4uCisgICAgICAgICAgICBUaGlzIGhhc2gsIG9yIHNpZ25hdHVyZSB1c2VkLCBpcyBnb3Zlcm5lZCBieSB0aGUgc2lnbmF0dXJlIHBvbGljeQorICAgICAgICAgICAgdGhhdCBpcyBjb25maWd1cmVkIChzZWUgdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0nY2hlY2tzdW1zJz5DaGVja3N1bXMgKFNpZ25hdHVyZXMpPC9saW5rPiIKKyAgICAgICAgICAgIHNlY3Rpb24gZm9yIGluZm9ybWF0aW9uKS4KKyAgICAgICAgICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYXBwZW5kIGV4dHJhIG1ldGFkYXRhIHRvIHRoZSBzdGFtcCB1c2luZworICAgICAgICAgICAgdGhlICJzdGFtcC1leHRyYS1pbmZvIiB0YXNrIGZsYWcuCisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgT3BlbkVtYmVkZGVkIHVzZXMgdGhpcyBmbGFnIHRvIG1ha2Ugc29tZSB0YXNrcyBtYWNoaW5lLXNwZWNpZmljLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICBTb21lIHRhc2tzIGFyZSBtYXJrZWQgYXMgIm5vc3RhbXAiIHRhc2tzLgorICAgICAgICAgICAgTm8gdGltZXN0YW1wIGZpbGUgaXMgY3JlYXRlZCB3aGVuIHRoZXNlIHRhc2tzIGFyZSBydW4uCisgICAgICAgICAgICBDb25zZXF1ZW50bHksICJub3N0YW1wIiB0YXNrcyBhcmUgYWx3YXlzIHJlcnVuLgorICAgICAgICA8L25vdGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0YXNrcywgc2VlIHRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3Rhc2tzJz5UYXNrczwvbGluaz4iIHNlY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nZXhlY3V0aW5nLXRhc2tzJz4KKyAgICAgICAgPHRpdGxlPkV4ZWN1dGluZyBUYXNrczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUYXNrcyBjYW4gYmUgZWl0aGVyIGEgc2hlbGwgdGFzayBvciBhIFB5dGhvbiB0YXNrLgorICAgICAgICAgICAgRm9yIHNoZWxsIHRhc2tzLCBCaXRCYWtlIHdyaXRlcyBhIHNoZWxsIHNjcmlwdCB0bworICAgICAgICAgICAgPGZpbGVuYW1lPiR7PC9maWxlbmFtZT48bGluayBsaW5rZW5kPSd2YXItVCc+PGZpbGVuYW1lPlQ8L2ZpbGVuYW1lPjwvbGluaz48ZmlsZW5hbWU+fS9ydW4uZG9fdGFza25hbWUucGlkPC9maWxlbmFtZT4KKyAgICAgICAgICAgIGFuZCB0aGVuIGV4ZWN1dGVzIHRoZSBzY3JpcHQuCisgICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIHNoZWxsIHNjcmlwdCBjb250YWlucyBhbGwgdGhlIGV4cG9ydGVkIHZhcmlhYmxlcywKKyAgICAgICAgICAgIGFuZCB0aGUgc2hlbGwgZnVuY3Rpb25zIHdpdGggYWxsIHZhcmlhYmxlcyBleHBhbmRlZC4KKyAgICAgICAgICAgIE91dHB1dCBmcm9tIHRoZSBzaGVsbCBzY3JpcHQgZ29lcyB0byB0aGUgZmlsZQorICAgICAgICAgICAgPGZpbGVuYW1lPiR7VH0vbG9nLmRvX3Rhc2tuYW1lLnBpZDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgTG9va2luZyBhdCB0aGUgZXhwYW5kZWQgc2hlbGwgZnVuY3Rpb25zIGluIHRoZSBydW4gZmlsZSBhbmQKKyAgICAgICAgICAgIHRoZSBvdXRwdXQgaW4gdGhlIGxvZyBmaWxlcyBpcyBhIHVzZWZ1bCBkZWJ1Z2dpbmcgdGVjaG5pcXVlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb3IgUHl0aG9uIHRhc2tzLCBCaXRCYWtlIGV4ZWN1dGVzIHRoZSB0YXNrIGludGVybmFsbHkgYW5kIGxvZ3MKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIHRvIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbC4KKyAgICAgICAgICAgIEZ1dHVyZSB2ZXJzaW9ucyBvZiBCaXRCYWtlIHdpbGwgd3JpdGUgdGhlIGZ1bmN0aW9ucyB0byBmaWxlcworICAgICAgICAgICAgc2ltaWxhciB0byB0aGUgd2F5IHNoZWxsIHRhc2tzIGFyZSBoYW5kbGVkLgorICAgICAgICAgICAgTG9nZ2luZyB3aWxsIGJlIGhhbmRsZWQgaW4gYSB3YXkgc2ltaWxhciB0byBzaGVsbCB0YXNrcyBhcyB3ZWxsLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggQml0QmFrZSBydW5zIHRoZSB0YXNrcyBpcyBjb250cm9sbGVkIGJ5IGl0cworICAgICAgICAgICAgdGFzayBzY2hlZHVsZXIuCisgICAgICAgICAgICBJdCBpcyBwb3NzaWJsZSB0byBjb25maWd1cmUgdGhlIHNjaGVkdWxlciBhbmQgZGVmaW5lIGN1c3RvbQorICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIGZvciBzcGVjaWZpYyB1c2UgY2FzZXMuCisgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZXNlIHZhcmlhYmxlcyB0aGF0IGNvbnRyb2wgdGhlCisgICAgICAgICAgICBiZWhhdmlvcjoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfU0NIRURVTEVSJz48ZmlsZW5hbWU+QkJfU0NIRURVTEVSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1NDSEVEVUxFUlMnPjxmaWxlbmFtZT5CQl9TQ0hFRFVMRVJTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGZ1bmN0aW9ucyBydW4gYmVmb3JlIGFuZCBhZnRlciBhIHRhc2sncyBtYWluCisgICAgICAgICAgICBmdW5jdGlvbi4KKyAgICAgICAgICAgIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgInByZWZ1bmNzIiBhbmQgInBvc3RmdW5jcyIgZmxhZ3Mgb2YgdGhlIHRhc2sKKyAgICAgICAgICAgIHRoYXQgbGlzdHMgdGhlIGZ1bmN0aW9ucyB0byBydW4uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nY2hlY2tzdW1zJz4KKyAgICAgICAgPHRpdGxlPkNoZWNrc3VtcyAoU2lnbmF0dXJlcyk8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSBjaGVja3N1bSBpcyBhIHVuaXF1ZSBzaWduYXR1cmUgb2YgYSB0YXNrJ3MgaW5wdXRzLgorICAgICAgICAgICAgVGhlIHNpZ25hdHVyZSBvZiBhIHRhc2sgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdGFzaworICAgICAgICAgICAgbmVlZHMgdG8gYmUgcnVuLgorICAgICAgICAgICAgQmVjYXVzZSBpdCBpcyBhIGNoYW5nZSBpbiBhIHRhc2sncyBpbnB1dHMgdGhhdCB0cmlnZ2VycyBydW5uaW5nCisgICAgICAgICAgICB0aGUgdGFzaywgQml0QmFrZSBuZWVkcyB0byBkZXRlY3QgYWxsIHRoZSBpbnB1dHMgdG8gYSBnaXZlbiB0YXNrLgorICAgICAgICAgICAgRm9yIHNoZWxsIHRhc2tzLCB0aGlzIHR1cm5zIG91dCB0byBiZSBmYWlybHkgZWFzeSBiZWNhdXNlCisgICAgICAgICAgICBCaXRCYWtlIGdlbmVyYXRlcyBhICJydW4iIHNoZWxsIHNjcmlwdCBmb3IgZWFjaCB0YXNrIGFuZAorICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgY2hlY2tzdW0gdGhhdCBnaXZlcyB5b3UgYSBnb29kIGlkZWEgb2Ygd2hlbgorICAgICAgICAgICAgdGhlIHRhc2sncyBkYXRhIGNoYW5nZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIGNvbXBsaWNhdGUgdGhlIHByb2JsZW0sIHNvbWUgdGhpbmdzIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgICAgIHRoZSBjaGVja3N1bS4KKyAgICAgICAgICAgIEZpcnN0LCB0aGVyZSBpcyB0aGUgYWN0dWFsIHNwZWNpZmljIGJ1aWxkIHBhdGggb2YgYSBnaXZlbiB0YXNrIC0KKyAgICAgICAgICAgIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIEl0IGRvZXMgbm90IG1hdHRlciBpZiB0aGUgd29ya2luZyBkaXJlY3RvcnkgY2hhbmdlcyBiZWNhdXNlIGl0IHNob3VsZCBub3QKKyAgICAgICAgICAgIGFmZmVjdCB0aGUgb3V0cHV0IGZvciB0YXJnZXQgcGFja2FnZXMuCisgICAgICAgICAgICBUaGUgc2ltcGxpc3RpYyBhcHByb2FjaCBmb3IgZXhjbHVkaW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB0byBzZXQKKyAgICAgICAgICAgIGl0IHRvIHNvbWUgZml4ZWQgdmFsdWUgYW5kIGNyZWF0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSAicnVuIiBzY3JpcHQuCisgICAgICAgICAgICBCaXRCYWtlIGdvZXMgb25lIHN0ZXAgYmV0dGVyIGFuZCB1c2VzIHRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0hBU0hCQVNFX1dISVRFTElTVCc+PGZpbGVuYW1lPkJCX0hBU0hCQVNFX1dISVRFTElTVDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUgdG8gZGVmaW5lIGEgbGlzdCBvZiB2YXJpYWJsZXMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgaW5jbHVkZWQKKyAgICAgICAgICAgIHdoZW4gZ2VuZXJhdGluZyB0aGUgc2lnbmF0dXJlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQW5vdGhlciBwcm9ibGVtIHJlc3VsdHMgZnJvbSB0aGUgInJ1biIgc2NyaXB0cyBjb250YWluaW5nIGZ1bmN0aW9ucyB0aGF0CisgICAgICAgICAgICBtaWdodCBvciBtaWdodCBub3QgZ2V0IGNhbGxlZC4KKyAgICAgICAgICAgIFRoZSBpbmNyZW1lbnRhbCBidWlsZCBzb2x1dGlvbiBjb250YWlucyBjb2RlIHRoYXQgZmlndXJlcyBvdXQgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBiZXR3ZWVuIHNoZWxsIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgIFRoaXMgY29kZSBpcyB1c2VkIHRvIHBydW5lIHRoZSAicnVuIiBzY3JpcHRzIGRvd24gdG8gdGhlIG1pbmltdW0gc2V0LAorICAgICAgICAgICAgdGhlcmVieSBhbGxldmlhdGluZyB0aGlzIHByb2JsZW0gYW5kIG1ha2luZyB0aGUgInJ1biIgc2NyaXB0cyBtdWNoIG1vcmUKKyAgICAgICAgICAgIHJlYWRhYmxlIGFzIGEgYm9udXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNvIGZhciB3ZSBoYXZlIHNvbHV0aW9ucyBmb3Igc2hlbGwgc2NyaXB0cy4KKyAgICAgICAgICAgIFdoYXQgYWJvdXQgUHl0aG9uIHRhc2tzPworICAgICAgICAgICAgVGhlIHNhbWUgYXBwcm9hY2ggYXBwbGllcyBldmVuIHRob3VnaCB0aGVzZSB0YXNrcyBhcmUgbW9yZSBkaWZmaWN1bHQuCisgICAgICAgICAgICBUaGUgcHJvY2VzcyBuZWVkcyB0byBmaWd1cmUgb3V0IHdoYXQgdmFyaWFibGVzIGEgUHl0aG9uIGZ1bmN0aW9uIGFjY2Vzc2VzCisgICAgICAgICAgICBhbmQgd2hhdCBmdW5jdGlvbnMgaXQgY2FsbHMuCisgICAgICAgICAgICBBZ2FpbiwgdGhlIGluY3JlbWVudGFsIGJ1aWxkIHNvbHV0aW9uIGNvbnRhaW5zIGNvZGUgdGhhdCBmaXJzdCBmaWd1cmVzIG91dAorICAgICAgICAgICAgdGhlIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBkZXBlbmRlbmNpZXMsIGFuZCB0aGVuIGNyZWF0ZXMgYSBjaGVja3N1bSBmb3IgdGhlIGRhdGEKKyAgICAgICAgICAgIHVzZWQgYXMgdGhlIGlucHV0IHRvIHRoZSB0YXNrLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMaWtlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBjYXNlLCBzaXR1YXRpb25zIGV4aXN0IHdoZXJlIGRlcGVuZGVuY2llcworICAgICAgICAgICAgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgICAgICBGb3IgdGhlc2UgY2FzZXMsIHlvdSBjYW4gaW5zdHJ1Y3QgdGhlIGJ1aWxkIHByb2Nlc3MgdG8gaWdub3JlIGEgZGVwZW5kZW5jeQorICAgICAgICAgICAgYnkgdXNpbmcgYSBsaW5lIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUEFDS0FHRV9BUkNIU1t2YXJkZXBzZXhjbHVkZV0gPSAiTUFDSElORSIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoaXMgZXhhbXBsZSBlbnN1cmVzIHRoYXQgdGhlIDxmaWxlbmFtZT5QQUNLQUdFX0FSQ0hTPC9maWxlbmFtZT4gdmFyaWFibGUgZG9lcyBub3QKKyAgICAgICAgICAgIGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YgPGZpbGVuYW1lPk1BQ0hJTkU8L2ZpbGVuYW1lPiwgZXZlbiBpZiBpdCBkb2VzIHJlZmVyZW5jZSBpdC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRXF1YWxseSwgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG8gYWRkIGRlcGVuZGVuY2llcyBCaXRCYWtlCisgICAgICAgICAgICBpcyBub3QgYWJsZSB0byBmaW5kLgorICAgICAgICAgICAgWW91IGNhbiBhY2NvbXBsaXNoIHRoaXMgYnkgdXNpbmcgYSBsaW5lIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgIFBBQ0tBR0VfQVJDSFNbdmFyZGVwc10gPSAiTUFDSElORSIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoaXMgZXhhbXBsZSBleHBsaWNpdGx5IGFkZHMgdGhlIDxmaWxlbmFtZT5NQUNISU5FPC9maWxlbmFtZT4gdmFyaWFibGUgYXMgYQorICAgICAgICAgICAgZGVwZW5kZW5jeSBmb3IgPGZpbGVuYW1lPlBBQ0tBR0VfQVJDSFM8L2ZpbGVuYW1lPi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQ29uc2lkZXIgYSBjYXNlIHdpdGggaW4tbGluZSBQeXRob24sIGZvciBleGFtcGxlLCB3aGVyZSBCaXRCYWtlIGlzIG5vdAorICAgICAgICAgICAgYWJsZSB0byBmaWd1cmUgb3V0IGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIFdoZW4gcnVubmluZyBpbiBkZWJ1ZyBtb2RlIChpLmUuIHVzaW5nIDxmaWxlbmFtZT4tREREPC9maWxlbmFtZT4pLCBCaXRCYWtlCisgICAgICAgICAgICBwcm9kdWNlcyBvdXRwdXQgd2hlbiBpdCBkaXNjb3ZlcnMgc29tZXRoaW5nIGZvciB3aGljaCBpdCBjYW5ub3QgZmlndXJlIG91dAorICAgICAgICAgICAgZGVwZW5kZW5jaWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaHVzIGZhciwgdGhpcyBzZWN0aW9uIGhhcyBsaW1pdGVkIGRpc2N1c3Npb24gdG8gdGhlIGRpcmVjdCBpbnB1dHMgaW50byBhIHRhc2suCisgICAgICAgICAgICBJbmZvcm1hdGlvbiBiYXNlZCBvbiBkaXJlY3QgaW5wdXRzIGlzIHJlZmVycmVkIHRvIGFzIHRoZSAiYmFzZWhhc2giIGluIHRoZQorICAgICAgICAgICAgY29kZS4KKyAgICAgICAgICAgIEhvd2V2ZXIsIHRoZXJlIGlzIHN0aWxsIHRoZSBxdWVzdGlvbiBvZiBhIHRhc2sncyBpbmRpcmVjdCBpbnB1dHMgLSB0aGUKKyAgICAgICAgICAgIHRoaW5ncyB0aGF0IHdlcmUgYWxyZWFkeSBidWlsdCBhbmQgcHJlc2VudCBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgICAgICAgICAgVGhlIGNoZWNrc3VtIChvciBzaWduYXR1cmUpIGZvciBhIHBhcnRpY3VsYXIgdGFzayBuZWVkcyB0byBhZGQgdGhlIGhhc2hlcworICAgICAgICAgICAgb2YgYWxsIHRoZSB0YXNrcyBvbiB3aGljaCB0aGUgcGFydGljdWxhciB0YXNrIGRlcGVuZHMuCisgICAgICAgICAgICBDaG9vc2luZyB3aGljaCBkZXBlbmRlbmNpZXMgdG8gYWRkIGlzIGEgcG9saWN5IGRlY2lzaW9uLgorICAgICAgICAgICAgSG93ZXZlciwgdGhlIGVmZmVjdCBpcyB0byBnZW5lcmF0ZSBhIG1hc3RlciBjaGVja3N1bSB0aGF0IGNvbWJpbmVzIHRoZSBiYXNlaGFzaAorICAgICAgICAgICAgYW5kIHRoZSBoYXNoZXMgb2YgdGhlIHRhc2sncyBkZXBlbmRlbmNpZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEF0IHRoZSBjb2RlIGxldmVsLCB0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIHdheXMgYm90aCB0aGUgYmFzZWhhc2ggYW5kIHRoZQorICAgICAgICAgICAgZGVwZW5kZW50IHRhc2sgaGFzaGVzIGNhbiBiZSBpbmZsdWVuY2VkLgorICAgICAgICAgICAgV2l0aGluIHRoZSBCaXRCYWtlIGNvbmZpZ3VyYXRpb24gZmlsZSwgd2UgY2FuIGdpdmUgQml0QmFrZSBzb21lIGV4dHJhIGluZm9ybWF0aW9uCisgICAgICAgICAgICB0byBoZWxwIGl0IGNvbnN0cnVjdCB0aGUgYmFzZWhhc2guCisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCBlZmZlY3RpdmVseSByZXN1bHRzIGluIGEgbGlzdCBvZiBnbG9iYWwgdmFyaWFibGUKKyAgICAgICAgICAgIGRlcGVuZGVuY3kgZXhjbHVkZXMgLSB2YXJpYWJsZXMgbmV2ZXIgaW5jbHVkZWQgaW4gYW55IGNoZWNrc3VtLgorICAgICAgICAgICAgVGhpcyBleGFtcGxlIHVzZXMgdmFyaWFibGVzIGZyb20gT3BlbkVtYmVkZGVkIHRvIGhlbHAgaWxsdXN0cmF0ZQorICAgICAgICAgICAgdGhlIGNvbmNlcHQ6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCX0hBU0hCQVNFX1dISVRFTElTVCA/PSAiVE1QRElSIEZJTEUgUEFUSCBQV0QgQkJfVEFTS0hBU0ggQkJQQVRIIERMX0RJUiBcCisgICAgICAgICBTU1RBVEVfRElSIFRISVNESVIgRklMRVNFWFRSQVBBVEhTIEZJTEVfRElSTkFNRSBIT01FIExPR05BTUUgU0hFTEwgVEVSTSBcCisgICAgICAgICBVU0VSIEZJTEVTUEFUSCBTVEFHSU5HX0RJUl9IT1NUIFNUQUdJTkdfRElSX1RBUkdFVCBDT1JFQkFTRSBQUlNFUlZfSE9TVCBcCisgICAgICAgICBQUlNFUlZfRFVNUERJUiBQUlNFUlZfRFVNUEZJTEUgUFJTRVJWX0xPQ0tET1dOIFBBUkFMTEVMX01BS0UgXAorICAgICAgICAgQ0NBQ0hFX0RJUiBFWFRFUk5BTF9UT09MQ0hBSU4gQ0NBQ0hFIENDQUNIRV9ESVNBQkxFIExJQ0VOU0VfUEFUSCBTREtQS0dTVUZGSVgiCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBUaGUgcHJldmlvdXMgZXhhbXBsZSBleGNsdWRlcyB0aGUgd29yayBkaXJlY3RvcnksIHdoaWNoIGlzIHBhcnQgb2YKKyAgICAgICAgICAgIDxmaWxlbmFtZT5UTVBESVI8L2ZpbGVuYW1lPi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHJ1bGVzIGZvciBkZWNpZGluZyB3aGljaCBoYXNoZXMgb2YgZGVwZW5kZW50IHRhc2tzIHRvIGluY2x1ZGUgdGhyb3VnaAorICAgICAgICAgICAgZGVwZW5kZW5jeSBjaGFpbnMgYXJlIG1vcmUgY29tcGxleCBhbmQgYXJlIGdlbmVyYWxseSBhY2NvbXBsaXNoZWQgd2l0aCBhCisgICAgICAgICAgICBQeXRob24gZnVuY3Rpb24uCisgICAgICAgICAgICBUaGUgY29kZSBpbiA8ZmlsZW5hbWU+bWV0YS9saWIvb2Uvc3N0YXRlc2lnLnB5PC9maWxlbmFtZT4gc2hvd3MgdHdvIGV4YW1wbGVzCisgICAgICAgICAgICBvZiB0aGlzIGFuZCBhbHNvIGlsbHVzdHJhdGVzIGhvdyB5b3UgY2FuIGluc2VydCB5b3VyIG93biBwb2xpY3kgaW50byB0aGUgc3lzdGVtCisgICAgICAgICAgICBpZiBzbyBkZXNpcmVkLgorICAgICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR3byBiYXNpYyBzaWduYXR1cmUgZ2VuZXJhdG9ycyBPcGVuRW1iZWRkZWQgQ29yZQorICAgICAgICAgICAgdXNlczogICJPRUJhc2ljIiBhbmQgIk9FQmFzaWNIYXNoIi4KKyAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIGEgZHVtbXkgIm5vb3AiIHNpZ25hdHVyZSBoYW5kbGVyIGVuYWJsZWQgaW4gQml0QmFrZS4KKyAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBiZWhhdmlvciBpcyB1bmNoYW5nZWQgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucy4KKyAgICAgICAgICAgIDxmaWxlbmFtZT5PRS1Db3JlPC9maWxlbmFtZT4gdXNlcyB0aGUgIk9FQmFzaWNIYXNoIiBzaWduYXR1cmUgaGFuZGxlciBieSBkZWZhdWx0CisgICAgICAgICAgICB0aHJvdWdoIHRoaXMgc2V0dGluZyBpbiB0aGUgPGZpbGVuYW1lPmJpdGJha2UuY29uZjwvZmlsZW5hbWU+IGZpbGU6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCX1NJR05BVFVSRV9IQU5ETEVSID89ICJPRUJhc2ljSGFzaCIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoZSAiT0VCYXNpY0hhc2giIDxmaWxlbmFtZT5CQl9TSUdOQVRVUkVfSEFORExFUjwvZmlsZW5hbWU+IGlzIHRoZSBzYW1lIGFzIHRoZQorICAgICAgICAgICAgIk9FQmFzaWMiIHZlcnNpb24gYnV0IGFkZHMgdGhlIHRhc2sgaGFzaCB0byB0aGUgc3RhbXAgZmlsZXMuCisgICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYW55IG1ldGFkYXRhIGNoYW5nZSB0aGF0IGNoYW5nZXMgdGhlIHRhc2sgaGFzaCwgYXV0b21hdGljYWxseQorICAgICAgICAgICAgY2F1c2luZyB0aGUgdGFzayB0byBiZSBydW4gYWdhaW4uCisgICAgICAgICAgICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgdG8gYnVtcAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSJz48ZmlsZW5hbWU+UFI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhbHVlcywgYW5kIGNoYW5nZXMgdG8gbWV0YWRhdGEgYXV0b21hdGljYWxseSByaXBwbGUgYWNyb3NzIHRoZSBidWlsZC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgZW5kIHJlc3VsdCBvZiB0aGVzZSBzaWduYXR1cmUgZ2VuZXJhdG9ycyBpcyB0bworICAgICAgICAgICAgbWFrZSBzb21lIGRlcGVuZGVuY3kgYW5kIGhhc2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIHRoZSBidWlsZC4KKyAgICAgICAgICAgIFRoaXMgaW5mb3JtYXRpb24gaW5jbHVkZXM6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfQkFTRUhBU0hfdGFzay08L2ZpbGVuYW1lPjxyZXBsYWNlYWJsZT50YXNrbmFtZTwvcmVwbGFjZWFibGU+OgorICAgICAgICAgICAgICAgICAgICBUaGUgYmFzZSBoYXNoZXMgZm9yIGVhY2ggdGFzayBpbiB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPkJCX0JBU0VIQVNIXzwvZmlsZW5hbWU+PHJlcGxhY2VhYmxlPmZpbGVuYW1lPC9yZXBsYWNlYWJsZT48ZmlsZW5hbWU+OjwvZmlsZW5hbWU+PHJlcGxhY2VhYmxlPnRhc2tuYW1lPC9yZXBsYWNlYWJsZT46CisgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNlIGhhc2hlcyBmb3IgZWFjaCBkZXBlbmRlbnQgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxmaWxlbmFtZT5CQkhBU0hERVBTXzwvZmlsZW5hbWU+PHJlcGxhY2VhYmxlPmZpbGVuYW1lPC9yZXBsYWNlYWJsZT48ZmlsZW5hbWU+OjwvZmlsZW5hbWU+PHJlcGxhY2VhYmxlPnRhc2tuYW1lPC9yZXBsYWNlYWJsZT46CisgICAgICAgICAgICAgICAgICAgIFRoZSB0YXNrIGRlcGVuZGVuY2llcyBmb3IgZWFjaCB0YXNrLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPkJCX1RBU0tIQVNIPC9maWxlbmFtZT46CisgICAgICAgICAgICAgICAgICAgIFRoZSBoYXNoIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBCaXRCYWtlJ3MgIi1TIiBvcHRpb24gbGV0cyB5b3UKKyAgICAgICAgICAgIGRlYnVnIEJpdGJha2UncyBwcm9jZXNzaW5nIG9mIHNpZ25hdHVyZXMuCisgICAgICAgICAgICBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gLVMgYWxsb3cgZGlmZmVyZW50IGRlYnVnZ2luZyBtb2RlcworICAgICAgICAgICAgdG8gYmUgdXNlZCwgZWl0aGVyIHVzaW5nIEJpdEJha2UncyBvd24gZGVidWcgZnVuY3Rpb25zCisgICAgICAgICAgICBvciBwb3NzaWJseSB0aG9zZSBkZWZpbmVkIGluIHRoZSBtZXRhZGF0YS9zaWduYXR1cmUgaGFuZGxlcgorICAgICAgICAgICAgaXRzZWxmLgorICAgICAgICAgICAgVGhlIHNpbXBsZXN0IHBhcmFtZXRlciB0byBwYXNzIGlzICJub25lIiwgd2hpY2ggY2F1c2VzIGEKKyAgICAgICAgICAgIHNldCBvZiBzaWduYXR1cmUgaW5mb3JtYXRpb24gdG8gYmUgd3JpdHRlbiBvdXQgaW50bworICAgICAgICAgICAgPGZpbGVuYW1lPlNUQU1QX0RJUjwvZmlsZW5hbWU+CisgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXRzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIFRoZSBvdGhlciBjdXJyZW50bHkgYXZhaWxhYmxlIHBhcmFtZXRlciBpcyAicHJpbnRkaWZmIiwKKyAgICAgICAgICAgIHdoaWNoIGNhdXNlcyBCaXRCYWtlIHRvIHRyeSB0byBlc3RhYmxpc2ggdGhlIGNsb3Nlc3QKKyAgICAgICAgICAgIHNpZ25hdHVyZSBtYXRjaCBpdCBjYW4gKGUuZy4gaW4gdGhlIHNzdGF0ZSBjYWNoZSkgYW5kIHRoZW4KKyAgICAgICAgICAgIHJ1biA8ZmlsZW5hbWU+Yml0YmFrZS1kaWZmc2lnczwvZmlsZW5hbWU+IG92ZXIgdGhlIG1hdGNoZXMKKyAgICAgICAgICAgIHRvIGRldGVybWluZSB0aGUgc3RhbXBzIGFuZCBkZWx0YSB3aGVyZSB0aGVzZSB0d28KKyAgICAgICAgICAgIHN0YW1wIHRyZWVzIGRpdmVyZ2UuCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICBJdCBpcyBsaWtlbHkgdGhhdCBmdXR1cmUgdmVyc2lvbnMgb2YgQml0QmFrZSB3aWxsCisgICAgICAgICAgICAgICAgcHJvdmlkZSBvdGhlciBzaWduYXR1cmUgaGFuZGxlcnMgdHJpZ2dlcmVkIHRocm91Z2gKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsICItUyIgcGFyYW1ldGVycy4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gY2hlY2tzdW0gbWV0YWRhdGEgaW4gdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndGFzay1jaGVja3N1bXMtYW5kLXNldHNjZW5lJz5UYXNrIENoZWNrc3VtcyBhbmQgU2V0c2NlbmU8L2xpbms+IgorICAgICAgICAgICAgc2VjdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdzZXRzY2VuZSc+CisgICAgICAgIDx0aXRsZT5TZXRzY2VuZTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgc2V0c2NlbmUgcHJvY2VzcyBlbmFibGVzIEJpdEJha2UgdG8gaGFuZGxlICJwcmUtYnVpbHQiIGFydGlmYWN0cy4KKyAgICAgICAgICAgIFRoZSBhYmlsaXR5IHRvIGhhbmRsZSBhbmQgcmV1c2UgdGhlc2UgYXJ0aWZhY3RzIGFsbG93cyBCaXRCYWtlCisgICAgICAgICAgICB0aGUgbHV4dXJ5IG9mIG5vdCBoYXZpbmcgdG8gYnVpbGQgc29tZXRoaW5nIGZyb20gc2NyYXRjaCBldmVyeSB0aW1lLgorICAgICAgICAgICAgSW5zdGVhZCwgQml0QmFrZSBjYW4gdXNlLCB3aGVuIHBvc3NpYmxlLCBleGlzdGluZyBidWlsZCBhcnRpZmFjdHMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2UgbmVlZHMgdG8gaGF2ZSByZWxpYWJsZSBkYXRhIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYW4KKyAgICAgICAgICAgIGFydGlmYWN0IGlzIGNvbXBhdGlibGUuCisgICAgICAgICAgICBTaWduYXR1cmVzLCBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHByb3ZpZGUgYW4gaWRlYWwKKyAgICAgICAgICAgIHdheSBvZiByZXByZXNlbnRpbmcgd2hldGhlciBhbiBhcnRpZmFjdCBpcyBjb21wYXRpYmxlLgorICAgICAgICAgICAgSWYgYSBzaWduYXR1cmUgaXMgdGhlIHNhbWUsIGFuIG9iamVjdCBjYW4gYmUgcmV1c2VkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiBhbiBvYmplY3QgY2FuIGJlIHJldXNlZCwgdGhlIHByb2JsZW0gdGhlbiBiZWNvbWVzIGhvdyB0bworICAgICAgICAgICAgcmVwbGFjZSBhIGdpdmVuIHRhc2sgb3Igc2V0IG9mIHRhc2tzIHdpdGggdGhlIHByZS1idWlsdCBhcnRpZmFjdC4KKyAgICAgICAgICAgIEJpdEJha2Ugc29sdmVzIHRoZSBwcm9ibGVtIHdpdGggdGhlICJzZXRzY2VuZSIgcHJvY2Vzcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlbiBCaXRCYWtlIGlzIGFza2VkIHRvIGJ1aWxkIGEgZ2l2ZW4gdGFyZ2V0LCBiZWZvcmUgYnVpbGRpbmcgYW55dGhpbmcsCisgICAgICAgICAgICBpdCBmaXJzdCBhc2tzIHdoZXRoZXIgY2FjaGVkIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgYW55IG9mIHRoZQorICAgICAgICAgICAgdGFyZ2V0cyBpdCdzIGJ1aWxkaW5nLCBvciBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSB0YXJnZXRzLgorICAgICAgICAgICAgSWYgY2FjaGVkIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgQml0QmFrZSB1c2VzIHRoaXMgaW5mb3JtYXRpb24gaW5zdGVhZCBvZgorICAgICAgICAgICAgcnVubmluZyB0aGUgbWFpbiB0YXNrcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSBmaXJzdCBjYWxscyB0aGUgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9IQVNIQ0hFQ0tfRlVOQ1RJT04nPjxmaWxlbmFtZT5CQl9IQVNIQ0hFQ0tfRlVOQ1RJT048L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHZhcmlhYmxlIHdpdGggYSBsaXN0IG9mIHRhc2tzIGFuZCBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICBoYXNoZXMgaXQgd2FudHMgdG8gYnVpbGQuCisgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGZhc3QgYW5kIHJldHVybnMgYSBsaXN0CisgICAgICAgICAgICBvZiB0aGUgdGFza3MgZm9yIHdoaWNoIGl0IGJlbGlldmVzIGluIGNhbiBvYnRhaW4gYXJ0aWZhY3RzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOZXh0LCBmb3IgZWFjaCBvZiB0aGUgdGFza3MgdGhhdCB3ZXJlIHJldHVybmVkIGFzIHBvc3NpYmlsaXRpZXMsCisgICAgICAgICAgICBCaXRCYWtlIGV4ZWN1dGVzIGEgc2V0c2NlbmUgdmVyc2lvbiBvZiB0aGUgdGFzayB0aGF0IHRoZSBwb3NzaWJsZQorICAgICAgICAgICAgYXJ0aWZhY3QgY292ZXJzLgorICAgICAgICAgICAgU2V0c2NlbmUgdmVyc2lvbnMgb2YgYSB0YXNrIGhhdmUgdGhlIHN0cmluZyAiX3NldHNjZW5lIiBhcHBlbmRlZCB0byB0aGUKKyAgICAgICAgICAgIHRhc2sgbmFtZS4KKyAgICAgICAgICAgIFNvLCBmb3IgZXhhbXBsZSwgdGhlIHRhc2sgd2l0aCB0aGUgbmFtZSA8ZmlsZW5hbWU+eHh4PC9maWxlbmFtZT4gaGFzCisgICAgICAgICAgICBhIHNldHNjZW5lIHRhc2sgbmFtZWQgPGZpbGVuYW1lPnh4eF9zZXRzY2VuZTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgVGhlIHNldHNjZW5lIHZlcnNpb24gb2YgdGhlIHRhc2sgZXhlY3V0ZXMgYW5kIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkKKyAgICAgICAgICAgIGFydGlmYWN0cyByZXR1cm5pbmcgZWl0aGVyIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgcHJldmlvdXNseSBtZW50aW9uZWQsIGFuIGFydGlmYWN0IGNhbiBjb3ZlciBtb3JlIHRoYW4gb25lIHRhc2suCisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaXQgaXMgcG9pbnRsZXNzIHRvIG9idGFpbiBhIGNvbXBpbGVyIGlmIHlvdQorICAgICAgICAgICAgYWxyZWFkeSBoYXZlIHRoZSBjb21waWxlZCBiaW5hcnkuCisgICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgQml0QmFrZSBjYWxscyB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9TRVRTQ0VORV9ERVBWQUxJRCc+PGZpbGVuYW1lPkJCX1NFVFNDRU5FX0RFUFZBTElEPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICBmdW5jdGlvbiBmb3IgZWFjaCBzdWNjZXNzZnVsIHNldHNjZW5lIHRhc2sgdG8ga25vdyB3aGV0aGVyIG9yIG5vdCBpdCBuZWVkcworICAgICAgICAgICAgdG8gb2J0YWluIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhhdCB0YXNrLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGaW5hbGx5LCBhZnRlciBhbGwgdGhlIHNldHNjZW5lIHRhc2tzIGhhdmUgZXhlY3V0ZWQsIEJpdEJha2UgY2FsbHMgdGhlCisgICAgICAgICAgICBmdW5jdGlvbiBsaXN0ZWQgaW4KKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9TRVRTQ0VORV9WRVJJRllfRlVOQ1RJT04nPjxmaWxlbmFtZT5CQl9TRVRTQ0VORV9WRVJJRllfRlVOQ1RJT048L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHdpdGggdGhlIGxpc3Qgb2YgdGFza3MgQml0QmFrZSB0aGlua3MgaGFzIGJlZW4gImNvdmVyZWQiLgorICAgICAgICAgICAgVGhlIG1ldGFkYXRhIGNhbiB0aGVuIGVuc3VyZSB0aGF0IHRoaXMgbGlzdCBpcyBjb3JyZWN0IGFuZCBjYW4KKyAgICAgICAgICAgIGluZm9ybSBCaXRCYWtlIHRoYXQgaXQgd2FudHMgc3BlY2lmaWMgdGFza3MgdG8gYmUgcnVuIHJlZ2FyZGxlc3MKKyAgICAgICAgICAgIG9mIHRoZSBzZXRzY2VuZSByZXN1bHQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIG9uIHNldHNjZW5lIG1ldGFkYXRhIGluIHRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3Rhc2stY2hlY2tzdW1zLWFuZC1zZXRzY2VuZSc+VGFzayBDaGVja3N1bXMgYW5kIFNldHNjZW5lPC9saW5rPiIKKyAgICAgICAgICAgIHNlY3Rpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtZmV0Y2hpbmcueG1sIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWZldGNoaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY4Y2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWZldGNoaW5nLnhtbApAQCAtMCwwICsxLDc2NSBAQAorPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzxjaGFwdGVyPgorPHRpdGxlPkZpbGUgRG93bmxvYWQgU3VwcG9ydDwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgICAgQml0QmFrZSdzIGZldGNoIG1vZHVsZSBpcyBhIHN0YW5kYWxvbmUgcGllY2Ugb2YgbGlicmFyeSBjb2RlCisgICAgICAgIHRoYXQgZGVhbHMgd2l0aCB0aGUgaW50cmljYWNpZXMgb2YgZG93bmxvYWRpbmcgc291cmNlIGNvZGUKKyAgICAgICAgYW5kIGZpbGVzIGZyb20gcmVtb3RlIHN5c3RlbXMuCisgICAgICAgIEZldGNoaW5nIHNvdXJjZSBjb2RlIGlzIG9uZSBvZiB0aGUgY29ybmVyc3RvbmVzIG9mIGJ1aWxkaW5nIHNvZnR3YXJlLgorICAgICAgICBBcyBzdWNoLCB0aGlzIG1vZHVsZSBmb3JtcyBhbiBpbXBvcnRhbnQgcGFydCBvZiBCaXRCYWtlLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgICBUaGUgY3VycmVudCBmZXRjaCBtb2R1bGUgaXMgY2FsbGVkICJmZXRjaDIiIGFuZCByZWZlcnMgdG8gdGhlCisgICAgICAgIGZhY3QgdGhhdCBpdCBpcyB0aGUgc2Vjb25kIG1ham9yIHZlcnNpb24gb2YgdGhlIEFQSS4KKyAgICAgICAgVGhlIG9yaWdpbmFsIHZlcnNpb24gaXMgb2Jzb2xldGUgYW5kIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY29kZWJhc2UuCisgICAgICAgIFRodXMsIGluIGFsbCBjYXNlcywgImZldGNoIiByZWZlcnMgdG8gImZldGNoMiIgaW4gdGhpcworICAgICAgICBtYW51YWwuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3Rpb24gaWQ9J3RoZS1kb3dubG9hZC1mZXRjaCc+CisgICAgICAgIDx0aXRsZT5UaGUgRG93bmxvYWQgKEZldGNoKTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIHRha2VzIHNldmVyYWwgc3RlcHMgd2hlbiBmZXRjaGluZyBzb3VyY2UgY29kZSBvciBmaWxlcy4KKyAgICAgICAgICAgIFRoZSBmZXRjaGVyIGNvZGViYXNlIGRlYWxzIHdpdGggdHdvIGRpc3RpbmN0IHByb2Nlc3NlcyBpbiBvcmRlcjoKKyAgICAgICAgICAgIG9idGFpbmluZyB0aGUgZmlsZXMgZnJvbSBzb21ld2hlcmUgKGNhY2hlZCBvciBvdGhlcndpc2UpCisgICAgICAgICAgICBhbmQgdGhlbiB1bnBhY2tpbmcgdGhvc2UgZmlsZXMgaW50byBhIHNwZWNpZmljIGxvY2F0aW9uIGFuZAorICAgICAgICAgICAgcGVyaGFwcyBpbiBhIHNwZWNpZmljIHdheS4KKyAgICAgICAgICAgIEdldHRpbmcgYW5kIHVucGFja2luZyB0aGUgZmlsZXMgaXMgb2Z0ZW4gb3B0aW9uYWxseSBmb2xsb3dlZAorICAgICAgICAgICAgYnkgcGF0Y2hpbmcuCisgICAgICAgICAgICBQYXRjaGluZywgaG93ZXZlciwgaXMgbm90IGNvdmVyZWQgYnkgdGhpcyBtb2R1bGUuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBjb2RlIHRvIGV4ZWN1dGUgdGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBwcm9jZXNzLCBhIGZldGNoLAorICAgICAgICAgICAgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgc3JjX3VyaSA9IChkLmdldFZhcignU1JDX1VSSScsIFRydWUpIG9yICIiKS5zcGxpdCgpCisgICAgIGZldGNoZXIgPSBiYi5mZXRjaDIuRmV0Y2goc3JjX3VyaSwgZCkKKyAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBUaGlzIGNvZGUgc2V0cyB1cCBhbiBpbnN0YW5jZSBvZiB0aGUgZmV0Y2ggY2xhc3MuCisgICAgICAgICAgICBUaGUgaW5zdGFuY2UgdXNlcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVSTHMgZnJvbSB0aGUKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNfVVJJJz48ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgdmFyaWFibGUgYW5kIHRoZW4gY2FsbHMgdGhlIDxmaWxlbmFtZT5kb3dubG9hZDwvZmlsZW5hbWU+CisgICAgICAgICAgICBtZXRob2QgdG8gZG93bmxvYWQgdGhlIGZpbGVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgaW5zdGFudGlhdGlvbiBvZiB0aGUgZmV0Y2ggY2xhc3MgaXMgdXN1YWxseSBmb2xsb3dlZCBieToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgcm9vdGRpciA9IGwuZ2V0VmFyKCdXT1JLRElSJywgVHJ1ZSkKKyAgICAgZmV0Y2hlci51bnBhY2socm9vdGRpcikKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoaXMgY29kZSB1bnBhY2tzIHRoZSBkb3dubG9hZGVkIGZpbGVzIHRvIHRoZQorICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IDxmaWxlbmFtZT5XT1JLRElSPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICBGb3IgY29udmVuaWVuY2UsIHRoZSBuYW1pbmcgaW4gdGhlc2UgZXhhbXBsZXMgbWF0Y2hlcworICAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZXMgdXNlZCBieSBPcGVuRW1iZWRkZWQuCisgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZSBhYm92ZSBjb2RlIGluIGFjdGlvbiwgZXhhbWluZQorICAgICAgICAgICAgICAgIHRoZSBPcGVuRW1iZWRkZWQgY2xhc3MgZmlsZSA8ZmlsZW5hbWU+YmFzZS5iYmNsYXNzPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPiBhbmQgPGZpbGVuYW1lPldPUktESVI8L2ZpbGVuYW1lPgorICAgICAgICAgICAgdmFyaWFibGVzIGFyZSBub3QgaGFyZGNvZGVkIGludG8gdGhlIGZldGNoZXIsIHNpbmNlIHRob3NlIGZldGNoZXIKKyAgICAgICAgICAgIG1ldGhvZHMgY2FuIGJlIChhbmQgYXJlKSBjYWxsZWQgd2l0aCBkaWZmZXJlbnQgdmFyaWFibGUgbmFtZXMuCisgICAgICAgICAgICBJbiBPcGVuRW1iZWRkZWQgZm9yIGV4YW1wbGUsIHRoZSBzaGFyZWQgc3RhdGUgKHNzdGF0ZSkgY29kZSB1c2VzCisgICAgICAgICAgICB0aGUgZmV0Y2ggbW9kdWxlIHRvIGZldGNoIHRoZSBzc3RhdGUgZmlsZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFdoZW4gdGhlIDxmaWxlbmFtZT5kb3dubG9hZCgpPC9maWxlbmFtZT4gbWV0aG9kIGlzIGNhbGxlZCwKKyAgICAgICAgICAgIEJpdEJha2UgdHJpZXMgdG8gcmVzb2x2ZSB0aGUgVVJMcyBieSBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMKKyAgICAgICAgICAgIGluIGEgc3BlY2lmaWMgc2VhcmNoIG9yZGVyOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlByZS1taXJyb3IgU2l0ZXM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBmaXJzdCB1c2VzIHByZS1taXJyb3JzIHRvIHRyeSBhbmQgZmluZCBzb3VyY2UgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIFRoZXNlIGxvY2F0aW9ucyBhcmUgZGVmaW5lZCB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSRU1JUlJPUlMnPjxmaWxlbmFtZT5QUkVNSVJST1JTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlNvdXJjZSBVUkk6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgSWYgcHJlLW1pcnJvcnMgZmFpbCwgQml0QmFrZSB1c2VzIHRoZSBvcmlnaW5hbCBVUkwgKGUuZyBmcm9tCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPk1pcnJvciBTaXRlczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBJZiBmZXRjaCBmYWlsdXJlcyBvY2N1ciwgQml0QmFrZSBuZXh0IHVzZXMgbWlycm9yIGxvY2F0aW9ucyBhcworICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItTUlSUk9SUyc+PGZpbGVuYW1lPk1JUlJPUlM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciBlYWNoIFVSTCBwYXNzZWQgdG8gdGhlIGZldGNoZXIsIHRoZSBmZXRjaGVyCisgICAgICAgICAgICBjYWxscyB0aGUgc3VibW9kdWxlIHRoYXQgaGFuZGxlcyB0aGF0IHBhcnRpY3VsYXIgVVJMIHR5cGUuCisgICAgICAgICAgICBUaGlzIGJlaGF2aW9yIGNhbiBiZSB0aGUgc291cmNlIG9mIHNvbWUgY29uZnVzaW9uIHdoZW4geW91CisgICAgICAgICAgICBhcmUgcHJvdmlkaW5nIFVSTHMgZm9yIHRoZSA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+CisgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgdHdvIFVSTHM6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGh0dHA6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9naXQvcG9reTtwcm90b2NvbD1naXQKKyAgICAgZ2l0Oi8vZ2l0LnlvY3RvcHJvamVjdC5vcmcvZ2l0L3Bva3k7cHJvdG9jb2w9aHR0cAorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgVVJMIGlzIHBhc3NlZCB0byB0aGUKKyAgICAgICAgICAgIDxmaWxlbmFtZT53Z2V0PC9maWxlbmFtZT4gZmV0Y2hlciwgd2hpY2ggZG9lcyBub3QKKyAgICAgICAgICAgIHVuZGVyc3RhbmQgImdpdCIuCisgICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBsYXR0ZXIgY2FzZSBpcyB0aGUgY29ycmVjdCBmb3JtIHNpbmNlIHRoZQorICAgICAgICAgICAgR2l0IGZldGNoZXIgZG9lcyBrbm93IGhvdyB0byB1c2UgSFRUUCBhcyBhIHRyYW5zcG9ydC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSGVyZSBhcmUgc29tZSBleGFtcGxlcyB0aGF0IHNob3cgY29tbW9ubHkgdXNlZCBtaXJyb3IKKyAgICAgICAgICAgIGRlZmluaXRpb25zOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBQUkVNSVJST1JTID89ICJcCisgICAgICAgICBienI6Ly8uKi8uKiAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBjdnM6Ly8uKi8uKiAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBnaXQ6Ly8uKi8uKiAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBoZzovLy4qLy4qICAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBvc2M6Ly8uKi8uKiAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBwNDovLy4qLy4qICAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBzdm46Ly8uKi8uKiAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiIKKworICAgICBNSVJST1JTID0rICJcCisgICAgICAgICBmdHA6Ly8uKi8uKiAgICAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBodHRwOi8vLiovLiogICAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiBcCisgICAgICAgICBodHRwczovLy4qLy4qICAgIGh0dHA6Ly9zb21lbWlycm9yLm9yZy9zb3VyY2VzLyBcbiIKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIEl0IGlzIHVzZWZ1bCB0byBub3RlIHRoYXQgQml0QmFrZSBzdXBwb3J0cworICAgICAgICAgICAgY3Jvc3MtVVJMcy4KKyAgICAgICAgICAgIEl0IGlzIHBvc3NpYmxlIHRvIG1pcnJvciBhIEdpdCByZXBvc2l0b3J5IG9uIGFuIEhUVFAKKyAgICAgICAgICAgIHNlcnZlciBhcyBhIHRhcmJhbGwuCisgICAgICAgICAgICBUaGlzIGlzIHdoYXQgdGhlIDxmaWxlbmFtZT5naXQ6Ly88L2ZpbGVuYW1lPiBtYXBwaW5nIGluCisgICAgICAgICAgICB0aGUgcHJldmlvdXMgZXhhbXBsZSBkb2VzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBTaW5jZSBuZXR3b3JrIGFjY2Vzc2VzIGFyZSBzbG93LCBCaXRiYWtlIG1haW50YWlucyBhCisgICAgICAgICAgICBjYWNoZSBvZiBmaWxlcyBkb3dubG9hZGVkIGZyb20gdGhlIG5ldHdvcmsuCisgICAgICAgICAgICBBbnkgc291cmNlIGZpbGVzIHRoYXQgYXJlIG5vdCBsb2NhbCAoaS5lLgorICAgICAgICAgICAgZG93bmxvYWRlZCBmcm9tIHRoZSBJbnRlcm5ldCkgYXJlIHBsYWNlZCBpbnRvIHRoZSBkb3dubG9hZAorICAgICAgICAgICAgZGlyZWN0b3J5LCB3aGljaCBpcyBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRExfRElSJz48ZmlsZW5hbWU+RExfRElSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRmlsZSBpbnRlZ3JpdHkgaXMgb2Yga2V5IGltcG9ydGFuY2UgZm9yIHJlcHJvZHVjaW5nIGJ1aWxkcy4KKyAgICAgICAgICAgIEZvciBub24tbG9jYWwgYXJjaGl2ZSBkb3dubG9hZHMsIHRoZSBmZXRjaGVyIGNvZGUgY2FuIHZlcmlmeQorICAgICAgICAgICAgU0hBLTI1NiBhbmQgTUQ1IGNoZWNrc3VtcyB0byBlbnN1cmUgdGhlIGFyY2hpdmVzIGhhdmUgYmVlbgorICAgICAgICAgICAgZG93bmxvYWRlZCBjb3JyZWN0bHkuCisgICAgICAgICAgICBZb3UgY2FuIHNwZWNpZnkgdGhlc2UgY2hlY2tzdW1zIGJ5IHVzaW5nIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPiB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgdmFyZmxhZ3MgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSVttZDVzdW1dID0gIjxyZXBsYWNlYWJsZT52YWx1ZTwvcmVwbGFjZWFibGU+IgorICAgICBTUkNfVVJJW3NoYTI1NnN1bV0gPSAiPHJlcGxhY2VhYmxlPnZhbHVlPC9yZXBsYWNlYWJsZT4iCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgY2hlY2tzdW1zIGFzIHBhcmFtZXRlcnMgb24gdGhlCisgICAgICAgICAgICA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+IGFzIHNob3duIGJlbG93OgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb29iYXIudGFyLmJ6MjttZDVzdW09NGE4ZTBmMjM3ZTk2MWZkNzc4NWQxOWQwN2ZkYjk5NGQiCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBJZiBtdWx0aXBsZSBVUklzIGV4aXN0LCB5b3UgY2FuIHNwZWNpZnkgdGhlIGNoZWNrc3VtcyBlaXRoZXIKKyAgICAgICAgICAgIGRpcmVjdGx5IGFzIGluIHRoZSBwcmV2aW91cyBleGFtcGxlLCBvciB5b3UgY2FuIG5hbWUgdGhlIFVSTHMuCisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHN5bnRheCBzaG93cyBob3cgeW91IG5hbWUgdGhlIFVSSXM6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiaHR0cDovL2V4YW1wbGUuY29tL2Zvb2Jhci50YXIuYnoyO25hbWU9Zm9vIgorICAgICBTUkNfVVJJW2Zvby5tZDVzdW1dID0gNGE4ZTBmMjM3ZTk2MWZkNzc4NWQxOWQwN2ZkYjk5NGQKKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIEFmdGVyIGEgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkIGFuZCBoYXMgaGFkIGl0cyBjaGVja3N1bSBjaGVja2VkLAorICAgICAgICAgICAgYSAiLmRvbmUiIHN0YW1wIGlzIHBsYWNlZCBpbiA8ZmlsZW5hbWU+RExfRElSPC9maWxlbmFtZT4uCisgICAgICAgICAgICBCaXRCYWtlIHVzZXMgdGhpcyBzdGFtcCBkdXJpbmcgc3Vic2VxdWVudCBidWlsZHMgdG8gYXZvaWQKKyAgICAgICAgICAgIGRvd25sb2FkaW5nIG9yIGNvbXBhcmluZyBhIGNoZWNrc3VtIGZvciB0aGUgZmlsZSBhZ2Fpbi4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIEl0IGlzIGFzc3VtZWQgdGhhdCBsb2NhbCBzdG9yYWdlIGlzIHNhZmUgZnJvbSBkYXRhIGNvcnJ1cHRpb24uCisgICAgICAgICAgICAgICAgSWYgdGhpcyB3ZXJlIG5vdCB0aGUgY2FzZSwgdGhlcmUgd291bGQgYmUgYmlnZ2VyIGlzc3VlcyB0byB3b3JyeSBhYm91dC4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9TVFJJQ1RfQ0hFQ0tTVU0nPjxmaWxlbmFtZT5CQl9TVFJJQ1RfQ0hFQ0tTVU08L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGlzIHNldCwgYW55IGRvd25sb2FkIHdpdGhvdXQgYSBjaGVja3N1bSB0cmlnZ2VycyBhbgorICAgICAgICAgICAgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgICAgIFRoZQorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX05PX05FVFdPUksnPjxmaWxlbmFtZT5CQl9OT19ORVRXT1JLPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBtYWtlIGFueSBhdHRlbXB0ZWQgbmV0d29yayBhY2Nlc3MgYSBmYXRhbAorICAgICAgICAgICAgZXJyb3IsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgdGhhdCBtaXJyb3JzIGFyZSBjb21wbGV0ZQorICAgICAgICAgICAgYXMgd2VsbCBhcyBvdGhlciB0aGluZ3MuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nYmItdGhlLXVucGFjayc+CisgICAgICAgIDx0aXRsZT5UaGUgVW5wYWNrPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSB1bnBhY2sgcHJvY2VzcyB1c3VhbGx5IGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGRvd25sb2FkLgorICAgICAgICAgICAgRm9yIGFsbCBVUkxzIGV4Y2VwdCBHaXQgVVJMcywgQml0QmFrZSB1c2VzIHRoZSBjb21tb24KKyAgICAgICAgICAgIDxmaWxlbmFtZT51bnBhY2s8L2ZpbGVuYW1lPiBtZXRob2QuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXhpc3QgdGhhdCB5b3UgY2FuIHNwZWNpZnkgd2l0aGluIHRoZQorICAgICAgICAgICAgVVJMIHRvIGdvdmVybiB0aGUgYmVoYXZpb3Igb2YgdGhlIHVucGFjayBzdGFnZToKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz51bnBhY2s6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMgd2hldGhlciB0aGUgVVJMIGNvbXBvbmVudHMgYXJlIHVucGFja2VkLgorICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gIjEiLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgdGhlIGNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgYXJlIHVucGFja2VkLgorICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdG8gIjAiLCB0aGUgdW5wYWNrIHN0YWdlIGxlYXZlcyB0aGUgZmlsZSBhbG9uZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgYW4gYXJjaGl2ZSB0byBiZQorICAgICAgICAgICAgICAgICAgICBjb3BpZWQgaW4gYW5kIG5vdCBiZSB1bnBhY2tlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5kb3M6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQXBwbGllcyB0byA8ZmlsZW5hbWU+LnppcDwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+LmphcjwvZmlsZW5hbWU+IGZpbGVzIGFuZCBzcGVjaWZpZXMgd2hldGhlciB0bworICAgICAgICAgICAgICAgICAgICB1c2UgRE9TIGxpbmUgZW5kaW5nIGNvbnZlcnNpb24gb24gdGV4dCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5iYXNlcGF0aDo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdHMgdGhlIHVucGFjayBzdGFnZSB0byBzdHJpcCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGZyb20gdGhlIHNvdXJjZSBwYXRoIHdoZW4gdW5wYWNraW5nLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnN1YmRpcjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBVbnBhY2tzIHRoZSBzcGVjaWZpYyBVUkwgdG8gdGhlIHNwZWNpZmllZCBzdWJkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSByb290IGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIFRoZSB1bnBhY2sgY2FsbCBhdXRvbWF0aWNhbGx5IGRlY29tcHJlc3NlcyBhbmQgZXh0cmFjdHMgZmlsZXMKKyAgICAgICAgICAgIHdpdGggIi5aIiwgIi56IiwgIi5neiIsICIueHoiLCAiLnppcCIsICIuamFyIiwgIi5pcGsiLCAiLnJwbSIuCisgICAgICAgICAgICAiLnNycG0iLCAiLmRlYiIgYW5kICIuYnoyIiBleHRlbnNpb25zIGFzIHdlbGwgYXMgdmFyaW91cyBjb21iaW5hdGlvbnMKKyAgICAgICAgICAgIG9mIHRhcmJhbGwgZXh0ZW5zaW9ucy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgbWVudGlvbmVkLCB0aGUgR2l0IGZldGNoZXIgaGFzIGl0cyBvd24gdW5wYWNrIG1ldGhvZCB0aGF0CisgICAgICAgICAgICBpcyBvcHRpbWl6ZWQgdG8gd29yayB3aXRoIEdpdCB0cmVlcy4KKyAgICAgICAgICAgIEJhc2ljYWxseSwgdGhpcyBtZXRob2Qgd29ya3MgYnkgY2xvbmluZyB0aGUgdHJlZSBpbnRvIHRoZSBmaW5hbAorICAgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICAgICAgVGhlIHByb2Nlc3MgaXMgY29tcGxldGVkIHVzaW5nIHJlZmVyZW5jZXMgc28gdGhhdCB0aGVyZSBpcworICAgICAgICAgICAgb25seSBvbmUgY2VudHJhbCBjb3B5IG9mIHRoZSBHaXQgbWV0YWRhdGEgbmVlZGVkLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J2JiLWZldGNoZXJzJz4KKyAgICAgICAgPHRpdGxlPkZldGNoZXJzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGUgVVJMIHByZWZpeCBkZXRlcm1pbmVzIHdoaWNoCisgICAgICAgICAgICBmZXRjaGVyIHN1Ym1vZHVsZSBCaXRCYWtlIHVzZXMuCisgICAgICAgICAgICBFYWNoIHN1Ym1vZHVsZSBjYW4gc3VwcG9ydCBkaWZmZXJlbnQgVVJMIHBhcmFtZXRlcnMsCisgICAgICAgICAgICB3aGljaCBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0nbG9jYWwtZmlsZS1mZXRjaGVyJz4KKyAgICAgICAgICAgIDx0aXRsZT5Mb2NhbCBmaWxlIGZldGNoZXIgKDxmaWxlbmFtZT5maWxlOi8vPC9maWxlbmFtZT4pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBzdWJtb2R1bGUgaGFuZGxlcyBVUkxzIHRoYXQgYmVnaW4gd2l0aAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5maWxlOi8vPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgVGhlIGZpbGVuYW1lIHlvdSBzcGVjaWZ5IHdpdGhpbiB0aGUgVVJMIGNhbiBiZQorICAgICAgICAgICAgICAgIGVpdGhlciBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIHRvIGEgZmlsZS4KKyAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZW5hbWUgaXMgcmVsYXRpdmUsIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRklMRVNQQVRIJz48ZmlsZW5hbWU+RklMRVNQQVRIPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgc2FtZSB3YXkKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+UEFUSDwvZmlsZW5hbWU+IGlzIHVzZWQgdG8gZmluZCBleGVjdXRhYmxlcy4KKyAgICAgICAgICAgICAgICBGYWlsaW5nIHRoYXQsCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUZJTEVTRElSJz48ZmlsZW5hbWU+RklMRVNESVI8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHJlbGF0aXZlIGZpbGUuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5GSUxFU0RJUjwvZmlsZW5hbWU+IGlzIGRlcHJlY2F0ZWQgYW5kIGNhbgorICAgICAgICAgICAgICAgICAgICBiZSByZXBsYWNlZCB3aXRoIDxmaWxlbmFtZT5GSUxFU1BBVEg8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgQmVjYXVzZSA8ZmlsZW5hbWU+RklMRVNESVI8L2ZpbGVuYW1lPiBpcyBsaWtlbHkgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCwgeW91IHNob3VsZCBub3QgdXNlIHRoaXMgdmFyaWFibGUgaW4gYW55IG5ldyBjb2RlLgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQsIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBpcyBhdmFpbGFibGUgaW4KKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRExfRElSJz48ZmlsZW5hbWU+RExfRElSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgYnkgdGhlIHRpbWUgdGhlIDxmaWxlbmFtZT5kb3dubG9hZCgpPC9maWxlbmFtZT4gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgYSBkaXJlY3RvcnksIHRoZSBlbnRpcmUgZGlyZWN0b3J5IGlzCisgICAgICAgICAgICAgICAgdW5wYWNrZWQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEhlcmUgYXJlIGEgY291cGxlIG9mIGV4YW1wbGUgVVJMcywgdGhlIGZpcnN0IHJlbGF0aXZlIGFuZAorICAgICAgICAgICAgICAgIHRoZSBzZWNvbmQgYWJzb2x1dGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gImZpbGU6Ly9yZWxhdGl2ZWZpbGUucGF0Y2giCisgICAgIFNSQ19VUkkgPSAiZmlsZTovLy9Vc2Vycy9pY2gvdmVyeV9pbXBvcnRhbnRfc29mdHdhcmUiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2h0dHAtZnRwLWZldGNoZXInPgorICAgICAgICAgICAgPHRpdGxlPkhUVFAvRlRQIHdnZXQgZmV0Y2hlciAoPGZpbGVuYW1lPmh0dHA6Ly88L2ZpbGVuYW1lPiwgPGZpbGVuYW1lPmZ0cDovLzwvZmlsZW5hbWU+LCA8ZmlsZW5hbWU+aHR0cHM6Ly88L2ZpbGVuYW1lPik8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIGZldGNoZXIgb2J0YWlucyBmaWxlcyBmcm9tIHdlYiBhbmQgRlRQIHNlcnZlcnMuCisgICAgICAgICAgICAgICAgSW50ZXJuYWxseSwgdGhlIGZldGNoZXIgdXNlcyB0aGUgd2dldCB1dGlsaXR5LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZXhlY3V0YWJsZSBhbmQgcGFyYW1ldGVycyB1c2VkIGFyZSBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkZFVENIQ01EX3dnZXQ8L2ZpbGVuYW1lPiB2YXJpYWJsZSwgd2hpY2ggZGVmYXVsdHMKKyAgICAgICAgICAgICAgICB0byBzZW5zaWJsZSB2YWx1ZXMuCisgICAgICAgICAgICAgICAgVGhlIGZldGNoZXIgc3VwcG9ydHMgYSBwYXJhbWV0ZXIgImRvd25sb2FkZmlsZW5hbWUiIHRoYXQKKyAgICAgICAgICAgICAgICBhbGxvd3MgdGhlIG5hbWUgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSB0byBiZSBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgU3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIHVzZWZ1bAorICAgICAgICAgICAgICAgIGZvciBhdm9pZGluZyBjb2xsaXNpb25zIGluCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLURMX0RJUic+PGZpbGVuYW1lPkRMX0RJUjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHdoZW4gZGVhbGluZyB3aXRoIG11bHRpcGxlIGZpbGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBTb21lIGV4YW1wbGUgVVJMcyBhcmUgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiaHR0cDovL29lLmhhbmRoZWxkcy5vcmcvbm90X3RoZXJlLmFhYyIKKyAgICAgU1JDX1VSSSA9ICJmdHA6Ly9vZS5oYW5kaGVsZHMub3JnL25vdF90aGVyZV9hc193ZWxsLmFhYyIKKyAgICAgU1JDX1VSSSA9ICJmdHA6Ly95b3VAb2UuaGFuZGhlbGRzLm9yZy9ob21lL3lvdS9zZWNyZXQucGxhbiIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgIEJlY2F1c2UgVVJMIHBhcmFtZXRlcnMgYXJlIGRlbGltaXRlZCBieSBzZW1pLWNvbG9ucywgdGhpcyBjYW4KKyAgICAgICAgICAgICAgIGludHJvZHVjZSBhbWJpZ3VpdHkgd2hlbiBwYXJzaW5nIFVSTHMgdGhhdCBhbHNvIGNvbnRhaW4gc2VtaS1jb2xvbnMsCisgICAgICAgICAgICAgICBmb3IgZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiaHR0cDovL2FiYzEyMy5vcmcvZ2l0Lz9wPWdjYy9nY2MuZ2l0O2E9c25hcHNob3Q7aD1hNWRkNDciCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgU3VjaCBVUkxzIHNob3VsZCBzaG91bGQgYmUgbW9kaWZpZWQgYnkgcmVwbGFjaW5nIHNlbWktY29sb25zIHdpdGggJyZhbXA7JyBjaGFyYWN0ZXJzOgorICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gImh0dHA6Ly9hYmMxMjMub3JnL2dpdC8/cD1nY2MvZ2NjLmdpdCZhbXA7YT1zbmFwc2hvdCZhbXA7aD1hNWRkNDciCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIG1vc3QgY2FzZXMgdGhpcyBzaG91bGQgd29yay4gVHJlYXRpbmcgc2VtaS1jb2xvbnMgYW5kICcmYW1wOycgaW4gcXVlcmllcworICAgICAgICAgICAgICAgIGlkZW50aWNhbGx5IGlzIHJlY29tbWVuZGVkIGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIChXM0MpLgorICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgVVJMLCB5b3UgbWF5IGhhdmUgdG8gc3BlY2lmeSB0aGUgbmFtZQorICAgICAgICAgICAgICAgIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgYXMgd2VsbDoKKyAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBTUkNfVVJJID0gImh0dHA6Ly9hYmMxMjMub3JnL2dpdC8/cD1nY2MvZ2NjLmdpdCZhbXA7YT1zbmFwc2hvdCZhbXA7aD1hNWRkNDc7ZG93bmxvYWRmaWxlbmFtZT1teWZpbGUuYnoyIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdjdnMtZmV0Y2hlcic+CisgICAgICAgICAgICA8dGl0bGU+Q1ZTIGZldGNoZXIgKDxmaWxlbmFtZT4oY3ZzOi8vPC9maWxlbmFtZT4pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBzdWJtb2R1bGUgaGFuZGxlcyBjaGVja2luZyBvdXQgZmlsZXMgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICBDVlMgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGNvbmZpZ3VyZSBpdCB1c2luZyBhIG51bWJlciBvZiBkaWZmZXJlbnQgdmFyaWFibGVzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPkZFVENIQ01EX2N2czwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSB0byB1c2Ugd2hlbiBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPmN2czwvZmlsZW5hbWU+IGNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG5hbWUgaXMgdXN1YWxseSAiY3ZzIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5TUkNEQVRFPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRlIHRvIHVzZSB3aGVuIGZldGNoaW5nIHRoZSBDVlMgc291cmNlIGNvZGUuCisgICAgICAgICAgICAgICAgICAgICAgICBBIHNwZWNpYWwgdmFsdWUgb2YgIm5vdyIgY2F1c2VzIHRoZSBjaGVja291dCB0bworICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXBkYXRlZCBvbiBldmVyeSBidWlsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxsaW5rIGxpbmtlbmQ9J3Zhci1DVlNESVInPjxmaWxlbmFtZT5DVlNESVI8L2ZpbGVuYW1lPjwvbGluaz46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGVyZSBhIHRlbXBvcmFyeSBjaGVja291dCBpcyBzYXZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsb2NhdGlvbiBpcyBvZnRlbiA8ZmlsZW5hbWU+RExfRElSL2N2czwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPkNWU19QUk9YWV9IT1NUPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIHRvIHVzZSBhcyBhICJwcm94eT0iIHBhcmFtZXRlciB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jdnM8L2ZpbGVuYW1lPiBjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPkNWU19QUk9YWV9QT1JUPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwb3J0IG51bWJlciB0byB1c2UgYXMgYSAicHJveHlwb3J0PSIgcGFyYW1ldGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPmN2czwvZmlsZW5hbWU+IGNvbW1hbmQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICBBcyB3ZWxsIGFzIHRoZSBzdGFuZGFyZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgVVJMIHN5bnRheCwKKyAgICAgICAgICAgICAgICB5b3UgY2FuIGFsc28gY29uZmlndXJlIHRoZSBmZXRjaGVyIHdpdGggdmFyaW91cyBVUkwgcGFyYW1ldGVyczoKKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Im1ldGhvZCI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm90b2NvbCBvdmVyIHdoaWNoIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIENWUyBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3RvY29sIGlzICJwc2VydmVyIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmICJtZXRob2QiIGlzIHNldCB0byAiZXh0IiwgQml0QmFrZSBleGFtaW5lcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICJyc2giIHBhcmFtZXRlciBhbmQgc2V0cyA8ZmlsZW5hbWU+Q1ZTX1JTSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgImRpciIgZm9yIGxvY2FsIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Im1vZHVsZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbW9kdWxlIHRvIGNoZWNrIG91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IHN1cHBseSB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJ0YWciOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmliZXMgd2hpY2ggQ1ZTIFRBRyBzaG91bGQgYmUgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjaGVja291dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBUQUcgaXMgZW1wdHkuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4iZGF0ZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGRhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyAiZGF0ZSIgaXMgc3BlY2lmaWVkLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNEQVRFJz48ZmlsZW5hbWU+U1JDREFURTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCB0byBjaGVja291dCBhIHNwZWNpZmljIGRhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbCB2YWx1ZSBvZiAibm93IiBjYXVzZXMgdGhlIGNoZWNrb3V0IHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkIG9uIGV2ZXJ5IGJ1aWxkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ImxvY2FsZGlyIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byByZW5hbWUgdGhlIG1vZHVsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZWx5LCB5b3UgYXJlIHJlbmFtaW5nIHRoZSBvdXRwdXQgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICB0byB3aGljaCB0aGUgbW9kdWxlIGlzIHVucGFja2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGFyZSBmb3JjaW5nIHRoZSBtb2R1bGUgaW50byBhIHNwZWNpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUNWU0RJUic+PGZpbGVuYW1lPkNWU0RJUjwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJyc2giPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgIm1ldGhvZCIgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InNjbWRhdGEiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBDYXVzZXMgdGhlIENWUyBtZXRhZGF0YSB0byBiZSBtYWludGFpbmVkIGluIHRoZSB0YXJiYWxsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmV0Y2hlciBjcmVhdGVzIHdoZW4gc2V0IHRvICJrZWVwIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0YXJiYWxsIGlzIGV4cGFuZGVkIGludG8gdGhlIHdvcmsgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIENWUyBtZXRhZGF0YSBpcyByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ImZ1bGxwYXRoIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMgd2hldGhlciB0aGUgcmVzdWx0aW5nIGNoZWNrb3V0IGlzIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGxldmVsLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgb3IgaXMgYXQgZGVlcGVyCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJub3JlY3Vyc2UiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBDYXVzZXMgdGhlIGZldGNoZXIgdG8gb25seSBjaGVja291dCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcnkgd2l0aCBubyByZWN1cnNlIGludG8gYW55IHN1YmRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InBvcnQiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcG9ydCB0byB3aGljaCB0aGUgQ1ZTIHNlcnZlciBjb25uZWN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIFNvbWUgZXhhbXBsZSBVUkxzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJjdnM6Ly9DVlNST09UO21vZHVsZT1teW1vZHVsZTt0YWc9c29tZS12ZXJzaW9uO21ldGhvZD1leHQiCisgICAgIFNSQ19VUkkgPSAiY3ZzOi8vQ1ZTUk9PVDttb2R1bGU9bXltb2R1bGU7ZGF0ZT0yMDA2MDEyNjtsb2NhbGRpcj11c2V0aGF0IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdzdm4tZmV0Y2hlcic+CisgICAgICAgICAgICA8dGl0bGU+U3VidmVyc2lvbiAoU1ZOKSBGZXRjaGVyICg8ZmlsZW5hbWU+c3ZuOi8vPC9maWxlbmFtZT4pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBmZXRjaGVyIHN1Ym1vZHVsZSBmZXRjaGVzIGNvZGUgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICBTdWJ2ZXJzaW9uIHNvdXJjZSBjb250cm9sIHN5c3RlbS4KKyAgICAgICAgICAgICAgICBUaGUgZXhlY3V0YWJsZSB1c2VkIGlzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5GRVRDSENNRF9zdm48L2ZpbGVuYW1lPiwgd2hpY2ggZGVmYXVsdHMKKyAgICAgICAgICAgICAgICB0byAic3ZuIi4KKyAgICAgICAgICAgICAgICBUaGUgZmV0Y2hlcidzIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBpcyBzZXQgYnkKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU1ZORElSJz48ZmlsZW5hbWU+U1ZORElSPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgIHdoaWNoIGlzIHVzdWFsbHkgPGZpbGVuYW1lPkRMX0RJUi9zdm48L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Im1vZHVsZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzdm4gbW9kdWxlIHRvIGNoZWNrb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgcHJvdmlkZSB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdGhpbmsgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgdGhlIHRvcC1sZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IG9mIHRoZSByZXBvc2l0b3J5IGRhdGEgeW91IHdhbnQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4icHJvdG9jb2wiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcHJvdG9jb2wgdG8gdXNlLCB3aGljaCBkZWZhdWx0cyB0byAic3ZuIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIG9wdGlvbnMgYXJlICJzdm4rc3NoIiBhbmQgInJzaCIuCisgICAgICAgICAgICAgICAgICAgICAgICBGb3IgInJzaCIsIHRoZSAicnNoIiBwYXJhbWV0ZXIgaXMgYWxzbyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InJldiI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXZpc2lvbiBvZiB0aGUgc291cmNlIGNvZGUgdG8gY2hlY2tvdXQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4iZGF0ZSI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRlIG9mIHRoZSBzb3VyY2UgY29kZSB0byBjaGVja291dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmljIHJldmlzaW9ucyBhcmUgZ2VuZXJhbGx5IG11Y2ggc2FmZXIgdG8gY2hlY2tvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGJ5IGRhdGUgYXMgdGhleSBkbyBub3QgaW52b2x2ZSB0aW1lem9uZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZXkgYXJlIG11Y2ggbW9yZSBkZXRlcm1pbmlzdGljKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJzY21kYXRhIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgQ2F1c2VzIHRoZSDigJwuc3Zu4oCdIGRpcmVjdG9yaWVzIHRvIGJlIGF2YWlsYWJsZSBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUtdGltZSB3aGVuIHNldCB0byAia2VlcCIuCisgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGVzZSBkaXJlY3RvcmllcyBhcmUgcmVtb3ZlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJ0cmFuc3BvcnR1c2VyIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiByZXF1aXJlZCwgc2V0cyB0aGUgdXNlcm5hbWUgZm9yIHRoZSB0cmFuc3BvcnQuCisgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGlzIHBhcmFtZXRlciBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0cmFuc3BvcnQgdXNlcm5hbWUgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHVzZXJuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHRoZSBtYWluIFVSTCwgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBzdWJ2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgRm9sbG93aW5nIGFyZSB0d28gZXhhbXBsZXMgdXNpbmcgc3ZuOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJzdm46Ly9zdm4ub2UuaGFuZGhlbGRzLm9yZy9zdm47bW9kdWxlPXZpcDtwcm90bz1odHRwO3Jldj02NjciCisgICAgIFNSQ19VUkkgPSAic3ZuOi8vc3ZuLm9lLmhhbmRoZWxkcy5vcmcvc3ZuLzttb2R1bGU9b3BpZTtwcm90bz1zdm4rc3NoO2RhdGU9MjAwNjAxMjYiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2dpdC1mZXRjaGVyJz4KKyAgICAgICAgICAgIDx0aXRsZT5HaXQgRmV0Y2hlciAoPGZpbGVuYW1lPmdpdDovLzwvZmlsZW5hbWU+KTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgZmV0Y2hlciBzdWJtb2R1bGUgZmV0Y2hlcyBjb2RlIGZyb20gdGhlIEdpdAorICAgICAgICAgICAgICAgIHNvdXJjZSBjb250cm9sIHN5c3RlbS4KKyAgICAgICAgICAgICAgICBUaGUgZmV0Y2hlciB3b3JrcyBieSBjcmVhdGluZyBhIGJhcmUgY2xvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgcmVtb3RlIGludG8KKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItR0lURElSJz48ZmlsZW5hbWU+R0lURElSPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgIHdoaWNoIGlzIHVzdWFsbHkgPGZpbGVuYW1lPkRMX0RJUi9naXQyPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgVGhpcyBiYXJlIGNsb25lIGlzIHRoZW4gY2xvbmVkIGludG8gdGhlIHdvcmsgZGlyZWN0b3J5IGR1cmluZyB0aGUKKyAgICAgICAgICAgICAgICB1bnBhY2sgc3RhZ2Ugd2hlbiBhIHNwZWNpZmljIHRyZWUgaXMgY2hlY2tlZCBvdXQuCisgICAgICAgICAgICAgICAgVGhpcyBpcyBkb25lIHVzaW5nIGFsdGVybmF0ZXMgYW5kIGJ5IHJlZmVyZW5jZSB0bworICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSBhbW91bnQgb2YgZHVwbGljYXRlIGRhdGEgb24gdGhlIGRpc2sgYW5kCisgICAgICAgICAgICAgICAgbWFrZSB0aGUgdW5wYWNrIHByb2Nlc3MgZmFzdC4KKyAgICAgICAgICAgICAgICBUaGUgZXhlY3V0YWJsZSB1c2VkIGNhbiBiZSBzZXQgd2l0aAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5GRVRDSENNRF9naXQ8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBmZXRjaGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJwcm90b2NvbCI6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm90b2NvbCB1c2VkIHRvIGZldGNoIHRoZSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICJnaXQiIHdoZW4gYSBob3N0bmFtZSBpcyBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICBJZiBhIGhvc3RuYW1lIGlzIG5vdCBzZXQsIHRoZSBHaXQgcHJvdG9jb2wgaXMgImZpbGUiLgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIHVzZSAiaHR0cCIsICJodHRwcyIsICJzc2giIGFuZCAicnN5bmMiLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Im5vY2hlY2tvdXQiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUZWxscyB0aGUgZmV0Y2hlciB0byBub3QgY2hlY2tvdXQgc291cmNlIGNvZGUgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNraW5nIHdoZW4gc2V0IHRvICIxIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIG9wdGlvbiBmb3IgdGhlIFVSTCB3aGVyZSB0aGVyZSBpcyBhIGN1c3RvbQorICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZSB0byBjaGVja291dCBjb2RlLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgIjAiLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+InJlYmFzZWFibGUiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgdXBzdHJlYW0gR2l0IHJlcG9zaXRvcnkgY2FuIGJlIHJlYmFzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHNldCB0aGlzIHBhcmFtZXRlciB0byAiMSIgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9ucyBjYW4gYmVjb21lIGRldGFjaGVkIGZyb20gYnJhbmNoZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBzb3VyY2UgbWlycm9yIHRhcmJhbGwgaXMgZG9uZSBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uLCB3aGljaCBoYXMgYSBsb3NzIG9mIGVmZmljaWVuY3kuCisgICAgICAgICAgICAgICAgICAgICAgICBSZWJhc2luZyB0aGUgdXBzdHJlYW0gR2l0IHJlcG9zaXRvcnkgY291bGQgY2F1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHJldmlzaW9uIHRvIGRpc2FwcGVhciBmcm9tIHRoZSB1cHN0cmVhbSByZXBvc2l0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gcmVtaW5kcyB0aGUgZmV0Y2hlciB0byBwcmVzZXJ2ZSB0aGUgbG9jYWwgY2FjaGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmVmdWxseSBmb3IgZnV0dXJlIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpcyAiMCIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4ibm9icmFuY2giOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUZWxscyB0aGUgZmV0Y2hlciB0byBub3QgY2hlY2sgdGhlIFNIQSB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGJyYW5jaCB3aGVuIHNldCB0byAiMSIuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAiMCIuCisgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyBvcHRpb24gZm9yIHRoZSByZWNpcGUgdGhhdCByZWZlcnMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21taXQgdGhhdCBpcyB2YWxpZCBmb3IgYSB0YWcgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJyYW5jaC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJiYXJlY2xvbmUiOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBUZWxscyB0aGUgZmV0Y2hlciB0byBjbG9uZSBhIGJhcmUgY2xvbmUgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aXRob3V0IGNoZWNraW5nIG91dCBhIHdvcmtpbmcgdHJlZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIHJhdyBHaXQgbWV0YWRhdGEgaXMgcHJvdmlkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpbXBsaWVzIHRoZSAibm9jaGVja291dCIgcGFyYW1ldGVyIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4iYnJhbmNoIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJyYW5jaChlcykgb2YgdGhlIEdpdCB0cmVlIHRvIGNsb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgdW5zZXQsIHRoaXMgaXMgYXNzdW1lZCB0byBiZSAibWFzdGVyIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnJhbmNoIHBhcmFtZXRlcnMgbXVjaCBtYXRjaCB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHBhcmFtZXRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4icmV2Ijo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJldmlzaW9uIHRvIHVzZSBmb3IgdGhlIGNoZWNrb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgIm1hc3RlciIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz4idGFnIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgdGFnIHRvIHVzZSBmb3IgdGhlIGNoZWNrb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgVG8gY29ycmVjdGx5IHJlc29sdmUgdGFncywgQml0QmFrZSBtdXN0IGFjY2VzcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsuCisgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhhdCByZWFzb24sIHRhZ3MgYXJlIG9mdGVuIG5vdCB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgQXMgZmFyIGFzIEdpdCBpcyBjb25jZXJuZWQsIHRoZSAidGFnIiBwYXJhbWV0ZXIgYmVoYXZlcworICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgdGhlICJyZXYiIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJzdWJwYXRoIjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgTGltaXRzIHRoZSBjaGVja291dCB0byBhIHNwZWNpZmljIHN1YnBhdGggb2YgdGhlIHRyZWUuCisgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgd2hvbGUgdHJlZSBpcyBjaGVja2VkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPiJkZXN0c3VmZml4Ijo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHBhdGggaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGNoZWNrb3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIHBhdGggaXMgPGZpbGVuYW1lPmdpdC88L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZSBVUkxzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgU1JDX1VSSSA9ICJnaXQ6Ly9naXQub2UuaGFuZGhlbGRzLm9yZy9naXQvdmlwLmdpdDt0YWc9dmVyc2lvbi0xIgorICAgICBTUkNfVVJJID0gImdpdDovL2dpdC5vZS5oYW5kaGVsZHMub3JnL2dpdC92aXAuZ2l0O3Byb3RvY29sPWh0dHAiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2dpdHNtLWZldGNoZXInPgorICAgICAgICAgICAgPHRpdGxlPkdpdCBTdWJtb2R1bGUgRmV0Y2hlciAoPGZpbGVuYW1lPmdpdHNtOi8vPC9maWxlbmFtZT4pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBmZXRjaGVyIHN1Ym1vZHVsZSBpbmhlcml0cyBmcm9tIHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J2dpdC1mZXRjaGVyJz5HaXQgZmV0Y2hlcjwvbGluaz4gYW5kIGV4dGVuZHMKKyAgICAgICAgICAgICAgICB0aGF0IGZldGNoZXIncyBiZWhhdmlvciBieSBmZXRjaGluZyBhIHJlcG9zaXRvcnkncyBzdWJtb2R1bGVzLgorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNfVVJJJz48ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIGlzIHBhc3NlZCB0byB0aGUgR2l0IGZldGNoZXIgYXMgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdnaXQtZmV0Y2hlcic+R2l0IEZldGNoZXIgKDxmaWxlbmFtZT5naXQ6Ly88L2ZpbGVuYW1lPik8L2xpbms+IgorICAgICAgICAgICAgICAgIHNlY3Rpb24uCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Ob3RlcyBhbmQgV2FybmluZ3M8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IGNsZWFuIGEgcmVjaXBlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICc8ZmlsZW5hbWU+Z2l0Oi8vPC9maWxlbmFtZT4nIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgJzxmaWxlbmFtZT5naXRzbTovLzwvZmlsZW5hbWU+JyBVUkxzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgR2l0IFN1Ym1vZHVsZXMgZmV0Y2hlciBpcyBub3QgYSBjb21wbGV0ZSBmZXRjaGVyCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmZXRjaGVyIGhhcyBrbm93biBpc3N1ZXMgd2hlcmUgaXQgZG9lcyBub3QgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIHNvdXJjZSBtaXJyb3JpbmcgaW5mcmFzdHJ1Y3R1cmUgcHJvcGVybHkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nY2xlYXJjYXNlLWZldGNoZXInPgorICAgICAgICAgICAgPHRpdGxlPkNsZWFyQ2FzZSBGZXRjaGVyICg8ZmlsZW5hbWU+Y2NyYzovLzwvZmlsZW5hbWU+KTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgZmV0Y2hlciBzdWJtb2R1bGUgZmV0Y2hlcyBjb2RlIGZyb20gYQorICAgICAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmF0aW9uYWxfQ2xlYXJDYXNlJz5DbGVhckNhc2U8L3VsaW5rPgorICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRvIHVzZSB0aGlzIGZldGNoZXIsIG1ha2Ugc3VyZSB5b3VyIHJlY2lwZSBoYXMgcHJvcGVyCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ19VUkknPjxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNSRVYnPjxmaWxlbmFtZT5TUkNSRVY8L2ZpbGVuYW1lPjwvbGluaz4sIGFuZAorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QVic+PGZpbGVuYW1lPlBWPC9maWxlbmFtZT48L2xpbms+IHNldHRpbmdzLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFNSQ19VUkkgPSAiY2NyYzovL2NjLmV4YW1wbGUub3JnL2NjcmM7dm9iPS9leGFtcGxlX3ZvYjttb2R1bGU9L2V4YW1wbGVfbW9kdWxlIgorICAgICBTUkNSRVYgPSAiRVhBTVBMRV9DTEVBUkNBU0VfVEFHIgorICAgICBQViA9ICIke0BkLmdldFZhcigiU1JDUkVWIiwgRmFsc2UpLnJlcGxhY2UoIi8iLCAiKyIpfSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIGZldGNoZXIgdXNlcyB0aGUgPGZpbGVuYW1lPnJjbGVhcnRvb2w8L2ZpbGVuYW1lPiBvcgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jbGVhcnRvb2w8L2ZpbGVuYW1lPiByZW1vdGUgY2xpZW50LCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgICAgICB3aGljaCBvbmUgaXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBGb2xsb3dpbmcgYXJlIG9wdGlvbnMgZm9yIHRoZSA8ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgc3RhdGVtZW50OgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnZvYjwvZmlsZW5hbWU+PC9lbXBoYXNpcz46CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSwgd2hpY2ggbXVzdCBpbmNsdWRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZGluZyAiLyIgY2hhcmFjdGVyLCBvZiB0aGUgQ2xlYXJDYXNlIFZPQi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPm1vZHVsZTwvZmlsZW5hbWU+PC9lbXBoYXNpcz46CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbW9kdWxlLCB3aGljaCBtdXN0IGluY2x1ZGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kaW5nICIvIiBjaGFyYWN0ZXIsIGluIHRoZSBzZWxlY3RlZCBWT0IuCisgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPm1vZHVsZTwvZmlsZW5hbWU+IGFuZCA8ZmlsZW5hbWU+dm9iPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIGFyZSBjb21iaW5lZCB0byBjcmVhdGUgdGhlIDxmaWxlbmFtZT5sb2FkPC9maWxlbmFtZT4gcnVsZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2aWV3IGNvbmZpZyBzcGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSA8ZmlsZW5hbWU+dm9iPC9maWxlbmFtZT4gYW5kIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5tb2R1bGU8L2ZpbGVuYW1lPiB2YWx1ZXMgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPiBzdGF0ZW1lbnQgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgc2VjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21iaW5pbmcgdGhvc2UgdmFsdWVzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGxvYWQgL2V4YW1wbGVfdm9iL2V4YW1wbGVfbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnByb3RvPC9maWxlbmFtZT48L2VtcGhhc2lzPjoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwcm90b2NvbCwgd2hpY2ggY2FuIGJlIGVpdGhlciA8ZmlsZW5hbWU+aHR0cDwvZmlsZW5hbWU+IG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+aHR0cHM8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgZmV0Y2hlciBjcmVhdGVzIGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRoaXMgc3BlY2lmaWNhdGlvbiB3cml0dGVuIHRvIGFuIGFyZWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCwKKyAgICAgICAgICAgICAgICB1c2UgdGhlIDxmaWxlbmFtZT5DQ0FTRV9DVVNUT01fQ09ORklHX1NQRUM8L2ZpbGVuYW1lPiB2YXJpYWJsZQorICAgICAgICAgICAgICAgIGluIHlvdXIgcmVjaXBlIHRvIGRlZmluZSB3aGVyZSB0aGUgc3BlY2lmaWNhdGlvbiBpcyB3cml0dGVuLgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPlNSQ1JFVjwvZmlsZW5hbWU+IGxvc2VzIGl0cyBmdW5jdGlvbmFsaXR5IGlmIHlvdQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoaXMgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIDxmaWxlbmFtZT5TUkNSRVY8L2ZpbGVuYW1lPiBpcyBzdGlsbCB1c2VkIHRvIGxhYmVsIHRoZQorICAgICAgICAgICAgICAgICAgICBhcmNoaXZlIGFmdGVyIGEgZmV0Y2ggZXZlbiB0aG91Z2ggaXQgZG9lcyBub3QgZGVmaW5lIHdoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZC4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEhlcmUgYXJlIGEgY291cGxlIG9mIG90aGVyIGJlaGF2aW9ycyB3b3J0aCBtZW50aW9uaW5nOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdXNpbmcgPGZpbGVuYW1lPmNsZWFydG9vbDwvZmlsZW5hbWU+LCB0aGUgbG9naW4gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jbGVhcnRvb2w8L2ZpbGVuYW1lPiBpcyBoYW5kbGVkIGJ5IHRoZSBzeXN0ZW0uCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbG9naW4gcmVxdWlyZSBubyBzcGVjaWFsIHN0ZXBzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluIG9yZGVyIHRvIHVzZSA8ZmlsZW5hbWU+cmNsZWFydG9vbDwvZmlsZW5hbWU+IHdpdGggYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnMsIGFuICJyY2xlYXJ0b29sIGxvZ2luIiBpcyBuZWNlc3NhcnkgYmVmb3JlIHVzaW5nIHRoZSBmZXRjaGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nb3RoZXItZmV0Y2hlcnMnPgorICAgICAgICAgICAgPHRpdGxlPk90aGVyIEZldGNoZXJzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRmV0Y2ggc3VibW9kdWxlcyBhbHNvIGV4aXN0IGZvciB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJhemFhciAoPGZpbGVuYW1lPmJ6cjovLzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcmNlICg8ZmlsZW5hbWU+cDQ6Ly88L2ZpbGVuYW1lPikKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlcyB1c2luZyBHaXQgQW5uZXggKDxmaWxlbmFtZT5naXRhbm5leDovLzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyZSBGVFAgKDxmaWxlbmFtZT5zZnRwOi8vPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJlIFNoZWxsICg8ZmlsZW5hbWU+c3NoOi8vPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgUmVwbyAoPGZpbGVuYW1lPnJlcG86Ly88L2ZpbGVuYW1lPikKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBPU0MgKDxmaWxlbmFtZT5vc2M6Ly88L2ZpbGVuYW1lPikKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBNZXJjdXJpYWwgKDxmaWxlbmFtZT5oZzovLzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgTm8gZG9jdW1lbnRhdGlvbiBjdXJyZW50bHkgZXhpc3RzIGZvciB0aGVzZSBsZXNzZXIgdXNlZAorICAgICAgICAgICAgICAgIGZldGNoZXIgc3VibW9kdWxlcy4KKyAgICAgICAgICAgICAgICBIb3dldmVyLCB5b3UgbWlnaHQgZmluZCB0aGUgY29kZSBoZWxwZnVsIGFuZCByZWFkYWJsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdhdXRvLXJldmlzaW9ucyc+CisgICAgICAgIDx0aXRsZT5BdXRvIFJldmlzaW9uczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXZSBuZWVkIHRvIGRvY3VtZW50IDxmaWxlbmFtZT5BVVRPUkVWPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICA8ZmlsZW5hbWU+U1JDUkVWX0ZPUk1BVDwvZmlsZW5hbWU+IGhlcmUuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtaGVsbG8ueG1sIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWhlbGxvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYyOGNmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWhlbGxvLnhtbApAQCAtMCwwICsxLDUwNiBAQAorPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzxhcHBlbmRpeCBpZD0naGVsbG8td29ybGQtZXhhbXBsZSc+CisgICAgPHRpdGxlPkhlbGxvIFdvcmxkIEV4YW1wbGU8L3RpdGxlPgorCisgICAgPHNlY3Rpb24gaWQ9J2JpdGJha2UtaGVsbG8td29ybGQnPgorICAgICAgICA8dGl0bGU+Qml0QmFrZSBIZWxsbyBXb3JsZDwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgc2ltcGxlc3QgZXhhbXBsZSBjb21tb25seSB1c2VkIHRvIGRlbW9uc3RyYXRlIGFueSBuZXcKKyAgICAgICAgICAgIHByb2dyYW1taW5nIGxhbmd1YWdlIG9yIHRvb2wgaXMgdGhlCisgICAgICAgICAgICAiPHVsaW5rIHVybD0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IZWxsb193b3JsZF9wcm9ncmFtIj5IZWxsbyBXb3JsZDwvdWxpbms+IgorICAgICAgICAgICAgZXhhbXBsZS4KKyAgICAgICAgICAgIFRoaXMgYXBwZW5kaXggZGVtb25zdHJhdGVzLCBpbiB0dXRvcmlhbCBmb3JtLCBIZWxsbworICAgICAgICAgICAgV29ybGQgd2l0aGluIHRoZSBjb250ZXh0IG9mIEJpdEJha2UuCisgICAgICAgICAgICBUaGUgdHV0b3JpYWwgZGVzY3JpYmVzIGhvdyB0byBjcmVhdGUgYSBuZXcgcHJvamVjdAorICAgICAgICAgICAgYW5kIHRoZSBhcHBsaWNhYmxlIG1ldGFkYXRhIGZpbGVzIG5lY2Vzc2FyeSB0byBhbGxvdworICAgICAgICAgICAgQml0QmFrZSB0byBidWlsZCBpdC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdleGFtcGxlLW9idGFpbmluZy1iaXRiYWtlJz4KKyAgICAgICAgPHRpdGxlPk9idGFpbmluZyBCaXRCYWtlPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNlZSB0aGUKKyAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdvYnRhaW5pbmctYml0YmFrZSc+T2J0YWluaW5nIEJpdEJha2U8L2xpbms+IgorICAgICAgICAgICAgc2VjdGlvbiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIG9idGFpbiBCaXRCYWtlLgorICAgICAgICAgICAgT25jZSB5b3UgaGF2ZSB0aGUgc291cmNlIGNvZGUgb24geW91ciBtYWNoaW5lLCB0aGUgQml0QmFrZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIGFwcGVhcnMgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBscyAtYWwKKyAgICAgdG90YWwgMTAwCisgICAgIGRyd3hyd3hyLXguIDkgd21hdCB3bWF0ICA0MDk2IEphbiAzMSAxMzo0NCAuCisgICAgIGRyd3hyd3hyLXguIDMgd21hdCB3bWF0ICA0MDk2IEZlYiAgNCAxMDo0NSAuLgorICAgICAtcnctcnctci0tLiAxIHdtYXQgd21hdCAgIDM2NSBOb3YgMjYgMDQ6NTUgQVVUSE9SUworICAgICBkcnd4cnd4ci14LiAyIHdtYXQgd21hdCAgNDA5NiBOb3YgMjYgMDQ6NTUgYmluCisgICAgIGRyd3hyd3hyLXguIDQgd21hdCB3bWF0ICA0MDk2IEphbiAzMSAxMzo0NCBidWlsZAorICAgICAtcnctcnctci0tLiAxIHdtYXQgd21hdCAxNjUwMSBOb3YgMjYgMDQ6NTUgQ2hhbmdlTG9nCisgICAgIGRyd3hyd3hyLXguIDIgd21hdCB3bWF0ICA0MDk2IE5vdiAyNiAwNDo1NSBjbGFzc2VzCisgICAgIGRyd3hyd3hyLXguIDIgd21hdCB3bWF0ICA0MDk2IE5vdiAyNiAwNDo1NSBjb25mCisgICAgIGRyd3hyd3hyLXguIDMgd21hdCB3bWF0ICA0MDk2IE5vdiAyNiAwNDo1NSBjb250cmliCisgICAgIC1ydy1ydy1yLS0uIDEgd21hdCB3bWF0IDE3OTg3IE5vdiAyNiAwNDo1NSBDT1BZSU5HCisgICAgIGRyd3hyd3hyLXguIDMgd21hdCB3bWF0ICA0MDk2IE5vdiAyNiAwNDo1NSBkb2MKKyAgICAgLXJ3LXJ3LXItLS4gMSB3bWF0IHdtYXQgICAgNjkgTm92IDI2IDA0OjU1IC5naXRpZ25vcmUKKyAgICAgLXJ3LXJ3LXItLS4gMSB3bWF0IHdtYXQgICA4NDkgTm92IDI2IDA0OjU1IEhFQURFUgorICAgICBkcnd4cnd4ci14LiA1IHdtYXQgd21hdCAgNDA5NiBKYW4gMzEgMTM6NDQgbGliCisgICAgIC1ydy1ydy1yLS0uIDEgd21hdCB3bWF0ICAgMTk1IE5vdiAyNiAwNDo1NSBNQU5JRkVTVC5pbgorICAgICAtcnd4cnd4ci14LiAxIHdtYXQgd21hdCAgMzE5NSBKYW4gMzEgMTE6NTcgc2V0dXAucHkKKyAgICAgLXJ3LXJ3LXItLS4gMSB3bWF0IHdtYXQgIDI4ODcgTm92IDI2IDA0OjU1IFRPRE8KKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXQgdGhpcyBwb2ludCwgeW91IHNob3VsZCBoYXZlIEJpdEJha2UgY2xvbmVkIHRvCisgICAgICAgICAgICBhIGRpcmVjdG9yeSB0aGF0IG1hdGNoZXMgdGhlIHByZXZpb3VzIGxpc3RpbmcgZXhjZXB0IGZvcgorICAgICAgICAgICAgZGF0ZXMgYW5kIHVzZXIgbmFtZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nc2V0dGluZy11cC10aGUtYml0YmFrZS1lbnZpcm9ubWVudCc+CisgICAgICAgIDx0aXRsZT5TZXR0aW5nIFVwIHRoZSBCaXRCYWtlIEVudmlyb25tZW50PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZpcnN0LCB5b3UgbmVlZCB0byBiZSBzdXJlIHRoYXQgeW91IGNhbiBydW4gQml0QmFrZS4KKyAgICAgICAgICAgIFNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHdoZXJlIHlvdXIgbG9jYWwgQml0QmFrZQorICAgICAgICAgICAgZmlsZXMgYXJlIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIC4vYmluL2JpdGJha2UgLS12ZXJzaW9uCisgICAgIEJpdEJha2UgQnVpbGQgVG9vbCBDb3JlIHZlcnNpb24gMS4yMy4wLCBiaXRiYWtlIHZlcnNpb24gMS4yMy4wCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICBUaGUgY29uc29sZSBvdXRwdXQgdGVsbHMgeW91IHdoYXQgdmVyc2lvbiB5b3UgYXJlIHJ1bm5pbmcuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSByZWNvbW1lbmRlZCBtZXRob2QgdG8gcnVuIEJpdEJha2UgaXMgZnJvbSBhIGRpcmVjdG9yeSBvZiB5b3VyCisgICAgICAgICAgICBjaG9pY2UuCisgICAgICAgICAgICBUbyBiZSBhYmxlIHRvIHJ1biBCaXRCYWtlIGZyb20gYW55IGRpcmVjdG9yeSwgeW91IG5lZWQgdG8gYWRkIHRoZQorICAgICAgICAgICAgZXhlY3V0YWJsZSBiaW5hcnkgdG8geW91ciBiaW5hcnkgdG8geW91ciBzaGVsbCdzIGVudmlyb25tZW50CisgICAgICAgICAgICA8ZmlsZW5hbWU+UEFUSDwvZmlsZW5hbWU+IHZhcmlhYmxlLgorICAgICAgICAgICAgRmlyc3QsIGxvb2sgYXQgeW91ciBjdXJyZW50IDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4gdmFyaWFibGUKKyAgICAgICAgICAgIGJ5IGVudGVyaW5nIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgZWNobyAkUEFUSAorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgTmV4dCwgYWRkIHRoZSBkaXJlY3RvcnkgbG9jYXRpb24gZm9yIHRoZSBCaXRCYWtlIGJpbmFyeSB0byB0aGUKKyAgICAgICAgICAgIDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4uCisgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCBhZGRzIHRoZQorICAgICAgICAgICAgPGZpbGVuYW1lPi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2JpbjwvZmlsZW5hbWU+IGRpcmVjdG9yeQorICAgICAgICAgICAgdG8gdGhlIGZyb250IG9mIHRoZSA8ZmlsZW5hbWU+UEFUSDwvZmlsZW5hbWU+IHZhcmlhYmxlOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGV4cG9ydCBQQVRIPS9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2JpbjokUEFUSAorICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBlbnRlciB0aGUgPGZpbGVuYW1lPmJpdGJha2U8L2ZpbGVuYW1lPgorICAgICAgICAgICAgY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2hpbGUgd29ya2luZyBmcm9tIGFueSBkaXJlY3RvcnkuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0ndGhlLWhlbGxvLXdvcmxkLWV4YW1wbGUnPgorICAgICAgICA8dGl0bGU+VGhlIEhlbGxvIFdvcmxkIEV4YW1wbGU8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIG92ZXJhbGwgZ29hbCBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGJ1aWxkIGEKKyAgICAgICAgICAgIGNvbXBsZXRlICJIZWxsbyBXb3JsZCIgZXhhbXBsZSB1dGlsaXppbmcgdGFzayBhbmQgbGF5ZXIKKyAgICAgICAgICAgIGNvbmNlcHRzLgorICAgICAgICAgICAgQmVjYXVzZSB0aGlzIGlzIGhvdyBtb2Rlcm4gcHJvamVjdHMgc3VjaCBhcyBPcGVuRW1iZWRkZWQgYW5kCisgICAgICAgICAgICB0aGUgWW9jdG8gUHJvamVjdCB1dGlsaXplIEJpdEJha2UsIHRoZSBleGFtcGxlCisgICAgICAgICAgICBwcm92aWRlcyBhbiBleGNlbGxlbnQgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcKKyAgICAgICAgICAgIEJpdEJha2UuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIGhlbHAgeW91IHVuZGVyc3RhbmQgaG93IHRvIHVzZSBCaXRCYWtlIHRvIGJ1aWxkIHRhcmdldHMsCisgICAgICAgICAgICB0aGUgZXhhbXBsZSBzdGFydHMgd2l0aCBub3RoaW5nIGJ1dCB0aGUgPGZpbGVuYW1lPmJpdGJha2U8L2ZpbGVuYW1lPgorICAgICAgICAgICAgY29tbWFuZCwgd2hpY2ggY2F1c2VzIEJpdEJha2UgdG8gZmFpbCBhbmQgcmVwb3J0IHByb2JsZW1zLgorICAgICAgICAgICAgVGhlIGV4YW1wbGUgcHJvZ3Jlc3NlcyBieSBhZGRpbmcgcGllY2VzIHRvIHRoZSBidWlsZCB0bworICAgICAgICAgICAgZXZlbnR1YWxseSBjb25jbHVkZSB3aXRoIGEgd29ya2luZywgbWluaW1hbCAiSGVsbG8gV29ybGQiCisgICAgICAgICAgICBleGFtcGxlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXaGlsZSBldmVyeSBhdHRlbXB0IGlzIG1hZGUgdG8gZXhwbGFpbiB3aGF0IGlzIGhhcHBlbmluZyBkdXJpbmcKKyAgICAgICAgICAgIHRoZSBleGFtcGxlLCB0aGUgZGVzY3JpcHRpb25zIGNhbm5vdCBjb3ZlciBldmVyeXRoaW5nLgorICAgICAgICAgICAgWW91IGNhbiBmaW5kIGZ1cnRoZXIgaW5mb3JtYXRpb24gdGhyb3VnaG91dCB0aGlzIG1hbnVhbC4KKyAgICAgICAgICAgIEFsc28sIHlvdSBjYW4gYWN0aXZlbHkgcGFydGljaXBhdGUgaW4gdGhlCisgICAgICAgICAgICA8dWxpbmsgdXJsPSdodHRwOi8vbGlzdHMub3BlbmVtYmVkZGVkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2JpdGJha2UtZGV2ZWwnPjwvdWxpbms+CisgICAgICAgICAgICBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdCBhYm91dCB0aGUgQml0QmFrZSBidWlsZCB0b29sLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICBUaGlzIGV4YW1wbGUgd2FzIGluc3BpcmVkIGJ5IGFuZCBkcmV3IGhlYXZpbHkgZnJvbSB0aGVzZSBzb3VyY2VzOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS95b2N0b0B5b2N0b3Byb2plY3Qub3JnL21zZzA5Mzc5Lmh0bWwiPk1haWxpbmcgTGlzdCBwb3N0IC0gVGhlIEJpdEJha2UgZXF1aXZhbGVudCBvZiAiSGVsbG8sIFdvcmxkISI8L3VsaW5rPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDx1bGluayB1cmw9Imh0dHA6Ly9oYW1iZWRkZWQub3JnL2Jsb2cvMjAxMi8xMS8yNC9mcm9tLWJpdGJha2UtaGVsbG8td29ybGQtdG8tYW4taW1hZ2UvIj5IYW1iZWRkZWQgTGludXggYmxvZyBwb3N0IC0gRnJvbSBCaXRiYWtlIEhlbGxvIFdvcmxkIHRvIGFuIEltYWdlPC91bGluaz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9ub3RlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgc3RhdGVkIGVhcmxpZXIsIHRoZSBnb2FsIG9mIHRoaXMgZXhhbXBsZQorICAgICAgICAgICAgaXMgdG8gZXZlbnR1YWxseSBjb21waWxlICJIZWxsbyBXb3JsZCIuCisgICAgICAgICAgICBIb3dldmVyLCBpdCBpcyB1bmtub3duIHdoYXQgQml0QmFrZSBuZWVkcyBhbmQgd2hhdCB5b3UgaGF2ZQorICAgICAgICAgICAgdG8gcHJvdmlkZSBpbiBvcmRlciB0byBhY2hpZXZlIHRoYXQgZ29hbC4KKyAgICAgICAgICAgIFJlY2FsbCB0aGF0IEJpdEJha2UgdXRpbGl6ZXMgdGhyZWUgdHlwZXMgb2YgbWV0YWRhdGEgZmlsZXM6CisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSdjb25maWd1cmF0aW9uLWZpbGVzJz5Db25maWd1cmF0aW9uIEZpbGVzPC9saW5rPiwKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J2NsYXNzZXMnPkNsYXNzZXM8L2xpbms+LCBhbmQKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3JlY2lwZXMnPlJlY2lwZXM8L2xpbms+LgorICAgICAgICAgICAgQnV0IHdoZXJlIGRvIHRoZXkgZ28/CisgICAgICAgICAgICBIb3cgZG9lcyBCaXRCYWtlIGZpbmQgdGhlbT8KKyAgICAgICAgICAgIEJpdEJha2UncyBlcnJvciBtZXNzYWdpbmcgaGVscHMgeW91IGFuc3dlciB0aGVzZSB0eXBlcyBvZiBxdWVzdGlvbnMKKyAgICAgICAgICAgIGFuZCBoZWxwcyB5b3UgYmV0dGVyIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF0IGlzIGdvaW5nIG9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb2xsb3dpbmcgaXMgdGhlIGNvbXBsZXRlICJIZWxsbyBXb3JsZCIgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Q3JlYXRlIGEgUHJvamVjdCBEaXJlY3Rvcnk6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBGaXJzdCwgc2V0IHVwIGEgZGlyZWN0b3J5IGZvciB0aGUgIkhlbGxvIFdvcmxkIiBwcm9qZWN0LgorICAgICAgICAgICAgICAgIEhlcmUgaXMgaG93IHlvdSBjYW4gZG8gc28gaW4geW91ciBob21lIGRpcmVjdG9yeToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgbWtkaXIgfi9oZWxsbworICAgICAkIGNkIH4vaGVsbG8KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHRoYXQgQml0QmFrZSB3aWxsIHVzZSB0byBkbyBhbGwgb2YKKyAgICAgICAgICAgICAgICBpdHMgd29yay4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGlzIGRpcmVjdG9yeSB0byBrZWVwIGFsbCB0aGUgbWV0YWZpbGVzIG5lZWRlZAorICAgICAgICAgICAgICAgIGJ5IEJpdEJha2UuCisgICAgICAgICAgICAgICAgSGF2aW5nIGEgcHJvamVjdCBkaXJlY3RvcnkgaXMgYSBnb29kIHdheSB0byBpc29sYXRlIHlvdXIKKyAgICAgICAgICAgICAgICBwcm9qZWN0LgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5SdW4gQml0YmFrZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIEF0IHRoaXMgcG9pbnQsIHlvdSBoYXZlIG5vdGhpbmcgYnV0IGEgcHJvamVjdCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgUnVuIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+IGNvbW1hbmQgYW5kIHNlZSB3aGF0CisgICAgICAgICAgICAgICAgaXQgZG9lczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZQorICAgICBUaGUgQkJQQVRIIHZhcmlhYmxlIGlzIG5vdCBzZXQgYW5kIGJpdGJha2UgZGlkIG5vdAorICAgICBmaW5kIGEgY29uZi9iYmxheWVycy5jb25mIGZpbGUgaW4gdGhlIGV4cGVjdGVkIGxvY2F0aW9uLgorICAgICBNYXliZSB5b3UgYWNjaWRlbnRhbGx5IGludm9rZWQgYml0YmFrZSBmcm9tIHRoZSB3cm9uZyBkaXJlY3Rvcnk/CisgICAgIERFQlVHOiBSZW1vdmVkIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGZyb20gdGhlIGVudmlyb25tZW50OgorICAgICBHTk9NRV9ERVNLVE9QX1NFU1NJT05fSUQsIFhER19DVVJSRU5UX0RFU0tUT1AsCisgICAgIEdOT01FX0tFWVJJTkdfQ09OVFJPTCwgRElTUExBWSwgU1NIX0FHRU5UX1BJRCwgTEFORywgbm9fcHJveHksCisgICAgIFhER19TRVNTSU9OX1BBVEgsIFhBVVRIT1JJVFksIFNFU1NJT05fTUFOQUdFUiwgU0hMVkwsCisgICAgIE1BTkRBVE9SWV9QQVRILCBDT01QSVpfQ09ORklHX1BST0ZJTEUsIFdJTkRPV0lELCBFRElUT1IsCisgICAgIEdQR19BR0VOVF9JTkZPLCBTU0hfQVVUSF9TT0NLLCBHRE1TRVNTSU9OLCBHTk9NRV9LRVlSSU5HX1BJRCwKKyAgICAgWERHX1NFQVRfUEFUSCwgWERHX0NPTkZJR19ESVJTLCBMRVNTT1BFTiwgREJVU19TRVNTSU9OX0JVU19BRERSRVNTLAorICAgICBfLCBYREdfU0VTU0lPTl9DT09LSUUsIERFU0tUT1BfU0VTU0lPTiwgTEVTU0NMT1NFLCBERUZBVUxUU19QQVRILAorICAgICBVQlVOVFVfTUVOVVBST1hZLCBPTERQV0QsIFhER19EQVRBX0RJUlMsIENPTE9SVEVSTSwgTFNfQ09MT1JTCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSBtYWpvcml0eSBvZiB0aGlzIG91dHB1dCBpcyBzcGVjaWZpYyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcmVsZXZhbnQgdG8gQml0QmFrZS4KKyAgICAgICAgICAgICAgICBIb3dldmVyLCB0aGUgdmVyeSBmaXJzdCBtZXNzYWdlIHJlZ2FyZGluZyB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gdmFyaWFibGUgYW5kIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jb25mL2JibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPiBmaWxlCisgICAgICAgICAgICAgICAgaXMgcmVsZXZhbnQuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4geW91IHJ1biBCaXRCYWtlLCBpdCBiZWdpbnMgbG9va2luZyBmb3IgbWV0YWRhdGEgZmlsZXMuCisgICAgICAgICAgICAgICAgVGhlCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCUEFUSCc+PGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHZhcmlhYmxlIGlzIHdoYXQgdGVsbHMgQml0QmFrZSB3aGVyZSB0byBsb29rIGZvciB0aG9zZSBmaWxlcy4KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gaXMgbm90IHNldCBhbmQgeW91IG5lZWQgdG8gc2V0IGl0LgorICAgICAgICAgICAgICAgIFdpdGhvdXQgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+LCBCaXRiYWtlIGNhbm5vdAorICAgICAgICAgICAgICAgIGZpbmQgYW55IGNvbmZpZ3VyYXRpb24gZmlsZXMgKDxmaWxlbmFtZT4uY29uZjwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgIG9yIHJlY2lwZSBmaWxlcyAoPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+KSBhdCBhbGwuCisgICAgICAgICAgICAgICAgQml0QmFrZSBhbHNvIGNhbm5vdCBmaW5kIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZS5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBmaWxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5TZXR0aW5nIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIEZvciB0aGlzIGV4YW1wbGUsIHlvdSBjYW4gc2V0IDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGluIHRoZSBzYW1lIG1hbm5lciB0aGF0IHlvdSBzZXQgPGZpbGVuYW1lPlBBVEg8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGVhcmxpZXIgaW4gdGhlIGFwcGVuZGl4LgorICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgcmVhbGl6ZSwgdGhvdWdoLCB0aGF0IGl0IGlzIG11Y2ggbW9yZSBmbGV4aWJsZSB0byBzZXQgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+IHZhcmlhYmxlIHVwIGluIGEgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIGZpbGUgZm9yIGVhY2ggcHJvamVjdC48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+RnJvbSB5b3VyIHNoZWxsLCBlbnRlciB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHRvIHNldCBhbmQKKyAgICAgICAgICAgICAgICBleHBvcnQgdGhlIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPiB2YXJpYWJsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgQkJQQVRIPSI8cmVwbGFjZWFibGU+cHJvamVjdGRpcmVjdG9yeTwvcmVwbGFjZWFibGU+IgorICAgICAkIGV4cG9ydCBCQlBBVEgKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVXNlIHlvdXIgYWN0dWFsIHByb2plY3QgZGlyZWN0b3J5IGluIHRoZSBjb21tYW5kLgorICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyB0aGF0IGRpcmVjdG9yeSB0byBmaW5kIHRoZSBtZXRhZGF0YSBpdCBuZWVkcyBmb3IKKyAgICAgICAgICAgICAgICB5b3VyIHByb2plY3QuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFdoZW4gc3BlY2lmeWluZyB5b3VyIHByb2plY3QgZGlyZWN0b3J5LCBkbyBub3QgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICB0aWxkZSAoIn4iKSBjaGFyYWN0ZXIgYXMgQml0QmFrZSBkb2VzIG5vdCBleHBhbmQgdGhhdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgYXMgdGhlIHNoZWxsIHdvdWxkLgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UnVuIEJpdGJha2U6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBOb3cgdGhhdCB5b3UgaGF2ZSA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gZGVmaW5lZCwgcnVuCisgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4gY29tbWFuZCBhZ2FpbjoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZQorICAgICBFUlJPUjogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgIEZpbGUgIi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2xpYi9iYi9jb29rZXJkYXRhLnB5IiwgbGluZSAxNjMsIGluIHdyYXBwZWQKKyAgICAgICAgIHJldHVybiBmdW5jKGZuLCAqYXJncykKKyAgICAgICBGaWxlICIvaG9tZS9zY290dC1sZW5vdm8vYml0YmFrZS9saWIvYmIvY29va2VyZGF0YS5weSIsIGxpbmUgMTczLCBpbiBwYXJzZV9jb25maWdfZmlsZQorICAgICAgICAgcmV0dXJuIGJiLnBhcnNlLmhhbmRsZShmbiwgZGF0YSwgaW5jbHVkZSkKKyAgICAgICBGaWxlICIvaG9tZS9zY290dC1sZW5vdm8vYml0YmFrZS9saWIvYmIvcGFyc2UvX19pbml0X18ucHkiLCBsaW5lIDk5LCBpbiBoYW5kbGUKKyAgICAgICAgIHJldHVybiBoWydoYW5kbGUnXShmbiwgZGF0YSwgaW5jbHVkZSkKKyAgICAgICBGaWxlICIvaG9tZS9zY290dC1sZW5vdm8vYml0YmFrZS9saWIvYmIvcGFyc2UvcGFyc2VfcHkvQ29uZkhhbmRsZXIucHkiLCBsaW5lIDEyMCwgaW4gaGFuZGxlCisgICAgICAgICBhYnNfZm4gPSByZXNvbHZlX2ZpbGUoZm4sIGRhdGEpCisgICAgICAgRmlsZSAiL2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvbGliL2JiL3BhcnNlL19faW5pdF9fLnB5IiwgbGluZSAxMTcsIGluIHJlc29sdmVfZmlsZQorICAgICAgICAgcmFpc2UgSU9FcnJvcigiZmlsZSAlcyBub3QgZm91bmQgaW4gJXMiICUgKGZuLCBiYnBhdGgpKQorICAgICBJT0Vycm9yOiBmaWxlIGNvbmYvYml0YmFrZS5jb25mIG5vdCBmb3VuZCBpbiAvaG9tZS9zY290dC1sZW5vdm8vaGVsbG8KKworICAgICBFUlJPUjogVW5hYmxlIHRvIHBhcnNlIGNvbmYvYml0YmFrZS5jb25mOiBmaWxlIGNvbmYvYml0YmFrZS5jb25mIG5vdCBmb3VuZCBpbiAvaG9tZS9zY290dC1sZW5vdm8vaGVsbG8KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhpcyBzYW1wbGUgb3V0cHV0IHNob3dzIHRoYXQgQml0QmFrZSBjb3VsZCBub3QgZmluZCB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Y29uZi9iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPiBmaWxlIGluIHRoZSBwcm9qZWN0CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyB0aGUgZmlyc3QgdGhpbmcgQml0QmFrZSBtdXN0IGZpbmQgaW4gb3JkZXIKKyAgICAgICAgICAgICAgICB0byBidWlsZCBhIHRhcmdldC4KKyAgICAgICAgICAgICAgICBBbmQsIHNpbmNlIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgdGhpcyBleGFtcGxlIGlzCisgICAgICAgICAgICAgICAgZW1wdHksIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSA8ZmlsZW5hbWU+Y29uZi9iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGZpbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPkNyZWF0aW5nIDxmaWxlbmFtZT5jb25mL2JpdGJha2UuY29uZjwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5jb25mL2JpdGJha2UuY29uZjwvZmlsZW5hbWU+IGluY2x1ZGVzIGEgbnVtYmVyIG9mCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgQml0QmFrZSB1c2VzIGZvciBtZXRhZGF0YSBhbmQgcmVjaXBlCisgICAgICAgICAgICAgICAgZmlsZXMuCisgICAgICAgICAgICAgICAgRm9yIHRoaXMgZXhhbXBsZSwgeW91IG5lZWQgdG8gY3JlYXRlIHRoZSBmaWxlIGluIHlvdXIgcHJvamVjdCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBhbmQgZGVmaW5lIHNvbWUga2V5IEJpdEJha2UgdmFyaWFibGVzLgorICAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZS5jb25mPC9maWxlbmFtZT4sCisgICAgICAgICAgICAgICAgc2VlCisgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL2hhbWJlZGRlZC5vcmcvYmxvZy8yMDEyLzExLzI0L2Zyb20tYml0YmFrZS1oZWxsby13b3JsZC10by1hbi1pbWFnZS8jYW4tb3ZlcnZpZXctb2YtYml0YmFrZWNvbmYnPjwvdWxpbms+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPlVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHRvIGNyZWF0ZSB0aGUgPGZpbGVuYW1lPmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBpbiB0aGUgcHJvamVjdCBkaXJlY3Rvcnk6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIG1rZGlyIGNvbmYKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgRnJvbSB3aXRoaW4gdGhlIDxmaWxlbmFtZT5jb25mPC9maWxlbmFtZT4gZGlyZWN0b3J5LCB1c2UKKyAgICAgICAgICAgICAgICBzb21lIGVkaXRvciB0byBjcmVhdGUgdGhlIDxmaWxlbmFtZT5iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFRNUERJUiAgPSAiJHs8bGluayBsaW5rZW5kPSd2YXItVE9QRElSJz5UT1BESVI8L2xpbms+fS90bXAiCisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1DQUNIRSc+Q0FDSEU8L2xpbms+ICAgPSAiJHtUTVBESVJ9L2NhY2hlIgorICAgICA8bGluayBsaW5rZW5kPSd2YXItU1RBTVAnPlNUQU1QPC9saW5rPiAgID0gIiR7VE1QRElSfS9zdGFtcHMiCisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1UJz5UPC9saW5rPiAgICAgICA9ICIke1RNUERJUn0vd29yayIKKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUInPkI8L2xpbms+ICAgICAgID0gIiR7VE1QRElSfSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5UTVBESVI8L2ZpbGVuYW1lPiB2YXJpYWJsZSBlc3RhYmxpc2hlcyBhIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIHRoYXQgQml0QmFrZSB1c2VzIGZvciBidWlsZCBvdXRwdXQgYW5kIGludGVybWVkaWF0ZSBmaWxlcyAob3RoZXIKKyAgICAgICAgICAgICAgICB0aGFuIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSdzZXRzY2VuZSc+U2V0c2NlbmU8L2xpbms+IHByb2Nlc3MuCisgICAgICAgICAgICAgICAgSGVyZSwgdGhlIDxmaWxlbmFtZT5UTVBESVI8L2ZpbGVuYW1lPiBkaXJlY3RvcnkgaXMgc2V0IHRvCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmhlbGxvL3RtcDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDxub3RlPjx0aXRsZT5UaXA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsd2F5cyBzYWZlbHkgZGVsZXRlIHRoZSA8ZmlsZW5hbWU+dG1wPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGluIG9yZGVyIHRvIHJlYnVpbGQgYSBCaXRCYWtlIHRhcmdldC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGJ1aWxkIHByb2Nlc3MgY3JlYXRlcyB0aGUgZGlyZWN0b3J5IGZvciB5b3UKKyAgICAgICAgICAgICAgICAgICAgd2hlbiB5b3UgcnVuIEJpdEJha2UuCisgICAgICAgICAgICAgICAgPC9ub3RlPjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIGRlZmluZWQgaW4gdGhpcworICAgICAgICAgICAgICAgIGV4YW1wbGUsIGNsaWNrIG9uIHRoZSBsaW5rcyB0byB0YWtlIHlvdSB0byB0aGUgZGVmaW5pdGlvbnMgaW4KKyAgICAgICAgICAgICAgICB0aGUgZ2xvc3NhcnkuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlJ1biBCaXRiYWtlOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgQWZ0ZXIgbWFraW5nIHN1cmUgdGhhdCB0aGUgPGZpbGVuYW1lPmNvbmYvYml0YmFrZS5jb25mPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBmaWxlIGV4aXN0cywgeW91IGNhbiBydW4gdGhlIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBjb21tYW5kIGFnYWluOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyQgYml0YmFrZQorRVJST1I6IFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiL2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvbGliL2JiL2Nvb2tlcmRhdGEucHkiLCBsaW5lIDE2MywgaW4gd3JhcHBlZAorICAgIHJldHVybiBmdW5jKGZuLCAqYXJncykKKyAgRmlsZSAiL2hvbWUvc2NvdHQtbGVub3ZvL2JpdGJha2UvbGliL2JiL2Nvb2tlcmRhdGEucHkiLCBsaW5lIDE3NywgaW4gX2luaGVyaXQKKyAgICBiYi5wYXJzZS5CQkhhbmRsZXIuaW5oZXJpdChiYmNsYXNzLCAiY29uZmlndXJhdGlvbiBJTkhFUklUcyIsIDAsIGRhdGEpCisgIEZpbGUgIi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9CQkhhbmRsZXIucHkiLCBsaW5lIDkyLCBpbiBpbmhlcml0CisgICAgaW5jbHVkZShmbiwgZmlsZSwgbGluZW5vLCBkLCAiaW5oZXJpdCIpCisgIEZpbGUgIi9ob21lL3Njb3R0LWxlbm92by9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9Db25mSGFuZGxlci5weSIsIGxpbmUgMTAwLCBpbiBpbmNsdWRlCisgICAgcmFpc2UgUGFyc2VFcnJvcigiQ291bGQgbm90ICUoZXJyb3Jfb3V0KXMgZmlsZSAlKGZuKXMiICUgdmFycygpLCBvbGRmbiwgbGluZW5vKQorUGFyc2VFcnJvcjogUGFyc2VFcnJvciBpbiBjb25maWd1cmF0aW9uIElOSEVSSVRzOiBDb3VsZCBub3QgaW5oZXJpdCBmaWxlIGNsYXNzZXMvYmFzZS5iYmNsYXNzCisKK0VSUk9SOiBVbmFibGUgdG8gcGFyc2UgYmFzZTogUGFyc2VFcnJvciBpbiBjb25maWd1cmF0aW9uIElOSEVSSVRzOiBDb3VsZCBub3QgaW5oZXJpdCBmaWxlIGNsYXNzZXMvYmFzZS5iYmNsYXNzCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIHRoZSBzYW1wbGUgb3V0cHV0LCBCaXRCYWtlIGNvdWxkIG5vdCBmaW5kIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jbGFzc2VzL2Jhc2UuYmJjbGFzczwvZmlsZW5hbWU+IGZpbGUuCisgICAgICAgICAgICAgICAgWW91IG5lZWQgdG8gY3JlYXRlIHRoYXQgZmlsZSBuZXh0LgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5DcmVhdGluZyA8ZmlsZW5hbWU+Y2xhc3Nlcy9iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyBjbGFzcyBmaWxlcyB0byBwcm92aWRlIGNvbW1vbiBjb2RlIGFuZCBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgICAgICAgIFRoZSBtaW5pbWFsbHkgcmVxdWlyZWQgY2xhc3MgZm9yIEJpdEJha2UgaXMgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNsYXNzZXMvYmFzZS5iYmNsYXNzPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmJhc2U8L2ZpbGVuYW1lPiBjbGFzcyBpcyBpbXBsaWNpdGx5IGluaGVyaXRlZCBieQorICAgICAgICAgICAgICAgIGV2ZXJ5IHJlY2lwZS4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIGxvb2tzIGZvciB0aGUgY2xhc3MgaW4gdGhlIDxmaWxlbmFtZT5jbGFzc2VzPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgKGkuZSA8ZmlsZW5hbWU+aGVsbG8vY2xhc3NlczwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgaW4gdGhpcyBleGFtcGxlKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+Q3JlYXRlIHRoZSA8ZmlsZW5hbWU+Y2xhc3NlczwvZmlsZW5hbWU+IGRpcmVjdG9yeSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBjZCAkSE9NRS9oZWxsbworICAgICAkIG1rZGlyIGNsYXNzZXMKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgTW92ZSB0byB0aGUgPGZpbGVuYW1lPmNsYXNzZXM8L2ZpbGVuYW1lPiBkaXJlY3RvcnkgYW5kIHRoZW4KKyAgICAgICAgICAgICAgICBjcmVhdGUgdGhlIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPiBmaWxlIGJ5IGluc2VydGluZworICAgICAgICAgICAgICAgIHRoaXMgc2luZ2xlIGxpbmU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBhZGR0YXNrIGJ1aWxkCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSBtaW5pbWFsIHRhc2sgdGhhdCBCaXRCYWtlIHJ1bnMgaXMgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvX2J1aWxkPC9maWxlbmFtZT4gdGFzay4KKyAgICAgICAgICAgICAgICBUaGlzIGlzIGFsbCB0aGUgZXhhbXBsZSBuZWVkcyBpbiBvcmRlciB0byBidWlsZCB0aGUgcHJvamVjdC4KKyAgICAgICAgICAgICAgICBPZiBjb3Vyc2UsIHRoZSA8ZmlsZW5hbWU+YmFzZS5iYmNsYXNzPC9maWxlbmFtZT4gY2FuIGhhdmUgbXVjaAorICAgICAgICAgICAgICAgIG1vcmUgZGVwZW5kaW5nIG9uIHdoaWNoIGJ1aWxkIGVudmlyb25tZW50cyBCaXRCYWtlIGlzCisgICAgICAgICAgICAgICAgc3VwcG9ydGluZy4KKyAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgPGZpbGVuYW1lPmJhc2UuYmJjbGFzczwvZmlsZW5hbWU+IGZpbGUsCisgICAgICAgICAgICAgICAgeW91IGNhbiBsb29rIGF0CisgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL2hhbWJlZGRlZC5vcmcvYmxvZy8yMDEyLzExLzI0L2Zyb20tYml0YmFrZS1oZWxsby13b3JsZC10by1hbi1pbWFnZS8jdGFza3MnPjwvdWxpbms+LgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5SdW4gQml0YmFrZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIEFmdGVyIG1ha2luZyBzdXJlIHRoYXQgdGhlIDxmaWxlbmFtZT5jbGFzc2VzL2Jhc2UuYmJjbGFzczwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZmlsZSBleGlzdHMsIHlvdSBjYW4gcnVuIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgY29tbWFuZCBhZ2FpbjoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZQorICAgICBOb3RoaW5nIHRvIGRvLiAgVXNlICdiaXRiYWtlIHdvcmxkJyB0byBidWlsZCBldmVyeXRoaW5nLCBvciBydW4gJ2JpdGJha2UgLS1oZWxwJyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEJpdEJha2UgaXMgZmluYWxseSByZXBvcnRpbmcgbm8gZXJyb3JzLgorICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHlvdSBjYW4gc2VlIHRoYXQgaXQgcmVhbGx5IGRvZXMgbm90IGhhdmUgYW55dGhpbmcKKyAgICAgICAgICAgICAgICB0byBkby4KKyAgICAgICAgICAgICAgICBZb3UgbmVlZCB0byBjcmVhdGUgYSByZWNpcGUgdGhhdCBnaXZlcyBCaXRCYWtlIHNvbWV0aGluZyB0byBkby4KKyAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Q3JlYXRpbmcgYSBMYXllcjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIFdoaWxlIGl0IGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGZvciBzdWNoIGEgc21hbGwgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICBpdCBpcyBnb29kIHByYWN0aWNlIHRvIGNyZWF0ZSBhIGxheWVyIGluIHdoaWNoIHRvIGtlZXAgeW91cgorICAgICAgICAgICAgICAgIGNvZGUgc2VwYXJhdGUgZnJvbSB0aGUgZ2VuZXJhbCBtZXRhZGF0YSB1c2VkIGJ5IEJpdEJha2UuCisgICAgICAgICAgICAgICAgVGh1cywgdGhpcyBleGFtcGxlIGNyZWF0ZXMgYW5kIHVzZXMgYSBsYXllciBjYWxsZWQgIm15bGF5ZXIiLgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGZpbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBhZGRpbmcgYSBsYXllciBhdAorICAgICAgICAgICAgICAgICAgICA8dWxpbmsgdXJsPSdodHRwOi8vaGFtYmVkZGVkLm9yZy9ibG9nLzIwMTIvMTEvMjQvZnJvbS1iaXRiYWtlLWhlbGxvLXdvcmxkLXRvLWFuLWltYWdlLyNhZGRpbmctYW4tZXhhbXBsZS1sYXllcic+PC91bGluaz4uCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5NaW5pbWFsbHksIHlvdSBuZWVkIGEgcmVjaXBlIGZpbGUgYW5kIGEgbGF5ZXIgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIGZpbGUgaW4geW91ciBsYXllci4KKyAgICAgICAgICAgICAgICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIG5lZWRzIHRvIGJlIGluIHRoZSA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGluc2lkZSB0aGUgbGF5ZXIuCisgICAgICAgICAgICAgICAgVXNlIHRoZXNlIGNvbW1hbmRzIHRvIHNldCB1cCB0aGUgbGF5ZXIgYW5kIHRoZSA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5OgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBjZCAkSE9NRQorICAgICAkIG1rZGlyIG15bGF5ZXIKKyAgICAgJCBjZCBteWxheWVyCisgICAgICQgbWtkaXIgY29uZgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBNb3ZlIHRvIHRoZSA8ZmlsZW5hbWU+Y29uZjwvZmlsZW5hbWU+IGRpcmVjdG9yeSBhbmQgY3JlYXRlIGEKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+bGF5ZXIuY29uZjwvZmlsZW5hbWU+IGZpbGUgdGhhdCBoYXMgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCUEFUSCAuPSAiOiR7PGxpbmsgbGlua2VuZD0ndmFyLUxBWUVSRElSJz5MQVlFUkRJUjwvbGluaz59IgorCisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVTJz5CQkZJTEVTPC9saW5rPiArPSAiJHtMQVlFUkRJUn0vKi5iYiIKKworICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJGSUxFX0NPTExFQ1RJT05TJz5CQkZJTEVfQ09MTEVDVElPTlM8L2xpbms+ICs9ICJteWxheWVyIgorICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJGSUxFX1BBVFRFUk4nPkJCRklMRV9QQVRURVJOX215bGF5ZXI8L2xpbms+IDo9ICJeJHtMQVlFUkRJUn0vIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBGb3IgaW5mb3JtYXRpb24gb24gdGhlc2UgdmFyaWFibGVzLCBjbGljayB0aGUgbGlua3MKKyAgICAgICAgICAgICAgICB0byBnbyB0byB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIGdsb3NzYXJ5LjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5Zb3UgbmVlZCB0byBjcmVhdGUgdGhlIHJlY2lwZSBmaWxlIG5leHQuCisgICAgICAgICAgICAgICAgSW5zaWRlIHlvdXIgbGF5ZXIgYXQgdGhlIHRvcC1sZXZlbCwgdXNlIGFuIGVkaXRvciBhbmQgY3JlYXRlCisgICAgICAgICAgICAgICAgYSByZWNpcGUgZmlsZSBuYW1lZCA8ZmlsZW5hbWU+cHJpbnRoZWxsby5iYjwvZmlsZW5hbWU+IHRoYXQKKyAgICAgICAgICAgICAgICBoYXMgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERVNDUklQVElPTic+REVTQ1JJUFRJT048L2xpbms+ID0gIlByaW50cyBIZWxsbyBXb3JsZCIKKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBOJz5QTjwvbGluaz4gPSAncHJpbnRoZWxsbycKKyAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBWJz5QVjwvbGluaz4gPSAnMScKKworICAgICBweXRob24gZG9fYnVpbGQoKSB7CisgICAgICAgIGJiLnBsYWluKCIqKioqKioqKioqKioqKioqKioqKiIpOworICAgICAgICBiYi5wbGFpbigiKiAgICAgICAgICAgICAgICAgICoiKTsKKyAgICAgICAgYmIucGxhaW4oIiogIEhlbGxvLCBXb3JsZCEgICAqIik7CisgICAgICAgIGJiLnBsYWluKCIqICAgICAgICAgICAgICAgICAgKiIpOworICAgICAgICBiYi5wbGFpbigiKioqKioqKioqKioqKioqKioqKioiKTsKKyAgICAgfQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgcmVjaXBlIGZpbGUgc2ltcGx5IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgcmVjaXBlLCB0aGUgbmFtZSwgdmVyc2lvbiwgYW5kIHRoZSA8ZmlsZW5hbWU+ZG9fYnVpbGQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIHRhc2ssIHdoaWNoIHByaW50cyBvdXQgIkhlbGxvIFdvcmxkIiB0byB0aGUgY29uc29sZS4KKyAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSB2YXJpYWJsZXMsIGZvbGxvdyB0aGUgbGlua3MKKyAgICAgICAgICAgICAgICB0byB0aGUgZ2xvc3NhcnkuCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPlJ1biBCaXRiYWtlIFdpdGggYSBUYXJnZXQ6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBOb3cgdGhhdCBhIEJpdEJha2UgdGFyZ2V0IGV4aXN0cywgcnVuIHRoZSBjb21tYW5kIGFuZCBwcm92aWRlCisgICAgICAgICAgICAgICAgdGhhdCB0YXJnZXQ6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGNkICRIT01FL2hlbGxvCisgICAgICQgYml0YmFrZSBwcmludGhlbGxvCisgICAgIEVSUk9SOiBubyByZWNpcGUgZmlsZXMgdG8gYnVpbGQsIGNoZWNrIHlvdXIgQkJQQVRIIGFuZCBCQkZJTEVTPworCisgICAgIFN1bW1hcnk6IFRoZXJlIHdhcyAxIEVSUk9SIG1lc3NhZ2Ugc2hvd24sIHJldHVybmluZyBhIG5vbi16ZXJvIGV4aXQgY29kZS4KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgV2UgaGF2ZSBjcmVhdGVkIHRoZSBsYXllciB3aXRoIHRoZSByZWNpcGUgYW5kIHRoZSBsYXllcgorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBidXQgaXQgc3RpbGwgc2VlbXMgdGhhdCBCaXRCYWtlIGNhbm5vdAorICAgICAgICAgICAgICAgIGZpbmQgdGhlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIG5lZWRzIGEgPGZpbGVuYW1lPmNvbmYvYmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IHRoYXQKKyAgICAgICAgICAgICAgICBsaXN0cyB0aGUgbGF5ZXJzIGZvciB0aGUgcHJvamVjdC4KKyAgICAgICAgICAgICAgICBXaXRob3V0IHRoaXMgZmlsZSwgQml0QmFrZSBjYW5ub3QgZmluZCB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5DcmVhdGluZyA8ZmlsZW5hbWU+Y29uZi9iYmxheWVycy5jb25mPC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHVzZXMgdGhlIDxmaWxlbmFtZT5jb25mL2JibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPiBmaWxlCisgICAgICAgICAgICAgICAgdG8gbG9jYXRlIGxheWVycyBuZWVkZWQgZm9yIHRoZSBwcm9qZWN0LgorICAgICAgICAgICAgICAgIFRoaXMgZmlsZSBtdXN0IHJlc2lkZSBpbiB0aGUgPGZpbGVuYW1lPmNvbmY8L2ZpbGVuYW1lPiBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBvZiB0aGUgcHJvamVjdCAoaS5lLiA8ZmlsZW5hbWU+aGVsbG8vY29uZjwvZmlsZW5hbWU+IGZvciB0aGlzCisgICAgICAgICAgICAgICAgZXhhbXBsZSkuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPlNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSA8ZmlsZW5hbWU+aGVsbG8vY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGFuZCB0aGVuIGNyZWF0ZSB0aGUgPGZpbGVuYW1lPmJibGF5ZXJzLmNvbmY8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGZpbGUgc28gdGhhdCBpdCBjb250YWlucyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJMQVlFUlMgPz0gIiBcCisgICAgICAgL2hvbWUvJmx0O3lvdSZndDsvbXlsYXllciBcCisgICAgICAgIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBZb3UgbmVlZCB0byBwcm92aWRlIHlvdXIgb3duIGluZm9ybWF0aW9uIGZvcgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT55b3U8L2ZpbGVuYW1lPiBpbiB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UnVuIEJpdGJha2UgV2l0aCBhIFRhcmdldDo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIE5vdyB0aGF0IHlvdSBoYXZlIHN1cHBsaWVkIHRoZSA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZmlsZSwgcnVuIHRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+IGNvbW1hbmQgYW5kIHByb3ZpZGUKKyAgICAgICAgICAgICAgICB0aGUgdGFyZ2V0OgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIHByaW50aGVsbG8KKyAgICAgUGFyc2luZyByZWNpcGVzOiAxMDAlIHwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjfAorICAgICBUaW1lOiAwMDowMDowMAorICAgICBQYXJzaW5nIG9mIDEgLmJiIGZpbGVzIGNvbXBsZXRlICgwIGNhY2hlZCwgMSBwYXJzZWQpLiAxIHRhcmdldHMsIDAgc2tpcHBlZCwgMCBtYXNrZWQsIDAgZXJyb3JzLgorICAgICBOT1RFOiBSZXNvbHZpbmcgYW55IG1pc3NpbmcgdGFzayBxdWV1ZSBkZXBlbmRlbmNpZXMKKyAgICAgTk9URTogUHJlcGFyaW5nIFJ1blF1ZXVlCisgICAgIE5PVEU6IEV4ZWN1dGluZyBSdW5RdWV1ZSBUYXNrcworICAgICAqKioqKioqKioqKioqKioqKioqKgorICAgICAqICAgICAgICAgICAgICAgICAgKgorICAgICAqICBIZWxsbywgV29ybGQhICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKgorICAgICBOT1RFOiBUYXNrcyBTdW1tYXJ5OiBBdHRlbXB0ZWQgMSB0YXNrcyBvZiB3aGljaCAwIGRpZG4ndCBuZWVkIHRvIGJlIHJlcnVuIGFuZCBhbGwgc3VjY2VlZGVkLgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIGZpbmRzIHRoZSA8ZmlsZW5hbWU+cHJpbnRoZWxsbzwvZmlsZW5hbWU+IHJlY2lwZSBhbmQKKyAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgcnVucyB0aGUgdGFzay4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgdGhlIGZpcnN0IGV4ZWN1dGlvbiwgcmUtcnVubmluZworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Yml0YmFrZSBwcmludGhlbGxvPC9maWxlbmFtZT4gYWdhaW4gd2lsbCBub3QKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGluIGEgQml0QmFrZSBydW4gdGhhdCBwcmludHMgdGhlIHNhbWUgY29uc29sZQorICAgICAgICAgICAgICAgICAgICBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgZmlyc3QgdGltZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPnByaW50aGVsbG8uYmI8L2ZpbGVuYW1lPiByZWNpcGUncworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYnVpbGQ8L2ZpbGVuYW1lPiB0YXNrIGV4ZWN1dGVzCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSwgQml0QmFrZSB3cml0ZXMgYSBzdGFtcCBmaWxlIGZvciB0aGUgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgVGh1cywgdGhlIG5leHQgdGltZSB5b3UgYXR0ZW1wdCB0byBydW4gdGhlIHRhc2sKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhhdCBzYW1lIDxmaWxlbmFtZT5iaXRiYWtlPC9maWxlbmFtZT4gY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBub3RpY2VzIHRoZSBzdGFtcCBhbmQgdGhlcmVmb3JlIGRldGVybWluZXMKKyAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgdGFzayBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlLXJ1bi4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRlbGV0ZSB0aGUgPGZpbGVuYW1lPnRtcDwvZmlsZW5hbWU+IGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICBvciBydW4gPGZpbGVuYW1lPmJpdGJha2UgLWMgY2xlYW4gcHJpbnRoZWxsbzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIHJlLXJ1biB0aGUgYnVpbGQsIHRoZSAiSGVsbG8sIFdvcmxkISIgbWVzc2FnZSB3aWxsCisgICAgICAgICAgICAgICAgICAgIGJlIHByaW50ZWQgYWdhaW4uCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgIDwvc2VjdGlvbj4KKzwvYXBwZW5kaXg+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtaW50cm8ueG1sIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWludHJvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTg4NjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLWludHJvLnhtbApAQCAtMCwwICsxLDY4NSBAQAorPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiPgorCis8Y2hhcHRlciBpZD0iYml0YmFrZS11c2VyLW1hbnVhbC1pbnRybyI+CisgICAgPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgICBXZWxjb21lIHRvIHRoZSBCaXRCYWtlIFVzZXIgTWFudWFsLgorICAgICAgICBUaGlzIG1hbnVhbCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgQml0QmFrZSB0b29sLgorICAgICAgICBUaGUgaW5mb3JtYXRpb24gYXR0ZW1wdHMgdG8gYmUgYXMgaW5kZXBlbmRlbnQgYXMgcG9zc2libGUgcmVnYXJkaW5nCisgICAgICAgIHN5c3RlbXMgdGhhdCB1c2UgQml0QmFrZSwgc3VjaCBhcyBPcGVuRW1iZWRkZWQgYW5kIHRoZQorICAgICAgICBZb2N0byBQcm9qZWN0LgorICAgICAgICBJbiBzb21lIGNhc2VzLCBzY2VuYXJpb3Mgb3IgZXhhbXBsZXMgd2l0aGluIHRoZSBjb250ZXh0IG9mCisgICAgICAgIGEgYnVpbGQgc3lzdGVtIGFyZSB1c2VkIGluIHRoZSBtYW51YWwgdG8gaGVscCB3aXRoIHVuZGVyc3RhbmRpbmcuCisgICAgICAgIEZvciB0aGVzZSBjYXNlcywgdGhlIG1hbnVhbCBjbGVhcmx5IHN0YXRlcyB0aGUgY29udGV4dC4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdGlvbiBpZD0iaW50cm8iPgorICAgICAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZ1bmRhbWVudGFsbHksIEJpdEJha2UgaXMgYSBnZW5lcmljIHRhc2sgZXhlY3V0aW9uCisgICAgICAgICAgICBlbmdpbmUgdGhhdCBhbGxvd3Mgc2hlbGwgYW5kIFB5dGhvbiB0YXNrcyB0byBiZSBydW4KKyAgICAgICAgICAgIGVmZmljaWVudGx5IGFuZCBpbiBwYXJhbGxlbCB3aGlsZSB3b3JraW5nIHdpdGhpbgorICAgICAgICAgICAgY29tcGxleCBpbnRlci10YXNrIGRlcGVuZGVuY3kgY29uc3RyYWludHMuCisgICAgICAgICAgICBPbmUgb2YgQml0QmFrZSdzIG1haW4gdXNlcnMsIE9wZW5FbWJlZGRlZCwgdGFrZXMgdGhpcyBjb3JlCisgICAgICAgICAgICBhbmQgYnVpbGRzIGVtYmVkZGVkIExpbnV4IHNvZnR3YXJlIHN0YWNrcyB1c2luZworICAgICAgICAgICAgYSB0YXNrLW9yaWVudGVkIGFwcHJvYWNoLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBDb25jZXB0dWFsbHksIEJpdEJha2UgaXMgc2ltaWxhciB0byBHTlUgTWFrZSBpbgorICAgICAgICAgICAgc29tZSByZWdhcmRzIGJ1dCBoYXMgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXM6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBleGVjdXRlcyB0YXNrcyBhY2NvcmRpbmcgdG8gcHJvdmlkZWQKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdGhhdCBidWlsZHMgdXAgdGhlIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSBpcyBzdG9yZWQgaW4gcmVjaXBlICg8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4pCisgICAgICAgICAgICAgICAgICAgIGFuZCByZWxhdGVkIHJlY2lwZSAiYXBwZW5kIiAoPGZpbGVuYW1lPi5iYmFwcGVuZDwvZmlsZW5hbWU+KQorICAgICAgICAgICAgICAgICAgICBmaWxlcywgY29uZmlndXJhdGlvbiAoPGZpbGVuYW1lPi5jb25mPC9maWxlbmFtZT4pIGFuZAorICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIGluY2x1ZGUgKDxmaWxlbmFtZT4uaW5jPC9maWxlbmFtZT4pIGZpbGVzLCBhbmQKKyAgICAgICAgICAgICAgICAgICAgaW4gY2xhc3MgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1ldGFkYXRhIHByb3ZpZGVzCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2Ugd2l0aCBpbnN0cnVjdGlvbnMgb24gd2hhdCB0YXNrcyB0byBydW4gYW5kCisgICAgICAgICAgICAgICAgICAgIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aG9zZSB0YXNrcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGluY2x1ZGVzIGEgZmV0Y2hlciBsaWJyYXJ5IGZvciBvYnRhaW5pbmcgc291cmNlCisgICAgICAgICAgICAgICAgICAgIGNvZGUgZnJvbSB2YXJpb3VzIHBsYWNlcyBzdWNoIGFzIGxvY2FsIGZpbGVzLCBzb3VyY2UgY29udHJvbAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1zLCBvciB3ZWJzaXRlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgaW5zdHJ1Y3Rpb25zIGZvciBlYWNoIHVuaXQgdG8gYmUgYnVpbHQgKGUuZy4gYSBwaWVjZQorICAgICAgICAgICAgICAgICAgICBvZiBzb2Z0d2FyZSkgYXJlIGtub3duIGFzICJyZWNpcGUiIGZpbGVzIGFuZAorICAgICAgICAgICAgICAgICAgICBjb250YWluIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuaXQKKyAgICAgICAgICAgICAgICAgICAgKGRlcGVuZGVuY2llcywgc291cmNlIGZpbGUgbG9jYXRpb25zLCBjaGVja3N1bXMsIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgIGFuZCBzbyBvbikuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBpbmNsdWRlcyBhIGNsaWVudC9zZXJ2ZXIgYWJzdHJhY3Rpb24gYW5kIGNhbgorICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGZyb20gYSBjb21tYW5kIGxpbmUgb3IgdXNlZCBhcyBhIHNlcnZpY2Ugb3ZlcgorICAgICAgICAgICAgICAgICAgICBYTUwtUlBDIGFuZCBoYXMgc2V2ZXJhbCBkaWZmZXJlbnQgdXNlciBpbnRlcmZhY2VzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9Imhpc3RvcnktYW5kLWdvYWxzIj4KKyAgICAgICAgPHRpdGxlPkhpc3RvcnkgYW5kIEdvYWxzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJpdEJha2Ugd2FzIG9yaWdpbmFsbHkgYSBwYXJ0IG9mIHRoZSBPcGVuRW1iZWRkZWQgcHJvamVjdC4KKyAgICAgICAgICAgIEl0IHdhcyBpbnNwaXJlZCBieSB0aGUgUG9ydGFnZSBwYWNrYWdlIG1hbmFnZW1lbnQgc3lzdGVtCisgICAgICAgICAgICB1c2VkIGJ5IHRoZSBHZW50b28gTGludXggZGlzdHJpYnV0aW9uLgorICAgICAgICAgICAgT24gRGVjZW1iZXIgNywgMjAwNCwgT3BlbkVtYmVkZGVkIHByb2plY3QgdGVhbSBtZW1iZXIKKyAgICAgICAgICAgIENocmlzIExhcnNvbiBzcGxpdCB0aGUgcHJvamVjdCBpbnRvIHR3byBkaXN0aW5jdCBwaWVjZXM6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5CaXRCYWtlLCBhIGdlbmVyaWMgdGFzayBleGVjdXRvcjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5PcGVuRW1iZWRkZWQsIGEgbWV0YWRhdGEgc2V0IHV0aWxpemVkIGJ5CisgICAgICAgICAgICAgICAgICAgIEJpdEJha2U8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgVG9kYXksIEJpdEJha2UgaXMgdGhlIHByaW1hcnkgYmFzaXMgb2YgdGhlCisgICAgICAgICAgICA8dWxpbmsgdXJsPSJodHRwOi8vd3d3Lm9wZW5lbWJlZGRlZC5vcmcvIj5PcGVuRW1iZWRkZWQ8L3VsaW5rPgorICAgICAgICAgICAgcHJvamVjdCwgd2hpY2ggaXMgYmVpbmcgdXNlZCB0byBidWlsZCBhbmQgbWFpbnRhaW4gTGludXgKKyAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMgc3VjaCBhcyB0aGUKKyAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly93d3cuYW5nc3Ryb20tZGlzdHJpYnV0aW9uLm9yZy8nPkFuZ3N0cm9tIERpc3RyaWJ1dGlvbjwvdWxpbms+LAorICAgICAgICAgICAgYW5kIHdoaWNoIGlzIGFsc28gYmVpbmcgdXNlZCBhcyB0aGUgYnVpbGQgdG9vbCBmb3IgTGludXggcHJvamVjdHMKKyAgICAgICAgICAgIHN1Y2ggYXMgdGhlCisgICAgICAgICAgICA8dWxpbmsgdXJsPSdodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcnPllvY3RvIFByb2plY3Q8L3VsaW5rPi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgUHJpb3IgdG8gQml0QmFrZSwgbm8gb3RoZXIgYnVpbGQgdG9vbCBhZGVxdWF0ZWx5IG1ldCB0aGUgbmVlZHMgb2YKKyAgICAgICAgICAgIGFuIGFzcGlyaW5nIGVtYmVkZGVkIExpbnV4IGRpc3RyaWJ1dGlvbi4KKyAgICAgICAgICAgIEFsbCBvZiB0aGUgYnVpbGQgc3lzdGVtcyB1c2VkIGJ5IHRyYWRpdGlvbmFsIGRlc2t0b3AgTGludXgKKyAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMgbGFja2VkIGltcG9ydGFudCBmdW5jdGlvbmFsaXR5LCBhbmQgbm9uZSBvZiB0aGUKKyAgICAgICAgICAgIGFkIGhvYyBCdWlsZHJvb3QtYmFzZWQgc3lzdGVtcywgcHJldmFsZW50IGluIHRoZQorICAgICAgICAgICAgZW1iZWRkZWQgc3BhY2UsIHdlcmUgc2NhbGFibGUgb3IgbWFpbnRhaW5hYmxlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBTb21lIGltcG9ydGFudCBvcmlnaW5hbCBnb2FscyBmb3IgQml0QmFrZSB3ZXJlOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhhbmRsZSBjcm9zcy1jb21waWxhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBIYW5kbGUgaW50ZXItcGFja2FnZSBkZXBlbmRlbmNpZXMgKGJ1aWxkIHRpbWUgb24KKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IGFyY2hpdGVjdHVyZSwgYnVpbGQgdGltZSBvbiBuYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgYXJjaGl0ZWN0dXJlLCBhbmQgcnVudGltZSkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3VwcG9ydCBydW5uaW5nIGFueSBudW1iZXIgb2YgdGFza3Mgd2l0aGluIGEgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZSwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtIHNvdXJjZXMsIHVucGFja2luZyB0aGVtLCBwYXRjaGluZyB0aGVtLAorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmluZyB0aGVtLCBhbmQgc28gZm9ydGguCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQmUgTGludXggZGlzdHJpYnV0aW9uIGFnbm9zdGljIGZvciBib3RoIGJ1aWxkIGFuZAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZSBhcmNoaXRlY3R1cmUgYWdub3N0aWMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3VwcG9ydCBtdWx0aXBsZSBidWlsZCBhbmQgdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW1zCisgICAgICAgICAgICAgICAgICAgIChlLmcuIEN5Z3dpbiwgdGhlIEJTRHMsIGFuZCBzbyBmb3J0aCkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQmUgc2VsZiBjb250YWluZWQsIHJhdGhlciB0aGFuIHRpZ2h0bHkKKyAgICAgICAgICAgICAgICAgICAgaW50ZWdyYXRlZCBpbnRvIHRoZSBidWlsZCBtYWNoaW5lJ3Mgcm9vdAorICAgICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhhbmRsZSBjb25kaXRpb25hbCBtZXRhZGF0YSBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW5nIHN5c3RlbSwgZGlzdHJpYnV0aW9uLCBhbmQgbWFjaGluZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZSBlYXN5IHRvIHVzZSB0aGUgdG9vbHMgdG8gc3VwcGx5IGxvY2FsIG1ldGFkYXRhIGFuZCBwYWNrYWdlcworICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IHdoaWNoIHRvIG9wZXJhdGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQmUgZWFzeSB0byB1c2UgQml0QmFrZSB0byBjb2xsYWJvcmF0ZSBiZXR3ZWVuIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgIHByb2plY3RzIGZvciB0aGVpciBidWlsZHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZSBhbiBpbmhlcml0YW5jZSBtZWNoYW5pc20gdG8gc2hhcmUKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uIG1ldGFkYXRhIGJldHdlZW4gbWFueSBwYWNrYWdlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIE92ZXIgdGltZSBpdCBiZWNhbWUgYXBwYXJlbnQgdGhhdCBzb21lIGZ1cnRoZXIgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICB3ZXJlIG5lY2Vzc2FyeToKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBIYW5kbGUgdmFyaWFudHMgb2YgYSBiYXNlIHJlY2lwZSAoZS5nLiBuYXRpdmUsIHNkaywKKyAgICAgICAgICAgICAgICAgICAgYW5kIG11bHRpbGliKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGxpdCBtZXRhZGF0YSBpbnRvIGxheWVycyBhbmQgYWxsb3cgbGF5ZXJzCisgICAgICAgICAgICAgICAgICAgIHRvIGVuaGFuY2Ugb3Igb3ZlcnJpZGUgb3RoZXIgbGF5ZXJzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFsbG93IHJlcHJlc2VudGF0aW9uIG9mIGEgZ2l2ZW4gc2V0IG9mIGlucHV0IHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICB0byBhIHRhc2sgYXMgYSBjaGVja3N1bS4KKyAgICAgICAgICAgICAgICAgICAgQmFzZWQgb24gdGhhdCBjaGVja3N1bSwgYWxsb3cgYWNjZWxlcmF0aW9uIG9mIGJ1aWxkcworICAgICAgICAgICAgICAgICAgICB3aXRoIHByZWJ1aWx0IGNvbXBvbmVudHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICBCaXRCYWtlIHNhdGlzZmllcyBhbGwgdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50cyBhbmQgbWFueSBtb3JlCisgICAgICAgICAgICB3aXRoIGV4dGVuc2lvbnMgYmVpbmcgbWFkZSB0byB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSB0bworICAgICAgICAgICAgcmVmbGVjdCB0aGUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuCisgICAgICAgICAgICBGbGV4aWJpbGl0eSBhbmQgcG93ZXIgaGF2ZSBhbHdheXMgYmVlbiB0aGUgcHJpb3JpdGllcy4KKyAgICAgICAgICAgIEJpdEJha2UgaXMgaGlnaGx5IGV4dGVuc2libGUgYW5kIHN1cHBvcnRzIGVtYmVkZGVkIFB5dGhvbiBjb2RlIGFuZAorICAgICAgICAgICAgZXhlY3V0aW9uIG9mIGFueSBhcmJpdHJhcnkgdGFza3MuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0iQ29uY2VwdHMiPgorICAgICAgICA8dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSBpcyBhIHByb2dyYW0gd3JpdHRlbiBpbiB0aGUgUHl0aG9uIGxhbmd1YWdlLgorICAgICAgICAgICAgQXQgdGhlIGhpZ2hlc3QgbGV2ZWwsIEJpdEJha2UgaW50ZXJwcmV0cyBtZXRhZGF0YSwgZGVjaWRlcworICAgICAgICAgICAgd2hhdCB0YXNrcyBhcmUgcmVxdWlyZWQgdG8gcnVuLCBhbmQgZXhlY3V0ZXMgdGhvc2UgdGFza3MuCisgICAgICAgICAgICBTaW1pbGFyIHRvIEdOVSBNYWtlLCBCaXRCYWtlIGNvbnRyb2xzIGhvdyBzb2Z0d2FyZSBpcworICAgICAgICAgICAgYnVpbHQuCisgICAgICAgICAgICBHTlUgTWFrZSBhY2hpZXZlcyBpdHMgY29udHJvbCB0aHJvdWdoICJtYWtlZmlsZXMiLCB3aGlsZQorICAgICAgICAgICAgQml0QmFrZSB1c2VzICJyZWNpcGVzIi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSBleHRlbmRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBzaW1wbGUKKyAgICAgICAgICAgIHRvb2wgbGlrZSBHTlUgTWFrZSBieSBhbGxvd2luZyBmb3IgdGhlIGRlZmluaXRpb24gb2YgbXVjaCBtb3JlCisgICAgICAgICAgICBjb21wbGV4IHRhc2tzLCBzdWNoIGFzIGFzc2VtYmxpbmcgZW50aXJlIGVtYmVkZGVkIExpbnV4CisgICAgICAgICAgICBkaXN0cmlidXRpb25zLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcmVtYWluZGVyIG9mIHRoaXMgc2VjdGlvbiBpbnRyb2R1Y2VzIHNldmVyYWwgY29uY2VwdHMKKyAgICAgICAgICAgIHRoYXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgaW4gb3JkZXIgdG8gYmV0dGVyIGxldmVyYWdlCisgICAgICAgICAgICB0aGUgcG93ZXIgb2YgQml0QmFrZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdyZWNpcGVzJz4KKyAgICAgICAgICAgIDx0aXRsZT5SZWNpcGVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSBSZWNpcGVzLCB3aGljaCBhcmUgZGVub3RlZCBieSB0aGUgZmlsZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4sIGFyZSB0aGUgbW9zdCBiYXNpYyBtZXRhZGF0YSBmaWxlcy4KKyAgICAgICAgICAgICAgICBUaGVzZSByZWNpcGUgZmlsZXMgcHJvdmlkZSBCaXRCYWtlIHdpdGggdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+RGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlIChhdXRob3IsIGhvbWVwYWdlLCBsaWNlbnNlLCBhbmQgc28gb24pPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5UaGUgdmVyc2lvbiBvZiB0aGUgcmVjaXBlPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5FeGlzdGluZyBkZXBlbmRlbmNpZXMgKGJvdGggYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBydW50aW1lIGRlcGVuZGVuY2llcyk8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPldoZXJlIHRoZSBzb3VyY2UgY29kZSByZXNpZGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgaG93IHRvIGZldGNoIGl0PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5XaGV0aGVyIHRoZSBzb3VyY2UgY29kZSByZXF1aXJlcworICAgICAgICAgICAgICAgICAgICAgICAgYW55IHBhdGNoZXMsIHdoZXJlIHRvIGZpbmQgdGhlbSwgYW5kIGhvdyB0byBhcHBseQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbTwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+SG93IHRvIGNvbmZpZ3VyZSBhbmQgY29tcGlsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBjb2RlPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5XaGVyZSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUgdG8gaW5zdGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3IgcGFja2FnZXMgY3JlYXRlZDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXaXRoaW4gdGhlIGNvbnRleHQgb2YgQml0QmFrZSwgb3IgYW55IHByb2plY3QgdXRpbGl6aW5nIEJpdEJha2UKKyAgICAgICAgICAgICAgICBhcyBpdHMgYnVpbGQgc3lzdGVtLCBmaWxlcyB3aXRoIHRoZSA8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBleHRlbnNpb24gYXJlIHJlZmVycmVkIHRvIGFzIHJlY2lwZXMuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFRoZSB0ZXJtICJwYWNrYWdlIiBpcyBhbHNvIGNvbW1vbmx5IHVzZWQgdG8gZGVzY3JpYmUgcmVjaXBlcy4KKyAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgc2luY2UgdGhlIHNhbWUgd29yZCBpcyB1c2VkIHRvIGRlc2NyaWJlIHBhY2thZ2VkCisgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmcm9tIGEgcHJvamVjdCwgaXQgaXMgYmVzdCB0byBtYWludGFpbiBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGl2ZSB0ZXJtIC0gInJlY2lwZXMiLgorICAgICAgICAgICAgICAgICAgICBQdXQgYW5vdGhlciB3YXksIGEgc2luZ2xlICJyZWNpcGUiIGZpbGUgaXMgcXVpdGUgY2FwYWJsZQorICAgICAgICAgICAgICAgICAgICBvZiBnZW5lcmF0aW5nIGEgbnVtYmVyIG9mIHJlbGF0ZWQgYnV0IHNlcGFyYXRlbHkgaW5zdGFsbGFibGUKKyAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VzIi4KKyAgICAgICAgICAgICAgICAgICAgSW4gZmFjdCwgdGhhdCBhYmlsaXR5IGlzIGZhaXJseSBjb21tb24uCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2NvbmZpZ3VyYXRpb24tZmlsZXMnPgorICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyYXRpb24gRmlsZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGZpbGVzLCB3aGljaCBhcmUgZGVub3RlZCBieSB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+LmNvbmY8L2ZpbGVuYW1lPiBleHRlbnNpb24sIGRlZmluZQorICAgICAgICAgICAgICAgIHZhcmlvdXMgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBnb3Zlcm4gdGhlIHByb2plY3QncyBidWlsZAorICAgICAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICAgICAgICAgICAgVGhlc2UgZmlsZXMgZmFsbCBpbnRvIHNldmVyYWwgYXJlYXMgdGhhdCBkZWZpbmUKKyAgICAgICAgICAgICAgICBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICBvcHRpb25zLCBjb21waWxlciB0dW5pbmcgb3B0aW9ucywgZ2VuZXJhbCBjb21tb24KKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGFuZCB1c2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAgICAgICAgICAgICAgICBUaGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGUgaXMgdGhlIHNhbXBsZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iaXRiYWtlLmNvbmY8L2ZpbGVuYW1lPiBmaWxlLCB3aGljaCBpcworICAgICAgICAgICAgICAgIGxvY2F0ZWQgd2l0aGluIHRoZSBCaXRCYWtlIHNvdXJjZSB0cmVlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNvbmY8L2ZpbGVuYW1lPiBkaXJlY3RvcnkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nY2xhc3Nlcyc+CisgICAgICAgICAgICA8dGl0bGU+Q2xhc3NlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENsYXNzIGZpbGVzLCB3aGljaCBhcmUgZGVub3RlZCBieSB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPiBleHRlbnNpb24sIGNvbnRhaW4KKyAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiB0aGF0IGlzIHVzZWZ1bCB0byBzaGFyZSBiZXR3ZWVuIG1ldGFkYXRhIGZpbGVzLgorICAgICAgICAgICAgICAgIFRoZSBCaXRCYWtlIHNvdXJjZSB0cmVlIGN1cnJlbnRseSBjb21lcyB3aXRoIG9uZSBjbGFzcyBtZXRhZGF0YSBmaWxlCisgICAgICAgICAgICAgICAgY2FsbGVkIDxmaWxlbmFtZT5iYXNlLmJiY2xhc3M8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGZpbmQgdGhpcyBmaWxlIGluIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5jbGFzc2VzPC9maWxlbmFtZT4gZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+YmFzZS5iYmNsYXNzPC9maWxlbmFtZT4gY2xhc3MgZmlsZXMgaXMgc3BlY2lhbCBzaW5jZSBpdAorICAgICAgICAgICAgICAgIGlzIGFsd2F5cyBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5IGZvciBhbGwgcmVjaXBlcworICAgICAgICAgICAgICAgIGFuZCBjbGFzc2VzLgorICAgICAgICAgICAgICAgIFRoaXMgY2xhc3MgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHN0YW5kYXJkIGJhc2ljIHRhc2tzIHN1Y2gKKyAgICAgICAgICAgICAgICBhcyBmZXRjaGluZywgdW5wYWNraW5nLCBjb25maWd1cmluZyAoZW1wdHkgYnkgZGVmYXVsdCksCisgICAgICAgICAgICAgICAgY29tcGlsaW5nIChydW5zIGFueSBNYWtlZmlsZSBwcmVzZW50KSwgaW5zdGFsbGluZyAoZW1wdHkgYnkKKyAgICAgICAgICAgICAgICBkZWZhdWx0KSBhbmQgcGFja2FnaW5nIChlbXB0eSBieSBkZWZhdWx0KS4KKyAgICAgICAgICAgICAgICBUaGVzZSB0YXNrcyBhcmUgb2Z0ZW4gb3ZlcnJpZGRlbiBvciBleHRlbmRlZCBieSBvdGhlciBjbGFzc2VzCisgICAgICAgICAgICAgICAgYWRkZWQgZHVyaW5nIHRoZSBwcm9qZWN0IGRldmVsb3BtZW50IHByb2Nlc3MuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nbGF5ZXJzJz4KKyAgICAgICAgICAgIDx0aXRsZT5MYXllcnM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMYXllcnMgYWxsb3cgeW91IHRvIGlzb2xhdGUgZGlmZmVyZW50IHR5cGVzIG9mCisgICAgICAgICAgICAgICAgY3VzdG9taXphdGlvbnMgZnJvbSBlYWNoIG90aGVyLgorICAgICAgICAgICAgICAgIFdoaWxlIHlvdSBtaWdodCBmaW5kIGl0IHRlbXB0aW5nIHRvIGtlZXAgZXZlcnl0aGluZyBpbiBvbmUgbGF5ZXIKKyAgICAgICAgICAgICAgICB3aGVuIHdvcmtpbmcgb24gYSBzaW5nbGUgcHJvamVjdCwgdGhlIG1vcmUgbW9kdWxhciB5b3Ugb3JnYW5pemUKKyAgICAgICAgICAgICAgICB5b3VyIG1ldGFkYXRhLCB0aGUgZWFzaWVyIGl0IGlzIHRvIGNvcGUgd2l0aCBmdXR1cmUgY2hhbmdlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVG8gaWxsdXN0cmF0ZSBob3cgeW91IGNhbiB1c2UgbGF5ZXJzIHRvIGtlZXAgdGhpbmdzIG1vZHVsYXIsCisgICAgICAgICAgICAgICAgY29uc2lkZXIgY3VzdG9taXphdGlvbnMgeW91IG1pZ2h0IG1ha2UgdG8gc3VwcG9ydCBhIHNwZWNpZmljIHRhcmdldCBtYWNoaW5lLgorICAgICAgICAgICAgICAgIFRoZXNlIHR5cGVzIG9mIGN1c3RvbWl6YXRpb25zIHR5cGljYWxseSByZXNpZGUgaW4gYSBzcGVjaWFsIGxheWVyLAorICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIGEgZ2VuZXJhbCBsYXllciwgY2FsbGVkIGEgQm9hcmQgU3VwcG9ydCBQYWNrYWdlIChCU1ApCisgICAgICAgICAgICAgICAgTGF5ZXIuCisgICAgICAgICAgICAgICAgRnVydGhlcm1vcmUsIHRoZSBtYWNoaW5lIGN1c3RvbWl6YXRpb25zIHNob3VsZCBiZSBpc29sYXRlZCBmcm9tCisgICAgICAgICAgICAgICAgcmVjaXBlcyBhbmQgbWV0YWRhdGEgdGhhdCBzdXBwb3J0IGEgbmV3IEdVSSBlbnZpcm9ubWVudCwgZm9yCisgICAgICAgICAgICAgICAgZXhhbXBsZS4KKyAgICAgICAgICAgICAgICBUaGlzIHNpdHVhdGlvbiBnaXZlcyB5b3UgYSBjb3VwbGUgb2YgbGF5ZXJzOiBvbmUgZm9yIHRoZSBtYWNoaW5lCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbnMgYW5kIG9uZSBmb3IgdGhlIEdVSSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCwgaG93ZXZlciwgdGhhdCB0aGUgQlNQIGxheWVyIGNhbiBzdGlsbAorICAgICAgICAgICAgICAgIG1ha2UgbWFjaGluZS1zcGVjaWZpYyBhZGRpdGlvbnMgdG8gcmVjaXBlcyB3aXRoaW4KKyAgICAgICAgICAgICAgICB0aGUgR1VJIGVudmlyb25tZW50IGxheWVyIHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBHVUkgbGF5ZXIgaXRzZWxmCisgICAgICAgICAgICAgICAgd2l0aCB0aG9zZSBtYWNoaW5lLXNwZWNpZmljIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgWW91IGNhbiBhY2NvbXBsaXNoIHRoaXMgdGhyb3VnaCBhIHJlY2lwZSB0aGF0IGlzIGEgQml0QmFrZSBhcHBlbmQKKyAgICAgICAgICAgICAgICAoPGZpbGVuYW1lPi5iYmFwcGVuZDwvZmlsZW5hbWU+KSBmaWxlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2FwcGVuZC1iYmFwcGVuZC1maWxlcyc+CisgICAgICAgICAgICA8dGl0bGU+QXBwZW5kIEZpbGVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXBwZW5kIGZpbGVzLCB3aGljaCBhcmUgZmlsZXMgdGhhdCBoYXZlIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uYmJhcHBlbmQ8L2ZpbGVuYW1lPiBmaWxlIGV4dGVuc2lvbiwgZXh0ZW5kIG9yCisgICAgICAgICAgICAgICAgb3ZlcnJpZGUgaW5mb3JtYXRpb24gaW4gYW4gZXhpc3RpbmcgcmVjaXBlIGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJpdEJha2UgZXhwZWN0cyBldmVyeSBhcHBlbmQgZmlsZSB0byBoYXZlIGEgY29ycmVzcG9uZGluZyByZWNpcGUgZmlsZS4KKyAgICAgICAgICAgICAgICBGdXJ0aGVybW9yZSwgdGhlIGFwcGVuZCBmaWxlIGFuZCBjb3JyZXNwb25kaW5nIHJlY2lwZSBmaWxlCisgICAgICAgICAgICAgICAgbXVzdCB1c2UgdGhlIHNhbWUgcm9vdCBmaWxlbmFtZS4KKyAgICAgICAgICAgICAgICBUaGUgZmlsZW5hbWVzIGNhbiBkaWZmZXIgb25seSBpbiB0aGUgZmlsZSB0eXBlIHN1ZmZpeCB1c2VkCisgICAgICAgICAgICAgICAgKGUuZy4gPGZpbGVuYW1lPmZvcm1mYWN0b3JfMC4wLmJiPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmZvcm1mYWN0b3JfMC4wLmJiYXBwZW5kPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbiBpbiBhcHBlbmQgZmlsZXMgZXh0ZW5kcyBvcgorICAgICAgICAgICAgICAgIG92ZXJyaWRlcyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHVuZGVybHlpbmcsCisgICAgICAgICAgICAgICAgc2ltaWxhcmx5LW5hbWVkIHJlY2lwZSBmaWxlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiB5b3UgbmFtZSBhbiBhcHBlbmQgZmlsZSwgeW91IGNhbiB1c2UgdGhlCisgICAgICAgICAgICAgICAgd2lsZGNhcmQgY2hhcmFjdGVyICglKSB0byBhbGxvdyBmb3IgbWF0Y2hpbmcgcmVjaXBlIG5hbWVzLgorICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGFuIGFwcGVuZCBmaWxlIG5hbWVkCisgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGJ1c3lib3hfMS4yMS4lLmJiYXBwZW5kCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoYXQgYXBwZW5kIGZpbGUgd291bGQgbWF0Y2ggYW55IDxmaWxlbmFtZT5idXN5Ym94XzEuMjEueC5iYjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgIFNvLCB0aGUgYXBwZW5kIGZpbGUgd291bGQgbWF0Y2ggdGhlIGZvbGxvd2luZyByZWNpcGUgbmFtZXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBidXN5Ym94XzEuMjEuMS5iYgorICAgICBidXN5Ym94XzEuMjEuMi5iYgorICAgICBidXN5Ym94XzEuMjEuMy5iYgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJZiB0aGUgPGZpbGVuYW1lPmJ1c3lib3g8L2ZpbGVuYW1lPiByZWNpcGUgd2FzIHVwZGF0ZWQgdG8KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YnVzeWJveF8xLjMuMC5iYjwvZmlsZW5hbWU+LCB0aGUgYXBwZW5kIG5hbWUgd291bGQgbm90CisgICAgICAgICAgICAgICAgbWF0Y2guCisgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgeW91IG5hbWVkIHRoZSBhcHBlbmQgZmlsZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5idXN5Ym94XzEuJS5iYmFwcGVuZDwvZmlsZW5hbWU+LCB0aGVuIHlvdSB3b3VsZCBoYXZlIGEgbWF0Y2guCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIHRoZSBtb3N0IGdlbmVyYWwgY2FzZSwgeW91IGNvdWxkIG5hbWUgdGhlIGFwcGVuZCBmaWxlIHNvbWV0aGluZyBhcworICAgICAgICAgICAgICAgIHNpbXBsZSBhcyA8ZmlsZW5hbWU+YnVzeWJveF8lLmJiYXBwZW5kPC9maWxlbmFtZT4gdG8gYmUgZW50aXJlbHkKKyAgICAgICAgICAgICAgICB2ZXJzaW9uIGluZGVwZW5kZW50LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J29idGFpbmluZy1iaXRiYWtlJz4KKyAgICAgICAgPHRpdGxlPk9idGFpbmluZyBCaXRCYWtlPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFlvdSBjYW4gb2J0YWluIEJpdEJha2Ugc2V2ZXJhbCBkaWZmZXJlbnQgd2F5czoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5DbG9uaW5nIEJpdEJha2U6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgVXNpbmcgR2l0IHRvIGNsb25lIHRoZSBCaXRCYWtlIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBmb3Igb2J0YWluaW5nIEJpdEJha2UuCisgICAgICAgICAgICAgICAgICAgIENsb25pbmcgdGhlIHJlcG9zaXRvcnkgbWFrZXMgaXQgZWFzeSB0byBnZXQgYnVnIGZpeGVzCisgICAgICAgICAgICAgICAgICAgIGFuZCBoYXZlIGFjY2VzcyB0byBzdGFibGUgYnJhbmNoZXMgYW5kIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgYnJhbmNoLgorICAgICAgICAgICAgICAgICAgICBPbmNlIHlvdSBoYXZlIGNsb25lZCBCaXRCYWtlLCB5b3Ugc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICB0aGUgbGF0ZXN0IHN0YWJsZQorICAgICAgICAgICAgICAgICAgICBicmFuY2ggZm9yIGRldmVsb3BtZW50IHNpbmNlIHRoZSBtYXN0ZXIgYnJhbmNoIGlzIGZvcgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGRldmVsb3BtZW50IGFuZCBtaWdodCBjb250YWluIGxlc3Mgc3RhYmxlIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+WW91IHVzdWFsbHkgbmVlZCBhIHZlcnNpb24gb2YgQml0QmFrZQorICAgICAgICAgICAgICAgICAgICB0aGF0IG1hdGNoZXMgdGhlIG1ldGFkYXRhIHlvdSBhcmUgdXNpbmcuCisgICAgICAgICAgICAgICAgICAgIFRoZSBtZXRhZGF0YSBpcyBnZW5lcmFsbHkgYmFja3dhcmRzIGNvbXBhdGlibGUgYnV0CisgICAgICAgICAgICAgICAgICAgIG5vdCBmb3J3YXJkIGNvbXBhdGlibGUuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5IZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCBjbG9uZXMgdGhlIEJpdEJha2UgcmVwb3NpdG9yeToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGdpdCBjbG9uZSBnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21tYW5kIGNsb25lcyB0aGUgQml0QmFrZSBHaXQgcmVwb3NpdG9yeSBpbnRvIGEKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNhbGxlZCA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuCisgICAgICAgICAgICAgICAgICAgIGRlc2lnbmF0ZSBhIGRpcmVjdG9yeSBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmdpdCBjbG9uZTwvZmlsZW5hbWU+IGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgaWYgeW91IHdhbnQgdG8gY2FsbCB0aGUgbmV3IGRpcmVjdG9yeSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgb3RoZXIgdGhhbiA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCBuYW1lcyB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYmRldjwvZmlsZW5hbWU+OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgZ2l0IGNsb25lIGdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UgYmJkZXYKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+SW5zdGFsbGF0aW9uIHVzaW5nIHlvdXIgRGlzdHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgTWFuYWdlbWVudCBTeXN0ZW06PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkIGJlY2F1c2UgdGhlIEJpdEJha2UgdmVyc2lvbiB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHlvdXIgZGlzdHJpYnV0aW9uLCBpbiBtb3N0IGNhc2VzLAorICAgICAgICAgICAgICAgICAgICBpcyBzZXZlcmFsCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VzIGJlaGluZCBhIHNuYXBzaG90IG9mIHRoZSBCaXRCYWtlIHJlcG9zaXRvcnkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+VGFraW5nIGEgc25hcHNob3Qgb2YgQml0QmFrZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBEb3dubG9hZGluZyBhIHNuYXBzaG90IG9mIEJpdEJha2UgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgc291cmNlIGNvZGUgcmVwb3NpdG9yeSBnaXZlcyB5b3UgYWNjZXNzIHRvIGEga25vd24KKyAgICAgICAgICAgICAgICAgICAgYnJhbmNoIG9yIHJlbGVhc2Ugb2YgQml0QmFrZS4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmluZyB0aGUgR2l0IHJlcG9zaXRvcnksIGFzIGRlc2NyaWJlZCBlYXJsaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBnZXR0aW5nIEJpdEJha2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmluZyB0aGUgcmVwb3NpdG9yeSBtYWtlcyBpdCBlYXNpZXIgdG8gdXBkYXRlIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcyBhcmUgYWRkZWQgdG8gdGhlIHN0YWJsZSBicmFuY2hlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+VGhlIGZvbGxvd2luZyBleGFtcGxlIGRvd25sb2FkcyBhIHNuYXBzaG90IG9mCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgdmVyc2lvbiAxLjE3LjA6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCB3Z2V0IGh0dHA6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlL3NuYXBzaG90L2JpdGJha2UtMS4xNy4wLnRhci5negorICAgICAkIHRhciB6eHB2ZiBiaXRiYWtlLTEuMTcuMC50YXIuZ3oKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBBZnRlciBleHRyYWN0aW9uIG9mIHRoZSB0YXJiYWxsIHVzaW5nIHRoZSB0YXIgdXRpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgeW91IGhhdmUgYSBkaXJlY3RvcnkgZW50aXRsZWQKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJpdGJha2UtMS4xNy4wPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+VXNpbmcgdGhlIEJpdEJha2UgdGhhdCBDb21lcyBXaXRoIFlvdXIKKyAgICAgICAgICAgICAgICAgICAgQnVpbGQgQ2hlY2tvdXQ6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQSBmaW5hbCBwb3NzaWJpbGl0eSBmb3IgZ2V0dGluZyBhIGNvcHkgb2YgQml0QmFrZSBpcyB0aGF0IGl0CisgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgY29tZXMgd2l0aCB5b3VyIGNoZWNrb3V0IG9mIGEgbGFyZ2VyIEJpdGJha2UtYmFzZWQgYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtLCBzdWNoIGFzIFBva3kgb3IgWW9jdG8gUHJvamVjdC4KKyAgICAgICAgICAgICAgICAgICAgUmF0aGVyIHRoYW4gbWFudWFsbHkgY2hlY2tpbmcgb3V0IGluZGl2aWR1YWwgbGF5ZXJzIGFuZAorICAgICAgICAgICAgICAgICAgICBnbHVpbmcgdGhlbSB0b2dldGhlciB5b3Vyc2VsZiwgeW91IGNhbiBjaGVjaworICAgICAgICAgICAgICAgICAgICBvdXQgYW4gZW50aXJlIGJ1aWxkIHN5c3RlbS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGNoZWNrb3V0IHdpbGwgYWxyZWFkeSBpbmNsdWRlIGEgdmVyc2lvbiBvZiBCaXRCYWtlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gdGhvcm91Z2hseSB0ZXN0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjaGVjayBvdXQgYSBwYXJ0aWN1bGFyIEJpdEJha2UtYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgYnVpbGQgc3lzdGVtLCBjb25zdWx0IHRoYXQgYnVpbGQgc3lzdGVtJ3Mgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9ImJpdGJha2UtdXNlci1tYW51YWwtY29tbWFuZCI+CisgICAgICAgIDx0aXRsZT5UaGUgQml0QmFrZSBDb21tYW5kPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+IGNvbW1hbmQgaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlCisgICAgICAgICAgICB0byB0aGUgQml0QmFrZSB0b29sLgorICAgICAgICAgICAgVGhpcyBzZWN0aW9uIHByZXNlbnRzIHRoZSBCaXRCYWtlIGNvbW1hbmQgc3ludGF4IGFuZCBwcm92aWRlcworICAgICAgICAgICAgc2V2ZXJhbCBleGVjdXRpb24gZXhhbXBsZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0ndXNhZ2UtYW5kLXN5bnRheCc+CisgICAgICAgICAgICA8dGl0bGU+VXNhZ2UgYW5kIHN5bnRheDwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZvbGxvd2luZyBpcyB0aGUgdXNhZ2UgYW5kIHN5bnRheCBmb3IgQml0QmFrZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZSAtaAorICAgICBVc2FnZTogYml0YmFrZSBbb3B0aW9uc10gW3JlY2lwZW5hbWUvdGFyZ2V0IC4uLl0KKworICAgICAgICAgRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCB0YXNrIChkZWZhdWx0IGlzICdidWlsZCcpIGZvciBhIGdpdmVuIHNldCBvZiB0YXJnZXQgcmVjaXBlcyAoLmJiIGZpbGVzKS4KKyAgICAgICAgIEl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgYSBjb25mL2JibGF5ZXJzLmNvbmYgYXZhaWxhYmxlIGluIGN3ZCBvciBpbiBCQlBBVEggd2hpY2gKKyAgICAgICAgIHdpbGwgcHJvdmlkZSB0aGUgbGF5ZXIsIEJCRklMRVMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyAgICAgT3B0aW9uczoKKyAgICAgICAtLXZlcnNpb24gICAgICAgICAgICAgc2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgIC1iIEJVSUxERklMRSwgLS1idWlsZGZpbGU9QlVJTERGSUxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGUgdGFza3MgZnJvbSBhIHNwZWNpZmljIC5iYiByZWNpcGUgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBUk5JTkc6IERvZXMgbm90IGhhbmRsZSBhbnkgZGVwZW5kZW5jaWVzIGZyb20gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBlcy4KKyAgICAgICAtaywgLS1jb250aW51ZSAgICAgICAgQ29udGludWUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhZnRlciBhbiBlcnJvci4gV2hpbGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCB0aGF0IGZhaWxlZCBhbmQgYW55dGhpbmcgZGVwZW5kaW5nIG9uIGl0IGNhbm5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBidWlsdCwgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aWxsIGJlIGJ1aWx0IGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcGluZy4KKyAgICAgICAtYSwgLS10cnlhbHRjb25maWdzICAgQ29udGludWUgd2l0aCBidWlsZHMgYnkgdHJ5aW5nIHRvIHVzZSBhbHRlcm5hdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMgd2hlcmUgcG9zc2libGUuCisgICAgICAgLWYsIC0tZm9yY2UgICAgICAgICAgIEZvcmNlIHRoZSBzcGVjaWZpZWQgdGFyZ2V0cy90YXNrIHRvIHJ1biAoaW52YWxpZGF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBleGlzdGluZyBzdGFtcCBmaWxlKS4KKyAgICAgICAtYyBDTUQsIC0tY21kPUNNRCAgICAgU3BlY2lmeSB0aGUgdGFzayB0byBleGVjdXRlLiBUaGUgZXhhY3Qgb3B0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZGVwZW5kIG9uIHRoZSBtZXRhZGF0YS4gU29tZSBleGFtcGxlcyBtaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSAnY29tcGlsZScgb3IgJ3BvcHVsYXRlX3N5c3Jvb3QnIG9yICdsaXN0dGFza3MnIG1heQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlIGEgbGlzdCBvZiB0aGUgdGFza3MgYXZhaWxhYmxlLgorICAgICAgIC1DIElOVkFMSURBVEVfU1RBTVAsIC0tY2xlYXItc3RhbXA9SU5WQUxJREFURV9TVEFNUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRlIHRoZSBzdGFtcCBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBpbGUnIGFuZCB0aGVuIHJ1biB0aGUgZGVmYXVsdCB0YXNrIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRhcmdldChzKS4KKyAgICAgICAtciBQUkVGSUxFLCAtLXJlYWQ9UFJFRklMRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIHRoZSBzcGVjaWZpZWQgZmlsZSBiZWZvcmUgYml0YmFrZS5jb25mLgorICAgICAgIC1SIFBPU1RGSUxFLCAtLXBvc3RyZWFkPVBPU1RGSUxFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgdGhlIHNwZWNpZmllZCBmaWxlIGFmdGVyIGJpdGJha2UuY29uZi4KKyAgICAgICAtdiwgLS12ZXJib3NlICAgICAgICAgT3V0cHV0IG1vcmUgbG9nIG1lc3NhZ2UgZGF0YSB0byB0aGUgdGVybWluYWwuCisgICAgICAgLUQsIC0tZGVidWcgICAgICAgICAgIEluY3JlYXNlIHRoZSBkZWJ1ZyBsZXZlbC4gWW91IGNhbiBzcGVjaWZ5IHRoaXMgbW9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIG9uY2UuCisgICAgICAgLW4sIC0tZHJ5LXJ1biAgICAgICAgIERvbid0IGV4ZWN1dGUsIGp1c3QgZ28gdGhyb3VnaCB0aGUgbW90aW9ucy4KKyAgICAgICAtUyBTSUdOQVRVUkVfSEFORExFUiwgLS1kdW1wLXNpZ25hdHVyZXM9U0lHTkFUVVJFX0hBTkRMRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtcCBvdXQgdGhlIHNpZ25hdHVyZSBjb25zdHJ1Y3Rpb24gaW5mb3JtYXRpb24sIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gdGFzayBleGVjdXRpb24uIFRoZSBTSUdOQVRVUkVfSEFORExFUiBwYXJhbWV0ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBoYW5kbGVyLiBUd28gY29tbW9uIHZhbHVlcyBhcmUgbm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRkaWZmIGJ1dCB0aGUgaGFuZGxlciBtYXkgZGVmaW5lIG1vcmUvbGVzcy4gbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFucyBvbmx5IGR1bXAgdGhlIHNpZ25hdHVyZSwgcHJpbnRkaWZmIG1lYW5zIGNvbXBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGR1bXBlZCBzaWduYXR1cmUgd2l0aCB0aGUgY2FjaGVkIG9uZS4KKyAgICAgICAtcCwgLS1wYXJzZS1vbmx5ICAgICAgUXVpdCBhZnRlciBwYXJzaW5nIHRoZSBCQiByZWNpcGVzLgorICAgICAgIC1zLCAtLXNob3ctdmVyc2lvbnMgICBTaG93IGN1cnJlbnQgYW5kIHByZWZlcnJlZCB2ZXJzaW9ucyBvZiBhbGwgcmVjaXBlcy4KKyAgICAgICAtZSwgLS1lbnZpcm9ubWVudCAgICAgU2hvdyB0aGUgZ2xvYmFsIG9yIHBlci1yZWNpcGUgZW52aXJvbm1lbnQgY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB2YXJpYWJsZXMgd2VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQvY2hhbmdlZC4KKyAgICAgICAtZywgLS1ncmFwaHZpeiAgICAgICAgU2F2ZSBkZXBlbmRlbmN5IHRyZWUgaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyBpbiB0aGUgZG90IHN5bnRheC4KKyAgICAgICAtSSBFWFRSQV9BU1NVTUVfUFJPVklERUQsIC0taWdub3JlLWRlcHM9RVhUUkFfQVNTVU1FX1BST1ZJREVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtZSB0aGVzZSBkZXBlbmRlbmNpZXMgZG9uJ3QgZXhpc3QgYW5kIGFyZSBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIChlcXVpdmFsZW50IHRvIEFTU1VNRV9QUk9WSURFRCkuIFVzZWZ1bCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlIGRlcGVuZGVuY3kgZ3JhcGhzIG1vcmUgYXBwZWFsaW5nCisgICAgICAgLWwgREVCVUdfRE9NQUlOUywgLS1sb2ctZG9tYWlucz1ERUJVR19ET01BSU5TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgZGVidWcgbG9nZ2luZyBmb3IgdGhlIHNwZWNpZmllZCBsb2dnaW5nIGRvbWFpbnMKKyAgICAgICAtUCwgLS1wcm9maWxlICAgICAgICAgUHJvZmlsZSB0aGUgY29tbWFuZCBhbmQgc2F2ZSByZXBvcnRzLgorICAgICAgIC11IFVJLCAtLXVpPVVJICAgICAgICBUaGUgdXNlciBpbnRlcmZhY2UgdG8gdXNlIChlLmcuIGtub3R0eSwgaG9iLCBkZXBleHApLgorICAgICAgIC10IFNFUlZFUlRZUEUsIC0tc2VydmVydHlwZT1TRVJWRVJUWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENob29zZSB3aGljaCBzZXJ2ZXIgdG8gdXNlLCBwcm9jZXNzIG9yIHhtbHJwYy4KKyAgICAgICAtLXRva2VuPVhNTFJQQ1RPS0VOICAgU3BlY2lmeSB0aGUgY29ubmVjdGlvbiB0b2tlbiB0byBiZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGluZyB0byBhIHJlbW90ZSBzZXJ2ZXIuCisgICAgICAgLS1yZXZpc2lvbnMtY2hhbmdlZCAgIFNldCB0aGUgZXhpdCBjb2RlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVwc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nIHJldmlzaW9ucyBoYXZlIGNoYW5nZWQgb3Igbm90LgorICAgICAgIC0tc2VydmVyLW9ubHkgICAgICAgICBSdW4gYml0YmFrZSB3aXRob3V0IGEgVUksIG9ubHkgc3RhcnRpbmcgYSBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvb2tlcikgcHJvY2Vzcy4KKyAgICAgICAtQiBCSU5ELCAtLWJpbmQ9QklORCAgVGhlIG5hbWUvYWRkcmVzcyBmb3IgdGhlIGJpdGJha2Ugc2VydmVyIHRvIGJpbmQgdG8uCisgICAgICAgLS1uby1zZXRzY2VuZSAgICAgICAgIERvIG5vdCBydW4gYW55IHNldHNjZW5lIHRhc2tzLiBzc3RhdGUgd2lsbCBiZSBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBldmVyeXRoaW5nIG5lZWRlZCwgYnVpbHQuCisgICAgICAgLS1yZW1vdGUtc2VydmVyPVJFTU9URV9TRVJWRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdCB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4KKyAgICAgICAtbSwgLS1raWxsLXNlcnZlciAgICAgVGVybWluYXRlIHRoZSByZW1vdGUgc2VydmVyLgorICAgICAgIC0tb2JzZXJ2ZS1vbmx5ICAgICAgICBDb25uZWN0IHRvIGEgc2VydmVyIGFzIGFuIG9ic2VydmluZy1vbmx5IGNsaWVudC4KKyAgICAgICAtLXN0YXR1cy1vbmx5ICAgICAgICAgQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgcmVtb3RlIGJpdGJha2Ugc2VydmVyLgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdiaXRiYWtlLWV4YW1wbGVzJz4KKyAgICAgICAgICAgIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgc2VjdGlvbiBwcmVzZW50cyBzb21lIGV4YW1wbGVzIHNob3dpbmcgaG93IHRvIHVzZSBCaXRCYWtlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2VjdGlvbiBpZD0nZXhhbXBsZS1leGVjdXRpbmctYS10YXNrLWFnYWluc3QtYS1zaW5nbGUtcmVjaXBlJz4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RXhlY3V0aW5nIGEgVGFzayBBZ2FpbnN0IGEgU2luZ2xlIFJlY2lwZTwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW5nIHRhc2tzIGZvciBhIHNpbmdsZSByZWNpcGUgZmlsZSBpcyByZWxhdGl2ZWx5IHNpbXBsZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IHNwZWNpZnkgdGhlIGZpbGUgaW4gcXVlc3Rpb24sIGFuZCBCaXRCYWtlIHBhcnNlcworICAgICAgICAgICAgICAgICAgICBpdCBhbmQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCB0YXNrLgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB0YXNrLCBCaXRCYWtlIGV4ZWN1dGVzIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIHRhc2ssIHdoaWNoIGlzICJidWlsZOKAnS4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBvYmV5cyBpbnRlci10YXNrIGRlcGVuZGVuY2llcyB3aGVuIGRvaW5nCisgICAgICAgICAgICAgICAgICAgIHNvLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvbW1hbmQgcnVucyB0aGUgYnVpbGQgdGFzaywgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGFzaywgb24gdGhlIDxmaWxlbmFtZT5mb29fMS4wLmJiPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlIGZpbGU6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIC1iIGZvb18xLjAuYmIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvbW1hbmQgcnVucyB0aGUgY2xlYW4gdGFzayBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmZvby5iYjwvZmlsZW5hbWU+IHJlY2lwZSBmaWxlOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZSAtYiBmb28uYmIgLWMgY2xlYW4KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiLWIiIG9wdGlvbiBleHBsaWNpdGx5IGRvZXMgbm90IGhhbmRsZSByZWNpcGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIHRoYW4gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgaXQgaXMgaW5zdGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBzeW50YXggcHJlc2VudGVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBzZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiBpZD0nZXhlY3V0aW5nLXRhc2tzLWFnYWluc3QtYS1zZXQtb2YtcmVjaXBlLWZpbGVzJz4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RXhlY3V0aW5nIFRhc2tzIEFnYWluc3QgYSBTZXQgb2YgUmVjaXBlIEZpbGVzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBjb21wbGV4aXRpZXMgaW50cm9kdWNlZAorICAgICAgICAgICAgICAgICAgICB3aGVuIG9uZSB3YW50cyB0byBtYW5hZ2UgbXVsdGlwbGUgPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBDbGVhcmx5IHRoZXJlIG5lZWRzIHRvIGJlIGEgd2F5IHRvIHRlbGwgQml0QmFrZSB3aGF0CisgICAgICAgICAgICAgICAgICAgIGZpbGVzIGFyZSBhdmFpbGFibGUgYW5kLCBvZiB0aG9zZSwgd2hpY2ggeW91CisgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZXhlY3V0ZS4KKyAgICAgICAgICAgICAgICAgICAgVGhlcmUgYWxzbyBuZWVkcyB0byBiZSBhIHdheSBmb3IgZWFjaCByZWNpcGUKKyAgICAgICAgICAgICAgICAgICAgdG8gZXhwcmVzcyBpdHMgZGVwZW5kZW5jaWVzLCBib3RoIGZvciBidWlsZC10aW1lIGFuZAorICAgICAgICAgICAgICAgICAgICBydW50aW1lLgorICAgICAgICAgICAgICAgICAgICBUaGVyZSBtdXN0IGJlIGEgd2F5IGZvciB5b3UgdG8gZXhwcmVzcyByZWNpcGUgcHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgd2hlbiBtdWx0aXBsZSByZWNpcGVzIHByb3ZpZGUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSwgb3Igd2hlbgorICAgICAgICAgICAgICAgICAgICB0aGVyZSBhcmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSByZWNpcGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+Yml0YmFrZTwvZmlsZW5hbWU+IGNvbW1hbmQsIHdoZW4gbm90IHVzaW5nCisgICAgICAgICAgICAgICAgICAgICItLWJ1aWxkZmlsZSIgb3IgIi1iIiBvbmx5IGFjY2VwdHMgYSAiUFJPVklERVMiLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2Fubm90IHByb3ZpZGUgYW55dGhpbmcgZWxzZS4KKyAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgYSByZWNpcGUgZmlsZSBnZW5lcmFsbHkgIlBST1ZJREVTIiBpdHMKKyAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VuYW1lIiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgJCBiaXRiYWtlIGZvbworICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgbmV4dCBleGFtcGxlICJQUk9WSURFUyIgdGhlIHBhY2thZ2UgbmFtZSBhbmQgYWxzbyB1c2VzCisgICAgICAgICAgICAgICAgICAgIHRoZSAiLWMiIG9wdGlvbiB0byB0ZWxsIEJpdEJha2UgdG8ganVzdCBleGVjdXRlIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fY2xlYW48L2ZpbGVuYW1lPiB0YXNrOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgICQgYml0YmFrZSAtYyBjbGVhbiBmb28KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24gaWQ9J2dlbmVyYXRpbmctZGVwZW5kZW5jeS1ncmFwaHMnPgorICAgICAgICAgICAgICAgIDx0aXRsZT5HZW5lcmF0aW5nIERlcGVuZGVuY3kgR3JhcGhzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGlzIGFibGUgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBncmFwaHMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5kb3Q8L2ZpbGVuYW1lPiBzeW50YXguCisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gY29udmVydCB0aGVzZSBncmFwaHMgaW50byBpbWFnZXMgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb3Q8L2ZpbGVuYW1lPiB0b29sIGZyb20KKyAgICAgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0naHR0cDovL3d3dy5ncmFwaHZpei5vcmcnPkdyYXBodml6PC91bGluaz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdoZW4geW91IGdlbmVyYXRlIGEgZGVwZW5kZW5jeSBncmFwaCwgQml0QmFrZSB3cml0ZXMgZm91ciBmaWxlcworICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeToKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnBhY2thZ2UtZGVwZW5kcy5kb3Q8L2ZpbGVuYW1lPjo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3dzIEJpdEJha2UncyBrbm93bGVkZ2Ugb2YgZGVwZW5kZW5jaWVzIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lIHRhcmdldHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5wbi1kZXBlbmRzLmRvdDwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd3MgZGVwZW5kZW5jaWVzIGJldHdlZW4gYnVpbGQtdGltZSB0YXJnZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gcmVjaXBlcykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT50YXNrLWRlcGVuZHMuZG90PC9maWxlbmFtZT46PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93cyBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0YXNrcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnBuLWJ1aWxkbGlzdDwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd3MgYSBzaW1wbGUgbGlzdCBvZiB0YXJnZXRzIHRoYXQgYXJlIHRvIGJlIGJ1aWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gc3RvcCBkZXBlbmRpbmcgb24gY29tbW9uIGRlcGVuZHMsIHVzZSB0aGUgIi1JIiBkZXBlbmQKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGFuZCBCaXRCYWtlIG9taXRzIHRoZW0gZnJvbSB0aGUgZ3JhcGguCisgICAgICAgICAgICAgICAgICAgIExlYXZpbmcgdGhpcyBpbmZvcm1hdGlvbiBvdXQgY2FuIHByb2R1Y2UgbW9yZSByZWFkYWJsZSBncmFwaHMuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgd2F5LCB5b3UgY2FuIHJlbW92ZSBmcm9tIHRoZSBncmFwaAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+IGZyb20gaW5oZXJpdGVkIGNsYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyA8ZmlsZW5hbWU+YmFzZS5iYmNsYXNzPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhlcmUgYXJlIHR3byBleGFtcGxlcyB0aGF0IGNyZWF0ZSBkZXBlbmRlbmN5IGdyYXBocy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNlY29uZCBleGFtcGxlIG9taXRzIGRlcGVuZHMgY29tbW9uIGluIE9wZW5FbWJlZGRlZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHRoZSBncmFwaDoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIGJpdGJha2UgLWcgZm9vCisKKyAgICAgJCBiaXRiYWtlIC1nIC1JIHZpcnR1YWwva2VybmVsIC1JIGVnbGliYyBmb28KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1tZXRhZGF0YS54bWwgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtbWV0YWRhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWQ4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtbWV0YWRhdGEueG1sCkBAIC0wLDAgKzEsMTgzMCBAQAorPCFET0NUWVBFIGNoYXB0ZXIgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzxjaGFwdGVyIGlkPSJiaXRiYWtlLXVzZXItbWFudWFsLW1ldGFkYXRhIj4KKyAgICA8dGl0bGU+U3ludGF4IGFuZCBPcGVyYXRvcnM8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIEJpdGJha2UgZmlsZXMgaGF2ZSB0aGVpciBvd24gc3ludGF4LgorICAgICAgICBUaGUgc3ludGF4IGhhcyBzaW1pbGFyaXRpZXMgdG8gc2V2ZXJhbAorICAgICAgICBvdGhlciBsYW5ndWFnZXMgYnV0IGFsc28gaGFzIHNvbWUgdW5pcXVlIGZlYXR1cmVzLgorICAgICAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBhdmFpbGFibGUgc3ludGF4IGFuZCBvcGVyYXRvcnMKKyAgICAgICAgYXMgd2VsbCBhcyBwcm92aWRlcyBleGFtcGxlcy4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdGlvbiBpZD0nYmFzaWMtc3ludGF4Jz4KKyAgICAgICAgPHRpdGxlPkJhc2ljIFN5bnRheDwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgc29tZSBiYXNpYyBzeW50YXggZXhhbXBsZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYmFzaWMtdmFyaWFibGUtc2V0dGluZyc+CisgICAgICAgICAgICA8dGl0bGU+QmFzaWMgVmFyaWFibGUgU2V0dGluZzwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIDxmaWxlbmFtZT5WQVJJQUJMRTwvZmlsZW5hbWU+IHRvCisgICAgICAgICAgICAgICAgInZhbHVlIi4KKyAgICAgICAgICAgICAgICBUaGlzIGFzc2lnbm1lbnQgb2NjdXJzIGltbWVkaWF0ZWx5IGFzIHRoZSBzdGF0ZW1lbnQgaXMgcGFyc2VkLgorICAgICAgICAgICAgICAgIEl0IGlzIGEgImhhcmQiIGFzc2lnbm1lbnQuCisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBWQVJJQUJMRSA9ICJ2YWx1ZSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgQXMgZXhwZWN0ZWQsIGlmIHlvdSBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFzIHBhcnQgb2YKKyAgICAgICAgICAgICAgICBhbiBhc3NpZ25tZW50LCB0aGUgc3BhY2VzIGFyZSByZXRhaW5lZDoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFZBUklBQkxFID0gIiB2YWx1ZSIKKyAgICAgVkFSSUFCTEUgPSAidmFsdWUgIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBTZXR0aW5nIDxmaWxlbmFtZT5WQVJJQUJMRTwvZmlsZW5hbWU+IHRvICIiIHNldHMgaXQgdG8gYW4gZW1wdHkgc3RyaW5nLAorICAgICAgICAgICAgICAgIHdoaWxlIHNldHRpbmcgdGhlIHZhcmlhYmxlIHRvICIgIiBzZXRzIGl0IHRvIGEgYmxhbmsgc3BhY2UKKyAgICAgICAgICAgICAgICAoaS5lLiB0aGVzZSBhcmUgbm90IHRoZSBzYW1lIHZhbHVlcykuCisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBWQVJJQUJMRSA9ICIiCisgICAgIFZBUklBQkxFID0gIiAiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3ZhcmlhYmxlLWV4cGFuc2lvbic+CisgICAgICAgICAgICA8dGl0bGU+VmFyaWFibGUgRXhwYW5zaW9uPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSBzdXBwb3J0cyB2YXJpYWJsZXMgcmVmZXJlbmNpbmcgb25lIGFub3RoZXIncworICAgICAgICAgICAgICAgIGNvbnRlbnRzIHVzaW5nIGEgc3ludGF4IHRoYXQgaXMgc2ltaWxhciB0byBzaGVsbCBzY3JpcHRpbmcuCisgICAgICAgICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgdGhhdCByZXN1bHRzIGluIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBjb250YWluaW5nICJhdmFsIiBhbmQgPGZpbGVuYW1lPkI8L2ZpbGVuYW1lPiBldmFsdWF0aW5nIHRvCisgICAgICAgICAgICAgICAgInByZWF2YWxwb3N0IiBiYXNlZCBvbiB0aGF0IGN1cnJlbnQgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQSA9ICJhdmFsIgorICAgICBCID0gInByZSR7QX1wb3N0IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHJlYWxpemUgdGhhdCB3aGVuZXZlciA8ZmlsZW5hbWU+QjwvZmlsZW5hbWU+IGlzCisgICAgICAgICAgICAgICAgcmVmZXJlbmNlZCwgaXRzIGV2YWx1YXRpb24gd2lsbCBkZXBlbmQgb24gdGhlIHN0YXRlIG9mCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBhdCB0aGF0IHRpbWUuCisgICAgICAgICAgICAgICAgVGh1cywgbGF0ZXIgZXZhbHVhdGlvbnMgb2YgPGZpbGVuYW1lPkI8L2ZpbGVuYW1lPiBpbiB0aGUKKyAgICAgICAgICAgICAgICBwcmV2aW91cyBleGFtcGxlIGNvdWxkIHJlc3VsdCBpbiBkaWZmZXJlbnQgdmFsdWVzCisgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3NldHRpbmctYS1kZWZhdWx0LXZhbHVlJz4KKyAgICAgICAgICAgIDx0aXRsZT5TZXR0aW5nIGEgZGVmYXVsdCB2YWx1ZSAoPz0pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhlICI/PSIgb3BlcmF0b3IgdG8gYWNoaWV2ZSBhICJzb2Z0ZXIiIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICBmb3IgYSB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICBUaGlzIHR5cGUgb2YgYXNzaWdubWVudCBhbGxvd3MgeW91IHRvIGRlZmluZSBhIHZhcmlhYmxlIGlmIGl0CisgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIHN0YXRlbWVudCBpcyBwYXJzZWQsIGJ1dCB0byBsZWF2ZSB0aGUKKyAgICAgICAgICAgICAgICB2YWx1ZSBhbG9uZSBpZiB0aGUgdmFyaWFibGUgaGFzIGEgdmFsdWUuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQSA/PSAiYXZhbCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSWYgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcyBzZXQgYXQgdGhlIHRpbWUgdGhpcyBzdGF0ZW1lbnQgaXMgcGFyc2VkLAorICAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSByZXRhaW5zIGl0cyB2YWx1ZS4KKyAgICAgICAgICAgICAgICBIb3dldmVyLCBpZiA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIG5vdCBzZXQsCisgICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIGlzIHNldCB0byAiYXZhbCIuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgYXNzaWdubWVudCBpcyBpbW1lZGlhdGUuCisgICAgICAgICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgaWYgbXVsdGlwbGUgIj89IiBhc3NpZ25tZW50cworICAgICAgICAgICAgICAgICAgICB0byBhIHNpbmdsZSB2YXJpYWJsZSBleGlzdCwgdGhlIGZpcnN0IG9mIHRob3NlIGVuZHMgdXAgZ2V0dGluZworICAgICAgICAgICAgICAgICAgICB1c2VkLgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdzZXR0aW5nLWEtd2Vhay1kZWZhdWx0LXZhbHVlJz4KKyAgICAgICAgICAgIDx0aXRsZT5TZXR0aW5nIGEgd2VhayBkZWZhdWx0IHZhbHVlICg/Pz0pPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gdXNlIGEgIndlYWtlciIgYXNzaWdubWVudCB0aGFuIGluIHRoZQorICAgICAgICAgICAgICAgIHByZXZpb3VzIHNlY3Rpb24gYnkgdXNpbmcgdGhlICI/Pz0iIG9wZXJhdG9yLgorICAgICAgICAgICAgICAgIFRoaXMgYXNzaWdubWVudCBiZWhhdmVzIGlkZW50aWNhbCB0byAiPz0iIGV4Y2VwdCB0aGF0IHRoZQorICAgICAgICAgICAgICAgIGFzc2lnbm1lbnQgaXMgbWFkZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MgcmF0aGVyCisgICAgICAgICAgICAgICAgdGhhbiBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIHdoZW4gbXVsdGlwbGUgIj8/PSIgYXNzaWdubWVudHMgZXhpc3QsIHRoZSBsYXN0CisgICAgICAgICAgICAgICAgb25lIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgQWxzbywgYW55ICI9IiBvciAiPz0iIGFzc2lnbm1lbnQgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgc2V0IHdpdGgKKyAgICAgICAgICAgICAgICAiPz89Ii4KKyAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBBID8/PSAic29tZXZhbHVlIgorICAgICBBID8/PSAic29tZW90aGVydmFsdWUiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIElmIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gaXMgc2V0IGJlZm9yZSB0aGUgYWJvdmUgc3RhdGVtZW50cyBhcmUgcGFyc2VkLAorICAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSByZXRhaW5zIGl0cyB2YWx1ZS4KKyAgICAgICAgICAgICAgICBJZiA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIG5vdCBzZXQsCisgICAgICAgICAgICAgICAgdGhlIHZhcmlhYmxlIGlzIHNldCB0byAic29tZW90aGVydmFsdWUiLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBZ2FpbiwgdGhpcyBhc3NpZ25tZW50IGlzIGEgImxhenkiIG9yICJ3ZWFrIiBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgYmVjYXVzZSBpdCBkb2VzIG5vdCBvY2N1ciB1bnRpbCB0aGUgZW5kCisgICAgICAgICAgICAgICAgb2YgdGhlIHBhcnNpbmcgcHJvY2Vzcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdpbW1lZGlhdGUtdmFyaWFibGUtZXhwYW5zaW9uJz4KKyAgICAgICAgICAgIDx0aXRsZT5JbW1lZGlhdGUgdmFyaWFibGUgZXhwYW5zaW9uICg6PSk8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgIjo9IiBvcGVyYXRvciByZXN1bHRzIGluIGEgdmFyaWFibGUncworICAgICAgICAgICAgICAgIGNvbnRlbnRzIGJlaW5nIGV4cGFuZGVkIGltbWVkaWF0ZWx5LAorICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIHdoZW4gdGhlIHZhcmlhYmxlIGlzIGFjdHVhbGx5IHVzZWQ6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBUID0gIjEyMyIKKyAgICAgQSA6PSAiJHtCfSAke0F9IHRlc3QgJHtUfSIKKyAgICAgVCA9ICI0NTYiCisgICAgIEIgPSAiJHtUfSBidmFsIgorICAgICBDID0gImN2YWwiCisgICAgIEMgOj0gIiR7Q31hcHBlbmQiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBjb250YWlucworICAgICAgICAgICAgICAgICJ0ZXN0IDEyMyIgYmVjYXVzZSA8ZmlsZW5hbWU+JHtCfTwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4ke0F9PC9maWxlbmFtZT4gYXQgdGhlIHRpbWUgb2YgcGFyc2luZyBhcmUgdW5kZWZpbmVkLAorICAgICAgICAgICAgICAgIHdoaWNoIGxlYXZlcyAidGVzdCAxMjMiLgorICAgICAgICAgICAgICAgIEFuZCwgdGhlIHZhcmlhYmxlIDxmaWxlbmFtZT5DPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBjb250YWlucyAiY3ZhbGFwcGVuZCIgc2luY2UgPGZpbGVuYW1lPiR7Q308L2ZpbGVuYW1lPiBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgIGV4cGFuZHMgdG8gImN2YWwiLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2FwcGVuZGluZy1hbmQtcHJlcGVuZGluZyc+CisgICAgICAgICAgICA8dGl0bGU+QXBwZW5kaW5nICgrPSkgYW5kIHByZXBlbmRpbmcgKD0rKSBXaXRoIFNwYWNlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFwcGVuZGluZyBhbmQgcHJlcGVuZGluZyB2YWx1ZXMgaXMgY29tbW9uIGFuZCBjYW4gYmUgYWNjb21wbGlzaGVkCisgICAgICAgICAgICAgICAgdXNpbmcgdGhlICIrPSIgYW5kICI9KyIgb3BlcmF0b3JzLgorICAgICAgICAgICAgICAgIFRoZXNlIG9wZXJhdG9ycyBpbnNlcnQgYSBzcGFjZSBiZXR3ZWVuIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgdmFsdWUgYW5kIHByZXBlbmRlZCBvciBhcHBlbmRlZCB2YWx1ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlc2Ugb3BlcmF0b3JzIHRha2UgaW1tZWRpYXRlIGVmZmVjdCBkdXJpbmcgcGFyc2luZy4KKyAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQiA9ICJidmFsIgorICAgICBCICs9ICJhZGRpdGlvbmFsZGF0YSIKKyAgICAgQyA9ICJjdmFsIgorICAgICBDID0rICJ0ZXN0IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgPGZpbGVuYW1lPkI8L2ZpbGVuYW1lPiBjb250YWlucworICAgICAgICAgICAgICAgICJidmFsIGFkZGl0aW9uYWxkYXRhIiBhbmQgPGZpbGVuYW1lPkM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGNvbnRhaW5zICJ0ZXN0IGN2YWwiLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2FwcGVuZGluZy1hbmQtcHJlcGVuZGluZy13aXRob3V0LXNwYWNlcyc+CisgICAgICAgICAgICA8dGl0bGU+QXBwZW5kaW5nICguPSkgYW5kIFByZXBlbmRpbmcgKD0uKSBXaXRob3V0IFNwYWNlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIGFwcGVuZCBvciBwcmVwZW5kIHZhbHVlcyB3aXRob3V0IGFuCisgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgc3BhY2UsIHVzZSB0aGUgIi49IiBhbmQgIj0uIiBvcGVyYXRvcnMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZXNlIG9wZXJhdG9ycyB0YWtlIGltbWVkaWF0ZSBlZmZlY3QgZHVyaW5nIHBhcnNpbmcuCisgICAgICAgICAgICAgICAgSGVyZSBhcmUgc29tZSBleGFtcGxlczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEIgPSAiYnZhbCIKKyAgICAgQiAuPSAiYWRkaXRpb25hbGRhdGEiCisgICAgIEMgPSAiY3ZhbCIKKyAgICAgQyA9LiAidGVzdCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIDxmaWxlbmFtZT5CPC9maWxlbmFtZT4gY29udGFpbnMKKyAgICAgICAgICAgICAgICAiYnZhbGFkZGl0aW9uYWxkYXRhIiBhbmQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QzwvZmlsZW5hbWU+IGNvbnRhaW5zICJ0ZXN0Y3ZhbCIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nYXBwZW5kaW5nLWFuZC1wcmVwZW5kaW5nLW92ZXJyaWRlLXN0eWxlLXN5bnRheCc+CisgICAgICAgICAgICA8dGl0bGU+QXBwZW5kaW5nIGFuZCBQcmVwZW5kaW5nIChPdmVycmlkZSBTdHlsZSBTeW50YXgpPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIGFwcGVuZCBhbmQgcHJlcGVuZCBhIHZhcmlhYmxlJ3MgdmFsdWUKKyAgICAgICAgICAgICAgICB1c2luZyBhbiBvdmVycmlkZSBzdHlsZSBzeW50YXguCisgICAgICAgICAgICAgICAgV2hlbiB5b3UgdXNlIHRoaXMgc3ludGF4LCBubyBzcGFjZXMgYXJlIGluc2VydGVkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVzZSBvcGVyYXRvcnMgZGlmZmVyIGZyb20gdGhlICI6PSIsICIuPSIsICI9LiIsICIrPSIsIGFuZCAiPSsiCisgICAgICAgICAgICAgICAgb3BlcmF0b3JzIGluIHRoYXQgdGhlaXIgZWZmZWN0cyBhcmUgZGVmZXJyZWQKKyAgICAgICAgICAgICAgICB1bnRpbCBhZnRlciBwYXJzaW5nIGNvbXBsZXRlcyByYXRoZXIgdGhhbiBiZWluZyBpbW1lZGlhdGVseQorICAgICAgICAgICAgICAgIGFwcGxpZWQuCisgICAgICAgICAgICAgICAgSGVyZSBhcmUgc29tZSBleGFtcGxlczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEIgPSAiYnZhbCIKKyAgICAgQl9hcHBlbmQgPSAiIGFkZGl0aW9uYWwgZGF0YSIKKyAgICAgQyA9ICJjdmFsIgorICAgICBDX3ByZXBlbmQgPSAiYWRkaXRpb25hbCBkYXRhICIKKyAgICAgRCA9ICJkdmFsIgorICAgICBEX2FwcGVuZCA9ICJhZGRpdGlvbmFsIGRhdGEiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSA8ZmlsZW5hbWU+QjwvZmlsZW5hbWU+IGJlY29tZXMKKyAgICAgICAgICAgICAgICAiYnZhbCBhZGRpdGlvbmFsIGRhdGEiIGFuZCA8ZmlsZW5hbWU+QzwvZmlsZW5hbWU+IGJlY29tZXMKKyAgICAgICAgICAgICAgICAiYWRkaXRpb25hbCBkYXRhIGN2YWwiLgorICAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSA8ZmlsZW5hbWU+RDwvZmlsZW5hbWU+IGJlY29tZXMKKyAgICAgICAgICAgICAgICAiZHZhbGFkZGl0aW9uYWwgZGF0YSIuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IGNvbnRyb2wgYWxsIHNwYWNpbmcgd2hlbiB5b3UgdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSBzeW50YXguCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3JlbW92aW5nLW92ZXJyaWRlLXN0eWxlLXN5bnRheCc+CisgICAgICAgICAgICA8dGl0bGU+UmVtb3ZhbCAoT3ZlcnJpZGUgU3R5bGUgU3ludGF4KTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFlvdSBjYW4gcmVtb3ZlIHZhbHVlcyBmcm9tIGxpc3RzIHVzaW5nIHRoZSByZW1vdmFsCisgICAgICAgICAgICAgICAgb3ZlcnJpZGUgc3R5bGUgc3ludGF4LgorICAgICAgICAgICAgICAgIFNwZWNpZnlpbmcgYSB2YWx1ZSBmb3IgcmVtb3ZhbCBjYXVzZXMgYWxsIG9jY3VycmVuY2VzIG9mIHRoYXQKKyAgICAgICAgICAgICAgICB2YWx1ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHZhcmlhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXaGVuIHlvdSB1c2UgdGhpcyBzeW50YXgsIEJpdEJha2UgZXhwZWN0cyBvbmUgb3IgbW9yZSBzdHJpbmdzLgorICAgICAgICAgICAgICAgIFN1cnJvdW5kaW5nIHNwYWNlcyBhcmUgcmVtb3ZlZCBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEZPTyA9ICIxMjMgNDU2IDc4OSAxMjM0NTYgMTIzIDQ1NiAxMjMgNDU2IgorICAgICBGT09fcmVtb3ZlID0gIjEyMyIKKyAgICAgRk9PX3JlbW92ZSA9ICI0NTYiCisgICAgIEZPTzIgPSAiYWJjIGRlZiBnaGkgYWJjZGVmIGFiYyBkZWYgYWJjIGRlZiIKKyAgICAgRk9PMl9yZW1vdmUgPSAiYWJjIGRlZiIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIDxmaWxlbmFtZT5GT088L2ZpbGVuYW1lPiBiZWNvbWVzCisgICAgICAgICAgICAgICAgIjc4OSAxMjM0NTYiIGFuZCA8ZmlsZW5hbWU+Rk9PMjwvZmlsZW5hbWU+IGJlY29tZXMKKyAgICAgICAgICAgICAgICAiZ2hpIGFiY2RlZiIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0ndmFyaWFibGUtZmxhZy1zeW50YXgnPgorICAgICAgICAgICAgPHRpdGxlPlZhcmlhYmxlIEZsYWcgU3ludGF4PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVmFyaWFibGUgZmxhZ3MgYXJlIEJpdEJha2UncyBpbXBsZW1lbnRhdGlvbiBvZiB2YXJpYWJsZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgb3IgYXR0cmlidXRlcy4KKyAgICAgICAgICAgICAgICBJdCBpcyBhIHdheSBvZiB0YWdnaW5nIGV4dHJhIGluZm9ybWF0aW9uIG9udG8gYSB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGZpbmQgbW9yZSBvdXQgYWJvdXQgdmFyaWFibGUgZmxhZ3MgaW4gZ2VuZXJhbCBpbiB0aGUKKyAgICAgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndmFyaWFibGUtZmxhZ3MnPlZhcmlhYmxlIEZsYWdzPC9saW5rPiIKKyAgICAgICAgICAgICAgICBzZWN0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGRlZmluZSwgYXBwZW5kLCBhbmQgcHJlcGVuZCB2YWx1ZXMgdG8gdmFyaWFibGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgQWxsIHRoZSBzdGFuZGFyZCBzeW50YXggb3BlcmF0aW9ucyBwcmV2aW91c2x5IG1lbnRpb25lZCB3b3JrCisgICAgICAgICAgICAgICAgZm9yIHZhcmlhYmxlIGZsYWdzIGV4Y2VwdCBmb3Igb3ZlcnJpZGUgc3R5bGUgc3ludGF4CisgICAgICAgICAgICAgICAgKGkuZS4gPGZpbGVuYW1lPl9wcmVwZW5kPC9maWxlbmFtZT4sIDxmaWxlbmFtZT5fYXBwZW5kPC9maWxlbmFtZT4sCisgICAgICAgICAgICAgICAgYW5kIDxmaWxlbmFtZT5fcmVtb3ZlPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIHNob3dpbmcgaG93IHRvIHNldCB2YXJpYWJsZSBmbGFnczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEZPT1thXSA9ICJhYmMiCisgICAgIEZPT1tiXSA9ICIxMjMiCisgICAgIEZPT1thXSArPSAiNDU2IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgPGZpbGVuYW1lPkZPTzwvZmlsZW5hbWU+IGhhcyB0d28gZmxhZ3M6CisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmE8L2ZpbGVuYW1lPiBhbmQgPGZpbGVuYW1lPmI8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBUaGUgZmxhZ3MgYXJlIGltbWVkaWF0ZWx5IHNldCB0byAiYWJjIiBhbmQgIjEyMyIsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmE8L2ZpbGVuYW1lPiBmbGFnIGJlY29tZXMgImFiYyA0NTYiLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBObyBuZWVkIGV4aXN0cyB0byBwcmUtZGVmaW5lIHZhcmlhYmxlIGZsYWdzLgorICAgICAgICAgICAgICAgIFlvdSBjYW4gc2ltcGx5IHN0YXJ0IHVzaW5nIHRoZW0uCisgICAgICAgICAgICAgICAgT25lIGV4dHJlbWVseSBjb21tb24gYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICBpcyB0byBhdHRhY2ggc29tZSBicmllZiBkb2N1bWVudGF0aW9uIHRvIGEgQml0QmFrZSB2YXJpYWJsZSBhcworICAgICAgICAgICAgICAgIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBDQUNIRVtkb2NdID0gIlRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgY2FjaGUgb2YgdGhlIG1ldGFkYXRhLiIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0naW5saW5lLXB5dGhvbi12YXJpYWJsZS1leHBhbnNpb24nPgorICAgICAgICAgICAgPHRpdGxlPklubGluZSBQeXRob24gVmFyaWFibGUgRXhwYW5zaW9uPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgaW5saW5lIFB5dGhvbiB2YXJpYWJsZSBleHBhbnNpb24gdG8KKyAgICAgICAgICAgICAgICBzZXQgdmFyaWFibGVzLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIERBVEUgPSAiJHtAdGltZS5zdHJmdGltZSgnJVklbSVkJyx0aW1lLmdtdGltZSgpKX0iCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoaXMgZXhhbXBsZSByZXN1bHRzIGluIHRoZSA8ZmlsZW5hbWU+REFURTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdmFyaWFibGUgYmVpbmcgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFByb2JhYmx5IHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGV4dHJhY3QKKyAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgdmFyaWFibGVzIGZyb20gQml0QmFrZSdzIGludGVybmFsIGRhdGEgZGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbGluZXMgc2VsZWN0IHRoZSB2YWx1ZXMgb2YgYSBwYWNrYWdlIG5hbWUKKyAgICAgICAgICAgICAgICBhbmQgaXRzIHZlcnNpb24gbnVtYmVyLCByZXNwZWN0aXZlbHk6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBQTiA9ICIke0BiYi5wYXJzZS5CQkhhbmRsZXIudmFyc19mcm9tX2ZpbGUoZC5nZXRWYXIoJ0ZJTEUnLCBGYWxzZSksZClbMF0gb3IgJ2RlZmF1bHRwa2duYW1lJ30iCisgICAgIFBWID0gIiR7QGJiLnBhcnNlLkJCSGFuZGxlci52YXJzX2Zyb21fZmlsZShkLmdldFZhcignRklMRScsIEZhbHNlKSxkKVsxXSBvciAnMS4wJ30iCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3Byb3ZpZGluZy1wYXRobmFtZXMnPgorICAgICAgICAgICAgPHRpdGxlPlByb3ZpZGluZyBQYXRobmFtZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXaGVuIHNwZWNpZnlpbmcgcGF0aG5hbWVzIGZvciB1c2Ugd2l0aCBCaXRCYWtlLAorICAgICAgICAgICAgICAgIGRvIG5vdCB1c2UgdGhlIHRpbGRlICgifiIpIGNoYXJhY3RlciBhcyBhIHNob3J0Y3V0CisgICAgICAgICAgICAgICAgZm9yIHlvdXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgRG9pbmcgc28gbWlnaHQgY2F1c2UgQml0QmFrZSB0byBub3QgcmVjb2duaXplIHRoZQorICAgICAgICAgICAgICAgIHBhdGggc2luY2UgQml0QmFrZSBkb2VzIG5vdCBleHBhbmQgdGhpcyBjaGFyYWN0ZXIgaW4KKyAgICAgICAgICAgICAgICB0aGUgc2FtZSB3YXkgYSBzaGVsbCB3b3VsZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW5zdGVhZCwgcHJvdmlkZSBhIGZ1bGxlciBwYXRoIGFzIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICBleGFtcGxlIGlsbHVzdHJhdGVzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJMQVlFUlMgPz0gIiBcCisgICAgICAgL2hvbWUvc2NvdHQtbGVub3ZvL0xheWVyQSBcCisgICAgICAgIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSdjb25kaXRpb25hbC1zeW50YXgtb3ZlcnJpZGVzJz4KKyAgICAgICAgPHRpdGxlPkNvbmRpdGlvbmFsIFN5bnRheCAoT3ZlcnJpZGVzKTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIHVzZXMKKyAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1PVkVSUklERVMnPjxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIHRvIGNvbnRyb2wgd2hhdCB2YXJpYWJsZXMgYXJlIG92ZXJyaWRkZW4gYWZ0ZXIgQml0QmFrZQorICAgICAgICAgICAgcGFyc2VzIHJlY2lwZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICAgICAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB5b3UgY2FuIHVzZQorICAgICAgICAgICAgPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+IGFzIGNvbmRpdGlvbmFsIG1ldGFkYXRhLAorICAgICAgICAgICAgdGFsa3MgYWJvdXQga2V5IGV4cGFuc2lvbiBpbiByZWxhdGlvbnNoaXAgdG8KKyAgICAgICAgICAgIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPiwgYW5kIHByb3ZpZGVzIHNvbWUgZXhhbXBsZXMKKyAgICAgICAgICAgIHRvIGhlbHAgd2l0aCB1bmRlcnN0YW5kaW5nLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2NvbmRpdGlvbmFsLW1ldGFkYXRhJz4KKyAgICAgICAgICAgIDx0aXRsZT5Db25kaXRpb25hbCBNZXRhZGF0YTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPiB0byBjb25kaXRpb25hbGx5IHNlbGVjdAorICAgICAgICAgICAgICAgIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBhIHZhcmlhYmxlIGFuZCB0byBjb25kaXRpb25hbGx5CisgICAgICAgICAgICAgICAgYXBwZW5kIG9yIHByZXBlbmQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5TZWxlY3RpbmcgYSBWYXJpYWJsZTo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPiB2YXJpYWJsZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgYSBjb2xvbi1jaGFyYWN0ZXItc2VwYXJhdGVkIGxpc3QgdGhhdCBjb250YWlucyBpdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHdoaWNoIHlvdSB3YW50IHRvIHNhdGlzZnkgY29uZGl0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRodXMsIGlmIHlvdSBoYXZlIGEgdmFyaWFibGUgdGhhdCBpcyBjb25kaXRpb25hbCBvbiDigJxhcm3igJ0sIGFuZCDigJxhcm3igJ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPiwgdGhlbiB0aGUg4oCcYXJt4oCdLXNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSB2YXJpYWJsZSBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBub24tY29uZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIE9WRVJSSURFUyA9ICJhcmNoaXRlY3R1cmU6b3M6bWFjaGluZSIKKyAgICAgVEVTVCA9ICJkZWZhdWx0IgorICAgICBURVNUX29zID0gIm9zc3BlY2lmaWMiCisgICAgIFRFU1Rfbm9vdmVycmlkZSA9ICJvdGhlcmNvbmR2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgbGlzdHMgdGhyZWUgb3ZlcnJpZGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgImFyY2hpdGVjdHVyZSIsICJvcyIsIGFuZCAibWFjaGluZSIuCisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgPGZpbGVuYW1lPlRFU1Q8L2ZpbGVuYW1lPiBieSBpdHNlbGYgaGFzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgImRlZmF1bHQiLgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNlbGVjdCB0aGUgb3Mtc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgPGZpbGVuYW1lPlRFU1Q8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgYnkgYXBwZW5kaW5nIHRoZSAib3MiIG92ZXJyaWRlIHRvIHRoZSB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS48ZmlsZW5hbWU+VEVTVF9vczwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhpcywgY29uc2lkZXIgYSBwcmFjdGljYWwgZXhhbXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXNzdW1lcyBhbiBPcGVuRW1iZWRkZWQgbWV0YWRhdGEtYmFzZWQgTGludXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWwgcmVjaXBlIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBsaW5lcyBmcm9tIHRoZSByZWNpcGUgZmlsZSBmaXJzdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUga2VybmVsIGJyYW5jaCB2YXJpYWJsZSA8ZmlsZW5hbWU+S0JSQU5DSDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBkZWZhdWx0IHZhbHVlLCB0aGVuIGNvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGJhc2VkIG9uIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGJ1aWxkOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBLQlJBTkNIID0gInN0YW5kYXJkL2Jhc2UiCisgICAgIEtCUkFOQ0hfcWVtdWFybSAgPSAic3RhbmRhcmQvYXJtLXZlcnNhdGlsZS05MjZlanMiCisgICAgIEtCUkFOQ0hfcWVtdW1pcHMgPSAic3RhbmRhcmQvbXRpLW1hbHRhMzIiCisgICAgIEtCUkFOQ0hfcWVtdXBwYyAgPSAic3RhbmRhcmQvcWVtdXBwYyIKKyAgICAgS0JSQU5DSF9xZW11eDg2ICA9ICJzdGFuZGFyZC9jb21tb24tcGMvYmFzZSIKKyAgICAgS0JSQU5DSF9xZW11eDg2LTY0ICA9ICJzdGFuZGFyZC9jb21tb24tcGMtNjQvYmFzZSIKKyAgICAgS0JSQU5DSF9xZW11bWlwczY0ID0gInN0YW5kYXJkL210aS1tYWx0YTY0IgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+QXBwZW5kaW5nIGFuZCBQcmVwZW5kaW5nOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGFsc28gc3VwcG9ydHMgYXBwZW5kIGFuZCBwcmVwZW5kIG9wZXJhdGlvbnMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHZhbHVlcyBiYXNlZCBvbiB3aGV0aGVyIGEgc3BlY2lmaWMgaXRlbSBpcworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVkIGluIDxmaWxlbmFtZT5PVkVSUklERVM8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgREVQRU5EUyA9ICJnbGliYyBuY3Vyc2VzIgorICAgICBPVkVSUklERVMgPSAibWFjaGluZTpsb2NhbCIKKyAgICAgREVQRU5EU19hcHBlbmRfbWFjaGluZSA9ICJsaWJtYWQiCisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIDxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT4gYmVjb21lcworICAgICAgICAgICAgICAgICAgICAgICAgImdsaWJjIG5jdXJzZXMgbGlibWFkIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdhaW4sIHVzaW5nIGFuIE9wZW5FbWJlZGRlZCBtZXRhZGF0YS1iYXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCByZWNpcGUgZmlsZSBhcyBhbiBleGFtcGxlLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgbGluZXMgd2lsbCBjb25kaXRpb25hbGx5IGFwcGVuZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+S0VSTkVMX0ZFQVRVUkVTPC9maWxlbmFtZT4gdmFyaWFibGUgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgYXJjaGl0ZWN0dXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBLRVJORUxfRkVBVFVSRVNfYXBwZW5kID0gIiAke0tFUk5FTF9FWFRSQV9GRUFUVVJFU30iCisgICAgIEtFUk5FTF9GRUFUVVJFU19hcHBlbmRfcWVtdXg4Nj0iIGNmZy9zb3VuZC5zY2MgY2ZnL3BhcmF2aXJ0X2t2bS5zY2MiCisgICAgIEtFUk5FTF9GRUFUVVJFU19hcHBlbmRfcWVtdXg4Ni02ND0iIGNmZy9zb3VuZC5zY2MgY2ZnL3BhcmF2aXJ0X2t2bS5zY2MiCisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdrZXktZXhwYW5zaW9uJz4KKyAgICAgICAgICAgIDx0aXRsZT5LZXkgRXhwYW5zaW9uPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgS2V5IGV4cGFuc2lvbiBoYXBwZW5zIHdoZW4gdGhlIEJpdEJha2UgZGF0YXN0b3JlIGlzIGZpbmFsaXplZAorICAgICAgICAgICAgICAgIGp1c3QgYmVmb3JlIEJpdEJha2UgZXhwYW5kcyBvdmVycmlkZXMuCisgICAgICAgICAgICAgICAgVG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhpcywgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQSR7Qn0gPSAiWCIKKyAgICAgQiA9ICIyIgorICAgICBBMiA9ICJZIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFmdGVyIGFsbCB0aGUgcGFyc2luZyBpcyBjb21wbGV0ZSwgYW5kCisgICAgICAgICAgICAgICAgYmVmb3JlIGFueSBvdmVycmlkZXMgYXJlIGhhbmRsZWQsIEJpdEJha2UgZXhwYW5kcworICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4ke0J9PC9maWxlbmFtZT4gaW50byAiMiIuCisgICAgICAgICAgICAgICAgVGhpcyBleHBhbnNpb24gY2F1c2VzIDxmaWxlbmFtZT5BMjwvZmlsZW5hbWU+LCB3aGljaCB3YXMKKyAgICAgICAgICAgICAgICBzZXQgdG8gIlkiIGJlZm9yZSB0aGUgZXhwYW5zaW9uLCB0byBiZWNvbWUgIlgiLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3ZhcmlhYmxlLWludGVyYWN0aW9uLXdvcmtlZC1leGFtcGxlcyc+CisgICAgICAgICAgICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBEZXNwaXRlIHRoZSBwcmV2aW91cyBleHBsYW5hdGlvbnMgdGhhdCBzaG93IHRoZSBkaWZmZXJlbnQgZm9ybXMgb2YKKyAgICAgICAgICAgICAgICB2YXJpYWJsZSBkZWZpbml0aW9ucywgaXQgY2FuIGJlIGhhcmQgdG8gd29yaworICAgICAgICAgICAgICAgIG91dCBleGFjdGx5IHdoYXQgaGFwcGVucyB3aGVuIHZhcmlhYmxlIG9wZXJhdG9ycywgY29uZGl0aW9uYWwKKyAgICAgICAgICAgICAgICBvdmVycmlkZXMsIGFuZCB1bmNvbmRpdGlvbmFsIG92ZXJyaWRlcyBhcmUgY29tYmluZWQuCisgICAgICAgICAgICAgICAgVGhpcyBzZWN0aW9uIHByZXNlbnRzIHNvbWUgY29tbW9uIHNjZW5hcmlvcyBhbG9uZworICAgICAgICAgICAgICAgIHdpdGggZXhwbGFuYXRpb25zIGZvciB2YXJpYWJsZSBpbnRlcmFjdGlvbnMgdGhhdAorICAgICAgICAgICAgICAgIHR5cGljYWxseSBjb25mdXNlIHVzZXJzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVyZSBpcyBvZnRlbiBjb25mdXNpb24gY29uY2VybmluZyB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgICAgICAgICAgICAgICBvdmVycmlkZXMgYW5kIHZhcmlvdXMgImFwcGVuZCIgb3BlcmF0b3JzIHRha2UgZWZmZWN0LgorICAgICAgICAgICAgICAgIFJlY2FsbCB0aGF0IGFuIGFwcGVuZCBvciBwcmVwZW5kIG9wZXJhdGlvbiB1c2luZyAiX2FwcGVuZCIKKyAgICAgICAgICAgICAgICBhbmQgIl9wcmVwZW5kIiBkb2VzIG5vdCByZXN1bHQgaW4gYW4gaW1tZWRpYXRlIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICBhcyB3b3VsZCAiKz0iLCAiLj0iLCAiPSsiLCBvciAiPS4iLgorICAgICAgICAgICAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIE9WRVJSSURFUyA9ICJmb28iCisgICAgIEEgPSAiWiIKKyAgICAgQV9mb29fYXBwZW5kID0gIlgiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEZvciB0aGlzIGNhc2UsIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gaXMKKyAgICAgICAgICAgICAgICB1bmNvbmRpdGlvbmFsbHkgc2V0IHRvICJaIiBhbmQgIlgiIGlzCisgICAgICAgICAgICAgICAgdW5jb25kaXRpb25hbGx5IGFuZCBpbW1lZGlhdGVseSBhcHBlbmRlZCB0byB0aGUgdmFyaWFibGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QV9mb288L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBCZWNhdXNlIG92ZXJyaWRlcyBoYXZlIG5vdCBiZWVuIGFwcGxpZWQgeWV0LAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5BX2ZvbzwvZmlsZW5hbWU+IGlzIHNldCB0byAiWCIgZHVlIHRvIHRoZSBhcHBlbmQKKyAgICAgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBzaW1wbHkgZXF1YWxzICJaIi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXBwbHlpbmcgb3ZlcnJpZGVzLCBob3dldmVyLCBjaGFuZ2VzIHRoaW5ncy4KKyAgICAgICAgICAgICAgICBTaW5jZSAiZm9vIiBpcyBsaXN0ZWQgaW4gPGZpbGVuYW1lPk9WRVJSSURFUzwvZmlsZW5hbWU+LAorICAgICAgICAgICAgICAgIHRoZSBjb25kaXRpb25hbCB2YXJpYWJsZSA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+IGlzIHJlcGxhY2VkCisgICAgICAgICAgICAgICAgd2l0aCB0aGUgImZvbyIgdmVyc2lvbiwgd2hpY2ggaXMgZXF1YWwgdG8gIlgiLgorICAgICAgICAgICAgICAgIFNvIGVmZmVjdGl2ZWx5LCA8ZmlsZW5hbWU+QV9mb288L2ZpbGVuYW1lPiByZXBsYWNlcyA8ZmlsZW5hbWU+QTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIG5leHQgZXhhbXBsZSBjaGFuZ2VzIHRoZSBvcmRlciBvZiB0aGUgb3ZlcnJpZGUgYW5kCisgICAgICAgICAgICAgICAgdGhlIGFwcGVuZDoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIE9WRVJSSURFUyA9ICJmb28iCisgICAgIEEgPSAiWiIKKyAgICAgQV9hcHBlbmRfZm9vID0gIlgiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEZvciB0aGlzIGNhc2UsIGJlZm9yZSBvdmVycmlkZXMgYXJlIGhhbmRsZWQsCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcyBzZXQgdG8gIloiIGFuZCA8ZmlsZW5hbWU+QV9hcHBlbmRfZm9vPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBpcyBzZXQgdG8gIlgiLgorICAgICAgICAgICAgICAgIE9uY2UgdGhlIG92ZXJyaWRlIGZvciAiZm9vIiBpcyBhcHBsaWVkLCBob3dldmVyLAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gZ2V0cyBhcHBlbmRlZCB3aXRoICJYIi4KKyAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gYmVjb21lcyAiWlgiLgorICAgICAgICAgICAgICAgIE5vdGljZSB0aGF0IHNwYWNlcyBhcmUgbm90IGFwcGVuZGVkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIG5leHQgZXhhbXBsZSBoYXMgdGhlIG9yZGVyIG9mIHRoZSBhcHBlbmRzIGFuZCBvdmVycmlkZXMgcmV2ZXJzZWQKKyAgICAgICAgICAgICAgICBiYWNrIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgT1ZFUlJJREVTID0gImZvbyIKKyAgICAgQSA9ICJZIgorICAgICBBX2Zvb19hcHBlbmQgPSAiWiIKKyAgICAgQV9mb29fYXBwZW5kICs9ICJYIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBGb3IgdGhpcyBjYXNlLCBiZWZvcmUgYW55IG92ZXJyaWRlcyBhcmUgcmVzb2x2ZWQsCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcyBzZXQgdG8gIlkiIHVzaW5nIGFuIGltbWVkaWF0ZSBhc3NpZ25tZW50LgorICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgaW1tZWRpYXRlIGFzc2lnbm1lbnQsIDxmaWxlbmFtZT5BX2ZvbzwvZmlsZW5hbWU+IGlzIHNldAorICAgICAgICAgICAgICAgIHRvICJaIiwgYW5kIHRoZW4gZnVydGhlciBhcHBlbmRlZCB3aXRoCisgICAgICAgICAgICAgICAgIlgiIGxlYXZpbmcgdGhlIHZhcmlhYmxlIHNldCB0byAiWiBYIi4KKyAgICAgICAgICAgICAgICBGaW5hbGx5LCBhcHBseWluZyB0aGUgb3ZlcnJpZGUgZm9yICJmb28iIHJlc3VsdHMgaW4gdGhlIGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgdmFyaWFibGUgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBiZWNvbWluZyAiWiBYIiAoaS5lLgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gaXMgcmVwbGFjZWQgd2l0aCA8ZmlsZW5hbWU+QV9mb288L2ZpbGVuYW1lPikuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgZmluYWwgZXhhbXBsZSBtaXhlcyBpbiBzb21lIHZhcnlpbmcgb3BlcmF0b3JzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQSA9ICIxIgorICAgICBBX2FwcGVuZCA9ICIyIgorICAgICBBX2FwcGVuZCA9ICIzIgorICAgICBBICs9ICI0IgorICAgICBBIC49ICI1IgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBGb3IgdGhpcyBjYXNlLCB0aGUgdHlwZSBvZiBhcHBlbmQgb3BlcmF0b3JzIGFyZSBhZmZlY3RpbmcgdGhlCisgICAgICAgICAgICAgICAgb3JkZXIgb2YgYXNzaWdubWVudHMgYXMgQml0QmFrZSBwYXNzZXMgdGhyb3VnaCB0aGUgY29kZQorICAgICAgICAgICAgICAgIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAgICAgICAgIEluaXRpYWxseSwgPGZpbGVuYW1lPkE8L2ZpbGVuYW1lPiBpcyBzZXQgdG8gIjEgNDUiIGJlY2F1c2UKKyAgICAgICAgICAgICAgICBvZiB0aGUgdGhyZWUgc3RhdGVtZW50cyB0aGF0IHVzZSBpbW1lZGlhdGUgb3BlcmF0b3JzLgorICAgICAgICAgICAgICAgIEFmdGVyIHRoZXNlIGFzc2lnbm1lbnRzIGFyZSBtYWRlLCBCaXRCYWtlIGFwcGxpZXMgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPl9hcHBlbmQ8L2ZpbGVuYW1lPiBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgIFRob3NlIG9wZXJhdGlvbnMgcmVzdWx0IGluIDxmaWxlbmFtZT5BPC9maWxlbmFtZT4gYmVjb21pbmcgIjEgNDUyMyIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nc2hhcmluZy1mdW5jdGlvbmFsaXR5Jz4KKyAgICAgICAgPHRpdGxlPlNoYXJpbmcgRnVuY3Rpb25hbGl0eTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGFsbG93cyBmb3IgbWV0YWRhdGEgc2hhcmluZyB0aHJvdWdoIGluY2x1ZGUgZmlsZXMKKyAgICAgICAgICAgICg8ZmlsZW5hbWU+LmluYzwvZmlsZW5hbWU+KSBhbmQgY2xhc3MgZmlsZXMKKyAgICAgICAgICAgICg8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPikuCisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSBhIHBpZWNlIG9mIGNvbW1vbiBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICBzdWNoIGFzIGEgdGFzayBkZWZpbml0aW9uIHRoYXQgeW91IHdhbnQgdG8gc2hhcmUgYmV0d2VlbgorICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSByZWNpcGUuCisgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGNyZWF0aW5nIGEgPGZpbGVuYW1lPi5iYmNsYXNzPC9maWxlbmFtZT4KKyAgICAgICAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgYW5kIHRoZW4gdXNpbmcKKyAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+aW5oZXJpdDwvZmlsZW5hbWU+IGRpcmVjdGl2ZSBpbiB5b3VyIHJlY2lwZXMgdG8KKyAgICAgICAgICAgIGluaGVyaXQgdGhlIGNsYXNzIHdvdWxkIGJlIGEgY29tbW9uIHdheSB0byBzaGFyZSB0aGUgdGFzay4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBzZWN0aW9uIHByZXNlbnRzIHRoZSBtZWNoYW5pc21zIEJpdEJha2UgcHJvdmlkZXMgdG8KKyAgICAgICAgICAgIGFsbG93IHlvdSB0byBzaGFyZSBmdW5jdGlvbmFsaXR5IGJldHdlZW4gcmVjaXBlcy4KKyAgICAgICAgICAgIFNwZWNpZmljYWxseSwgdGhlIG1lY2hhbmlzbXMgaW5jbHVkZSA8ZmlsZW5hbWU+aW5jbHVkZTwvZmlsZW5hbWU+LAorICAgICAgICAgICAgPGZpbGVuYW1lPmluaGVyaXQ8L2ZpbGVuYW1lPiwgPGZpbGVuYW1lPklOSEVSSVQ8L2ZpbGVuYW1lPiwgYW5kCisgICAgICAgICAgICA8ZmlsZW5hbWU+cmVxdWlyZTwvZmlsZW5hbWU+IGRpcmVjdGl2ZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0nbG9jYXRpbmctaW5jbHVkZS1hbmQtY2xhc3MtZmlsZXMnPgorICAgICAgICAgICAgPHRpdGxlPkxvY2F0aW5nIEluY2x1ZGUgYW5kIENsYXNzIEZpbGVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQlBBVEgnPjxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICB2YXJpYWJsZSB0byBsb2NhdGUgbmVlZGVkIGluY2x1ZGUgYW5kIGNsYXNzIGZpbGVzLgorICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+QkJQQVRIPC9maWxlbmFtZT4gdmFyaWFibGUgaXMgYW5hbG9nb3VzIHRvCisgICAgICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIG9yZGVyIGZvciBpbmNsdWRlIGFuZCBjbGFzcyBmaWxlcyB0byBiZSBmb3VuZCBieSBCaXRCYWtlLAorICAgICAgICAgICAgICAgIHRoZXkgbmVlZCB0byBiZSBsb2NhdGVkIGluIGEgImNsYXNzZXMiIHN1YmRpcmVjdG9yeSB0aGF0IGNhbgorICAgICAgICAgICAgICAgIGJlIGZvdW5kIGluIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdpbmhlcml0LWRpcmVjdGl2ZSc+CisgICAgICAgICAgICA8dGl0bGU+PGZpbGVuYW1lPmluaGVyaXQ8L2ZpbGVuYW1lPiBEaXJlY3RpdmU8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXaGVuIHdyaXRpbmcgYSByZWNpcGUgb3IgY2xhc3MgZmlsZSwgeW91IGNhbiB1c2UgdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmluaGVyaXQ8L2ZpbGVuYW1lPiBkaXJlY3RpdmUgdG8gaW5oZXJpdCB0aGUKKyAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5IG9mIGEgY2xhc3MgKDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIG9ubHkgc3VwcG9ydHMgdGhpcyBkaXJlY3RpdmUgd2hlbiB1c2VkIHdpdGhpbiByZWNpcGUKKyAgICAgICAgICAgICAgICBhbmQgY2xhc3MgZmlsZXMgKGkuZS4gPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4uYmJjbGFzczwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5pbmhlcml0PC9maWxlbmFtZT4gZGlyZWN0aXZlIGlzIGEgcnVkaW1lbnRhcnkKKyAgICAgICAgICAgICAgICBtZWFucyBvZiBzcGVjaWZ5aW5nIHdoYXQgY2xhc3NlcyBvZiBmdW5jdGlvbmFsaXR5IHlvdXIKKyAgICAgICAgICAgICAgICByZWNpcGVzIHJlcXVpcmUuCisgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZWFzaWx5IGFic3RyYWN0IG91dCB0aGUgdGFza3MgaW52b2x2ZWQgaW4KKyAgICAgICAgICAgICAgICBidWlsZGluZyBhIHBhY2thZ2UgdGhhdCB1c2VzIEF1dG9jb25mIGFuZCBBdXRvbWFrZSBhbmQgcHV0CisgICAgICAgICAgICAgICAgdGhvc2UgdGFza3MgaW50byBhIGNsYXNzIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCBieSB5b3VyIHJlY2lwZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXMgYW4gZXhhbXBsZSwgeW91ciByZWNpcGVzIGNvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZQorICAgICAgICAgICAgICAgIHRvIGluaGVyaXQgYW4gPGZpbGVuYW1lPmF1dG90b29scy5iYmNsYXNzPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICBUaGUgY2xhc3MgZmlsZSB3b3VsZCBjb250YWluIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciB1c2luZworICAgICAgICAgICAgICAgIEF1dG90b29scyB0aGF0IGNvdWxkIGJlIHNoYXJlZCBhY3Jvc3MgcmVjaXBlczoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGluaGVyaXQgYXV0b3Rvb2xzCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgQml0QmFrZSB3b3VsZCBzZWFyY2ggZm9yIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Y2xhc3Nlcy9hdXRvdG9vbHMuYmJjbGFzczwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgaW4gPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIG92ZXJyaWRlIGFueSB2YWx1ZXMgYW5kIGZ1bmN0aW9ucyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkIGNsYXNzIHdpdGhpbiB5b3VyIHJlY2lwZSBieSBkb2luZyBzbworICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgImluaGVyaXQiIHN0YXRlbWVudC4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0naW5jbHVkZS1kaXJlY3RpdmUnPgorICAgICAgICAgICAgPHRpdGxlPjxmaWxlbmFtZT5pbmNsdWRlPC9maWxlbmFtZT4gRGlyZWN0aXZlPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1bmRlcnN0YW5kcyB0aGUgPGZpbGVuYW1lPmluY2x1ZGU8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGRpcmVjdGl2ZS4KKyAgICAgICAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSBjYXVzZXMgQml0QmFrZSB0byBwYXJzZSB3aGF0ZXZlciBmaWxlIHlvdSBzcGVjaWZ5LAorICAgICAgICAgICAgICAgIGFuZCB0byBpbnNlcnQgdGhhdCBmaWxlIGF0IHRoYXQgbG9jYXRpb24uCisgICAgICAgICAgICAgICAgVGhlIGRpcmVjdGl2ZSBpcyBtdWNoIGxpa2UgaXRzIGVxdWl2YWxlbnQgaW4gTWFrZSBleGNlcHQKKyAgICAgICAgICAgICAgICB0aGF0IGlmIHRoZSBwYXRoIHNwZWNpZmllZCBvbiB0aGUgaW5jbHVkZSBsaW5lIGlzIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAgICBwYXRoLCBCaXRCYWtlIGxvY2F0ZXMgdGhlIGZpcnN0IGZpbGUgaXQgY2FuIGZpbmQKKyAgICAgICAgICAgICAgICB3aXRoaW4gPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCBzdXBwb3NlIHlvdSBuZWVkZWQgYSByZWNpcGUgdG8gaW5jbHVkZSBzb21lCisgICAgICAgICAgICAgICAgc2VsZi10ZXN0IGRlZmluaXRpb25zOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgaW5jbHVkZSB0ZXN0X2RlZnMuaW5jCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPmluY2x1ZGU8L2ZpbGVuYW1lPiBkaXJlY3RpdmUgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjZSBhbiBlcnJvciB3aGVuIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGlmIHRoZSBmaWxlIHlvdQorICAgICAgICAgICAgICAgICAgICBhcmUgaW5jbHVkaW5nIGlzIGV4cGVjdGVkIHRvIGV4aXN0LCB5b3Ugc2hvdWxkIHVzZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSdyZXF1aXJlLWluY2x1c2lvbic+PGZpbGVuYW1lPnJlcXVpcmU8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiA8ZmlsZW5hbWU+aW5jbHVkZTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBEb2luZyBzbyBtYWtlcyBzdXJlIHRoYXQgYW4gZXJyb3IgaXMgcHJvZHVjZWQgaWYgdGhlCisgICAgICAgICAgICAgICAgICAgIGZpbGUgY2Fubm90IGJlIGZvdW5kLgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdyZXF1aXJlLWluY2x1c2lvbic+CisgICAgICAgICAgICA8dGl0bGU+PGZpbGVuYW1lPnJlcXVpcmU8L2ZpbGVuYW1lPiBEaXJlY3RpdmU8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIHVuZGVyc3RhbmRzIHRoZSA8ZmlsZW5hbWU+cmVxdWlyZTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgZGlyZWN0aXZlLgorICAgICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGJlaGF2ZXMganVzdCBsaWtlIHRoZQorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5pbmNsdWRlPC9maWxlbmFtZT4gZGlyZWN0aXZlIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0CisgICAgICAgICAgICAgICAgQml0QmFrZSByYWlzZXMgYSBwYXJzaW5nIGVycm9yIGlmIHRoZSBmaWxlIHRvIGJlIGluY2x1ZGVkIGNhbm5vdAorICAgICAgICAgICAgICAgIGJlIGZvdW5kLgorICAgICAgICAgICAgICAgIFRodXMsIGFueSBmaWxlIHlvdSByZXF1aXJlIGlzIGluc2VydGVkIGludG8gdGhlIGZpbGUgdGhhdCBpcworICAgICAgICAgICAgICAgIGJlaW5nIHBhcnNlZCBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU2ltaWxhciB0byBob3cgQml0QmFrZSBoYW5kbGVzCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0naW5jbHVkZS1kaXJlY3RpdmUnPjxmaWxlbmFtZT5pbmNsdWRlPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgIGlmIHRoZSBwYXRoIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIG9uIHRoZSByZXF1aXJlIGxpbmUgaXMgYSByZWxhdGl2ZSBwYXRoLCBCaXRCYWtlIGxvY2F0ZXMKKyAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZmlsZSBpdCBjYW4gZmluZCB3aXRoaW4gPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIHR3byB2ZXJzaW9ucyBvZiBhIHJlY2lwZQorICAgICAgICAgICAgICAgIChlLmcuIDxmaWxlbmFtZT5mb29fMS4yLjIuYmI8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Zm9vXzIuMC4wLmJiPC9maWxlbmFtZT4pIHdoZXJlCisgICAgICAgICAgICAgICAgZWFjaCB2ZXJzaW9uIGNvbnRhaW5zIHNvbWUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgdGhhdCBjb3VsZCBiZQorICAgICAgICAgICAgICAgIHNoYXJlZC4KKyAgICAgICAgICAgICAgICBZb3UgY291bGQgY3JlYXRlIGFuIGluY2x1ZGUgZmlsZSBuYW1lZCA8ZmlsZW5hbWU+Zm9vLmluYzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29tbW9uIGRlZmluaXRpb25zIG5lZWRlZCB0byBidWlsZCAiZm9vIi4KKyAgICAgICAgICAgICAgICBZb3UgbmVlZCB0byBiZSBzdXJlIDxmaWxlbmFtZT5mb28uaW5jPC9maWxlbmFtZT4gaXMgbG9jYXRlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIHR3byByZWNpcGUgZmlsZXMgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBPbmNlIHRoZXNlIGNvbmRpdGlvbnMgYXJlIHNldCB1cCwgeW91IGNhbiBzaGFyZSB0aGUgZnVuY3Rpb25hbGl0eQorICAgICAgICAgICAgICAgIHVzaW5nIGEgPGZpbGVuYW1lPnJlcXVpcmU8L2ZpbGVuYW1lPiBkaXJlY3RpdmUgZnJvbSB3aXRoaW4gZWFjaAorICAgICAgICAgICAgICAgIHJlY2lwZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIHJlcXVpcmUgZm9vLmluYworICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdpbmhlcml0LWNvbmZpZ3VyYXRpb24tZGlyZWN0aXZlJz4KKyAgICAgICAgICAgIDx0aXRsZT48ZmlsZW5hbWU+SU5IRVJJVDwvZmlsZW5hbWU+IENvbmZpZ3VyYXRpb24gRGlyZWN0aXZlPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiBjcmVhdGluZyBhIGNvbmZpZ3VyYXRpb24gZmlsZSAoPGZpbGVuYW1lPi5jb25mPC9maWxlbmFtZT4pLAorICAgICAgICAgICAgICAgIHlvdSBjYW4gdXNlIHRoZSA8ZmlsZW5hbWU+SU5IRVJJVDwvZmlsZW5hbWU+IGRpcmVjdGl2ZSB0bworICAgICAgICAgICAgICAgIGluaGVyaXQgYSBjbGFzcy4KKyAgICAgICAgICAgICAgICBCaXRCYWtlIG9ubHkgc3VwcG9ydHMgdGhpcyBkaXJlY3RpdmUgd2hlbiB1c2VkIHdpdGhpbgorICAgICAgICAgICAgICAgIGEgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCBzdXBwb3NlIHlvdSBuZWVkZWQgdG8gaW5oZXJpdCBhIGNsYXNzCisgICAgICAgICAgICAgICAgZmlsZSBjYWxsZWQgPGZpbGVuYW1lPmFiYy5iYmNsYXNzPC9maWxlbmFtZT4gZnJvbSBhCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBJTkhFUklUICs9ICJhYmMiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoaXMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgY2F1c2VzIHRoZSBuYW1lZAorICAgICAgICAgICAgICAgIGNsYXNzIHRvIGJlIGluaGVyaXRlZCBhdCB0aGUgcG9pbnQgb2YgdGhlIGRpcmVjdGl2ZQorICAgICAgICAgICAgICAgIGR1cmluZyBwYXJzaW5nLgorICAgICAgICAgICAgICAgIEFzIHdpdGggdGhlIDxmaWxlbmFtZT5pbmhlcml0PC9maWxlbmFtZT4gZGlyZWN0aXZlLCB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPiBmaWxlIG11c3QgYmUgbG9jYXRlZCBpbiBhCisgICAgICAgICAgICAgICAgImNsYXNzZXMiIHN1YmRpcmVjdG9yeSBpbiBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIGluIDxmaWxlbmFtZT5CQlBBVEg8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgQmVjYXVzZSA8ZmlsZW5hbWU+LmNvbmY8L2ZpbGVuYW1lPiBmaWxlcyBhcmUgcGFyc2VkCisgICAgICAgICAgICAgICAgICAgIGZpcnN0IGR1cmluZyBCaXRCYWtlJ3MgZXhlY3V0aW9uLCB1c2luZworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+SU5IRVJJVDwvZmlsZW5hbWU+IHRvIGluaGVyaXQgYSBjbGFzcyBlZmZlY3RpdmVseQorICAgICAgICAgICAgICAgICAgICBpbmhlcml0cyB0aGUgY2xhc3MgZ2xvYmFsbHkgKGkuZS4gZm9yIGFsbCByZWNpcGVzKS4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nZnVuY3Rpb25zJz4KKyAgICAgICAgPHRpdGxlPkZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyB3aXRoIG1vc3QgbGFuZ3VhZ2VzLCBmdW5jdGlvbnMgYXJlIHRoZSBidWlsZGluZyBibG9ja3MgdGhhdAorICAgICAgICAgICAgYXJlIHVzZWQgdG8gYnVpbGQgdXAgb3BlcmF0aW9ucyBpbnRvIHRhc2tzLgorICAgICAgICAgICAgQml0QmFrZSBzdXBwb3J0cyB0aGVzZSB0eXBlcyBvZiBmdW5jdGlvbnM6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+U2hlbGwgRnVuY3Rpb25zOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB3cml0dGVuIGluIHNoZWxsIHNjcmlwdCBhbmQgZXhlY3V0ZWQgZWl0aGVyCisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IGFzIGZ1bmN0aW9ucywgdGFza3MsIG9yIGJvdGguCisgICAgICAgICAgICAgICAgICAgIFRoZXkgY2FuIGFsc28gYmUgY2FsbGVkIGJ5IG90aGVyIHNoZWxsIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5CaXRCYWtlIFN0eWxlIFB5dGhvbiBGdW5jdGlvbnM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25zIHdyaXR0ZW4gaW4gUHl0aG9uIGFuZCBleGVjdXRlZCBieSBCaXRCYWtlIG9yIG90aGVyCisgICAgICAgICAgICAgICAgICAgIFB5dGhvbiBmdW5jdGlvbnMgdXNpbmcgPGZpbGVuYW1lPmJiLmJ1aWxkLmV4ZWNfZnVuYygpPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+UHl0aG9uIEZ1bmN0aW9uczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgd3JpdHRlbiBpbiBQeXRob24gYW5kIGV4ZWN1dGVkIGJ5IFB5dGhvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5Bbm9ueW1vdXMgUHl0aG9uIEZ1bmN0aW9uczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBQeXRob24gZnVuY3Rpb25zIGV4ZWN1dGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIGZ1bmN0aW9uLCB5b3UgY2FuIG9ubHkKKyAgICAgICAgICAgIGRlZmluZSB0aGVtIGluIGNsYXNzICg8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPikKKyAgICAgICAgICAgIGFuZCByZWNpcGUgKDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPiBvciA8ZmlsZW5hbWU+LmluYzwvZmlsZW5hbWU+KQorICAgICAgICAgICAgZmlsZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0nc2hlbGwtZnVuY3Rpb25zJz4KKyAgICAgICAgICAgIDx0aXRsZT5TaGVsbCBGdW5jdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBGdW5jdGlvbnMgd3JpdHRlbiBpbiBzaGVsbCBzY3JpcHQgYW5kIGV4ZWN1dGVkIGVpdGhlcgorICAgICAgICAgICAgICAgIGRpcmVjdGx5IGFzIGZ1bmN0aW9ucywgdGFza3MsIG9yIGJvdGguCisgICAgICAgICAgICAgICAgVGhleSBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgb3RoZXIgc2hlbGwgZnVuY3Rpb25zLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBzaGVsbCBmdW5jdGlvbiBkZWZpbml0aW9uOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgc29tZV9mdW5jdGlvbiAoKSB7CisgICAgICAgICBlY2hvICJIZWxsbyBXb3JsZCIKKyAgICAgfQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBXaGVuIHlvdSBjcmVhdGUgdGhlc2UgdHlwZXMgb2YgZnVuY3Rpb25zIGluIHlvdXIgcmVjaXBlCisgICAgICAgICAgICAgICAgb3IgY2xhc3MgZmlsZXMsIHlvdSBuZWVkIHRvIGZvbGxvdyB0aGUgc2hlbGwgcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgICAgICBydWxlcy4KKyAgICAgICAgICAgICAgICBUaGUgc2NyaXB0cyBhcmUgZXhlY3V0ZWQgYnkgPGZpbGVuYW1lPi9iaW4vc2g8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICB3aGljaCBtYXkgbm90IGJlIGEgYmFzaCBzaGVsbCBidXQgbWlnaHQgYmUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgc3VjaCBhcyA8ZmlsZW5hbWU+ZGFzaDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgbm90IHVzZSBCYXNoLXNwZWNpZmljIHNjcmlwdCAoYmFzaGlzbXMpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2JpdGJha2Utc3R5bGUtcHl0aG9uLWZ1bmN0aW9ucyc+CisgICAgICAgICAgICA8dGl0bGU+Qml0QmFrZSBTdHlsZSBQeXRob24gRnVuY3Rpb25zPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSB3cml0dGVuIGluIFB5dGhvbiBhbmQgZXhlY3V0ZWQgYnkKKyAgICAgICAgICAgICAgICBCaXRCYWtlIG9yIG90aGVyIFB5dGhvbiBmdW5jdGlvbnMgdXNpbmcKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuYnVpbGQuZXhlY19mdW5jKCk8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBCaXRCYWtlIGZ1bmN0aW9uIGlzOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgcHl0aG9uIHNvbWVfcHl0aG9uX2Z1bmN0aW9uICgpIHsKKyAgICAgICAgIGQuc2V0VmFyKCJURVhUIiwgIkhlbGxvIFdvcmxkIikKKyAgICAgICAgIHByaW50IGQuZ2V0VmFyKCJURVhUIiwgVHJ1ZSkKKyAgICAgfQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBCZWNhdXNlIHRoZSBQeXRob24gImJiIiBhbmQgIm9zIiBtb2R1bGVzIGFyZSBhbHJlYWR5CisgICAgICAgICAgICAgICAgaW1wb3J0ZWQsIHlvdSBkbyBub3QgbmVlZCB0byBpbXBvcnQgdGhlc2UgbW9kdWxlcy4KKyAgICAgICAgICAgICAgICBBbHNvIGluIHRoZXNlIHR5cGVzIG9mIGZ1bmN0aW9ucywgdGhlIGRhdGFzdG9yZSAoImQiKQorICAgICAgICAgICAgICAgIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIGFuZCBpcyBhbHdheXMgYXV0b21hdGljYWxseQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4KKyAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3B5dGhvbi1mdW5jdGlvbnMnPgorICAgICAgICAgICAgPHRpdGxlPlB5dGhvbiBGdW5jdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHdyaXR0ZW4gaW4gUHl0aG9uIGFuZCBhcmUgZXhlY3V0ZWQgYnkKKyAgICAgICAgICAgICAgICBvdGhlciBQeXRob24gY29kZS4KKyAgICAgICAgICAgICAgICBFeGFtcGxlcyBvZiBQeXRob24gZnVuY3Rpb25zIGFyZSB1dGlsaXR5IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgIHRoYXQgeW91IGludGVuZCB0byBjYWxsIGZyb20gaW4tbGluZSBQeXRob24gb3IKKyAgICAgICAgICAgICAgICBmcm9tIHdpdGhpbiBvdGhlciBQeXRob24gZnVuY3Rpb25zLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRlZiBnZXRfZGVwZW5kcyhkKToKKyAgICAgICAgIGlmIGQuZ2V0VmFyKCdTT01FQ09ORElUSU9OJywgVHJ1ZSk6CisgICAgICAgICAgICAgcmV0dXJuICJkZXBlbmRlbmN5d2l0aGNvbmQiCisgICAgICAgICBlbHNlOgorICAgICAgICAgICAgIHJldHVybiAiZGVwZW5kZW5jeSIKKyAgICAgU09NRUNPTkRJVElPTiA9ICIxIgorICAgICBERVBFTkRTID0gIiR7QGdldF9kZXBlbmRzKGQpfSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhpcyB3b3VsZCByZXN1bHQgaW4gPGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgPGZpbGVuYW1lPmRlcGVuZGVuY3l3aXRoY29uZDwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIHRoaW5ncyB0byBrbm93IGFib3V0IFB5dGhvbiBmdW5jdGlvbnM6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPlB5dGhvbiBmdW5jdGlvbnMgY2FuIHRha2UgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIEJpdEJha2UgZGF0YXN0b3JlIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIHlvdSBtdXN0IHBhc3MgaXQgaW4gYXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlICJiYiIgYW5kICJvcyIgUHl0aG9uIG1vZHVsZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBkbyBub3QgbmVlZCB0byBpbXBvcnQgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2Fub255bW91cy1weXRob24tZnVuY3Rpb25zJz4KKyAgICAgICAgICAgIDx0aXRsZT5Bbm9ueW1vdXMgUHl0aG9uIEZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gcnVuIHNvbWUgY29kZSBkdXJpbmcKKyAgICAgICAgICAgICAgICBwYXJzaW5nIHRvIHNldCB2YXJpYWJsZXMgb3IgdG8gcGVyZm9ybSBvdGhlciBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgcHJvZ3JhbW1hdGljYWxseS4KKyAgICAgICAgICAgICAgICBUbyBkbyB0aGlzLCB5b3UgY2FuIGRlZmluZSBhbiBhbm9ueW1vdXMgUHl0aG9uIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IGNvbmRpdGlvbmFsbHkgc2V0cyBhCisgICAgICAgICAgICAgICAgdmFyaWFibGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGFub3RoZXIgdmFyaWFibGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBweXRob24gX19hbm9ueW1vdXMgKCkgeworICAgICAgICAgaWYgZC5nZXRWYXIoJ1NPTUVWQVInLCBUcnVlKSA9PSAndmFsdWUnOgorICAgICAgICAgICAgIGQuc2V0VmFyKCdBTk9USEVSVkFSJywgJ3ZhbHVlMicpCisgICAgIH0KKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgVGhlICJfX2Fub255bW91cyIgZnVuY3Rpb24gbmFtZSBpcyBvcHRpb25hbCwgc28gdGhlCisgICAgICAgICAgICAgICAgZm9sbG93aW5nIGV4YW1wbGUgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgcHl0aG9uICgpIHsKKyAgICAgICAgIGlmIGQuZ2V0VmFyKCdTT01FVkFSJywgVHJ1ZSkgPT0gJ3ZhbHVlJzoKKyAgICAgICAgICAgICBkLnNldFZhcignQU5PVEhFUlZBUicsICd2YWx1ZTInKQorICAgICB9CisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEJlY2F1c2UgdW5saWtlIG90aGVyIFB5dGhvbiBmdW5jdGlvbnMgYW5vbnltb3VzCisgICAgICAgICAgICAgICAgUHl0aG9uIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgZHVyaW5nIHBhcnNpbmcsIHRoZQorICAgICAgICAgICAgICAgICJkIiB2YXJpYWJsZSB3aXRoaW4gYW4gYW5vbnltb3VzIFB5dGhvbiBmdW5jdGlvbiByZXByZXNlbnRzCisgICAgICAgICAgICAgICAgdGhlIGRhdGFzdG9yZSBmb3IgdGhlIGVudGlyZSByZWNpcGUuCisgICAgICAgICAgICAgICAgQ29uc2VxdWVudGx5LCB5b3UgY2FuIHNldCB2YXJpYWJsZSB2YWx1ZXMgaGVyZSBhbmQKKyAgICAgICAgICAgICAgICB0aG9zZSB2YWx1ZXMgY2FuIGJlIHBpY2tlZCB1cCBieSBvdGhlciBmdW5jdGlvbnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nZmxleGlibGUtaW5oZXJpdGFuY2UtZm9yLWNsYXNzLWZ1bmN0aW9ucyc+CisgICAgICAgICAgICA8dGl0bGU+RmxleGlibGUgSW5oZXJpdGFuY2UgZm9yIENsYXNzIEZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRocm91Z2ggY29kaW5nIHRlY2huaXF1ZXMgYW5kIHRoZSB1c2Ugb2YKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+RVhQT1JUX0ZVTkNUSU9OUzwvZmlsZW5hbWU+LCBCaXRCYWtlIHN1cHBvcnRzCisgICAgICAgICAgICAgICAgZXhwb3J0aW5nIGEgZnVuY3Rpb24gZnJvbSBhIGNsYXNzIHN1Y2ggdGhhdCB0aGUKKyAgICAgICAgICAgICAgICBjbGFzcyBmdW5jdGlvbiBhcHBlYXJzIGFzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgb2YgdGhlIGZ1bmN0aW9uLCBidXQgY2FuIHN0aWxsIGJlIGNhbGxlZCBpZiBhIHJlY2lwZQorICAgICAgICAgICAgICAgIGluaGVyaXRpbmcgdGhlIGNsYXNzIG5lZWRzIHRvIGRlZmluZSBpdHMgb3duIHZlcnNpb24gb2YKKyAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRvIHVuZGVyc3RhbmQgdGhlIGJlbmVmaXRzIG9mIHRoaXMgZmVhdHVyZSwgY29uc2lkZXIKKyAgICAgICAgICAgICAgICB0aGUgYmFzaWMgc2NlbmFyaW8gd2hlcmUgYSBjbGFzcyBkZWZpbmVzIGEgdGFzayBmdW5jdGlvbgorICAgICAgICAgICAgICAgIGFuZCB5b3VyIHJlY2lwZSBpbmhlcml0cyB0aGUgY2xhc3MuCisgICAgICAgICAgICAgICAgSW4gdGhpcyBiYXNpYyBzY2VuYXJpbywgeW91ciByZWNpcGUgaW5oZXJpdHMgdGhlIHRhc2sKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcyBkZWZpbmVkIGluIHRoZSBjbGFzcy4KKyAgICAgICAgICAgICAgICBJZiBkZXNpcmVkLCB5b3VyIHJlY2lwZSBjYW4gYWRkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ5IHVzaW5nIHRoZSAiX3ByZXBlbmQiIG9yICJfYXBwZW5kIiBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBvciBpdCBjYW4gcmVkZWZpbmUgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlbHkuCisgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgaXQgcmVkZWZpbmVzIHRoZSBmdW5jdGlvbiwgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICBubyBtZWFucyAgZm9yIGl0IHRvIGNhbGwgdGhlIGNsYXNzIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5FWFBPUlRfRlVOQ1RJT05TPC9maWxlbmFtZT4gcHJvdmlkZXMgYSBtZWNoYW5pc20KKyAgICAgICAgICAgICAgICB0aGF0IGVuYWJsZXMgdGhlIHJlY2lwZSdzIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwKKyAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRvIG1ha2UgdXNlIG9mIHRoaXMgdGVjaG5pcXVlLCB5b3UgbmVlZCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgdGhpbmdzIGluIHBsYWNlOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyBuZWVkcyB0byBkZWZpbmUgdGhlIGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIDxyZXBsYWNlYWJsZT5jbGFzc25hbWU8L3JlcGxhY2VhYmxlPjxmaWxlbmFtZT5fPC9maWxlbmFtZT48cmVwbGFjZWFibGU+ZnVuY3Rpb25uYW1lPC9yZXBsYWNlYWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGNsYXNzIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYXIuYmJjbGFzczwvZmlsZW5hbWU+IGFuZCBhIGZ1bmN0aW9uIG5hbWVkCisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fZm9vPC9maWxlbmFtZT4sIHRoZSBjbGFzcyBtdXN0IGRlZmluZSB0aGUgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGJhcl9kb19mb28KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgbmVlZHMgdG8gY29udGFpbiB0aGUgPGZpbGVuYW1lPkVYUE9SVF9GVU5DVElPTlM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50IGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEVYUE9SVF9GVU5DVElPTlMgPHJlcGxhY2VhYmxlPmZ1bmN0aW9ubmFtZTwvcmVwbGFjZWFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgY29udGludWluZyB3aXRoIHRoZSBzYW1lIGV4YW1wbGUsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50IGluIHRoZSA8ZmlsZW5hbWU+YmFyLmJiY2xhc3M8L2ZpbGVuYW1lPiB3b3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgRVhQT1JUX0ZVTkNUSU9OUyBkb19mb28KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbmVlZCB0byBjYWxsIHRoZSBmdW5jdGlvbiBhcHByb3ByaWF0ZWx5IGZyb20gd2l0aGluIHlvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRpbnVpbmcgd2l0aCB0aGUgc2FtZSBleGFtcGxlLCBpZiB5b3VyIHJlY2lwZQorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gY2FsbCB0aGUgY2xhc3MgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBpdCBzaG91bGQgY2FsbCA8ZmlsZW5hbWU+YmFyX2RvX2ZvbzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1pbmcgPGZpbGVuYW1lPmRvX2ZvbzwvZmlsZW5hbWU+IHdhcyBhIHNoZWxsIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPkVYUE9SVF9GVU5DVElPTlM8L2ZpbGVuYW1lPiB3YXMgdXNlZCBhcyBhYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWNpcGUncyBmdW5jdGlvbiBjb3VsZCBjb25kaXRpb25hbGx5IGNhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBkb19mb28oKSB7CisgICAgICAgICAgICAgaWYgWyBzb21lY29uZGl0aW9uIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICBiYXJfZG9fZm9vCisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIyBEbyBzb21ldGhpbmcgZWxzZQorICAgICAgICAgICAgIGZpCisgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRvIGNhbGwgeW91ciBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhcyBkZWZpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICBpbiB5b3VyIHJlY2lwZSwgY2FsbCBpdCBhcyA8ZmlsZW5hbWU+ZG9fZm9vPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICBXaXRoIHRoZXNlIGNvbmRpdGlvbnMgbWV0LCB5b3VyIHNpbmdsZSByZWNpcGUKKyAgICAgICAgICAgICAgICBjYW4gZnJlZWx5IGNob29zZSBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBmdW5jdGlvbgorICAgICAgICAgICAgICAgIGFzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGZpbGUgYW5kIHRoZSBtb2RpZmllZCBmdW5jdGlvbiBpbiB5b3VyIHJlY2lwZS4KKyAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHNldCB1cCB0aGVzZSBjb25kaXRpb25zLCB5b3UgYXJlIGxpbWl0ZWQgdG8gdXNpbmcgb25lIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgb3IgdGhlIG90aGVyLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J3Rhc2tzJz4KKyAgICAgICAgPHRpdGxlPlRhc2tzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRhc2tzIGFyZSBCaXRCYWtlIGV4ZWN1dGlvbiB1bml0cyB0aGF0IG9yaWdpbmF0ZSBhcworICAgICAgICAgICAgZnVuY3Rpb25zIGFuZCBtYWtlIHVwIHRoZSBzdGVwcyB0aGF0IEJpdEJha2UgbmVlZHMgdG8gcnVuCisgICAgICAgICAgICBmb3IgZ2l2ZW4gcmVjaXBlLgorICAgICAgICAgICAgVGFza3MgYXJlIG9ubHkgc3VwcG9ydGVkIGluIHJlY2lwZSAoPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+CisgICAgICAgICAgICBvciA8ZmlsZW5hbWU+LmluYzwvZmlsZW5hbWU+KSBhbmQgY2xhc3MKKyAgICAgICAgICAgICg8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPikgZmlsZXMuCisgICAgICAgICAgICBCeSBjb252ZW50aW9uLCB0YXNrIG5hbWVzIGJlZ2luIHdpdGggdGhlIHN0cmluZyAiZG9fIi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgdGFzayB0aGF0IHByaW50cyBvdXQgdGhlIGRhdGU6CisgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIHB5dGhvbiBkb19wcmludGRhdGUgKCkgeworICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgIHByaW50IHRpbWUuc3RyZnRpbWUoJyVZJW0lZCcsIHRpbWUuZ210aW1lKCkpCisgICAgIH0KKyAgICAgYWRkdGFzayBwcmludGRhdGUgYWZ0ZXIgZG9fZmV0Y2ggYmVmb3JlIGRvX2J1aWxkCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiBpZD0ncHJvbW90aW5nLWEtZnVuY3Rpb24tdG8tYS10YXNrJz4KKyAgICAgICAgICAgIDx0aXRsZT5Qcm9tb3RpbmcgYSBGdW5jdGlvbiB0byBhIFRhc2s8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBbnkgZnVuY3Rpb24gY2FuIGJlIHByb21vdGVkIHRvIGEgdGFzayBieSBhcHBseWluZyB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YWRkdGFzazwvZmlsZW5hbWU+IGNvbW1hbmQuCisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5hZGR0YXNrPC9maWxlbmFtZT4gY29tbWFuZCBhbHNvIGRlc2NyaWJlcworICAgICAgICAgICAgICAgIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgdGhlIGZ1bmN0aW9uIGZyb20gdGhlIHByZXZpb3VzIHNlY3Rpb24gYnV0IHdpdGggdGhlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmFkZHRhc2s8L2ZpbGVuYW1lPiBjb21tYW5kIHByb21vdGluZyBpdCB0byBhIHRhc2sKKyAgICAgICAgICAgICAgICBhbmQgZGVmaW5pbmcgc29tZSBkZXBlbmRlbmNpZXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBweXRob24gZG9fcHJpbnRkYXRlICgpIHsKKyAgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgICBwcmludCB0aW1lLnN0cmZ0aW1lKCclWSVtJWQnLCB0aW1lLmdtdGltZSgpKQorICAgICB9CisgICAgIGFkZHRhc2sgcHJpbnRkYXRlIGFmdGVyIGRvX2ZldGNoIGJlZm9yZSBkb19idWlsZAorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJbiB0aGUgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgYW5kIHRoZW4gcHJvbW90ZWQKKyAgICAgICAgICAgICAgICBhcyBhIHRhc2suCisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5kb19wcmludGRhdGU8L2ZpbGVuYW1lPiB0YXNrIGJlY29tZXMgYSBkZXBlbmRlbmN5IG9mCisgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5kb19idWlsZDwvZmlsZW5hbWU+IHRhc2ssIHdoaWNoIGlzIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgdGFzay4KKyAgICAgICAgICAgICAgICBBbmQsIHRoZSA8ZmlsZW5hbWU+ZG9fcHJpbnRkYXRlPC9maWxlbmFtZT4gdGFzayBpcyBkZXBlbmRlbnQgdXBvbgorICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+ZG9fZmV0Y2g8L2ZpbGVuYW1lPiB0YXNrLgorICAgICAgICAgICAgICAgIEV4ZWN1dGlvbiBvZiB0aGUgPGZpbGVuYW1lPmRvX2J1aWxkPC9maWxlbmFtZT4gdGFzayByZXN1bHRzCisgICAgICAgICAgICAgICAgaW4gdGhlIDxmaWxlbmFtZT5kb19wcmludGRhdGU8L2ZpbGVuYW1lPiB0YXNrIHJ1bm5pbmcgZmlyc3QuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0nZGVsZXRpbmctYS10YXNrJz4KKyAgICAgICAgICAgIDx0aXRsZT5EZWxldGluZyBhIFRhc2s8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyB3ZWxsIGFzIGJlaW5nIGFibGUgdG8gYWRkIHRhc2tzLCB5b3UgY2FuIGRlbGV0ZSB0aGVtLgorICAgICAgICAgICAgICAgIFNpbXBseSB1c2UgdGhlIDxmaWxlbmFtZT5kZWx0YXNrPC9maWxlbmFtZT4gY29tbWFuZCB0bworICAgICAgICAgICAgICAgIGRlbGV0ZSBhIHRhc2suCisgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRvIGRlbGV0ZSB0aGUgZXhhbXBsZSB0YXNrIHVzZWQgaW4gdGhlIHByZXZpb3VzCisgICAgICAgICAgICAgICAgc2VjdGlvbnMsIHlvdSB3b3VsZCB1c2U6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBkZWx0YXNrIHByaW50ZGF0ZQorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICBJZiB5b3UgZGVsZXRlIGEgdGFzayB1c2luZyB0aGUgPGZpbGVuYW1lPmRlbHRhc2s8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIHRoZSB0YXNrIGhhcyBkZXBlbmRlbmNpZXMsIHRoZSBkZXBlbmRlbmNpZXMgYXJlCisgICAgICAgICAgICAgICAgbm90IHJlY29ubmVjdGVkLgorICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIHRocmVlIHRhc2tzIG5hbWVkCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvX2E8L2ZpbGVuYW1lPiwgPGZpbGVuYW1lPmRvX2I8L2ZpbGVuYW1lPiwgYW5kCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvX2M8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBGdXJ0aGVybW9yZSwgPGZpbGVuYW1lPmRvX2M8L2ZpbGVuYW1lPiBpcyBkZXBlbmRlbnQgb24KKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYjwvZmlsZW5hbWU+LCB3aGljaCBpbiB0dXJuIGlzIGRlcGVuZGVudCBvbgorICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb19hPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgR2l2ZW4gdGhpcyBzY2VuYXJpbywgaWYgeW91IHVzZSA8ZmlsZW5hbWU+ZGVsdGFzazwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgdG8gZGVsZXRlIDxmaWxlbmFtZT5kb19iPC9maWxlbmFtZT4sIHRoZSBpbXBsaWNpdCBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwIGJldHdlZW4gPGZpbGVuYW1lPmRvX2M8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYTwvZmlsZW5hbWU+IHRocm91Z2ggPGZpbGVuYW1lPmRvX2I8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIG5vIGxvbmdlciBleGlzdHMsIGFuZCA8ZmlsZW5hbWU+ZG9fYzwvZmlsZW5hbWU+IGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgIGFyZSBub3QgdXBkYXRlZCB0byBpbmNsdWRlIDxmaWxlbmFtZT5kb19hPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgVGh1cywgPGZpbGVuYW1lPmRvX2M8L2ZpbGVuYW1lPiBpcyBmcmVlIHRvIHJ1biBiZWZvcmUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fYTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCBkZXBlbmRlbmNpZXMgc3VjaCBhcyB0aGVzZSB0byByZW1haW4gaW50YWN0LCB1c2UKKyAgICAgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPm5vZXhlYzwvZmlsZW5hbWU+IHZhcmZsYWcgdG8gZGlzYWJsZSB0aGUgdGFzaworICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgdGhlIDxmaWxlbmFtZT5kZWx0YXNrPC9maWxlbmFtZT4gY29tbWFuZCB0bworICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRvX2Jbbm9leGVjXSA9ICIxIgorICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdwYXNzaW5nLWluZm9ybWF0aW9uLWludG8tdGhlLWJ1aWxkLXRhc2stZW52aXJvbm1lbnQnPgorICAgICAgICAgICAgPHRpdGxlPlBhc3NpbmcgSW5mb3JtYXRpb24gSW50byB0aGUgQnVpbGQgVGFzayBFbnZpcm9ubWVudDwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4gcnVubmluZyBhIHRhc2ssIEJpdEJha2UgdGlnaHRseSBjb250cm9scyB0aGUgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgb2YgdGhlIGJ1aWxkIHRhc2tzIHRvIG1ha2UKKyAgICAgICAgICAgICAgICBzdXJlIHVud2FudGVkIGNvbnRhbWluYXRpb24gZnJvbSB0aGUgYnVpbGQgbWFjaGluZSBjYW5ub3QKKyAgICAgICAgICAgICAgICBpbmZsdWVuY2UgdGhlIGJ1aWxkLgorICAgICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgaWYgeW91IGRvIHdhbnQgc29tZXRoaW5nIHRvIGdldCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICAgICAgICBidWlsZCB0YXNrIGVudmlyb25tZW50LCB5b3UgbXVzdCB0YWtlIHRoZXNlIHR3byBzdGVwczoKKyAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRlbGwgQml0QmFrZSB0byBsb2FkIHdoYXQgeW91IHdhbnQgZnJvbSB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZG8gc28gdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9FTlZfRVhUUkFXSElURSc+PGZpbGVuYW1lPkJCX0VOVl9FWFRSQVdISVRFPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBhc3N1bWUgeW91IHdhbnQgdG8gcHJldmVudCB0aGUgYnVpbGQgc3lzdGVtIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2luZyB5b3VyIDxmaWxlbmFtZT4kSE9NRS8uY2NhY2hlPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZCB0ZWxscyBCaXRCYWtlIHRvIGxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5DQ0FDSEVfRElSPC9maWxlbmFtZT4gZnJvbSB0aGUgZW52aXJvbm1lbnQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGFzdG9yZToKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgZXhwb3J0IEJCX0VOVl9FWFRSQVdISVRFPSIkQkJfRU5WX0VYVFJBV0hJVEUgQ0NBQ0hFX0RJUiIKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgVGVsbCBCaXRCYWtlIHRvIGV4cG9ydCB3aGF0IHlvdSBoYXZlIGxvYWRlZCBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXN0b3JlIHRvIHRoZSB0YXNrIGVudmlyb25tZW50IG9mIGV2ZXJ5IHJ1bm5pbmcgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgICAgIExvYWRpbmcgc29tZXRoaW5nIGZyb20gdGhlIGVudmlyb25tZW50IGludG8gdGhlIGRhdGFzdG9yZQorICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzIHN0ZXApIG9ubHkgbWFrZXMgaXQgYXZhaWxhYmxlIGluIHRoZSBkYXRhc3RvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBUbyBleHBvcnQgaXQgdG8gdGhlIHRhc2sgZW52aXJvbm1lbnQgb2YgZXZlcnkgcnVubmluZyB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGEgY29tbWFuZCBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgaW4geW91ciBsb2NhbCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIDxmaWxlbmFtZT5sb2NhbC5jb25mPC9maWxlbmFtZT4gb3IgeW91cgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgZXhwb3J0IENDQUNIRV9ESVIKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgc2lkZSBlZmZlY3Qgb2YgdGhlIHByZXZpb3VzIHN0ZXBzIGlzIHRoYXQgQml0QmFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHMgdGhlIHZhcmlhYmxlIGFzIGEgZGVwZW5kZW5jeSBvZiB0aGUgYnVpbGQgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoaW5ncyBsaWtlIHRoZSBzZXRzY2VuZSBjaGVja3N1bXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgZG9pbmcgc28gcmVzdWx0cyBpbiB1bm5lY2Vzc2FyeSByZWJ1aWxkcyBvZiB0YXNrcywgeW91IGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlbGlzdCB0aGUgdmFyaWFibGUgc28gdGhhdCB0aGUgc2V0c2NlbmUgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZXMgdGhlIGRlcGVuZGVuY3kgd2hlbiBpdCBjcmVhdGVzIGNoZWNrc3Vtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbm90ZT48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBTb21ldGltZXMsIGl0IGlzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIG9idGFpbiBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGZyb20gdGhlIG9yaWdpbmFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICBCaXRiYWtlIHNhdmVzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZW52aXJvbm1lbnQgaW50bworICAgICAgICAgICAgICAgIGEgc3BlY2lhbCB2YXJpYWJsZSBuYW1lZAorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9PUklHRU5WJz48ZmlsZW5hbWU+QkJfT1JJR0VOVjwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5CQl9PUklHRU5WPC9maWxlbmFtZT4gdmFyaWFibGUgcmV0dXJucyBhIGRhdGFzdG9yZQorICAgICAgICAgICAgICAgIG9iamVjdCB0aGF0IGNhbiBiZSBxdWVyaWVkIHVzaW5nIHRoZSBzdGFuZGFyZCBkYXRhc3RvcmUgb3BlcmF0b3JzCisgICAgICAgICAgICAgICAgc3VjaCBhcyA8ZmlsZW5hbWU+Z2V0VmFyKCwgRmFsc2UpPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgVGhlIGRhdGFzdG9yZSBvYmplY3QgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gZmluZCB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+RElTUExBWTwvZmlsZW5hbWU+IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIG9yaWdlbnYgPSBkLmdldFZhcigiQkJfT1JJR0VOViIsIEZhbHNlKQorICAgICBiYXIgPSBvcmlnZW52LmdldFZhcigiQkFSIiwgRmFsc2UpCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIFRoZSBwcmV2aW91cyBleGFtcGxlIHJldHVybnMgPGZpbGVuYW1lPkJBUjwvZmlsZW5hbWU+IGZyb20gdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCBCaXRCYWtlIGNsZWFucyB0aGUgZW52aXJvbm1lbnQgdG8gaW5jbHVkZSBvbmx5IHRob3NlCisgICAgICAgICAgICAgICAgdGhpbmdzIGV4cG9ydGVkIG9yIGxpc3RlZCBpbiBpdHMgd2hpdGVsaXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBidWlsZAorICAgICAgICAgICAgICAgIGVudmlyb25tZW50IGlzIHJlcHJvZHVjaWJsZSBhbmQgY29uc2lzdGVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSd2YXJpYWJsZS1mbGFncyc+CisgICAgICAgIDx0aXRsZT5WYXJpYWJsZSBGbGFnczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBWYXJpYWJsZSBmbGFncyAodmFyZmxhZ3MpIGhlbHAgY29udHJvbCBhIHRhc2sncyBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICBhbmQgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgQml0QmFrZSByZWFkcyBhbmQgd3JpdGVzIHZhcmZsYWdzIHRvIHRoZSBkYXRhc3RvcmUgdXNpbmcgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgY29tbWFuZCBmb3JtczoKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgPHJlcGxhY2VhYmxlPnZhcmlhYmxlPC9yZXBsYWNlYWJsZT4gPSBkLmdldFZhckZsYWdzKCI8cmVwbGFjZWFibGU+dmFyaWFibGU8L3JlcGxhY2VhYmxlPiIpCisgICAgIHNlbGYuZC5zZXRWYXJGbGFncygiRk9PIiwgeyJmdW5jIjogVHJ1ZX0pCisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFdoZW4gd29ya2luZyB3aXRoIHZhcmZsYWdzLCB0aGUgc2FtZSBzeW50YXgsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZgorICAgICAgICAgICAgb3ZlcnJpZGVzLCBhcHBsaWVzLgorICAgICAgICAgICAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gc2V0LCBhcHBlbmQsIGFuZCBwcmVwZW5kIHZhcmZsYWdzIGp1c3QgbGlrZQorICAgICAgICAgICAgdmFyaWFibGVzLgorICAgICAgICAgICAgU2VlIHRoZQorICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3ZhcmlhYmxlLWZsYWctc3ludGF4Jz5WYXJpYWJsZSBGbGFnIFN5bnRheDwvbGluaz4iCisgICAgICAgICAgICBzZWN0aW9uIGZvciBkZXRhaWxzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGhhcyBhIGRlZmluZWQgc2V0IG9mIHZhcmZsYWdzIGF2YWlsYWJsZSBmb3IgcmVjaXBlcyBhbmQKKyAgICAgICAgICAgIGNsYXNzZXMuCisgICAgICAgICAgICBUYXNrcyBzdXBwb3J0IGEgbnVtYmVyIG9mIHRoZXNlIGZsYWdzIHdoaWNoIGNvbnRyb2wgdmFyaW91cworICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdGFzazoKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5jbGVhbmRpcnM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgRW1wdHkgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgY3JlYXRlZCBiZWZvcmUgdGhlIHRhc2sgcnVucy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5kZXBlbmRzOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICBTZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERVBFTkRTJz48ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdpbnRlci10YXNrLWRlcGVuZGVuY2llcyc+SW50ZXItVGFzayBEZXBlbmRlbmNpZXM8L2xpbms+IgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmRlcHRhc2s6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMgdGFzayBidWlsZC10aW1lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgU2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVQRU5EUyc+PGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0nYnVpbGQtZGVwZW5kZW5jaWVzJz5CdWlsZCBEZXBlbmRlbmNpZXM8L2xpbms+IgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmRpcnM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgdGhlIHRhc2sgcnVucy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5sb2NrZmlsZXM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBvbmUgb3IgbW9yZSBsb2NrZmlsZXMgdG8gbG9jayB3aGlsZSB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZXMuCisgICAgICAgICAgICAgICAgICAgICBPbmx5IG9uZSB0YXNrIG1heSBob2xkIGEgbG9ja2ZpbGUsIGFuZCBhbnkgdGFzayB0aGF0CisgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0cyB0byBsb2NrIGFuIGFscmVhZHkgbG9ja2VkIGZpbGUgd2lsbCBibG9jayB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgdGhlIGxvY2sgaXMgcmVsZWFzZWQuCisgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGlzIHZhcmlhYmxlIGZsYWcgdG8gYWNjb21wbGlzaCBtdXR1YWwKKyAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5ub2V4ZWM6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgTWFya3MgdGhlIHRhc2tzIGFzIGJlaW5nIGVtcHR5IGFuZCBubyBleGVjdXRpb24gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+bm9leGVjPC9maWxlbmFtZT4gZmxhZyBjYW4gYmUgdXNlZCB0byBzZXQgdXAKKyAgICAgICAgICAgICAgICAgICAgdGFza3MgYXMgZGVwZW5kZW5jeSBwbGFjZWhvbGRlcnMsIG9yIHRvIGRpc2FibGUgdGFza3MgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICBlbHNld2hlcmUgdGhhdCBhcmUgbm90IG5lZWRlZCBpbiBhIHBhcnRpY3VsYXIgcmVjaXBlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPm5vc3RhbXA6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgVGVsbHMgQml0QmFrZSB0byBub3QgZ2VuZXJhdGUgYSBzdGFtcCBmaWxlIGZvciBhIHRhc2ssCisgICAgICAgICAgICAgICAgICAgIHdoaWNoIGltcGxpZXMgdGhlIHRhc2sgc2hvdWxkIGFsd2F5cyBiZSBleGVjdXRlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5wb3N0ZnVuY3M6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgTGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsbCBhZnRlciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5wcmVmdW5jczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxsIGJlZm9yZSB0aGUgdGFzayBleGVjdXRlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5yZGVwZW5kczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBDb250cm9scyBpbnRlci10YXNrIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgICAgICBTZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SREVQRU5EUyc+PGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVJSRUNPTU1FTkRTJz48ZmlsZW5hbWU+UlJFQ09NTUVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J2ludGVyLXRhc2stZGVwZW5kZW5jaWVzJz5JbnRlci1UYXNrIERlcGVuZGVuY2llczwvbGluaz4iCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+cmRlcHRhc2s6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMgdGFzayBydW50aW1lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgU2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPjxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SUkVDT01NRU5EUyc+PGZpbGVuYW1lPlJSRUNPTU1FTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdydW50aW1lLWRlcGVuZGVuY2llcyc+UnVudGltZSBEZXBlbmRlbmNpZXM8L2xpbms+IgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnJlY2lkZXB0YXNrOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFdoZW4gc2V0IGluIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPnJlY3JkZXB0YXNrPC9maWxlbmFtZT4sIHNwZWNpZmllcyBhIHRhc2sgdGhhdAorICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgaW5zcGVjdGVkIGZvciBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5yZWNyZGVwdGFzazo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBDb250cm9scyB0YXNrIHJlY3Vyc2l2ZSBydW50aW1lIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgU2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPjxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSwgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1SUkVDT01NRU5EUyc+PGZpbGVuYW1lPlJSRUNPTU1FTkRTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdyZWN1cnNpdmUtZGVwZW5kZW5jaWVzJz5SZWN1cnNpdmUgRGVwZW5kZW5jaWVzPC9saW5rPiIKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5zdGFtcC1leHRyYS1pbmZvOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIEV4dHJhIHN0YW1wIGluZm9ybWF0aW9uIHRvIGFwcGVuZCB0byB0aGUgdGFzaydzIHN0YW1wLgorICAgICAgICAgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCBPcGVuRW1iZWRkZWQgdXNlcyB0aGlzIGZsYWcgdG8gYWxsb3cKKyAgICAgICAgICAgICAgICAgICAgbWFjaGluZS1zcGVjaWZpYyB0YXNrcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz51bWFzazo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBUaGUgdW1hc2sgdG8gcnVuIHRoZSB0YXNrIHVuZGVyLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBTZXZlcmFsIHZhcmZsYWdzIGFyZSB1c2VmdWwgZm9yIGNvbnRyb2xsaW5nIGhvdyBzaWduYXR1cmVzIGFyZQorICAgICAgICAgICAgY2FsY3VsYXRlZCBmb3IgdmFyaWFibGVzLgorICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBwcm9jZXNzLCBzZWUgdGhlCisgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0nY2hlY2tzdW1zJz5DaGVja3N1bXMgKFNpZ25hdHVyZXMpPC9saW5rPiIKKyAgICAgICAgICAgIHNlY3Rpb24uCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+dmFyZGVwczo8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyB0byBhZGQgdG8gYSB2YXJpYWJsZSdzIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHB1cnBvc2VzIG9mIGNhbGN1bGF0aW5nIGl0cyBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgIEFkZGluZyB2YXJpYWJsZXMgdG8gdGhpcyBsaXN0IGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgYSBmdW5jdGlvbiByZWZlcnMgdG8gYSB2YXJpYWJsZSBpbiBhIG1hbm5lciB0aGF0CisgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGFsbG93IEJpdEJha2UgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUKKyAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgdmFyaWFibGUgaXMgcmVmZXJyZWQgdG8uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+dmFyZGVwc2V4Y2x1ZGU6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgdmFyaWFibGVzCisgICAgICAgICAgICAgICAgICAgIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gYSB2YXJpYWJsZSdzIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHB1cnBvc2VzIG9mIGNhbGN1bGF0aW5nIGl0cyBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+dmFyZGVwdmFsdWU6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgSWYgc2V0LCBpbnN0cnVjdHMgQml0QmFrZSB0byBpZ25vcmUgdGhlIGFjdHVhbAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgYW5kIGluc3RlYWQgdXNlIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgd2hlbiBjYWxjdWxhdGluZyB0aGUgdmFyaWFibGUncyBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+dmFyZGVwdmFsdWVleGNsdWRlOjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHBpcGUtc2VwYXJhdGVkIGxpc3Qgb2Ygc3RyaW5ncyB0byBleGNsdWRlCisgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIHZhcmlhYmxlJ3MgdmFsdWUgd2hlbiBjYWxjdWxhdGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUncyBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nZXZlbnRzJz4KKyAgICAgICAgPHRpdGxlPkV2ZW50czwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIGFsbG93cyBpbnN0YWxsYXRpb24gb2YgZXZlbnQgaGFuZGxlcnMgd2l0aGluCisgICAgICAgICAgICByZWNpcGUgYW5kIGNsYXNzIGZpbGVzLgorICAgICAgICAgICAgRXZlbnRzIGFyZSB0cmlnZ2VyZWQgYXQgY2VydGFpbiBwb2ludHMgZHVyaW5nIG9wZXJhdGlvbiwKKyAgICAgICAgICAgIHN1Y2ggYXMgdGhlIGJlZ2lubmluZyBvZiBhbiBvcGVyYXRpb24gYWdhaW5zdCBhIGdpdmVuIHJlY2lwZQorICAgICAgICAgICAgKDxmaWxlbmFtZT4qLmJiPC9maWxlbmFtZT4gZmlsZSksIHRoZSBzdGFydCBvZiBhIGdpdmVuIHRhc2ssCisgICAgICAgICAgICB0YXNrIGZhaWx1cmUsIHRhc2sgc3VjY2VzcywgYW5kIHNvIGZvcnRoLgorICAgICAgICAgICAgVGhlIGludGVudCBpcyB0byBtYWtlIGl0IGVhc3kgdG8gZG8gdGhpbmdzIGxpa2UgZW1haWwKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbiBvbiBidWlsZCBmYWlsdXJlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBldmVudCBoYW5kbGVyIHRoYXQKKyAgICAgICAgICAgIHByaW50cyB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgYW5kIHRoZSBjb250ZW50IG9mCisgICAgICAgICAgICB0aGUgPGZpbGVuYW1lPkZJTEU8L2ZpbGVuYW1lPiB2YXJpYWJsZToKKyAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgYWRkaGFuZGxlciBteWNsYXNzX2V2ZW50aGFuZGxlcgorICAgICBweXRob24gbXljbGFzc19ldmVudGhhbmRsZXIoKSB7CisgICAgICAgICBmcm9tIGJiLmV2ZW50IGltcG9ydCBnZXROYW1lCisgICAgICAgICBmcm9tIGJiIGltcG9ydCBkYXRhCisgICAgICAgICBwcmludCgiVGhlIG5hbWUgb2YgdGhlIEV2ZW50IGlzICVzIiAlIGdldE5hbWUoZSkpCisgICAgICAgICBwcmludCgiVGhlIGZpbGUgd2UgcnVuIGZvciBpcyAlcyIgJSBkYXRhLmdldFZhcignRklMRScsIGUuZGF0YSwgVHJ1ZSkpCisgICAgIH0KKyAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgIFRoaXMgZXZlbnQgaGFuZGxlciBnZXRzIGNhbGxlZCBldmVyeSB0aW1lIGFuIGV2ZW50IGlzCisgICAgICAgICAgICB0cmlnZ2VyZWQuCisgICAgICAgICAgICBBIGdsb2JhbCB2YXJpYWJsZSAiPGZpbGVuYW1lPmU8L2ZpbGVuYW1lPiIgaXMgZGVmaW5lZCBhbmQKKyAgICAgICAgICAgICI8ZmlsZW5hbWU+ZS5kYXRhPC9maWxlbmFtZT4iIGNvbnRhaW5zIGFuIGluc3RhbmNlIG9mCisgICAgICAgICAgICAiPGZpbGVuYW1lPmJiLmRhdGE8L2ZpbGVuYW1lPiIuCisgICAgICAgICAgICBXaXRoIHRoZSA8ZmlsZW5hbWU+Z2V0TmFtZShlKTwvZmlsZW5hbWU+IG1ldGhvZCwgb25lIGNhbiBnZXQKKyAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0cmlnZ2VyZWQgZXZlbnQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJlY2F1c2UgeW91IHByb2JhYmx5IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYSBzdWJzZXQgb2YgZXZlbnRzLAorICAgICAgICAgICAgeW91IHdvdWxkIGxpa2VseSB1c2UgdGhlIDxmaWxlbmFtZT5bZXZlbnRtYXNrXTwvZmlsZW5hbWU+IGZsYWcKKyAgICAgICAgICAgIGZvciB5b3VyIGV2ZW50IGhhbmRsZXIgdG8gYmUgc3VyZSB0aGF0IG9ubHkgY2VydGFpbiBldmVudHMKKyAgICAgICAgICAgIHRyaWdnZXIgdGhlIGhhbmRsZXIuCisgICAgICAgICAgICBHaXZlbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugb25seSB3YW50ZWQgdGhlCisgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuYnVpbGQuVGFza0ZhaWxlZDwvZmlsZW5hbWU+IGV2ZW50IHRvIHRyaWdnZXIgdGhhdAorICAgICAgICAgICAgZXZlbnQgaGFuZGxlci4KKyAgICAgICAgICAgIFVzZSB0aGUgZmxhZyBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBhZGRoYW5kbGVyIG15Y2xhc3NfZXZlbnRoYW5kbGVyCisgICAgIG15Y2xhc3NfZXZlbnRoYW5kbGVyW2V2ZW50bWFza10gPSAiYmIuYnVpbGQuVGFza0ZhaWxlZCIKKyAgICAgcHl0aG9uIG15Y2xhc3NfZXZlbnRoYW5kbGVyKCkgeworICAgICAgICAgZnJvbSBiYi5ldmVudCBpbXBvcnQgZ2V0TmFtZQorICAgICAgICAgZnJvbSBiYiBpbXBvcnQgZGF0YQorICAgICAgICAgcHJpbnQoIlRoZSBuYW1lIG9mIHRoZSBFdmVudCBpcyAlcyIgJSBnZXROYW1lKGUpKQorICAgICAgICAgcHJpbnQoIlRoZSBmaWxlIHdlIHJ1biBmb3IgaXMgJXMiICUgZGF0YS5nZXRWYXIoJ0ZJTEUnLCBlLmRhdGEsIFRydWUpKQorICAgICB9CisgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIER1cmluZyBhIHN0YW5kYXJkIGJ1aWxkLCB0aGUgZm9sbG93aW5nIGNvbW1vbiBldmVudHMgbWlnaHQgb2NjdXI6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LkNvbmZpZ1BhcnNlZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuUGFyc2VTdGFydGVkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5QYXJzZVByb2dyZXNzKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5QYXJzZUNvbXBsZXRlZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuQnVpbGRTdGFydGVkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5idWlsZC5UYXNrU3RhcnRlZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuYnVpbGQuVGFza0ludmFsaWQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmJ1aWxkLlRhc2tGYWlsZWRTaWxlbnQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmJ1aWxkLlRhc2tGYWlsZWQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmJ1aWxkLlRhc2tTdWNjZWVkZWQoKTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LkJ1aWxkQ29tcGxldGVkKCk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5jb29rZXIuQ29va2VyRXhpdCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIEhlcmUgaXMgYSBsaXN0IG9mIG90aGVyIGV2ZW50cyB0aGF0IG9jY3VyIGJhc2VkIG9uIHNwZWNpZmljIHJlcXVlc3RzCisgICAgICAgICAgICB0byB0aGUgc2VydmVyOgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uU3RhcnRlZCgpPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuVHJlZURhdGFQcmVwYXJhdGlvblByb2dyZXNzPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuVHJlZURhdGFQcmVwYXJhdGlvbkNvbXBsZXRlZDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LkRlcFRyZWVHZW5lcmF0ZWQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5Db3JlQmFzZUZpbGVzRm91bmQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iYi5ldmVudC5Db25maWdGaWxlUGF0aEZvdW5kPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuRmlsZXNNYXRjaGluZ0ZvdW5kPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmIuZXZlbnQuQ29uZmlnRmlsZXNGb3VuZDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmJiLmV2ZW50LlRhcmdldHNUcmVlR2VuZXJhdGVkPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIGlkPSd2YXJpYW50cy1jbGFzcy1leHRlbnNpb24tbWVjaGFuaXNtJz4KKyAgICAgICAgPHRpdGxlPlZhcmlhbnRzIC0gQ2xhc3MgRXh0ZW5zaW9uIE1lY2hhbmlzbTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCaXRCYWtlIHN1cHBvcnRzIHR3byBmZWF0dXJlcyB0aGF0IGZhY2lsaXRhdGUgY3JlYXRpbmcKKyAgICAgICAgICAgIGZyb20gYSBzaW5nbGUgcmVjaXBlIGZpbGUgbXVsdGlwbGUgaW5jYXJuYXRpb25zIG9mIHRoYXQKKyAgICAgICAgICAgIHJlY2lwZSBmaWxlIHdoZXJlIGFsbCBpbmNhcm5hdGlvbnMgYXJlIGJ1aWxkYWJsZS4KKyAgICAgICAgICAgIFRoZXNlIGZlYXR1cmVzIGFyZSBlbmFibGVkIHRocm91Z2ggdGhlCisgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJDTEFTU0VYVEVORCc+PGZpbGVuYW1lPkJCQ0xBU1NFWFRFTkQ8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCVkVSU0lPTlMnPjxmaWxlbmFtZT5CQlZFUlNJT05TPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICB2YXJpYWJsZXMuCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICBUaGUgbWVjaGFuaXNtIGZvciB0aGlzIGNsYXNzIGV4dGVuc2lvbiBpcyBleHRyZW1lbHkKKyAgICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICAgICAgVXN1YWxseSwgdGhlIHJlY2lwZSdzCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBST1ZJREVTJz48ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPjwvbGluaz4sCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBOJz48ZmlsZW5hbWU+UE48L2ZpbGVuYW1lPjwvbGluaz4sIGFuZAorICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1ERVBFTkRTJz48ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgIHZhcmlhYmxlcyB3b3VsZCBuZWVkIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSBleHRlbnNpb24gY2xhc3MuCisgICAgICAgICAgICAgICAgRm9yIHNwZWNpZmljIGV4YW1wbGVzLCBzZWUgdGhlIE9FLUNvcmUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+bmF0aXZlPC9maWxlbmFtZT4sIDxmaWxlbmFtZT5uYXRpdmVzZGs8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICBhbmQgPGZpbGVuYW1lPm11bHRpbGliPC9maWxlbmFtZT4gY2xhc3Nlcy4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+QkJDTEFTU0VYVEVORDwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHVzZWQgdG8gImV4dGVuZCIgdGhlCisgICAgICAgICAgICAgICAgICAgIHJlY2lwZSBmb3IgZWFjaCB2YXJpYW50LgorICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGUgdGhhdCByZXN1bHRzIGluIGEgc2Vjb25kIGluY2FybmF0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgIHJlY2lwZSBiZWluZyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgc2Vjb25kIGluY2FybmF0aW9uIHdpbGwgaGF2ZSB0aGUgIm5hdGl2ZSIgY2xhc3MgaW5oZXJpdGVkLgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCQ0xBU1NFWFRFTkQgPSAibmF0aXZlIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+QkJWRVJTSU9OUzwvZmlsZW5hbWU+OjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgYWxsb3dzIGEgc2luZ2xlIHJlY2lwZSB0byBidWlsZCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhCisgICAgICAgICAgICAgICAgICAgIHByb2plY3QgZnJvbSBhIHNpbmdsZSByZWNpcGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIHNwZWNpZnkgY29uZGl0aW9uYWwgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgKHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItT1ZFUlJJREVTJz48ZmlsZW5hbWU+T1ZFUlJJREVTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbSkgZm9yIGEgc2luZ2xlIHZlcnNpb24sIG9yIGFuIG9wdGlvbmFsbHkgbmFtZWQgcmFuZ2Ugb2YgdmVyc2lvbnMuCisgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQlZFUlNJT05TID0gIjEuMCAyLjAgZ2l0IgorICAgICBTUkNfVVJJX2dpdCA9ICJnaXQ6Ly9zb21ldXJsL3NvbWVwYXRoLmdpdCIKKworICAgICBCQlZFUlNJT05TID0gIjEuMC5bMC02XToxLjAuMCsgXCAxLjAuWzctOV06MS4wLjcrIgorICAgICBTUkNfVVJJX2FwcGVuZF8xLjAuNysgPSAiZmlsZTovL3NvbWVfcGF0Y2hfd2hpY2hfdGhlX25ld192ZXJzaW9uc19uZWVkLnBhdGNoO3BhdGNoPTEiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHJhbmdlIGRlZmF1bHRzIHRvIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpbiBPcGVuRW1iZWRkZWQsIHRoZSByZWNpcGUgZmlsZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Zm9vXzEuMC4wKy5iYjwvZmlsZW5hbWU+IGNyZWF0ZXMgYSBkZWZhdWx0IG5hbWUgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgb2YgPGZpbGVuYW1lPjEuMC4wKzwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHRoZSByYW5nZSBuYW1lIGlzIG5vdCBvbmx5IHBsYWNlZAorICAgICAgICAgICAgICAgICAgICBpbnRvIG92ZXJyaWRlcywgYnV0IGl0IGlzIGFsc28gbWFkZSBhdmFpbGFibGUgZm9yIHRoZSBtZXRhZGF0YSB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHZhcmlhYmxlIHRoYXQgZGVmaW5lcyB0aGUgYmFzZSByZWNpcGUgdmVyc2lvbnMgZm9yIHVzZSBpbgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZmlsZTovLzwvZmlsZW5hbWU+IHNlYXJjaCBwYXRocworICAgICAgICAgICAgICAgICAgICAoPGxpbmsgbGlua2VuZD0ndmFyLUZJTEVTUEFUSCc+PGZpbGVuYW1lPkZJTEVTUEFUSDwvZmlsZW5hbWU+PC9saW5rPikuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0nZGVwZW5kZW5jaWVzJz4KKyAgICAgICAgPHRpdGxlPkRlcGVuZGVuY2llczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBhbGxvdyBmb3IgZWZmaWNpZW50IG9wZXJhdGlvbiBnaXZlbiBtdWx0aXBsZSBwcm9jZXNzZXMKKyAgICAgICAgICAgIGV4ZWN1dGluZyBpbiBwYXJhbGxlbCwgQml0QmFrZSBoYW5kbGVzIGRlcGVuZGVuY2llcyBhdAorICAgICAgICAgICAgdGhlIHRhc2sgbGV2ZWwuCisgICAgICAgICAgICBCaXRCYWtlIHN1cHBvcnRzIGEgcm9idXN0IG1ldGhvZCB0byBoYW5kbGUgdGhlc2UgZGVwZW5kZW5jaWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNldmVyYWwgdHlwZXMgb2YgZGVwZW5kZW5jeSBtZWNoYW5pc21zLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J2RlcGVuZGVuY2llcy1pbnRlcm5hbC10by10aGUtYmItZmlsZSc+CisgICAgICAgICAgICA8dGl0bGU+RGVwZW5kZW5jaWVzIEludGVybmFsIHRvIHRoZSA8ZmlsZW5hbWU+LmJiPC9maWxlbmFtZT4gRmlsZTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyB0aGUgPGZpbGVuYW1lPmFkZHRhc2s8L2ZpbGVuYW1lPiBkaXJlY3RpdmUKKyAgICAgICAgICAgICAgICB0byBtYW5hZ2UgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGludGVybmFsIHRvIGEgZ2l2ZW4gcmVjaXBlCisgICAgICAgICAgICAgICAgZmlsZS4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgPGZpbGVuYW1lPmFkZHRhc2s8L2ZpbGVuYW1lPiBkaXJlY3RpdmUgdG8KKyAgICAgICAgICAgICAgICBpbmRpY2F0ZSB3aGVuIGEgdGFzayBpcyBkZXBlbmRlbnQgb24gb3RoZXIgdGFza3Mgb3Igd2hlbgorICAgICAgICAgICAgICAgIG90aGVyIHRhc2tzIGRlcGVuZCBvbiB0aGF0IHJlY2lwZS4KKyAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBhZGR0YXNrIHByaW50ZGF0ZSBhZnRlciBkb19mZXRjaCBiZWZvcmUgZG9fYnVpbGQKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgPGZpbGVuYW1lPnByaW50ZGF0ZTwvZmlsZW5hbWU+IHRhc2sgaXMKKyAgICAgICAgICAgICAgICBkZXBlbmRzIG9uIHRoZSBjb21wbGV0aW9uIG9mIHRoZSA8ZmlsZW5hbWU+ZG9fZmV0Y2g8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIHRhc2suCisgICAgICAgICAgICAgICAgQW5kLCB0aGUgPGZpbGVuYW1lPmRvX2J1aWxkPC9maWxlbmFtZT4gZGVwZW5kcyBvbiB0aGUgY29tcGxldGlvbgorICAgICAgICAgICAgICAgIG9mIHRoZSA8ZmlsZW5hbWU+cHJpbnRkYXRlPC9maWxlbmFtZT4gdGFzay4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdidWlsZC1kZXBlbmRlbmNpZXMnPgorICAgICAgICAgICAgPHRpdGxlPkJ1aWxkIERlcGVuZGVuY2llczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyB0aGUKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVQRU5EUyc+PGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICB2YXJpYWJsZSB0byBtYW5hZ2UgYnVpbGQgdGltZSBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgVGhlICJkZXB0YXNrIiB2YXJmbGFnIGZvciB0YXNrcyBzaWduaWZpZXMgdGhlIHRhc2sgb2YgZWFjaAorICAgICAgICAgICAgICAgIGl0ZW0gbGlzdGVkIGluIDxmaWxlbmFtZT5ERVBFTkRTPC9maWxlbmFtZT4gdGhhdCBtdXN0CisgICAgICAgICAgICAgICAgY29tcGxldGUgYmVmb3JlIHRoYXQgdGFzayBjYW4gYmUgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgZG9fY29uZmlndXJlW2RlcHRhc2tdID0gImRvX3BvcHVsYXRlX3N5c3Jvb3QiCisgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIDxmaWxlbmFtZT5kb19wb3B1bGF0ZV9zeXNyb290PC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICB0YXNrIG9mIGVhY2ggaXRlbSBpbiA8ZmlsZW5hbWU+REVQRU5EUzwvZmlsZW5hbWU+IG11c3QgY29tcGxldGUgYmVmb3JlCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvX2NvbmZpZ3VyZTwvZmlsZW5hbWU+IGNhbiBleGVjdXRlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24gaWQ9J3J1bnRpbWUtZGVwZW5kZW5jaWVzJz4KKyAgICAgICAgICAgIDx0aXRsZT5SdW50aW1lIERlcGVuZGVuY2llczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyB0aGUKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUEFDS0FHRVMnPjxmaWxlbmFtZT5QQUNLQUdFUzwvZmlsZW5hbWU+PC9saW5rPiwKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPjxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPiwgYW5kCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVJSRUNPTU1FTkRTJz48ZmlsZW5hbWU+UlJFQ09NTUVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICB2YXJpYWJsZXMgdG8gbWFuYWdlIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPlBBQ0tBR0VTPC9maWxlbmFtZT4gdmFyaWFibGUgbGlzdHMgcnVudGltZQorICAgICAgICAgICAgICAgIHBhY2thZ2VzLgorICAgICAgICAgICAgICAgIEVhY2ggb2YgdGhvc2UgcGFja2FnZXMgY2FuIGhhdmUgPGZpbGVuYW1lPlJERVBFTkRTPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlJSRUNPTU1FTkRTPC9maWxlbmFtZT4gcnVudGltZSBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgVGhlICJyZGVwdGFzayIgZmxhZyBmb3IgdGFza3MgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSB0YXNrIG9mIGVhY2gKKyAgICAgICAgICAgICAgICBpdGVtIHJ1bnRpbWUgZGVwZW5kZW5jeSB3aGljaCBtdXN0IGhhdmUgY29tcGxldGVkIGJlZm9yZSB0aGF0CisgICAgICAgICAgICAgICAgdGFzayBjYW4gYmUgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBkb19wYWNrYWdlX3FhW3JkZXB0YXNrXSA9ICJkb19wYWNrYWdlZGF0YSIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSA8ZmlsZW5hbWU+ZG9fcGFja2FnZWRhdGE8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIHRhc2sgb2YgZWFjaCBpdGVtIGluIDxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+IG11c3QgaGF2ZQorICAgICAgICAgICAgICAgIGNvbXBsZXRlZCBiZWZvcmUgPGZpbGVuYW1lPmRvX3BhY2thZ2VfcWE8L2ZpbGVuYW1lPiBjYW4gZXhlY3V0ZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIGlkPSdyZWN1cnNpdmUtZGVwZW5kZW5jaWVzJz4KKyAgICAgICAgICAgIDx0aXRsZT5SZWN1cnNpdmUgRGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoZSAicmVjcmRlcHRhc2siIGZsYWcgdG8gbWFuYWdlCisgICAgICAgICAgICAgICAgcmVjdXJzaXZlIHRhc2sgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgIEJpdEJha2UgbG9va3MgdGhyb3VnaCB0aGUgYnVpbGQtdGltZSBhbmQgcnVudGltZQorICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyBvZiB0aGUgY3VycmVudCByZWNpcGUsIGxvb2tzIHRocm91Z2gKKyAgICAgICAgICAgICAgICB0aGUgdGFzaydzIGludGVyLXRhc2sKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMsIGFuZCB0aGVuIGFkZHMgZGVwZW5kZW5jaWVzIGZvciB0aGUKKyAgICAgICAgICAgICAgICBsaXN0ZWQgdGFzay4KKyAgICAgICAgICAgICAgICBPbmNlIEJpdEJha2UgaGFzIGFjY29tcGxpc2hlZCB0aGlzLCBpdCByZWN1cnNpdmVseSB3b3JrcyB0aHJvdWdoCisgICAgICAgICAgICAgICAgdGhlIGRlcGVuZGVuY2llcyBvZiB0aG9zZSB0YXNrcy4KKyAgICAgICAgICAgICAgICBJdGVyYXRpdmUgcGFzc2VzIGNvbnRpbnVlIHVudGlsIGFsbCBkZXBlbmRlbmNpZXMgYXJlIGRpc2NvdmVyZWQKKyAgICAgICAgICAgICAgICBhbmQgYWRkZWQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIG5vdCBvbmx5IGhhdmUgQml0QmFrZSBsb29rIGZvcgorICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyBvZiB0aG9zZSB0YXNrcywgYnV0IGFsc28gaGF2ZSBCaXRCYWtlIGxvb2sKKyAgICAgICAgICAgICAgICBmb3IgYnVpbGQtdGltZSBhbmQgcnVudGltZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGRlcGVuZGVudAorICAgICAgICAgICAgICAgIHRhc2tzIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgSWYgdGhhdCBpcyB0aGUgY2FzZSwgeW91IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSB0YXNrIG5hbWUKKyAgICAgICAgICAgICAgICBpdHNlbGYgaW4gdGhlIHRhc2sgbGlzdDoKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGRvX2FbcmVjcmRlcHRhc2tdID0gImRvX2EgZG9fYiIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiBpZD0naW50ZXItdGFzay1kZXBlbmRlbmNpZXMnPgorICAgICAgICAgICAgPHRpdGxlPkludGVyLVRhc2sgRGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIHRoZSAiZGVwZW5kcyIgZmxhZyBpbiBhIG1vcmUgZ2VuZXJpYyBmb3JtCisgICAgICAgICAgICAgICAgdG8gbWFuYWdlIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgICAgIFRoaXMgbW9yZSBnZW5lcmljIGZvcm0gYWxsb3dzIGZvciBpbnRlci1kZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgY2hlY2tzIGZvciBzcGVjaWZpYyB0YXNrcyByYXRoZXIgdGhhbiBjaGVja3MgZm9yCisgICAgICAgICAgICAgICAgdGhlIGRhdGEgaW4gPGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBkb19wYXRjaFtkZXBlbmRzXSA9ICJxdWlsdC1uYXRpdmU6ZG9fcG9wdWxhdGVfc3lzcm9vdCIKKyAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgPGZpbGVuYW1lPmRvX3BvcHVsYXRlX3N5c3Jvb3Q8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgIHRhc2sgb2YgdGhlIHRhcmdldCA8ZmlsZW5hbWU+cXVpbHQtbmF0aXZlPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICBtdXN0IGhhdmUgY29tcGxldGVkIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fcGF0Y2g8L2ZpbGVuYW1lPiB0YXNrIGNhbiBleGVjdXRlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgInJkZXBlbmRzIiBmbGFnIHdvcmtzIGluIGEgc2ltaWxhciB3YXkgYnV0IHRha2VzIHRhcmdldHMKKyAgICAgICAgICAgICAgICBpbiB0aGUgcnVudGltZSBuYW1lc3BhY2UgaW5zdGVhZCBvZiB0aGUgYnVpbGQtdGltZSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J2FjY2Vzc2luZy1kYXRhc3RvcmUtdmFyaWFibGVzLXVzaW5nLXB5dGhvbic+CisgICAgICAgIDx0aXRsZT5BY2Nlc3NpbmcgRGF0YXN0b3JlIFZhcmlhYmxlcyBVc2luZyBQeXRob248L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIGFjY2VzcyB2YXJpYWJsZXMgaW4gdGhlCisgICAgICAgICAgICBCaXRCYWtlIGRhdGFzdG9yZSB1c2luZyBQeXRob24gZnVuY3Rpb25zLgorICAgICAgICAgICAgVGhlIEJpdGJha2UgZGF0YXN0b3JlIGhhcyBhbiBBUEkgdGhhdCBhbGxvd3MgeW91IHRoaXMKKyAgICAgICAgICAgIGFjY2Vzcy4KKyAgICAgICAgICAgIEhlcmUgaXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBvcGVyYXRpb25zOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aW5mb3JtYWx0YWJsZSBmcmFtZT0nbm9uZSc+CisgICAgICAgICAgICAgICAgPHRncm91cCBjb2xzPScyJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9JzEqJy8+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MyJyBjb2x3aWR0aD0nMSonLz4KKyAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxlbXBoYXNpcz5PcGVyYXRpb248L2VtcGhhc2lzPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZW1waGFzaXM+RGVzY3JpcHRpb248L2VtcGhhc2lzPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmdldFZhcigiWCIsIGV4cGFuZD1GYWxzZSk8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5SZXR1cm5zIHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSAiWCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nICJleHBhbmQ9VHJ1ZSIgZXhwYW5kcyB0aGUgdmFsdWUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLnNldFZhcigiWCIsICJ2YWx1ZSIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+U2V0cyB0aGUgdmFyaWFibGUgIlgiIHRvICJ2YWx1ZSIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmFwcGVuZFZhcigiWCIsICJ2YWx1ZSIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+QWRkcyAidmFsdWUiIHRvIHRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlICJYIi48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQucHJlcGVuZFZhcigiWCIsICJ2YWx1ZSIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+QWRkcyAidmFsdWUiIHRvIHRoZSBzdGFydCBvZiB0aGUgdmFyaWFibGUgIlgiLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5kZWxWYXIoIlgiKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPkRlbGV0ZXMgdGhlIHZhcmlhYmxlICJYIiBmcm9tIHRoZSBkYXRhc3RvcmUuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLnJlbmFtZVZhcigiWCIsICJZIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5SZW5hbWVzIHRoZSB2YXJpYWJsZSAiWCIgdG8gIlkiLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5nZXRWYXJGbGFnKCJYIiwgZmxhZywgZXhwYW5kPUZhbHNlKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPkdldHMgdGhlbiBuYW1lZCBmbGFnIGZyb20gdGhlIHZhcmlhYmxlICJYIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgImV4cGFuZD1UcnVlIiBleHBhbmRzIHRoZSBuYW1lZCBmbGFnLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5zZXRWYXJGbGFnKCJYIiwgZmxhZywgInZhbHVlIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5TZXRzIHRoZSBuYW1lZCBmbGFnIGZvciB2YXJpYWJsZSAiWCIgdG8gInZhbHVlIi48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQuYXBwZW5kVmFyRmxhZygiWCIsIGZsYWcsICJ2YWx1ZSIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+QXBwZW5kcyAidmFsdWUiIHRvIHRoZSBuYW1lZCBmbGFnIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlICJYIi48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+PGZpbGVuYW1lPmQucHJlcGVuZFZhckZsYWcoIlgiLCBmbGFnLCAidmFsdWUiKTwvZmlsZW5hbWU+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlByZXBlbmRzICJ2YWx1ZSIgdG8gdGhlIG5hbWVkIGZsYWcgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgIlgiLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5kZWxWYXJGbGFnKCJYIiwgZmxhZyk8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5EZWxldGVzIHRoZSBuYW1lZCBmbGFnIG9uIHRoZSB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWCIgZnJvbSB0aGUgZGF0YXN0b3JlLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5zZXRWYXJGbGFncygiWCIsIGZsYWdzZGljdCk8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5TZXRzIHRoZSBmbGFncyBzcGVjaWZpZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5mbGFnc2RpY3QoKTwvZmlsZW5hbWU+IHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPnNldFZhckZsYWdzPC9maWxlbmFtZT4gZG9lcyBub3QgY2xlYXIgcHJldmlvdXMgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaW5rIG9mIHRoaXMgb3BlcmF0aW9uIGFzIDxmaWxlbmFtZT5hZGRWYXJGbGFnczwvZmlsZW5hbWU+LjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij48ZmlsZW5hbWU+ZC5nZXRWYXJGbGFncygiWCIpPC9maWxlbmFtZT48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeSBhbGlnbj0ibGVmdCI+UmV0dXJucyBhIDxmaWxlbmFtZT5mbGFnc2RpY3Q8L2ZpbGVuYW1lPiBvZiB0aGUgZmxhZ3MgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSAiWCIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkgYWxpZ249ImxlZnQiPjxmaWxlbmFtZT5kLmRlbFZhckZsYWdzKCJYIik8L2ZpbGVuYW1lPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5IGFsaWduPSJsZWZ0Ij5EZWxldGVzIGFsbCB0aGUgZmxhZ3MgZm9yIHRoZSB2YXJpYWJsZSAiWCIuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgPC9pbmZvcm1hbHRhYmxlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24gaWQ9J3Rhc2stY2hlY2tzdW1zLWFuZC1zZXRzY2VuZSc+CisgICAgICAgIDx0aXRsZT5UYXNrIENoZWNrc3VtcyBhbmQgU2V0c2NlbmU8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQml0QmFrZSB1c2VzIGNoZWNrc3VtcyAob3Igc2lnbmF0dXJlcykgYWxvbmcgd2l0aCB0aGUgc2V0c2NlbmUKKyAgICAgICAgICAgIHRvIGRldGVybWluZSBpZiBhIHRhc2sgbmVlZHMgdG8gYmUgcnVuLgorICAgICAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgcHJvY2Vzcy4KKyAgICAgICAgICAgIFRvIGhlbHAgdW5kZXJzdGFuZCBob3cgQml0QmFrZSBkb2VzIHRoaXMsIHRoZSBzZWN0aW9uIGFzc3VtZXMgYW4KKyAgICAgICAgICAgIE9wZW5FbWJlZGRlZCBtZXRhZGF0YS1iYXNlZCBleGFtcGxlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIGxpc3QgaXMgYSBwbGFjZSBob2xkZXIgb2YgY29udGVudCBleGlzdGVkIGZyb20gcHJldmlvdXMgd29yaworICAgICAgICAgICAgb24gdGhlIG1hbnVhbC4KKyAgICAgICAgICAgIFNvbWUgb3IgYWxsIG9mIGl0IHByb2JhYmx5IG5lZWRzIGludGVncmF0ZWQgaW50byB0aGUgc3Vic2VjdGlvbnMKKyAgICAgICAgICAgIHRoYXQgbWFrZSB1cCB0aGlzIHNlY3Rpb24uCisgICAgICAgICAgICBGb3Igbm93LCBJIGhhdmUganVzdCBwcm92aWRlZCBhIHNob3J0IGdsb3NzYXJ5LWxpa2UgZGVzY3JpcHRpb24KKyAgICAgICAgICAgIGZvciBlYWNoIHZhcmlhYmxlLgorICAgICAgICAgICAgVWx0aW1hdGVseSwgdGhpcyBsaXN0IGdvZXMgYXdheS4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxmaWxlbmFtZT5TVEFNUDwvZmlsZW5hbWU+OgorICAgICAgICAgICAgICAgICAgICBUaGUgYmFzZSBwYXRoIHRvIGNyZWF0ZSBzdGFtcCBmaWxlcy48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPlNUQU1QQ0xFQU48L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBBZ2FpbiwgdGhlIGJhc2UgcGF0aCB0byBjcmVhdGUgc3RhbXAgZmlsZXMgYnV0IGNhbiB1c2Ugd2lsZGNhcmRzCisgICAgICAgICAgICAgICAgICAgIGZvciBtYXRjaGluZyBhIHJhbmdlIG9mIGZpbGVzIGZvciBjbGVhbiBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPkJCX1NUQU1QX1dISVRFTElTVDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIExpc3RzIHN0YW1wIGZpbGVzIHRoYXQgYXJlIGxvb2tlZCBhdCB3aGVuIHRoZSBzdGFtcCBwb2xpY3kKKyAgICAgICAgICAgICAgICAgICAgaXMgIndoaXRlbGlzdCIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfU1RBTVBfUE9MSUNZPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbW9kZSBmb3IgY29tcGFyaW5nIHRpbWVzdGFtcHMgb2Ygc3RhbXAgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfSEFTSENIRUNLX0ZVTkNUSU9OPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsIGR1cmluZworICAgICAgICAgICAgICAgICAgICB0aGUgInNldHNjZW5lIiBwYXJ0IG9mIHRoZSB0YXNrJ3MgZXhlY3V0aW9uIGluIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIHRvIHZhbGlkYXRlIHRoZSBsaXN0IG9mIHRhc2sgaGFzaGVzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPkJCX1NFVFNDRU5FX1ZFUklGWV9GVU5DVElPTjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGZ1bmN0aW9uIHRvIGNhbGwgdGhhdCB2ZXJpZmllcyB0aGUgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICBwbGFubmVkIHRhc2sgZXhlY3V0aW9uIGJlZm9yZSB0aGUgbWFpbiB0YXNrIGV4ZWN1dGlvbgorICAgICAgICAgICAgICAgICAgICBoYXBwZW5zLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGZpbGVuYW1lPkJCX1NFVFNDRU5FX0RFUFZBTElEPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGEgZnVuY3Rpb24gQml0QmFrZSBjYWxscyB0aGF0IGRldGVybWluZXMKKyAgICAgICAgICAgICAgICAgICAgd2hldGhlciBCaXRCYWtlIHJlcXVpcmVzIGEgc2V0c2NlbmUgZGVwZW5kZW5jeSB0bworICAgICAgICAgICAgICAgICAgICBiZSBtZXQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZmlsZW5hbWU+QkJfVEFTS0hBU0g8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBXaXRoaW4gYW4gZXhlY3V0aW5nIHRhc2ssIHRoaXMgdmFyaWFibGUgaG9sZHMgdGhlIGhhc2gKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRhc2sgYXMgcmV0dXJuZWQgYnkgdGhlIGN1cnJlbnRseSBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSBnZW5lcmF0b3IuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtcmVmLXZhcmlhYmxlcy54bWwgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2JpdGJha2UtdXNlci1tYW51YWwtcmVmLXZhcmlhYmxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlMWI5NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1yZWYtdmFyaWFibGVzLnhtbApAQCAtMCwwICsxLDIyNjIgQEAKKzwhRE9DVFlQRSBjaGFwdGVyIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4yLy9FTiIKKyJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMi9kb2Nib29reC5kdGQiCitbPCFFTlRJVFkgJSBwb2t5IFNZU1RFTSAiLi4vcG9reS5lbnQiPiAlcG9reTsgXSA+CisKKzwhLS0gRHVtbXkgY2hhcHRlciAtLT4KKzxjaGFwdGVyIGlkPSdyZWYtdmFyaWFibGVzLWdsb3MnPgorCis8dGl0bGU+VmFyaWFibGVzIEdsb3NzYXJ5PC90aXRsZT4KKworPHBhcmE+CisgICAgVGhpcyBjaGFwdGVyIGxpc3RzIGNvbW1vbiB2YXJpYWJsZXMgdXNlZCBieSBCaXRCYWtlIGFuZCBnaXZlcyBhbiBvdmVydmlldworICAgIG9mIHRoZWlyIGZ1bmN0aW9uIGFuZCBjb250ZW50cy4KKzwvcGFyYT4KKworPG5vdGU+CisgICAgRm9sbG93aW5nIGFyZSBzb21lIHBvaW50cyByZWdhcmRpbmcgdGhlIHZhcmlhYmxlcyBsaXN0ZWQgaW4gdGhpcyBnbG9zc2FyeToKKyAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIHZhcmlhYmxlcyBsaXN0ZWQgaW4gdGhpcyBnbG9zc2FyeQorICAgICAgICAgICAgYXJlIHNwZWNpZmljIHRvIEJpdEJha2UuCisgICAgICAgICAgICBDb25zZXF1ZW50bHksIHRoZSBkZXNjcmlwdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhhdCBjb250ZXh0LgorICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT48cGFyYT5BbHNvLCB2YXJpYWJsZXMgZXhpc3QgaW4gb3RoZXIgc3lzdGVtcyB0aGF0IHVzZSBCaXRCYWtlCisgICAgICAgICAgICAoZS5nLiBUaGUgWW9jdG8gUHJvamVjdCBhbmQgT3BlbkVtYmVkZGVkKSB0aGF0IGhhdmUgbmFtZXMgaWRlbnRpY2FsCisgICAgICAgICAgICB0byB0aG9zZSBmb3VuZCBpbiB0aGlzIGdsb3NzYXJ5LgorICAgICAgICAgICAgRm9yIHN1Y2ggY2FzZXMsIHRoZSB2YXJpYWJsZXMgaW4gdGhvc2Ugc3lzdGVtcyBleHRlbmQgdGhlCisgICAgICAgICAgICBmdW5jdGlvbmFsaXR5IG9mIHRoZSB2YXJpYWJsZSBhcyBpdCBpcyBkZXNjcmliZWQgaGVyZSBpbgorICAgICAgICAgICAgdGhpcyBnbG9zc2FyeS4KKyAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+RmluYWxseSwgdGhlcmUgYXJlIHZhcmlhYmxlcyBtZW50aW9uZWQgaW4gdGhpcworICAgICAgICAgICAgZ2xvc3NhcnkgdGhhdCBkbyBub3QgYXBwZWFyIGluIHRoZSBCaXRCYWtlIGdsb3NzYXJ5LgorICAgICAgICAgICAgVGhlc2Ugb3RoZXIgdmFyaWFibGVzIGFyZSB2YXJpYWJsZXMgdXNlZCBpbiBzeXN0ZW1zIHRoYXQgdXNlCisgICAgICAgICAgICBCaXRCYWtlLgorICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+Cis8L25vdGU+CisKKzxnbG9zc2FyeSBpZD0ncmVmLXZhcmlhYmxlcy1nbG9zc2FyeSc+CisKKyAgICA8cGFyYT4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQVNTVU1FX1BST1ZJREVEJz5BPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CJz5CPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1DQUNIRSc+QzwvbGluaz4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVGQVVMVF9QUkVGRVJFTkNFJz5EPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1FWENMVURFX0ZST01fV09STEQnPkU8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUZBS0VST09UJz5GPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1HSVRESVInPkc8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUhHRElSJz5IPC9saW5rPgorPCEtLSAgICAgICA8bGluayBsaW5rZW5kPSd2YXItSUNFQ0NfRElTQUJMRUQnPkk8L2xpbms+IC0tPgorPCEtLSAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1nbG9zc2FyeS1qJz5KPC9saW5rPiAtLT4KKzwhLS0gICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUtBUkNIJz5LPC9saW5rPiAtLT4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItTEFZRVJERVBFTkRTJz5MPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1NSVJST1JTJz5NPC9saW5rPgorPCEtLSAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1nbG9zc2FyeS1uJz5OPC9saW5rPiAtLT4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItT1ZFUlJJREVTJz5PPC9saW5rPgorICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QQUNLQUdFUyc+UDwvbGluaz4KKzwhLS0gICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVFNQUtFX1BST0ZJTEVTJz5RPC9saW5rPiAtLT4KKyAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPlI8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNFQ1RJT04nPlM8L2xpbms+CisgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVQnPlQ8L2xpbms+Cis8IS0tICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1VQk9PVF9DT05GSUcnPlU8L2xpbms+IC0tPgorPCEtLSAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1nbG9zc2FyeS12Jz5WPC9saW5rPiAtLT4KKzwhLS0gICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVdBUk5fUUEnPlc8L2xpbms+IC0tPgorPCEtLSAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1nbG9zc2FyeS14Jz5YPC9saW5rPiAtLT4KKzwhLS0gICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItZ2xvc3NhcnkteSc+WTwvbGluaz4gLS0+Cis8IS0tICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLWdsb3NzYXJ5LXonPlo8L2xpbms+LS0+CisgICAgPC9wYXJhPgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktYSc+PHRpdGxlPkE8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQVNTVU1FX1BST1ZJREVEJz48Z2xvc3N0ZXJtPkFTU1VNRV9QUk9WSURFRDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBMaXN0cyByZWNpcGUgbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgKDxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+PGZpbGVuYW1lPlBOPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcykgQml0QmFrZSBkb2VzIG5vdCBhdHRlbXB0IHRvIGJ1aWxkLgorICAgICAgICAgICAgICAgICAgICBJbnN0ZWFkLCBCaXRCYWtlIGFzc3VtZXMgdGhlc2UgcmVjaXBlcyBoYXZlIGFscmVhZHkgYmVlbgorICAgICAgICAgICAgICAgICAgICBidWlsdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSW4gT3BlbkVtYmVkZGVkIENvcmUsIDxmaWxlbmFtZT5BU1NVTUVfUFJPVklERUQ8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBtb3N0bHkgc3BlY2lmaWVzIG5hdGl2ZSB0b29scyB0aGF0IHNob3VsZCBub3QgYmUgYnVpbHQuCisgICAgICAgICAgICAgICAgICAgIEFuIGV4YW1wbGUgaXMgPGZpbGVuYW1lPmdpdC1uYXRpdmU8L2ZpbGVuYW1lPiwgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgd2hlbiBzcGVjaWZpZWQgYWxsb3dzIGZvciB0aGUgR2l0IGJpbmFyeSBmcm9tIHRoZSBob3N0IHRvCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgcmF0aGVyIHRoYW4gYnVpbGRpbmcKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmdpdC1uYXRpdmU8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1iJz48dGl0bGU+QjwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CJz48Z2xvc3N0ZXJtPkI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBCaXRCYWtlIGV4ZWN1dGVzIGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYSByZWNpcGUncyBidWlsZCBwcm9jZXNzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0FMTE9XRURfTkVUV09SS1MnPjxnbG9zc3Rlcm0+QkJfQUxMT1dFRF9ORVRXT1JLUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBzcGFjZS1kZWxpbWl0ZWQgbGlzdCBvZiBob3N0cyB0aGF0IHRoZSBmZXRjaGVyCisgICAgICAgICAgICAgICAgICAgIGlzIGFsbG93ZWQgdG8gdXNlIHRvIG9idGFpbiB0aGUgcmVxdWlyZWQgc291cmNlIGNvZGUuCisgICAgICAgICAgICAgICAgICAgIEZvbGxvd2luZyBhcmUgY29uc2lkZXJhdGlvbnMgc3Vycm91bmRpbmcgdGhpcyB2YXJpYWJsZToKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGhvc3QgbGlzdCBpcyBvbmx5IHVzZWQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfTk9fTkVUV09SSyc+PGZpbGVuYW1lPkJCX05PX05FVFdPUks8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlaXRoZXIgbm90IHNldCBvciBzZXQgdG8gIjAiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0ZWQgc3VwcG9ydCBmb3Igd2lsZGNhcmQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgaG9zdCBuYW1lcyBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2V0dGluZyBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmdpdC5nbnUub3JnPC9maWxlbmFtZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmZ0cC5nbnUub3JnPC9maWxlbmFtZT4sIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5mb28uZ2l0LmdudS5vcmc8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCX0FMTE9XRURfTkVUV09SS1MgPSAiKi5nbnUub3JnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXJyb3JzIG5vdCBpbiB0aGUgaG9zdCBsaXN0IGFyZSBza2lwcGVkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZCBpbiBkZWJ1Zy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRlbXB0cyB0byBhY2Nlc3MgbmV0d29ya3Mgbm90IGluIHRoZSBob3N0IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSBhIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICBVc2luZyA8ZmlsZW5hbWU+QkJfQUxMT1dFRF9ORVRXT1JLUzwvZmlsZW5hbWU+IGluCisgICAgICAgICAgICAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSRU1JUlJPUlMnPjxmaWxlbmFtZT5QUkVNSVJST1JTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGlzIHZlcnkgdXNlZnVsLgorICAgICAgICAgICAgICAgICAgICBBZGRpbmcgdGhlIGhvc3QgeW91IHdhbnQgdG8gdXNlIHRvCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5QUkVNSVJST1JTPC9maWxlbmFtZT4gcmVzdWx0cyBpbiB0aGUgc291cmNlIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgYmVpbmcgZmV0Y2hlZCBmcm9tIGFuIGFsbG93ZWQgbG9jYXRpb24gYW5kIGF2b2lkcyByYWlzaW5nCisgICAgICAgICAgICAgICAgICAgIGFuIGVycm9yIHdoZW4gYSBob3N0IHRoYXQgaXMgbm90IGFsbG93ZWQgaXMgaW4gYQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU1JDX1VSSSc+PGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LgorICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIGZldGNoZXIgZG9lcyBub3QgYXR0ZW1wdCB0byB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIGhvc3QgbGlzdGVkIGluIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4gYWZ0ZXIgYQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsIGZldGNoIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5QUkVNSVJST1JTPC9maWxlbmFtZT4gb2NjdXJzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0NPTlNPTEVMT0cnPjxnbG9zc3Rlcm0+QkJfQ09OU09MRUxPRzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhdGggdG8gYSBsb2cgZmlsZSBpbnRvIHdoaWNoIEJpdEJha2UncyB1c2VyCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSB3cml0ZXMgb3V0cHV0IGR1cmluZyB0aGUgYnVpbGQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfQ1VSUkVOVFRBU0snPjxnbG9zc3Rlcm0+QkJfQ1VSUkVOVFRBU0s8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRhc2suCisgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIGRvZXMgbm90IGluY2x1ZGUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5kb188L2ZpbGVuYW1lPiBwcmVmaXguCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfREFOR0xJTkdBUFBFTkRTX1dBUk5PTkxZJz48Z2xvc3N0ZXJtPkJCX0RBTkdMSU5HQVBQRU5EU19XQVJOT05MWTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIGhvdyBCaXRCYWtlIGhhbmRsZXMgc2l0dWF0aW9ucyB3aGVyZSBhbiBhcHBlbmQKKyAgICAgICAgICAgICAgICAgICAgZmlsZSAoPGZpbGVuYW1lPi5iYmFwcGVuZDwvZmlsZW5hbWU+KSBoYXMgbm8KKyAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZWNpcGUgZmlsZSAoPGZpbGVuYW1lPi5iYjwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBjb25kaXRpb24gb2Z0ZW4gb2NjdXJzIHdoZW4gbGF5ZXJzIGdldCBvdXQgb2Ygc3luYworICAgICAgICAgICAgICAgICAgICAoZS5nLiA8ZmlsZW5hbWU+b2UtY29yZTwvZmlsZW5hbWU+IGJ1bXBzIGEKKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlIHZlcnNpb24gYW5kIHRoZSBvbGQgcmVjaXBlIG5vIGxvbmdlciBleGlzdHMgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICBvdGhlciBsYXllciBoYXMgbm90IGJlZW4gdXBkYXRlZCB0byB0aGUgbmV3IHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJlY2lwZSB5ZXQpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBmYXRhbCBiZWhhdmlvciBpcyBzYWZlc3QgYmVjYXVzZSBpdCBpcworICAgICAgICAgICAgICAgICAgICB0aGUgc2FuZSByZWFjdGlvbiBnaXZlbiBzb21ldGhpbmcgaXMgb3V0IG9mIHN5bmMuCisgICAgICAgICAgICAgICAgICAgIEl0IGlzIGltcG9ydGFudCB0byByZWFsaXplIHdoZW4geW91ciBjaGFuZ2VzIGFyZSBubyBsb25nZXIKKyAgICAgICAgICAgICAgICAgICAgYmVpbmcgYXBwbGllZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9ERUZBVUxUX1RBU0snPjxnbG9zc3Rlcm0+QkJfREVGQVVMVF9UQVNLPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRhc2sgdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgKGUuZy4KKyAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgPGZpbGVuYW1lPi1jPC9maWxlbmFtZT4gY29tbWFuZCBsaW5lIG9wdGlvbikuCisgICAgICAgICAgICAgICAgICAgIFRoZSB0YXNrIG5hbWUgc3BlY2lmaWVkIHNob3VsZCBub3QgaW5jbHVkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmRvXzwvZmlsZW5hbWU+IHByZWZpeC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9ESVNLTU9OX0RJUlMnPjxnbG9zc3Rlcm0+QkJfRElTS01PTl9ESVJTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE1vbml0b3JzIGRpc2sgc3BhY2UgYW5kIGF2YWlsYWJsZSBpbm9kZXMgZHVyaW5nIHRoZSBidWlsZAorICAgICAgICAgICAgICAgICAgICBhbmQgYWxsb3dzIHlvdSB0byBjb250cm9sIHRoZSBidWlsZCBiYXNlZCBvbiB0aGVzZQorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEaXNrIHNwYWNlIG1vbml0b3JpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBzZXR0aW5nIHRoaXMgdmFyaWFibGUsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm06CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfRElTS01PTl9ESVJTID0gIiZsdDthY3Rpb24mZ3Q7LCZsdDtkaXImZ3Q7LCZsdDt0aHJlc2hvbGQmZ3Q7IFsuLi5dIgorCisgICAgIHdoZXJlOgorCisgICAgICAgICZsdDthY3Rpb24mZ3Q7IGlzOgorICAgICAgICAgICBBQk9SVDogICAgIEltbWVkaWF0ZWx5IGFib3J0IHRoZSBidWlsZCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgYSB0aHJlc2hvbGQgaXMgYnJva2VuLgorICAgICAgICAgICBTVE9QVEFTS1M6IFN0b3AgdGhlIGJ1aWxkIGFmdGVyIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmcgdGFza3MgaGF2ZSBmaW5pc2hlZCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgYSB0aHJlc2hvbGQgaXMgYnJva2VuLgorICAgICAgICAgICBXQVJOOiAgICAgIElzc3VlIGEgd2FybmluZyBidXQgY29udGludWUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgYnVpbGQgd2hlbiBhIHRocmVzaG9sZCBpcyBicm9rZW4uCisgICAgICAgICAgICAgICAgICAgICAgU3Vic2VxdWVudCB3YXJuaW5ncyBhcmUgaXNzdWVkIGFzCisgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfRElTS01PTl9XQVJOSU5URVJWQUwnPkJCX0RJU0tNT05fV0FSTklOVEVSVkFMPC9saW5rPiB2YXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aGljaCBtdXN0IGJlIGRlZmluZWQuCisKKyAgICAgICAgJmx0O2RpciZndDsgaXM6CisgICAgICAgICAgIEFueSBkaXJlY3RvcnkgeW91IGNob29zZS4gWW91IGNhbiBzcGVjaWZ5IG9uZSBvcgorICAgICAgICAgICBtb3JlIGRpcmVjdG9yaWVzIHRvIG1vbml0b3IgYnkgc2VwYXJhdGluZyB0aGUKKyAgICAgICAgICAgZ3JvdXBpbmdzIHdpdGggYSBzcGFjZS4gIElmIHR3byBkaXJlY3RvcmllcyBhcmUKKyAgICAgICAgICAgb24gdGhlIHNhbWUgZGV2aWNlLCBvbmx5IHRoZSBmaXJzdCBkaXJlY3RvcnkKKyAgICAgICAgICAgaXMgbW9uaXRvcmVkLgorCisgICAgICAgICZsdDt0aHJlc2hvbGQmZ3Q7IGlzOgorICAgICAgICAgICBFaXRoZXIgdGhlIG1pbmltdW0gYXZhaWxhYmxlIGRpc2sgc3BhY2UsCisgICAgICAgICAgIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmVlIGlub2Rlcywgb3IKKyAgICAgICAgICAgYm90aC4gIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lLiAgVG8KKyAgICAgICAgICAgb21pdCBvbmUgb3IgdGhlIG90aGVyLCBzaW1wbHkgb21pdCB0aGUgdmFsdWUuCisgICAgICAgICAgIFNwZWNpZnkgdGhlIHRocmVzaG9sZCB1c2luZyBHLCBNLCBLIGZvciBHYnl0ZXMsCisgICAgICAgICAgIE1ieXRlcywgYW5kIEtieXRlcywgcmVzcGVjdGl2ZWx5LiBJZiB5b3UgZG8KKyAgICAgICAgICAgbm90IHNwZWNpZnkgRywgTSwgb3IgSywgS2J5dGVzIGlzIGFzc3VtZWQgYnkKKyAgICAgICAgICAgZGVmYXVsdC4gIERvIG5vdCB1c2UgR0IsIE1CLCBvciBLQi4KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCX0RJU0tNT05fRElSUyA9ICJBQk9SVCwke1RNUERJUn0sMUcsMTAwSyBXQVJOLCR7U1NUQVRFX0RJUn0sMUcsMTAwSyIKKyAgICAgQkJfRElTS01PTl9ESVJTID0gIlNUT1BUQVNLUywke1RNUERJUn0sMUciCisgICAgIEJCX0RJU0tNT05fRElSUyA9ICJBQk9SVCwke1RNUERJUn0sLDEwMEsiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IGV4YW1wbGUgd29ya3Mgb25seSBpZiB5b3UgYWxzbyBzZXQKKyAgICAgICAgICAgICAgICAgICAgdGhlIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9ESVNLTU9OX1dBUk5JTlRFUlZBTCc+PGZpbGVuYW1lPkJCX0RJU0tNT05fV0FSTklOVEVSVkFMPC9maWxlbmFtZT48L2xpbms+IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICBUaGlzIGV4YW1wbGUgY2F1c2VzIHRoZSBidWlsZCBzeXN0ZW0gdG8gaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICAgICAgICAgYWJvcnQgd2hlbiBlaXRoZXIgdGhlIGRpc2sgc3BhY2UgaW4gPGZpbGVuYW1lPiR7VE1QRElSfTwvZmlsZW5hbWU+IGRyb3BzCisgICAgICAgICAgICAgICAgICAgIGJlbG93IDEgR2J5dGUgb3IgdGhlIGF2YWlsYWJsZSBmcmVlIGlub2RlcyBkcm9wcyBiZWxvdworICAgICAgICAgICAgICAgICAgICAxMDAgS2J5dGVzLgorICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIHR3byBkaXJlY3RvcmllcyBhcmUgcHJvdmlkZWQgd2l0aCB0aGUgdmFyaWFibGUsIHRoZQorICAgICAgICAgICAgICAgICAgICBidWlsZCBzeXN0ZW0gYWxzbyBpc3N1ZXMgYQorICAgICAgICAgICAgICAgICAgICB3YXJuaW5nIHdoZW4gdGhlIGRpc2sgc3BhY2UgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4ke1NTVEFURV9ESVJ9PC9maWxlbmFtZT4gZGlyZWN0b3J5IGRyb3BzCisgICAgICAgICAgICAgICAgICAgIGJlbG93IDEgR2J5dGUgb3IgdGhlIG51bWJlciBvZiBmcmVlIGlub2RlcyBkcm9wcworICAgICAgICAgICAgICAgICAgICBiZWxvdyAxMDAgS2J5dGVzLgorICAgICAgICAgICAgICAgICAgICBTdWJzZXF1ZW50IHdhcm5pbmdzIGFyZSBpc3N1ZWQgZHVyaW5nIGludGVydmFscyBhcworICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSA8ZmlsZW5hbWU+QkJfRElTS01PTl9XQVJOSU5URVJWQUw8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHNlY29uZCBleGFtcGxlIHN0b3BzIHRoZSBidWlsZCBhZnRlciBhbGwgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGluZyB0YXNrcyBjb21wbGV0ZSB3aGVuIHRoZSBtaW5pbXVtIGRpc2sgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIDxmaWxlbmFtZT4ke1RNUERJUn08L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgZHJvcHMgYmVsb3cgMSBHYnl0ZS4KKyAgICAgICAgICAgICAgICAgICAgTm8gZGlzayBtb25pdG9yaW5nIG9jY3VycyBmb3IgdGhlIGZyZWUgaW5vZGVzIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZpbmFsIGV4YW1wbGUgaW1tZWRpYXRlbHkgYWJvcnRzIHRoZSBidWlsZCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZnJlZSBpbm9kZXMgaW4gdGhlIDxmaWxlbmFtZT4ke1RNUERJUn08L2ZpbGVuYW1lPiBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgZHJvcHMgYmVsb3cgMTAwIEtieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgTm8gZGlzayBzcGFjZSBtb25pdG9yaW5nIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZiBvY2N1cnMKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0RJU0tNT05fV0FSTklOVEVSVkFMJz48Z2xvc3N0ZXJtPkJCX0RJU0tNT05fV0FSTklOVEVSVkFMPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGRpc2sgc3BhY2UgYW5kIGZyZWUgaW5vZGUgd2FybmluZyBpbnRlcnZhbHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+QkJfRElTS01PTl9XQVJOSU5URVJWQUw8L2ZpbGVuYW1lPiB2YXJpYWJsZSwgeW91IG11c3QKKyAgICAgICAgICAgICAgICAgICAgYWxzbyB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9ESVNLTU9OX0RJUlMnPjxmaWxlbmFtZT5CQl9ESVNLTU9OX0RJUlM8L2ZpbGVuYW1lPjwvbGluaz4gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlZmluZSBpdHMgYWN0aW9uIGFzICJXQVJOIi4KKyAgICAgICAgICAgICAgICAgICAgRHVyaW5nIHRoZSBidWlsZCwgc3Vic2VxdWVudCB3YXJuaW5ncyBhcmUgaXNzdWVkIGVhY2ggdGltZQorICAgICAgICAgICAgICAgICAgICBkaXNrIHNwYWNlIG9yIG51bWJlciBvZiBmcmVlIGlub2RlcyBmdXJ0aGVyIHJlZHVjZXMgYnkKKyAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BlY3RpdmUgaW50ZXJ2YWwuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3QgcHJvdmlkZSBhIDxmaWxlbmFtZT5CQl9ESVNLTU9OX1dBUk5JTlRFUlZBTDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGFuZCB5b3UgZG8gdXNlIDxmaWxlbmFtZT5CQl9ESVNLTU9OX0RJUlM8L2ZpbGVuYW1lPiB3aXRoCisgICAgICAgICAgICAgICAgICAgIHRoZSAiV0FSTiIgYWN0aW9uLCB0aGUgZGlzayBtb25pdG9yaW5nIGludGVydmFsIGRlZmF1bHRzIHRvCisgICAgICAgICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfRElTS01PTl9XQVJOSU5URVJWQUwgPSAiNTBNLDVLIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdoZW4gc3BlY2lmeWluZyB0aGUgdmFyaWFibGUgaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUsCisgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgZm9sbG93aW5nIGZvcm06CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJfRElTS01PTl9XQVJOSU5URVJWQUwgPSAiJmx0O2Rpc2tfc3BhY2VfaW50ZXJ2YWwmZ3Q7LCZsdDtkaXNrX2lub2RlX2ludGVydmFsJmd0OyIKKworICAgICB3aGVyZToKKworICAgICAgICAmbHQ7ZGlza19zcGFjZV9pbnRlcnZhbCZndDsgaXM6CisgICAgICAgICAgIEFuIGludGVydmFsIG9mIG1lbW9yeSBleHByZXNzZWQgaW4gZWl0aGVyCisgICAgICAgICAgIEcsIE0sIG9yIEsgZm9yIEdieXRlcywgTWJ5dGVzLCBvciBLYnl0ZXMsCisgICAgICAgICAgIHJlc3BlY3RpdmVseS4gWW91IGNhbm5vdCB1c2UgR0IsIE1CLCBvciBLQi4KKworICAgICAgICAmbHQ7ZGlza19pbm9kZV9pbnRlcnZhbCZndDsgaXM6CisgICAgICAgICAgIEFuIGludGVydmFsIG9mIGZyZWUgaW5vZGVzIGV4cHJlc3NlZCBpbiBlaXRoZXIKKyAgICAgICAgICAgRywgTSwgb3IgSyBmb3IgR2J5dGVzLCBNYnl0ZXMsIG9yIEtieXRlcywKKyAgICAgICAgICAgcmVzcGVjdGl2ZWx5LiBZb3UgY2Fubm90IHVzZSBHQiwgTUIsIG9yIEtCLgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBCQl9ESVNLTU9OX0RJUlMgPSAiV0FSTiwke1NTVEFURV9ESVJ9LDFHLDEwMEsiCisgICAgIEJCX0RJU0tNT05fV0FSTklOVEVSVkFMID0gIjUwTSw1SyIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGVzZSB2YXJpYWJsZXMgY2F1c2UgQml0QmFrZSB0bworICAgICAgICAgICAgICAgICAgICBpc3N1ZSBzdWJzZXF1ZW50IHdhcm5pbmdzIGVhY2ggdGltZSB0aGUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIGRpc2sgc3BhY2UgZnVydGhlciByZWR1Y2VzIGJ5IDUwIE1ieXRlcyBvciB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIG9mIGZyZWUgaW5vZGVzIGZ1cnRoZXIgcmVkdWNlcyBieSA1IEtieXRlcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7U1NUQVRFX0RJUn08L2ZpbGVuYW1lPiBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIFN1YnNlcXVlbnQgd2FybmluZ3MgYmFzZWQgb24gdGhlIGludGVydmFsIG9jY3VyIGVhY2ggdGltZQorICAgICAgICAgICAgICAgICAgICBhIHJlc3BlY3RpdmUgaW50ZXJ2YWwgaXMgcmVhY2hlZCBiZXlvbmQgdGhlIGluaXRpYWwgd2FybmluZworICAgICAgICAgICAgICAgICAgICAoaS5lLiAxIEdieXRlcyBhbmQgMTAwIEtieXRlcykuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfRU5WX1dISVRFTElTVCc+PGdsb3NzdGVybT5CQl9FTlZfV0hJVEVMSVNUPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgaW50ZXJuYWwgd2hpdGVsaXN0IG9mIHZhcmlhYmxlcyB0byBhbGxvdworICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGZyb20gdGhlIGV4dGVybmFsIGVudmlyb25tZW50IGludG8gQml0QmFrZSdzCisgICAgICAgICAgICAgICAgICAgIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB0aGUgZm9sbG93aW5nIGxpc3QgaXMgdXNlZDoKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCUEFUSCc+PGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+PC9saW5rPiwKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1BSRVNFUlZFX0VOVic+PGZpbGVuYW1lPkJCX1BSRVNFUlZFX0VOVjwvZmlsZW5hbWU+PC9saW5rPiwKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0VOVl9XSElURUxJU1QnPjxmaWxlbmFtZT5CQl9FTlZfV0hJVEVMSVNUPC9maWxlbmFtZT48L2xpbms+LAorICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0VOVl9FWFRSQVdISVRFJz48ZmlsZW5hbWU+QkJfRU5WX0VYVFJBV0hJVEU8L2ZpbGVuYW1lPjwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGV4dGVybmFsIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICBpbiBvcmRlciBmb3IgaXQgdG8gd29yay4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0VOVl9FWFRSQVdISVRFJz48Z2xvc3N0ZXJtPkJCX0VOVl9FWFRSQVdISVRFPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhbiBhZGRpdGlvbmFsIHNldCBvZiB2YXJpYWJsZXMgdG8gYWxsb3cgdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAod2hpdGVsaXN0KSBmcm9tIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBpbnRvIEJpdEJha2UncworICAgICAgICAgICAgICAgICAgICBkYXRhc3RvcmUuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgbGlzdCBvZiB2YXJpYWJsZXMgYXJlIG9uIHRvcCBvZiB0aGUgaW50ZXJuYWwgbGlzdAorICAgICAgICAgICAgICAgICAgICBzZXQgaW4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0VOVl9XSElURUxJU1QnPjxmaWxlbmFtZT5CQl9FTlZfV0hJVEVMSVNUPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IHNldCB0aGlzIHZhcmlhYmxlIGluIHRoZSBleHRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgaW4gb3JkZXIgZm9yIGl0IHRvIHdvcmsuCisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9GRVRDSF9QUkVNSVJST1JPTkxZJz48Z2xvc3N0ZXJtPkJCX0ZFVENIX1BSRU1JUlJPUk9OTFk8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBzZXQgdG8gIjEiLCBjYXVzZXMgQml0QmFrZSdzIGZldGNoZXIgbW9kdWxlIHRvIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QUkVNSVJST1JTJz48ZmlsZW5hbWU+UFJFTUlSUk9SUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2Ugd2lsbCBub3Qgc2VhcmNoIHRoZSBtYWluCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TUkNfVVJJJz48ZmlsZW5hbWU+U1JDX1VSSTwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItTUlSUk9SUyc+PGZpbGVuYW1lPk1JUlJPUlM8L2ZpbGVuYW1lPjwvbGluaz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfRklMRU5BTUUnPjxnbG9zc3Rlcm0+QkJfRklMRU5BTUU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29udGFpbnMgdGhlIGZpbGVuYW1lIG9mIHRoZSByZWNpcGUgdGhhdCBvd25zIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZyB0YXNrLgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIDxmaWxlbmFtZT5kb19mZXRjaDwvZmlsZW5hbWU+IHRhc2sgdGhhdAorICAgICAgICAgICAgICAgICAgICByZXNpZGVzIGluIHRoZSA8ZmlsZW5hbWU+bXktcmVjaXBlLmJiPC9maWxlbmFtZT4gaXMKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nLCB0aGUgPGZpbGVuYW1lPkJCX0ZJTEVOQU1FPC9maWxlbmFtZT4gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgIi9mb28vcGF0aC9teS1yZWNpcGUuYmIiLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUyc+PGdsb3NzdGVybT5CQl9HRU5FUkFURV9NSVJST1JfVEFSQkFMTFM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ2F1c2VzIHRhcmJhbGxzIG9mIHRoZSBHaXQgcmVwb3NpdG9yaWVzLCBpbmNsdWRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIEdpdCBtZXRhZGF0YSwgdG8gYmUgcGxhY2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRExfRElSJz48ZmlsZW5hbWU+RExfRElSPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgQW55b25lIHdpc2hpbmcgdG8gY3JlYXRlIGEgc291cmNlIG1pcnJvciB3b3VsZCB3YW50IHRvCisgICAgICAgICAgICAgICAgICAgIGVuYWJsZSB0aGlzIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgY3JlYXRpbmcgYW5kIHBsYWNpbmcgdGFyYmFsbHMgb2YKKyAgICAgICAgICAgICAgICAgICAgdGhlIEdpdCByZXBvc2l0b3JpZXMgaXMgbm90IHRoZSBkZWZhdWx0IGFjdGlvbiBieSBCaXRCYWtlLgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUyA9ICIxIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfSEFTSENPTkZJR19XSElURUxJU1QnPjxnbG9zc3Rlcm0+QkJfSEFTSENPTkZJR19XSElURUxJU1Q8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTGlzdHMgdmFyaWFibGVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gYmFzZSBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtLCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY2FjaGUgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHJldXNlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT25lIG9mIHRoZSB3YXlzIEJpdEJha2UgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJlLXBhcnNlIHRoZQorICAgICAgICAgICAgICAgICAgICBtYWluIG1ldGFkYXRhIGlzIHRocm91Z2ggY2hlY2tzdW1zIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIGRhdGFzdG9yZSBvZiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSB2YXJpYWJsZXMgdGhhdCB5b3UgdHlwaWNhbGx5IHdhbnQgdG8gZXhjbHVkZSB3aGVuCisgICAgICAgICAgICAgICAgICAgIGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IHRvIHJlLXBhcnNlIGFuZCB0aHVzIHJlYnVpbGQgdGhlCisgICAgICAgICAgICAgICAgICAgIGNhY2hlLgorICAgICAgICAgICAgICAgICAgICBBcyBhbiBleGFtcGxlLCB5b3Ugd291bGQgdXN1YWxseSBleGNsdWRlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5USU1FPC9maWxlbmFtZT4gYW5kIDxmaWxlbmFtZT5EQVRFPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGVzZSB2YXJpYWJsZXMgYXJlIGFsd2F5cyBjaGFuZ2luZy4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRpZCBub3QgZXhjbHVkZSB0aGVtLCBCaXRCYWtlIHdvdWxkIG5ldmVyIHJldXNlIHRoZQorICAgICAgICAgICAgICAgICAgICBjYWNoZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9IQVNIQkFTRV9XSElURUxJU1QnPjxnbG9zc3Rlcm0+QkJfSEFTSEJBU0VfV0hJVEVMSVNUPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIExpc3RzIHZhcmlhYmxlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIGNoZWNrc3VtIGFuZAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5IGRhdGEuCisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlcyB0aGF0IGFyZSBleGNsdWRlZCBjYW4gdGhlcmVmb3JlIGNoYW5nZSB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgIGFmZmVjdGluZyB0aGUgY2hlY2tzdW0gbWVjaGFuaXNtLgorICAgICAgICAgICAgICAgICAgICBBIGNvbW1vbiBleGFtcGxlIHdvdWxkIGJlIHRoZSB2YXJpYWJsZSBmb3IgdGhlIHBhdGggb2YKKyAgICAgICAgICAgICAgICAgICAgdGhlIGJ1aWxkLgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlJ3Mgb3V0cHV0IHNob3VsZCBub3QgKGFuZCB1c3VhbGx5IGRvZXMgbm90KSBkZXBlbmQKKyAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCB3YXMgYnVpbHQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfSEFTSENIRUNLX0ZVTkNUSU9OJz48Z2xvc3N0ZXJtPkJCX0hBU0hDSEVDS19GVU5DVElPTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgZHVyaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAic2V0c2NlbmUiIHBhcnQgb2YgdGhlIHRhc2sncyBleGVjdXRpb24gaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUgdGhlIGxpc3Qgb2YgdGFzayBoYXNoZXMuCisgICAgICAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIHNldHNjZW5lIHRhc2tzIHRoYXQgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgIGJlIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBdCB0aGlzIHBvaW50IGluIHRoZSBleGVjdXRpb24gb2YgdGhlIGNvZGUsIHRoZSBvYmplY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgaXMgdG8gcXVpY2tseSB2ZXJpZnkgaWYgYSBnaXZlbiBzZXRzY2VuZSBmdW5jdGlvbiBpcyBsaWtlbHkKKyAgICAgICAgICAgICAgICAgICAgdG8gd29yayBvciBub3QuCisgICAgICAgICAgICAgICAgICAgIEl0J3MgZWFzaWVyIHRvIGNoZWNrIHRoZSBsaXN0IG9mIHNldHNjZW5lIGZ1bmN0aW9ucyBpbgorICAgICAgICAgICAgICAgICAgICBvbmUgcGFzcyB0aGFuIHRvIGNhbGwgbWFueSBpbmRpdmlkdWFsIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICBUaGUgcmV0dXJuZWQgbGlzdCBuZWVkIG5vdCBiZSBjb21wbGV0ZWx5IGFjY3VyYXRlLgorICAgICAgICAgICAgICAgICAgICBBIGdpdmVuIHNldHNjZW5lIHRhc2sgY2FuIHN0aWxsIGxhdGVyIGZhaWwuCisgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBtb3JlIGFjY3VyYXRlIHRoZSBkYXRhIHJldHVybmVkLCB0aGUgbW9yZQorICAgICAgICAgICAgICAgICAgICBlZmZpY2llbnQgdGhlIGJ1aWxkIHdpbGwgYmUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfSU5WQUxJRENPTkYnPjxnbG9zc3Rlcm0+QkJfSU5WQUxJRENPTkY8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Q29uZmlnUGFyc2VkPC9maWxlbmFtZT4gZXZlbnQgdG8gdHJpZ2dlcgorICAgICAgICAgICAgICAgICAgICByZS1wYXJzaW5nIHRoZSBiYXNlIG1ldGFkYXRhIChpLmUuIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlcykuCisgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+Q29uZmlnUGFyc2VkPC9maWxlbmFtZT4gZXZlbnQgY2FuIHNldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgdG8gdHJpZ2dlciB0aGUgcmUtcGFyc2UuCisgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IGJlIGNhcmVmdWwgdG8gYXZvaWQgcmVjdXJzaXZlIGxvb3BzIHdpdGggdGhpcworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX0xPR0ZNVCc+PGdsb3NzdGVybT5CQl9MT0dGTVQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBsb2cgZmlsZXMgc2F2ZWQgaW50bworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+JHs8L2ZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1UJz48ZmlsZW5hbWU+VDwvZmlsZW5hbWU+PC9saW5rPjxmaWxlbmFtZT59PC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSA8ZmlsZW5hbWU+QkJfTE9HRk1UPC9maWxlbmFtZT4gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkIGFuZCB0aGUgbG9nIGZpbGUgbmFtZXMgZ2V0IGNyZWF0ZWQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBmb3JtOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIGxvZy57dGFza30ue3BpZH0KKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBmb3JjZSBsb2cgZmlsZXMgdG8gdGFrZSBhIHNwZWNpZmljIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gc2V0IHRoaXMgdmFyaWFibGUgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfTklDRV9MRVZFTCc+PGdsb3NzdGVybT5CQl9OSUNFX0xFVkVMPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFsbG93cyBCaXRCYWtlIHRvIHJ1biBhdCBhIHNwZWNpZmljIHByaW9yaXR5CisgICAgICAgICAgICAgICAgICAgIChpLmUuIG5pY2UgbGV2ZWwpLgorICAgICAgICAgICAgICAgICAgICBTeXN0ZW0gcGVybWlzc2lvbnMgdXN1YWxseSBtZWFuIHRoYXQgQml0QmFrZSBjYW4gcmVkdWNlIGl0cworICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSBidXQgbm90IHJhaXNlIGl0IGFnYWluLgorICAgICAgICAgICAgICAgICAgICBTZWUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1RBU0tfTklDRV9MRVZFTCc+PGZpbGVuYW1lPkJCX1RBU0tfTklDRV9MRVZFTDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9OT19ORVRXT1JLJz48Z2xvc3N0ZXJtPkJCX05PX05FVFdPUks8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRGlzYWJsZXMgbmV0d29yayBhY2Nlc3MgaW4gdGhlIEJpdEJha2UgZmV0Y2hlciBtb2R1bGVzLgorICAgICAgICAgICAgICAgICAgICBXaXRoIHRoaXMgYWNjZXNzIGRpc2FibGVkLCBhbnkgY29tbWFuZCB0aGF0IGF0dGVtcHRzIHRvCisgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB0aGUgbmV0d29yayBiZWNvbWVzIGFuIGVycm9yLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEaXNhYmxpbmcgbmV0d29yayBhY2Nlc3MgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICBtaXJyb3JzLCBydW5uaW5nIGJ1aWxkcyB3aGVuIG5vdCBjb25uZWN0ZWQgdG8gdGhlIEludGVybmV0LAorICAgICAgICAgICAgICAgICAgICBhbmQgd2hlbiBvcGVyYXRpbmcgaW4gY2VydGFpbiBraW5kcyBvZiBmaXJld2FsbAorICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfTlVNQkVSX1RIUkVBRFMnPjxnbG9zc3Rlcm0+QkJfTlVNQkVSX1RIUkVBRFM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIEJpdEJha2Ugc2hvdWxkIHJ1biBpbiBwYXJhbGxlbAorICAgICAgICAgICAgICAgICAgICBhdCBhbnkgb25lIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIElmIHlvdXIgaG9zdCBkZXZlbG9wbWVudCBzeXN0ZW0gc3VwcG9ydHMgbXVsdGlwbGUgY29yZXMsCisgICAgICAgICAgICAgICAgICAgIGEgZ29vZCBydWxlIG9mIHRodW1iIGlzIHRvIHNldCB0aGlzIHZhcmlhYmxlIHRvIHR3aWNlIHRoZQorICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgY29yZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfTlVNQkVSX1BBUlNFX1RIUkVBRFMnPjxnbG9zc3Rlcm0+QkJfTlVNQkVSX1BBUlNFX1RIUkVBRFM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU2V0cyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgQml0QmFrZSB1c2VzIHdoZW4gcGFyc2luZy4KKyAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIG51bWJlciBvZiB0aHJlYWRzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgb2YgY29yZXMgb24gdGhlIHN5c3RlbS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9PUklHRU5WJz48Z2xvc3N0ZXJtPkJCX09SSUdFTlY8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29udGFpbnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBleHRlcm5hbCBlbnZpcm9ubWVudCBpbgorICAgICAgICAgICAgICAgICAgICB3aGljaCBCaXRCYWtlIHdhcyBydW4uCisgICAgICAgICAgICAgICAgICAgIFRoZSBjb3B5IGlzIHRha2VuIGJlZm9yZSBhbnkgd2hpdGVsaXN0ZWQgdmFyaWFibGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIGFyZSBmaWx0ZXJlZCBpbnRvIEJpdEJha2UncyBkYXRhc3RvcmUuCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgdmFyaWFibGUgaXMgYSBkYXRhc3RvcmUgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBxdWVyaWVkIHVzaW5nIHRoZSBub3JtYWwgZGF0YXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfUFJFU0VSVkVfRU5WJz48Z2xvc3N0ZXJtPkJCX1BSRVNFUlZFX0VOVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyB3aGl0ZWxpc3RpbmcgYW5kIGluc3RlYWQgYWxsb3dzIGFsbCB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgdGhyb3VnaCBmcm9tIHRoZSBleHRlcm5hbCBlbnZpcm9ubWVudCBpbnRvIEJpdEJha2UncworICAgICAgICAgICAgICAgICAgICBkYXRhc3RvcmUuCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBpbiBvcmRlciBmb3IgaXQgdG8gd29yay4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1JVTkZNVCc+PGdsb3NzdGVybT5CQl9SVU5GTVQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHNjcmlwdCBmaWxlcworICAgICAgICAgICAgICAgICAgICAoaS5lLiBydW4gZmlsZXMpIHNhdmVkIGludG8KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7PC9maWxlbmFtZT48bGluayBsaW5rZW5kPSd2YXItVCc+PGZpbGVuYW1lPlQ8L2ZpbGVuYW1lPjwvbGluaz48ZmlsZW5hbWU+fTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGUgPGZpbGVuYW1lPkJCX1JVTkZNVDwvZmlsZW5hbWU+IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHJ1biBmaWxlIG5hbWVzIGdldCBjcmVhdGVkIHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBydW4ue3Rhc2t9LntwaWR9CisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gZm9yY2UgcnVuIGZpbGVzIHRvIHRha2UgYSBzcGVjaWZpYyBuYW1lLAorICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHNldCB0aGlzIHZhcmlhYmxlIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1JVTlRBU0snPjxnbG9zc3Rlcm0+QkJfUlVOVEFTSzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDb250YWlucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrLgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgZG9lcyBub3QgaW5jbHVkZSB0aGUgImRvXyIgcHJlZml4LgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBpcworICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fY29uZmlnPC9maWxlbmFtZT4sIHRoZSB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAiY29uZmlnIi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TQ0hFRFVMRVInPjxnbG9zc3Rlcm0+QkJfU0NIRURVTEVSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdHMgdGhlIG5hbWUgb2YgdGhlIHNjaGVkdWxlciB0byB1c2UgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICBzY2hlZHVsaW5nIG9mIEJpdEJha2UgdGFza3MuCisgICAgICAgICAgICAgICAgICAgIFRocmVlIG9wdGlvbnMgZXhpc3Q6CisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPmJhc2ljPC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNpYyBmcmFtZXdvcmsgZnJvbSB3aGljaCBldmVyeXRoaW5nIGRlcml2ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgdGhpcyBvcHRpb24gY2F1c2VzIHRhc2tzIHRvIGJlIG9yZGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljYWxseSBhcyB0aGV5IGFyZSBwYXJzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPnNwZWVkPC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGVzIHRhc2tzIGZpcnN0IHRoYXQgaGF2ZSBtb3JlIHRhc2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzcGVlZCIgb3B0aW9uIGlzIHRoZSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5jb21wbGV0aW9uPC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdXNlcyB0aGUgc2NoZWR1bGVyIHRvIHRyeSB0byBjb21wbGV0ZSBhIGdpdmVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBlIG9uY2UgaXRzIGJ1aWxkIGhhcyBzdGFydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TQ0hFRFVMRVJTJz48Z2xvc3N0ZXJtPkJCX1NDSEVEVUxFUlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyBjdXN0b20gc2NoZWR1bGVycyB0byBpbXBvcnQuCisgICAgICAgICAgICAgICAgICAgIEN1c3RvbSBzY2hlZHVsZXJzIG5lZWQgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+UnVuUXVldWVTY2hlZHVsZXI8L2ZpbGVuYW1lPiBjbGFzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGluZm9ybWF0aW9uIGhvdyB0byBzZWxlY3QgYSBzY2hlZHVsZXIsIHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX1NDSEVEVUxFUic+PGZpbGVuYW1lPkJCX1NDSEVEVUxFUjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TRVRTQ0VORV9ERVBWQUxJRCc+PGdsb3NzdGVybT5CQl9TRVRTQ0VORV9ERVBWQUxJRDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmdW5jdGlvbiBCaXRCYWtlIGNhbGxzIHRoYXQgZGV0ZXJtaW5lcworICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIEJpdEJha2UgcmVxdWlyZXMgYSBzZXRzY2VuZSBkZXBlbmRlbmN5IHRvIGJlIG1ldC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBydW5uaW5nIGEgc2V0c2NlbmUgdGFzaywgQml0QmFrZSBuZWVkcyB0bworICAgICAgICAgICAgICAgICAgICBrbm93IHdoaWNoIGRlcGVuZGVuY2llcyBvZiB0aGF0IHNldHNjZW5lIHRhc2sgYWxzbyBuZWVkCisgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgV2hldGhlciBkZXBlbmRlbmNpZXMgYWxzbyBuZWVkIHRvIGJlIHJ1biBpcyBoaWdobHkKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50IG9uIHRoZSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSB0aGlzIHZhcmlhYmxlIHJldHVybnMgYQorICAgICAgICAgICAgICAgICAgICAiVHJ1ZSIgb3IgIkZhbHNlIiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZGVwZW5kZW5jeSBuZWVkcworICAgICAgICAgICAgICAgICAgICB0byBiZSBtZXQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfU0VUU0NFTkVfVkVSSUZZX0ZVTkNUSU9OJz48Z2xvc3N0ZXJtPkJCX1NFVFNDRU5FX1ZFUklGWV9GVU5DVElPTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0byBjYWxsIHRoYXQgdmVyaWZpZXMgdGhlIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgcGxhbm5lZCB0YXNrIGV4ZWN1dGlvbiBiZWZvcmUgdGhlIG1haW4gdGFzayBleGVjdXRpb24KKyAgICAgICAgICAgICAgICAgICAgaGFwcGVucy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIEJpdEJha2UgaGFzIGEgbGlzdCBvZiBzZXRzY2VuZQorICAgICAgICAgICAgICAgICAgICB0YXNrcyB0aGF0IGhhdmUgcnVuIGFuZCBlaXRoZXIgc3VjY2VlZGVkIG9yIGZhaWxlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGFsbG93cyBmb3IgYSB0YXNrIGxpc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgbWFrZSBzZW5zZS4KKyAgICAgICAgICAgICAgICAgICAgRXZlbiBpZiBCaXRCYWtlIHdhcyBwbGFubmluZyB0byBza2lwIGEgdGFzaywgdGhlCisgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBjYW4gZm9yY2UgQml0QmFrZSB0byBydW4KKyAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2ssIHdoaWNoIGlzIG5lY2Vzc2FyeSB1bmRlciBjZXJ0YWluIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgY2lyY3Vtc3RhbmNlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9TSUdOQVRVUkVfRVhDTFVERV9GTEFHUyc+PGdsb3NzdGVybT5CQl9TSUdOQVRVUkVfRVhDTFVERV9GTEFHUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBMaXN0cyB2YXJpYWJsZSBmbGFncyAodmFyZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIHNhZmVseSBleGNsdWRlZCBmcm9tIGNoZWNrc3VtCisgICAgICAgICAgICAgICAgICAgIGFuZCBkZXBlbmRlbmN5IGRhdGEgZm9yIGtleXMgaW4gdGhlIGRhdGFzdG9yZS4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBnZW5lcmF0aW5nIGNoZWNrc3VtIG9yIGRlcGVuZGVuY3kgZGF0YSBmb3Iga2V5cyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgZGF0YXN0b3JlLCB0aGUgZmxhZ3Mgc2V0IGFnYWluc3QgdGhhdCBrZXkgYXJlIG5vcm1hbGx5CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBjaGVja3N1bS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdmFyZmxhZ3MsIHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIjxsaW5rIGxpbmtlbmQ9J3ZhcmlhYmxlLWZsYWdzJz5WYXJpYWJsZSBGbGFnczwvbGluaz4iCisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfU0lHTkFUVVJFX0hBTkRMRVInPjxnbG9zc3Rlcm0+QkJfU0lHTkFUVVJFX0hBTkRMRVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIGhhbmRsZXIgQml0QmFrZSB1c2VzLgorICAgICAgICAgICAgICAgICAgICBUaGUgc2lnbmF0dXJlIGhhbmRsZXIgZGVmaW5lcyB0aGUgd2F5IHN0YW1wIGZpbGVzIGFyZQorICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGFuZCBoYW5kbGVkLCBpZiBhbmQgaG93IHRoZSBzaWduYXR1cmUgaXMKKyAgICAgICAgICAgICAgICAgICAgaW5jb3Jwb3JhdGVkIGludG8gdGhlIHN0YW1wcywgYW5kIGhvdyB0aGUgc2lnbmF0dXJlCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZiBpcyBnZW5lcmF0ZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgbmV3IHNpZ25hdHVyZSBoYW5kbGVyIGNhbiBiZSBhZGRlZCBieSBpbmplY3RpbmcgYSBjbGFzcworICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5TaWduYXR1cmVHZW5lcmF0b3I8L2ZpbGVuYW1lPiBjbGFzcyBpbnRvIHRoZQorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgbmFtZXNwYWNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NSQ1JFVl9QT0xJQ1knPjxnbG9zc3Rlcm0+QkJfU1JDUkVWX1BPTElDWTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBiZWhhdmlvciBvZiB0aGUgZmV0Y2hlciB3aGVuIGl0IGludGVyYWN0cyB3aXRoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBjb250cm9sIHN5c3RlbXMgYW5kIGR5bmFtaWMgc291cmNlIHJldmlzaW9ucy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5CQl9TUkNSRVZfUE9MSUNZPC9maWxlbmFtZT4gdmFyaWFibGUgaXMKKyAgICAgICAgICAgICAgICAgICAgdXNlZnVsIHdoZW4gd29ya2luZyB3aXRob3V0IGEgbmV0d29yay4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIGNhbiBiZSBzZXQgdXNpbmcgb25lIG9mIHR3byBwb2xpY2llczoKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Y2FjaGU8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0YWlucyB0aGUgdmFsdWUgdGhlIHN5c3RlbSBvYnRhaW5lZCBwcmV2aW91c2x5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gcXVlcnlpbmcgdGhlIHNvdXJjZSBjb250cm9sIHN5c3RlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+Y2xlYXI8L2VtcGhhc2lzPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcmllcyB0aGUgc291cmNlIGNvbnRyb2xzIHN5c3RlbSBldmVyeSB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggdGhpcyBwb2xpY3ksIHRoZXJlIGlzIG5vIGNhY2hlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY2xlYXIiIHBvbGljeSBpcyB0aGUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfU1RBTVBfUE9MSUNZJz48Z2xvc3N0ZXJtPkJCX1NUQU1QX1BPTElDWTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBtb2RlIHVzZWQgZm9yIGhvdyB0aW1lc3RhbXBzIG9mIHN0YW1wIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIGFyZSBjb21wYXJlZC4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgdGhlIHZhcmlhYmxlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1vZGVzOgorICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz5wZXJmaWxlPC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcCBjb21wYXJpc29ucyBhcmUgb25seSBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0aW1lc3RhbXBzIG9mIGEgc3BlY2lmaWMgcmVjaXBlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+ZnVsbDwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXAgY29tcGFyaXNvbnMgYXJlIG1hZGUgZm9yIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+d2hpdGVsaXN0PC9lbXBoYXNpcz4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkZW50aWNhbCB0byAiZnVsbCIgbW9kZSBleGNlcHQgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbnMgYXJlIG1hZGUgZm9yIHJlY2lwZXMgbGlzdGVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQl9TVEFNUF9XSElURUxJU1QnPjxmaWxlbmFtZT5CQl9TVEFNUF9XSElURUxJU1Q8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgU3RhbXAgcG9saWNpZXMgYXJlIGxhcmdlbHkgb2Jzb2xldGUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHJvZHVjdGlvbiBvZiBzZXRzY2VuZSB0YXNrcy4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NUQU1QX1dISVRFTElTVCc+PGdsb3NzdGVybT5CQl9TVEFNUF9XSElURUxJU1Q8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTGlzdHMgZmlsZXMgd2hvc2Ugc3RhbXAgZmlsZSB0aW1lc3RhbXBzIGFyZSBjb21wYXJlZCB3aGVuCisgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFtcCBwb2xpY3kgbW9kZSBpcyBzZXQgdG8gIndoaXRlbGlzdCIuCisgICAgICAgICAgICAgICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiBzdGFtcCBwb2xpY2llcywgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJfU1RBTVBfUE9MSUNZJz48ZmlsZW5hbWU+QkJfU1RBTVBfUE9MSUNZPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1NUUklDVF9DSEVDS1NVTSc+PGdsb3NzdGVybT5CQl9TVFJJQ1RfQ0hFQ0tTVU08L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU2V0cyBhIG1vcmUgc3RyaWN0IGNoZWNrc3VtIG1lY2hhbmlzbSBmb3Igbm9uLWxvY2FsIFVSTHMuCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB2YXJpYWJsZSB0byBhIHZhbHVlIGNhdXNlcyBCaXRCYWtlCisgICAgICAgICAgICAgICAgICAgIHRvIHJlcG9ydCBhbiBlcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgbm9uLWxvY2FsIFVSTAorICAgICAgICAgICAgICAgICAgICB0aGF0IGRvZXMgbm90IGhhdmUgYXQgbGVhc3Qgb25lIGNoZWNrc3VtIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9UQVNLX05JQ0VfTEVWRUwnPjxnbG9zc3Rlcm0+QkJfVEFTS19OSUNFX0xFVkVMPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFsbG93cyBzcGVjaWZpYyB0YXNrcyB0byBjaGFuZ2UgdGhlaXIgcHJpb3JpdHkKKyAgICAgICAgICAgICAgICAgICAgKGkuZS4gbmljZSBsZXZlbCkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgdmFyaWFibGUgaW4gY29tYmluYXRpb24gd2l0aCB0YXNrCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlcyB0byByYWlzZSBvciBsb3dlciBwcmlvcml0aWVzIG9mIHNwZWNpZmljIHRhc2tzLgorICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgb24gdGhlCisgICAgICAgICAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZyc+WW9jdG8gUHJvamVjdDwvdWxpbms+CisgICAgICAgICAgICAgICAgICAgIGF1dG9idWlsZGVyLCBRRU1VIGVtdWxhdGlvbiBpbiBpbWFnZXMgaXMgZ2l2ZW4gYSBoaWdoZXIKKyAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgYXMgY29tcGFyZWQgdG8gYnVpbGQgdGFza3MgdG8gZW5zdXJlIHRoYXQgaW1hZ2VzCisgICAgICAgICAgICAgICAgICAgIGRvIG5vdCBzdWZmZXIgdGltZW91dHMgb24gbG9hZGVkIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJfVEFTS0hBU0gnPjxnbG9zc3Rlcm0+QkJfVEFTS0hBU0g8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2l0aGluIGFuIGV4ZWN1dGluZyB0YXNrLCB0aGlzIHZhcmlhYmxlIGhvbGRzIHRoZSBoYXNoCisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0YXNrIGFzIHJldHVybmVkIGJ5IHRoZSBjdXJyZW50bHkgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUgZ2VuZXJhdG9yLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCX1ZFUkJPU0VfTE9HUyc+PGdsb3NzdGVybT5CQl9WRVJCT1NFX0xPR1M8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMgaG93IHZlcmJvc2UgQml0QmFrZSBpcyBkdXJpbmcgYnVpbGRzLgorICAgICAgICAgICAgICAgICAgICBJZiBzZXQsIHNoZWxsIHNjcmlwdHMgZWNobyBjb21tYW5kcyBhbmQgc2hlbGwgc2NyaXB0IG91dHB1dAorICAgICAgICAgICAgICAgICAgICBhcHBlYXJzIG9uIHN0YW5kYXJkIG91dCAoc3Rkb3V0KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQl9XT1JLRVJDT05URVhUJz48Z2xvc3N0ZXJtPkJCX1dPUktFUkNPTlRFWFQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgZXhlY3V0aW5nIGEgdGFzay4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBzZXRzIHRoaXMgdmFyaWFibGUgdG8gIjEiIHdoZW4gYSB0YXNrIGlzCisgICAgICAgICAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgaXMgbm90IHNldCB3aGVuIHRoZSB0YXNrIGlzIGluIHNlcnZlciBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGR1cmluZyBwYXJzaW5nIG9yIGV2ZW50IGhhbmRsaW5nLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJDTEFTU0VYVEVORCc+PGdsb3NzdGVybT5CQkNMQVNTRVhURU5EPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFsbG93cyB5b3UgdG8gZXh0ZW5kIGEgcmVjaXBlIHNvIHRoYXQgaXQgYnVpbGRzIHZhcmlhbnRzCisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAgICAgICAgICAgICAgICAgICAgU29tZSBleGFtcGxlcyBvZiB0aGVzZSB2YXJpYW50cyBmb3IgcmVjaXBlcyBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICBPcGVuRW1iZWRkZWQgQ29yZSBtZXRhZGF0YSBhcmUgIm5hdGl2ZXMiIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPnF1aWx0LW5hdGl2ZTwvZmlsZW5hbWU+LCB3aGljaCBpcyBhIGNvcHkgb2YKKyAgICAgICAgICAgICAgICAgICAgUXVpbHQgYnVpbHQgdG8gcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW07ICJjcm9zc2VzIiBzdWNoCisgICAgICAgICAgICAgICAgICAgIGFzIDxmaWxlbmFtZT5nY2MtY3Jvc3M8L2ZpbGVuYW1lPiwgd2hpY2ggaXMgYSBjb21waWxlcgorICAgICAgICAgICAgICAgICAgICBidWlsdCB0byBydW4gb24gdGhlIGJ1aWxkIG1hY2hpbmUgYnV0IHByb2R1Y2VzIGJpbmFyaWVzCisgICAgICAgICAgICAgICAgICAgIHRoYXQgcnVuIG9uIHRoZSB0YXJnZXQgPGZpbGVuYW1lPk1BQ0hJTkU8L2ZpbGVuYW1lPjsKKyAgICAgICAgICAgICAgICAgICAgIm5hdGl2ZXNkayIsIHdoaWNoIHRhcmdldHMgdGhlIFNESyBtYWNoaW5lIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPk1BQ0hJTkU8L2ZpbGVuYW1lPjsgYW5kICJtdWxpdGxpYnMiIGluIHRoZSBmb3JtCisgICAgICAgICAgICAgICAgICAgICI8ZmlsZW5hbWU+bXVsdGlsaWI6PC9maWxlbmFtZT48cmVwbGFjZWFibGU+bXVsdGlsaWJfbmFtZTwvcmVwbGFjZWFibGU+Ii4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gYnVpbGQgYSBkaWZmZXJlbnQgdmFyaWFudCBvZiB0aGUgcmVjaXBlIHdpdGggYSBtaW5pbWFsCisgICAgICAgICAgICAgICAgICAgIGFtb3VudCBvZiBjb2RlLCBpdCB1c3VhbGx5IGlzIGFzIHNpbXBsZSBhcyBhZGRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHRvIHlvdXIgcmVjaXBlLgorICAgICAgICAgICAgICAgICAgICBIZXJlIGFyZSB0d28gZXhhbXBsZXMuCisgICAgICAgICAgICAgICAgICAgIFRoZSAibmF0aXZlIiB2YXJpYW50cyBhcmUgZnJvbSB0aGUgT3BlbkVtYmVkZGVkIENvcmUKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJDTEFTU0VYVEVORCA9KyAibmF0aXZlIG5hdGl2ZXNkayIKKyAgICAgQkJDTEFTU0VYVEVORCA9KyAibXVsdGlsaWI6PHJlcGxhY2VhYmxlPm11bHRpbGliX25hbWU8L3JlcGxhY2VhYmxlPiIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQkRFQlVHJz48Z2xvc3N0ZXJtPkJCREVCVUc8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU2V0cyB0aGUgQml0QmFrZSBkZWJ1ZyBvdXRwdXQgbGV2ZWwgdG8gYSBzcGVjaWZpYyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBhcyBpbmNyZW1lbnRlZCBieSB0aGUgPGZpbGVuYW1lPi1kPC9maWxlbmFtZT4gY29tbWFuZCBsaW5lCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZSBpbiB0aGUgZXh0ZXJuYWwgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluIG9yZGVyIGZvciBpdCB0byB3b3JrLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCRklMRV9DT0xMRUNUSU9OUyc+PGdsb3NzdGVybT5CQkZJTEVfQ09MTEVDVElPTlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5MaXN0cyB0aGUgbmFtZXMgb2YgY29uZmlndXJlZCBsYXllcnMuCisgICAgICAgICAgICAgICAgICAgIFRoZXNlIG5hbWVzIGFyZSB1c2VkIHRvIGZpbmQgdGhlIG90aGVyIDxmaWxlbmFtZT5CQkZJTEVfKjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcy4KKyAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5LCBlYWNoIGxheWVyIGFwcGVuZHMgaXRzIG5hbWUgdG8gdGhpcyB2YXJpYWJsZSBpbiBpdHMKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPmNvbmYvbGF5ZXIuY29uZjwvZmlsZW5hbWU+IGZpbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJGSUxFX1BBVFRFUk4nPjxnbG9zc3Rlcm0+QkJGSUxFX1BBVFRFUk48L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5WYXJpYWJsZSB0aGF0IGV4cGFuZHMgdG8gbWF0Y2ggZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItQkJGSUxFUyc+PGZpbGVuYW1lPkJCRklMRVM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgaW4gYSBwYXJ0aWN1bGFyIGxheWVyLgorICAgICAgICAgICAgICAgICAgICBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIDxmaWxlbmFtZT5jb25mL2xheWVyLmNvbmY8L2ZpbGVuYW1lPiBmaWxlIGFuZCBtdXN0CisgICAgICAgICAgICAgICAgICAgIGJlIHN1ZmZpeGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmljIGxheWVyIChlLmcuCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5CQkZJTEVfUEFUVEVSTl9lbWVubG93PC9maWxlbmFtZT4pLjwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCRklMRV9QUklPUklUWSc+PGdsb3NzdGVybT5CQkZJTEVfUFJJT1JJVFk8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5Bc3NpZ25zIHRoZSBwcmlvcml0eSBmb3IgcmVjaXBlIGZpbGVzIGluIGVhY2ggbGF5ZXIuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPlRoaXMgdmFyaWFibGUgaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHNhbWUgcmVjaXBlIGFwcGVhcnMgaW4KKyAgICAgICAgICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBsYXllci4KKyAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHZhcmlhYmxlIGFsbG93cyB5b3UgdG8gcHJpb3JpdGl6ZSBhCisgICAgICAgICAgICAgICAgICAgIGxheWVyIGFnYWluc3Qgb3RoZXIgbGF5ZXJzIHRoYXQgY29udGFpbiB0aGUgc2FtZSByZWNpcGUgLSBlZmZlY3RpdmVseQorICAgICAgICAgICAgICAgICAgICBsZXR0aW5nIHlvdSBjb250cm9sIHRoZSBwcmVjZWRlbmNlIGZvciB0aGUgbXVsdGlwbGUgbGF5ZXJzLgorICAgICAgICAgICAgICAgICAgICBUaGUgcHJlY2VkZW5jZSBlc3RhYmxpc2hlZCB0aHJvdWdoIHRoaXMgdmFyaWFibGUgc3RhbmRzIHJlZ2FyZGxlc3Mgb2YgYQorICAgICAgICAgICAgICAgICAgICByZWNpcGUncyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICg8bGluayBsaW5rZW5kPSd2YXItUFYnPjxmaWxlbmFtZT5QVjwvZmlsZW5hbWU+PC9saW5rPiB2YXJpYWJsZSkuCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBhIGxheWVyIHRoYXQgaGFzIGEgcmVjaXBlIHdpdGggYSBoaWdoZXIgPGZpbGVuYW1lPlBWPC9maWxlbmFtZT4gdmFsdWUgYnV0IGZvcgorICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgPGZpbGVuYW1lPkJCRklMRV9QUklPUklUWTwvZmlsZW5hbWU+IGlzIHNldCB0byBoYXZlIGEgbG93ZXIgcHJlY2VkZW5jZSBzdGlsbCBoYXMgYQorICAgICAgICAgICAgICAgICAgICBsb3dlciBwcmVjZWRlbmNlLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5BIGxhcmdlciB2YWx1ZSBmb3IgdGhlIDxmaWxlbmFtZT5CQkZJTEVfUFJJT1JJVFk8L2ZpbGVuYW1lPiB2YXJpYWJsZSByZXN1bHRzIGluIGEgaGlnaGVyCisgICAgICAgICAgICAgICAgICAgIHByZWNlZGVuY2UuCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgdmFsdWUgNiBoYXMgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSB2YWx1ZSA1LgorICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgPGZpbGVuYW1lPkJCRklMRV9QUklPUklUWTwvZmlsZW5hbWU+IHZhcmlhYmxlIGlzIHNldCBiYXNlZCBvbiBsYXllcgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgKHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1MQVlFUkRFUEVORFMnPkxBWUVSREVQRU5EUzwvbGluaz48L2ZpbGVuYW1lPiB2YXJpYWJsZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgcHJpb3JpdHksIGlmIHVuc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgIGZvciBhIGxheWVyIHdpdGggbm8gZGVwZW5kZW5jaWVzLCBpcyB0aGUgbG93ZXN0IGRlZmluZWQgcHJpb3JpdHkgKyAxCisgICAgICAgICAgICAgICAgICAgIChvciAxIGlmIG5vIHByaW9yaXRpZXMgYXJlIGRlZmluZWQpLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8dGlwPgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgY29tbWFuZCA8ZmlsZW5hbWU+Yml0YmFrZS1sYXllcnMgc2hvdy1sYXllcnM8L2ZpbGVuYW1lPiB0byBsaXN0CisgICAgICAgICAgICAgICAgICAgIGFsbCBjb25maWd1cmVkIGxheWVycyBhbG9uZyB3aXRoIHRoZWlyIHByaW9yaXRpZXMuCisgICAgICAgICAgICAgICAgPC90aXA+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQkZJTEVTJz48Z2xvc3N0ZXJtPkJCRklMRVM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5MaXN0IG9mIHJlY2lwZSBmaWxlcyBCaXRCYWtlIHVzZXMgdG8gYnVpbGQgc29mdHdhcmUuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJJTkNMVURFRCc+PGdsb3NzdGVybT5CQklOQ0xVREVEPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5zIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgYWxsIG9mIGFsbCBmaWxlcyB0aGF0CisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UncyBwYXJzZXIgaW5jbHVkZWQgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQklOQ0xVREVMT0dTJz48Z2xvc3N0ZXJtPkJCSU5DTFVERUxPR1M8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgc2V0IHRvIGEgdmFsdWUsIGVuYWJsZXMgcHJpbnRpbmcgdGhlIHRhc2sgbG9nIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0aW5nIGEgZmFpbGVkIHRhc2suCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJJTkNMVURFTE9HU19MSU5FUyc+PGdsb3NzdGVybT5CQklOQ0xVREVMT0dTX0xJTkVTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1CQklOQ0xVREVMT0dTJz48ZmlsZW5hbWU+QkJJTkNMVURFTE9HUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBpcyBzZXQsIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgdGFzayBsb2cgZmlsZSB0byBwcmludCB3aGVuIHJlcG9ydGluZyBhIGZhaWxlZCB0YXNrLgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHNldCA8ZmlsZW5hbWU+QkJJTkNMVURFTE9HU19MSU5FUzwvZmlsZW5hbWU+LAorICAgICAgICAgICAgICAgICAgICB0aGUgZW50aXJlIGxvZyBpcyBwcmludGVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJCTEFZRVJTJz48Z2xvc3N0ZXJtPkJCTEFZRVJTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+TGlzdHMgdGhlIGxheWVycyB0byBlbmFibGUgZHVyaW5nIHRoZSBidWlsZC4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgZmlsZSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgQkJMQVlFUlMgPSAiIFwKKyAgICAgICAvaG9tZS9zY290dHJpZi9wb2t5L21ldGEgXAorICAgICAgIC9ob21lL3Njb3R0cmlmL3Bva3kvbWV0YS15b2N0byBcCisgICAgICAgL2hvbWUvc2NvdHRyaWYvcG9reS9tZXRhLXlvY3RvLWJzcCBcCisgICAgICAgL2hvbWUvc2NvdHRyaWYvcG9reS9tZXRhLW15a2VybmVsIFwKKyAgICAgICAiCisKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGlzIGV4YW1wbGUgZW5hYmxlcyBmb3VyIGxheWVycywgb25lIG9mIHdoaWNoIGlzIGEgY3VzdG9tLCB1c2VyLWRlZmluZWQgbGF5ZXIKKyAgICAgICAgICAgICAgICAgICAgbmFtZWQgPGZpbGVuYW1lPm1ldGEtbXlrZXJuZWw8L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQkxBWUVSU19GRVRDSF9ESVInPjxnbG9zc3Rlcm0+QkJMQVlFUlNfRkVUQ0hfRElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNldHMgdGhlIGJhc2UgbG9jYXRpb24gd2hlcmUgbGF5ZXJzIGFyZSBzdG9yZWQuCisgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgbG9jYXRpb24gaXMgc2V0IHRvCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4ke0NPUkVCQVNFfTwvZmlsZW5hbWU+LgorICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5iaXRiYWtlLWxheWVycyBsYXllcmluZGV4LWZldGNoPC9maWxlbmFtZT4gYW5kCisgICAgICAgICAgICAgICAgICAgIHRlbGxzIDxmaWxlbmFtZT5iaXRiYWtlLWxheWVyczwvZmlsZW5hbWU+IHdoZXJlIHRvIHBsYWNlCisgICAgICAgICAgICAgICAgICAgIHRoZSBmZXRjaGVkIGxheWVycy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQk1BU0snPjxnbG9zc3Rlcm0+QkJNQVNLPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFByZXZlbnRzIEJpdEJha2UgZnJvbSBwcm9jZXNzaW5nIHJlY2lwZXMgYW5kIHJlY2lwZQorICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZmlsZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZSA8ZmlsZW5hbWU+QkJNQVNLPC9maWxlbmFtZT4gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgdG8gImhpZGUiIHRoZXNlIDxmaWxlbmFtZT4uYmI8L2ZpbGVuYW1lPiBhbmQKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPi5iYmFwcGVuZDwvZmlsZW5hbWU+IGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIGlnbm9yZXMgYW55IHJlY2lwZSBvciByZWNpcGUgYXBwZW5kIGZpbGVzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggdGhlIGV4cHJlc3Npb24uCisgICAgICAgICAgICAgICAgICAgIEl0IGlzIGFzIGlmIEJpdEJha2UgZG9lcyBub3Qgc2VlIHRoZW0gYXQgYWxsLgorICAgICAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIG1hdGNoaW5nIGZpbGVzIGFyZSBub3QgcGFyc2VkIG9yIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IEJpdEJha2UuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgeW91IHByb3ZpZGUgaXMgcGFzc2VkIHRvIFB5dGhvbidzIHJlZ3VsYXIKKyAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiBjb21waWxlci4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGV4cHJlc3Npb24gaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgZnVsbCBwYXRocyB0bworICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIEZvciBjb21wbGV0ZSBzeW50YXggaW5mb3JtYXRpb24sIHNlZSBQeXRob24ncworICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uIGF0CisgICAgICAgICAgICAgICAgICAgIDx1bGluayB1cmw9J2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVsZWFzZS8yLjMvbGliL3JlLXN5bnRheC5odG1sJz48L3VsaW5rPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgYSBjb21wbGV0ZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgdG8gdGVsbCBCaXRCYWtlIHRvIGlnbm9yZSBhbGwgcmVjaXBlIGFuZCByZWNpcGUgYXBwZW5kCisgICAgICAgICAgICAgICAgICAgIGZpbGVzIGluIHRoZSA8ZmlsZW5hbWU+bWV0YS10aS9yZWNpcGVzLW1pc2MvPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCTUFTSyA9ICJtZXRhLXRpL3JlY2lwZXMtbWlzYy8iCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gbWFzayBvdXQgbXVsdGlwbGUgZGlyZWN0b3JpZXMgb3IgcmVjaXBlcywKKyAgICAgICAgICAgICAgICAgICAgdXNlIHRoZSB2ZXJ0aWNhbCBiYXIgdG8gc2VwYXJhdGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgbmV4dCBleGFtcGxlIG1hc2tzIG91dCBtdWx0aXBsZSBkaXJlY3RvcmllcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCByZWNpcGVzOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIEJCTUFTSyA9ICJtZXRhLXRpL3JlY2lwZXMtbWlzYy98bWV0YS10aS9yZWNpcGVzLXRpL3BhY2thZ2Vncm91cC8iCisgICAgIEJCTUFTSyAuPSAifC4qbWV0YS1vZS9yZWNpcGVzLXN1cHBvcnQvIgorICAgICBCQk1BU0sgLj0gInwuKm9wZW5sZGFwIgorICAgICBCQk1BU0sgLj0gInwuKm9wZW5jdiIKKyAgICAgQkJNQVNLIC49ICJ8Lipsem1hIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIE5vdGljZSBob3cgdGhlIHZlcnRpY2FsIGJhciBpcyB1c2VkIHRvIGFwcGVuZCB0aGUgZnJhZ21lbnRzLgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gc3BlY2lmeWluZyBhIGRpcmVjdG9yeSBuYW1lLCB1c2UgdGhlIHRyYWlsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBzbGFzaCBjaGFyYWN0ZXIgdG8gZW5zdXJlIHlvdSBtYXRjaCBqdXN0IHRoYXQgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJQQVRIJz48Z2xvc3N0ZXJtPkJCUEFUSDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBVc2VkIGJ5IEJpdEJha2UgdG8gbG9jYXRlIGNsYXNzCisgICAgICAgICAgICAgICAgICAgICg8ZmlsZW5hbWU+LmJiY2xhc3M8L2ZpbGVuYW1lPikgYW5kIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgKDxmaWxlbmFtZT4uY29uZjwvZmlsZW5hbWU+KSBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyB2YXJpYWJsZSBpcyBhbmFsb2dvdXMgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5QQVRIPC9maWxlbmFtZT4gdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBydW4gQml0QmFrZSBmcm9tIGEgZGlyZWN0b3J5IG91dHNpZGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgeW91IG11c3QgYmUgc3VyZSB0byBzZXQKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPkJCUEFUSDwvZmlsZW5hbWU+IHRvIHBvaW50IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICBidWlsZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgdmFyaWFibGUgYXMgeW91IHdvdWxkIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBydW4gQml0QmFrZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICAkIEJCUEFUSD0iPHJlcGxhY2VhYmxlPmJ1aWxkX2RpcmVjdG9yeTwvcmVwbGFjZWFibGU+IgorICAgICAkIGV4cG9ydCBCQlBBVEgKKyAgICAgJCBiaXRiYWtlIDxyZXBsYWNlYWJsZT50YXJnZXQ8L3JlcGxhY2VhYmxlPgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQkJTRVJWRVInPjxnbG9zc3Rlcm0+QkJTRVJWRVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUG9pbnRzIHRvIHRoZSBzZXJ2ZXIgdGhhdCBydW5zIG1lbW9yeS1yZXNpZGVudCBCaXRCYWtlLgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgaXMgb25seSB1c2VkIHdoZW4geW91IGVtcGxveSBtZW1vcnktcmVzaWRlbnQKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CQlZFUlNJT05TJz48Z2xvc3N0ZXJtPkJCVkVSU0lPTlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsb3dzIGEgc2luZ2xlIHJlY2lwZSB0byBidWlsZCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhCisgICAgICAgICAgICAgICAgICAgIHByb2plY3QgZnJvbSBhIHNpbmdsZSByZWNpcGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IGFsc28gYWJsZSB0byBzcGVjaWZ5IGNvbmRpdGlvbmFsIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItT1ZFUlJJREVTJz48ZmlsZW5hbWU+T1ZFUlJJREVTPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBmb3IgYSBzaW5nbGUgdmVyc2lvbiBvciBmb3IgYW4gb3B0aW9uYWxseSBuYW1lZAorICAgICAgICAgICAgICAgICAgICByYW5nZSBvZiB2ZXJzaW9ucy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gPGZpbGVuYW1lPkJCVkVSU0lPTlM8L2ZpbGVuYW1lPiwKKyAgICAgICAgICAgICAgICAgICAgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICAiPGxpbmsgbGlua2VuZD0ndmFyaWFudHMtY2xhc3MtZXh0ZW5zaW9uLW1lY2hhbmlzbSc+VmFyaWFudHMgLSBDbGFzcyBFeHRlbnNpb24gTWVjaGFuaXNtPC9saW5rPiIKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1CSVRCQUtFX1VJJz48Z2xvc3N0ZXJtPkJJVEJBS0VfVUk8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHRoZSBVSSBtb2R1bGUgdG8gdXNlIHdoZW4gcnVubmluZyBCaXRCYWtlLgorICAgICAgICAgICAgICAgICAgICBVc2luZyB0aGlzIHZhcmlhYmxlIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT4tdTwvZmlsZW5hbWU+IGNvbW1hbmQtbGluZSBvcHRpb24uCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGV4dGVybmFsIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICBpbiBvcmRlciBmb3IgaXQgdG8gd29yay4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJVSUxETkFNRSc+PGdsb3NzdGVybT5CVUlMRE5BTUU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBidWlsZC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgZGVmYXVsdHMgdG8gYSBkYXRldGltZSBzdGFtcCBvZiB3aGVuIHRoZSBidWlsZCB3YXMKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBidXQgY2FuIGJlIGRlZmluZWQgYnkgdGhlIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUJaUkRJUic+PGdsb3NzdGVybT5CWlJESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBmaWxlcyBjaGVja2VkIG91dCBvZiBhIEJhemFhcgorICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gYXJlIHN0b3JlZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktYyc+PHRpdGxlPkM8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItQ0FDSEUnPjxnbG9zc3Rlcm0+Q0FDSEU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgQml0QmFrZSB1c2VzIHRvIHN0b3JlIGEgY2FjaGUKKyAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG1ldGFkYXRhIHNvIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgcGFyc2VkIGV2ZXJ5CisgICAgICAgICAgICAgICAgICAgIHRpbWUgQml0QmFrZSBpcyBzdGFydGVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUNWU0RJUic+PGdsb3NzdGVybT5DVlNESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBmaWxlcyBjaGVja2VkIG91dCB1bmRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgQ1ZTIHN5c3RlbSBhcmUgc3RvcmVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1kJz48dGl0bGU+RDwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1ERUZBVUxUX1BSRUZFUkVOQ0UnPjxnbG9zc3Rlcm0+REVGQVVMVF9QUkVGRVJFTkNFPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIHdlYWsgYmlhcyBmb3IgcmVjaXBlIHNlbGVjdGlvbiBwcmlvcml0eS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBtb3N0IGNvbW1vbiB1c2FnZSBvZiB0aGlzIGlzIHZhcmlhYmxlIGlzIHRvIHNldAorICAgICAgICAgICAgICAgICAgICBpdCB0byAiLTEiIHdpdGhpbiBhIHJlY2lwZSBmb3IgYSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgcGllY2Ugb2Ygc29mdHdhcmUuCisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoZSB2YXJpYWJsZSBpbiB0aGlzIHdheSBjYXVzZXMgdGhlIHN0YWJsZSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZWNpcGUgdG8gYnVpbGQgYnkgZGVmYXVsdCBpbiB0aGUgYWJzZW5jZSBvZgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+PGxpbmsgbGlua2VuZD0ndmFyLVBSRUZFUlJFRF9WRVJTSU9OJz5QUkVGRVJSRURfVkVSU0lPTjwvbGluaz48L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBiZWluZyB1c2VkIHRvIGJ1aWxkIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGJpYXMgcHJvdmlkZWQgYnkgPGZpbGVuYW1lPkRFRkFVTFRfUFJFRkVSRU5DRTwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGlzIHdlYWsgYW5kIGlzIG92ZXJyaWRkZW4gYnkKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1CQkZJTEVfUFJJT1JJVFknPkJCRklMRV9QUklPUklUWTwvbGluaz48L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBpZiB0aGF0IHZhcmlhYmxlIGlzIGRpZmZlcmVudCBiZXR3ZWVuIHR3byBsYXllcnMKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWluIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSByZWNpcGUuCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItREVQRU5EUyc+PGdsb3NzdGVybT5ERVBFTkRTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIExpc3RzIGEgcmVjaXBlJ3MgYnVpbGQtdGltZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgKGkuZS4gb3RoZXIgcmVjaXBlIGZpbGVzKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29uc2lkZXIgdGhpcyBzaW1wbGUgZXhhbXBsZSBmb3IgdHdvIHJlY2lwZXMgbmFtZWQgImEiIGFuZAorICAgICAgICAgICAgICAgICAgICAiYiIgdGhhdCBwcm9kdWNlIHNpbWlsYXJseSBuYW1lZCBwYWNrYWdlcy4KKyAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgPGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgYXBwZWFycyBpbiB0aGUgImEiIHJlY2lwZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBERVBFTkRTID0gImIiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSwgdGhlIGRlcGVuZGVuY3kgaXMgc3VjaCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+ZG9fY29uZmlndXJlPC9maWxlbmFtZT4gdGFzayBmb3IgcmVjaXBlICJhIgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzIG9uIHRoZSA8ZmlsZW5hbWU+ZG9fcG9wdWxhdGVfc3lzcm9vdDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHRhc2sgb2YgcmVjaXBlICJiIi4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyBhbnl0aGluZyB0aGF0IHJlY2lwZSAiYiIgcHV0cyBpbnRvIHN5c3Jvb3QKKyAgICAgICAgICAgICAgICAgICAgaXMgYXZhaWxhYmxlIHdoZW4gcmVjaXBlICJhIiBpcyBjb25maWd1cmluZyBpdHNlbGYuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiBydW50aW1lIGRlcGVuZGVuY2llcywgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPjxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1ERVNDUklQVElPTic+PGdsb3NzdGVybT5ERVNDUklQVElPTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBIGxvbmcgZGVzY3JpcHRpb24gZm9yIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRExfRElSJz48Z2xvc3N0ZXJtPkRMX0RJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgY2VudHJhbCBkb3dubG9hZCBkaXJlY3RvcnkgdXNlZCBieSB0aGUgYnVpbGQgcHJvY2VzcyB0bworICAgICAgICAgICAgICAgICAgICBzdG9yZSBkb3dubG9hZHMuCisgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQsIDxmaWxlbmFtZT5ETF9ESVI8L2ZpbGVuYW1lPiBnZXRzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHN1aXRhYmxlIGZvciBtaXJyb3JpbmcgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0IEdpdAorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXMuCisgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRhcmJhbGxzIG9mIEdpdCByZXBvc2l0b3JpZXMsIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUyc+PGZpbGVuYW1lPkJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorCisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktZSc+PHRpdGxlPkU8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRVhDTFVERV9GUk9NX1dPUkxEJz48Z2xvc3N0ZXJtPkVYQ0xVREVfRlJPTV9XT1JMRDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEaXJlY3RzIEJpdEJha2UgdG8gZXhjbHVkZSBhIHJlY2lwZSBmcm9tIHdvcmxkIGJ1aWxkcyAoaS5lLgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+Yml0YmFrZSB3b3JsZDwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgICAgICAgICAgRHVyaW5nIHdvcmxkIGJ1aWxkcywgQml0QmFrZSBsb2NhdGVzLCBwYXJzZXMgYW5kIGJ1aWxkcyBhbGwKKyAgICAgICAgICAgICAgICAgICAgcmVjaXBlcyBmb3VuZCBpbiBldmVyeSBsYXllciBleHBvc2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmJsYXllcnMuY29uZjwvZmlsZW5hbWU+IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gZXhjbHVkZSBhIHJlY2lwZSBmcm9tIGEgd29ybGQgYnVpbGQgdXNpbmcgdGhpcyB2YXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSB2YXJpYWJsZSB0byAiMSIgaW4gdGhlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgUmVjaXBlcyBhZGRlZCB0byA8ZmlsZW5hbWU+RVhDTFVERV9GUk9NX1dPUkxEPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgbWF5IHN0aWxsIGJlIGJ1aWx0IGR1cmluZyBhIHdvcmxkIGJ1aWxkIGluIG9yZGVyIHRvIHNhdGlzZnkKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIG9mIG90aGVyIHJlY2lwZXMuCisgICAgICAgICAgICAgICAgICAgIEFkZGluZyBhIHJlY2lwZSB0byA8ZmlsZW5hbWU+RVhDTFVERV9GUk9NX1dPUkxEPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgb25seSBlbnN1cmVzIHRoYXQgdGhlIHJlY2lwZSBpcyBub3QgZXhwbGljaXRseSBhZGRlZAorICAgICAgICAgICAgICAgICAgICB0byB0aGUgbGlzdCBvZiBidWlsZCB0YXJnZXRzIGluIGEgd29ybGQgYnVpbGQuCisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWYnPjx0aXRsZT5GPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZBS0VST09UJz48Z2xvc3N0ZXJtPkZBS0VST09UPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICBDb250YWlucyB0aGUgY29tbWFuZCB0byB1c2Ugd2hlbiBydW5uaW5nIGEgc2hlbGwgc2NyaXB0CisgICAgICAgICAgICAgICAgICAgICBpbiBhIGZha2Vyb290IGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgICAgICAgVGhlIDxmaWxlbmFtZT5GQUtFUk9PVDwvZmlsZW5hbWU+IHZhcmlhYmxlIGlzIG9ic29sZXRlCisgICAgICAgICAgICAgICAgICAgICBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG90aGVyCisgICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+RkFLRVJPT1QqPC9maWxlbmFtZT4gdmFyaWFibGVzLgorICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZXNlIGVudHJpZXMgaW4gdGhlIGdsb3NzYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZBS0VST09UQkFTRUVOVic+PGdsb3NzdGVybT5GQUtFUk9PVEJBU0VFTlY8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgIExpc3RzIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgd2hlbiBleGVjdXRpbmcKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYW5kIGRlZmluZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1GQUtFUk9PVENNRCc+PGZpbGVuYW1lPkZBS0VST09UQ01EPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgICB0aGF0IHN0YXJ0cyB0aGUgYml0YmFrZS13b3JrZXIgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZha2Vyb290IGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZBS0VST09UQ01EJz48Z2xvc3N0ZXJtPkZBS0VST09UQ01EPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICBDb250YWlucyB0aGUgY29tbWFuZCB0aGF0IHN0YXJ0cyB0aGUgYml0YmFrZS13b3JrZXIKKyAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaW4gdGhlIGZha2Vyb290IGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZBS0VST09URElSUyc+PGdsb3NzdGVybT5GQUtFUk9PVERJUlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgIExpc3RzIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZSBiZWZvcmUgcnVubmluZyBhIHRhc2sgaW4KKyAgICAgICAgICAgICAgICAgICAgIHRoZSBmYWtlcm9vdCBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1GQUtFUk9PVEVOVic+PGdsb3NzdGVybT5GQUtFUk9PVEVOVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgTGlzdHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCB3aGVuIHJ1bm5pbmcgYSB0YXNrCisgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQsIHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1GQUtFUk9PVEJBU0VFTlYnPjxmaWxlbmFtZT5GQUtFUk9PVEJBU0VFTlY8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUZBS0VST09UTk9FTlYnPjxnbG9zc3Rlcm0+RkFLRVJPT1ROT0VOVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgTGlzdHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCB3aGVuIHJ1bm5pbmcgYSB0YXNrCisgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBpbiB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICB0aGUgZmFrZXJvb3QgZW52aXJvbm1lbnQsIHNlZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1GQUtFUk9PVEVOVic+PGZpbGVuYW1lPkZBS0VST09URU5WPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1GRVRDSENNRCc+PGdsb3NzdGVybT5GRVRDSENNRDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBjb21tYW5kIHRoZSBCaXRCYWtlIGZldGNoZXIgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVzIHdoZW4gcnVubmluZyBmZXRjaCBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICBZb3UgbmVlZCB0byB1c2UgYW4gb3ZlcnJpZGUgc3VmZml4IHdoZW4geW91IHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgKGUuZy4gPGZpbGVuYW1lPkZFVENIQ01EX2dpdDwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIG9yIDxmaWxlbmFtZT5GRVRDSENNRF9zdm48L2ZpbGVuYW1lPikuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRklMRSc+PGdsb3NzdGVybT5GSUxFPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFBvaW50cyBhdCB0aGUgY3VycmVudCBmaWxlLgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIHNldHMgdGhpcyB2YXJpYWJsZSBkdXJpbmcgdGhlIHBhcnNpbmcgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICB0byBpZGVudGlmeSB0aGUgZmlsZSBiZWluZyBwYXJzZWQuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgYWxzbyBzZXRzIHRoaXMgdmFyaWFibGUgd2hlbiBhIHJlY2lwZSBpcyBiZWluZworICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCB0byBpZGVudGlmeSB0aGUgcmVjaXBlIGZpbGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItRklMRVNESVInPjxnbG9zc3Rlcm0+RklMRVNESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGRpcmVjdG9yaWVzIEJpdEJha2UgdXNlcyB3aGVuIHNlYXJjaGluZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcyBhbmQgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIFRoZSAibG9jYWwiIGZldGNoZXIgbW9kdWxlIHVzZXMgdGhlc2UgZGlyZWN0b3JpZXMgd2hlbgorICAgICAgICAgICAgICAgICAgICBoYW5kbGluZyA8ZmlsZW5hbWU+ZmlsZTovLzwvZmlsZW5hbWU+IFVSTHMgaWYgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgd2FzIG5vdCBmb3VuZCB1c2luZworICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItRklMRVNQQVRIJz48ZmlsZW5hbWU+RklMRVNQQVRIPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSA8ZmlsZW5hbWU+RklMRVNESVI8L2ZpbGVuYW1lPiB2YXJpYWJsZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCBhbmQgeW91IHNob3VsZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5GSUxFU1BBVEg8L2ZpbGVuYW1lPiBpbiBhbGwgbmV3IGNvZGUuCisgICAgICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1GSUxFU1BBVEgnPjxnbG9zc3Rlcm0+RklMRVNQQVRIPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBkaXJlY3RvcmllcyBCaXRCYWtlIHVzZXMgd2hlbiBzZWFyY2hpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgIHBhdGNoZXMgYW5kIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBUaGUgImxvY2FsIiBmZXRjaGVyIG1vZHVsZSB1c2VzIHRoZXNlIGRpcmVjdG9yaWVzIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgaGFuZGxpbmcgPGZpbGVuYW1lPmZpbGU6Ly88L2ZpbGVuYW1lPiBVUkxzLgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgYmVoYXZlcyBsaWtlIGEgc2hlbGwgPGZpbGVuYW1lPlBBVEg8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIGlzIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICBhcmUgc2VhcmNoZWQgbGVmdC10by1yaWdodCBpbiBvcmRlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1nJz48dGl0bGU+RzwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1HSVRESVInPjxnbG9zc3Rlcm0+R0lURElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBsb2NhbCBjb3B5IG9mIGEgR2l0IHJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgaXMgc3RvcmVkIHdoZW4gaXQgaXMgY2xvbmVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LWgnPjx0aXRsZT5IPC90aXRsZT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUhHRElSJz48Z2xvc3N0ZXJtPkhHRElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZmlsZXMgY2hlY2tlZCBvdXQgb2YgYSBNZXJjdXJpYWwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGFyZSBzdG9yZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItSE9NRVBBR0UnPjxnbG9zc3Rlcm0+SE9NRVBBR0U8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5XZWJzaXRlIHdoZXJlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvZnR3YXJlIHRoZSByZWNpcGUgaXMgYnVpbGRpbmcKKyAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGZvdW5kLjwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1pJz48dGl0bGU+STwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1JTkhFUklUJz48Z2xvc3N0ZXJtPklOSEVSSVQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ2F1c2VzIHRoZSBuYW1lZCBjbGFzcyB0byBiZSBpbmhlcml0ZWQgYXQKKyAgICAgICAgICAgICAgICAgICAgdGhpcyBwb2ludCBkdXJpbmcgcGFyc2luZy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIGlzIG9ubHkgdmFsaWQgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCis8IS0tCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnktaic+PHRpdGxlPko8L3RpdGxlPgorICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1rJz48dGl0bGU+SzwvdGl0bGU+CisgICAgPC9nbG9zc2Rpdj4KKy0tPgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktbCc+PHRpdGxlPkw8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItTEFZRVJERVBFTkRTJz48Z2xvc3N0ZXJtPkxBWUVSREVQRU5EUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPkxpc3RzIHRoZSBsYXllcnMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHVwb24gd2hpY2ggdGhpcyByZWNpcGUgZGVwZW5kcy4KKyAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSwgeW91IGNhbiBzcGVjaWZ5IGEgc3BlY2lmaWMgbGF5ZXIgdmVyc2lvbiBmb3IgYSBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgICAgIGJ5IGFkZGluZyBpdCB0byB0aGUgZW5kIG9mIHRoZSBsYXllciBuYW1lIHdpdGggYSBjb2xvbiwgKGUuZy4gImFub3RoZXJsYXllcjozIgorICAgICAgICAgICAgICAgICAgICB0byBiZSBjb21wYXJlZCBhZ2FpbnN0CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1MQVlFUlZFUlNJT04nPjxmaWxlbmFtZT5MQVlFUlZFUlNJT048L2ZpbGVuYW1lPjwvbGluaz48ZmlsZW5hbWU+X2Fub3RoZXJsYXllcjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSkuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgcHJvZHVjZXMgYW4gZXJyb3IgaWYgYW55IGRlcGVuZGVuY3kgaXMgbWlzc2luZyBvcgorICAgICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBudW1iZXJzIGRvIG5vdCBtYXRjaCBleGFjdGx5IChpZiBzcGVjaWZpZWQpLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgWW91IHVzZSB0aGlzIHZhcmlhYmxlIGluIHRoZSA8ZmlsZW5hbWU+Y29uZi9sYXllci5jb25mPC9maWxlbmFtZT4gZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgWW91IG11c3QgYWxzbyB1c2UgdGhlIHNwZWNpZmljIGxheWVyIG5hbWUgYXMgYSBzdWZmaXgKKyAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHZhcmlhYmxlIChlLmcuIDxmaWxlbmFtZT5MQVlFUkRFUEVORFNfbXlsYXllcjwvZmlsZW5hbWU+KS48L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1MQVlFUkRJUic+PGdsb3NzdGVybT5MQVlFUkRJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPldoZW4gdXNlZCBpbnNpZGUgdGhlIDxmaWxlbmFtZT5sYXllci5jb25mPC9maWxlbmFtZT4gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICBmaWxlLCB0aGlzIHZhcmlhYmxlIHByb3ZpZGVzIHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IGxheWVyLgorICAgICAgICAgICAgICAgICAgICBUaGlzIHZhcmlhYmxlIGlzIG5vdCBhdmFpbGFibGUgb3V0c2lkZSBvZiA8ZmlsZW5hbWU+bGF5ZXIuY29uZjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGFuZCByZWZlcmVuY2VzIGFyZSBleHBhbmRlZCBpbW1lZGlhdGVseSB3aGVuIHBhcnNpbmcgb2YgdGhlIGZpbGUgY29tcGxldGVzLjwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLUxBWUVSVkVSU0lPTic+PGdsb3NzdGVybT5MQVlFUlZFUlNJT048L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5PcHRpb25hbGx5IHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhIGxheWVyIGFzIGEgc2luZ2xlIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgdGhpcyB2YXJpYWJsZSB3aXRoaW4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUxBWUVSREVQRU5EUyc+PGZpbGVuYW1lPkxBWUVSREVQRU5EUzwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBmb3IgYW5vdGhlciBsYXllciBpbiBvcmRlciB0byBkZXBlbmQgb24gYSBzcGVjaWZpYyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsYXllci48L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFlvdSB1c2UgdGhpcyB2YXJpYWJsZSBpbiB0aGUgPGZpbGVuYW1lPmNvbmYvbGF5ZXIuY29uZjwvZmlsZW5hbWU+IGZpbGUuCisgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IGFsc28gdXNlIHRoZSBzcGVjaWZpYyBsYXllciBuYW1lIGFzIGEgc3VmZml4CisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB2YXJpYWJsZSAoZS5nLiA8ZmlsZW5hbWU+TEFZRVJERVBFTkRTX215bGF5ZXI8L2ZpbGVuYW1lPikuPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItTElDRU5TRSc+PGdsb3NzdGVybT5MSUNFTlNFPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBsaXN0IG9mIHNvdXJjZSBsaWNlbnNlcyBmb3IgdGhlIHJlY2lwZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktbSc+PHRpdGxlPk08L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItTUlSUk9SUyc+PGdsb3NzdGVybT5NSVJST1JTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhZGRpdGlvbmFsIHBhdGhzIGZyb20gd2hpY2ggQml0QmFrZSBnZXRzIHNvdXJjZSBjb2RlLgorICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBidWlsZCBzeXN0ZW0gc2VhcmNoZXMgZm9yIHNvdXJjZSBjb2RlLCBpdCBmaXJzdAorICAgICAgICAgICAgICAgICAgICB0cmllcyB0aGUgbG9jYWwgZG93bmxvYWQgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICBJZiB0aGF0IGxvY2F0aW9uIGZhaWxzLCB0aGUgYnVpbGQgc3lzdGVtIHRyaWVzIGxvY2F0aW9ucworICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QUkVNSVJST1JTJz48ZmlsZW5hbWU+UFJFTUlSUk9SUzwvZmlsZW5hbWU+PC9saW5rPiwKKyAgICAgICAgICAgICAgICAgICAgdGhlIHVwc3RyZWFtIHNvdXJjZSwgYW5kIHRoZW4gbG9jYXRpb25zIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+TUlSUk9SUzwvZmlsZW5hbWU+IGluIHRoYXQgb3JkZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItTVVMVElfUFJPVklERVJfV0hJVEVMSVNUJz48Z2xvc3N0ZXJtPk1VTFRJX1BST1ZJREVSX1dISVRFTElTVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBbGxvd3MgeW91IHRvIHN1cHByZXNzIEJpdEJha2Ugd2FybmluZ3MgY2F1c2VkIHdoZW4KKyAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmcgdHdvIHNlcGFyYXRlIHJlY2lwZXMgdGhhdCBwcm92aWRlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgIG91dHB1dC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQml0YmFrZSBub3JtYWxseSBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4gYnVpbGRpbmcgdHdvCisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCByZWNpcGVzIHdoZXJlIGVhY2ggcHJvdmlkZXMgdGhlIHNhbWUgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICBUaGlzIHNjZW5hcmlvIGlzIHVzdWFsbHkgc29tZXRoaW5nIHRoZSB1c2VyIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgIHdhbnQuCisgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGNhc2VzIGRvIGV4aXN0IHdoZXJlIGl0IG1ha2VzIHNlbnNlLCBwYXJ0aWN1bGFybHkKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIDxmaWxlbmFtZT52aXJ0dWFsLyo8L2ZpbGVuYW1lPiBuYW1lc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgdmFyaWFibGUgdG8gc3VwcHJlc3MgQml0QmFrZSdzIHdhcm5pbmdzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyB1c2UgdGhlIHZhcmlhYmxlLCBsaXN0IHByb3ZpZGVyIG5hbWVzIChlLmcuCisgICAgICAgICAgICAgICAgICAgIHJlY2lwZSBuYW1lcywgPGZpbGVuYW1lPnZpcnR1YWwva2VybmVsPC9maWxlbmFtZT4sCisgICAgICAgICAgICAgICAgICAgIGFuZCBzbyBmb3J0aCkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworPCEtLQorICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LW4nPjx0aXRsZT5OPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorLS0+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1vJz48dGl0bGU+TzwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1PVkVSUklERVMnPjxnbG9zc3Rlcm0+T1ZFUlJJREVTPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgdXNlcyA8ZmlsZW5hbWU+T1ZFUlJJREVTPC9maWxlbmFtZT4gdG8gY29udHJvbAorICAgICAgICAgICAgICAgICAgICB3aGF0IHZhcmlhYmxlcyBhcmUgb3ZlcnJpZGRlbiBhZnRlciBCaXRCYWtlIHBhcnNlcworICAgICAgICAgICAgICAgICAgICByZWNpcGVzIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb2xsb3dpbmcgaXMgYSBzaW1wbGUgZXhhbXBsZSB0aGF0IHVzZXMgYW4gb3ZlcnJpZGVzCisgICAgICAgICAgICAgICAgICAgIGxpc3QgYmFzZWQgb24gbWFjaGluZSBhcmNoaXRlY3R1cmVzOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIE9WRVJSSURFUyA9ICJhcm06eDg2Om1pcHM6cG93ZXJwYyIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGZpbmQgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZQorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+T1ZFUlJJREVTPC9maWxlbmFtZT4gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICI8bGluayBsaW5rZW5kPSdjb25kaXRpb25hbC1zeW50YXgtb3ZlcnJpZGVzJz5Db25kaXRpb25hbCBTeW50YXggKE92ZXJyaWRlcyk8L2xpbms+IgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnktcCc+PHRpdGxlPlA8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUEFDS0FHRVMnPjxnbG9zc3Rlcm0+UEFDS0FHRVM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5UaGUgbGlzdCBvZiBwYWNrYWdlcyB0aGUgcmVjaXBlIGNyZWF0ZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUEFDS0FHRVNfRFlOQU1JQyc+PGdsb3NzdGVybT5QQUNLQUdFU19EWU5BTUlDPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgcHJvbWlzZSB0aGF0IHlvdXIgcmVjaXBlIHNhdGlzZmllcyBydW50aW1lIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICBmb3Igb3B0aW9uYWwgbW9kdWxlcyB0aGF0IGFyZSBmb3VuZCBpbiBvdGhlciByZWNpcGVzLgorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+UEFDS0FHRVNfRFlOQU1JQzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGFjdHVhbGx5IHNhdGlzZnkgdGhlIGRlcGVuZGVuY2llcywgaXQgb25seSBzdGF0ZXMgdGhhdAorICAgICAgICAgICAgICAgICAgICB0aGV5IHNob3VsZCBiZSBzYXRpc2ZpZWQuCisgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBpZiBhIGhhcmQsIHJ1bnRpbWUgZGVwZW5kZW5jeQorICAgICAgICAgICAgICAgICAgICAoPGxpbmsgbGlua2VuZD0ndmFyLVJERVBFTkRTJz48ZmlsZW5hbWU+UkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4pCisgICAgICAgICAgICAgICAgICAgIG9mIGFub3RoZXIgcGFja2FnZSBpcyBzYXRpc2ZpZWQgZHVyaW5nIHRoZSBidWlsZAorICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIHRoZSA8ZmlsZW5hbWU+UEFDS0FHRVNfRFlOQU1JQzwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCBidXQgYSBwYWNrYWdlIHdpdGggdGhlIG1vZHVsZSBuYW1lIGlzIG5ldmVyIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VkLCB0aGVuIHRoZSBvdGhlciBwYWNrYWdlIHdpbGwgYmUgYnJva2VuLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBFJz48Z2xvc3N0ZXJtPlBFPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBlcG9jaCBvZiB0aGUgcmVjaXBlLgorICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGlzIHZhcmlhYmxlIGlzIHVuc2V0LgorICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgaXMgdXNlZCB0byBtYWtlIHVwZ3JhZGVzIHBvc3NpYmxlIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25pbmcgc2NoZW1lIGNoYW5nZXMgaW4gc29tZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlCisgICAgICAgICAgICAgICAgICAgIHdheS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QRVJTSVNURU5UX0RJUic+PGdsb3NzdGVybT5QRVJTSVNURU5UX0RJUjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBCaXRCYWtlIHVzZXMgdG8gc3RvcmUgZGF0YSB0aGF0CisgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBidWlsZHMuCisgICAgICAgICAgICAgICAgICAgIEluIHBhcnRpY3VsYXIsIHRoZSBkYXRhIHN0b3JlZCBpcyB0aGUgZGF0YSB0aGF0IHVzZXMKKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSdzIHBlcnNpc3RlbnQgZGF0YSBBUEkgYW5kIHRoZSBkYXRhIHVzZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIFBSIFNlcnZlciBhbmQgUFIgU2VydmljZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QRic+PGdsb3NzdGVybT5QRjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHJlY2lwZSBvciBwYWNrYWdlIG5hbWUgYW5kIGluY2x1ZGVzIGFsbCB2ZXJzaW9uIGFuZCByZXZpc2lvbgorICAgICAgICAgICAgICAgICAgICBudW1iZXJzIChpLmUuIDxmaWxlbmFtZT5lZ2xpYmMtMi4xMy1yMjArc3ZucjE1NTA4LzwvZmlsZW5hbWU+IGFuZAorICAgICAgICAgICAgICAgICAgICA8ZmlsZW5hbWU+YmFzaC00LjItcjEvPC9maWxlbmFtZT4pLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBOJz48Z2xvc3N0ZXJtPlBOPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIHJlY2lwZSBuYW1lLjwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBSJz48Z2xvc3N0ZXJtPlBSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIHJldmlzaW9uIG9mIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBSRUZFUlJFRF9QUk9WSURFUic+PGdsb3NzdGVybT5QUkVGRVJSRURfUFJPVklERVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRGV0ZXJtaW5lcyB3aGljaCByZWNpcGUgc2hvdWxkIGJlIGdpdmVuIHByZWZlcmVuY2Ugd2hlbgorICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSByZWNpcGVzIHByb3ZpZGUgdGhlIHNhbWUgaXRlbS4KKyAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCBhbHdheXMgc3VmZml4IHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBpdGVtLCBhbmQgeW91IHNob3VsZCBzZXQgaXQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+PGZpbGVuYW1lPlBOPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZWNpcGUgdG8gd2hpY2ggeW91IHdhbnQgdG8gZ2l2ZSBwcmVjZWRlbmNlLgorICAgICAgICAgICAgICAgICAgICBTb21lIGV4YW1wbGVzOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRUZFUlJFRF9QUk9WSURFUl92aXJ0dWFsL2tlcm5lbCA/PSAibGludXgteW9jdG8iCisgICAgIFBSRUZFUlJFRF9QUk9WSURFUl92aXJ0dWFsL3hzZXJ2ZXIgPSAieHNlcnZlci14Zjg2IgorICAgICBQUkVGRVJSRURfUFJPVklERVJfdmlydHVhbC9saWJnbCA/PSAibWVzYSIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVBSRUZFUlJFRF9QUk9WSURFUlMnPjxnbG9zc3Rlcm0+UFJFRkVSUkVEX1BST1ZJREVSUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmVzIHdoaWNoIHJlY2lwZSBzaG91bGQgYmUgZ2l2ZW4gcHJlZmVyZW5jZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgY2FzZXMgd2hlcmUgbXVsdGlwbGUgcmVjaXBlcyBwcm92aWRlIHRoZSBzYW1lIGl0ZW0uCisgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWxseSwKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPlBSRUZFUlJFRF9QUk9WSURFUlM8L2ZpbGVuYW1lPiBpcyBpZGVudGljYWwgdG8KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVBSRUZFUlJFRF9QUk9WSURFUic+PGZpbGVuYW1lPlBSRUZFUlJFRF9QUk9WSURFUjwvZmlsZW5hbWU+PC9saW5rPi4KKyAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIDxmaWxlbmFtZT5QUkVGRVJSRURfUFJPVklERVJTPC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgbGV0cyB5b3UgZGVmaW5lIHByZWZlcmVuY2VzIGZvciBtdWx0aXBsZQorICAgICAgICAgICAgICAgICAgICBzaXR1YXRpb25zIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBQUkVGRVJSRURfUFJPVklERVJTID0gInh4eDp5eXkgYWFhOmJiYiAuLi4iCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBmb3JtIGlzIGEgY29udmVuaWVudCByZXBsYWNlbWVudCBmb3IgdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBQUkVGRVJSRURfUFJPVklERVJfeHh4ID0gInl5eSIKKyAgICAgUFJFRkVSUkVEX1BST1ZJREVSX2FhYSA9ICJiYmIiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QUkVGRVJSRURfVkVSU0lPTic+PGdsb3NzdGVybT5QUkVGRVJSRURfVkVSU0lPTjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgcmVjaXBlcyBhdmFpbGFibGUsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCByZWNpcGUgc2hvdWxkIGJlIGdpdmVuIHByZWZlcmVuY2UuCisgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IGFsd2F5cyBzdWZmaXggdGhlIHZhcmlhYmxlIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+PGZpbGVuYW1lPlBOPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHlvdSB3YW50IHRvIHNlbGVjdCwgYW5kIHlvdSBzaG91bGQgc2V0CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1QVic+PGZpbGVuYW1lPlBWPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZ2x5IGZvciBwcmVjZWRlbmNlLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgIjxmaWxlbmFtZT4lPC9maWxlbmFtZT4iIGNoYXJhY3RlciBhcyBhCisgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkIHRvIG1hdGNoIGFueSBudW1iZXIgb2YgY2hhcmFjdGVycywgd2hpY2ggY2FuIGJlCisgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCB3aGVuIHNwZWNpZnlpbmcgdmVyc2lvbnMgdGhhdCBjb250YWluIGxvbmcgcmV2aXNpb24KKyAgICAgICAgICAgICAgICAgICAgbnVtYmVycyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZS4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSBhcmUgdHdvIGV4YW1wbGVzOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRUZFUlJFRF9WRVJTSU9OX3B5dGhvbiA9ICIyLjcuMyIKKyAgICAgUFJFRkVSUkVEX1ZFUlNJT05fbGludXgteW9jdG8gPSAiMy4xMCUiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QUkVNSVJST1JTJz48Z2xvc3N0ZXJtPlBSRU1JUlJPUlM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGFkZGl0aW9uYWwgcGF0aHMgZnJvbSB3aGljaCBCaXRCYWtlIGdldHMgc291cmNlIGNvZGUuCisgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGJ1aWxkIHN5c3RlbSBzZWFyY2hlcyBmb3Igc291cmNlIGNvZGUsIGl0IGZpcnN0CisgICAgICAgICAgICAgICAgICAgIHRyaWVzIHRoZSBsb2NhbCBkb3dubG9hZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIElmIHRoYXQgbG9jYXRpb24gZmFpbHMsIHRoZSBidWlsZCBzeXN0ZW0gdHJpZXMgbG9jYXRpb25zCisgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgPGZpbGVuYW1lPlBSRU1JUlJPUlM8L2ZpbGVuYW1lPiwgdGhlIHVwc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgYW5kIHRoZW4gbG9jYXRpb25zIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItTUlSUk9SUyc+PGZpbGVuYW1lPk1JUlJPUlM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgaW4gdGhhdCBvcmRlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVHlwaWNhbGx5LCB5b3Ugd291bGQgYWRkIGEgc3BlY2lmaWMgc2VydmVyIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgYnVpbGQgc3lzdGVtIHRvIGF0dGVtcHQgYmVmb3JlIGFueSBvdGhlcnMgYnkgYWRkaW5nCisgICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgdG8geW91ciBjb25maWd1cmF0aW9uOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSRU1JUlJPUlNfcHJlcGVuZCA9ICJcCisgICAgIGdpdDovLy4qLy4qIGh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9zb3VyY2VzLyBcbiBcCisgICAgIGZ0cDovLy4qLy4qIGh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9zb3VyY2VzLyBcbiBcCisgICAgIGh0dHA6Ly8uKi8uKiBodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvc291cmNlcy8gXG4gXAorICAgICBodHRwczovLy4qLy4qIGh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9zb3VyY2VzLyBcbiIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGVzZSBjaGFuZ2VzIGNhdXNlIHRoZSBidWlsZCBzeXN0ZW0gdG8gaW50ZXJjZXB0CisgICAgICAgICAgICAgICAgICAgIEdpdCwgRlRQLCBIVFRQLCBhbmQgSFRUUFMgcmVxdWVzdHMgYW5kIGRpcmVjdCB0aGVtIHRvCisgICAgICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+aHR0cDovLzwvZmlsZW5hbWU+IHNvdXJjZXMgbWlycm9yLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSA8ZmlsZW5hbWU+ZmlsZTovLzwvZmlsZW5hbWU+IFVSTHMgdG8gcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgdG8gbG9jYWwgZGlyZWN0b3JpZXMgb3IgbmV0d29yayBzaGFyZXMgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QUk9WSURFUyc+PGdsb3NzdGVybT5QUk9WSURFUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgYWxpYXNlcyBieSB3aGljaCBhIHBhcnRpY3VsYXIgcmVjaXBlIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICBrbm93bi4KKyAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgYSByZWNpcGUncyBvd24KKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPjxsaW5rIGxpbmtlbmQ9J3Zhci1QTic+UE48L2xpbms+PC9maWxlbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgaXMgaW1wbGljaXRseSBhbHJlYWR5IGluIGl0cyA8ZmlsZW5hbWU+UFJPVklERVM8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBsaXN0LgorICAgICAgICAgICAgICAgICAgICBJZiBhIHJlY2lwZSB1c2VzIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+LCB0aGUKKyAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBhbGlhc2VzIGFyZSBzeW5vbnltcyBmb3IgdGhlIHJlY2lwZSBhbmQgY2FuCisgICAgICAgICAgICAgICAgICAgIGJlIHVzZWZ1bCBzYXRpc2Z5aW5nIGRlcGVuZGVuY2llcyBvZiBvdGhlciByZWNpcGVzIGR1cmluZworICAgICAgICAgICAgICAgICAgICB0aGUgYnVpbGQgYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT48bGluayBsaW5rZW5kPSd2YXItREVQRU5EUyc+REVQRU5EUzwvbGluaz48L2ZpbGVuYW1lPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5QUk9WSURFUzwvZmlsZW5hbWU+IHN0YXRlbWVudCBmcm9tIGEgcmVjaXBlCisgICAgICAgICAgICAgICAgICAgIGZpbGUgPGZpbGVuYW1lPmxpYmF2XzAuOC4xMS5iYjwvZmlsZW5hbWU+OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBST1ZJREVTICs9ICJsaWJwb3N0cHJvYyIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBUaGUgPGZpbGVuYW1lPlBST1ZJREVTPC9maWxlbmFtZT4gc3RhdGVtZW50IHJlc3VsdHMgaW4KKyAgICAgICAgICAgICAgICAgICAgdGhlICJsaWJhdiIgcmVjaXBlIGFsc28gYmVpbmcga25vd24gYXMgImxpYnBvc3Rwcm9jIi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QUlNFUlZfSE9TVCc+PGdsb3NzdGVybT5QUlNFUlZfSE9TVDwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgbmV0d29yayBiYXNlZAorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItUFInPjxmaWxlbmFtZT5QUjwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIGhvc3QgYW5kIHBvcnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgPGZpbGVuYW1lPlBSU0VSVl9IT1NUPC9maWxlbmFtZT4gdmFyaWFibGUgaXMKKyAgICAgICAgICAgICAgICAgICAgc2V0OgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgIFBSU0VSVl9IT1NUID0gImxvY2FsaG9zdDowIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgICAgIFlvdSBtdXN0IHNldCB0aGUgdmFyaWFibGUgaWYgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseQorICAgICAgICAgICAgICAgICAgICBzdGFydCBhIGxvY2FsIFBSIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2V0IDxmaWxlbmFtZT5QUlNFUlZfSE9TVDwvZmlsZW5hbWU+IHRvIG90aGVyCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyB0byB1c2UgYSByZW1vdGUgUFIgc2VydmljZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1QVic+PGdsb3NzdGVybT5QVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPlRoZSB2ZXJzaW9uIG9mIHRoZSByZWNpcGUuCisgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKzwhLS0KKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS1xJz48dGl0bGU+UTwvdGl0bGU+CisgICAgPC9nbG9zc2Rpdj4KKy0tPgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnktcic+PHRpdGxlPlI8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUkRFUEVORFMnPjxnbG9zc3Rlcm0+UkRFUEVORFM8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTGlzdHMgYSBwYWNrYWdlJ3MgcnVudGltZSBkZXBlbmRlbmNpZXMgKGkuZS4gb3RoZXIgcGFja2FnZXMpCisgICAgICAgICAgICAgICAgICAgIHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQgaW4gb3JkZXIgZm9yIHRoZSBidWlsdCBwYWNrYWdlIHRvIHJ1bgorICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgIElmIGEgcGFja2FnZSBpbiB0aGlzIGxpc3QgY2Fubm90IGJlIGZvdW5kIGR1cmluZyB0aGUgYnVpbGQsCisgICAgICAgICAgICAgICAgICAgIHlvdSB3aWxsIGdldCBhIGJ1aWxkIGVycm9yLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIHRoZSA8ZmlsZW5hbWU+UkRFUEVORFM8L2ZpbGVuYW1lPiB2YXJpYWJsZSBhcHBsaWVzCisgICAgICAgICAgICAgICAgICAgIHRvIHBhY2thZ2VzIGJlaW5nIGJ1aWx0LCB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIGluIGEgZm9ybSB3aXRoIGFuIGF0dGFjaGVkIHBhY2thZ2UgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGFyZSBidWlsZGluZyBhIGRldmVsb3BtZW50IHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBkZXBlbmRzIG9uIHRoZSA8ZmlsZW5hbWU+cGVybDwvZmlsZW5hbWU+IHBhY2thZ2UuCisgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgeW91IHdvdWxkIHVzZSB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+IHN0YXRlbWVudDoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBSREVQRU5EU18ke1BOfS1kZXYgKz0gInBlcmwiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGV4YW1wbGUsIHRoZSBkZXZlbG9wbWVudCBwYWNrYWdlIGRlcGVuZHMgb24KKyAgICAgICAgICAgICAgICAgICAgdGhlIDxmaWxlbmFtZT5wZXJsPC9maWxlbmFtZT4gcGFja2FnZS4KKyAgICAgICAgICAgICAgICAgICAgVGh1cywgdGhlIDxmaWxlbmFtZT5SREVQRU5EUzwvZmlsZW5hbWU+IHZhcmlhYmxlIGhhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGZpbGVuYW1lPiR7UE59LWRldjwvZmlsZW5hbWU+IHBhY2thZ2UgbmFtZSBhcyBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSBzdXBwb3J0cyBzcGVjaWZ5aW5nIHZlcnNpb25lZCBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICAgICAgICAgIEFsdGhvdWdoIHRoZSBzeW50YXggdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgcGFja2FnaW5nCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgQml0QmFrZSBoaWRlcyB0aGVzZSBkaWZmZXJlbmNlcyBmcm9tIHlvdS4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSBpcyB0aGUgZ2VuZXJhbCBzeW50YXggdG8gc3BlY2lmeSB2ZXJzaW9ucyB3aXRoCisgICAgICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+UkRFUEVORFM8L2ZpbGVuYW1lPiB2YXJpYWJsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBSREVQRU5EU18ke1BOfSA9ICI8cmVwbGFjZWFibGU+cGFja2FnZTwvcmVwbGFjZWFibGU+ICg8cmVwbGFjZWFibGU+b3BlcmF0b3I8L3JlcGxhY2VhYmxlPiA8cmVwbGFjZWFibGU+dmVyc2lvbjwvcmVwbGFjZWFibGU+KSIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBGb3IgPGZpbGVuYW1lPm9wZXJhdG9yPC9maWxlbmFtZT4sIHlvdSBjYW4gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgID0KKyAgICAgJmx0OworICAgICAmZ3Q7CisgICAgICZsdDs9CisgICAgICZndDs9CisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2V0cyB1cCBhIGRlcGVuZGVuY3kgb24gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAxLjIgb3IgZ3JlYXRlciBvZiB0aGUgcGFja2FnZSA8ZmlsZW5hbWU+Zm9vPC9maWxlbmFtZT46CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsbGF5b3V0IGNsYXNzPSdtb25vc3BhY2VkJz4KKyAgICAgUkRFUEVORFNfJHtQTn0gPSAiZm9vICg+PSAxLjIpIgorICAgICAgICAgICAgICAgICAgICA8L2xpdGVyYWxsYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiBidWlsZC10aW1lIGRlcGVuZGVuY2llcywgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItREVQRU5EUyc+PGZpbGVuYW1lPkRFUEVORFM8L2ZpbGVuYW1lPjwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItUlBST1ZJREVTJz48Z2xvc3N0ZXJtPlJQUk9WSURFUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgcGFja2FnZSBuYW1lIGFsaWFzZXMgdGhhdCBhIHBhY2thZ2UgYWxzbyBwcm92aWRlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlc2UgYWxpYXNlcyBhcmUgdXNlZnVsIGZvciBzYXRpc2Z5aW5nIHJ1bnRpbWUgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgIG9mIG90aGVyIHBhY2thZ2VzIGJvdGggZHVyaW5nIHRoZSBidWlsZCBhbmQgb24gdGhlIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAoYXMgc3BlY2lmaWVkIGJ5CisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT48bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPlJERVBFTkRTPC9saW5rPjwvZmlsZW5hbWU+KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgQXMgd2l0aCBhbGwgcGFja2FnZS1jb250cm9sbGluZyB2YXJpYWJsZXMsIHlvdSBtdXN0IGFsd2F5cworICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgdmFyaWFibGUgaW4gY29uanVuY3Rpb24gd2l0aCBhIHBhY2thZ2UgbmFtZSBvdmVycmlkZS4KKyAgICAgICAgICAgICAgICAgICBIZXJlIGlzIGFuIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBSUFJPVklERVNfJHtQTn0gPSAid2lkZ2V0LWFiaS0yIgorICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1SUkVDT01NRU5EUyc+PGdsb3NzdGVybT5SUkVDT01NRU5EUzwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgcGFja2FnZXMgdGhhdCBleHRlbmRzIHRoZSB1c2FiaWxpdHkgb2YgYSBwYWNrYWdlCisgICAgICAgICAgICAgICAgICAgIGJlaW5nIGJ1aWx0LgorICAgICAgICAgICAgICAgICAgICBUaGUgcGFja2FnZSBiZWluZyBidWlsdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhpcyBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluIG9yZGVyIHRvIHN1Y2Nlc3NmdWxseSBidWlsZCwgYnV0IG5lZWRzIHRoZW0gZm9yCisgICAgICAgICAgICAgICAgICAgIHRoZSBleHRlbmRlZCB1c2FiaWxpdHkuCisgICAgICAgICAgICAgICAgICAgIFRvIHNwZWNpZnkgcnVudGltZSBkZXBlbmRlbmNpZXMgZm9yIHBhY2thZ2VzLCBzZWUgdGhlCisgICAgICAgICAgICAgICAgICAgIDxmaWxlbmFtZT48bGluayBsaW5rZW5kPSd2YXItUkRFUEVORFMnPlJERVBFTkRTPC9saW5rPjwvZmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCaXRCYWtlIHN1cHBvcnRzIHNwZWNpZnlpbmcgdmVyc2lvbmVkIHJlY29tbWVuZHMuCisgICAgICAgICAgICAgICAgICAgIEFsdGhvdWdoIHRoZSBzeW50YXggdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgcGFja2FnaW5nCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgQml0QmFrZSBoaWRlcyB0aGVzZSBkaWZmZXJlbmNlcyBmcm9tIHlvdS4KKyAgICAgICAgICAgICAgICAgICAgSGVyZSBpcyB0aGUgZ2VuZXJhbCBzeW50YXggdG8gc3BlY2lmeSB2ZXJzaW9ucyB3aXRoCisgICAgICAgICAgICAgICAgICAgIHRoZSA8ZmlsZW5hbWU+UlJFQ09NTUVORFM8L2ZpbGVuYW1lPiB2YXJpYWJsZToKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBSUkVDT01NRU5EU18ke1BOfSA9ICI8cmVwbGFjZWFibGU+cGFja2FnZTwvcmVwbGFjZWFibGU+ICg8cmVwbGFjZWFibGU+b3BlcmF0b3I8L3JlcGxhY2VhYmxlPiA8cmVwbGFjZWFibGU+dmVyc2lvbjwvcmVwbGFjZWFibGU+KSIKKyAgICAgICAgICAgICAgICAgICAgPC9saXRlcmFsbGF5b3V0PgorICAgICAgICAgICAgICAgICAgICBGb3IgPGZpbGVuYW1lPm9wZXJhdG9yPC9maWxlbmFtZT4sIHlvdSBjYW4gc3BlY2lmeSB0aGUKKyAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nOgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbGxheW91dCBjbGFzcz0nbW9ub3NwYWNlZCc+CisgICAgID0KKyAgICAgJmx0OworICAgICAmZ3Q7CisgICAgICZsdDs9CisgICAgICZndDs9CisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgc2V0cyB1cCBhIHJlY29tbWVuZCBvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIDEuMiBvciBncmVhdGVyIG9mIHRoZSBwYWNrYWdlIDxmaWxlbmFtZT5mb288L2ZpbGVuYW1lPjoKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWxsYXlvdXQgY2xhc3M9J21vbm9zcGFjZWQnPgorICAgICBSUkVDT01NRU5EU18ke1BOfSA9ICJmb28gKD49IDEuMikiCisgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbGxheW91dD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnktcyc+PHRpdGxlPlM8L3RpdGxlPgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItU0VDVElPTic+PGdsb3NzdGVybT5TRUNUSU9OPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+VGhlIHNlY3Rpb24gaW4gd2hpY2ggcGFja2FnZXMgc2hvdWxkIGJlIGNhdGVnb3JpemVkLjwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVNSQ19VUkknPjxnbG9zc3Rlcm0+U1JDX1VSSTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgLSBsb2NhbCBvciByZW1vdGUuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgdGVsbHMgQml0QmFrZSB3aGljaCBiaXRzCisgICAgICAgICAgICAgICAgICAgIHRvIHB1bGwgZm9yIHRoZSBidWlsZCBhbmQgaG93IHRvIHB1bGwgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWNpcGUgb3IgYXBwZW5kIGZpbGUgbmVlZHMgdG8KKyAgICAgICAgICAgICAgICAgICAgZmV0Y2ggYSBzaW5nbGUgdGFyYmFsbCBmcm9tIHRoZSBJbnRlcm5ldCwgdGhlIHJlY2lwZSBvcgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQgZmlsZSB1c2VzIGEgPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBlbnRyeSB0aGF0IHNwZWNpZmllcyB0aGF0IHRhcmJhbGwuCisgICAgICAgICAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgcmVjaXBlIG9yIGFwcGVuZCBmaWxlIG5lZWRzIHRvCisgICAgICAgICAgICAgICAgICAgIGZldGNoIGEgdGFyYmFsbCBhbmQgaW5jbHVkZSBhIGN1c3RvbSBmaWxlLCB0aGUgcmVjaXBlIG9yCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBmaWxlIG5lZWRzIGFuIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4gdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBzcGVjaWZpZXMgYWxsIHRob3NlIHNvdXJjZXMuPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgbGlzdCBleHBsYWlucyB0aGUgYXZhaWxhYmxlIFVSSSBwcm90b2NvbHM6CisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5maWxlOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmV0Y2hlcyBmaWxlcywgd2hpY2ggYXJlIHVzdWFsbHkgZmlsZXMgc2hpcHBlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGxvY2FsIG1hY2hpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLUZJTEVTUEFUSCc+PGZpbGVuYW1lPkZJTEVTUEFUSDwvZmlsZW5hbWU+PC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+YnpyOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF6YWFyIHJldmlzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeS48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPmdpdDovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzIGZyb20gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdpdCByZXZpc2lvbiBjb250cm9sIHJlcG9zaXRvcnkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5vc2M6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gT1NDIChPcGVuU1VTRSBCdWlsZCBzZXJ2aWNlKSByZXZpc2lvbiBjb250cm9sIHJlcG9zaXRvcnkuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5yZXBvOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVwbyAoR2l0KSByZXBvc2l0b3J5LjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+aHR0cDovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSW50ZXJuZXQgdXNpbmcgSFRUUC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPmh0dHBzOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBJbnRlcm5ldCB1c2luZyBIVFRQUy48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPmZ0cDovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgSW50ZXJuZXQgdXNpbmcgRlRQLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+Y3ZzOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgQ1ZTIHJldmlzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeS48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPmhnOi8vPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IEZldGNoZXMgZmlsZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgTWVyY3VyaWFsICg8ZmlsZW5hbWU+aGc8L2ZpbGVuYW1lPikgcmV2aXNpb24gY29udHJvbCByZXBvc2l0b3J5LjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxlbXBoYXNpcz48ZmlsZW5hbWU+cDQ6Ly88L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gRmV0Y2hlcyBmaWxlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBQZXJmb3JjZSAoPGZpbGVuYW1lPnA0PC9maWxlbmFtZT4pIHJldmlzaW9uIGNvbnRyb2wgcmVwb3NpdG9yeS48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnNzaDovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNlY3VyZSBzaGVsbC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnN2bjovLzwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBGZXRjaGVzIGZpbGVzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFN1YnZlcnNpb24gKDxmaWxlbmFtZT5zdm48L2ZpbGVuYW1lPikgcmV2aXNpb24gY29udHJvbCByZXBvc2l0b3J5LjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+SGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIG9wdGlvbnMgd29ydGggbWVudGlvbmluZzoKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48ZW1waGFzaXM+PGZpbGVuYW1lPnVucGFjazwvZmlsZW5hbWU+IC08L2VtcGhhc2lzPiBDb250cm9scworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IHRvIHVucGFjayB0aGUgZmlsZSBpZiBpdCBpcyBhbiBhcmNoaXZlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byB1bnBhY2sgdGhlIGZpbGUuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5zdWJkaXI8L2ZpbGVuYW1lPiAtPC9lbXBoYXNpcz4gUGxhY2VzIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGV4dHJhY3RzIGl0cyBjb250ZW50cykgaW50byB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgdW51c3VhbCB0YXJiYWxscyBvciBvdGhlciBhcmNoaXZlcyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IGhhdmUgdGhlaXIgZmlsZXMgYWxyZWFkeSBpbiBhIHN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlIGFyY2hpdmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5uYW1lPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IFNwZWNpZmllcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB0byBiZSB1c2VkIGZvciBhc3NvY2lhdGlvbiB3aXRoIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4gY2hlY2tzdW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGZpbGUgc3BlY2lmaWVkIGluIDxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGVtcGhhc2lzPjxmaWxlbmFtZT5kb3dubG9hZGZpbGVuYW1lPC9maWxlbmFtZT4gLTwvZW1waGFzaXM+IFNwZWNpZmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlbmFtZSB1c2VkIHdoZW4gc3RvcmluZyB0aGUgZG93bmxvYWRlZCBmaWxlLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1TUkNEQVRFJz48Z2xvc3N0ZXJtPlNSQ0RBVEU8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGRhdGUgb2YgdGhlIHNvdXJjZSBjb2RlIHVzZWQgdG8gYnVpbGQgdGhlIHBhY2thZ2UuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgYXBwbGllcyBvbmx5IGlmIHRoZSBzb3VyY2Ugd2FzIGZldGNoZWQgZnJvbSBhIFNvdXJjZSBDb2RlIE1hbmFnZXIgKFNDTSkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItU1JDUkVWJz48Z2xvc3N0ZXJtPlNSQ1JFVjwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgcmV2aXNpb24gb2YgdGhlIHNvdXJjZSBjb2RlIHVzZWQgdG8gYnVpbGQgdGhlIHBhY2thZ2UuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFyaWFibGUgYXBwbGllcyBvbmx5IHdoZW4gdXNpbmcgU3VidmVyc2lvbiwgR2l0LCBNZXJjdXJpYWwgYW5kIEJhemFhci4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gYnVpbGQgYSBmaXhlZCByZXZpc2lvbiBhbmQgeW91IHdhbnQKKyAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgcGVyZm9ybWluZyBhIHF1ZXJ5IG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSBldmVyeSB0aW1lCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgcGFyc2VzIHlvdXIgcmVjaXBlLCB5b3Ugc2hvdWxkIHNwZWNpZnkgYSA8ZmlsZW5hbWU+U1JDUkVWPC9maWxlbmFtZT4gdGhhdCBpcyBhCisgICAgICAgICAgICAgICAgICAgIGZ1bGwgcmV2aXNpb24gaWRlbnRpZmllciBhbmQgbm90IGp1c3QgYSB0YWcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgICAgIDxnbG9zc2VudHJ5IGlkPSd2YXItU1JDUkVWX0ZPUk1BVCc+PGdsb3NzdGVybT5TUkNSRVZfRk9STUFUPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhlbHBzIGNvbnN0cnVjdCB2YWxpZAorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSd2YXItU1JDUkVWJz48ZmlsZW5hbWU+U1JDUkVWPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyB3aGVuIG11bHRpcGxlIHNvdXJjZSBjb250cm9sbGVkIFVSTHMgYXJlIHVzZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ndmFyLVNSQ19VUkknPjxmaWxlbmFtZT5TUkNfVVJJPC9maWxlbmFtZT48L2xpbms+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgc3lzdGVtIG5lZWRzIGhlbHAgY29uc3RydWN0aW5nIHRoZXNlIHZhbHVlcyB1bmRlciB0aGVzZQorICAgICAgICAgICAgICAgICAgICBjaXJjdW1zdGFuY2VzLgorICAgICAgICAgICAgICAgICAgICBFYWNoIGNvbXBvbmVudCBpbiB0aGUgPGZpbGVuYW1lPlNSQ19VUkk8L2ZpbGVuYW1lPgorICAgICAgICAgICAgICAgICAgICBpcyBhc3NpZ25lZCBhIG5hbWUgYW5kIHRoZXNlIGFyZSByZWZlcmVuY2VkCisgICAgICAgICAgICAgICAgICAgIGluIHRoZSA8ZmlsZW5hbWU+U1JDUkVWX0ZPUk1BVDwvZmlsZW5hbWU+IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICBDb25zaWRlciBhbiBleGFtcGxlIHdpdGggVVJMcyBuYW1lZCAibWFjaGluZSIgYW5kICJtZXRhIi4KKyAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCA8ZmlsZW5hbWU+U1JDUkVWX0ZPUk1BVDwvZmlsZW5hbWU+IGNvdWxkIGxvb2sKKyAgICAgICAgICAgICAgICAgICAgbGlrZSAibWFjaGluZV9tZXRhIiBhbmQgdGhvc2UgbmFtZXMgd291bGQgaGF2ZSB0aGUgU0NNCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zIHN1YnN0aXR1dGVkIGludG8gZWFjaCBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgT25seSBvbmUgPGZpbGVuYW1lPkFVVE9JTkM8L2ZpbGVuYW1lPiBwbGFjZWhvbGRlciBpcyBhZGRlZAorICAgICAgICAgICAgICAgICAgICBhbmQgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICBBbmQsIHRoaXMgcGxhY2Vob2xkZXIgaXMgcGxhY2VkIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgc3RyaW5nLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVNUQU1QJz48Z2xvc3N0ZXJtPlNUQU1QPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgYmFzZSBwYXRoIHVzZWQgdG8gY3JlYXRlIHJlY2lwZSBzdGFtcCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHBhdGggdG8gYW4gYWN0dWFsIHN0YW1wIGZpbGUgaXMgY29uc3RydWN0ZWQgYnkgZXZhbHVhdGluZyB0aGlzCisgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhbmQgdGhlbiBhcHBlbmRpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1TVEFNUENMRUFOJz48Z2xvc3N0ZXJtPlNUQU1QQ0xFQU48L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBiYXNlIHBhdGggdXNlZCB0byBjcmVhdGUgcmVjaXBlIHN0YW1wIGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBVbmxpa2UgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9J3Zhci1TVEFNUCc+PGZpbGVuYW1lPlNUQU1QPC9maWxlbmFtZT48L2xpbms+CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLCA8ZmlsZW5hbWU+U1RBTVBDTEVBTjwvZmlsZW5hbWU+IGNhbiBjb250YWluCisgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkcyB0byBtYXRjaCB0aGUgcmFuZ2Ugb2YgZmlsZXMgYSBjbGVhbiBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHJlbW92ZS4KKyAgICAgICAgICAgICAgICAgICAgQml0QmFrZSB1c2VzIGEgY2xlYW4gb3BlcmF0aW9uIHRvIHJlbW92ZSBhbnkgb3RoZXIgc3RhbXBzCisgICAgICAgICAgICAgICAgICAgIGl0IHNob3VsZCBiZSByZW1vdmluZyB3aGVuIGNyZWF0aW5nIGEgbmV3IHN0YW1wLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVNVTU1BUlknPjxnbG9zc3Rlcm0+U1VNTUFSWTwvZ2xvc3N0ZXJtPgorICAgICAgICAgICAgPGdsb3NzZGVmPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBIHNob3J0IHN1bW1hcnkgZm9yIHRoZSByZWNpcGUsIHdoaWNoIGlzIDcyIGNoYXJhY3RlcnMgb3IgbGVzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2dsb3NzZGVmPgorICAgICAgICA8L2dsb3NzZW50cnk+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1TVk5ESVInPjxnbG9zc3Rlcm0+U1ZORElSPC9nbG9zc3Rlcm0+CisgICAgICAgICAgICA8Z2xvc3NkZWY+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZmlsZXMgY2hlY2tlZCBvdXQgb2YgYSBTdWJ2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBhcmUgc3RvcmVkLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS10Jz48dGl0bGU+VDwvdGl0bGU+CisKKyAgICAgICAgPGdsb3NzZW50cnkgaWQ9J3Zhci1UJz48Z2xvc3N0ZXJtPlQ8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT5Qb2ludHMgdG8gYSBkaXJlY3Rvcnkgd2VyZSBCaXRCYWtlIHBsYWNlcworICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkgZmlsZXMsIHdoaWNoIGNvbnNpc3QgbW9zdGx5IG9mIHRhc2sgbG9ncyBhbmQKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0cywgd2hlbiBidWlsZGluZyBhIHBhcnRpY3VsYXIgcmVjaXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvZ2xvc3NkZWY+CisgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworICAgICAgICA8Z2xvc3NlbnRyeSBpZD0ndmFyLVRPUERJUic+PGdsb3NzdGVybT5UT1BESVI8L2dsb3NzdGVybT4KKyAgICAgICAgICAgIDxnbG9zc2RlZj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUG9pbnRzIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgIEJpdEJha2UgYXV0b21hdGljYWxseSBzZXRzIHRoaXMgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9nbG9zc2RlZj4KKyAgICAgICAgPC9nbG9zc2VudHJ5PgorCisgICAgPC9nbG9zc2Rpdj4KKworPCEtLQorICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LXUnPjx0aXRsZT5VPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3Nhcnktdic+PHRpdGxlPlY8L3RpdGxlPgorICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LXcnPjx0aXRsZT5XPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorCisgICAgPGdsb3NzZGl2IGlkPSd2YXItZ2xvc3NhcnkteCc+PHRpdGxlPlg8L3RpdGxlPgorICAgIDwvZ2xvc3NkaXY+CisKKyAgICA8Z2xvc3NkaXYgaWQ9J3Zhci1nbG9zc2FyeS15Jz48dGl0bGU+WTwvdGl0bGU+CisgICAgPC9nbG9zc2Rpdj4KKworICAgIDxnbG9zc2RpdiBpZD0ndmFyLWdsb3NzYXJ5LXonPjx0aXRsZT5aPC90aXRsZT4KKyAgICA8L2dsb3NzZGl2PgorLS0+CisKKworPC9nbG9zc2FyeT4KKzwvY2hhcHRlcj4KKzwhLS0KK3ZpbTogZXhwYW5kdGFiIHR3PTgwIHRzPTQKKy0tPgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLXN0eWxlLmNzcyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1zdHlsZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkYTJhNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC1zdHlsZS5jc3MKQEAgLTAsMCArMSw5ODQgQEAKKy8qCisgICBHZW5lcmljIFhIVE1MIC8gRG9jQm9vayBYSFRNTCBDU1MgU3R5bGVzaGVldC4KKworICAgQnJvd3NlciB3cmFuZ2xpbmcgYW5kIHR5cG9ncmFwaGljIGRlc2lnbiBieQorICAgICAgT3l2aW5kIEtvbGFzIC8gcGlwcGluQGdpbXAub3JnCisKKyAgIEN1c3RvbWlzZWQgZm9yIFBva3kgYnkKKyAgICAgIE1hdHRoZXcgQWxsdW0gLyBtYWxsdW1Aby1oYW5kLmNvbQorCisgICBUaGFua3MgdG86CisgICAgIExpYW0gUi4gRS4gUXVpbgorICAgICBXaWxsaWFtIFNrYWdncworICAgICBKYWt1YiBTdGVpbmVyCisKKyAgIFN0cnVjdHVyZQorICAgLS0tLS0tLS0tCisKKyAgIFRoZSBzdHlsZXNoZWV0IGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgorCisgICAgICAgUG9zaXRpb25pbmcKKyAgICAgICAgICBNYXJnaW5zLCBwYWRkaW5ncywgd2lkdGgsIGZvbnQtc2l6ZSwgY2xlYXJpbmcuCisgICAgICAgRGVjb3JhdGlvbnMKKyAgICAgICAgICBCb3JkZXJzLCBzdHlsZQorICAgICAgIENvbG9ycworICAgICAgICAgIENvbG9ycworICAgICAgIEdyYXBoaWNzCisgICAgICAgICAgR3JhcGhpY2FsIGJhY2tncm91bmRzCisgICAgICAgTmFzdHkgSUUgdHdlYWtzCisgICAgICAgICAgV29ya2Fyb3VuZHMgbmVlZGVkIHRvIG1ha2UgaXQgd29yayBpbiBpbnRlcm5ldCBleHBsb3JlciwKKyAgICAgICAgICBjdXJyZW50bHkgbWFrZXMgdGhlIHN0eWxlc2hlZXQgbm9uIHZhbGlkYXRpbmcsIGJ1dCB1cCB1bnRpbAorICAgICAgICAgIHRoaXMgcG9pbnQgaXQgaXMgdmFsaWRhdGluZy4KKyAgICAgICBNb3ppbGxhIGV4dGVuc2lvbnMKKyAgICAgICAgICBUcmFuc3BhcmVuY3kgZm9yIGZvb3RlcgorCSAgUm91bmRlZCBjb3JuZXJzIG9uIGJveGVzCisKKyovCisKKworICAvKioqKioqKioqKioqKioqIC8KKyAvICBQb3NpdGlvbmluZyAgIC8KKy8gKioqKioqKioqKioqKioqLworCitib2R5IHsKKyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIFNhbnMsIHNhbnMtc2VyaWY7CisKKyAgbWluLXdpZHRoOiA2NDBweDsKKyAgd2lkdGg6IDgwJTsKKyAgbWFyZ2luOiAgMGVtIGF1dG87CisgIHBhZGRpbmc6IDJlbSA1ZW0gNWVtIDVlbTsKKyAgY29sb3I6ICMzMzM7Cit9CisKK2gxLGgyLGgzLGg0LGg1LGg2LGg3IHsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBTYW5zOworICBjb2xvcjogIzAwNTU3RDsKKyAgY2xlYXI6IGJvdGg7Cit9CisKK2gxIHsKKyAgZm9udC1zaXplOiAyZW07CisgIHRleHQtYWxpZ246IGxlZnQ7CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKKyAgbWFyZ2luOiAyZW0gMGVtIDBlbSAwZW07Cit9CisKK2gyLnN1YnRpdGxlIHsKKyAgbWFyZ2luOiAwLjEwZW0gMGVtIDMuMGVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworICBmb250LXNpemU6IDEuOGVtOworICBwYWRkaW5nLWxlZnQ6IDIwJTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorCitoMiB7CisgIG1hcmdpbjogMmVtIDBlbSAwLjY2ZW0gMGVtOworICBwYWRkaW5nOiAwLjVlbSAwZW0gMGVtIDBlbTsKKyAgZm9udC1zaXplOiAxLjVlbTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2gzLnN1YnRpdGxlIHsKKyAgbWFyZ2luOiAwZW0gMGVtIDFlbSAwZW07CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKKyAgZm9udC1zaXplOiAxNDIuMTQlOworICB0ZXh0LWFsaWduOiByaWdodDsKK30KKworaDMgeworICBtYXJnaW46IDFlbSAwZW0gMC41ZW0gMGVtOworICBwYWRkaW5nOiAxZW0gMGVtIDBlbSAwZW07CisgIGZvbnQtc2l6ZTogMTQwJTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2g0IHsKKyAgbWFyZ2luOiAxZW0gMGVtIDAuNWVtIDBlbTsKKyAgcGFkZGluZzogMWVtIDBlbSAwZW0gMGVtOworICBmb250LXNpemU6IDEyMCU7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitoNSB7CisgIG1hcmdpbjogMWVtIDBlbSAwLjVlbSAwZW07CisgIHBhZGRpbmc6IDFlbSAwZW0gMGVtIDBlbTsKKyAgZm9udC1zaXplOiAxMTAlOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworaDYgeworICBtYXJnaW46IDFlbSAwZW0gMGVtIDBlbTsKKyAgcGFkZGluZzogMWVtIDBlbSAwZW0gMGVtOworICBmb250LXNpemU6IDExMCU7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisuYXV0aG9yZ3JvdXAgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKKyAgcGFkZGluZy10b3A6IDI1NnB4OworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImZpZ3VyZXMvYml0YmFrZS10aXRsZS5wbmciKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCB0b3A7CisgIG1hcmdpbi10b3A6IC0yNTZweDsKKyAgcGFkZGluZy1yaWdodDogNTBweDsKKyAgbWFyZ2luLWxlZnQ6IDBweDsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHdpZHRoOiA3NDBweDsKK30KKworaDMuYXV0aG9yIHsKKyAgbWFyZ2luOiAwZW0gMG1lIDBlbSAwZW07CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgZm9udC1zaXplOiAxMDAlOworICBjb2xvcjogIzMzMzsKKyAgY2xlYXI6IGJvdGg7Cit9CisKKy5hdXRob3IgdHQuZW1haWwgeworICBmb250LXNpemU6IDY2JTsKK30KKworLnRpdGxlcGFnZSBociB7CisgIHdpZHRoOiAwZW07CisgIGNsZWFyOiBib3RoOworfQorCisucmV2aGlzdG9yeSB7CisgIHBhZGRpbmctdG9wOiAyZW07CisgIGNsZWFyOiBib3RoOworfQorCisudG9jLAorLmxpc3Qtb2YtdGFibGVzLAorLmxpc3Qtb2YtZXhhbXBsZXMsCisubGlzdC1vZi1maWd1cmVzIHsKKyAgcGFkZGluZzogMS4zM2VtIDBlbSAyLjVlbSAwZW07CisgIGNvbG9yOiAjMDA1NTdEOworfQorCisudG9jIHAsCisubGlzdC1vZi10YWJsZXMgcCwKKy5saXN0LW9mLWZpZ3VyZXMgcCwKKy5saXN0LW9mLWV4YW1wbGVzIHAgeworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAwZW07CisgIHBhZGRpbmc6IDBlbSAwZW0gMC4zZW07CisgIG1hcmdpbjogMS41ZW0gMGVtIDBlbSAwZW07Cit9CisKKy50b2MgcCBiLAorLmxpc3Qtb2YtdGFibGVzIHAgYiwKKy5saXN0LW9mLWZpZ3VyZXMgcCBiLAorLmxpc3Qtb2YtZXhhbXBsZXMgcCBieworICBmb250LXNpemU6IDEwMC4wJTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKy50b2MgZGwsCisubGlzdC1vZi10YWJsZXMgZGwsCisubGlzdC1vZi1maWd1cmVzIGRsLAorLmxpc3Qtb2YtZXhhbXBsZXMgZGwgeworICBtYXJnaW46IDBlbSAwZW0gMC41ZW0gMGVtOworICBwYWRkaW5nOiAwZW0gMGVtIDBlbSAwZW07Cit9CisKKy50b2MgZHQgeworICBtYXJnaW46IDBlbSAwZW0gMGVtIDBlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworfQorCisudG9jIGRkIHsKKyAgbWFyZ2luOiAwZW0gMGVtIDBlbSAyLjZlbTsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworfQorCitkaXYuZ2xvc3NhcnkgZGwsCitkaXYudmFyaWFibGVsaXN0IGRsIHsKK30KKworLmdsb3NzYXJ5IGRsIGR0LAorLnZhcmlhYmxlbGlzdCBkbCBkdCwKKy52YXJpYWJsZWxpc3QgZGwgZHQgc3Bhbi50ZXJtIHsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgd2lkdGg6IDIwZW07CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCisudmFyaWFibGVsaXN0IGRsIGR0IHsKKyAgbWFyZ2luLXRvcDogMC41ZW07Cit9CisKKy5nbG9zc2FyeSBkbCBkZCwKKy52YXJpYWJsZWxpc3QgZGwgZGQgeworICBtYXJnaW4tdG9wOiAtMWVtOworICBtYXJnaW4tbGVmdDogMjUuNWVtOworfQorCisuZ2xvc3NhcnkgZGQgcCwKKy52YXJpYWJsZWxpc3QgZGQgcCB7CisgIG1hcmdpbi10b3A6IDBlbTsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisKK2Rpdi5jYWxsb3V0bGlzdCB0YWJsZSB0ZCB7CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKKyAgbWFyZ2luOiAwZW0gMGVtIDBlbSAwZW07Cit9CisKK2Rpdi5jYWxsb3V0bGlzdCB0YWJsZSB0ZCBwIHsKKyAgbWFyZ2luLXRvcDogMGVtOworICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKK2RpdiBwLmNvcHlyaWdodCB7CisgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKK2Rpdi5sZWdhbG5vdGljZSBwLmxlZ2Fsbm90aWNlLXRpdGxlIHsKKyAgbWFyZ2luLWJvdHRvbTogMGVtOworfQorCitwIHsKKyAgbGluZS1oZWlnaHQ6IDEuNWVtOworICBtYXJnaW4tdG9wOiAwZW07CisKK30KKworZGwgeworICBwYWRkaW5nLXRvcDogMGVtOworfQorCitociB7CisgIGJvcmRlcjogc29saWQgMXB4OworfQorCisKKy5tZWRpYW9iamVjdCwKKy5tZWRpYW9iamVjdGNvIHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCitpbWcgeworICBib3JkZXI6IG5vbmU7Cit9CisKK3VsIHsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMS41ZW07Cit9CisKK3VsIGxpIHsKKyAgcGFkZGluZzogMGVtIDBlbSAwZW0gMGVtOworfQorCit1bCBsaSBwIHsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KKwordGFibGUgeworICB3aWR0aCA6MTAwJTsKK30KKwordGggeworICBwYWRkaW5nOiAwLjI1ZW07CisgIHRleHQtYWxpZ246IGxlZnQ7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3RkIHsKKyAgcGFkZGluZzogMC4yNWVtOworICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCitwIGFbaWRdIHsKKyAgbWFyZ2luOiAwcHg7CisgIHBhZGRpbmc6IDBweDsKKyAgZGlzcGxheTogaW5saW5lOworICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOworfQorCithIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIGNvbG9yOiAjNDQ0OworfQorCitwcmUgeworICAgIG92ZXJmbG93OiBhdXRvOworfQorCithOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki8KK30KKworLyogVGhpcyBzdHlsZSBkZWZpbmVzIGhvdyB0aGUgcGVybWFsaW5rIGNoYXJhY3RlcgorICAgYXBwZWFycyBieSBpdHNlbGYgYW5kIHdoZW4gaG92ZXJlZCBvdmVyIHdpdGgKKyAgIHRoZSBtb3VzZS4gKi8KKworW2FsdD0nUGVybWFsaW5rJ10geyBjb2xvcjogI2VlZTsgfQorW2FsdD0nUGVybWFsaW5rJ106aG92ZXIgeyBjb2xvcjogYmxhY2s7IH0KKworCitkaXYuaW5mb3JtYWxmaWd1cmUsCitkaXYuaW5mb3JtYWxleGFtcGxlLAorZGl2LmluZm9ybWFsdGFibGUsCitkaXYuZmlndXJlLAorZGl2LnRhYmxlLAorZGl2LmV4YW1wbGUgeworICBtYXJnaW46IDFlbSAwZW07CisgIHBhZGRpbmc6IDFlbTsKKyAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOworfQorCisKK2Rpdi5pbmZvcm1hbGZpZ3VyZSBwLnRpdGxlIGIsCitkaXYuaW5mb3JtYWxleGFtcGxlIHAudGl0bGUgYiwKK2Rpdi5pbmZvcm1hbHRhYmxlIHAudGl0bGUgYiwKK2Rpdi5maWd1cmUgcC50aXRsZSBiLAorZGl2LmV4YW1wbGUgcC50aXRsZSBiLAorZGl2LnRhYmxlIHAudGl0bGUgYnsKKyAgICBwYWRkaW5nLXRvcDogMGVtOworICAgIG1hcmdpbi10b3A6IDBlbTsKKyAgICBmb250LXNpemU6IDEwMCU7CisgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKK30KKworLm1lZGlhb2JqZWN0IC5jYXB0aW9uLAorLm1lZGlhb2JqZWN0IC5jYXB0aW9uIHAgIHsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBmb250LXNpemU6IDgwJTsKKyAgcGFkZGluZy10b3A6IDAuNWVtOworICBwYWRkaW5nLWJvdHRvbTogMC41ZW07Cit9CisKKy5lcGlncmFwaCB7CisgIHBhZGRpbmctbGVmdDogNTUlOworICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKKy5lcGlncmFwaCBwIHsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLmVwaWdyYXBoIC5xdW90ZSB7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKy5lcGlncmFwaCAuYXR0cmlidXRpb24geworICBmb250LXN0eWxlOiBub3JtYWw7CisgIHRleHQtYWxpZ246IHJpZ2h0OworfQorCitzcGFuLmFwcGxpY2F0aW9uIHsKKyAgZm9udC1zdHlsZTogaXRhbGljOworfQorCisucHJvZ3JhbWxpc3RpbmcgeworICBmb250LWZhbWlseTogbW9ub3NwYWNlOworICBmb250LXNpemU6IDgwJTsKKyAgd2hpdGUtc3BhY2U6IHByZTsKKyAgbWFyZ2luOiAxLjMzZW0gMGVtOworICBwYWRkaW5nOiAxLjMzZW07Cit9CisKKy50aXAsCisud2FybmluZywKKy5jYXV0aW9uLAorLm5vdGUgeworICBtYXJnaW4tdG9wOiAxZW07CisgIG1hcmdpbi1ib3R0b206IDFlbTsKKworfQorCisvKiBmb3JjZSBmdWxsIHdpZHRoIG9mIHRhYmxlIHdpdGhpbiBkaXYgKi8KKy50aXAgdGFibGUsCisud2FybmluZyB0YWJsZSwKKy5jYXV0aW9uIHRhYmxlLAorLm5vdGUgdGFibGUgeworICBib3JkZXI6IG5vbmU7CisgIHdpZHRoOiAxMDAlOworfQorCisKKy50aXAgdGFibGUgdGgsCisud2FybmluZyB0YWJsZSB0aCwKKy5jYXV0aW9uIHRhYmxlIHRoLAorLm5vdGUgdGFibGUgdGggeworICBwYWRkaW5nOiAwLjhlbSAwLjBlbSAwLjBlbSAwLjBlbTsKKyAgbWFyZ2luIDogMGVtIDBlbSAwZW0gMGVtOworfQorCisudGlwIHAsCisud2FybmluZyBwLAorLmNhdXRpb24gcCwKKy5ub3RlIHAgeworICBtYXJnaW4tdG9wOiAwLjVlbTsKKyAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgIHBhZGRpbmctcmlnaHQ6IDFlbTsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KKworLmFjcm9ueW0geworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCitiLmtleWNhcCwKKy5rZXljYXAgeworICBwYWRkaW5nOiAwLjA5ZW0gMC4zZW07CisgIG1hcmdpbjogMGVtOworfQorCisuaXRlbWl6ZWRsaXN0IGxpIHsKKyAgY2xlYXI6IG5vbmU7Cit9CisKKy5maWxlbmFtZSB7CisgIGZvbnQtc2l6ZTogbWVkaXVtOworICBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlOworfQorCisKK2Rpdi5uYXZoZWFkZXIsIGRpdi5oZWFkaW5neworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDBlbTsKKyAgdG9wOiAwZW07CisgIHdpZHRoOiAxMDAlOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2RmOworICB3aWR0aDogMTAwJTsKK30KKworZGl2Lm5hdmZvb3RlciwgZGl2LmZvb3Rpbmd7CisgIHBvc2l0aW9uOiBmaXhlZDsKKyAgbGVmdDogMGVtOworICBib3R0b206IDBlbTsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKKworZGl2Lm5hdmhlYWRlciB0ZCwKK2Rpdi5uYXZmb290ZXIgdGQgeworICBmb250LXNpemU6IDY2JTsKK30KKworZGl2Lm5hdmhlYWRlciB0YWJsZSB0aCB7CisgIC8qZm9udC1mYW1pbHk6IEdlb3JnaWEsIFRpbWVzLCBzZXJpZjsqLworICAvKmZvbnQtc2l6ZTogeC1sYXJnZTsqLworICBmb250LXNpemU6IDgwJTsKK30KKworZGl2Lm5hdmhlYWRlciB0YWJsZSB7CisgIGJvcmRlci1sZWZ0OiAwZW07CisgIGJvcmRlci1yaWdodDogMGVtOworICBib3JkZXItdG9wOiAwZW07CisgIHdpZHRoOiAxMDAlOworfQorCitkaXYubmF2Zm9vdGVyIHRhYmxlIHsKKyAgYm9yZGVyLWxlZnQ6IDBlbTsKKyAgYm9yZGVyLXJpZ2h0OiAwZW07CisgIGJvcmRlci1ib3R0b206IDBlbTsKKyAgd2lkdGg6IDEwMCU7Cit9CisKK2Rpdi5uYXZoZWFkZXIgdGFibGUgdGQgYSwKK2Rpdi5uYXZmb290ZXIgdGFibGUgdGQgYSB7CisgIGNvbG9yOiAjNzc3OworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy8qIG5vcm1hbCB0ZXh0IGluIHRoZSBmb290ZXIgKi8KK2Rpdi5uYXZmb290ZXIgdGFibGUgdGQgeworICBjb2xvcjogYmxhY2s7Cit9CisKK2Rpdi5uYXZoZWFkZXIgdGFibGUgdGQgYTp2aXNpdGVkLAorZGl2Lm5hdmZvb3RlciB0YWJsZSB0ZCBhOnZpc2l0ZWQgeworICBjb2xvcjogIzQ0NDsKK30KKworCisvKiBsaW5rcyBpbiBoZWFkZXIgYW5kIGZvb3RlciAqLworZGl2Lm5hdmhlYWRlciB0YWJsZSB0ZCBhOmhvdmVyLAorZGl2Lm5hdmZvb3RlciB0YWJsZSB0ZCBhOmhvdmVyIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICBjb2xvcjogIzMzYTsKK30KKworZGl2Lm5hdmhlYWRlciBociwKK2Rpdi5uYXZmb290ZXIgaHIgeworICBkaXNwbGF5OiBub25lOworfQorCisKKy5xYW5kYXNldCB0ci5xdWVzdGlvbiB0ZCBwIHsKKyAgbWFyZ2luOiAwZW0gMGVtIDFlbSAwZW07CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKK30KKworLnFhbmRhc2V0IHRyLmFuc3dlciB0ZCBwIHsKKyAgbWFyZ2luOiAwZW0gMGVtIDFlbSAwZW07CisgIHBhZGRpbmc6IDBlbSAwZW0gMGVtIDBlbTsKK30KKy5hbnN3ZXIgdGQgeworICBwYWRkaW5nLWJvdHRvbTogMS41ZW07Cit9CisKKy5lbXBoYXNpcyB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisKKyAgLyoqKioqKioqKioqKiogLworIC8gZGVjb3JhdGlvbnMgIC8KKy8gKioqKioqKioqKioqKi8KKworLnRpdGxlcGFnZSB7Cit9CisKKy5wYXJ0IC50aXRsZSB7Cit9CisKKy5zdWJ0aXRsZSB7CisgICAgYm9yZGVyOiBub25lOworfQorCisvKgoraDEgeworICBib3JkZXI6IG5vbmU7Cit9CisKK2gyIHsKKyAgYm9yZGVyLXRvcDogc29saWQgMC4yZW07CisgIGJvcmRlci1ib3R0b206IHNvbGlkIDAuMDZlbTsKK30KKworaDMgeworICBib3JkZXItdG9wOiAwZW07CisgIGJvcmRlci1ib3R0b206IHNvbGlkIDAuMDZlbTsKK30KKworaDQgeworICBib3JkZXI6IDBlbTsKKyAgYm9yZGVyLWJvdHRvbTogc29saWQgMC4wNmVtOworfQorCitoNSB7CisgIGJvcmRlcjogMGVtOworfQorKi8KKworLnByb2dyYW1saXN0aW5nIHsKKyAgYm9yZGVyOiBzb2xpZCAxcHg7Cit9CisKK2Rpdi5maWd1cmUsCitkaXYudGFibGUsCitkaXYuaW5mb3JtYWxmaWd1cmUsCitkaXYuaW5mb3JtYWx0YWJsZSwKK2Rpdi5pbmZvcm1hbGV4YW1wbGUsCitkaXYuZXhhbXBsZSB7CisgIGJvcmRlcjogMXB4IHNvbGlkOworfQorCisKKworLnRpcCwKKy53YXJuaW5nLAorLmNhdXRpb24sCisubm90ZSB7CisgIGJvcmRlcjogMXB4IHNvbGlkOworfQorCisudGlwIHRhYmxlIHRoLAorLndhcm5pbmcgdGFibGUgdGgsCisuY2F1dGlvbiB0YWJsZSB0aCwKKy5ub3RlIHRhYmxlIHRoIHsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkOworfQorCisucXVlc3Rpb24gdGQgeworICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7Cit9CisKKy5hbnN3ZXIgeworfQorCisKK2Iua2V5Y2FwLAorLmtleWNhcCB7CisgIGJvcmRlcjogMXB4IHNvbGlkOworfQorCisKK2Rpdi5uYXZoZWFkZXIsIGRpdi5oZWFkaW5neworICBib3JkZXItYm90dG9tOiAxcHggc29saWQ7Cit9CisKKworZGl2Lm5hdmZvb3RlciwgZGl2LmZvb3Rpbmd7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZDsKK30KKworICAvKioqKioqKioqIC8KKyAvICBjb2xvcnMgIC8KKy8gKioqKioqKioqLworCitib2R5IHsKKyAgY29sb3I6ICMzMzM7CisgIGJhY2tncm91bmQ6IHdoaXRlOworfQorCithIHsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cit9CisKK2E6aG92ZXIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOworfQorCisKK2gxLAoraDIsCitoMywKK2g0LAoraDUsCitoNiwKK2g3LAoraDggeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKK30KKworaHIgeworICBib3JkZXItY29sb3I6ICNhYWE7Cit9CisKKworLnRpcCwgLndhcm5pbmcsIC5jYXV0aW9uLCAubm90ZSB7CisgIGJvcmRlci1jb2xvcjogI2ZmZjsKK30KKworCisudGlwIHRhYmxlIHRoLAorLndhcm5pbmcgdGFibGUgdGgsCisuY2F1dGlvbiB0YWJsZSB0aCwKKy5ub3RlIHRhYmxlIHRoIHsKKyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogI2ZmZjsKK30KKworCisud2FybmluZyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjI7Cit9CisKKy5jYXV0aW9uIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMjsKK30KKworLnRpcCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjI7Cit9CisKKy5ub3RlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMjsKK30KKworLmdsb3NzYXJ5IGRsIGR0LAorLnZhcmlhYmxlbGlzdCBkbCBkdCwKKy52YXJpYWJsZWxpc3QgZGwgZHQgc3Bhbi50ZXJtIHsKKyAgY29sb3I6ICMwNDQ7Cit9CisKK2Rpdi5maWd1cmUsCitkaXYudGFibGUsCitkaXYuZXhhbXBsZSwKK2Rpdi5pbmZvcm1hbGZpZ3VyZSwKK2Rpdi5pbmZvcm1hbHRhYmxlLAorZGl2LmluZm9ybWFsZXhhbXBsZSB7CisgIGJvcmRlci1jb2xvcjogI2FhYTsKK30KKworcHJlLnByb2dyYW1saXN0aW5nIHsKKyAgY29sb3I6IGJsYWNrOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworICBib3JkZXItY29sb3I6ICNhYWE7CisgIGJvcmRlci13aWR0aDogMnB4OworfQorCisuZ3VpbWVudSwKKy5ndWlsYWJlbCwKKy5ndWltZW51aXRlbSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7Cit9CisKKworYi5rZXljYXAsCisua2V5Y2FwIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKKyAgYm9yZGVyLWNvbG9yOiAjOTk5OworfQorCisKK2Rpdi5uYXZoZWFkZXIgeworICBib3JkZXItY29sb3I6IGJsYWNrOworfQorCisKK2Rpdi5uYXZmb290ZXIgeworICBib3JkZXItY29sb3I6IGJsYWNrOworfQorCisKKyAgLyoqKioqKioqKioqIC8KKyAvICBncmFwaGljcyAgLworLyAqKioqKioqKioqKi8KKworLyoKK2JvZHkgeworICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImltYWdlcy9ib2R5X2JnLmpwZyIpOworICBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGZpeGVkOworfQorCisubmF2aGVhZGVyLAorLm5vdGUsCisudGlwIHsKKyAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJpbWFnZXMvbm90ZV9iZy5qcGciKTsKKyAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDsKK30KKworLndhcm5pbmcsCisuY2F1dGlvbiB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL3dhcm5pbmdfYmcuanBnIik7CisgIGJhY2tncm91bmQtYXR0YWNobWVudDogZml4ZWQ7Cit9CisKKy5maWd1cmUsCisuaW5mb3JtYWxmaWd1cmUsCisuZXhhbXBsZSwKKy5pbmZvcm1hbGV4YW1wbGUsCisudGFibGUsCisuaW5mb3JtYWx0YWJsZSB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL2ZpZ3VyZV9iZy5qcGciKTsKKyAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDsKK30KKworKi8KK2gxLAoraDIsCitoMywKK2g0LAoraDUsCitoNiwKK2g3eworfQorCisvKgorRXhhbXBsZSBvZiBob3cgdG8gc3RpY2sgYW4gaW1hZ2UgYXMgcGFydCBvZiB0aGUgdGl0bGUuCisKK2Rpdi5hcnRpY2xlIC50aXRsZXBhZ2UgLnRpdGxlCit7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZmlndXJlcy93aGl0ZS1vbi1ibGFjay5wbmciKTsKKyAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOworICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7Cit9CisqLworCitkaXYucHJlZmFjZSAudGl0bGVwYWdlIC50aXRsZSwKK2Rpdi5jb2xvcGhvbiAudGl0bGUsCitkaXYuY2hhcHRlciAudGl0bGVwYWdlIC50aXRsZSwKK2Rpdi5hcnRpY2xlIC50aXRsZXBhZ2UgLnRpdGxlCit7Cit9CisKK2Rpdi5zZWN0aW9uIGRpdi5zZWN0aW9uIC50aXRsZXBhZ2UgLnRpdGxlLAorZGl2LnNlY3QyIC50aXRsZXBhZ2UgLnRpdGxlIHsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworfQorCisKK2gxLnRpdGxlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CisgIGhlaWdodDogMjU2cHg7CisgIHRleHQtaW5kZW50OiAtOTAwMHB4OworICBvdmVyZmxvdzpoaWRkZW47Cit9CisKK2gyLnN1YnRpdGxlIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7CisgIHRleHQtaW5kZW50OiAtOTAwMHB4OworICBvdmVyZmxvdzpoaWRkZW47CisgIHdpZHRoOiAwcHg7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvCisgLyAgcGlwcGluLmdpbXAub3JnIHNwZWNpZmljIGFsdGVyYXRpb25zICAvCisvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKK2Rpdi5oZWFkaW5nLCBkaXYubmF2aGVhZGVyIHsKKyAgY29sb3I6ICM3Nzc7CisgIGZvbnQtc2l6ZTogODAlOworICBwYWRkaW5nOiAwOworICBtYXJnaW46IDA7CisgIHRleHQtYWxpZ246IGxlZnQ7CisgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgdG9wOiAwcHg7CisgIGxlZnQ6IDBweDsKKyAgd2lkdGg6IDEwMCU7CisgIGhlaWdodDogNTBweDsKKyAgYmFja2dyb3VuZDogdXJsKCcvZ2Z4L2hlYWRpbmdfYmcucG5nJykgdHJhbnNwYXJlbnQ7CisgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKKyAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBmaXhlZDsKKyAgYm9yZGVyOiBub25lOworfQorCitkaXYuaGVhZGluZyBhIHsKKyAgY29sb3I6ICM0NDQ7Cit9CisKK2Rpdi5mb290aW5nLCBkaXYubmF2Zm9vdGVyIHsKKyAgYm9yZGVyOiBub25lOworICBjb2xvcjogI2RkZDsKKyAgZm9udC1zaXplOiA4MCU7CisgIHRleHQtYWxpZ246cmlnaHQ7CisKKyAgd2lkdGg6IDEwMCU7CisgIHBhZGRpbmctdG9wOiAxMHB4OworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGJvdHRvbTogMHB4OworICBsZWZ0OiAwcHg7CisKKyAgYmFja2dyb3VuZDogdXJsKCcvZ2Z4L2Zvb3RpbmdfYmcucG5nJykgdHJhbnNwYXJlbnQ7Cit9CisqLworCisKKworICAvKioqKioqKioqKioqKioqKioqIC8KKyAvICBuYXN0eSBpZSB0d2Vha3MgIC8KKy8gKioqKioqKioqKioqKioqKioqLworCisvKgorZGl2LmhlYWRpbmcsIGRpdi5uYXZoZWFkZXIgeworICB3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggKyAicHgiKTsKK30KKworZGl2LmZvb3RpbmcsIGRpdi5uYXZmb290ZXIgeworICB3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggKyAicHgiKTsKKyAgbWFyZ2luLWxlZnQ6ZXhwcmVzc2lvbigiLTVlbSIpOworfQorYm9keSB7CisgIHBhZGRpbmc6ZXhwcmVzc2lvbigiNGVtIDVlbSAwZW0gNWVtIik7Cit9CisqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8KKyAvIG1vemlsbGEgdmVuZG9yIHNwZWNpZmljIGNzcyBleHRlbnNpb25zICAvCisvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorZGl2Lm5hdmZvb3RlciwgZGl2LmZvb3Rpbmd7CisgIC1tb3otb3BhY2l0eTogMC44ZW07Cit9CisKK2Rpdi5maWd1cmUsCitkaXYudGFibGUsCitkaXYuaW5mb3JtYWxmaWd1cmUsCitkaXYuaW5mb3JtYWx0YWJsZSwKK2Rpdi5pbmZvcm1hbGV4YW1wbGUsCitkaXYuZXhhbXBsZSwKKy50aXAsCisud2FybmluZywKKy5jYXV0aW9uLAorLm5vdGUgeworICAtbW96LWJvcmRlci1yYWRpdXM6IDAuNWVtOworfQorCitiLmtleWNhcCwKKy5rZXljYXAgeworICAtbW96LWJvcmRlci1yYWRpdXM6IDAuM2VtOworfQorKi8KKwordGFibGUgdHIgdGQgdGFibGUgdHIgdGQgeworICBkaXNwbGF5OiBub25lOworfQorCisKK2hyIHsKKyAgZGlzcGxheTogbm9uZTsKK30KKwordGFibGUgeworICBib3JkZXI6IDBlbTsKK30KKworIC5waG90byB7CisgIGZsb2F0OiByaWdodDsKKyAgbWFyZ2luLWxlZnQ6ICAgMS41ZW07CisgIG1hcmdpbi1ib3R0b206IDEuNWVtOworICBtYXJnaW4tdG9wOiAwZW07CisgIG1heC13aWR0aDogICAgICAxN2VtOworICBib3JkZXI6ICAgICAxcHggc29saWQgZ3JheTsKKyAgcGFkZGluZzogICAgM3B4OworICBiYWNrZ3JvdW5kOiB3aGl0ZTsKK30KKyAuc2VwZXJhdG9yIHsKKyAgIHBhZGRpbmctdG9wOiAyZW07CisgICBjbGVhcjogYm90aDsKKyAgfQorCisgICN2YWxpZGF0b3JzIHsKKyAgICAgIG1hcmdpbi10b3A6IDVlbTsKKyAgICAgIHRleHQtYWxpZ246IHJpZ2h0OworICAgICAgY29sb3I6ICM3Nzc7CisgIH0KKyAgQG1lZGlhIHByaW50IHsKKyAgICAgIGJvZHkgeworICAgICAgICAgIGZvbnQtc2l6ZTogOHB0OworICAgICAgfQorICAgICAgLm5vcHJpbnQgeworICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CisgICAgICB9CisgIH0KKworCisudGlwLAorLm5vdGUgeworICAgYmFja2dyb3VuZDogI2YwZjBmMjsKKyAgIGNvbG9yOiAjMzMzOworICAgcGFkZGluZzogMjBweDsKKyAgIG1hcmdpbjogMjBweDsKK30KKworLnRpcCBoMywKKy5ub3RlIGgzIHsKKyAgIHBhZGRpbmc6IDBlbTsKKyAgIG1hcmdpbjogMGVtOworICAgZm9udC1zaXplOiAyZW07CisgICBmb250LXdlaWdodDogYm9sZDsKKyAgIGNvbG9yOiAjMzMzOworfQorCisudGlwIGEsCisubm90ZSBhIHsKKyAgIGNvbG9yOiAjMzMzOworICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKKy5mb290bm90ZSB7CisgICBmb250LXNpemU6IHNtYWxsOworICAgY29sb3I6ICMzMzM7Cit9CisKKy8qIENoYW5nZXMgdGhlIGFubm91bmNlbWVudCB0ZXh0ICovCisudGlwIGgzLAorLndhcm5pbmcgaDMsCisuY2F1dGlvbiBoMywKKy5ub3RlIGgzIHsKKyAgIGZvbnQtc2l6ZTpsYXJnZTsKKyAgIGNvbG9yOiAjMDA1NTdEOworfQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9iaXRiYWtlLXVzZXItbWFudWFsLnhtbCBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmZjkzMwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvYml0YmFrZS11c2VyLW1hbnVhbC54bWwKQEAgLTAsMCArMSw4OCBAQAorPCFET0NUWVBFIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjIvL0VOIgorImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4yL2RvY2Jvb2t4LmR0ZCI+CisKKzxib29rIGlkPSdiaXRiYWtlLXVzZXItbWFudWFsJyBsYW5nPSdlbicKKyAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvWEluY2x1ZGUiCisgICAgICAgIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgPgorICAgIDxib29raW5mbz4KKworICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSdmaWd1cmVzL2JpdGJha2UtdGl0bGUucG5nJworICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9J1NWRycKKyAgICAgICAgICAgICAgICAgICAgYWxpZ249J2xlZnQnIHNjYWxlZml0PScxJyB3aWR0aD0nMTAwJScvPgorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKworICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICBCaXRCYWtlIFVzZXIgTWFudWFsCisgICAgICAgIDwvdGl0bGU+CisKKyAgICAgICAgPGF1dGhvcmdyb3VwPgorICAgICAgICAgICAgPGF1dGhvcj4KKyAgICAgICAgICAgICAgICA8Zmlyc3RuYW1lPlJpY2hhcmQgUHVyZGllLCBDaHJpcyBMYXJzb24sIGFuZCA8L2ZpcnN0bmFtZT4gPHN1cm5hbWU+UGhpbCBCbHVuZGVsbDwvc3VybmFtZT4KKyAgICAgICAgICAgICAgICA8YWZmaWxpYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxvcmduYW1lPkJpdEJha2UgQ29tbXVuaXR5PC9vcmduYW1lPgorICAgICAgICAgICAgICAgIDwvYWZmaWxpYXRpb24+CisgICAgICAgICAgICAgICAgPGVtYWlsPmJpdGJha2UtZGV2ZWxAbGlzdHMub3BlbmVtYmVkZGVkLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8L2F1dGhvcj4KKyAgICAgICAgPC9hdXRob3Jncm91cD4KKworPCEtLQorIyBBZGQgaW4gc29tZSByZXZpc2lvbiBoaXN0b3J5IGlmIHdlIHdhbnQgaXQgaGVyZS4KKyAgICAgICAgPHJldmhpc3Rvcnk+CisgICAgICAgICAgICA8cmV2aXNpb24+CisgICAgICAgICAgICAgICAgPHJldm51bWJlcj54Lng8L3Jldm51bWJlcj4KKyAgICAgICAgICAgICAgICA8ZGF0ZT5kZCBtb250aCB5ZWFyPC9kYXRlPgorICAgICAgICAgICAgICAgIDxyZXZyZW1hcms+U29tZSByZWxldmVudCBjb21tZW50PC9yZXZyZW1hcms+CisgICAgICAgICAgICA8L3JldmlzaW9uPgorICAgICAgICAgICAgPHJldmlzaW9uPgorICAgICAgICAgICAgICAgIDxyZXZudW1iZXI+eC54PC9yZXZudW1iZXI+CisgICAgICAgICAgICAgICAgPGRhdGU+ZGQgbW9udGggeWVhcjwvZGF0ZT4KKyAgICAgICAgICAgICAgICA8cmV2cmVtYXJrPlNvbWUgcmVsZXZlbnQgY29tbWVudDwvcmV2cmVtYXJrPgorICAgICAgICAgICAgPC9yZXZpc2lvbj4KKyAgICAgICAgICAgIDxyZXZpc2lvbj4KKyAgICAgICAgICAgICAgICA8cmV2bnVtYmVyPngueDwvcmV2bnVtYmVyPgorICAgICAgICAgICAgICAgIDxkYXRlPmRkIG1vbnRoIHllYXI8L2RhdGU+CisgICAgICAgICAgICAgICAgPHJldnJlbWFyaz5Tb21lIHJlbGV2ZW50IGNvbW1lbnQ8L3JldnJlbWFyaz4KKyAgICAgICAgICAgIDwvcmV2aXNpb24+CisgICAgICAgICAgICA8cmV2aXNpb24+CisgICAgICAgICAgICAgICAgPHJldm51bWJlcj54Lng8L3Jldm51bWJlcj4KKyAgICAgICAgICAgICAgICA8ZGF0ZT5kZCBtb250aCB5ZWFyPC9kYXRlPgorICAgICAgICAgICAgICAgIDxyZXZyZW1hcms+U29tZSByZWxldmVudCBjb21tZW50PC9yZXZyZW1hcms+CisgICAgICAgICAgICA8L3JldmlzaW9uPgorICAgICAgIDwvcmV2aGlzdG9yeT4KKy0tPgorCisgICAgICAgIDxjb3B5cmlnaHQ+CisgICAgICAgICAgICA8eWVhcj4yMDA0LTIwMTU8L3llYXI+CisgICAgICAgICAgICA8aG9sZGVyPlJpY2hhcmQgUHVyZGllPC9ob2xkZXI+CisgICAgICAgICAgICA8aG9sZGVyPkNocmlzIExhcnNvbjwvaG9sZGVyPgorICAgICAgICAgICAgPGhvbGRlcj5hbmQgUGhpbCBCbHVuZGVsbDwvaG9sZGVyPgorICAgICAgICA8L2NvcHlyaWdodD4KKworICAgICAgICA8bGVnYWxub3RpY2U+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTGljZW5zZS4KKyAgICAgICAgICAgICAgICBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0CisgICAgICAgICAgICAgICAgPHVsaW5rIHVybD0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LzwvdWxpbms+CisgICAgICAgICAgICAgICAgb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCA0NDQgQ2FzdHJvIFN0cmVldCwKKyAgICAgICAgICAgICAgICBTdWl0ZSA5MDAsIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgOTQwNDEsIFVTQS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9sZWdhbG5vdGljZT4KKyAgICA8L2Jvb2tpbmZvPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYml0YmFrZS11c2VyLW1hbnVhbC1pbnRyby54bWwiLz4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImJpdGJha2UtdXNlci1tYW51YWwtZXhlY3V0aW9uLnhtbCIvPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYml0YmFrZS11c2VyLW1hbnVhbC1tZXRhZGF0YS54bWwiLz4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImJpdGJha2UtdXNlci1tYW51YWwtZmV0Y2hpbmcueG1sIi8+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJiaXRiYWtlLXVzZXItbWFudWFsLXJlZi12YXJpYWJsZXMueG1sIi8+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJiaXRiYWtlLXVzZXItbWFudWFsLWhlbGxvLnhtbCIvPgorCis8L2Jvb2s+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2ZpZ3VyZXMvYml0YmFrZS10aXRsZS5wbmcgYi9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2ZpZ3VyZXMvYml0YmFrZS10aXRsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyOTAxNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL2JpdGJha2UtdXNlci1tYW51YWwvZmlndXJlcy9iaXRiYWtlLXRpdGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy9iaXRiYWtlLXVzZXItbWFudWFsL2h0bWwuY3NzIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9odG1sLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVkZmQzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS11c2VyLW1hbnVhbC9odG1sLmNzcwpAQCAtMCwwICsxLDI4MSBAQAorLyogRmV1aWxsZSBkZSBzdHlsZSBEb2NCb29rIGR1IHByb2pldCBUcmFkdWMub3JnICAgICAgICAgICAgICAgICovCisvKiBEb2NCb29rIENTUyBzdHlsZXNoZWV0IG9mIHRoZSBUcmFkdWMub3JnIHByb2plY3QgICAgICAgICAgICAgKi8KKworLyogKGMpIEplYW4tUGhpbGlwcGUgR3XpcmFyZCAtIDE0IGFv+3QgMjAwNCAgICAgICAgICAgICAgICAgICAgICovCisvKiAoYykgSmVhbi1QaGlsaXBwZSBHdelyYXJkIC0gMTQgQXVndXN0IDIwMDQgICAgICAgICAgICAgICAgICAgKi8KKworLyogQ2V0dGUgZmV1aWxsZSBkZSBzdHlsZSBlc3QgbGlicmUsIHZvdXMgcG91dmV6IGxhICAgICAgICAgICAgICovCisvKiByZWRpc3RyaWJ1ZXIgZXQgbGEgbW9kaWZpZXIgc2Vsb24gbGVzIHRlcm1lcyBkZSBsYSBMaWNlbmNlICAgKi8KKy8qIEFydCBMaWJyZS4gVm91cyB0cm91dmVyZXogdW4gZXhlbXBsYWlyZSBkZSBjZXR0ZSBMaWNlbmNlIHN1ciAqLworLyogaHR0cDovL3RpZ3JlcmF5ZS5vcmcvUGV0aXQtZ3VpZGUtZHUtdHJhZHVjdGV1ci5odG1sI2xpY2VuY2UtYXJ0LWxpYnJlICovCisKKy8qIFRoaXMgd29yayBvZiBhcnQgaXMgZnJlZSwgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAqLworLyogbW9kaWZ5IGl0IGFjY29yZGluZyB0byB0ZXJtcyBvZiB0aGUgRnJlZSBBcnQgbGljZW5zZS4gWW91ICAgICovCisvKiB3aWxsIGZpbmQgYSBzcGVjaW1lbiBvZiB0aGlzIGxpY2Vuc2Ugb24gdGhlIENvcHlsZWZ0ICAgICAgICAgKi8KKy8qIEF0dGl0dWRlIHdlYiBzaXRlOiBodHRwOi8vYXJ0bGlicmUub3JnIGFzIHdlbGwgYXMgb24gb3RoZXIgICAqLworLyogc2l0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBGcmVuY2ggdmVyc2lvbiBvZiB0aGlzIGxpY2VuY2UgYXMgc2hvd24gKi8KKy8qIG9uIGh0dHA6Ly90aWdyZXJheWUub3JnL1BldGl0LWd1aWRlLWR1LXRyYWR1Y3RldXIuaHRtbCNsaWNlbmNlLWFydC1saWJyZSAqLworLyogaXMgb25seSBvZmZpY2lhbCBsaWNlbmNlIG9mIHRoaXMgZG9jdW1lbnQuIFRoZSBFbmdsaXNoICAgICAgICovCisvKiBpcyBvbmx5IHByb3ZpZGVkIHRvIGhlbHAgeW91IHVuZGVyc3RhbmQgdGhpcyBsaWNlbmNlLiAgICAgICAgKi8KKworLyogTGEgZGVybmnocmUgdmVyc2lvbiBkZSBjZXR0ZSBmZXVpbGxlIGRlIHN0eWxlIGVzdCB0b3Vqb3VycyAgICovCisvKiBkaXNwb25pYmxlIHN1cqA6IGh0dHA6Ly90aWdyZXJheWUub3JnL3N0eWxlLmNzcyAgICAgICAgICAgICAgKi8KKy8qIEVsbGUgZXN0IOlnYWxlbWVudCBkaXNwb25pYmxlIHN1cqA6ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogaHR0cDovL3d3dy50cmFkdWMub3JnL2RvY3MvSE9XVE8vbGVjdHVyZS9zdHlsZS5jc3MgICAgICAgICAgICovCisKKy8qIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHN0eWxlc2hlZXQgaXMgYXZhaWxhYmxlIGZyb206ICAgICAqLworLyogaHR0cDovL3RpZ3JlcmF5ZS5vcmcvc3R5bGUuY3NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSBvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGh0dHA6Ly93d3cudHJhZHVjLm9yZy9kb2NzL0hPV1RPL2xlY3R1cmUvc3R5bGUuY3NzICAgICAgICAgICAqLworCisvKiBOJ2jpc2l0ZXogcGFzIOAgZW52b3llciB2b3MgY29tbWVudGFpcmVzIGV0IGNvcnJlY3Rpb25zIOAgICAgKi8KKy8qIEplYW4tUGhpbGlwcGUgR3XpcmFyZCA8amVhbi1waGlsaXBwZS5ndWVyYXJkQHRpZ3JlcmF5ZS5vcmc+ICAqLworCisvKiBQbGVhc2Ugc2VuZCBmZWVkYmFjayBhbmQgYnVnIHJlcG9ydHMgdG8gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEplYW4tUGhpbGlwcGUgR3XpcmFyZCA8amVhbi1waGlsaXBwZS5ndWVyYXJkQHRpZ3JlcmF5ZS5vcmc+ICAqLworCisvKiAkSWQ6IHN0eWxlLmNzcyx2IDEuMTQgMjAwNC8wOS8xMCAyMDoxMjowOSBmZXZyaWVyIEV4cCBmZXZyaWVyICQgKi8KKworLyogUHLpc2VudGF0aW9uIGfpbulyYWxlIGR1IGRvY3VtZW50ICovCisvKiBPdmVyYWxsIGRvY3VtZW50IHByZXNlbnRhdGlvbiAqLworCitib2R5IHsKKyAgICAvKgorICAgIGZvbnQtZmFtaWx5OiBBcG9sbGluZSwgIlVSVyBQYWxsYWRpbyBMIiwgR2FyYW1vbmQsIGpHYXJhbW9uZCwKKyAgICAgICAgICAgICAgICAgIkJpdHN0cmVhbSBDeWJlcmJpdCIsICJQYWxhdGlubyBMaW5vdHlwZSIsIHNlcmlmOworICAgICAqLworICAgIG1hcmdpbjogNyU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Cit9CisKKy8qIFRhaWxsZSBkdSB0ZXh0ZSAqLworLyogVGV4dCBzaXplICovCisKKyogeyBmb250LXNpemU6IDEwMCU7IH0KKworLyogR2VzdGlvbiBkZXMgdGV4dGVzIG1pcyBlbiByZWxpZWYgaW1icmlxdelzICovCisvKiBFbWJlZGRlZCBlbXBoYXNpcyAqLworCitlbSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQorZW0gZW0geyBmb250LXN0eWxlOiBub3JtYWw7IH0KK2VtIGVtIGVtIHsgZm9udC1zdHlsZTogaXRhbGljOyB9CisKKy8qIFRpdHJlcyAqLworLyogVGl0bGVzICovCisKK2gxIHsgZm9udC1zaXplOiAyMDAlOyBmb250LXdlaWdodDogOTAwOyB9CitoMiB7IGZvbnQtc2l6ZTogMTYwJTsgZm9udC13ZWlnaHQ6IDkwMDsgfQoraDMgeyBmb250LXNpemU6IDEzMCU7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CitoNCB7IGZvbnQtc2l6ZTogMTE1JTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KK2g1IHsgZm9udC1zaXplOiAxMDglOyBmb250LXdlaWdodDogYm9sZDsgfQoraDYgeyAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9CisKKy8qIE5vbSBkZSBmYW1pbGxlIGVuIHBldGl0ZXMgbWFqdXNjdWxlcyAodW5pcXVlbWVudCBlbiBmcmFu52FpcykgKi8KKy8qIExhc3QgbmFtZXMgaW4gc21hbGwgY2FwcyAoZm9yIEZyZW5jaCBvbmx5KSAqLworCisqW2NsYXNzfj0ic3VybmFtZSJdOmxhbmcoZnIpIHsgZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOyB9CisKKy8qIEJsb2NzIGRlIGNpdGF0aW9uICovCisvKiBRdW90YXRpb24gYmxvY3MgKi8KKworZGl2W2NsYXNzfj0iYmxvY2txdW90ZSJdIHsKKyAgYm9yZGVyOiBzb2xpZCAycHggI0FBQTsKKyAgcGFkZGluZzogNXB4OworICBtYXJnaW46IDVweDsKK30KKworZGl2W2NsYXNzfj0iYmxvY2txdW90ZSJdID4gdGFibGUgeworICBib3JkZXI6IG5vbmU7Cit9CisKKy8qIEJsb2NzIGxpdOlyYXV4oDogZm9uZCBncmlzIGNsYWlyICovCisvKiBMaXRlcmFsIGJsb2NzOiBsaWdodCBncmF5IGJhY2tncm91bmQgKi8KKworKltjbGFzc349ImxpdGVyYWxsYXlvdXQiXSB7CisgIGJhY2tncm91bmQ6ICNmMGYwZjA7CisgIHBhZGRpbmc6IDVweDsKKyAgbWFyZ2luOiA1cHg7Cit9CisKKy8qIFByb2dyYW1tZXMgZXQgY2FwdHVyZXMgdGV4dGWgOiBmb25kIGJsZXUgY2xhaXIgKi8KKy8qIExpc3RpbmcgYW5kIHRleHQgc2NyZWVuIHNuYXBzaG90czogbGlnaHQgYmx1ZSBiYWNrZ3JvdW5kICovCisKKypbY2xhc3N+PSJwcm9ncmFtbGlzdGluZyJdLCAqW2NsYXNzfj0ic2NyZWVuIl0geworICBiYWNrZ3JvdW5kOiAjZjBmMGZmOworICBwYWRkaW5nOiA1cHg7CisgIG1hcmdpbjogNXB4OworfQorCisvKiBMZXMgdGV4dGVzIOAgcmVtcGxhY2VyIHNvbnQgc3VybGlnbulzIGVuIHZlcnQgcOJsZSAqLworLyogUmVwbGFjZWFibGUgdGV4dCBpbiBoaWdobGlnaHRlZCBpbiBwYWxlIGdyZWVuICovCisKKypbY2xhc3N+PSJyZXBsYWNlYWJsZSJdIHsgCisgICAgYmFja2dyb3VuZC1jb2xvcjogIzk4ZmI5ODsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7IH0KKworLyogVGFibGVzoDogZm9uZHMgZ3JpcyBjbGFpciAmIGJvcmRzIHNpbXBsZXMgKi8KKy8qIFRhYmxlczogbGlnaHQgZ3JheSBiYWNrZ3JvdW5kIGFuZCBzb2xpZCBib3JkZXJzICovCisKKypbY2xhc3N+PSJ0YWJsZSJdICpbY2xhc3N+PSJ0aXRsZSJdIHsgd2lkdGg6MTAwJTsgYm9yZGVyOiAwcHg7IH0KKwordGFibGUgeworICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7CisgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgICBwYWRkaW5nOiAycHg7CisgICAgbWFyZ2luOiA1cHg7Cit9CisKKy8qIExpc3RlcyBzaW1wbGVzIGVuIHN0eWxlIHRhYmxlICovCisvKiBTaW1wbGVzIGxpc3RzIGluIHRhYmxlIHByZXNlbnRhdGlvbiAqLworCit0YWJsZVtjbGFzc349InNpbXBsZWxpc3QiXSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsKKyAgICBtYXJnaW46IDVweDsKKyAgICBib3JkZXI6IHNvbGlkIDFweCAjQUFBOworfQorCit0YWJsZVtjbGFzc349InNpbXBsZWxpc3QiXSB0ZCB7CisgICAgYm9yZGVyOiBzb2xpZCAxcHggI0FBQTsKK30KKworLyogTGVzIHRhYmxlcyAqLworLyogVGFibGVzICovCisKKypbY2xhc3N+PSJ0YWJsZSJdIHRhYmxlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOworICAgIGJvcmRlcjogc29saWQgMXB4ICNBQUE7Cit9CisqW2NsYXNzfj0iaW5mb3JtYWx0YWJsZSJdIHRhYmxlIHsgYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMDsgfQorCit0aCx0ZCB7CisgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgcGFkZGluZzogMC4xZW0gMC4zZW07CisgICAgZW1wdHktY2VsbHM6IHNob3c7IAorfQorCisvKiBBbGlnbmVtZW50IGRlcyBjb2xvbm5lcyAqLworLyogQ29sdW5tcyBhbGlnbm1lbnQgKi8KKwordGRbYWxpZ249Y2VudGVyXSAsICB0aFthbGlnbj1jZW50ZXJdICB7IHRleHQtYWxpZ246IGNlbnRlcjsgfQordGRbYWxpZ249cmlnaHRdICwgICB0aFthbGlnbj1yaWdodF0gICB7IHRleHQtYWxpZ246IHJpZ2h0OyB9Cit0ZFthbGlnbj1sZWZ0XSAsICAgIHRoW2FsaWduPWxlZnRdICAgIHsgdGV4dC1hbGlnbjogbGVmdDsgfQordGRbYWxpZ249anVzdGlmeV0gLCB0aFthbGlnbj1qdXN0aWZ5XSB7IHRleHQtYWxpZ246IGp1c3RpZnk7IH0KKworLyogUGFzIGRlIG1hcmdlIGF1dG91ciBkZXMgaW1hZ2VzICovCisvKiBObyBpbnNpZGUgbWFyZ2lucyBmb3IgaW1hZ2VzICovCisKK2ltZyB7IGJvcmRlcjogMDsgfQorCisvKiBMZXMgbGllbnMgbmUgc29udCBwYXMgc291bGlnbulzICovCisvKiBObyB1bmRlcmxpbmVzIGZvciBsaW5rcyAqLworCis6bGluayAsIDp2aXNpdGVkICwgOmFjdGl2ZSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQorCisvKiBQcnVkZW5jZaA6IGNhZHJlIGphdW5lIGV0IGZvbmQgamF1bmUgY2xhaXIgKi8KKy8qIENhdXRpb246IHllbGxvdyBib3JkZXIgYW5kIGxpZ2h0IHllbGxvdyBiYWNrZ3JvdW5kICovCisKKypbY2xhc3N+PSJjYXV0aW9uIl0geworICAgIGJvcmRlcjogc29saWQgMnB4IHllbGxvdzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOworICAgIHBhZGRpbmc6IDFlbSA2cHggMWVtIDsKKyAgICBtYXJnaW46IDVweDsKK30KKworKltjbGFzc349ImNhdXRpb24iXSB0aCB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZQorfQorCisqW2NsYXNzfj0iY2F1dGlvbiJdIHRhYmxlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOworICAgIGJvcmRlcjogbm9uZTsKK30KKworLyogTm90ZSBpbXBvcnRhbnRloDogY2FkcmUgamF1bmUgZXQgZm9uZCBqYXVuZSBjbGFpciAqLworLyogSW1wb3J0YW50OiB5ZWxsb3cgYm9yZGVyIGFuZCBsaWdodCB5ZWxsb3cgYmFja2dyb3VuZCAqLworCisqW2NsYXNzfj0iaW1wb3J0YW50Il0geworICAgIGJvcmRlcjogc29saWQgMnB4IHllbGxvdzsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOworICAgIHBhZGRpbmc6IDFlbSA2cHggMWVtOworICAgIG1hcmdpbjogNXB4OworfQorCisqW2NsYXNzfj0iaW1wb3J0YW50Il0gdGggeworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGUKK30KKworKltjbGFzc349ImltcG9ydGFudCJdIHRhYmxlICB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZlMDsKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKy8qIE1pc2UgZW4g6XZpZGVuY2WgOiB0ZXh0ZSBs6WfocmVtZW50IHBsdXMgZ3JhbmQgKi8KKy8qIEhpZ2hsaWdodHM6IHNsaWdodGx5IGxhcmdlciB0ZXh0cyAqLworCisqW2NsYXNzfj0iaGlnaGxpZ2h0cyJdIHsKKyAgICBmb250LXNpemU6ICAxMTAlOworfQorCisvKiBOb3RloDogY2FkcmUgYmxldSBldCBmb25kIGJsZXUgY2xhaXIgKi8KKy8qIE5vdGVzOiBibHVlIGJvcmRlciBhbmQgbGlnaHQgYmx1ZSBiYWNrZ3JvdW5kICovCisKKypbY2xhc3N+PSJub3RlIl0gICB7CisgICAgYm9yZGVyOiBzb2xpZCAycHggIzcwOTlDNTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGZmOworICAgIHBhZGRpbmc6IDFlbSA2cHggMWVtIDsKKyAgICBtYXJnaW46IDVweDsKK30KKworKltjbGFzc349Im5vdGUiXSB0aCB7CisgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZQorfQorCisqW2NsYXNzfj0ibm90ZSJdIHRhYmxlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGZmOworICAgIGJvcmRlcjogbm9uZTsKK30KKworLyogQXN0dWNloDogY2FkcmUgdmVydCBldCBmb25kIHZlcnQgY2xhaXIgKi8KKy8qIFRpcDogZ3JlZW4gYm9yZGVyIGFuZCBsaWdodCBncmVlbiBiYWNrZ3JvdW5kICovCisKKypbY2xhc3N+PSJ0aXAiXSB7CisgICAgYm9yZGVyOiBzb2xpZCAycHggIzAwZmYwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmZmZmOworICAgIHBhZGRpbmc6IDFlbSA2cHggMWVtIDsKKyAgICBtYXJnaW46IDVweDsKK30KKworKltjbGFzc349InRpcCJdIHRoIHsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCisqW2NsYXNzfj0idGlwIl0gdGFibGUgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGZmZmY7CisgICAgYm9yZGVyOiBub25lOworfQorCisvKiBBdmVydGlzc2VtZW50oDogY2FkcmUgcm91Z2UgZXQgZm9uZCByb3VnZSBjbGFpciAqLworLyogV2FybmluZzogcmVkIGJvcmRlciBhbmQgbGlnaHQgcmVkIGJhY2tncm91bmQgKi8KKworKltjbGFzc349Indhcm5pbmciXSB7CisgICAgYm9yZGVyOiBzb2xpZCAycHggI2ZmMDAwMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMGYwOyAKKyAgICBwYWRkaW5nOiAxZW0gNnB4IDFlbSA7CisgICAgbWFyZ2luOiA1cHg7Cit9CisKKypbY2xhc3N+PSJ3YXJuaW5nIl0gdGggeworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisgICAgICAgICAgICAgICAgICAgIAorCisqW2NsYXNzfj0id2FybmluZyJdIHRhYmxlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMGYwOworICAgIGJvcmRlcjogbm9uZTsKK30KKworLyogRmluICovCisvKiBUaGUgRW5kICovCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL2JpdGJha2UuMSBiL2JpdGJha2UvZG9jL2JpdGJha2UuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmM4ZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvYml0YmFrZS4xCkBAIC0wLDAgKzEsMTQyIEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5cIiBGaXJzdCBwYXJhbWV0ZXIsIE5BTUUsIHNob3VsZCBiZSBhbGwgY2FwcworLlwiIFNlY29uZCBwYXJhbWV0ZXIsIFNFQ1RJT04sIHNob3VsZCBiZSAxLTgsIG1heWJlIHcvIHN1YnNlY3Rpb24KKy5cIiBvdGhlciBwYXJhbWV0ZXJzIGFyZSBhbGxvd2VkOiBzZWUgbWFuKDcpLCBtYW4oMSkKKy5USCBCSVRCQUtFIDEgIk5vdmVtYmVyIDE5LCAyMDA2IgorLlwiIFBsZWFzZSBhZGp1c3QgdGhpcyBkYXRlIHdoZW5ldmVyIHJldmlzaW5nIHRoZSBtYW5wYWdlLgorLlwiCisuXCIgU29tZSByb2ZmIG1hY3JvcywgZm9yIHJlZmVyZW5jZToKKy5cIiAubmggICAgICAgIGRpc2FibGUgaHlwaGVuYXRpb24KKy5cIiAuaHkgICAgICAgIGVuYWJsZSBoeXBoZW5hdGlvbgorLlwiIC5hZCBsICAgICAgbGVmdCBqdXN0aWZ5CisuXCIgLmFkIGIgICAgICBqdXN0aWZ5IHRvIGJvdGggbGVmdCBhbmQgcmlnaHQgbWFyZ2lucworLlwiIC5uZiAgICAgICAgZGlzYWJsZSBmaWxsaW5nCisuXCIgLmZpICAgICAgICBlbmFibGUgZmlsbGluZworLlwiIC5iciAgICAgICAgaW5zZXJ0IGxpbmUgYnJlYWsKKy5cIiAuc3AgPG4+ICAgIGluc2VydCBuKzEgZW1wdHkgbGluZXMKKy5cIiBmb3IgbWFucGFnZS1zcGVjaWZpYyBtYWNyb3MsIHNlZSBtYW4oNykKKy5TSCBOQU1FCitCaXRCYWtlIFwtIHNpbXBsZSB0b29sIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRhc2tzCisuU0ggU1lOT1BTSVMKKy5CIGJpdGJha2UKKy5SSSBbIG9wdGlvbnMgXSAiIHBhY2thZ2VuYW1lcyIKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyBicmllZmx5IHRoZQorLkIgYml0YmFrZQorY29tbWFuZC4KKy5QUAorLlwiIFRlWCB1c2VycyBtYXkgYmUgbW9yZSBjb21mb3J0YWJsZSB3aXRoIHRoZSBcZkI8d2hhdGV2ZXI+XGZQIGFuZAorLlwiIFxmSTx3aGF0ZXZlcj5cZlAgZXNjYXBlIHNlcXVlbmNlcyB0byBpbnZvZGUgYm9sZCBmYWNlIGFuZCBpdGFsaWNzLCAKKy5cIiByZXNwZWN0aXZlbHkuCitcZkJiaXRiYWtlXGZQIGlzIGEgcHJvZ3JhbSB0aGF0IGV4ZWN1dGVzIHRoZSBzcGVjaWZpZWQgdGFzayAoZGVmYXVsdCBpcyAnYnVpbGQnKQorZm9yIGEgZ2l2ZW4gc2V0IG9mIEJpdEJha2UgZmlsZXMuCisuYnIKK0l0IGV4cGVjdHMgdGhhdCBCQkZJTEVTIGlzIGRlZmluZWQsIHdoaWNoIGlzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZXMgdG8KK2JlIGV4ZWN1dGVkLiBCQkZJTEVTIGRvZXMgc3VwcG9ydCB3aWxkY2FyZHMuCisuYnIKK0RlZmF1bHQgQkJGSUxFUyBhcmUgdGhlIC5iYiBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisuU0ggT1BUSU9OUworVGhpcyBwcm9ncmFtIGZvbGxvdyB0aGUgdXN1YWwgR05VIGNvbW1hbmQgbGluZSBzeW50YXgsIHdpdGggbG9uZworb3B0aW9ucyBzdGFydGluZyB3aXRoIHR3byBkYXNoZXMgKGAtJykuCisuVFAKKy5CIFwtaCwgXC1cLWhlbHAKK1Nob3cgc3VtbWFyeSBvZiBvcHRpb25zLgorLlRQCisuQiBcLVwtdmVyc2lvbgorU2hvdyB2ZXJzaW9uIG9mIHByb2dyYW0uCisuVFAKKy5CIFwtYkJVSUxERklMRSwgXC1cLWJ1aWxkZmlsZT1CVUlMREZJTEUKK2V4ZWN1dGUgdGhlIHRhc2sgYWdhaW5zdCB0aGlzIC5iYiBmaWxlLCByYXRoZXIgdGhhbiBhIHBhY2thZ2UgZnJvbSBCQkZJTEVTLgorLlRQCisuQiBcLWssIFwtXC1jb250aW51ZQorY29udGludWUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhZnRlciBhbiBlcnJvci4gV2hpbGUgdGhlIHRhcmdldCB0aGF0IGZhaWxlZCwgYW5kCit0aG9zZSB0aGF0IGRlcGVuZCBvbiBpdCwgY2Fubm90IGJlIHJlbWFkZSwgdGhlIG90aGVyIGRlcGVuZGVuY2llcyBvZiB0aGVzZQordGFyZ2V0cyBjYW4gYmUgcHJvY2Vzc2VkIGFsbCB0aGUgc2FtZS4KKy5UUAorLkIgXC1hLCBcLVwtdHJ5YWx0Y29uZmlncworY29udGludWUgd2l0aCBidWlsZHMgYnkgdHJ5aW5nIHRvIHVzZSBhbHRlcm5hdGl2ZSBwcm92aWRlcnMgd2hlcmUgcG9zc2libGUuCisuVFAKKy5CIFwtZiwgXC1cLWZvcmNlCitmb3JjZSBydW4gb2Ygc3BlY2lmaWVkIGNtZCwgcmVnYXJkbGVzcyBvZiBzdGFtcCBzdGF0dXMKKy5UUAorLkIgXC1pLCBcLVwtaW50ZXJhY3RpdmUKK2Ryb3AgaW50byB0aGUgaW50ZXJhY3RpdmUgbW9kZSBhbHNvIGNhbGxlZCB0aGUgQml0QmFrZSBzaGVsbC4KKy5UUAorLkIgXC1jQ01ELCBcLVwtY21kPUNNRAorU3BlY2lmeSB0YXNrIHRvIGV4ZWN1dGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCB0YXNrIGZvcgordGhlIHByb3ZpZGVlIGFuZCB0aGUgcGFja2FnZXMgaXQgZGVwZW5kcyBvbiwgaS5lLiAnY29tcGlsZScgZG9lcyBub3QgaW1wbGljaXRseQorY2FsbCBzdGFnZSBmb3IgdGhlIGRlcGVuZGVuY2llcyAoSU9XOiB1c2Ugb25seSBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcpLgorRGVwZW5kaW5nIG9uIHRoZSBiYXNlLmJiY2xhc3MgYSBsaXN0dGFza3MgdGFzayBpcyBkZWZpbmVkIGFuZCB3aWxsIHNob3cKK2F2YWlsYWJsZSB0YXNrcy4KKy5UUAorLkIgXC1yRklMRSwgXC1cLXJlYWQ9RklMRSAKK3JlYWQgdGhlIHNwZWNpZmllZCBmaWxlIGJlZm9yZSBiaXRiYWtlLmNvbmYKKy5UUAorLkIgXC12LCBcLVwtdmVyYm9zZQorb3V0cHV0IG1vcmUgY2hpdC1jaGF0IHRvIHRoZSB0ZXJtaW5hbAorLlRQCisuQiBcLUQsIFwtXC1kZWJ1ZworSW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsLiBZb3UgY2FuIHNwZWNpZnkgdGhpcyBtb3JlIHRoYW4gb25jZS4KKy5UUAorLkIgXC1uLCBcLVwtZHJ5LXJ1bgorZG9uJ3QgZXhlY3V0ZSwganVzdCBnbyB0aHJvdWdoIHRoZSBtb3Rpb25zCisuVFAKKy5CIFwtcCwgXC1cLXBhcnNlLW9ubHkKK3F1aXQgYWZ0ZXIgcGFyc2luZyB0aGUgQkIgZmlsZXMgKGRldmVsb3BlcnMgb25seSkKKy5UUAorLkIgXC1zLCBcLVwtc2hvdy12ZXJzaW9ucworc2hvdyBjdXJyZW50IGFuZCBwcmVmZXJyZWQgdmVyc2lvbnMgb2YgYWxsIHBhY2thZ2VzCisuVFAKKy5CIFwtZSwgXC1cLWVudmlyb25tZW50CitzaG93IHRoZSBnbG9iYWwgb3IgcGVyLXJlY2lwZSBlbnZpcm9ubWVudCAodGhpcyBpcyB3aGF0IHVzZWQgdG8gYmUgYmJyZWFkKQorLlRQCisuQiBcLWcsIFwtXC1ncmFwaHZpegorZW1pdCB0aGUgZGVwZW5kZW5jeSB0cmVlcyBvZiB0aGUgc3BlY2lmaWVkIHBhY2thZ2VzIGluIHRoZSBkb3Qgc3ludGF4CisuVFAKKy5CIFwtSUlHTk9SRURcX0RPVFxfREVQUywgXC1cLWlnbm9yZS1kZXBzPUlHTk9SRURfRE9UX0RFUFMKK1N0b3AgcHJvY2Vzc2luZyBhdCB0aGUgZ2l2ZW4gbGlzdCBvZiBkZXBlbmRlbmNpZXMgd2hlbiBnZW5lcmF0aW5nIGRlcGVuZGVuY3kKK2dyYXBocy4gVGhpcyBjYW4gaGVscCB0byBtYWtlIHRoZSBncmFwaCBtb3JlIGFwcGVhbGluZworLlRQCisuQiBcLWxERUJVR19ET01BSU5TLCBcLVwtbG9nLWRvbWFpbnM9REVCVUdfRE9NQUlOUworU2hvdyBkZWJ1ZyBsb2dnaW5nIGZvciB0aGUgc3BlY2lmaWVkIGxvZ2dpbmcgZG9tYWlucworLlRQCisuQiBcLVAsIFwtXC1wcm9maWxlCitwcm9maWxlIHRoZSBjb21tYW5kIGFuZCBwcmludCBhIHJlcG9ydAorLlRQCisuQiBcLXVVSSwgXC1cLXVpPVVJCitVc2VyIGludGVyZmFjZSB0byB1c2UuIEN1cnJlbnRseSwgaG9iLCBkZXBleHAsIGdvZ2dsZSBvciBuY3Vyc2VzIGNhbiBiZSBzcGVjaWZpZWQgYXMgVUkuCisuVFAKKy5CIFwtdFNFUlZFUlRZUEUsIFwtXC1zZXJ2ZXJ0eXBlPVNFUlZFUlRZUEUKK0Nob29zZSB3aGljaCBzZXJ2ZXIgdG8gdXNlLCBub25lLCBwcm9jZXNzIG9yIHhtbHJwYy4KKy5UUAorLkIgXC1cLXJldmlzaW9ucy1jaGFuZ2VkCitTZXQgdGhlIGV4aXQgY29kZSBkZXBlbmRpbmcgb24gd2hldGhlciB1cHN0cmVhbSBmbG9hdGluZyByZXZpc2lvbnMgaGF2ZSBjaGFuZ2VkIG9yIG5vdC4KKy5UUAorLkIgXC1cLXNlcnZlci1vbmx5CitSdW4gYml0YmFrZSB3aXRob3V0IFVJLCAgdGhlIGZyb250ZW5kIGNhbiBjb25uZWN0IHdpdGggYml0YmFrZSBzZXJ2ZXIgaXRzZWxmLgorLlRQCisuQiBcLUJCSU5ELCBcLVwtYmluZD1CSU5ECitUaGUgbmFtZS9hZGRyZXNzIGZvciB0aGUgYml0YmFrZSBzZXJ2ZXIgdG8gYmluZCB0by4KKy5UUAorLkIgXC1cLW5vXC1zZXRzY2VuZQorRG8gbm90IHJ1biBhbnkgc2V0c2NlbmUgdGFza3MsIGZvcmNlcyBidWlsZHMuCisKKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKK2JpdGJha2UgdXNlcyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBjb250cm9sIGl0cworb3BlcmF0aW9uOgorLlRQCisuQiBCSVRCQUtFX1VJCitUaGUgYml0YmFrZSB1c2VyIGludGVyZmFjZTsgb3ZlcnJpZGRlbiBieSB0aGUgXGZCLXVcZlAgY29tbWFuZGxpbmUgb3B0aW9uLgorCisuU0ggQVVUSE9SUworQml0QmFrZSB3YXMgd3JpdHRlbiBieSAKK1BoaWwgQmx1bmRlbGwsCitIb2xnZXIgRnJleXRoZXIsCitDaHJpcyBMYXJzb24sCitNaWNrZXkgTGF1ZXIsCitSaWNoYXJkIFB1cmRpZSwKK0hvbGdlciBTY2h1cmlnCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgTWFyY2luIEp1c3praWV3aWN6IDxtYXJjaW5AaHJ3Lm9uZS5wbD4KK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGJ1dCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvcG9reS5lbnQgYi9iaXRiYWtlL2RvYy9wb2t5LmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMyZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvcG9reS5lbnQKQEAgLTAsMCArMSw1OSBAQAorPCFFTlRJVFkgRElTVFJPICIxLjQiPgorPCFFTlRJVFkgRElTVFJPX05BTUUgInRiZCI+Cis8IUVOVElUWSBZT0NUT19ET0NfVkVSU0lPTiAiMS40Ij4KKzwhRU5USVRZIFBPS1lWRVJTSU9OICI4LjAiPgorPCFFTlRJVFkgWU9DVE9fUE9LWSAicG9reS0mRElTVFJPX05BTUU7LSZQT0tZVkVSU0lPTjsiPgorPCFFTlRJVFkgQ09QWVJJR0hUX1lFQVIgIjIwMTAtMjAxMyI+Cis8IUVOVElUWSBZT0NUT19ETF9VUkwgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBZT0NUT19IT01FX1VSTCAiaHR0cDovL3d3dy55b2N0b3Byb2plY3Qub3JnIj4KKzwhRU5USVRZIFlPQ1RPX0xJU1RTX1VSTCAiaHR0cDovL2xpc3RzLnlvY3RvcHJvamVjdC5vcmciPgorPCFFTlRJVFkgWU9DVE9fQlVHWklMTEFfVVJMICJodHRwOi8vYnVnemlsbGEueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBZT0NUT19XSUtJX1VSTCAiaHR0cHM6Ly93aWtpLnlvY3RvcHJvamVjdC5vcmciPgorPCFFTlRJVFkgWU9DVE9fQUJfVVJMICJodHRwOi8vYXV0b2J1aWxkZXIueW9jdG9wcm9qZWN0Lm9yZyI+Cis8IUVOVElUWSBZT0NUT19HSVRfVVJMICJodHRwOi8vZ2l0LnlvY3RvcHJvamVjdC5vcmciPgorPCFFTlRJVFkgWU9DVE9fQURUUkVQT19VUkwgImh0dHA6Ly9hZHRyZXBvLnlvY3RvcHJvamVjdC5vcmciPgorPCFFTlRJVFkgT0VfSE9NRV9VUkwgImh0dHA6Ly93d3cub3BlbmVtYmVkZGVkLm9yZyI+Cis8IUVOVElUWSBPRV9MSVNUU19VUkwgImh0dHA6Ly9saXN0cy5saW51eHRvZ28ub3JnL2NnaS1iaW4vbWFpbG1hbiI+Cis8IUVOVElUWSBPRV9ET0NTX1VSTCAiaHR0cDovL2RvY3Mub3BlbmVtYmVkZGVkLm9yZyI+Cis8IUVOVElUWSBPSF9IT01FX1VSTCAiaHR0cDovL28taGFuZC5jb20iPgorPCFFTlRJVFkgQklUQkFLRV9IT01FX1VSTCAiaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL2JpdGJha2UvIj4KKzwhRU5USVRZIEVDTElQU0VfTUFJTl9VUkwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzIj4KKzwhRU5USVRZIEVDTElQU0VfRExfVVJMICJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmciPgorPCFFTlRJVFkgRUNMSVBTRV9ETF9QTFVHSU5fVVJMICImWU9DVE9fRExfVVJMOy9yZWxlYXNlcy9lY2xpcHNlLXBsdWdpbi8mRElTVFJPOyI+Cis8IUVOVElUWSBFQ0xJUFNFX1VQREFURVNfVVJMICImRUNMSVBTRV9ETF9VUkw7L3RtL3VwZGF0ZXMvMy4zIj4KKzwhRU5USVRZIEVDTElQU0VfSU5ESUdPX1VSTCAiJkVDTElQU0VfRExfVVJMOy9yZWxlYXNlcy9pbmRpZ28iPgorPCFFTlRJVFkgRUNMSVBTRV9KVU5PX1VSTCAiJkVDTElQU0VfRExfVVJMOy9yZWxlYXNlcy9qdW5vIj4KKzwhRU5USVRZIEVDTElQU0VfSU5ESUdPX0NEVF9VUkwgIiZFQ0xJUFNFX0RMX1VSTDt0b29scy9jZHQvcmVsZWFzZXMvaW5kaWdvIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfVVJMICImWU9DVE9fSE9NRV9VUkw7L2RvY3MiPgorPCFFTlRJVFkgWU9DVE9fU09VUkNFU19VUkwgIiZZT0NUT19IT01FX1VSTDsvc291cmNlcy8iPgorPCFFTlRJVFkgWU9DVE9fQUJfUE9SVF9VUkwgIiZZT0NUT19BQl9VUkw7OjgwMTAiPgorPCFFTlRJVFkgWU9DVE9fQUJfTklHSFRMWV9VUkwgIiZZT0NUT19BQl9VUkw7L25pZ2h0bHkvIj4KKzwhRU5USVRZIFlPQ1RPX1BPS1lfVVJMICImWU9DVE9fRExfVVJMOy9yZWxlYXNlcy9wb2t5LyI+Cis8IUVOVElUWSBZT0NUT19SRUxFQVNFX0RMX1VSTCAiJllPQ1RPX0RMX1VSTDsvcmVsZWFzZXMveW9jdG8veW9jdG8tJkRJU1RSTzsiPgorPCFFTlRJVFkgWU9DVE9fVE9PTENIQUlOX0RMX1VSTCAiJllPQ1RPX1JFTEVBU0VfRExfVVJMOy90b29sY2hhaW4vIj4KKzwhRU5USVRZIFlPQ1RPX0VDTElQU0VfRExfVVJMICImWU9DVE9fUkVMRUFTRV9ETF9VUkw7L2VjbGlwc2UtcGx1Z2luL2luZGlnbzsiPgorPCFFTlRJVFkgWU9DVE9fQURUSU5TVEFMTEVSX0RMX1VSTCAiJllPQ1RPX1JFTEVBU0VfRExfVVJMOy9hZHRfaW5zdGFsbGVyIj4KKzwhRU5USVRZIFlPQ1RPX1BPS1lfRExfVVJMICImWU9DVE9fUkVMRUFTRV9ETF9VUkw7LyZZT0NUT19QT0tZOy50YXIuYnoyIj4KKzwhRU5USVRZIFlPQ1RPX01BQ0hJTkVTX0RMX1VSTCAiJllPQ1RPX1JFTEVBU0VfRExfVVJMOy9tYWNoaW5lcyI+Cis8IUVOVElUWSBZT0NUT19RRU1VX0RMX1VSTCAiJllPQ1RPX01BQ0hJTkVTX0RMX1VSTDsvcWVtdSI+Cis8IUVOVElUWSBZT0NUT19QWVRIT04taTY4Nl9ETF9VUkwgIiZZT0NUT19ETF9VUkw7L3JlbGVhc2VzL21pc2NzdXBwb3J0L3B5dGhvbi1uYXRpdmVzZGstc3RhbmRhbG9uZS1pNjg2LnRhci5iejIiPgorPCFFTlRJVFkgWU9DVE9fUFlUSE9OLXg4Nl82NF9ETF9VUkwgIiZZT0NUT19ETF9VUkw7L3JlbGVhc2VzL21pc2NzdXBwb3J0L3B5dGhvbi1uYXRpdmVzZGstc3RhbmRhbG9uZS14ODZfNjQudGFyLmJ6MiI+Cis8IUVOVElUWSBZT0NUT19ET0NTX1FTX1VSTCAiJllPQ1RPX0RPQ1NfVVJMOy8mWU9DVE9fRE9DX1ZFUlNJT047L3lvY3RvLXByb2plY3QtcXMveW9jdG8tcHJvamVjdC1xcy5odG1sIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfQURUX1VSTCAiJllPQ1RPX0RPQ1NfVVJMOy8mWU9DVE9fRE9DX1ZFUlNJT047L2FkdC1tYW51YWwvYWR0LW1hbnVhbC5odG1sIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfUkVGX1VSTCAiJllPQ1RPX0RPQ1NfVVJMOy8mWU9DVE9fRE9DX1ZFUlNJT047L3JlZi1tYW51YWwvcmVmLW1hbnVhbC5odG1sIj4KKzwhRU5USVRZIFlPQ1RPX0RPQ1NfQlNQX1VSTCAiJllPQ1RPX0RPQ1NfVVJMOy8mWU9DVE9fRE9DX1ZFUlNJT047L2JzcC1ndWlkZS9ic3AtZ3VpZGUuaHRtbCI+Cis8IUVOVElUWSBZT0NUT19ET0NTX0RFVl9VUkwgIiZZT0NUT19ET0NTX1VSTDsvJllPQ1RPX0RPQ19WRVJTSU9OOy9kZXYtbWFudWFsL2Rldi1tYW51YWwuaHRtbCI+Cis8IUVOVElUWSBZT0NUT19ET0NTX0tFUk5FTF9VUkwgIiZZT0NUT19ET0NTX1VSTDsvJllPQ1RPX0RPQ19WRVJTSU9OOy9rZXJuZWwtbWFudWFsL2tlcm5lbC1tYW51YWwuaHRtbCI+Cis8IUVOVElUWSBZT0NUT19BRFRQQVRIX0RJUiAiL29wdC9wb2t5LyZESVNUUk87Ij4KKzwhRU5USVRZIFlPQ1RPX1BPS1lfVEFSQkFMTCAiJllPQ1RPX1BPS1k7LnRhci5iejIiPgorPCFFTlRJVFkgT0VfSU5JVF9QQVRIICImWU9DVE9fUE9LWTsvb2UtaW5pdC1idWlsZC1lbnYiPgorPCFFTlRJVFkgT0VfSU5JVF9GSUxFICJvZS1pbml0LWJ1aWxkLWVudiI+Cis8IUVOVElUWSBVQlVOVFVfSE9TVF9QQUNLQUdFU19FU1NFTlRJQUwgImdhd2sgd2dldCBnaXQtY29yZSBkaWZmc3RhdCB1bnppcCB0ZXhpbmZvIFwKKyAgICAgYnVpbGQtZXNzZW50aWFsIGNocnBhdGgiPgorPCFFTlRJVFkgRkVET1JBX0hPU1RfUEFDS0FHRVNfRVNTRU5USUFMICJnYXdrIG1ha2Ugd2dldCB0YXIgYnppcDIgZ3ppcCBweXRob24gdW56aXAgcGVybCBwYXRjaCBcCisgICAgIGRpZmZ1dGlscyBkaWZmc3RhdCBnaXQgY3BwIGdjYyBnY2MtYysrIGVnbGliYy1kZXZlbCB0ZXhpbmZvIGNocnBhdGggXAorICAgICBjY2FjaGUiPgorPCFFTlRJVFkgT1BFTlNVU0VfSE9TVF9QQUNLQUdFU19FU1NFTlRJQUwgInB5dGhvbiBnY2MgZ2NjLWMrKyBnaXQgY2hycGF0aCBtYWtlIHdnZXQgcHl0aG9uLXhtbCBcCisgICAgIGRpZmZzdGF0IHRleGluZm8gcHl0aG9uLWN1cnNlcyI+Cis8IUVOVElUWSBDRU5UT1NfSE9TVF9QQUNLQUdFU19FU1NFTlRJQUwgImdhd2sgbWFrZSB3Z2V0IHRhciBiemlwMiBnemlwIHB5dGhvbiB1bnppcCBwZXJsIHBhdGNoIFwKKyAgICAgZGlmZnV0aWxzIGRpZmZzdGF0IGdpdCBjcHAgZ2NjIGdjYy1jKysgZ2xpYmMtZGV2ZWwgdGV4aW5mbyBjaHJwYXRoIj4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmEudHRmIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYS50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZDZiNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmEudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmEueG1sIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4MjA0MwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmEueG1sCkBAIC0wLDAgKzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGZvbnQtbWV0cmljcyB0eXBlPSJUWVBFMCI+PGZvbnQtbmFtZT5CaXRzdHJlYW1WZXJhU2FuczwvZm9udC1uYW1lPjxlbWJlZC8+PGNhcC1oZWlnaHQ+NzI5PC9jYXAtaGVpZ2h0Pjx4LWhlaWdodD41NDY8L3gtaGVpZ2h0Pjxhc2NlbmRlcj45Mjg8L2FzY2VuZGVyPjxkZXNjZW5kZXI+LTIzNTwvZGVzY2VuZGVyPjxiYm94PjxsZWZ0Pi0xODM8L2xlZnQ+PGJvdHRvbT4tMjM1PC9ib3R0b20+PHJpZ2h0PjEyODc8L3JpZ2h0Pjx0b3A+OTI4PC90b3A+PC9iYm94PjxmbGFncz4zMjwvZmxhZ3M+PHN0ZW12PjA8L3N0ZW12PjxpdGFsaWNhbmdsZT4wPC9pdGFsaWNhbmdsZT48c3VidHlwZT5UWVBFMDwvc3VidHlwZT48bXVsdGlieXRlLWV4dHJhcz48Y2lkLXR5cGU+Q0lERm9udFR5cGUyPC9jaWQtdHlwZT48ZGVmYXVsdC13aWR0aD4wPC9kZWZhdWx0LXdpZHRoPjxiZnJhbmdlcz48YmYgZ2k9IjMiIHVlPSIxMjYiIHVzPSIzMiIvPjxiZiBnaT0iMTcyIiB1ZT0iMTYwIiB1cz0iMTYwIi8+PGJmIGdpPSIxNjMiIHVlPSIxNjEiIHVzPSIxNjEiLz48YmYgZ2k9IjEzMiIgdWU9IjE2MyIgdXM9IjE2MiIvPjxiZiBnaT0iMTg5IiB1ZT0iMTY0IiB1cz0iMTY0Ii8+PGJmIGdpPSIxNTAiIHVlPSIxNjUiIHVzPSIxNjUiLz48YmYgZ2k9IjIzMSIgdWU9IjE2NiIgdXM9IjE2NiIvPjxiZiBnaT0iMTM0IiB1ZT0iMTY3IiB1cz0iMTY3Ii8+PGJmIGdpPSIxNDIiIHVlPSIxNjgiIHVzPSIxNjgiLz48YmYgZ2k9IjEzOSIgdWU9IjE2OSIgdXM9IjE2OSIvPjxiZiBnaT0iMTU3IiB1ZT0iMTcwIiB1cz0iMTcwIi8+PGJmIGdpPSIxNjkiIHVlPSIxNzEiIHVzPSIxNzEiLz48YmYgZ2k9IjE2NCIgdWU9IjE3MiIgdXM9IjE3MiIvPjxiZiBnaT0iMjU2IiB1ZT0iMTczIiB1cz0iMTczIi8+PGJmIGdpPSIxMzgiIHVlPSIxNzQiIHVzPSIxNzQiLz48YmYgZ2k9IjIxNyIgdWU9IjE3NSIgdXM9IjE3NSIvPjxiZiBnaT0iMTMxIiB1ZT0iMTc2IiB1cz0iMTc2Ii8+PGJmIGdpPSIxNDciIHVlPSIxNzciIHVzPSIxNzciLz48YmYgZ2k9IjI0MSIgdWU9IjE3OSIgdXM9IjE3OCIvPjxiZiBnaT0iMTQxIiB1ZT0iMTgwIiB1cz0iMTgwIi8+PGJmIGdpPSIxNTEiIHVlPSIxODEiIHVzPSIxODEiLz48YmYgZ2k9IjEzNiIgdWU9IjE4MiIgdXM9IjE4MiIvPjxiZiBnaT0iMTk1IiB1ZT0iMTgzIiB1cz0iMTgzIi8+PGJmIGdpPSIyMjEiIHVlPSIxODQiIHVzPSIxODQiLz48YmYgZ2k9IjI0MCIgdWU9IjE4NSIgdXM9IjE4NSIvPjxiZiBnaT0iMTU4IiB1ZT0iMTg2IiB1cz0iMTg2Ii8+PGJmIGdpPSIxNzAiIHVlPSIxODciIHVzPSIxODciLz48YmYgZ2k9IjI0MyIgdWU9IjE5MCIgdXM9IjE4OCIvPjxiZiBnaT0iMTYyIiB1ZT0iMTkxIiB1cz0iMTkxIi8+PGJmIGdpPSIxNzMiIHVlPSIxOTIiIHVzPSIxOTIiLz48YmYgZ2k9IjIwMSIgdWU9IjE5MyIgdXM9IjE5MyIvPjxiZiBnaT0iMTk5IiB1ZT0iMTk0IiB1cz0iMTk0Ii8+PGJmIGdpPSIxNzQiIHVlPSIxOTUiIHVzPSIxOTUiLz48YmYgZ2k9Ijk4IiB1ZT0iMTk3IiB1cz0iMTk2Ii8+PGJmIGdpPSIxNDQiIHVlPSIxOTgiIHVzPSIxOTgiLz48YmYgZ2k9IjEwMCIgdWU9IjE5OSIgdXM9IjE5OSIvPjxiZiBnaT0iMjAzIiB1ZT0iMjAwIiB1cz0iMjAwIi8+PGJmIGdpPSIxMDEiIHVlPSIyMDEiIHVzPSIyMDEiLz48YmYgZ2k9IjIwMCIgdWU9IjIwMiIgdXM9IjIwMiIvPjxiZiBnaT0iMjAyIiB1ZT0iMjAzIiB1cz0iMjAzIi8+PGJmIGdpPSIyMDciIHVlPSIyMDQiIHVzPSIyMDQiLz48YmYgZ2k9IjIwNCIgdWU9IjIwNyIgdXM9IjIwNSIvPjxiZiBnaT0iMjMyIiB1ZT0iMjA4IiB1cz0iMjA4Ii8+PGJmIGdpPSIxMDIiIHVlPSIyMDkiIHVzPSIyMDkiLz48YmYgZ2k9IjIxMCIgdWU9IjIxMCIgdXM9IjIxMCIvPjxiZiBnaT0iMjA4IiB1ZT0iMjEyIiB1cz0iMjExIi8+PGJmIGdpPSIxNzUiIHVlPSIyMTMiIHVzPSIyMTMiLz48YmYgZ2k9IjEwMyIgdWU9IjIxNCIgdXM9IjIxNCIvPjxiZiBnaT0iMjM5IiB1ZT0iMjE1IiB1cz0iMjE1Ii8+PGJmIGdpPSIxNDUiIHVlPSIyMTYiIHVzPSIyMTYiLz48YmYgZ2k9IjIxMyIgdWU9IjIxNyIgdXM9IjIxNyIvPjxiZiBnaT0iMjExIiB1ZT0iMjE5IiB1cz0iMjE4Ii8+PGJmIGdpPSIxMDQiIHVlPSIyMjAiIHVzPSIyMjAiLz48YmYgZ2k9IjIzNCIgdWU9IjIyMSIgdXM9IjIyMSIvPjxiZiBnaT0iMjM2IiB1ZT0iMjIyIiB1cz0iMjIyIi8+PGJmIGdpPSIxMzciIHVlPSIyMjMiIHVzPSIyMjMiLz48YmYgZ2k9IjEwNiIgdWU9IjIyNCIgdXM9IjIyNCIvPjxiZiBnaT0iMTA1IiB1ZT0iMjI1IiB1cz0iMjI1Ii8+PGJmIGdpPSIxMDciIHVlPSIyMjYiIHVzPSIyMjYiLz48YmYgZ2k9IjEwOSIgdWU9IjIyNyIgdXM9IjIyNyIvPjxiZiBnaT0iMTA4IiB1ZT0iMjI4IiB1cz0iMjI4Ii8+PGJmIGdpPSIxMTAiIHVlPSIyMjkiIHVzPSIyMjkiLz48YmYgZ2k9IjE2MCIgdWU9IjIzMCIgdXM9IjIzMCIvPjxiZiBnaT0iMTExIiB1ZT0iMjMxIiB1cz0iMjMxIi8+PGJmIGdpPSIxMTMiIHVlPSIyMzIiIHVzPSIyMzIiLz48YmYgZ2k9IjExMiIgdWU9IjIzMyIgdXM9IjIzMyIvPjxiZiBnaT0iMTE0IiB1ZT0iMjM1IiB1cz0iMjM0Ii8+PGJmIGdpPSIxMTciIHVlPSIyMzYiIHVzPSIyMzYiLz48YmYgZ2k9IjExNiIgdWU9IjIzNyIgdXM9IjIzNyIvPjxiZiBnaT0iMTE4IiB1ZT0iMjM5IiB1cz0iMjM4Ii8+PGJmIGdpPSIyMzMiIHVlPSIyNDAiIHVzPSIyNDAiLz48YmYgZ2k9IjEyMCIgdWU9IjI0MSIgdXM9IjI0MSIvPjxiZiBnaT0iMTIyIiB1ZT0iMjQyIiB1cz0iMjQyIi8+PGJmIGdpPSIxMjEiIHVlPSIyNDMiIHVzPSIyNDMiLz48YmYgZ2k9IjEyMyIgdWU9IjI0NCIgdXM9IjI0NCIvPjxiZiBnaT0iMTI1IiB1ZT0iMjQ1IiB1cz0iMjQ1Ii8+PGJmIGdpPSIxMjQiIHVlPSIyNDYiIHVzPSIyNDYiLz48YmYgZ2k9IjE4NCIgdWU9IjI0NyIgdXM9IjI0NyIvPjxiZiBnaT0iMTYxIiB1ZT0iMjQ4IiB1cz0iMjQ4Ii8+PGJmIGdpPSIxMjciIHVlPSIyNDkiIHVzPSIyNDkiLz48YmYgZ2k9IjEyNiIgdWU9IjI1MCIgdXM9IjI1MCIvPjxiZiBnaT0iMTI4IiB1ZT0iMjUyIiB1cz0iMjUxIi8+PGJmIGdpPSIyMzUiIHVlPSIyNTMiIHVzPSIyNTMiLz48YmYgZ2k9IjIzNyIgdWU9IjI1NCIgdXM9IjI1NCIvPjxiZiBnaT0iMTg2IiB1ZT0iMjU1IiB1cz0iMjU1Ii8+PGJmIGdpPSIyNTEiIHVlPSIyNjMiIHVzPSIyNjIiLz48YmYgZ2k9IjI1MyIgdWU9IjI2OSIgdXM9IjI2OCIvPjxiZiBnaT0iMCIgdWU9IjI3MCIgdXM9IjI3MCIvPjxiZiBnaT0iMCIgdWU9IjI3MSIgdXM9IjI3MSIvPjxiZiBnaT0iMCIgdWU9IjI3MiIgdXM9IjI3MiIvPjxiZiBnaT0iMjU1IiB1ZT0iMjczIiB1cz0iMjczIi8+PGJmIGdpPSIyNDYiIHVlPSIyODciIHVzPSIyODYiLz48YmYgZ2k9IjI0OCIgdWU9IjMwNCIgdXM9IjMwNCIvPjxiZiBnaT0iMjE0IiB1ZT0iMzA1IiB1cz0iMzA1Ii8+PGJmIGdpPSIyMjUiIHVlPSIzMjIiIHVzPSIzMjEiLz48YmYgZ2k9IjE3NiIgdWU9IjMzOSIgdXM9IjMzOCIvPjxiZiBnaT0iMjQ5IiB1ZT0iMzUxIiB1cz0iMzUwIi8+PGJmIGdpPSIyMjciIHVlPSIzNTMiIHVzPSIzNTIiLz48YmYgZ2k9IjE4NyIgdWU9IjM3NiIgdXM9IjM3NiIvPjxiZiBnaT0iMjI5IiB1ZT0iMzgyIiB1cz0iMzgxIi8+PGJmIGdpPSIxNjYiIHVlPSI0MDIiIHVzPSI0MDIiLz48YmYgZ2k9IjIxNSIgdWU9IjcxMCIgdXM9IjcxMCIvPjxiZiBnaT0iMjI0IiB1ZT0iNzExIiB1cz0iNzExIi8+PGJmIGdpPSIyMTgiIHVlPSI3MzAiIHVzPSI3MjgiLz48YmYgZ2k9IjIyMyIgdWU9IjczMSIgdXM9IjczMSIvPjxiZiBnaT0iMjE2IiB1ZT0iNzMyIiB1cz0iNzMyIi8+PGJmIGdpPSIyMjIiIHVlPSI3MzMiIHVzPSI3MzMiLz48YmYgZ2k9IjE1OSIgdWU9IjkzNyIgdXM9IjkzNyIvPjxiZiBnaT0iMTU1IiB1ZT0iOTYwIiB1cz0iOTYwIi8+PGJmIGdpPSIxNzgiIHVlPSI4MjEyIiB1cz0iODIxMSIvPjxiZiBnaT0iMCIgdWU9IjgyMTMiIHVzPSI4MjEzIi8+PGJmIGdpPSIwIiB1ZT0iODIxNCIgdXM9IjgyMTQiLz48YmYgZ2k9IjAiIHVlPSI4MjE1IiB1cz0iODIxNSIvPjxiZiBnaT0iMTgyIiB1ZT0iODIxNyIgdXM9IjgyMTYiLz48YmYgZ2k9IjE5NiIgdWU9IjgyMTgiIHVzPSI4MjE4Ii8+PGJmIGdpPSIwIiB1ZT0iODIxOSIgdXM9IjgyMTkiLz48YmYgZ2k9IjE4MCIgdWU9IjgyMjEiIHVzPSI4MjIwIi8+PGJmIGdpPSIxOTciIHVlPSI4MjIyIiB1cz0iODIyMiIvPjxiZiBnaT0iMCIgdWU9IjgyMjMiIHVzPSI4MjIzIi8+PGJmIGdpPSIxMzAiIHVlPSI4MjI0IiB1cz0iODIyNCIvPjxiZiBnaT0iMTk0IiB1ZT0iODIyNSIgdXM9IjgyMjUiLz48YmYgZ2k9IjEzNSIgdWU9IjgyMjYiIHVzPSI4MjI2Ii8+PGJmIGdpPSIwIiB1ZT0iODIyNyIgdXM9IjgyMjciLz48YmYgZ2k9IjAiIHVlPSI4MjI4IiB1cz0iODIyOCIvPjxiZiBnaT0iMCIgdWU9IjgyMjkiIHVzPSI4MjI5Ii8+PGJmIGdpPSIxNzEiIHVlPSI4MjMwIiB1cz0iODIzMCIvPjxiZiBnaT0iMTk4IiB1ZT0iODI0MCIgdXM9IjgyNDAiLz48YmYgZ2k9IjE5MCIgdWU9IjgyNTAiIHVzPSI4MjQ5Ii8+PGJmIGdpPSIyNTgiIHVlPSI4MzY0IiB1cz0iODM2NCIvPjxiZiBnaT0iMTQwIiB1ZT0iODQ4MiIgdXM9Ijg0ODIiLz48YmYgZ2k9IjE1MiIgdWU9Ijg3MDYiIHVzPSI4NzA2Ii8+PGJmIGdpPSIwIiB1ZT0iODcwNyIgdXM9Ijg3MDciLz48YmYgZ2k9IjAiIHVlPSI4NzA4IiB1cz0iODcwOCIvPjxiZiBnaT0iMCIgdWU9Ijg3MDkiIHVzPSI4NzA5Ii8+PGJmIGdpPSIxNjgiIHVlPSI4NzEwIiB1cz0iODcxMCIvPjxiZiBnaT0iMTU0IiB1ZT0iODcxOSIgdXM9Ijg3MTkiLz48YmYgZ2k9IjAiIHVlPSI4NzIwIiB1cz0iODcyMCIvPjxiZiBnaT0iMTUzIiB1ZT0iODcyMSIgdXM9Ijg3MjEiLz48YmYgZ2k9IjIzOCIgdWU9Ijg3MjIiIHVzPSI4NzIyIi8+PGJmIGdpPSIwIiB1ZT0iODcyMyIgdXM9Ijg3MjMiLz48YmYgZ2k9IjAiIHVlPSI4NzI0IiB1cz0iODcyNCIvPjxiZiBnaT0iMTg4IiB1ZT0iODcyNSIgdXM9Ijg3MjUiLz48YmYgZ2k9IjAiIHVlPSI4NzI2IiB1cz0iODcyNiIvPjxiZiBnaT0iMCIgdWU9Ijg3MjciIHVzPSI4NzI3Ii8+PGJmIGdpPSIwIiB1ZT0iODcyOCIgdXM9Ijg3MjgiLz48YmYgZ2k9IjI1NyIgdWU9Ijg3MjkiIHVzPSI4NzI5Ii8+PGJmIGdpPSIxNjUiIHVlPSI4NzMwIiB1cz0iODczMCIvPjxiZiBnaT0iMCIgdWU9Ijg3MzEiIHVzPSI4NzMxIi8+PGJmIGdpPSIwIiB1ZT0iODczMiIgdXM9Ijg3MzIiLz48YmYgZ2k9IjAiIHVlPSI4NzMzIiB1cz0iODczMyIvPjxiZiBnaT0iMTQ2IiB1ZT0iODczNCIgdXM9Ijg3MzQiLz48YmYgZ2k9IjE1NiIgdWU9Ijg3NDciIHVzPSI4NzQ3Ii8+PGJmIGdpPSIxNjciIHVlPSI4Nzc2IiB1cz0iODc3NiIvPjxiZiBnaT0iMTQzIiB1ZT0iODgwMCIgdXM9Ijg4MDAiLz48YmYgZ2k9IjAiIHVlPSI4ODAxIiB1cz0iODgwMSIvPjxiZiBnaT0iMCIgdWU9Ijg4MDIiIHVzPSI4ODAyIi8+PGJmIGdpPSIwIiB1ZT0iODgwMyIgdXM9Ijg4MDMiLz48YmYgZ2k9IjE0OCIgdWU9Ijg4MDUiIHVzPSI4ODA0Ii8+PGJmIGdpPSIxODUiIHVlPSI5Njc0IiB1cz0iOTY3NCIvPjxiZiBnaT0iMTkyIiB1ZT0iNjQyNTgiIHVzPSI2NDI1NyIvPjxiZiBnaT0iMCIgdWU9IjY1NTM1IiB1cz0iNjU1MzUiLz48L2JmcmFuZ2VzPjxjaWQtd2lkdGhzIHN0YXJ0LWluZGV4PSIwIj48d3ggdz0iNjAwIi8+PHd4IHc9IjAiLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjMxNyIvPjx3eCB3PSI0MDAiLz48d3ggdz0iNDU5Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI2MzYiLz48d3ggdz0iOTUwIi8+PHd4IHc9Ijc3OSIvPjx3eCB3PSIyNzQiLz48d3ggdz0iMzkwIi8+PHd4IHc9IjM5MCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iODM3Ii8+PHd4IHc9IjMxNyIvPjx3eCB3PSIzNjAiLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjMzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iMzM2Ii8+PHd4IHc9IjMzNiIvPjx3eCB3PSI4MzciLz48d3ggdz0iODM3Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI1MzAiLz48d3ggdz0iMTAwMCIvPjx3eCB3PSI2ODQiLz48d3ggdz0iNjg2Ii8+PHd4IHc9IjY5OCIvPjx3eCB3PSI3NzAiLz48d3ggdz0iNjMxIi8+PHd4IHc9IjU3NSIvPjx3eCB3PSI3NzQiLz48d3ggdz0iNzUxIi8+PHd4IHc9IjI5NCIvPjx3eCB3PSIyOTQiLz48d3ggdz0iNjU1Ii8+PHd4IHc9IjU1NyIvPjx3eCB3PSI4NjIiLz48d3ggdz0iNzQ4Ii8+PHd4IHc9Ijc4NyIvPjx3eCB3PSI2MDMiLz48d3ggdz0iNzg3Ii8+PHd4IHc9IjY5NCIvPjx3eCB3PSI2MzQiLz48d3ggdz0iNjEwIi8+PHd4IHc9IjczMSIvPjx3eCB3PSI2ODQiLz48d3ggdz0iOTg4Ii8+PHd4IHc9IjY4NSIvPjx3eCB3PSI2MTAiLz48d3ggdz0iNjg1Ii8+PHd4IHc9IjM5MCIvPjx3eCB3PSIzMzYiLz48d3ggdz0iMzkwIi8+PHd4IHc9IjgzNyIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjYxMiIvPjx3eCB3PSI2MzQiLz48d3ggdz0iNTQ5Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSI2MTUiLz48d3ggdz0iMzUyIi8+PHd4IHc9IjYzNCIvPjx3eCB3PSI2MzMiLz48d3ggdz0iMjc3Ii8+PHd4IHc9IjI3NyIvPjx3eCB3PSI1NzkiLz48d3ggdz0iMjc3Ii8+PHd4IHc9Ijk3NCIvPjx3eCB3PSI2MzMiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYzNCIvPjx3eCB3PSI2MzQiLz48d3ggdz0iNDExIi8+PHd4IHc9IjUyMCIvPjx3eCB3PSIzOTIiLz48d3ggdz0iNjMzIi8+PHd4IHc9IjU5MSIvPjx3eCB3PSI4MTciLz48d3ggdz0iNTkxIi8+PHd4IHc9IjU5MSIvPjx3eCB3PSI1MjQiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjMzNiIvPjx3eCB3PSI2MzYiLz48d3ggdz0iODM3Ii8+PHd4IHc9IjY4NCIvPjx3eCB3PSI2ODQiLz48d3ggdz0iNjk4Ii8+PHd4IHc9IjYzMSIvPjx3eCB3PSI3NDgiLz48d3ggdz0iNzg3Ii8+PHd4IHc9IjczMSIvPjx3eCB3PSI2MTIiLz48d3ggdz0iNjEyIi8+PHd4IHc9IjYxMiIvPjx3eCB3PSI2MTIiLz48d3ggdz0iNjEyIi8+PHd4IHc9IjYxMiIvPjx3eCB3PSI1NDkiLz48d3ggdz0iNjE1Ii8+PHd4IHc9IjYxNSIvPjx3eCB3PSI2MTUiLz48d3ggdz0iNjE1Ii8+PHd4IHc9IjI3NyIvPjx3eCB3PSIyNzciLz48d3ggdz0iMjc3Ii8+PHd4IHc9IjI3NyIvPjx3eCB3PSI2MzMiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYxMSIvPjx3eCB3PSI2MTEiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYxMSIvPjx3eCB3PSI2MzMiLz48d3ggdz0iNjMzIi8+PHd4IHc9IjYzMyIvPjx3eCB3PSI2MzMiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1ODkiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjYyOSIvPjx3eCB3PSIxMDAwIi8+PHd4IHc9IjEwMDAiLz48d3ggdz0iMTAwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjgzNyIvPjx3eCB3PSI5NzQiLz48d3ggdz0iNzg3Ii8+PHd4IHc9IjgzMyIvPjx3eCB3PSI4MzciLz48d3ggdz0iODM3Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI2MzYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjUxNyIvPjx3eCB3PSI2NzMiLz48d3ggdz0iNzU2Ii8+PHd4IHc9IjU4OCIvPjx3eCB3PSI1MjAiLz48d3ggdz0iNDcxIi8+PHd4IHc9IjQ3MSIvPjx3eCB3PSI3NjQiLz48d3ggdz0iOTgxIi8+PHd4IHc9IjYxMSIvPjx3eCB3PSI1MzAiLz48d3ggdz0iNDAwIi8+PHd4IHc9IjgzNyIvPjx3eCB3PSI2MzciLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI2NjgiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYxMSIvPjx3eCB3PSIxMDAwIi8+PHd4IHc9IjYzNiIvPjx3eCB3PSI2ODQiLz48d3ggdz0iNjg0Ii8+PHd4IHc9Ijc4NyIvPjx3eCB3PSIxMDY5Ii8+PHd4IHc9IjEwMjIiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjEwMDAiLz48d3ggdz0iNTE4Ii8+PHd4IHc9IjUxOCIvPjx3eCB3PSIzMTciLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjgzNyIvPjx3eCB3PSI0OTQiLz48d3ggdz0iNTkxIi8+PHd4IHc9IjYxMCIvPjx3eCB3PSIxNjYiLz48d3ggdz0iNjM2Ii8+PHd4IHc9IjM5OSIvPjx3eCB3PSIzOTkiLz48d3ggdz0iNjI5Ii8+PHd4IHc9IjYyOSIvPjx3eCB3PSI1MDAiLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjMxNyIvPjx3eCB3PSI1MTgiLz48d3ggdz0iMTM0MSIvPjx3eCB3PSI2ODQiLz48d3ggdz0iNjMxIi8+PHd4IHc9IjY4NCIvPjx3eCB3PSI2MzEiLz48d3ggdz0iNjMxIi8+PHd4IHc9IjI5NCIvPjx3eCB3PSIyOTQiLz48d3ggdz0iMjk0Ii8+PHd4IHc9IjI5NCIvPjx3eCB3PSI3ODciLz48d3ggdz0iNzg3Ii8+PHd4IHc9Ijc4NyIvPjx3eCB3PSI3MzEiLz48d3ggdz0iNzMxIi8+PHd4IHc9IjczMSIvPjx3eCB3PSIyNzciLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjU2MiIvPjx3eCB3PSIyODQiLz48d3ggdz0iNjM0Ii8+PHd4IHc9IjUyMCIvPjx3eCB3PSI2ODUiLz48d3ggdz0iNTI0Ii8+PHd4IHc9IjMzNiIvPjx3eCB3PSI3NzQiLz48d3ggdz0iNjExIi8+PHd4IHc9IjYxMCIvPjx3eCB3PSI1OTEiLz48d3ggdz0iNjA0Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSI4MzciLz48d3ggdz0iODM3Ii8+PHd4IHc9IjQwMCIvPjx3eCB3PSI0MDAiLz48d3ggdz0iNDAwIi8+PHd4IHc9Ijk2OSIvPjx3eCB3PSI5NjkiLz48d3ggdz0iOTY5Ii8+PHd4IHc9Ijc3NCIvPjx3eCB3PSI2MzQiLz48d3ggdz0iMjk0Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSI1MjAiLz48d3ggdz0iNjk4Ii8+PHd4IHc9IjU0OSIvPjx3eCB3PSI2OTgiLz48d3ggdz0iNTQ5Ii8+PHd4IHc9IjYzNCIvPjx3eCB3PSIzNjAiLz48d3ggdz0iMzE3Ii8+PHd4IHc9IjYzNiIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI1MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjx3eCB3PSI0MDAiLz48d3ggdz0iNTAwIi8+PHd4IHc9IjUwMCIvPjwvY2lkLXdpZHRocz48L211bHRpYnl0ZS1leHRyYXM+PGtlcm5pbmcga3B4MT0iMjQ2Ij48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIzNSI+PHBhaXIga2Vybj0iLTE0MiIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNDYiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNDMiPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTYiPjxwYWlyIGtlcm49IjM2IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMTE4IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTExOCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSIzNiIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iMzYiIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTExOCIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSI1NSIga3B4Mj0iNDUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMjYiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjM3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTEyIj48cGFpciBrZXJuPSItMTciIGtweDI9IjkxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjEyMyI+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjkxIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjUxIj48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIxMyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjYxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIwOCI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE4NyI+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDgiLz48cGFpciBrZXJuPSItNzciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTIwMiIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMTMiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTQ0Ij48cGFpciBrZXJuPSItNDAiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNTkiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMTUiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNzMiPjxwYWlyIGtlcm49IjMxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTE0IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI0MSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU0Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iODUiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSI2OCIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iNzYiLz48cGFpciBrZXJuPSItMTYwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xODMiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI0OSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMjQiPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI5MSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTgxIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE2OSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOSIvPjxwYWlyIGtlcm49IjczIiBrcHgyPSIxNDQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQ1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjAxIj48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iMjciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTEyMyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcxIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTEiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI4OSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNjAiPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0xMDkiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0yMDIiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDkiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iODUiPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMjU0Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4MCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjExMSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iOTEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgxIi8+PHBhaXIga2Vybj0iNDEiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTUxIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijc0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI2MSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMzQiPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0xMDkiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0yMDIiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSIxMDkiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTAwIj48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjEyMiI+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjkxIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNDciPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEwNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjIxMyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItMjAyIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iMjIiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xMzIiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIyMTEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTEzMiIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTEzNyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0yNjIiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iMjIiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMjEyIi8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTEwOSIga3B4Mj0iNTciLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSI1NiIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMTAiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI1OSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1OCI+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxMDUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iODUiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjEwOCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMjEiIGtweDI9Ijc2Ii8+PHBhaXIga2Vybj0iLTExNCIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyOCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxMDkiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjExMCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjgyIj48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iOTEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxODYiPjxwYWlyIGtlcm49Ii0xNDIiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTQ2IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE3NSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIwOSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjEwMyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU5Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjgxIj48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iOTgiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjQ2Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTIzIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzEiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTgiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMTIiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjI5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMjkiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMzgiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTIxIj48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iOTEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1NyI+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxMDUiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTg2IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTA2Ii8+PHBhaXIga2Vybj0iLTgxIiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iNzYiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xMzciIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTEwIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMzciPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjI3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDkiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTIwIj48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjQ5Ij48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9Ijk4Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjIyNyI+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSI5OCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1MSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODYiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMDUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEwOCIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgxIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTU1IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0xNjAiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjgiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExMCIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTA0Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNzIiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTk5Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iMjciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTEyMyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcxIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTEiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI4OSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNTQiPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iOTgiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTgwIj48cGFpciBrZXJuPSItMzUiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjQ2Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI0MyIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0xODgiIGtweDI9IjE0NCIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iNTkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjczIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI0MSIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI4NSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI0NyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjM3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMjAiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjUxIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI1MyIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTM3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMzMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSItNzIiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIzOSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMjM2Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI0NSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI0NiIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1MyI+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMDciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjkiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSI2OCIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItNDAiIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTI2Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItNDQiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTQ0IiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMzciPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMzMiPjxwYWlyIGtlcm49Ii00NCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyNTMiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iMTgiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMjExIj48cGFpciBrZXJuPSItMTciIGtweDI9IjIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNjEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNzgiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwNiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItMzAiIGtweDI9Ijg4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjEyNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjUyIj48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iMTI1Ij48cGFpciBrZXJuPSItNzIiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iOTEiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI0MiI+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxNzAiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0xMDkiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1OSIvPjxwYWlyIGtlcm49Ii0xMDkiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xMDkiIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQ1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODkiLz48cGFpciBrZXJuPSItODYiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIzNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjExNSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5MSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI5MCI+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTEwNCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjM2Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjI0NiIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMjM1Ii8+PHBhaXIga2Vybj0iLTIxIiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTEzIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcwIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI5Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMzQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjgyIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iMjciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTEyMyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNjMiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcxIi8+PHBhaXIga2Vybj0iLTEyOCIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjQyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTUiLz48cGFpciBrZXJuPSItNDAiIGtweDI9IjkwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTEiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii02NyIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSI4OSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNTUiPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjEwNyIvPjxwYWlyIGtlcm49Ii0xNTUiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9Ijg2Ii8+PHBhaXIga2Vybj0iLTE1MSIga3B4Mj0iMTI5Ii8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTkxIiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIyNTIiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSI3MCIvPjxwYWlyIGtlcm49Ii0xNDYiIGtweDI9Ijg1Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItMTA5IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iNjgiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0xNTUiIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjI1MCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xMTgiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTU4IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii0xNjUiIGtweDI9IjIyOCIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNTEiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSIxMDUiLz48cGFpciBrZXJuPSItNTgiIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNjkiIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTcwIi8+PHBhaXIga2Vybj0iLTE1MSIga3B4Mj0iODgiLz48cGFpciBrZXJuPSItMTY5IiBrcHgyPSIxMTEiLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTE2OSIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTE1MSIga3B4Mj0iMTI3Ii8+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iMTA4Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI3NiIvPjxwYWlyIGtlcm49Ii0xNTEiIGtweDI9IjEyOCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTE2NSIga3B4Mj0iMTA5Ii8+PHBhaXIga2Vybj0iLTE1NSIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTY1IiBrcHgyPSIxMTAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxMTQiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTEiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNTAiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI1OSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItOTEiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI5MSI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTIyIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcwIi8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTE1Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjM5Ij48cGFpciBrZXJuPSItMTciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMTciIGtweDI9Ijk4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxODciLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIzNCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIyMzYiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgwIi8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIxNyIvPjxwYWlyIGtlcm49Ii05MSIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyOSIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI0NSI+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTk3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMzAiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE3MyI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0yMSIga3B4Mj0iMTYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyNTEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMyIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjczIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE2OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUyIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MCIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjEwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTgiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjE4NiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMDkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwMyIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0xMjMiIGtweDI9IjE4MSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTIxIi8+PHBhaXIga2Vybj0iLTYzIiBrcHgyPSI1NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjU0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzIiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI3MSIvPjxwYWlyIGtlcm49Ii0xMjgiIGtweDI9IjE4MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI0MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTQwIiBrcHgyPSI5MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTExIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjM2Ii8+PHBhaXIga2Vybj0iLTc3IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTE0Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI1MCIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItNjciIGtweDI9IjkyIi8+PHBhaXIga2Vybj0iMjIiIGtweDI9IjE5NyIvPjxwYWlyIGtlcm49Ii01OCIga3B4Mj0iODkiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTc0Ii8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9IjE5NyI+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyNDYiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIzNSIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNDMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE4MyIga3B4Mj0iMTg3Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMDgiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTQ0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI1OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjQxIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMjQiLz48cGFpciBrZXJuPSItMzUiIGtweDI9Ijg1Ii8+PHBhaXIga2Vybj0iLTE4MyIga3B4Mj0iNjAiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE4MyIga3B4Mj0iMjM0Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxMDAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iNDciLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItMTIzIiBrcHgyPSI1OCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI4MSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMzgiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii0xODMiIGtweDI9IjU3Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIzNyIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTIwIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI1MSIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxOTkiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjUzIi8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxMzciLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIzMyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI1MiIvPjxwYWlyIGtlcm49Ii0zNSIga3B4Mj0iMTI1Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI0MiIvPjxwYWlyIGtlcm49Ii05NSIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItMTM3IiBrcHgyPSI1NSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjM5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIyMzYiLz48cGFpciBrZXJuPSIyMiIga3B4Mj0iNDUiLz48cGFpciBrZXJuPSIxOCIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49Ii0xMTQiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI0NiIvPjxwYWlyIGtlcm49IjE4IiBrcHgyPSIxNzQiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iOTIiPjxwYWlyIGtlcm49Ii0xNDIiIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTQ2IiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTcwIi8+PC9rZXJuaW5nPjxrZXJuaW5nIGtweDE9Ijg5Ij48cGFpciBrZXJuPSItNzciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTMyIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItMjYiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyOSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzAiLz48L2tlcm5pbmc+PGtlcm5pbmcga3B4MT0iNDYiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTA3Ii8+PHBhaXIga2Vybj0iLTcyIiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMTA0IiBrcHgyPSIxNiIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTEyIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMjMiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjI1MSIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iMjEzIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMjkiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyNCIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iMTY5Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI2MCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjAxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDYiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjY4Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIyMTAiLz48cGFpciBrZXJuPSItMzUiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSI4MiIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iMTg2Ii8+PHBhaXIga2Vybj0iLTU0IiBrcHgyPSIxNzUiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjIwOSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMTAzIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSI5OCIvPjxwYWlyIGtlcm49Ii0zMCIga3B4Mj0iMTgxIi8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIyMTIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjM4Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMjEiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyNiIvPjxwYWlyIGtlcm49Ii0yNiIga3B4Mj0iMTA0Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSI3MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTk5Ii8+PHBhaXIga2Vybj0iLTMwIiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwNSIvPjxwYWlyIGtlcm49Ii01NCIga3B4Mj0iMjUzIi8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSIyMTEiLz48cGFpciBrZXJuPSItNDkiIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTE1Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSI4OCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMzYiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjU1Ii8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMTQiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjUwIi8+PHBhaXIga2Vybj0iLTQ5IiBrcHgyPSIxMjciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwOCIvPjxwYWlyIGtlcm49Ii00OSIga3B4Mj0iMTI4Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxNzMiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEwOSIvPjxwYWlyIGtlcm49Ii03MiIga3B4Mj0iOTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTc0Ii8+PHBhaXIga2Vybj0iLTI2IiBrcHgyPSI1NiIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSIxNzQiPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjQ2Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIyMzUiLz48cGFpciBrZXJuPSItMjEiIGtweDI9IjE2Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjUxIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMTMiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjE4NyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA4Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSI3MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTI0Ii8+PHBhaXIga2Vybj0iLTM1IiBrcHgyPSIxNjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MiIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzAiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjYwIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjIwMSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjkiLz48cGFpciBrZXJuPSItNzciIGtweDI9IjIzNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMTAwIi8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMjIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjIxMCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODIiLz48cGFpciBrZXJuPSItNTQiIGtweDI9IjU4Ii8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSIxODYiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3NSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iMjA5Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIxMDMiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iOTgiLz48cGFpciBrZXJuPSItMTIzIiBrcHgyPSIxODEiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjE3Ii8+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIzOCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODQiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyMSIvPjxwYWlyIGtlcm49Ii02MyIga3B4Mj0iNTciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1NCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iODciLz48cGFpciBrZXJuPSItMTciIGtweDI9IjcyIi8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE5OSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNzEiLz48cGFpciBrZXJuPSItMTI4IiBrcHgyPSIxODAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjI1MyIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjEyNSIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNDIiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNSIvPjxwYWlyIGtlcm49Ii00MCIga3B4Mj0iOTAiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExMSIvPjxwYWlyIGtlcm49IjI3IiBrcHgyPSIzNiIvPjxwYWlyIGtlcm49Ii03NyIga3B4Mj0iNTUiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjExNCIvPjxwYWlyIGtlcm49Ii0xNyIga3B4Mj0iNTAiLz48cGFpciBrZXJuPSIyNyIga3B4Mj0iMTczIi8+PHBhaXIga2Vybj0iLTY3IiBrcHgyPSI5MiIvPjxwYWlyIGtlcm49IjIyIiBrcHgyPSIxOTciLz48cGFpciBrZXJuPSItNTgiIGtweDI9Ijg5Ii8+PHBhaXIga2Vybj0iMjciIGtweDI9IjE3NCIvPjwva2VybmluZz48a2VybmluZyBrcHgxPSI1NiI+PHBhaXIga2Vybj0iLTE3IiBrcHgyPSIyMjkiLz48cGFpciBrZXJuPSItMTciIGtweDI9IjYxIi8+PC9rZXJuaW5nPjwvZm9udC1tZXRyaWNzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb0JkLnR0ZiBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb0JkLnR0ZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmU2NTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vQmQudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb0JkLnhtbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb0JkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjMzMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvVmVyYU1vQmQueG1sCkBAIC0wLDAgKzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGZvbnQtbWV0cmljcyBtZXRyaWNzLXZlcnNpb249IjIiIHR5cGU9IlRZUEUwIj48Zm9udC1uYW1lPkJpdHN0cmVhbVZlcmFTYW5zTW9uby1Cb2xkPC9mb250LW5hbWU+PGZ1bGwtbmFtZT5CaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm8gQm9sZDwvZnVsbC1uYW1lPjxmYW1pbHktbmFtZT5CaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm88L2ZhbWlseS1uYW1lPjxlbWJlZC8+PGNhcC1oZWlnaHQ+NzI5PC9jYXAtaGVpZ2h0Pjx4LWhlaWdodD41NDY8L3gtaGVpZ2h0Pjxhc2NlbmRlcj43NTk8L2FzY2VuZGVyPjxkZXNjZW5kZXI+LTI0MDwvZGVzY2VuZGVyPjxiYm94PjxsZWZ0Pi0xOTwvbGVmdD48Ym90dG9tPi0yMzU8L2JvdHRvbT48cmlnaHQ+NjA1PC9yaWdodD48dG9wPjkyODwvdG9wPjwvYmJveD48ZmxhZ3M+MzQ8L2ZsYWdzPjxzdGVtdj4wPC9zdGVtdj48aXRhbGljYW5nbGU+MDwvaXRhbGljYW5nbGU+PHN1YnR5cGU+VFlQRTA8L3N1YnR5cGU+PG11bHRpYnl0ZS1leHRyYXM+PGNpZC10eXBlPkNJREZvbnRUeXBlMjwvY2lkLXR5cGU+PGRlZmF1bHQtd2lkdGg+MDwvZGVmYXVsdC13aWR0aD48YmZyYW5nZXM+PGJmIGdpPSIzIiB1ZT0iMTI2IiB1cz0iMzIiLz48YmYgZ2k9IjE3MiIgdWU9IjE2MCIgdXM9IjE2MCIvPjxiZiBnaT0iMTYzIiB1ZT0iMTYxIiB1cz0iMTYxIi8+PGJmIGdpPSIxMzIiIHVlPSIxNjMiIHVzPSIxNjIiLz48YmYgZ2k9IjE4OSIgdWU9IjE2NCIgdXM9IjE2NCIvPjxiZiBnaT0iMTUwIiB1ZT0iMTY1IiB1cz0iMTY1Ii8+PGJmIGdpPSIyMzEiIHVlPSIxNjYiIHVzPSIxNjYiLz48YmYgZ2k9IjEzNCIgdWU9IjE2NyIgdXM9IjE2NyIvPjxiZiBnaT0iMTQyIiB1ZT0iMTY4IiB1cz0iMTY4Ii8+PGJmIGdpPSIxMzkiIHVlPSIxNjkiIHVzPSIxNjkiLz48YmYgZ2k9IjE1NyIgdWU9IjE3MCIgdXM9IjE3MCIvPjxiZiBnaT0iMTY5IiB1ZT0iMTcxIiB1cz0iMTcxIi8+PGJmIGdpPSIxNjQiIHVlPSIxNzIiIHVzPSIxNzIiLz48YmYgZ2k9IjI1NiIgdWU9IjE3MyIgdXM9IjE3MyIvPjxiZiBnaT0iMTM4IiB1ZT0iMTc0IiB1cz0iMTc0Ii8+PGJmIGdpPSIyMTciIHVlPSIxNzUiIHVzPSIxNzUiLz48YmYgZ2k9IjEzMSIgdWU9IjE3NiIgdXM9IjE3NiIvPjxiZiBnaT0iMTQ3IiB1ZT0iMTc3IiB1cz0iMTc3Ii8+PGJmIGdpPSIyNDEiIHVlPSIxNzkiIHVzPSIxNzgiLz48YmYgZ2k9IjE0MSIgdWU9IjE4MCIgdXM9IjE4MCIvPjxiZiBnaT0iMTUxIiB1ZT0iMTgxIiB1cz0iMTgxIi8+PGJmIGdpPSIxMzYiIHVlPSIxODIiIHVzPSIxODIiLz48YmYgZ2k9IjE5NSIgdWU9IjE4MyIgdXM9IjE4MyIvPjxiZiBnaT0iMjIxIiB1ZT0iMTg0IiB1cz0iMTg0Ii8+PGJmIGdpPSIyNDAiIHVlPSIxODUiIHVzPSIxODUiLz48YmYgZ2k9IjE1OCIgdWU9IjE4NiIgdXM9IjE4NiIvPjxiZiBnaT0iMTcwIiB1ZT0iMTg3IiB1cz0iMTg3Ii8+PGJmIGdpPSIyNDMiIHVlPSIxOTAiIHVzPSIxODgiLz48YmYgZ2k9IjE2MiIgdWU9IjE5MSIgdXM9IjE5MSIvPjxiZiBnaT0iMTczIiB1ZT0iMTkyIiB1cz0iMTkyIi8+PGJmIGdpPSIyMDEiIHVlPSIxOTMiIHVzPSIxOTMiLz48YmYgZ2k9IjE5OSIgdWU9IjE5NCIgdXM9IjE5NCIvPjxiZiBnaT0iMTc0IiB1ZT0iMTk1IiB1cz0iMTk1Ii8+PGJmIGdpPSI5OCIgdWU9IjE5NyIgdXM9IjE5NiIvPjxiZiBnaT0iMTQ0IiB1ZT0iMTk4IiB1cz0iMTk4Ii8+PGJmIGdpPSIxMDAiIHVlPSIxOTkiIHVzPSIxOTkiLz48YmYgZ2k9IjIwMyIgdWU9IjIwMCIgdXM9IjIwMCIvPjxiZiBnaT0iMTAxIiB1ZT0iMjAxIiB1cz0iMjAxIi8+PGJmIGdpPSIyMDAiIHVlPSIyMDIiIHVzPSIyMDIiLz48YmYgZ2k9IjIwMiIgdWU9IjIwMyIgdXM9IjIwMyIvPjxiZiBnaT0iMjA3IiB1ZT0iMjA0IiB1cz0iMjA0Ii8+PGJmIGdpPSIyMDQiIHVlPSIyMDciIHVzPSIyMDUiLz48YmYgZ2k9IjIzMiIgdWU9IjIwOCIgdXM9IjIwOCIvPjxiZiBnaT0iMTAyIiB1ZT0iMjA5IiB1cz0iMjA5Ii8+PGJmIGdpPSIyMTAiIHVlPSIyMTAiIHVzPSIyMTAiLz48YmYgZ2k9IjIwOCIgdWU9IjIxMiIgdXM9IjIxMSIvPjxiZiBnaT0iMTc1IiB1ZT0iMjEzIiB1cz0iMjEzIi8+PGJmIGdpPSIxMDMiIHVlPSIyMTQiIHVzPSIyMTQiLz48YmYgZ2k9IjIzOSIgdWU9IjIxNSIgdXM9IjIxNSIvPjxiZiBnaT0iMTQ1IiB1ZT0iMjE2IiB1cz0iMjE2Ii8+PGJmIGdpPSIyMTMiIHVlPSIyMTciIHVzPSIyMTciLz48YmYgZ2k9IjIxMSIgdWU9IjIxOSIgdXM9IjIxOCIvPjxiZiBnaT0iMTA0IiB1ZT0iMjIwIiB1cz0iMjIwIi8+PGJmIGdpPSIyMzQiIHVlPSIyMjEiIHVzPSIyMjEiLz48YmYgZ2k9IjIzNiIgdWU9IjIyMiIgdXM9IjIyMiIvPjxiZiBnaT0iMTM3IiB1ZT0iMjIzIiB1cz0iMjIzIi8+PGJmIGdpPSIxMDYiIHVlPSIyMjQiIHVzPSIyMjQiLz48YmYgZ2k9IjEwNSIgdWU9IjIyNSIgdXM9IjIyNSIvPjxiZiBnaT0iMTA3IiB1ZT0iMjI2IiB1cz0iMjI2Ii8+PGJmIGdpPSIxMDkiIHVlPSIyMjciIHVzPSIyMjciLz48YmYgZ2k9IjEwOCIgdWU9IjIyOCIgdXM9IjIyOCIvPjxiZiBnaT0iMTEwIiB1ZT0iMjI5IiB1cz0iMjI5Ii8+PGJmIGdpPSIxNjAiIHVlPSIyMzAiIHVzPSIyMzAiLz48YmYgZ2k9IjExMSIgdWU9IjIzMSIgdXM9IjIzMSIvPjxiZiBnaT0iMTEzIiB1ZT0iMjMyIiB1cz0iMjMyIi8+PGJmIGdpPSIxMTIiIHVlPSIyMzMiIHVzPSIyMzMiLz48YmYgZ2k9IjExNCIgdWU9IjIzNSIgdXM9IjIzNCIvPjxiZiBnaT0iMTE3IiB1ZT0iMjM2IiB1cz0iMjM2Ii8+PGJmIGdpPSIxMTYiIHVlPSIyMzciIHVzPSIyMzciLz48YmYgZ2k9IjExOCIgdWU9IjIzOSIgdXM9IjIzOCIvPjxiZiBnaT0iMjMzIiB1ZT0iMjQwIiB1cz0iMjQwIi8+PGJmIGdpPSIxMjAiIHVlPSIyNDEiIHVzPSIyNDEiLz48YmYgZ2k9IjEyMiIgdWU9IjI0MiIgdXM9IjI0MiIvPjxiZiBnaT0iMTIxIiB1ZT0iMjQzIiB1cz0iMjQzIi8+PGJmIGdpPSIxMjMiIHVlPSIyNDQiIHVzPSIyNDQiLz48YmYgZ2k9IjEyNSIgdWU9IjI0NSIgdXM9IjI0NSIvPjxiZiBnaT0iMTI0IiB1ZT0iMjQ2IiB1cz0iMjQ2Ii8+PGJmIGdpPSIxODQiIHVlPSIyNDciIHVzPSIyNDciLz48YmYgZ2k9IjE2MSIgdWU9IjI0OCIgdXM9IjI0OCIvPjxiZiBnaT0iMTI3IiB1ZT0iMjQ5IiB1cz0iMjQ5Ii8+PGJmIGdpPSIxMjYiIHVlPSIyNTAiIHVzPSIyNTAiLz48YmYgZ2k9IjEyOCIgdWU9IjI1MiIgdXM9IjI1MSIvPjxiZiBnaT0iMjM1IiB1ZT0iMjUzIiB1cz0iMjUzIi8+PGJmIGdpPSIyMzciIHVlPSIyNTQiIHVzPSIyNTQiLz48YmYgZ2k9IjE4NiIgdWU9IjI1NSIgdXM9IjI1NSIvPjxiZiBnaT0iMjUxIiB1ZT0iMjYzIiB1cz0iMjYyIi8+PGJmIGdpPSIyNTMiIHVlPSIyNjkiIHVzPSIyNjgiLz48YmYgZ2k9IjAiIHVlPSIyNzAiIHVzPSIyNzAiLz48YmYgZ2k9IjAiIHVlPSIyNzEiIHVzPSIyNzEiLz48YmYgZ2k9IjAiIHVlPSIyNzIiIHVzPSIyNzIiLz48YmYgZ2k9IjI1NSIgdWU9IjI3MyIgdXM9IjI3MyIvPjxiZiBnaT0iMjQ2IiB1ZT0iMjg3IiB1cz0iMjg2Ii8+PGJmIGdpPSIyNDgiIHVlPSIzMDQiIHVzPSIzMDQiLz48YmYgZ2k9IjIxNCIgdWU9IjMwNSIgdXM9IjMwNSIvPjxiZiBnaT0iMjI1IiB1ZT0iMzIyIiB1cz0iMzIxIi8+PGJmIGdpPSIxNzYiIHVlPSIzMzkiIHVzPSIzMzgiLz48YmYgZ2k9IjI0OSIgdWU9IjM1MSIgdXM9IjM1MCIvPjxiZiBnaT0iMjI3IiB1ZT0iMzUzIiB1cz0iMzUyIi8+PGJmIGdpPSIxODciIHVlPSIzNzYiIHVzPSIzNzYiLz48YmYgZ2k9IjIyOSIgdWU9IjM4MiIgdXM9IjM4MSIvPjxiZiBnaT0iMTY2IiB1ZT0iNDAyIiB1cz0iNDAyIi8+PGJmIGdpPSIyMTUiIHVlPSI3MTAiIHVzPSI3MTAiLz48YmYgZ2k9IjIyNCIgdWU9IjcxMSIgdXM9IjcxMSIvPjxiZiBnaT0iMjE4IiB1ZT0iNzMwIiB1cz0iNzI4Ii8+PGJmIGdpPSIyMjMiIHVlPSI3MzEiIHVzPSI3MzEiLz48YmYgZ2k9IjIxNiIgdWU9IjczMiIgdXM9IjczMiIvPjxiZiBnaT0iMjIyIiB1ZT0iNzMzIiB1cz0iNzMzIi8+PGJmIGdpPSIxNTkiIHVlPSI5MzciIHVzPSI5MzciLz48YmYgZ2k9IjE1NSIgdWU9Ijk2MCIgdXM9Ijk2MCIvPjxiZiBnaT0iMTc4IiB1ZT0iODIxMiIgdXM9IjgyMTEiLz48YmYgZ2k9IjAiIHVlPSI4MjEzIiB1cz0iODIxMyIvPjxiZiBnaT0iMCIgdWU9IjgyMTQiIHVzPSI4MjE0Ii8+PGJmIGdpPSIwIiB1ZT0iODIxNSIgdXM9IjgyMTUiLz48YmYgZ2k9IjE4MiIgdWU9IjgyMTciIHVzPSI4MjE2Ii8+PGJmIGdpPSIxOTYiIHVlPSI4MjE4IiB1cz0iODIxOCIvPjxiZiBnaT0iMCIgdWU9IjgyMTkiIHVzPSI4MjE5Ii8+PGJmIGdpPSIxODAiIHVlPSI4MjIxIiB1cz0iODIyMCIvPjxiZiBnaT0iMTk3IiB1ZT0iODIyMiIgdXM9IjgyMjIiLz48YmYgZ2k9IjAiIHVlPSI4MjIzIiB1cz0iODIyMyIvPjxiZiBnaT0iMTMwIiB1ZT0iODIyNCIgdXM9IjgyMjQiLz48YmYgZ2k9IjE5NCIgdWU9IjgyMjUiIHVzPSI4MjI1Ii8+PGJmIGdpPSIxMzUiIHVlPSI4MjI2IiB1cz0iODIyNiIvPjxiZiBnaT0iMCIgdWU9IjgyMjciIHVzPSI4MjI3Ii8+PGJmIGdpPSIwIiB1ZT0iODIyOCIgdXM9IjgyMjgiLz48YmYgZ2k9IjAiIHVlPSI4MjI5IiB1cz0iODIyOSIvPjxiZiBnaT0iMTcxIiB1ZT0iODIzMCIgdXM9IjgyMzAiLz48YmYgZ2k9IjE5OCIgdWU9IjgyNDAiIHVzPSI4MjQwIi8+PGJmIGdpPSIxOTAiIHVlPSI4MjUwIiB1cz0iODI0OSIvPjxiZiBnaT0iMjU4IiB1ZT0iODM2NCIgdXM9IjgzNjQiLz48YmYgZ2k9IjE0MCIgdWU9Ijg0ODIiIHVzPSI4NDgyIi8+PGJmIGdpPSIxNTIiIHVlPSI4NzA2IiB1cz0iODcwNiIvPjxiZiBnaT0iMCIgdWU9Ijg3MDciIHVzPSI4NzA3Ii8+PGJmIGdpPSIwIiB1ZT0iODcwOCIgdXM9Ijg3MDgiLz48YmYgZ2k9IjAiIHVlPSI4NzA5IiB1cz0iODcwOSIvPjxiZiBnaT0iMTY4IiB1ZT0iODcxMCIgdXM9Ijg3MTAiLz48YmYgZ2k9IjE1NCIgdWU9Ijg3MTkiIHVzPSI4NzE5Ii8+PGJmIGdpPSIwIiB1ZT0iODcyMCIgdXM9Ijg3MjAiLz48YmYgZ2k9IjE1MyIgdWU9Ijg3MjEiIHVzPSI4NzIxIi8+PGJmIGdpPSIyMzgiIHVlPSI4NzIyIiB1cz0iODcyMiIvPjxiZiBnaT0iMCIgdWU9Ijg3MjMiIHVzPSI4NzIzIi8+PGJmIGdpPSIwIiB1ZT0iODcyNCIgdXM9Ijg3MjQiLz48YmYgZ2k9IjE4OCIgdWU9Ijg3MjUiIHVzPSI4NzI1Ii8+PGJmIGdpPSIwIiB1ZT0iODcyNiIgdXM9Ijg3MjYiLz48YmYgZ2k9IjAiIHVlPSI4NzI3IiB1cz0iODcyNyIvPjxiZiBnaT0iMCIgdWU9Ijg3MjgiIHVzPSI4NzI4Ii8+PGJmIGdpPSIyNTciIHVlPSI4NzI5IiB1cz0iODcyOSIvPjxiZiBnaT0iMTY1IiB1ZT0iODczMCIgdXM9Ijg3MzAiLz48YmYgZ2k9IjAiIHVlPSI4NzMxIiB1cz0iODczMSIvPjxiZiBnaT0iMCIgdWU9Ijg3MzIiIHVzPSI4NzMyIi8+PGJmIGdpPSIwIiB1ZT0iODczMyIgdXM9Ijg3MzMiLz48YmYgZ2k9IjE0NiIgdWU9Ijg3MzQiIHVzPSI4NzM0Ii8+PGJmIGdpPSIxNTYiIHVlPSI4NzQ3IiB1cz0iODc0NyIvPjxiZiBnaT0iMTY3IiB1ZT0iODc3NiIgdXM9Ijg3NzYiLz48YmYgZ2k9IjE0MyIgdWU9Ijg4MDAiIHVzPSI4ODAwIi8+PGJmIGdpPSIwIiB1ZT0iODgwMSIgdXM9Ijg4MDEiLz48YmYgZ2k9IjAiIHVlPSI4ODAyIiB1cz0iODgwMiIvPjxiZiBnaT0iMCIgdWU9Ijg4MDMiIHVzPSI4ODAzIi8+PGJmIGdpPSIxNDgiIHVlPSI4ODA1IiB1cz0iODgwNCIvPjxiZiBnaT0iMTg1IiB1ZT0iOTY3NCIgdXM9Ijk2NzQiLz48YmYgZ2k9IjE5MiIgdWU9IjY0MjU4IiB1cz0iNjQyNTciLz48YmYgZ2k9IjAiIHVlPSI2NTUzNSIgdXM9IjY1NTM1Ii8+PC9iZnJhbmdlcz48Y2lkLXdpZHRocyBzdGFydC1pbmRleD0iMCI+PHd4IHc9IjYwMiIvPjx3eCB3PSIwIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PC9jaWQtd2lkdGhzPjwvbXVsdGlieXRlLWV4dHJhcz48L2ZvbnQtbWV0cmljcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhTW9uby50dGYgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhTW9uby50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5ZjBiNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb25vLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhTW9uby54bWwgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9WZXJhTW9uby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EwYTg2NgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL1ZlcmFNb25vLnhtbApAQCAtMCwwICsxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxmb250LW1ldHJpY3MgbWV0cmljcy12ZXJzaW9uPSIyIiB0eXBlPSJUWVBFMCI+PGZvbnQtbmFtZT5CaXRzdHJlYW1WZXJhU2Fuc01vbm8tUm9tYW48L2ZvbnQtbmFtZT48ZnVsbC1uYW1lPkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubzwvZnVsbC1uYW1lPjxmYW1pbHktbmFtZT5CaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm88L2ZhbWlseS1uYW1lPjxlbWJlZC8+PGNhcC1oZWlnaHQ+NzI5PC9jYXAtaGVpZ2h0Pjx4LWhlaWdodD41NDY8L3gtaGVpZ2h0Pjxhc2NlbmRlcj43NTk8L2FzY2VuZGVyPjxkZXNjZW5kZXI+LTI0MDwvZGVzY2VuZGVyPjxiYm94PjxsZWZ0Pi00PC9sZWZ0Pjxib3R0b20+LTIzNTwvYm90dG9tPjxyaWdodD42MDU8L3JpZ2h0Pjx0b3A+OTI4PC90b3A+PC9iYm94PjxmbGFncz4zNDwvZmxhZ3M+PHN0ZW12PjA8L3N0ZW12PjxpdGFsaWNhbmdsZT4wPC9pdGFsaWNhbmdsZT48c3VidHlwZT5UWVBFMDwvc3VidHlwZT48bXVsdGlieXRlLWV4dHJhcz48Y2lkLXR5cGU+Q0lERm9udFR5cGUyPC9jaWQtdHlwZT48ZGVmYXVsdC13aWR0aD4wPC9kZWZhdWx0LXdpZHRoPjxiZnJhbmdlcz48YmYgZ2k9IjMiIHVlPSIxMjYiIHVzPSIzMiIvPjxiZiBnaT0iMTcyIiB1ZT0iMTYwIiB1cz0iMTYwIi8+PGJmIGdpPSIxNjMiIHVlPSIxNjEiIHVzPSIxNjEiLz48YmYgZ2k9IjEzMiIgdWU9IjE2MyIgdXM9IjE2MiIvPjxiZiBnaT0iMTg5IiB1ZT0iMTY0IiB1cz0iMTY0Ii8+PGJmIGdpPSIxNTAiIHVlPSIxNjUiIHVzPSIxNjUiLz48YmYgZ2k9IjIzMSIgdWU9IjE2NiIgdXM9IjE2NiIvPjxiZiBnaT0iMTM0IiB1ZT0iMTY3IiB1cz0iMTY3Ii8+PGJmIGdpPSIxNDIiIHVlPSIxNjgiIHVzPSIxNjgiLz48YmYgZ2k9IjEzOSIgdWU9IjE2OSIgdXM9IjE2OSIvPjxiZiBnaT0iMTU3IiB1ZT0iMTcwIiB1cz0iMTcwIi8+PGJmIGdpPSIxNjkiIHVlPSIxNzEiIHVzPSIxNzEiLz48YmYgZ2k9IjE2NCIgdWU9IjE3MiIgdXM9IjE3MiIvPjxiZiBnaT0iMjU2IiB1ZT0iMTczIiB1cz0iMTczIi8+PGJmIGdpPSIxMzgiIHVlPSIxNzQiIHVzPSIxNzQiLz48YmYgZ2k9IjIxNyIgdWU9IjE3NSIgdXM9IjE3NSIvPjxiZiBnaT0iMTMxIiB1ZT0iMTc2IiB1cz0iMTc2Ii8+PGJmIGdpPSIxNDciIHVlPSIxNzciIHVzPSIxNzciLz48YmYgZ2k9IjI0MSIgdWU9IjE3OSIgdXM9IjE3OCIvPjxiZiBnaT0iMTQxIiB1ZT0iMTgwIiB1cz0iMTgwIi8+PGJmIGdpPSIxNTEiIHVlPSIxODEiIHVzPSIxODEiLz48YmYgZ2k9IjEzNiIgdWU9IjE4MiIgdXM9IjE4MiIvPjxiZiBnaT0iMTk1IiB1ZT0iMTgzIiB1cz0iMTgzIi8+PGJmIGdpPSIyMjEiIHVlPSIxODQiIHVzPSIxODQiLz48YmYgZ2k9IjI0MCIgdWU9IjE4NSIgdXM9IjE4NSIvPjxiZiBnaT0iMTU4IiB1ZT0iMTg2IiB1cz0iMTg2Ii8+PGJmIGdpPSIxNzAiIHVlPSIxODciIHVzPSIxODciLz48YmYgZ2k9IjI0MyIgdWU9IjE5MCIgdXM9IjE4OCIvPjxiZiBnaT0iMTYyIiB1ZT0iMTkxIiB1cz0iMTkxIi8+PGJmIGdpPSIxNzMiIHVlPSIxOTIiIHVzPSIxOTIiLz48YmYgZ2k9IjIwMSIgdWU9IjE5MyIgdXM9IjE5MyIvPjxiZiBnaT0iMTk5IiB1ZT0iMTk0IiB1cz0iMTk0Ii8+PGJmIGdpPSIxNzQiIHVlPSIxOTUiIHVzPSIxOTUiLz48YmYgZ2k9Ijk4IiB1ZT0iMTk3IiB1cz0iMTk2Ii8+PGJmIGdpPSIxNDQiIHVlPSIxOTgiIHVzPSIxOTgiLz48YmYgZ2k9IjEwMCIgdWU9IjE5OSIgdXM9IjE5OSIvPjxiZiBnaT0iMjAzIiB1ZT0iMjAwIiB1cz0iMjAwIi8+PGJmIGdpPSIxMDEiIHVlPSIyMDEiIHVzPSIyMDEiLz48YmYgZ2k9IjIwMCIgdWU9IjIwMiIgdXM9IjIwMiIvPjxiZiBnaT0iMjAyIiB1ZT0iMjAzIiB1cz0iMjAzIi8+PGJmIGdpPSIyMDciIHVlPSIyMDQiIHVzPSIyMDQiLz48YmYgZ2k9IjIwNCIgdWU9IjIwNyIgdXM9IjIwNSIvPjxiZiBnaT0iMjMyIiB1ZT0iMjA4IiB1cz0iMjA4Ii8+PGJmIGdpPSIxMDIiIHVlPSIyMDkiIHVzPSIyMDkiLz48YmYgZ2k9IjIxMCIgdWU9IjIxMCIgdXM9IjIxMCIvPjxiZiBnaT0iMjA4IiB1ZT0iMjEyIiB1cz0iMjExIi8+PGJmIGdpPSIxNzUiIHVlPSIyMTMiIHVzPSIyMTMiLz48YmYgZ2k9IjEwMyIgdWU9IjIxNCIgdXM9IjIxNCIvPjxiZiBnaT0iMjM5IiB1ZT0iMjE1IiB1cz0iMjE1Ii8+PGJmIGdpPSIxNDUiIHVlPSIyMTYiIHVzPSIyMTYiLz48YmYgZ2k9IjIxMyIgdWU9IjIxNyIgdXM9IjIxNyIvPjxiZiBnaT0iMjExIiB1ZT0iMjE5IiB1cz0iMjE4Ii8+PGJmIGdpPSIxMDQiIHVlPSIyMjAiIHVzPSIyMjAiLz48YmYgZ2k9IjIzNCIgdWU9IjIyMSIgdXM9IjIyMSIvPjxiZiBnaT0iMjM2IiB1ZT0iMjIyIiB1cz0iMjIyIi8+PGJmIGdpPSIxMzciIHVlPSIyMjMiIHVzPSIyMjMiLz48YmYgZ2k9IjEwNiIgdWU9IjIyNCIgdXM9IjIyNCIvPjxiZiBnaT0iMTA1IiB1ZT0iMjI1IiB1cz0iMjI1Ii8+PGJmIGdpPSIxMDciIHVlPSIyMjYiIHVzPSIyMjYiLz48YmYgZ2k9IjEwOSIgdWU9IjIyNyIgdXM9IjIyNyIvPjxiZiBnaT0iMTA4IiB1ZT0iMjI4IiB1cz0iMjI4Ii8+PGJmIGdpPSIxMTAiIHVlPSIyMjkiIHVzPSIyMjkiLz48YmYgZ2k9IjE2MCIgdWU9IjIzMCIgdXM9IjIzMCIvPjxiZiBnaT0iMTExIiB1ZT0iMjMxIiB1cz0iMjMxIi8+PGJmIGdpPSIxMTMiIHVlPSIyMzIiIHVzPSIyMzIiLz48YmYgZ2k9IjExMiIgdWU9IjIzMyIgdXM9IjIzMyIvPjxiZiBnaT0iMTE0IiB1ZT0iMjM1IiB1cz0iMjM0Ii8+PGJmIGdpPSIxMTciIHVlPSIyMzYiIHVzPSIyMzYiLz48YmYgZ2k9IjExNiIgdWU9IjIzNyIgdXM9IjIzNyIvPjxiZiBnaT0iMTE4IiB1ZT0iMjM5IiB1cz0iMjM4Ii8+PGJmIGdpPSIyMzMiIHVlPSIyNDAiIHVzPSIyNDAiLz48YmYgZ2k9IjEyMCIgdWU9IjI0MSIgdXM9IjI0MSIvPjxiZiBnaT0iMTIyIiB1ZT0iMjQyIiB1cz0iMjQyIi8+PGJmIGdpPSIxMjEiIHVlPSIyNDMiIHVzPSIyNDMiLz48YmYgZ2k9IjEyMyIgdWU9IjI0NCIgdXM9IjI0NCIvPjxiZiBnaT0iMTI1IiB1ZT0iMjQ1IiB1cz0iMjQ1Ii8+PGJmIGdpPSIxMjQiIHVlPSIyNDYiIHVzPSIyNDYiLz48YmYgZ2k9IjE4NCIgdWU9IjI0NyIgdXM9IjI0NyIvPjxiZiBnaT0iMTYxIiB1ZT0iMjQ4IiB1cz0iMjQ4Ii8+PGJmIGdpPSIxMjciIHVlPSIyNDkiIHVzPSIyNDkiLz48YmYgZ2k9IjEyNiIgdWU9IjI1MCIgdXM9IjI1MCIvPjxiZiBnaT0iMTI4IiB1ZT0iMjUyIiB1cz0iMjUxIi8+PGJmIGdpPSIyMzUiIHVlPSIyNTMiIHVzPSIyNTMiLz48YmYgZ2k9IjIzNyIgdWU9IjI1NCIgdXM9IjI1NCIvPjxiZiBnaT0iMTg2IiB1ZT0iMjU1IiB1cz0iMjU1Ii8+PGJmIGdpPSIyNTEiIHVlPSIyNjMiIHVzPSIyNjIiLz48YmYgZ2k9IjI1MyIgdWU9IjI2OSIgdXM9IjI2OCIvPjxiZiBnaT0iMCIgdWU9IjI3MCIgdXM9IjI3MCIvPjxiZiBnaT0iMCIgdWU9IjI3MSIgdXM9IjI3MSIvPjxiZiBnaT0iMCIgdWU9IjI3MiIgdXM9IjI3MiIvPjxiZiBnaT0iMjU1IiB1ZT0iMjczIiB1cz0iMjczIi8+PGJmIGdpPSIyNDYiIHVlPSIyODciIHVzPSIyODYiLz48YmYgZ2k9IjI0OCIgdWU9IjMwNCIgdXM9IjMwNCIvPjxiZiBnaT0iMjE0IiB1ZT0iMzA1IiB1cz0iMzA1Ii8+PGJmIGdpPSIyMjUiIHVlPSIzMjIiIHVzPSIzMjEiLz48YmYgZ2k9IjE3NiIgdWU9IjMzOSIgdXM9IjMzOCIvPjxiZiBnaT0iMjQ5IiB1ZT0iMzUxIiB1cz0iMzUwIi8+PGJmIGdpPSIyMjciIHVlPSIzNTMiIHVzPSIzNTIiLz48YmYgZ2k9IjE4NyIgdWU9IjM3NiIgdXM9IjM3NiIvPjxiZiBnaT0iMjI5IiB1ZT0iMzgyIiB1cz0iMzgxIi8+PGJmIGdpPSIxNjYiIHVlPSI0MDIiIHVzPSI0MDIiLz48YmYgZ2k9IjIxNSIgdWU9IjcxMCIgdXM9IjcxMCIvPjxiZiBnaT0iMjI0IiB1ZT0iNzExIiB1cz0iNzExIi8+PGJmIGdpPSIyMTgiIHVlPSI3MzAiIHVzPSI3MjgiLz48YmYgZ2k9IjIyMyIgdWU9IjczMSIgdXM9IjczMSIvPjxiZiBnaT0iMjE2IiB1ZT0iNzMyIiB1cz0iNzMyIi8+PGJmIGdpPSIyMjIiIHVlPSI3MzMiIHVzPSI3MzMiLz48YmYgZ2k9IjE1OSIgdWU9IjkzNyIgdXM9IjkzNyIvPjxiZiBnaT0iMTU1IiB1ZT0iOTYwIiB1cz0iOTYwIi8+PGJmIGdpPSIxNzgiIHVlPSI4MjEyIiB1cz0iODIxMSIvPjxiZiBnaT0iMCIgdWU9IjgyMTMiIHVzPSI4MjEzIi8+PGJmIGdpPSIwIiB1ZT0iODIxNCIgdXM9IjgyMTQiLz48YmYgZ2k9IjAiIHVlPSI4MjE1IiB1cz0iODIxNSIvPjxiZiBnaT0iMTgyIiB1ZT0iODIxNyIgdXM9IjgyMTYiLz48YmYgZ2k9IjE5NiIgdWU9IjgyMTgiIHVzPSI4MjE4Ii8+PGJmIGdpPSIwIiB1ZT0iODIxOSIgdXM9IjgyMTkiLz48YmYgZ2k9IjE4MCIgdWU9IjgyMjEiIHVzPSI4MjIwIi8+PGJmIGdpPSIxOTciIHVlPSI4MjIyIiB1cz0iODIyMiIvPjxiZiBnaT0iMCIgdWU9IjgyMjMiIHVzPSI4MjIzIi8+PGJmIGdpPSIxMzAiIHVlPSI4MjI0IiB1cz0iODIyNCIvPjxiZiBnaT0iMTk0IiB1ZT0iODIyNSIgdXM9IjgyMjUiLz48YmYgZ2k9IjEzNSIgdWU9IjgyMjYiIHVzPSI4MjI2Ii8+PGJmIGdpPSIwIiB1ZT0iODIyNyIgdXM9IjgyMjciLz48YmYgZ2k9IjAiIHVlPSI4MjI4IiB1cz0iODIyOCIvPjxiZiBnaT0iMCIgdWU9IjgyMjkiIHVzPSI4MjI5Ii8+PGJmIGdpPSIxNzEiIHVlPSI4MjMwIiB1cz0iODIzMCIvPjxiZiBnaT0iMTk4IiB1ZT0iODI0MCIgdXM9IjgyNDAiLz48YmYgZ2k9IjE5MCIgdWU9IjgyNTAiIHVzPSI4MjQ5Ii8+PGJmIGdpPSIyNTgiIHVlPSI4MzY0IiB1cz0iODM2NCIvPjxiZiBnaT0iMTQwIiB1ZT0iODQ4MiIgdXM9Ijg0ODIiLz48YmYgZ2k9IjE1MiIgdWU9Ijg3MDYiIHVzPSI4NzA2Ii8+PGJmIGdpPSIwIiB1ZT0iODcwNyIgdXM9Ijg3MDciLz48YmYgZ2k9IjAiIHVlPSI4NzA4IiB1cz0iODcwOCIvPjxiZiBnaT0iMCIgdWU9Ijg3MDkiIHVzPSI4NzA5Ii8+PGJmIGdpPSIxNjgiIHVlPSI4NzEwIiB1cz0iODcxMCIvPjxiZiBnaT0iMTU0IiB1ZT0iODcxOSIgdXM9Ijg3MTkiLz48YmYgZ2k9IjAiIHVlPSI4NzIwIiB1cz0iODcyMCIvPjxiZiBnaT0iMTUzIiB1ZT0iODcyMSIgdXM9Ijg3MjEiLz48YmYgZ2k9IjIzOCIgdWU9Ijg3MjIiIHVzPSI4NzIyIi8+PGJmIGdpPSIwIiB1ZT0iODcyMyIgdXM9Ijg3MjMiLz48YmYgZ2k9IjAiIHVlPSI4NzI0IiB1cz0iODcyNCIvPjxiZiBnaT0iMTg4IiB1ZT0iODcyNSIgdXM9Ijg3MjUiLz48YmYgZ2k9IjAiIHVlPSI4NzI2IiB1cz0iODcyNiIvPjxiZiBnaT0iMCIgdWU9Ijg3MjciIHVzPSI4NzI3Ii8+PGJmIGdpPSIwIiB1ZT0iODcyOCIgdXM9Ijg3MjgiLz48YmYgZ2k9IjI1NyIgdWU9Ijg3MjkiIHVzPSI4NzI5Ii8+PGJmIGdpPSIxNjUiIHVlPSI4NzMwIiB1cz0iODczMCIvPjxiZiBnaT0iMCIgdWU9Ijg3MzEiIHVzPSI4NzMxIi8+PGJmIGdpPSIwIiB1ZT0iODczMiIgdXM9Ijg3MzIiLz48YmYgZ2k9IjAiIHVlPSI4NzMzIiB1cz0iODczMyIvPjxiZiBnaT0iMTQ2IiB1ZT0iODczNCIgdXM9Ijg3MzQiLz48YmYgZ2k9IjE1NiIgdWU9Ijg3NDciIHVzPSI4NzQ3Ii8+PGJmIGdpPSIxNjciIHVlPSI4Nzc2IiB1cz0iODc3NiIvPjxiZiBnaT0iMTQzIiB1ZT0iODgwMCIgdXM9Ijg4MDAiLz48YmYgZ2k9IjAiIHVlPSI4ODAxIiB1cz0iODgwMSIvPjxiZiBnaT0iMCIgdWU9Ijg4MDIiIHVzPSI4ODAyIi8+PGJmIGdpPSIwIiB1ZT0iODgwMyIgdXM9Ijg4MDMiLz48YmYgZ2k9IjE0OCIgdWU9Ijg4MDUiIHVzPSI4ODA0Ii8+PGJmIGdpPSIxODUiIHVlPSI5Njc0IiB1cz0iOTY3NCIvPjxiZiBnaT0iMTkyIiB1ZT0iNjQyNTgiIHVzPSI2NDI1NyIvPjxiZiBnaT0iMCIgdWU9IjY1NTM1IiB1cz0iNjU1MzUiLz48L2JmcmFuZ2VzPjxjaWQtd2lkdGhzIHN0YXJ0LWluZGV4PSIwIj48d3ggdz0iNjAyIi8+PHd4IHc9IjAiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48d3ggdz0iNjAyIi8+PHd4IHc9IjYwMiIvPjx3eCB3PSI2MDIiLz48L2NpZC13aWR0aHM+PC9tdWx0aWJ5dGUtZXh0cmFzPjwvZm9udC1tZXRyaWNzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2NvbXBvbmVudC50aXRsZS54c2wgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9jb21wb25lbnQudGl0bGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWYwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9jb21wb25lbnQudGl0bGUueHNsCkBAIC0wLDAgKzEsMzkgQEAKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB4bWxuczpkPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJkIj4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iY29tcG9uZW50LnRpdGxlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iLiIvPgorICAgIAorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWwiPgorICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJhbmNlc3Rvcjo6ZDpzZWN0aW9uIj4KKyAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoYW5jZXN0b3I6OmQ6c2VjdGlvbikrMSIvPgorICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iYW5jZXN0b3I6OmQ6c2VjdDUiPjY8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iYW5jZXN0b3I6OmQ6c2VjdDQiPjU8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iYW5jZXN0b3I6OmQ6c2VjdDMiPjQ8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iYW5jZXN0b3I6OmQ6c2VjdDIiPjM8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iYW5jZXN0b3I6OmQ6c2VjdDEiPjI8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4xPC94c2w6b3RoZXJ3aXNlPgorICAgICAgPC94c2w6Y2hvb3NlPgorICAgIDwveHNsOnZhcmlhYmxlPgorICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJoeyRsZXZlbCsxfSIgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj50aXRsZTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgIDx4c2w6aWYgdGVzdD0iJGdlbmVyYXRlLmlkLmF0dHJpYnV0ZXMgPSAwIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFuY2hvciI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJG5vZGUiLz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uZGl0aW9uYWwiIHNlbGVjdD0iMCIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgPC94c2w6aWY+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRub2RlIiBtb2RlPSJvYmplY3QudGl0bGUubWFya3VwIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImFsbG93LWFuY2hvcnMiIHNlbGVjdD0iMSIvPgorICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBlcm1hbGluayI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRub2RlIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwveHNsOmVsZW1lbnQ+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RiLXBkZi54c2wgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9kYi1wZGYueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDA2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9kYi1wZGYueHNsCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIgdmVyc2lvbj0iMS4wIj4KKyAgCisgIDx4c2w6aW1wb3J0IGhyZWY9Imh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC9jdXJyZW50L2ZvL2RvY2Jvb2sueHNsIiAvPgorCisgIDwhLS0gY2hlY2sgcHJvamVjdC1wbGFuLnNoIGZvciBob3cgdGhpcyBpcyBnZW5lcmF0ZWQsIG5lZWRlZCB0byB0d2VhayAKKyAgICAgICB0aGUgY292ZXIgcGFnZSAgICAgCisgICAgLS0+CisgIDx4c2w6aW5jbHVkZSBocmVmPSIvdG1wL3RpdGxlcGFnZS54c2wiLz4gCisKKyAgPCEtLSBUbyBmb3JjZSBhIHBhZ2UgYnJlYWsgaW4gZG9jdW1lbnQsIGkuZSBwZXIgc2VjdGlvbiBhZGQgYSAKKyAgICAgIDw/aGFyZC1wYWdlYnJlYWs/PiB0YWcuCisgIC0tPgorIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb2Nlc3NpbmctaW5zdHJ1Y3Rpb24oJ2hhcmQtcGFnZWJyZWFrJykiPgorICAgPGZvOmJsb2NrIGJyZWFrLWJlZm9yZT0ncGFnZScgLz4KKyA8L3hzbDp0ZW1wbGF0ZT4KKworICA8IS0tRml4IGZvciBkZWZ1YWx0IGluZGVudCBnZXR0aW5nIFRPQyBhbGwgd2llcmQuLgorICAgICAgU2VlIGh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vbWwvZG9jYm9vay1hcHBzLzIwMDUtcTEvbXNnMDA0NTUuaHRtbCAKKyAgICAgIEZJWE1FOiBtdXN0IGJlIGEgYmV0dGVyIGZpeAorICAgIC0tPgorICA8eHNsOnBhcmFtIG5hbWU9ImJvZHkuc3RhcnQuaW5kZW50IiBzZWxlY3Q9IicwJyIvPgorICA8IS0tPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZS5tYXJnaW4ubGVmdCIgc2VsZWN0PSInMCciLz4tLT4KKworICA8IS0tIHN0b3AgbG9uZy1pc2ggaGVhZGVyIHRpdGxlcyBnZXR0aW5nIHdyYXBwZWQgLS0+CisgIDx4c2w6cGFyYW0gbmFtZT0iaGVhZGVyLmNvbHVtbi53aWR0aHMiPjEgMTAgMTwveHNsOnBhcmFtPgorCisgIDwhLS0gY3VzdG9taXNlIGhlYWRlcnMgYW5kIGZvb3RlcnMgYSBsaXR0bGUgLS0+IAorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iaGVhZC5zZXAucnVsZSI+CisgICA8eHNsOmlmIHRlc3Q9IiRoZWFkZXIucnVsZSAhPSAwIj4KKyAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCI+MC41cHQ8L3hzbDphdHRyaWJ1dGU+CisgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJvcmRlci1ib3R0b20tc3R5bGUiPnNvbGlkPC94c2w6YXR0cmlidXRlPgorICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItYm90dG9tLWNvbG9yIj4jY2NjY2NjPC94c2w6YXR0cmlidXRlPgorICAgPC94c2w6aWY+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZm9vdC5zZXAucnVsZSI+CisgICAgPHhzbDppZiB0ZXN0PSIkZm9vdGVyLnJ1bGUgIT0gMCI+CisgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJvcmRlci10b3Atd2lkdGgiPjAuNXB0PC94c2w6YXR0cmlidXRlPgorICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJib3JkZXItdG9wLXN0eWxlIj5zb2xpZDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYm9yZGVyLXRvcC1jb2xvciI+I2NjY2NjYzwveHNsOmF0dHJpYnV0ZT4KKyAgICA8L3hzbDppZj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDphdHRyaWJ1dGUtc2V0IG5hbWU9ImhlYWRlci5jb250ZW50LnByb3BlcnRpZXMiPgorICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbG9yIj4jY2NjY2NjPC94c2w6YXR0cmlidXRlPgorICA8L3hzbDphdHRyaWJ1dGUtc2V0PgorCisgIDx4c2w6YXR0cmlidXRlLXNldCBuYW1lPSJmb290ZXIuY29udGVudC5wcm9wZXJ0aWVzIj4KKyAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xvciI+I2NjY2NjYzwveHNsOmF0dHJpYnV0ZT4KKyAgPC94c2w6YXR0cmlidXRlLXNldD4KKworIAorICA8IS0tIGdlbmVyYWwgc2V0dGluZ3MgLS0+CisKKyAgPHhzbDpwYXJhbSBuYW1lPSJmb3AxLmV4dGVuc2lvbnMiIHNlbGVjdD0iMSI+PC94c2w6cGFyYW0+CisgIDx4c2w6cGFyYW0gbmFtZT0icGFwZXIudHlwZSIgc2VsZWN0PSInQTQnIj48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJzZWN0aW9uLmF1dG9sYWJlbCIgc2VsZWN0PSIxIj48L3hzbDpwYXJhbT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJib2R5LmZvbnQuZmFtaWx5IiBzZWxlY3Q9Iid2ZXJhc2FucyciPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9InRpdGxlLmZvbnQuZmFtaWx5IiBzZWxlY3Q9Iid2ZXJhc2FucyciPjwveHNsOnBhcmFtPgorICA8eHNsOnBhcmFtIG5hbWU9Im1vbm9zcGFjZS5mb250LmZhbWlseSIgc2VsZWN0PSIndmVyYW1vbm8nIj48L3hzbDpwYXJhbT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RpdmlzaW9uLnRpdGxlLnhzbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RpdmlzaW9uLnRpdGxlLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzg0M2JjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZGl2aXNpb24udGl0bGUueHNsCkBAIC0wLDAgKzEsMjUgQEAKKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB4bWxuczpkPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJkIj4KKyAgCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGl2aXNpb24udGl0bGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIuIi8+CisgICAgCisgICAgPGgxPgorICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPnRpdGxlPC94c2w6YXR0cmlidXRlPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFuY2hvciI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRub2RlIi8+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25kaXRpb25hbCIgc2VsZWN0PSIwIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkbm9kZSIgbW9kZT0ib2JqZWN0LnRpdGxlLm1hcmt1cCI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJhbGxvdy1hbmNob3JzIiBzZWxlY3Q9IjEiLz4KKyAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwZXJtYWxpbmsiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIkbm9kZSIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L2gxPgorICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RyYWZ0LnBuZyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2RyYWZ0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA1MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZHJhZnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL2ZvcC1jb25maWcueG1sIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZm9wLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljYzVjYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2ZvcC1jb25maWcueG1sCkBAIC0wLDAgKzEsNTggQEAKKzxmb3AgdmVyc2lvbj0iMS4wIj4KKworICA8IS0tIFN0cmljdCB1c2VyIGNvbmZpZ3VyYXRpb24gLS0+CisgIDxzdHJpY3QtY29uZmlndXJhdGlvbj50cnVlPC9zdHJpY3QtY29uZmlndXJhdGlvbj4KKworICA8IS0tIFN0cmljdCBGTyB2YWxpZGF0aW9uIC0tPgorICA8c3RyaWN0LXZhbGlkYXRpb24+dHJ1ZTwvc3RyaWN0LXZhbGlkYXRpb24+CisKKyAgIDwhLS0KKyAgICBTZXQgdGhlIGJhc2VEaXIgc28gY29tbW9uL29wZW5lZGhhbmQuc3ZnIHJlZmVyZW5jZXMgaW4gcGxhbnMgc3RpbGwKKyAgICB3b3JrIG9rLiBOb3RlLCByZWxhdGl2ZSBmaWxlIHJlZmVyZW5jZXMgdG8gY3VycmVudCBkaXIgc2hvdWxkIHN0aWxsIHdvcmsuCisgICAgLS0+CQorICA8YmFzZT4uLi90ZW1wbGF0ZTwvYmFzZT4KKyAgPGZvbnQtYmFzZT4uLi90ZW1wbGF0ZTwvZm9udC1iYXNlPgorIAorICA8IS0tIFNvdXJjZSByZXNvbHV0aW9uIGluIGRwaSAoZG90cy9waXhlbHMgcGVyIGluY2gpIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgICBzaXplIG9mIHBpeGVscyBpbiBTVkcgYW5kIGJpdG1hcCBpbWFnZXMsIGRlZmF1bHQ6IDcyZHBpIC0tPgorICA8IS0tIDxzb3VyY2UtcmVzb2x1dGlvbj43Mjwvc291cmNlLXJlc29sdXRpb24+IC0tPgorICA8IS0tIFRhcmdldCByZXNvbHV0aW9uIGluIGRwaSAoZG90cy9waXhlbHMgcGVyIGluY2gpIGZvciBzcGVjaWZ5aW5nIHRoZQorICAgICAgIHRhcmdldCByZXNvbHV0aW9uIGZvciBnZW5lcmF0ZWQgYml0bWFwcywgZGVmYXVsdDogNzJkcGkgLS0+CisgIDwhLS0gPHRhcmdldC1yZXNvbHV0aW9uPjcyPC90YXJnZXQtcmVzb2x1dGlvbj4gLS0+CisgCisgIDwhLS0gZGVmYXVsdCBwYWdlLWhlaWdodCBhbmQgcGFnZS13aWR0aCwgaW4gY2FzZQorICAgICAgIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBhdXRvIC0tPgorICA8ZGVmYXVsdC1wYWdlLXNldHRpbmdzIGhlaWdodD0iMTFpbiIgd2lkdGg9IjguMjZpbiIvPiAKKyAKKyAgPCEtLSA8dXNlLWNhY2hlPmZhbHNlPC91c2UtY2FjaGU+IC0tPgorIAorICA8cmVuZGVyZXJzPgorICAgIDxyZW5kZXJlciBtaW1lPSJhcHBsaWNhdGlvbi9wZGYiPgorICAgICAgPGZvbnRzPgorICAgICAgICA8Zm9udCAgbWV0cmljcy1maWxlPSJWZXJhTW9uby54bWwiCisgICAgICAgICAgICAgICBrZXJuaW5nPSJ5ZXMiIAorICAgICAgICAgICAgICAgZW1iZWQtdXJsPSJWZXJhTW9uby50dGYiPgorICAgICAgICAgIDxmb250LXRyaXBsZXQgbmFtZT0idmVyYW1vbm8iIHN0eWxlPSJub3JtYWwiIHdlaWdodD0ibm9ybWFsIi8+CisgICAgICAgIDwvZm9udD4KKworICAgICAgICA8Zm9udCAgbWV0cmljcy1maWxlPSJWZXJhTW9CZC54bWwiCisgICAgICAgICAgICAgICBrZXJuaW5nPSJ5ZXMiIAorICAgICAgICAgICAgICAgZW1iZWQtdXJsPSJWZXJhTW9CZC50dGYiPgorICAgICAgICAgIDxmb250LXRyaXBsZXQgbmFtZT0idmVyYW1vbm8iIHN0eWxlPSJub3JtYWwiIHdlaWdodD0iYm9sZCIvPgorICAgICAgICA8L2ZvbnQ+CisKKyAgICAgICAgPGZvbnQgIG1ldHJpY3MtZmlsZT0iVmVyYS54bWwiCisgICAgICAgICAgICAgICBrZXJuaW5nPSJ5ZXMiIAorICAgICAgICAgICAgICAgZW1iZWQtdXJsPSJWZXJhLnR0ZiI+CisgICAgICAgICAgPGZvbnQtdHJpcGxldCBuYW1lPSJ2ZXJhc2FucyIgc3R5bGU9Im5vcm1hbCIgd2VpZ2h0PSJub3JtYWwiLz4KKyAgICAgICAgICA8Zm9udC10cmlwbGV0IG5hbWU9InZlcmFzYW5zIiBzdHlsZT0ibm9ybWFsIiB3ZWlnaHQ9ImJvbGQiLz4KKyAgICAgICAgICA8Zm9udC10cmlwbGV0IG5hbWU9InZlcmFzYW5zIiBzdHlsZT0iaXRhbGljIiB3ZWlnaHQ9Im5vcm1hbCIvPgorICAgICAgICAgIDxmb250LXRyaXBsZXQgbmFtZT0idmVyYXNhbnMiIHN0eWxlPSJpdGFsaWMiIHdlaWdodD0iYm9sZCIvPgorICAgICAgICA8L2ZvbnQ+CisgICAgICAgIAorICAgICAgICA8YXV0by1kZXRlY3QvPgorICAgICAgPC9mb250cz4KKyAgICA8L3JlbmRlcmVyPgorICA8L3JlbmRlcmVycz4KKzwvZm9wPgorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9mb3JtYWwub2JqZWN0LmhlYWRpbmcueHNsIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZm9ybWFsLm9iamVjdC5oZWFkaW5nLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM5MDBkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvZm9ybWFsLm9iamVjdC5oZWFkaW5nLnhzbApAQCAtMCwwICsxLDIxIEBACis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgeG1sbnM6ZD0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgorICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iZCI+CisgIAorICA8eHNsOnRlbXBsYXRlIG5hbWU9ImZvcm1hbC5vYmplY3QuaGVhZGluZyI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJvYmplY3QiIHNlbGVjdD0iLiIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idGl0bGUiPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkb2JqZWN0IiBtb2RlPSJvYmplY3QudGl0bGUubWFya3VwIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImFsbG93LWFuY2hvcnMiIHNlbGVjdD0iMSIvPgorICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgIDwveHNsOnBhcmFtPgorICAgIDxwIGNsYXNzPSJ0aXRsZSI+CisgICAgICA8Yj48eHNsOmNvcHktb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2I+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGVybWFsaW5rIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJG9iamVjdCIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3A+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9nbG9zcy1wZXJtYWxpbmtzLnhzbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL2dsb3NzLXBlcm1hbGlua3MueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjU4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9nbG9zcy1wZXJtYWxpbmtzLnhzbApAQCAtMCwwICsxLDE0IEBACis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIg0KKyAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iDQorICB4bWxuczpkPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayINCisgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCisNCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Imdsb3NzZW50cnkvZ2xvc3N0ZXJtIj4NCisgICAgPHhzbDphcHBseS1pbXBvcnRzLz4NCisgICAgPHhzbDppZiB0ZXN0PSIkZ2VuZXJhdGUucGVybWFsaW5rICE9IDAiPg0KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwZXJtYWxpbmsiPg0KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iLi4iLz4NCisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KKyAgICA8L3hzbDppZj4NCisgIDwveHNsOnRlbXBsYXRlPg0KKzwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9kb2MvdGVtcGxhdGUvcGVybWFsaW5rcy54c2wgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9wZXJtYWxpbmtzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmExYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvcGVybWFsaW5rcy54c2wKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCisgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisKKyAgPHhzbDpwYXJhbSBuYW1lPSJnZW5lcmF0ZS5wZXJtYWxpbmsiIHNlbGVjdD0iMSIvPgorICA8eHNsOnBhcmFtIG5hbWU9InBlcm1hbGluay50ZXh0Ij7CtjwveHNsOnBhcmFtPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0icGVybWFsaW5rIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5vZGUiLz4KKworICAgIDx4c2w6aWYgdGVzdD0iJGdlbmVyYXRlLnBlcm1hbGluayAhPSAnMCciPgorICAgICAgPHNwYW4gY2xhc3M9InBlcm1hbGluayI+CisgICAgICAgIDxhIGFsdD0iUGVybWFsaW5rIiB0aXRsZT0iUGVybWFsaW5rIj4KKyAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJocmVmLnRhcmdldCI+CisgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJvYmplY3QiICBzZWxlY3Q9IiRub2RlIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSIkcGVybWFsaW5rLnRleHQiLz4KKyAgICAgICAgPC9hPgorICAgICAgPC9zcGFuPgorICAgIDwveHNsOmlmPgorICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9zZWN0aW9uLnRpdGxlLnhzbCBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL3NlY3Rpb24udGl0bGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNmZmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90ZW1wbGF0ZS9zZWN0aW9uLnRpdGxlLnhzbApAQCAtMCwwICsxLDU1IEBACis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgeG1sbnM6ZD0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iZCI+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzZWN0aW9uLnRpdGxlIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb24iCisgICAgICBzZWxlY3Q9IihhbmNlc3Rvcjo6c2VjdGlvbiB8CisgICAgICAgICAgICAgICBhbmNlc3Rvcjo6c2ltcGxlc2VjdHwKKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpzZWN0MXwKKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpzZWN0MnwKKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpzZWN0M3wKKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpzZWN0NHwKKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpzZWN0NSlbbGFzdCgpXSIvPgorCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZW5kZXJhcyI+CisgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzZWN0aW9uL0ByZW5kZXJhcyA9ICdzZWN0MSciPjE8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNlY3Rpb24vQHJlbmRlcmFzID0gJ3NlY3QyJyI+MjwveHNsOndoZW4+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc2VjdGlvbi9AcmVuZGVyYXMgPSAnc2VjdDMnIj4zPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzZWN0aW9uL0ByZW5kZXJhcyA9ICdzZWN0NCciPjQ8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNlY3Rpb24vQHJlbmRlcmFzID0gJ3NlY3Q1JyI+NTwveHNsOndoZW4+CisgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInJyIvPjwveHNsOm90aGVyd2lzZT4KKyAgICAgIDwveHNsOmNob29zZT4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKworICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibGV2ZWwiPgorICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcmVuZGVyYXMgIT0gJyciPgorICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVuZGVyYXMiLz4KKyAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlY3Rpb24ubGV2ZWwiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJHNlY3Rpb24iLz4KKyAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICA8L3hzbDpjaG9vc2U+CisgICAgPC94c2w6dmFyaWFibGU+CisKKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2VjdGlvbi5oZWFkaW5nIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzZWN0aW9uIiBzZWxlY3Q9IiRzZWN0aW9uIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibGV2ZWwiIHNlbGVjdD0iJGxldmVsIi8+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGl0bGUiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRzZWN0aW9uIiBtb2RlPSJvYmplY3QudGl0bGUubWFya3VwIj4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iYWxsb3ctYW5jaG9ycyIgc2VsZWN0PSIxIi8+CisgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSIkbGV2ZWwgJmd0OyAwIj4KKyAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGVybWFsaW5rIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRzZWN0aW9uIi8+CisgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICA8L3hzbDp3aXRoLXBhcmFtPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3RlbXBsYXRlL3RpdGxlcGFnZS50ZW1wbGF0ZXMueG1sIGIvYml0YmFrZS9kb2MvdGVtcGxhdGUvdGl0bGVwYWdlLnRlbXBsYXRlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlYzExYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvZG9jL3RlbXBsYXRlL3RpdGxlcGFnZS50ZW1wbGF0ZXMueG1sCkBAIC0wLDAgKzEsMTI1OSBAQAorPCFET0NUWVBFIHQ6dGVtcGxhdGVzIFsKKzwhRU5USVRZIGhzaXplMCAiMTBwdCI+Cis8IUVOVElUWSBoc2l6ZTEgIjEycHQiPgorPCFFTlRJVFkgaHNpemUyICIxNC40cHQiPgorPCFFTlRJVFkgaHNpemUzICIxNy4yOHB0Ij4KKzwhRU5USVRZIGhzaXplNCAiMjAuNzM2cHQiPgorPCFFTlRJVFkgaHNpemU1ICIyNC44ODMycHQiPgorPCFFTlRJVFkgaHNpemUwc3BhY2UgIjcuNXB0Ij4gPCEtLSAwLjc1ICogaHNpemUwIC0tPgorPCFFTlRJVFkgaHNpemUxc3BhY2UgIjlwdCI+IDwhLS0gMC43NSAqIGhzaXplMSAtLT4KKzwhRU5USVRZIGhzaXplMnNwYWNlICIxMC44cHQiPiA8IS0tIDAuNzUgKiBoc2l6ZTIgLS0+Cis8IUVOVElUWSBoc2l6ZTNzcGFjZSAiMTIuOTZwdCI+IDwhLS0gMC43NSAqIGhzaXplMyAtLT4KKzwhRU5USVRZIGhzaXplNHNwYWNlICIxNS41NTJwdCI+IDwhLS0gMC43NSAqIGhzaXplNCAtLT4KKzwhRU5USVRZIGhzaXplNXNwYWNlICIxOC42NjI0cHQiPiA8IS0tIDAuNzUgKiBoc2l6ZTUgLS0+CitdPgorPHQ6dGVtcGxhdGVzIHhtbG5zOnQ9Imh0dHA6Ly9ud2Fsc2guY29tL2RvY2Jvb2sveHNsL3RlbXBsYXRlLzEuMCIKKwkgICAgIHhtbG5zOnBhcmFtPSJodHRwOi8vbndhbHNoLmNvbS9kb2Nib29rL3hzbC90ZW1wbGF0ZS8xLjAvcGFyYW0iCisgICAgICAgICAgICAgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCIKKyAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgJElkOiB0aXRsZXBhZ2UudGVtcGxhdGVzLnhtbCx2IDEuMjMgMjAwMy8xMi8xNiAwMDozMDo0OSBib2JzdGF5dG9uIEV4cCAkCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIERvY0Jvb2sgWFNMIFN0eWxlc2hlZXQgZGlzdHJpYnV0aW9uLgorICAgICBTZWUgLi4vUkVBRE1FIG9yIGh0dHA6Ly9kb2Nib29rLnNmLm5ldC8gZm9yIGNvcHlyaWdodAorICAgICBhbmQgb3RoZXIgaW5mb3JtYXRpb24uCisKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImFydGljbGUiIHQ6d3JhcHBlcj0iZm86YmxvY2siCisgICAgICAgICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iPgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iCisgICAgICAgICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIj4KKworICAgIDxtZWRpYW9iamVjdC8+CisKKyAgICA8dGl0bGUgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OmFydGljbGVbMV0iCisJICAga2VlcC13aXRoLW5leHQ9ImFsd2F5cyIKKwkgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisKKyAgICA8c3VidGl0bGUgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6YXJ0aWNsZVsxXSIKKwkgICBrZWVwLXdpdGgtbmV4dD0iYWx3YXlzIgorCSAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgZm9udC13ZWlnaHQ9ImJvbGQiCisgICAgICAgc3BhY2UtYWZ0ZXI9IjAuOGVtIi8+CisKKyAgICA8Y29ycGF1dGhvciBzcGFjZS1iZWZvcmU9IjAuNWVtIgorICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiLz4KKyAgICA8YXV0aG9yZ3JvdXAgc3BhY2UtYmVmb3JlPSIwLjVlbSIKKyAgICAgICAgICAgICAgICAgZm9udC1zaXplPSImaHNpemUyOyIvPgorICAgIDxhdXRob3Igc3BhY2UtYmVmb3JlPSIwLjVlbSIKKyAgICAgICAgICAgIGZvbnQtc2l6ZT0iJmhzaXplMjsiCisgICAgICAgICAgICBzcGFjZS1hZnRlcj0iMC44ZW0iLz4KKworICAgIDxlbWFpbCBmb250LXNpemU9IiZoc2l6ZTI7Ii8+CisKKyAgICA8b3RoZXJjcmVkaXQgc3BhY2UtYmVmb3JlPSIwLjVlbSIvPgorICAgIDxyZWxlYXNlaW5mbyBzcGFjZS1iZWZvcmU9IjAuNWVtIi8+CisgICAgPGNvcHlyaWdodCBzcGFjZS1iZWZvcmU9IjAuNWVtIi8+CisgICAgPGxlZ2Fsbm90aWNlIHRleHQtYWxpZ249InN0YXJ0IgorICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdD0iMC41aW4iCisgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodD0iMC41aW4iCisgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5PSJ7JGJvZHkuZm9udHNldH0iLz4KKyAgICA8cHViZGF0ZSBzcGFjZS1iZWZvcmU9IjAuNWVtIi8+CisJPHBhcmE+PC9wYXJhPgorICAgIDxyZXZpc2lvbiBzcGFjZS1iZWZvcmU9IjAuNWVtIi8+CisgICAgPHJldmhpc3Rvcnkgc3BhY2UtYmVmb3JlPSIwLjVlbSIvPgorICAgIDxhYnN0cmFjdCBzcGFjZS1iZWZvcmU9IjAuNWVtIgorCSAgICAgIHRleHQtYWxpZ249InN0YXJ0IgorCSAgICAgIG1hcmdpbi1sZWZ0PSIwLjVpbiIKKyAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0PSIwLjVpbiIKKyAgICAgICAgICAgICAgZm9udC1mYW1pbHk9InskYm9keS5mb250c2V0fSIvPgorCisgICAgPHBhcmE+PC9wYXJhPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNldCIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJkaXZpc2lvbi50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OnNldFsxXSIKKwkgICAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBzcGFjZS1iZWZvcmU9IiZoc2l6ZTVzcGFjZTsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIi8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJib29rIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKworICAgICAgPG1lZGlhb2JqZWN0Lz4KKworPCEtLQorCisjIElmIHlvdSBsZWF2ZSB0aGlzIGJsb2NrIG9mIGNvZGUgaW4gdGhlbiB0aGUgdGV4dCB0aXRsZSBpbiB0aGUKKyMgPHRpdGxlPkJpdEJha2UgVXNlciBNYW51YWw8L3RpdGxlPiBzdGF0ZW1lbnQgb2YgdGhlCisjIGJpdGJha2UtdXNlci1tYW51YWwueG1sIGZpbGUgaXMgcmVuZGVyZWQgb24gdGhlIHRpdGxlIHBhZ2UgYmVsb3cgdGhlCisjIGltYWdlLiAgQ29tbWVudGluZyBpdCBvdXQgZ2V0cyBpdCBvdXQgb2YgdGhlcmUgeWV0IGFsbG93cyBpdAorIyB0byBiZSByZXRhaW5lZCBpbiB0aGUgdGFiIHRleHQgZm9yIHRoZSBIVE1MIHZlcnNpb24gb2YgdGhlCisjIG1hbnVhbC4KKworICAgICAgPHRpdGxlCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJkaXZpc2lvbi50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OmJvb2tbMV0iCisJICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgc3BhY2UtYmVmb3JlPSImaHNpemU1c3BhY2U7IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorLS0+CisgICAgICA8c3VidGl0bGUKKwkJdGV4dC1hbGlnbj0iY2VudGVyIgorCQlmb250LXNpemU9IiZoc2l6ZTQ7IgorCQlzcGFjZS1iZWZvcmU9IiZoc2l6ZTRzcGFjZTsiCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgICA8Y29ycGF1dGhvciBmb250LXNpemU9IiZoc2l6ZTM7IgorCQkgIGtlZXAtd2l0aC1uZXh0PSJhbHdheXMiCisJCSAgc3BhY2UtYmVmb3JlPSIyaW4iLz4KKyAgICAgIDxhdXRob3Jncm91cCBzcGFjZS1iZWZvcmU9IjJpbiIvPgorICAgICAgPGF1dGhvciBmb250LXNpemU9IiZoc2l6ZTM7IgorCSAgICAgIHNwYWNlLWJlZm9yZT0iJmhzaXplMnNwYWNlOyIKKwkgICAgICBrZWVwLXdpdGgtbmV4dD0iYWx3YXlzIi8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorPCEtLQorIyBJZiB5b3UgbGVhdmUgdGhpcyBibG9jayBvZiBjb2RlIGluIHRoZW4gdGhlIHRleHQgdGl0bGUgaW4gdGhlCisjIDx0aXRsZT5CaXRCYWtlIFVzZXIgTWFudWFsPC90aXRsZT4gc3RhdGVtZW50IG9mIHRoZQorIyBiaXRiYWtlLXVzZXItbWFudWFsLnhtbCBmaWxlIGlzIHJlbmRlcmVkIG9uIHRoZSB0aXRsZSBwYWdlIGJlbG93IHRoZQorIyBpbWFnZS4gIENvbW1lbnRpbmcgaXQgb3V0IGdldHMgaXQgb3V0IG9mIHRoZXJlIHlldCBhbGxvd3MgaXQKKyMgdG8gYmUgcmV0YWluZWQgaW4gdGhlIHRhYiB0ZXh0IGZvciB0aGUgSFRNTCB2ZXJzaW9uIG9mIHRoZQorIyBtYW51YWwuCisKKyAgICAgIDx0aXRsZQorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iYm9vay52ZXJzby50aXRsZSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplMjsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CistLT4KKyAgICAgIDxjb3JwYXV0aG9yLz4KKyAgICAgIDxhdXRob3Jncm91cCB0Om5hbWVkLXRlbXBsYXRlPSJ2ZXJzby5hdXRob3Jncm91cCIvPgorICAgICAgPGF1dGhvci8+CisgICAgICA8b3RoZXJjcmVkaXQvPgorICAgICAgPHB1YmRhdGUgc3BhY2UtYmVmb3JlPSIxZW0iLz4KKyAgICAgIDxjb3B5cmlnaHQvPgorICAgICAgPGFic3RyYWN0Lz4KKyAgICAgIDxsZWdhbG5vdGljZSBmb250LXNpemU9IjhwdCIvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICAgIDxmbzpibG9jayBicmVhay1hZnRlcj0icGFnZSIvPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgICAgPGZvOmJsb2NrIGJyZWFrLWFmdGVyPSJwYWdlIi8+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0icGFydCIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJkaXZpc2lvbi50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OnBhcnRbMV0iCisJICAgICB0ZXh0LWFsaWduPSJjZW50ZXIiCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgc3BhY2UtYmVmb3JlPSImaHNpemU1c3BhY2U7IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICAgICBmb250LXNpemU9IiZoc2l6ZTQ7IgorCSAgICAgIHNwYWNlLWJlZm9yZT0iJmhzaXplNHNwYWNlOyIKKwkgICAgICBmb250LXdlaWdodD0nYm9sZCcKKwkgICAgICBmb250LXN0eWxlPSdpdGFsaWMnCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJwYXJ0aW50cm8iIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICB0ZXh0LWFsaWduPSJjZW50ZXIiCisJICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICBzcGFjZS1iZWZvcmU9IjFlbSIKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICAgICBmb250LXNpemU9IiZoc2l6ZTI7IgorCSAgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgIGZvbnQtc3R5bGU9Iml0YWxpYyIKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxjb3JwYXV0aG9yLz4KKyAgICA8YXV0aG9yZ3JvdXAvPgorICAgIDxhdXRob3IvPgorICAgIDxvdGhlcmNyZWRpdC8+CisgICAgPHJlbGVhc2VpbmZvLz4KKyAgICA8Y29weXJpZ2h0Lz4KKyAgICA8bGVnYWxub3RpY2UvPgorICAgIDxwdWJkYXRlLz4KKyAgICA8cmV2aXNpb24vPgorICAgIDxyZXZoaXN0b3J5Lz4KKyAgICA8YWJzdHJhY3QvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InJlZmVyZW5jZSIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJkaXZpc2lvbi50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OnJlZmVyZW5jZVsxXSIKKwkgICAgIHRleHQtYWxpZ249ImNlbnRlciIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBzcGFjZS1iZWZvcmU9IiZoc2l6ZTVzcGFjZTsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICAgdGV4dC1hbGlnbj0iY2VudGVyIi8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0icmVmc3lub3BzaXNkaXYiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InJlZnNlY3Rpb24iIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InJlZnNlY3QxIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJyZWZzZWN0MiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0icmVmc2VjdDMiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iZGVkaWNhdGlvbiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjpkZWRpY2F0aW9uWzFdIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJwcmVmYWNlIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OnByZWZhY2VbMV0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgICA8Y29ycGF1dGhvci8+CisgICAgICA8YXV0aG9yZ3JvdXAvPgorICAgICAgPGF1dGhvci8+CisgICAgICA8b3RoZXJjcmVkaXQvPgorICAgICAgPHJlbGVhc2VpbmZvLz4KKyAgICAgIDxjb3B5cmlnaHQvPgorICAgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICAgIDxwdWJkYXRlLz4KKyAgICAgIDxyZXZpc2lvbi8+CisgICAgICA8cmV2aGlzdG9yeS8+CisgICAgICA8YWJzdHJhY3QvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJjaGFwdGVyIiB0OndyYXBwZXI9ImZvOmJsb2NrIgorICAgICAgICAgICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSI+CisgICAgICA8dGl0bGUgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6Y2hhcHRlclsxXSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNTsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorCisgICAgICA8c3VidGl0bGUgc3BhY2UtYmVmb3JlPSIwLjVlbSIKKwkJZm9udC1zdHlsZT0iaXRhbGljIgorCQlmb250LXNpemU9IiZoc2l6ZTI7IgorCQlmb250LXdlaWdodD0iYm9sZCIvPgorCisgICAgICA8Y29ycGF1dGhvciAgc3BhY2UtYmVmb3JlPSIwLjVlbSIKKwkgICAgICAgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKyAgICAgICAgICAgICAgICAgICBmb250LXNpemU9IiZoc2l6ZTI7Ii8+CisKKyAgICAgIDxhdXRob3Jncm91cCBzcGFjZS1iZWZvcmU9IjAuNWVtIgorCSAgICAgICAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZT0iJmhzaXplMjsiLz4KKworICAgICAgPGF1dGhvciAgICAgIHNwYWNlLWJlZm9yZT0iMC41ZW0iCisJICAgICAgICAgICBzcGFjZS1hZnRlcj0iMC41ZW0iCisgICAgICAgICAgICAgICAgICAgZm9udC1zaXplPSImaHNpemUyOyIvPgorCisgICAgICA8b3RoZXJjcmVkaXQvPgorICAgICAgPHJlbGVhc2VpbmZvLz4KKyAgICAgIDxjb3B5cmlnaHQvPgorICAgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICAgIDxwdWJkYXRlLz4KKyAgICAgIDxyZXZpc2lvbi8+CisgICAgICA8cmV2aGlzdG9yeS8+CisgICAgICA8YWJzdHJhY3QvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJhcHBlbmRpeCIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OmFwcGVuZGl4WzFdIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgICAgPGNvcnBhdXRob3IvPgorICAgICAgPGF1dGhvcmdyb3VwLz4KKyAgICAgIDxhdXRob3IvPgorICAgICAgPG90aGVyY3JlZGl0Lz4KKyAgICAgIDxyZWxlYXNlaW5mby8+CisgICAgICA8Y29weXJpZ2h0Lz4KKyAgICAgIDxsZWdhbG5vdGljZS8+CisgICAgICA8cHViZGF0ZS8+CisgICAgICA8cmV2aXNpb24vPgorICAgICAgPHJldmhpc3RvcnkvPgorICAgICAgPGFic3RyYWN0Lz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNlY3Rpb24iIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8c3VidGl0bGUKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxjb3JwYXV0aG9yLz4KKyAgICA8YXV0aG9yZ3JvdXAvPgorICAgIDxhdXRob3IvPgorICAgIDxvdGhlcmNyZWRpdC8+CisgICAgPHJlbGVhc2VpbmZvLz4KKyAgICA8Y29weXJpZ2h0Lz4KKyAgICA8bGVnYWxub3RpY2UvPgorICAgIDxwdWJkYXRlLz4KKyAgICA8cmV2aXNpb24vPgorICAgIDxyZXZoaXN0b3J5Lz4KKyAgICA8YWJzdHJhY3QvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNlY3QxIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJzZWN0MiIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ic2VjdDMiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICA8dGl0bGUKKwkgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8c3VidGl0bGUKKwkgICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxjb3JwYXV0aG9yLz4KKyAgICA8YXV0aG9yZ3JvdXAvPgorICAgIDxhdXRob3IvPgorICAgIDxvdGhlcmNyZWRpdC8+CisgICAgPHJlbGVhc2VpbmZvLz4KKyAgICA8Y29weXJpZ2h0Lz4KKyAgICA8bGVnYWxub3RpY2UvPgorICAgIDxwdWJkYXRlLz4KKyAgICA8cmV2aXNpb24vPgorICAgIDxyZXZoaXN0b3J5Lz4KKyAgICA8YWJzdHJhY3QvPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKzwvdDp0aXRsZXBhZ2U+CisKKzx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9InNlY3Q0IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgPHRpdGxlCisJICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPHN1YnRpdGxlCisJICAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8Y29ycGF1dGhvci8+CisgICAgPGF1dGhvcmdyb3VwLz4KKyAgICA8YXV0aG9yLz4KKyAgICA8b3RoZXJjcmVkaXQvPgorICAgIDxyZWxlYXNlaW5mby8+CisgICAgPGNvcHlyaWdodC8+CisgICAgPGxlZ2Fsbm90aWNlLz4KKyAgICA8cHViZGF0ZS8+CisgICAgPHJldmlzaW9uLz4KKyAgICA8cmV2aGlzdG9yeS8+CisgICAgPGFic3RyYWN0Lz4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1iZWZvcmU+Cis8L3Q6dGl0bGVwYWdlPgorCis8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJzZWN0NSIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ic2ltcGxlc2VjdCIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgIDx0aXRsZQorCSAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDxzdWJ0aXRsZQorCSAgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPGNvcnBhdXRob3IvPgorICAgIDxhdXRob3Jncm91cC8+CisgICAgPGF1dGhvci8+CisgICAgPG90aGVyY3JlZGl0Lz4KKyAgICA8cmVsZWFzZWluZm8vPgorICAgIDxjb3B5cmlnaHQvPgorICAgIDxsZWdhbG5vdGljZS8+CisgICAgPHB1YmRhdGUvPgorICAgIDxyZXZpc2lvbi8+CisgICAgPHJldmhpc3RvcnkvPgorICAgIDxhYnN0cmFjdC8+CisgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJiaWJsaW9ncmFwaHkiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6YmlibGlvZ3JhcGh5WzFdIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJiaWJsaW9kaXYiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OmJpYmxpb2RpdlsxXSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNDsiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisgICAgICA8c3VidGl0bGUKKwkJZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iZ2xvc3NhcnkiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6Z2xvc3NhcnlbMV0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9Imdsb3NzZGl2IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZSB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjpnbG9zc2RpdlsxXSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplNDsiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIi8+CisgICAgICA8c3VidGl0bGUKKwkJZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0iaW5kZXgiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iY29tcG9uZW50LnRpdGxlIgorCSAgICAgcGFyYW06bm9kZT0iYW5jZXN0b3Itb3Itc2VsZjo6aW5kZXhbMV0iCisgICAgICAgICAgICAgcGFyYW06cGFnZXdpZGU9IjEiCisJICAgICBtYXJnaW4tbGVmdD0iMHB0IgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFRoZSBpbmRleGRpdi50aXRsZSB0ZW1wbGF0ZSBpcyB1c2VkIHNvIHRoYXQgbWFudWFsIGFuZCAtLT4KKyAgPCEtLSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpbmRleGRpdiB0aXRsZXMgZ2V0IHRoZSBzYW1lIC0tPgorICA8IS0tIGZvcm1hdHRpbmcuIC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImluZGV4ZGl2IiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZSB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iaW5kZXhkaXYudGl0bGUiCisJICAgICBwYXJhbTp0aXRsZT0idGl0bGUiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJzZXRpbmRleCIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJjb21wb25lbnQudGl0bGUiCisJICAgICBwYXJhbTpub2RlPSJhbmNlc3Rvci1vci1zZWxmOjpzZXRpbmRleFsxXSIKKyAgICAgICAgICAgICBwYXJhbTpwYWdld2lkZT0iMSIKKwkgICAgIG1hcmdpbi1sZWZ0PSIwcHQiCisJICAgICBmb250LXNpemU9IiZoc2l6ZTU7IgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iCisJICAgICBmb250LXdlaWdodD0iYm9sZCIvPgorICAgICAgPHN1YnRpdGxlCisJCWZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9ImNvbG9waG9uIiB0OndyYXBwZXI9ImZvOmJsb2NrIj4KKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InJlY3RvIj4KKyAgICAgIDx0aXRsZQorCSAgICAgdDpmb3JjZT0iMSIKKwkgICAgIHQ6bmFtZWQtdGVtcGxhdGU9ImNvbXBvbmVudC50aXRsZSIKKwkgICAgIHBhcmFtOm5vZGU9ImFuY2VzdG9yLW9yLXNlbGY6OmNvbG9waG9uWzFdIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemU1OyIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiLz4KKyAgICAgIDxzdWJ0aXRsZQorCQlmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8dDp0aXRsZXBhZ2UgdDplbGVtZW50PSJ0YWJsZS5vZi5jb250ZW50cyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInVGFibGVvZkNvbnRlbnRzJyIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0iMWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxLjVlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWF4aW11bT0iMmVtIgorCSAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ibGlzdC5vZi50YWJsZXMiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iZ2VudGV4dCIKKwkgICAgIHBhcmFtOmtleT0iJ0xpc3RvZlRhYmxlcyciCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1pbmltdW09IjFlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMS41ZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1heGltdW09IjJlbSIKKwkgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9Imxpc3Qub2YuZmlndXJlcyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInTGlzdG9mRmlndXJlcyciCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1pbmltdW09IjFlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMS41ZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1heGltdW09IjJlbSIKKwkgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9Imxpc3Qub2YuZXhhbXBsZXMiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iZ2VudGV4dCIKKwkgICAgIHBhcmFtOmtleT0iJ0xpc3RvZkV4YW1wbGVzJyIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWluaW11bT0iMWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5vcHRpbXVtPSIxLjVlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUubWF4aW11bT0iMmVtIgorCSAgICAgc3BhY2UtYWZ0ZXI9IjAuNWVtIgorCSAgICAgbWFyZ2luLWxlZnQ9InskdGl0bGUubWFyZ2luLmxlZnR9IgorCSAgICAgZm9udC1zaXplPSImaHNpemUzOyIKKwkgICAgIGZvbnQtd2VpZ2h0PSJib2xkIgorCSAgICAgZm9udC1mYW1pbHk9InskdGl0bGUuZm9udHNldH0iLz4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2UtY29udGVudCB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWNvbnRlbnQ+CisKKyAgICA8dDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorICAgIDwvdDp0aXRsZXBhZ2Utc2VwYXJhdG9yPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InJlY3RvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisgIDwvdDp0aXRsZXBhZ2U+CisKKyAgPHQ6dGl0bGVwYWdlIHQ6ZWxlbWVudD0ibGlzdC5vZi5lcXVhdGlvbnMiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iZ2VudGV4dCIKKwkgICAgIHBhcmFtOmtleT0iJ0xpc3RvZkVxdWF0aW9ucyciCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1pbmltdW09IjFlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMS41ZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1heGltdW09IjJlbSIKKwkgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9Imxpc3Qub2YucHJvY2VkdXJlcyIgdDp3cmFwcGVyPSJmbzpibG9jayI+CisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJyZWN0byI+CisgICAgICA8dGl0bGUKKwkgICAgIHQ6Zm9yY2U9IjEiCisJICAgICB0Om5hbWVkLXRlbXBsYXRlPSJnZW50ZXh0IgorCSAgICAgcGFyYW06a2V5PSInTGlzdG9mUHJvY2VkdXJlcyciCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1pbmltdW09IjFlbSIKKyAgICAgICAgICAgICBzcGFjZS1iZWZvcmUub3B0aW11bT0iMS41ZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm1heGltdW09IjJlbSIKKwkgICAgIHNwYWNlLWFmdGVyPSIwLjVlbSIKKwkgICAgIG1hcmdpbi1sZWZ0PSJ7JHRpdGxlLm1hcmdpbi5sZWZ0fSIKKwkgICAgIGZvbnQtc2l6ZT0iJmhzaXplMzsiCisJICAgICBmb250LXdlaWdodD0iYm9sZCIKKwkgICAgIGZvbnQtZmFtaWx5PSJ7JHRpdGxlLmZvbnRzZXR9Ii8+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLWNvbnRlbnQgdDpzaWRlPSJ2ZXJzbyI+CisgICAgPC90OnRpdGxlcGFnZS1jb250ZW50PgorCisgICAgPHQ6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKyAgICA8L3Q6dGl0bGVwYWdlLXNlcGFyYXRvcj4KKworICAgIDx0OnRpdGxlcGFnZS1iZWZvcmUgdDpzaWRlPSJyZWN0byI+CisgICAgPC90OnRpdGxlcGFnZS1iZWZvcmU+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorICA8L3Q6dGl0bGVwYWdlPgorCisgIDx0OnRpdGxlcGFnZSB0OmVsZW1lbnQ9Imxpc3Qub2YudW5rbm93bnMiIHQ6d3JhcHBlcj0iZm86YmxvY2siPgorICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0icmVjdG8iPgorICAgICAgPHRpdGxlCisJICAgICB0OmZvcmNlPSIxIgorCSAgICAgdDpuYW1lZC10ZW1wbGF0ZT0iZ2VudGV4dCIKKwkgICAgIHBhcmFtOmtleT0iJ0xpc3RvZlVua25vd24nIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5taW5pbXVtPSIxZW0iCisgICAgICAgICAgICAgc3BhY2UtYmVmb3JlLm9wdGltdW09IjEuNWVtIgorICAgICAgICAgICAgIHNwYWNlLWJlZm9yZS5tYXhpbXVtPSIyZW0iCisJICAgICBzcGFjZS1hZnRlcj0iMC41ZW0iCisJICAgICBtYXJnaW4tbGVmdD0ieyR0aXRsZS5tYXJnaW4ubGVmdH0iCisJICAgICBmb250LXNpemU9IiZoc2l6ZTM7IgorCSAgICAgZm9udC13ZWlnaHQ9ImJvbGQiCisJICAgICBmb250LWZhbWlseT0ieyR0aXRsZS5mb250c2V0fSIvPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1jb250ZW50IHQ6c2lkZT0idmVyc28iPgorICAgIDwvdDp0aXRsZXBhZ2UtY29udGVudD4KKworICAgIDx0OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisgICAgPC90OnRpdGxlcGFnZS1zZXBhcmF0b3I+CisKKyAgICA8dDp0aXRsZXBhZ2UtYmVmb3JlIHQ6c2lkZT0icmVjdG8iPgorICAgIDwvdDp0aXRsZXBhZ2UtYmVmb3JlPgorCisgICAgPHQ6dGl0bGVwYWdlLWJlZm9yZSB0OnNpZGU9InZlcnNvIj4KKyAgICA8L3Q6dGl0bGVwYWdlLWJlZm9yZT4KKyAgPC90OnRpdGxlcGFnZT4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPC90OnRlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2JpdGJha2UvZG9jL3Rvb2xzL2RvY2Jvb2stdG8tcGRmIGIvYml0YmFrZS9kb2MvdG9vbHMvZG9jYm9vay10by1wZGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTU4ZGVkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2RvYy90b29scy9kb2Nib29rLXRvLXBkZgpAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKwkKK2lmIFsgLXogIiQxIiAtbyAteiAiJDIiIF07IHRoZW4KKyAgIGVjaG8gInVzYWdlOiBbLXZdICQwIDxkb2Nib29rIGZpbGU+IDx0ZW1wbGF0ZWRpcj4iCisgICBlY2hvCisgICBlY2hvICIqTk9URSogeW91IG5lZWQgeHNsdHByb2MsIGZvcCBhbmQgbndhbHNoIGRvY2Jvb2sgc3R5bGVzaGVldHMiIAorICAgZWNobyAiICAgICAgIGluc3RhbGxlZCBmb3IgdGhpcyB0byB3b3JrISIKKyAgIGVjaG8KKyAgIGV4aXQgMAorZmkKKworRk89YGVjaG8gJDEgfCBzZWQgcy8ueG1sLy5mby9gIHx8IGV4aXQgMQorUERGPWBlY2hvICQxIHwgc2VkIHMvLnhtbC8ucGRmL2AgfHwgZXhpdCAxCitURU1QTEFURURJUj0kMgorCisjIworIyBUaGVzZSBVUkkgc2hvdWxkIGJlIHJld3JpdHRlbiBieSB5b3VyIGRpc3RyaWJ1dGlvbidzIHhtbCBjYXRhbG9nIHRvCisjIG1hdGNoIHlvdXIgbG9jYWx5IGluc3RhbGxlZCBYU0wgc3R5bGVzaGVldHMuCitYU0xfQkFTRV9VUkk9Imh0dHA6Ly9kb2Nib29rLnNvdXJjZWZvcmdlLm5ldC9yZWxlYXNlL3hzbC9jdXJyZW50IgorCisjIENyZWF0ZXMgYSB0ZW1wb3JhcnkgWFNMIHN0eWxlc2hlZXQgYmFzZWQgb24gdGl0bGVwYWdlLnhzbAoreHNsdHByb2MgLW8gL3RtcC90aXRsZXBhZ2UueHNsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgLS14aW5jbHVkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICRYU0xfQkFTRV9VUkkvdGVtcGxhdGUvdGl0bGVwYWdlLnhzbCBcCisgICAgICAgICAkVEVNUExBVEVESVIvdGl0bGVwYWdlLnRlbXBsYXRlcy54bWwgfHwgZXhpdCAxCisKKyMgQ3JlYXRlcyB0aGUgZmlsZSBuZWVkZWQgZm9yIEZPUAoreHNsdHByb2MgLS14aW5jbHVkZSAgICAgICAgICAgICAgICAgICAgXAorCSAtLXN0cmluZ3BhcmFtIGh5cGhlbmF0ZSBmYWxzZSBcCisJIC0tc3RyaW5ncGFyYW0gZm9ybWFsLnRpdGxlLnBsYWNlbWVudCAiZmlndXJlIGFmdGVyIiBcCisJIC0tc3RyaW5ncGFyYW0gdWxpbmsuc2hvdyAxIFwKKyAgICAgICAgIC0tc3RyaW5ncGFyYW0gIGJvZHkuZm9udC5tYXN0ZXIgIDkgXAorICAgICAgICAgLS1zdHJpbmdwYXJhbSAgdGl0bGUuZm9udC5tYXN0ZXIgIDExIFwKKyAgICAgICAgIC0tc3RyaW5ncGFyYW0gZHJhZnQud2F0ZXJtYXJrLmltYWdlICIkVEVNUExBVEVESVIvZHJhZnQucG5nIiBcCisgICAgICAgICAtLXN0cmluZ3BhcmFtICBjaGFwdGVyLmF1dG9sYWJlbCAxIFwKKyAgICAgICAgIC0tc3RyaW5ncGFyYW0gIGFwcGVuZGl4LmF1dG9sYWJlbCBBIFwKKyAgICAgICAgIC0tc3RyaW5ncGFyYW0gIHNlY3Rpb24uYXV0b2xhYmVsIDEgXAorICAgICAgICAgLS1zdHJpbmdwYXJhbSAgc2VjdGlvbi5sYWJlbC5pbmNsdWRlcy5jb21wb25lbnQubGFiZWwgMSBcCisgICAgICAgICAtLW91dHB1dCAkRk8gICAgICAgICAgICAgICBcCisgICAgICAgICAkVEVNUExBVEVESVIvZGItcGRmLnhzbCAgICBcCisJICQxICAgICAgICAgICAgICAgICB8fCBleGl0IDEKKworIyBJbnZva2VzIHRoZSBKYXZhIHZlcnNpb24gb2YgRk9QLiAgVXNlcyB0aGUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZpbGUgY29tbW9uL2ZvcC1jb25maWcueG1sCitmb3AgLWMgJFRFTVBMQVRFRElSL2ZvcC1jb25maWcueG1sIC1mbyAkRk8gLXBkZiAkUERGICAgICAgIHx8IGV4aXQgMQorCitybSAtZiAkRk8KK3JtIC1mICAvdG1wL3RpdGxlcGFnZS54c2wKKworZWNobworZWNobyAiICMjIyMgU3VjY2VzcyEgJFBERiByZWFkeS4gIyMjIyIKK2VjaG8KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL0NPVy5weSBiL2JpdGJha2UvbGliL2JiL0NPVy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE3ZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvQ09XLnB5CkBAIC0wLDAgKzEsMzIzIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBUaGlzIGlzIGEgY29weSBvbiB3cml0ZSBkaWN0aW9uYXJ5IGFuZCBzZXQgd2hpY2ggYWJ1c2VzIGNsYXNzZXMgdG8gdHJ5IGFuZCBiZSBuaWNlIGFuZCBmYXN0LgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgVGltIEFtc2VsbAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyNQbGVhc2UgTm90ZToKKyMgQmUgY2FyZWZ1bCB3aGVuIHVzaW5nIG11dGFibGUgdHlwZXMgKGllIERpY3QgYW5kIExpc3RzKSAtIG9wZXJhdGlvbnMgaW52b2x2aW5nIHRoZXNlIGFyZSBTTE9XLgorIyBBc3NpZ24gYSBmaWxlIHRvIF9fd2Fybl9fIHRvIGdldCB3YXJuaW5ncyBhYm91dCBzbG93IG9wZXJhdGlvbnMuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBjb3B5CitpbXBvcnQgdHlwZXMKK0ltbXV0YWJsZVR5cGVzID0gKAorICAgIHR5cGVzLk5vbmVUeXBlLAorICAgIGJvb2wsCisgICAgY29tcGxleCwKKyAgICBmbG9hdCwKKyAgICBpbnQsCisgICAgbG9uZywKKyAgICB0dXBsZSwKKyAgICBmcm96ZW5zZXQsCisgICAgYmFzZXN0cmluZworKQorCitNVVRBQkxFID0gIl9fbXV0YWJsZV9fIgorCitjbGFzcyBDT1dNZXRhKHR5cGUpOgorICAgIHBhc3MKKworY2xhc3MgQ09XRGljdE1ldGEoQ09XTWV0YSk6CisgICAgX193YXJuX18gPSBGYWxzZQorICAgIF9faGFzbXV0YWJsZV9fID0gRmFsc2UKKyAgICBfX21hcmtlcl9fID0gdHVwbGUoKQorCisgICAgZGVmIF9fc3RyX18oY2xzKToKKyAgICAgICAgIyBGSVhNRTogSSBoYXZlIG1hZ2ljIG51bWJlcnMhCisgICAgICAgIHJldHVybiAiPENPV0RpY3QgTGV2ZWw6ICVpIEN1cnJlbnQgS2V5czogJWk+IiAlIChjbHMuX19jb3VudF9fLCBsZW4oY2xzLl9fZGljdF9fKSAtIDMpCisgICAgX19yZXByX18gPSBfX3N0cl9fCisKKyAgICBkZWYgY293KGNscyk6CisgICAgICAgIGNsYXNzIEMoY2xzKToKKyAgICAgICAgICAgIF9fY291bnRfXyA9IGNscy5fX2NvdW50X18gKyAxCisgICAgICAgIHJldHVybiBDCisgICAgY29weSA9IGNvdworICAgIF9fY2FsbF9fID0gY293CisKKyAgICBkZWYgX19zZXRpdGVtX18oY2xzLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIEltbXV0YWJsZVR5cGVzKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDT1dNZXRhKToKKyAgICAgICAgICAgICAgICBjbHMuX19oYXNtdXRhYmxlX18gPSBUcnVlCisgICAgICAgICAgICBrZXkgKz0gTVVUQUJMRQorICAgICAgICBzZXRhdHRyKGNscywga2V5LCB2YWx1ZSkKKworICAgIGRlZiBfX2dldG11dGFibGVfXyhjbHMsIGtleSwgcmVhZG9ubHk9RmFsc2UpOgorICAgICAgICBua2V5ID0ga2V5ICsgTVVUQUJMRQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gY2xzLl9fZGljdF9fW25rZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB2YWx1ZSA9IGdldGF0dHIoY2xzLCBua2V5KQorICAgICAgICBpZiByZWFkb25seToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIGlmIG5vdCBjbHMuX193YXJuX18gaXMgRmFsc2UgYW5kIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDT1dNZXRhKToKKyAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBEb2luZyBhIGNvcHkgYmVjYXVzZSAlcyBpcyBhIG11dGFibGUgdHlwZS4iICUga2V5LCBmaWxlPWNscy5fX3dhcm5fXykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jb3B5KCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGU6CisgICAgICAgICAgICB2YWx1ZSA9IGNvcHkuY29weSh2YWx1ZSkKKyAgICAgICAgc2V0YXR0cihjbHMsIG5rZXksIHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIF9fZ2V0bWFya2VyX18gPSBbXQorICAgIGRlZiBfX2dldHJlYWRvbmx5X18oY2xzLCBrZXksIGRlZmF1bHQ9X19nZXRtYXJrZXJfXyk6CisgICAgICAgICIiIlwKKyAgICAgICAgR2V0IGEgdmFsdWUgKGV2ZW4gaWYgbXV0YWJsZSkgd2hpY2ggeW91IHByb21pc2Ugbm90IHRvIGNoYW5nZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBjbHMuX19nZXRpdGVtX18oa2V5LCBkZWZhdWx0LCBUcnVlKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKGNscywga2V5LCBkZWZhdWx0PV9fZ2V0bWFya2VyX18sIHJlYWRvbmx5PUZhbHNlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihjbHMsIGtleSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNscy5fX2dldG11dGFibGVfXyhrZXksIHJlYWRvbmx5KQorCisgICAgICAgICAgICAjIFRoaXMgaXMgZm9yIHZhbHVlcyB3aGljaCBoYXZlIGJlZW4gZGVsZXRlZAorICAgICAgICAgICAgaWYgdmFsdWUgaXMgY2xzLl9fbWFya2VyX186CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoImtleSAlcyBkb2VzIG5vdCBleGlzdC4iICUga2V5KQorCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBub3QgZGVmYXVsdCBpcyBjbHMuX19nZXRtYXJrZXJfXzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihzdHIoZSkpCisKKyAgICBkZWYgX19kZWxpdGVtX18oY2xzLCBrZXkpOgorICAgICAgICBjbHMuX19zZXRpdGVtX18oa2V5LCBjbHMuX19tYXJrZXJfXykKKworICAgIGRlZiBfX3JldmVydGl0ZW1fXyhjbHMsIGtleSk6CisgICAgICAgIGlmIG5vdCBjbHMuX19kaWN0X18uaGFzX2tleShrZXkpOgorICAgICAgICAgICAga2V5ICs9IE1VVEFCTEUKKyAgICAgICAgZGVsYXR0cihjbHMsIGtleSkKKworICAgIGRlZiBfX2NvbnRhaW5zX18oY2xzLCBrZXkpOgorICAgICAgICByZXR1cm4gY2xzLmhhc19rZXkoa2V5KQorCisgICAgZGVmIGhhc19rZXkoY2xzLCBrZXkpOgorICAgICAgICB2YWx1ZSA9IGNscy5fX2dldHJlYWRvbmx5X18oa2V5LCBjbHMuX19tYXJrZXJfXykKKyAgICAgICAgaWYgdmFsdWUgaXMgY2xzLl9fbWFya2VyX186CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBpdGVyKGNscywgdHlwZSwgcmVhZG9ubHk9RmFsc2UpOgorICAgICAgICBmb3Iga2V5IGluIGRpcihjbHMpOgorICAgICAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgoIl9fIik6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYga2V5LmVuZHN3aXRoKE1VVEFCTEUpOgorICAgICAgICAgICAgICAgIGtleSA9IGtleVs6LWxlbihNVVRBQkxFKV0KKworICAgICAgICAgICAgaWYgdHlwZSA9PSAia2V5cyI6CisgICAgICAgICAgICAgICAgeWllbGQga2V5CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiByZWFkb25seToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjbHMuX19nZXRyZWFkb25seV9fKGtleSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNsc1trZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgdHlwZSA9PSAidmFsdWVzIjoKKyAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZQorICAgICAgICAgICAgaWYgdHlwZSA9PSAiaXRlbXMiOgorICAgICAgICAgICAgICAgIHlpZWxkIChrZXksIHZhbHVlKQorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCkKKworICAgIGRlZiBpdGVya2V5cyhjbHMpOgorICAgICAgICByZXR1cm4gY2xzLml0ZXIoImtleXMiKQorICAgIGRlZiBpdGVydmFsdWVzKGNscywgcmVhZG9ubHk9RmFsc2UpOgorICAgICAgICBpZiBub3QgY2xzLl9fd2Fybl9fIGlzIEZhbHNlIGFuZCBjbHMuX19oYXNtdXRhYmxlX18gYW5kIHJlYWRvbmx5IGlzIEZhbHNlOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IElmIHlvdSBhcm4ndCBnb2luZyB0byBjaGFuZ2UgYW55IG9mIHRoZSB2YWx1ZXMgY2FsbCB3aXRoIFRydWUuIiwgZmlsZT1jbHMuX193YXJuX18pCisgICAgICAgIHJldHVybiBjbHMuaXRlcigidmFsdWVzIiwgcmVhZG9ubHkpCisgICAgZGVmIGl0ZXJpdGVtcyhjbHMsIHJlYWRvbmx5PUZhbHNlKToKKyAgICAgICAgaWYgbm90IGNscy5fX3dhcm5fXyBpcyBGYWxzZSBhbmQgY2xzLl9faGFzbXV0YWJsZV9fIGFuZCByZWFkb25seSBpcyBGYWxzZToKKyAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBJZiB5b3UgYXJuJ3QgZ29pbmcgdG8gY2hhbmdlIGFueSBvZiB0aGUgdmFsdWVzIGNhbGwgd2l0aCBUcnVlLiIsIGZpbGU9Y2xzLl9fd2Fybl9fKQorICAgICAgICByZXR1cm4gY2xzLml0ZXIoIml0ZW1zIiwgcmVhZG9ubHkpCisKK2NsYXNzIENPV1NldE1ldGEoQ09XRGljdE1ldGEpOgorICAgIGRlZiBfX3N0cl9fKGNscyk6CisgICAgICAgICMgRklYTUU6IEkgaGF2ZSBtYWdpYyBudW1iZXJzIQorICAgICAgICByZXR1cm4gIjxDT1dTZXQgTGV2ZWw6ICVpIEN1cnJlbnQgS2V5czogJWk+IiAlIChjbHMuX19jb3VudF9fLCBsZW4oY2xzLl9fZGljdF9fKSAtMykKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworICAgIGRlZiBjb3coY2xzKToKKyAgICAgICAgY2xhc3MgQyhjbHMpOgorICAgICAgICAgICAgX19jb3VudF9fID0gY2xzLl9fY291bnRfXyArIDEKKyAgICAgICAgcmV0dXJuIEMKKworICAgIGRlZiBhZGQoY2xzLCB2YWx1ZSk6CisgICAgICAgIENPV0RpY3RNZXRhLl9fc2V0aXRlbV9fKGNscywgcmVwcihoYXNoKHZhbHVlKSksIHZhbHVlKQorCisgICAgZGVmIHJlbW92ZShjbHMsIHZhbHVlKToKKyAgICAgICAgQ09XRGljdE1ldGEuX19kZWxpdGVtX18oY2xzLCByZXByKGhhc2godmFsdWUpKSkKKworICAgIGRlZiBfX2luX18oY2xzLCB2YWx1ZSk6CisgICAgICAgIHJldHVybiBDT1dEaWN0TWV0YS5oYXNfa2V5KHJlcHIoaGFzaCh2YWx1ZSkpKQorCisgICAgZGVmIGl0ZXJrZXlzKGNscyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic2V0cyBkb24ndCBoYXZlIGtleXMiKQorCisgICAgZGVmIGl0ZXJpdGVtcyhjbHMpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNldHMgZG9uJ3QgaGF2ZSAnaXRlbXMnIikKKworIyBUaGVzZSBhcmUgdGhlIGFjdHVhbCBjbGFzc2VzIHlvdSB1c2UhCitjbGFzcyBDT1dEaWN0QmFzZShvYmplY3QpOgorICAgIF9fbWV0YWNsYXNzX18gPSBDT1dEaWN0TWV0YQorICAgIF9fY291bnRfXyA9IDAKKworY2xhc3MgQ09XU2V0QmFzZShvYmplY3QpOgorICAgIF9fbWV0YWNsYXNzX18gPSBDT1dTZXRNZXRhCisgICAgX19jb3VudF9fID0gMAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCBzeXMKKyAgICBDT1dEaWN0QmFzZS5fX3dhcm5fXyA9IHN5cy5zdGRlcnIKKyAgICBhID0gQ09XRGljdEJhc2UoKQorICAgIHByaW50KCJhIiwgYSkKKworICAgIGFbJ2EnXSA9ICdhJworICAgIGFbJ2InXSA9ICdiJworICAgIGFbJ2RpY3QnXSA9IHt9CisKKyAgICBiID0gYS5jb3B5KCkKKyAgICBwcmludCgiYiIsIGIpCisgICAgYlsnYyddID0gJ2InCisKKyAgICBwcmludCgpCisKKyAgICBwcmludCgiYSIsIGEpCisgICAgZm9yIHggaW4gYS5pdGVyaXRlbXMoKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgiLS0iKQorICAgIHByaW50KCJiIiwgYikKKyAgICBmb3IgeCBpbiBiLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKKworICAgIGJbJ2RpY3QnXVsnYSddID0gJ2InCisgICAgYlsnYSddID0gJ2MnCisKKyAgICBwcmludCgiYSIsIGEpCisgICAgZm9yIHggaW4gYS5pdGVyaXRlbXMoKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgiLS0iKQorICAgIHByaW50KCJiIiwgYikKKyAgICBmb3IgeCBpbiBiLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKKworICAgIHRyeToKKyAgICAgICAgYlsnZGljdDInXQorICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBlOgorICAgICAgICBwcmludCgiT2theSEiKQorCisgICAgYVsnc2V0J10gPSBDT1dTZXRCYXNlKCkKKyAgICBhWydzZXQnXS5hZGQoIm8xIikKKyAgICBhWydzZXQnXS5hZGQoIm8xIikKKyAgICBhWydzZXQnXS5hZGQoIm8yIikKKworICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhWydzZXQnXS5pdGVydmFsdWVzKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoIi0tIikKKyAgICBwcmludCgiYiIsIGIpCisgICAgZm9yIHggaW4gYlsnc2V0J10uaXRlcnZhbHVlcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKKworICAgIGJbJ3NldCddLmFkZCgnbzMnKQorCisgICAgcHJpbnQoImEiLCBhKQorICAgIGZvciB4IGluIGFbJ3NldCddLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgiLS0iKQorICAgIHByaW50KCJiIiwgYikKKyAgICBmb3IgeCBpbiBiWydzZXQnXS5pdGVydmFsdWVzKCk6CisgICAgICAgIHByaW50KHgpCisgICAgcHJpbnQoKQorCisgICAgYVsnc2V0MiddID0gc2V0KCkKKyAgICBhWydzZXQyJ10uYWRkKCJvMSIpCisgICAgYVsnc2V0MiddLmFkZCgibzEiKQorICAgIGFbJ3NldDInXS5hZGQoIm8yIikKKworICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGIuaXRlcml0ZW1zKHJlYWRvbmx5PVRydWUpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKKworICAgIGRlbCBiWydiJ10KKyAgICB0cnk6CisgICAgICAgIHByaW50KGJbJ2InXSkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHByaW50KCJZYXkhIGRlbGV0ZWQga2V5IHJhaXNlcyBlcnJvciIpCisKKyAgICBpZiBiLmhhc19rZXkoJ2InKToKKyAgICAgICAgcHJpbnQoIkJvbyEiKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJZYXkgLSBoYXNfa2V5IHdpdGggZGVsZXRlIHdvcmtzISIpCisKKyAgICBwcmludCgiYSIsIGEpCisgICAgZm9yIHggaW4gYS5pdGVyaXRlbXMoKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgiLS0iKQorICAgIHByaW50KCJiIiwgYikKKyAgICBmb3IgeCBpbiBiLml0ZXJpdGVtcyhyZWFkb25seT1UcnVlKToKKyAgICAgICAgcHJpbnQoeCkKKyAgICBwcmludCgpCisKKyAgICBiLl9fcmV2ZXJ0aXRlbV9fKCdiJykKKworICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGIuaXRlcml0ZW1zKHJlYWRvbmx5PVRydWUpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKKworICAgIGIuX19yZXZlcnRpdGVtX18oJ2RpY3QnKQorICAgIHByaW50KCJhIiwgYSkKKyAgICBmb3IgeCBpbiBhLml0ZXJpdGVtcygpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCItLSIpCisgICAgcHJpbnQoImIiLCBiKQorICAgIGZvciB4IGluIGIuaXRlcml0ZW1zKHJlYWRvbmx5PVRydWUpOgorICAgICAgICBwcmludCh4KQorICAgIHByaW50KCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3OTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTQyIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIEJ1aWxkIFN5c3RlbSBQeXRob24gTGlicmFyeQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMgIEhvbGdlciBTY2h1cmlnCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjCisjIEJhc2VkIG9uIEdlbnRvbydzIHBvcnRhZ2UucHkuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitfX3ZlcnNpb25fXyA9ICIxLjI3LjEiCisKK2ltcG9ydCBzeXMKK2lmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMyk6CisgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb3JyeSwgcHl0aG9uIDIuNy4zIG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciB0aGlzIHZlcnNpb24gb2YgYml0YmFrZSIpCisKKworY2xhc3MgQkJIYW5kbGVkRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgVGhlIGJpZyBkaWxlbW1hIGZvciBnZW5lcmljIGJpdGJha2UgY29kZSBpcyB3aGF0IGluZm9ybWF0aW9uIHRvIGdpdmUgdGhlIHVzZXIKKyAgICB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMuIEFueSBleGNlcHRpb24gaW5oZXJpdGluZyB0aGlzIGJhc2UgZXhjZXB0aW9uIGNsYXNzCisgICAgaGFzIGFscmVhZHkgcHJvdmlkZWQgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgdmlhIHNvbWUgJ2ZpcmVkJyBtZXNzYWdlIHR5cGUgc3VjaCBhcworICAgIGFuIGV4cGxpY2l0bHkgZmlyZWQgZXZlbnQgdXNpbmcgYmIuZmlyZSwgb3IgYSBiYi5lcnJvciBtZXNzYWdlLiBJZiBiaXRiYWtlIAorICAgIGVuY291bnRlcnMgYW4gZXhjZXB0aW9uIGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzLCBubyBiYWNrdHJhY2Ugb3Igb3RoZXIgaW5mb3JtYXRpb24gCisgICAgd2lsbCBiZSBnaXZlbiB0byB0aGUgdXNlciwgaXRzIGFzc3VtZWQgdGhlIGVhcmxpZXIgZXZlbnQgcHJvdmlkZWQgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uLgorICAgICIiIgorICAgIHBhc3MKKworaW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworCisKK2NsYXNzIE51bGxIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgcGFzcworCitMb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlckNsYXNzKCkKK2NsYXNzIEJCTG9nZ2VyKExvZ2dlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lLnNwbGl0KCIuIilbMF0gPT0gIkJpdEJha2UiOgorICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IHNlbGYuYmJkZWJ1ZworICAgICAgICBMb2dnZXIuX19pbml0X18oc2VsZiwgbmFtZSkKKworICAgIGRlZiBiYmRlYnVnKHNlbGYsIGxldmVsLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLmxvZyhsb2dnaW5nLkRFQlVHIC0gbGV2ZWwgKyAxLCBtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBwbGFpbihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLmxvZyhsb2dnaW5nLklORk8gKyAxLCBtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB2ZXJib3NlKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nKGxvZ2dpbmcuSU5GTyAtIDEsIG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCitsb2dnaW5nLnJhaXNlRXhjZXB0aW9ucyA9IEZhbHNlCitsb2dnaW5nLnNldExvZ2dlckNsYXNzKEJCTG9nZ2VyKQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCitsb2dnZXIuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQorbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuREVCVUcgLSAyKQorCisjIFRoaXMgaGFzIHRvIGJlIGltcG9ydGVkIGFmdGVyIHRoZSBzZXRMb2dnZXJDbGFzcywgYXMgdGhlIGltcG9ydCBvZiBiYi5tc2cKKyMgY2FuIHJlc3VsdCBpbiBjb25zdHJ1Y3Rpb24gb2YgdGhlIHZhcmlvdXMgbG9nZ2Vycy4KK2ltcG9ydCBiYi5tc2cKKworZnJvbSBiYiBpbXBvcnQgZmV0Y2gyIGFzIGZldGNoCitzeXMubW9kdWxlc1snYmIuZmV0Y2gnXSA9IHN5cy5tb2R1bGVzWydiYi5mZXRjaDInXQorCisjIE1lc3NhZ2luZyBjb252ZW5pZW5jZSBmdW5jdGlvbnMKK2RlZiBwbGFpbigqYXJncyk6CisgICAgbG9nZ2VyLnBsYWluKCcnLmpvaW4oYXJncykpCisKK2RlZiBkZWJ1ZyhsdmwsICphcmdzKToKKyAgICBpZiBpc2luc3RhbmNlKGx2bCwgYmFzZXN0cmluZyk6CisgICAgICAgIGxvZ2dlci53YXJuKCJQYXNzZWQgaW52YWxpZCBkZWJ1ZyBsZXZlbCAnJXMnIHRvIGJiLmRlYnVnIiwgbHZsKQorICAgICAgICBhcmdzID0gKGx2bCwpICsgYXJncworICAgICAgICBsdmwgPSAxCisgICAgbG9nZ2VyLmRlYnVnKGx2bCwgJycuam9pbihhcmdzKSkKKworZGVmIG5vdGUoKmFyZ3MpOgorICAgIGxvZ2dlci5pbmZvKCcnLmpvaW4oYXJncykpCisKK2RlZiB3YXJuKCphcmdzKToKKyAgICBsb2dnZXIud2FybignJy5qb2luKGFyZ3MpKQorCitkZWYgZXJyb3IoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBsb2dnZXIuZXJyb3IoJycuam9pbihhcmdzKSwgZXh0cmE9a3dhcmdzKQorCitkZWYgZmF0YWwoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBsb2dnZXIuY3JpdGljYWwoJycuam9pbihhcmdzKSwgZXh0cmE9a3dhcmdzKQorICAgIHJhaXNlIEJCSGFuZGxlZEV4Y2VwdGlvbigpCisKK2RlZiBkZXByZWNhdGVkKGZ1bmMsIG5hbWU9Tm9uZSwgYWR2aWNlPSIiKToKKyAgICAiIiJUaGlzIGlzIGEgZGVjb3JhdG9yIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgZnVuY3Rpb25zCisgICAgYXMgZGVwcmVjYXRlZC4gSXQgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGJlaW5nIGVtaXR0ZWQKKyAgICB3aGVuIHRoZSBmdW5jdGlvbiBpcyB1c2VkLiIiIgorICAgIGltcG9ydCB3YXJuaW5ncworCisgICAgaWYgYWR2aWNlOgorICAgICAgICBhZHZpY2UgPSAiOiAlcyIgJSBhZHZpY2UKKyAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgIG5hbWUgPSBmdW5jLl9fbmFtZV9fCisKKyAgICBkZWYgbmV3RnVuYygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICB3YXJuaW5ncy53YXJuKCJDYWxsIHRvIGRlcHJlY2F0ZWQgZnVuY3Rpb24gJXMlcy4iICUgKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgbmV3RnVuYy5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KKyAgICBuZXdGdW5jLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgICBuZXdGdW5jLl9fZGljdF9fLnVwZGF0ZShmdW5jLl9fZGljdF9fKQorICAgIHJldHVybiBuZXdGdW5jCisKKyMgRm9yIGNvbXBhdGliaWxpdHkKK2RlZiBkZXByZWNhdGVfaW1wb3J0KGN1cnJlbnQsIG1vZHVsZW5hbWUsIGZyb21saXN0LCByZW5hbWVzID0gTm9uZSk6CisgICAgIiIiSW1wb3J0IG9iamVjdHMgZnJvbSBvbmUgbW9kdWxlIGludG8gYW5vdGhlciwgd3JhcHBpbmcgdGhlbSB3aXRoIGEgRGVwcmVjYXRpb25XYXJuaW5nIiIiCisgICAgaW1wb3J0IHN5cworCisgICAgbW9kdWxlID0gX19pbXBvcnRfXyhtb2R1bGVuYW1lLCBmcm9tbGlzdCA9IGZyb21saXN0KQorICAgIGZvciBwb3NpdGlvbiwgb2JqbmFtZSBpbiBlbnVtZXJhdGUoZnJvbWxpc3QpOgorICAgICAgICBvYmogPSBnZXRhdHRyKG1vZHVsZSwgb2JqbmFtZSkKKyAgICAgICAgbmV3b2JqID0gZGVwcmVjYXRlZChvYmosICJ7MH0uezF9Ii5mb3JtYXQoY3VycmVudCwgb2JqbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgezB9LnsxfSBpbnN0ZWFkIi5mb3JtYXQobW9kdWxlbmFtZSwgb2JqbmFtZSkpCisgICAgICAgIGlmIHJlbmFtZXM6CisgICAgICAgICAgICBuZXduYW1lID0gcmVuYW1lc1twb3NpdGlvbl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld25hbWUgPSBvYmpuYW1lCisKKyAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1tjdXJyZW50XSwgbmV3bmFtZSwgbmV3b2JqKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9idWlsZC5weSBiL2JpdGJha2UvbGliL2JiL2J1aWxkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGMzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9idWlsZC5weQpAQCAtMCwwICsxLDc3MCBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSAnQnVpbGQnIGltcGxlbWVudGF0aW9uCisjCisjIENvcmUgY29kZSBmb3IgZnVuY3Rpb24gZXhlY3V0aW9uIGFuZCB0YXNrIGhhbmRsaW5nIGluIHRoZQorIyBCaXRCYWtlIGJ1aWxkIHRvb2xzLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIworIyBCYXNlZCBvbiBHZW50b28ncyBwb3J0YWdlLnB5LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc2hsZXgKK2ltcG9ydCBnbG9iCitpbXBvcnQgdGltZQoraW1wb3J0IHN0YXQKK2ltcG9ydCBiYgoraW1wb3J0IGJiLm1zZworaW1wb3J0IGJiLnByb2Nlc3MKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgbmVzdGVkCitmcm9tIGJiIGltcG9ydCBldmVudCwgdXRpbHMKKworYmJsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZScpCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5CdWlsZCcpCisKK05VTEwgPSBvcGVuKG9zLmRldm51bGwsICdyKycpCisKK19fbXRpbWVfY2FjaGUgPSB7fQorCitkZWYgY2FjaGVkX210aW1lX25vZXJyb3IoZik6CisgICAgaWYgZiBub3QgaW4gX19tdGltZV9jYWNoZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX19tdGltZV9jYWNoZVtmXSA9IG9zLnN0YXQoZilbc3RhdC5TVF9NVElNRV0KKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiBfX210aW1lX2NhY2hlW2ZdCisKK2RlZiByZXNldF9jYWNoZSgpOgorICAgIGdsb2JhbCBfX210aW1lX2NhY2hlCisgICAgX19tdGltZV9jYWNoZSA9IHt9CisKKyMgV2hlbiB3ZSBleGVjdXRlIGEgUHl0aG9uIGZ1bmN0aW9uLCB3ZSdkIGxpa2UgY2VydGFpbiB0aGluZ3MKKyMgaW4gYWxsIG5hbWVzcGFjZXMsIGhlbmNlIHdlIGFkZCB0aGVtIHRvIF9fYnVpbHRpbnNfXy4KKyMgSWYgd2UgZG8gbm90IGRvIHRoaXMgYW5kIHVzZSB0aGUgZXhlYyBnbG9iYWxzLCB0aGV5IHdpbGwKKyMgbm90IGJlIGF2YWlsYWJsZSB0byBzdWJmdW5jdGlvbnMuCitfX2J1aWx0aW5zX19bJ2JiJ10gPSBiYgorX19idWlsdGluc19fWydvcyddID0gb3MKKworY2xhc3MgRnVuY0ZhaWxlZChFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lID0gTm9uZSwgbG9nZmlsZSA9IE5vbmUpOgorICAgICAgICBzZWxmLmxvZ2ZpbGUgPSBsb2dmaWxlCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHNlbGYubXNnID0gJ0Z1bmN0aW9uIGZhaWxlZDogJXMnICUgbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tc2cgPSAiRnVuY3Rpb24gZmFpbGVkIgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubG9nZmlsZSBhbmQgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dmaWxlKToKKyAgICAgICAgICAgIG1zZyA9ICgiJXMgKGxvZyBmaWxlIGlzIGxvY2F0ZWQgYXQgJXMpIiAlCisgICAgICAgICAgICAgICAgICAgKHNlbGYubXNnLCBzZWxmLmxvZ2ZpbGUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gc2VsZi5tc2cKKyAgICAgICAgcmV0dXJuIG1zZworCitjbGFzcyBUYXNrQmFzZShldmVudC5FdmVudCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgdGFzayBldmVudHMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0LCBsb2dmaWxlLCBkKToKKyAgICAgICAgc2VsZi5fdGFzayA9IHQKKyAgICAgICAgc2VsZi5fcGFja2FnZSA9IGQuZ2V0VmFyKCJQRiIsIFRydWUpCisgICAgICAgIHNlbGYudGFza2ZpbGUgPSBkLmdldFZhcigiRklMRSIsIFRydWUpCisgICAgICAgIHNlbGYudGFza25hbWUgPSBzZWxmLl90YXNrCisgICAgICAgIHNlbGYubG9nZmlsZSA9IGxvZ2ZpbGUKKyAgICAgICAgc2VsZi50aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgZXZlbnQuRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fbWVzc2FnZSA9ICJyZWNpcGUgJXM6IHRhc2sgJXM6ICVzIiAlIChkLmdldFZhcigiUEYiLCBUcnVlKSwgdCwgc2VsZi5nZXREaXNwbGF5TmFtZSgpKQorCisgICAgZGVmIGdldFRhc2soc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90YXNrCisKKyAgICBkZWYgc2V0VGFzayhzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5fdGFzayA9IHRhc2sKKworICAgIGRlZiBnZXREaXNwbGF5TmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIGJiLmV2ZW50LmdldE5hbWUoc2VsZilbNDpdCisKKyAgICB0YXNrID0gcHJvcGVydHkoZ2V0VGFzaywgc2V0VGFzaywgTm9uZSwgInRhc2sgcHJvcGVydHkiKQorCitjbGFzcyBUYXNrU3RhcnRlZChUYXNrQmFzZSk6CisgICAgIiIiVGFzayBleGVjdXRpb24gc3RhcnRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0LCBsb2dmaWxlLCB0YXNrZmxhZ3MsIGQpOgorICAgICAgICBzdXBlcihUYXNrU3RhcnRlZCwgc2VsZikuX19pbml0X18odCwgbG9nZmlsZSwgZCkKKyAgICAgICAgc2VsZi50YXNrZmxhZ3MgPSB0YXNrZmxhZ3MKKworY2xhc3MgVGFza1N1Y2NlZWRlZChUYXNrQmFzZSk6CisgICAgIiIiVGFzayBleGVjdXRpb24gY29tcGxldGVkIiIiCisKK2NsYXNzIFRhc2tGYWlsZWQoVGFza0Jhc2UpOgorICAgICIiIlRhc2sgZXhlY3V0aW9uIGZhaWxlZCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIGxvZ2ZpbGUsIG1ldGFkYXRhLCBlcnJwcmludGVkID0gRmFsc2UpOgorICAgICAgICBzZWxmLmVycnByaW50ZWQgPSBlcnJwcmludGVkCisgICAgICAgIHN1cGVyKFRhc2tGYWlsZWQsIHNlbGYpLl9faW5pdF9fKHRhc2ssIGxvZ2ZpbGUsIG1ldGFkYXRhKQorCitjbGFzcyBUYXNrRmFpbGVkU2lsZW50KFRhc2tCYXNlKToKKyAgICAiIiJUYXNrIGV4ZWN1dGlvbiBmYWlsZWQgKHNpbGVudGx5KSIiIgorICAgIGRlZiBnZXREaXNwbGF5TmFtZShzZWxmKToKKyAgICAgICAgIyBEb24ndCBuZWVkIHRvIHRlbGwgdGhlIHVzZXIgaXQgd2FzIHNpbGVudAorICAgICAgICByZXR1cm4gIkZhaWxlZCIKKworY2xhc3MgVGFza0ludmFsaWQoVGFza0Jhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIG1ldGFkYXRhKToKKyAgICAgICAgc3VwZXIoVGFza0ludmFsaWQsIHNlbGYpLl9faW5pdF9fKHRhc2ssIE5vbmUsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLl9tZXNzYWdlID0gIk5vIHN1Y2ggdGFzayAnJXMnIiAlIHRhc2sKKworCitjbGFzcyBMb2dUZWUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nZ2VyLCBvdXRmaWxlKToKKyAgICAgICAgc2VsZi5vdXRmaWxlID0gb3V0ZmlsZQorICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dlcgorICAgICAgICBzZWxmLm5hbWUgPSBzZWxmLm91dGZpbGUubmFtZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYubG9nZ2VyLnBsYWluKHN0cmluZykKKyAgICAgICAgc2VsZi5vdXRmaWxlLndyaXRlKHN0cmluZykKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYub3V0ZmlsZS5fX2VudGVyX18oKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNpbmZvKToKKyAgICAgICAgc2VsZi5vdXRmaWxlLl9fZXhpdF9fKCpleGNpbmZvKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzxMb2dUZWUgezB9PicuZm9ybWF0KHNlbGYubmFtZSkKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYub3V0ZmlsZS5mbHVzaCgpCisKK2RlZiBleGVjX2Z1bmMoZnVuYywgZCwgZGlycyA9IE5vbmUpOgorICAgICIiIkV4ZWN1dGUgYSBCQiAnZnVuY3Rpb24nIiIiCisKKyAgICBib2R5ID0gZC5nZXRWYXIoZnVuYywgRmFsc2UpCisgICAgaWYgbm90IGJvZHk6CisgICAgICAgIGlmIGJvZHkgaXMgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGdW5jdGlvbiAlcyBkb2Vzbid0IGV4aXN0IiwgZnVuYykKKyAgICAgICAgcmV0dXJuCisKKyAgICBmbGFncyA9IGQuZ2V0VmFyRmxhZ3MoZnVuYykKKyAgICBjbGVhbmRpcnMgPSBmbGFncy5nZXQoJ2NsZWFuZGlycycpCisgICAgaWYgY2xlYW5kaXJzOgorICAgICAgICBmb3IgY2RpciBpbiBkLmV4cGFuZChjbGVhbmRpcnMpLnNwbGl0KCk6CisgICAgICAgICAgICBiYi51dGlscy5yZW1vdmUoY2RpciwgVHJ1ZSkKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihjZGlyKQorCisgICAgaWYgZGlycyBpcyBOb25lOgorICAgICAgICBkaXJzID0gZmxhZ3MuZ2V0KCdkaXJzJykKKyAgICAgICAgaWYgZGlyczoKKyAgICAgICAgICAgIGRpcnMgPSBkLmV4cGFuZChkaXJzKS5zcGxpdCgpCisKKyAgICBpZiBkaXJzOgorICAgICAgICBmb3IgYWRpciBpbiBkaXJzOgorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKGFkaXIpCisgICAgICAgIGFkaXIgPSBkaXJzWy0xXQorICAgIGVsc2U6CisgICAgICAgIGFkaXIgPSBkLmdldFZhcignQicsIFRydWUpCisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihhZGlyKQorCisgICAgaXNweXRob24gPSBmbGFncy5nZXQoJ3B5dGhvbicpCisKKyAgICBsb2NrZmxhZyA9IGZsYWdzLmdldCgnbG9ja2ZpbGVzJykKKyAgICBpZiBsb2NrZmxhZzoKKyAgICAgICAgbG9ja2ZpbGVzID0gW2YgZm9yIGYgaW4gZC5leHBhbmQobG9ja2ZsYWcpLnNwbGl0KCldCisgICAgZWxzZToKKyAgICAgICAgbG9ja2ZpbGVzID0gTm9uZQorCisgICAgdGVtcGRpciA9IGQuZ2V0VmFyKCdUJywgVHJ1ZSkKKworICAgICMgb3IgZnVuYyBhbGxvd3MgaXRlbXMgdG8gYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiB0aGUgbm9ybWFsCisgICAgIyB0YXNrIHNldCwgc3VjaCBhcyBidWlsZGhpc3RvcnkKKyAgICB0YXNrID0gZC5nZXRWYXIoJ0JCX1JVTlRBU0snLCBUcnVlKSBvciBmdW5jCisgICAgaWYgdGFzayA9PSBmdW5jOgorICAgICAgICB0YXNrZnVuYyA9IHRhc2sKKyAgICBlbHNlOgorICAgICAgICB0YXNrZnVuYyA9ICIlcy4lcyIgJSAodGFzaywgZnVuYykKKworICAgIHJ1bmZtdCA9IGQuZ2V0VmFyKCdCQl9SVU5GTVQnLCBUcnVlKSBvciAicnVuLntmdW5jfS57cGlkfSIKKyAgICBydW5mbiA9IHJ1bmZtdC5mb3JtYXQodGFza2Z1bmM9dGFza2Z1bmMsIHRhc2s9dGFzaywgZnVuYz1mdW5jLCBwaWQ9b3MuZ2V0cGlkKCkpCisgICAgcnVuZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBydW5mbikKKyAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKHJ1bmZpbGUpKQorCisgICAgIyBTZXR1cCB0aGUgY291cnRlc3kgbGluayB0byB0aGUgcnVuZm4sIG9ubHkgZm9yIHRhc2tzCisgICAgIyB3ZSBjcmVhdGUgdGhlIGxpbmsgJ2p1c3QnIGJlZm9yZSB0aGUgcnVuIHNjcmlwdCBpcyBjcmVhdGVkCisgICAgIyBpZiB3ZSBjcmVhdGUgaXQgYWZ0ZXIsIGFuZCBpZiB0aGUgcnVuIHNjcmlwdCBmYWlscywgdGhlbiB0aGUKKyAgICAjIGxpbmsgd29uJ3QgYmUgY3JlYXRlZCBhcyBhbiBleGNlcHRpb24gd291bGQgYmUgZmlyZWQuCisgICAgaWYgdGFzayA9PSBmdW5jOgorICAgICAgICBydW5saW5rID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICdydW4uezB9Jy5mb3JtYXQodGFzaykpCisgICAgICAgIGlmIHJ1bmxpbms6CisgICAgICAgICAgICBiYi51dGlscy5yZW1vdmUocnVubGluaykKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsocnVuZm4sIHJ1bmxpbmspCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICB3aXRoIGJiLnV0aWxzLmZpbGVzbG9ja2VkKGxvY2tmaWxlcyk6CisgICAgICAgIGlmIGlzcHl0aG9uOgorICAgICAgICAgICAgZXhlY19mdW5jX3B5dGhvbihmdW5jLCBkLCBydW5maWxlLCBjd2Q9YWRpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4ZWNfZnVuY19zaGVsbChmdW5jLCBkLCBydW5maWxlLCBjd2Q9YWRpcikKKworX2Z1bmN0aW9uZm10ID0gIiIiCitkZWYge2Z1bmN0aW9ufShkKToKK3tib2R5fQorCit7ZnVuY3Rpb259KGQpCisiIiIKK2xvZ2Zvcm1hdHRlciA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcigiJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiKQorZGVmIGV4ZWNfZnVuY19weXRob24oZnVuYywgZCwgcnVuZmlsZSwgY3dkPU5vbmUpOgorICAgICIiIkV4ZWN1dGUgYSBweXRob24gQkIgJ2Z1bmN0aW9uJyIiIgorCisgICAgYmJmaWxlID0gZC5nZXRWYXIoJ0ZJTEUnLCBUcnVlKQorICAgIGNvZGUgPSBfZnVuY3Rpb25mbXQuZm9ybWF0KGZ1bmN0aW9uPWZ1bmMsIGJvZHk9ZC5nZXRWYXIoZnVuYywgVHJ1ZSkpCisgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShydW5maWxlKSkKKyAgICB3aXRoIG9wZW4ocnVuZmlsZSwgJ3cnKSBhcyBzY3JpcHQ6CisgICAgICAgIGJiLmRhdGEuZW1pdF9mdW5jX3B5dGhvbihmdW5jLCBzY3JpcHQsIGQpCisKKyAgICBpZiBjd2Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9sZGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgb2xkZGlyID0gTm9uZQorICAgICAgICBvcy5jaGRpcihjd2QpCisKKyAgICBiYi5kZWJ1ZygyLCAiRXhlY3V0aW5nIHB5dGhvbiBmdW5jdGlvbiAlcyIgJSBmdW5jKQorCisgICAgdHJ5OgorICAgICAgICBjb21wID0gdXRpbHMuYmV0dGVyX2NvbXBpbGUoY29kZSwgZnVuYywgYmJmaWxlKQorICAgICAgICB1dGlscy5iZXR0ZXJfZXhlYyhjb21wLCB7ImQiOiBkfSwgY29kZSwgYmJmaWxlKQorICAgIGV4Y2VwdCAoYmIucGFyc2UuU2tpcFJlY2lwZSwgYmIuYnVpbGQuRnVuY0ZhaWxlZCk6CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0OgorICAgICAgICByYWlzZSBGdW5jRmFpbGVkKGZ1bmMsIE5vbmUpCisgICAgZmluYWxseToKKyAgICAgICAgYmIuZGVidWcoMiwgIlB5dGhvbiBmdW5jdGlvbiAlcyBmaW5pc2hlZCIgJSBmdW5jKQorCisgICAgICAgIGlmIGN3ZCBhbmQgb2xkZGlyOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZGRpcikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworZGVmIHNoZWxsX3RyYXBfY29kZSgpOgorICAgIHJldHVybiAnJycjIS9iaW4vc2hcbgorIyBFbWl0IGEgdXNlZnVsIGRpYWdub3N0aWMgaWYgc29tZXRoaW5nIGZhaWxzOgorYmJfZXhpdF9oYW5kbGVyKCkgeworICAgIHJldD0kPworICAgIGNhc2UgJHJldCBpbgorICAgIDApICA7OworICAgICopICBjYXNlICRCQVNIX1ZFUlNJT04gaW4KKyAgICAgICAgIiIpICAgZWNobyAiV0FSTklORzogZXhpdCBjb2RlICRyZXQgZnJvbSBhIHNoZWxsIGNvbW1hbmQuIjs7CisgICAgICAgICopICAgIGVjaG8gIldBUk5JTkc6ICR7QkFTSF9TT1VSQ0VbMF19OiR7QkFTSF9MSU5FTk9bMF19IGV4aXQgJHJldCBmcm9tCisgIFwiJEJBU0hfQ09NTUFORFwiIjs7CisgICAgICAgIGVzYWMKKyAgICAgICAgZXhpdCAkcmV0CisgICAgZXNhYworfQordHJhcCAnYmJfZXhpdF9oYW5kbGVyJyAwCitzZXQgLWUKKycnJworCitkZWYgZXhlY19mdW5jX3NoZWxsKGZ1bmMsIGQsIHJ1bmZpbGUsIGN3ZD1Ob25lKToKKyAgICAiIiJFeGVjdXRlIGEgc2hlbGwgZnVuY3Rpb24gZnJvbSB0aGUgbWV0YWRhdGEKKworICAgIE5vdGUgb24gZGlyZWN0b3J5IGJlaGF2aW9yLiAgVGhlICdkaXJzJyB2YXJmbGFnIHNob3VsZCBjb250YWluIGEgbGlzdAorICAgIG9mIHRoZSBkaXJlY3RvcmllcyB5b3UgbmVlZCBjcmVhdGVkIHByaW9yIHRvIGV4ZWN1dGlvbi4gIFRoZSBsYXN0CisgICAgaXRlbSBpbiB0aGUgbGlzdCBpcyB3aGVyZSB3ZSB3aWxsIGNoZGlyL2NkIHRvLgorICAgICIiIgorCisgICAgIyBEb24ndCBsZXQgdGhlIGVtaXR0ZWQgc2hlbGwgc2NyaXB0IG92ZXJyaWRlIFBXRAorICAgIGQuZGVsVmFyRmxhZygnUFdEJywgJ2V4cG9ydCcpCisKKyAgICB3aXRoIG9wZW4ocnVuZmlsZSwgJ3cnKSBhcyBzY3JpcHQ6CisgICAgICAgIHNjcmlwdC53cml0ZShzaGVsbF90cmFwX2NvZGUoKSkKKworICAgICAgICBiYi5kYXRhLmVtaXRfZnVuYyhmdW5jLCBzY3JpcHQsIGQpCisKKyAgICAgICAgaWYgYmIubXNnLmxvZ2dlclZlcmJvc2VMb2dzOgorICAgICAgICAgICAgc2NyaXB0LndyaXRlKCJzZXQgLXhcbiIpCisgICAgICAgIGlmIGN3ZDoKKyAgICAgICAgICAgIHNjcmlwdC53cml0ZSgiY2QgJyVzJ1xuIiAlIGN3ZCkKKyAgICAgICAgc2NyaXB0LndyaXRlKCIlc1xuIiAlIGZ1bmMpCisgICAgICAgIHNjcmlwdC53cml0ZSgnJycKKyMgY2xlYW51cAorcmV0PSQ/Cit0cmFwICcnIDAKK2V4aXQgJHJldAorJycnKQorCisgICAgb3MuY2htb2QocnVuZmlsZSwgMDc3NSkKKworICAgIGNtZCA9IHJ1bmZpbGUKKyAgICBpZiBkLmdldFZhckZsYWcoZnVuYywgJ2Zha2Vyb290Jyk6CisgICAgICAgIGZha2Vyb290Y21kID0gZC5nZXRWYXIoJ0ZBS0VST09UJywgVHJ1ZSkKKyAgICAgICAgaWYgZmFrZXJvb3RjbWQ6CisgICAgICAgICAgICBjbWQgPSBbZmFrZXJvb3RjbWQsIHJ1bmZpbGVdCisKKyAgICBpZiBiYi5tc2cubG9nZ2VyRGVmYXVsdFZlcmJvc2U6CisgICAgICAgIGxvZ2ZpbGUgPSBMb2dUZWUobG9nZ2VyLCBzeXMuc3Rkb3V0KQorICAgIGVsc2U6CisgICAgICAgIGxvZ2ZpbGUgPSBzeXMuc3Rkb3V0CisKKyAgICBkZWYgcmVhZGZpZm8oZGF0YSk6CisgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdCgnXDAnKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIHNwbGl0dmFsID0gbGluZS5zcGxpdCgnICcsIDEpCisgICAgICAgICAgICBjbWQgPSBzcGxpdHZhbFswXQorICAgICAgICAgICAgaWYgbGVuKHNwbGl0dmFsKSA+IDE6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzcGxpdHZhbFsxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnCisgICAgICAgICAgICBpZiBjbWQgPT0gJ2JicGxhaW4nOgorICAgICAgICAgICAgICAgIGJiLnBsYWluKHZhbHVlKQorICAgICAgICAgICAgZWxpZiBjbWQgPT0gJ2Jibm90ZSc6CisgICAgICAgICAgICAgICAgYmIubm90ZSh2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgY21kID09ICdiYndhcm4nOgorICAgICAgICAgICAgICAgIGJiLndhcm4odmFsdWUpCisgICAgICAgICAgICBlbGlmIGNtZCA9PSAnYmJlcnJvcic6CisgICAgICAgICAgICAgICAgYmIuZXJyb3IodmFsdWUpCisgICAgICAgICAgICBlbGlmIGNtZCA9PSAnYmJmYXRhbCc6CisgICAgICAgICAgICAgICAgIyBUaGUgY2FsbGVyIHdpbGwgY2FsbCBleGl0IHRoZW1zZWx2ZXMsIHNvIGJiLmVycm9yKCkgaXMKKyAgICAgICAgICAgICAgICAjIHdoYXQgd2Ugd2FudCBoZXJlIHJhdGhlciB0aGFuIGJiLmZhdGFsKCkKKyAgICAgICAgICAgICAgICBiYi5lcnJvcih2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgY21kID09ICdiYmZhdGFsX2xvZyc6CisgICAgICAgICAgICAgICAgYmIuZXJyb3IodmFsdWUsIGZvcmNlbG9nPVRydWUpCisgICAgICAgICAgICBlbGlmIGNtZCA9PSAnYmJkZWJ1Zyc6CisgICAgICAgICAgICAgICAgc3BsaXR2YWwgPSB2YWx1ZS5zcGxpdCgnICcsIDEpCisgICAgICAgICAgICAgICAgbGV2ZWwgPSBpbnQoc3BsaXR2YWxbMF0pCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzcGxpdHZhbFsxXQorICAgICAgICAgICAgICAgIGJiLmRlYnVnKGxldmVsLCB2YWx1ZSkKKworICAgIHRlbXBkaXIgPSBkLmdldFZhcignVCcsIFRydWUpCisgICAgZmlmb3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ2ZpZm8uJXMnICUgb3MuZ2V0cGlkKCkpCisgICAgaWYgb3MucGF0aC5leGlzdHMoZmlmb3BhdGgpOgorICAgICAgICBvcy51bmxpbmsoZmlmb3BhdGgpCisgICAgb3MubWtmaWZvKGZpZm9wYXRoKQorICAgIHdpdGggb3BlbihmaWZvcGF0aCwgJ3IrJykgYXMgZmlmbzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYmIuZGVidWcoMiwgIkV4ZWN1dGluZyBzaGVsbCBmdW5jdGlvbiAlcyIgJSBmdW5jKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICdyKycpIGFzIHN0ZGluOgorICAgICAgICAgICAgICAgICAgICBiYi5wcm9jZXNzLnJ1bihjbWQsIHNoZWxsPUZhbHNlLCBzdGRpbj1zdGRpbiwgbG9nPWxvZ2ZpbGUsIGV4dHJhZmlsZXM9WyhmaWZvLHJlYWRmaWZvKV0pCisgICAgICAgICAgICBleGNlcHQgYmIucHJvY2Vzcy5DbWRFcnJvcjoKKyAgICAgICAgICAgICAgICBsb2dmbiA9IGQuZ2V0VmFyKCdCQl9MT0dGSUxFJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICByYWlzZSBGdW5jRmFpbGVkKGZ1bmMsIGxvZ2ZuKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGZpZm9wYXRoKQorCisgICAgYmIuZGVidWcoMiwgIlNoZWxsIGZ1bmN0aW9uICVzIGZpbmlzaGVkIiAlIGZ1bmMpCisKK2RlZiBfdGFza19kYXRhKGZuLCB0YXNrLCBkKToKKyAgICBsb2NhbGRhdGEgPSBiYi5kYXRhLmNyZWF0ZUNvcHkoZCkKKyAgICBsb2NhbGRhdGEuc2V0VmFyKCdCQl9GSUxFTkFNRScsIGZuKQorICAgIGxvY2FsZGF0YS5zZXRWYXIoJ0JCX0NVUlJFTlRUQVNLJywgdGFza1szOl0pCisgICAgbG9jYWxkYXRhLnNldFZhcignT1ZFUlJJREVTJywgJ3Rhc2stJXM6JXMnICUKKyAgICAgICAgICAgICAgICAgICAgICh0YXNrWzM6XS5yZXBsYWNlKCdfJywgJy0nKSwgZC5nZXRWYXIoJ09WRVJSSURFUycsIEZhbHNlKSkpCisgICAgbG9jYWxkYXRhLmZpbmFsaXplKCkKKyAgICBiYi5kYXRhLmV4cGFuZEtleXMobG9jYWxkYXRhKQorICAgIHJldHVybiBsb2NhbGRhdGEKKworZGVmIF9leGVjX3Rhc2soZm4sIHRhc2ssIGQsIHF1aWV0ZXJyKToKKyAgICAiIiJFeGVjdXRlIGEgQkIgJ3Rhc2snCisKKyAgICBFeGVjdXRpb24gb2YgYSB0YXNrIGludm9sdmVzIGEgYml0IG1vcmUgc2V0dXAgdGhhbiBleGVjdXRpbmcgYSBmdW5jdGlvbiwKKyAgICBydW5uaW5nIGl0IHdpdGggaXRzIG93biBsb2NhbCBtZXRhZGF0YSwgYW5kIHdpdGggc29tZSB1c2VmdWwgdmFyaWFibGVzIHNldC4KKyAgICAiIiIKKyAgICBpZiBub3QgZC5nZXRWYXJGbGFnKHRhc2ssICd0YXNrJyk6CisgICAgICAgIGV2ZW50LmZpcmUoVGFza0ludmFsaWQodGFzaywgZCksIGQpCisgICAgICAgIGxvZ2dlci5lcnJvcigiTm8gc3VjaCB0YXNrOiAlcyIgJSB0YXNrKQorICAgICAgICByZXR1cm4gMQorCisgICAgbG9nZ2VyLmRlYnVnKDEsICJFeGVjdXRpbmcgdGFzayAlcyIsIHRhc2spCisKKyAgICBsb2NhbGRhdGEgPSBfdGFza19kYXRhKGZuLCB0YXNrLCBkKQorICAgIHRlbXBkaXIgPSBsb2NhbGRhdGEuZ2V0VmFyKCdUJywgVHJ1ZSkKKyAgICBpZiBub3QgdGVtcGRpcjoKKyAgICAgICAgYmIuZmF0YWwoIlQgdmFyaWFibGUgbm90IHNldCwgdW5hYmxlIHRvIGJ1aWxkIikKKworICAgICMgQ2hhbmdlIG5pY2UgbGV2ZWwgaWYgd2UncmUgYXNrZWQgdG8KKyAgICBuaWNlID0gbG9jYWxkYXRhLmdldFZhcigiQkJfVEFTS19OSUNFX0xFVkVMIiwgVHJ1ZSkKKyAgICBpZiBuaWNlOgorICAgICAgICBjdXJuaWNlID0gb3MubmljZSgwKQorICAgICAgICBuaWNlID0gaW50KG5pY2UpIC0gY3VybmljZQorICAgICAgICBuZXduaWNlID0gb3MubmljZShuaWNlKQorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJlbmljZSB0byAlcyAiICUgbmV3bmljZSkKKworICAgIGJiLnV0aWxzLm1rZGlyaGllcih0ZW1wZGlyKQorCisgICAgIyBEZXRlcm1pbmUgdGhlIGxvZ2ZpbGUgdG8gZ2VuZXJhdGUKKyAgICBsb2dmbXQgPSBsb2NhbGRhdGEuZ2V0VmFyKCdCQl9MT0dGTVQnLCBUcnVlKSBvciAnbG9nLnt0YXNrfS57cGlkfScKKyAgICBsb2diYXNlID0gbG9nZm10LmZvcm1hdCh0YXNrPXRhc2ssIHBpZD1vcy5nZXRwaWQoKSkKKworICAgICMgRG9jdW1lbnQgdGhlIG9yZGVyIG9mIHRoZSB0YXNrcy4uLgorICAgIGxvZ29yZGVyID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICdsb2cudGFza19vcmRlcicpCisgICAgdHJ5OgorICAgICAgICB3aXRoIG9wZW4obG9nb3JkZXIsICdhJykgYXMgbG9nb3JkZXJmaWxlOgorICAgICAgICAgICAgbG9nb3JkZXJmaWxlLndyaXRlKCd7MH0gKHsxfSk6IHsyfVxuJy5mb3JtYXQodGFzaywgb3MuZ2V0cGlkKCksIGxvZ2Jhc2UpKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJPcGVuaW5nIGxvZyBmaWxlICclcyciLCBsb2dvcmRlcikKKyAgICAgICAgcGFzcworCisgICAgIyBTZXR1cCB0aGUgY291cnRlc3kgbGluayB0byB0aGUgbG9nZm4KKyAgICBsb2dsaW5rID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICdsb2cuezB9Jy5mb3JtYXQodGFzaykpCisgICAgbG9nZm4gPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgbG9nYmFzZSkKKyAgICBpZiBsb2dsaW5rOgorICAgICAgICBiYi51dGlscy5yZW1vdmUobG9nbGluaykKKworICAgICAgICB0cnk6CisgICAgICAgICAgIG9zLnN5bWxpbmsobG9nYmFzZSwgbG9nbGluaykKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgIHBhc3MKKworICAgIHByZWZ1bmNzID0gbG9jYWxkYXRhLmdldFZhckZsYWcodGFzaywgJ3ByZWZ1bmNzJywgZXhwYW5kPVRydWUpCisgICAgcG9zdGZ1bmNzID0gbG9jYWxkYXRhLmdldFZhckZsYWcodGFzaywgJ3Bvc3RmdW5jcycsIGV4cGFuZD1UcnVlKQorCisgICAgY2xhc3MgRXJyb3JDaGVja0hhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi50cmlnZ2VyZWQgPSBGYWxzZQorICAgICAgICAgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYsIGxvZ2dpbmcuRVJST1IpCisgICAgICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICAgICBpZiBnZXRhdHRyKHJlY29yZCwgJ2ZvcmNlbG9nJywgRmFsc2UpOgorICAgICAgICAgICAgICAgIHNlbGYudHJpZ2dlcmVkID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50cmlnZ2VyZWQgPSBUcnVlCisKKyAgICAjIEhhbmRsZSBsb2dmaWxlcworICAgIHNpID0gb3BlbignL2Rldi9udWxsJywgJ3InKQorICAgIHRyeToKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShsb2dmbikpCisgICAgICAgIGxvZ2ZpbGUgPSBvcGVuKGxvZ2ZuLCAndycpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIk9wZW5pbmcgbG9nIGZpbGUgJyVzJyIsIGxvZ2ZuKQorICAgICAgICBwYXNzCisKKyAgICAjIER1cCB0aGUgZXhpc3RpbmcgZmRzIHNvIHdlIGRvbnQgbG9zZSB0aGVtCisgICAgb3NpID0gW29zLmR1cChzeXMuc3RkaW4uZmlsZW5vKCkpLCBzeXMuc3RkaW4uZmlsZW5vKCldCisgICAgb3NvID0gW29zLmR1cChzeXMuc3Rkb3V0LmZpbGVubygpKSwgc3lzLnN0ZG91dC5maWxlbm8oKV0KKyAgICBvc2UgPSBbb3MuZHVwKHN5cy5zdGRlcnIuZmlsZW5vKCkpLCBzeXMuc3RkZXJyLmZpbGVubygpXQorCisgICAgIyBSZXBsYWNlIHRob3NlIGZkcyB3aXRoIG91ciBvd24KKyAgICBvcy5kdXAyKHNpLmZpbGVubygpLCBvc2lbMV0pCisgICAgb3MuZHVwMihsb2dmaWxlLmZpbGVubygpLCBvc29bMV0pCisgICAgb3MuZHVwMihsb2dmaWxlLmZpbGVubygpLCBvc2VbMV0pCisKKyAgICAjIEVuc3VyZSBQeXRob24gbG9nZ2luZyBnb2VzIHRvIHRoZSBsb2dmaWxlCisgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihsb2dmaWxlKQorICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2Zvcm1hdHRlcikKKyAgICAjIEFsd2F5cyBlbmFibGUgZnVsbCBkZWJ1ZyBvdXRwdXQgaW50byB0YXNrIGxvZ2ZpbGVzCisgICAgaGFuZGxlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHIC0gMikKKyAgICBiYmxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCisKKyAgICBlcnJjaGsgPSBFcnJvckNoZWNrSGFuZGxlcigpCisgICAgYmJsb2dnZXIuYWRkSGFuZGxlcihlcnJjaGspCisKKyAgICBsb2NhbGRhdGEuc2V0VmFyKCdCQl9MT0dGSUxFJywgbG9nZm4pCisgICAgbG9jYWxkYXRhLnNldFZhcignQkJfUlVOVEFTSycsIHRhc2spCisKKyAgICBmbGFncyA9IGxvY2FsZGF0YS5nZXRWYXJGbGFncyh0YXNrKQorCisgICAgZXZlbnQuZmlyZShUYXNrU3RhcnRlZCh0YXNrLCBsb2dmbiwgZmxhZ3MsIGxvY2FsZGF0YSksIGxvY2FsZGF0YSkKKyAgICB0cnk6CisgICAgICAgIGZvciBmdW5jIGluIChwcmVmdW5jcyBvciAnJykuc3BsaXQoKToKKyAgICAgICAgICAgIGV4ZWNfZnVuYyhmdW5jLCBsb2NhbGRhdGEpCisgICAgICAgIGV4ZWNfZnVuYyh0YXNrLCBsb2NhbGRhdGEpCisgICAgICAgIGZvciBmdW5jIGluIChwb3N0ZnVuY3Mgb3IgJycpLnNwbGl0KCk6CisgICAgICAgICAgICBleGVjX2Z1bmMoZnVuYywgbG9jYWxkYXRhKQorICAgIGV4Y2VwdCBGdW5jRmFpbGVkIGFzIGV4YzoKKyAgICAgICAgaWYgcXVpZXRlcnI6CisgICAgICAgICAgICBldmVudC5maXJlKFRhc2tGYWlsZWRTaWxlbnQodGFzaywgbG9nZm4sIGxvY2FsZGF0YSksIGxvY2FsZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVycnByaW50ZWQgPSBlcnJjaGsudHJpZ2dlcmVkCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisgICAgICAgICAgICBldmVudC5maXJlKFRhc2tGYWlsZWQodGFzaywgbG9nZm4sIGxvY2FsZGF0YSwgZXJycHJpbnRlZCksIGxvY2FsZGF0YSkKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCisKKyAgICAgICAgYmJsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgYmFja3VwIGZkcworICAgICAgICBvcy5kdXAyKG9zaVswXSwgb3NpWzFdKQorICAgICAgICBvcy5kdXAyKG9zb1swXSwgb3NvWzFdKQorICAgICAgICBvcy5kdXAyKG9zZVswXSwgb3NlWzFdKQorCisgICAgICAgICMgQ2xvc2UgdGhlIGJhY2t1cCBmZHMKKyAgICAgICAgb3MuY2xvc2Uob3NpWzBdKQorICAgICAgICBvcy5jbG9zZShvc29bMF0pCisgICAgICAgIG9zLmNsb3NlKG9zZVswXSkKKyAgICAgICAgc2kuY2xvc2UoKQorCisgICAgICAgIGxvZ2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2dmbikgYW5kIG9zLnBhdGguZ2V0c2l6ZShsb2dmbikgPT0gMDoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiWmVybyBzaXplIGxvZ2ZuICVzLCByZW1vdmluZyIsIGxvZ2ZuKQorICAgICAgICAgICAgYmIudXRpbHMucmVtb3ZlKGxvZ2ZuKQorICAgICAgICAgICAgYmIudXRpbHMucmVtb3ZlKGxvZ2xpbmspCisgICAgZXZlbnQuZmlyZShUYXNrU3VjY2VlZGVkKHRhc2ssIGxvZ2ZuLCBsb2NhbGRhdGEpLCBsb2NhbGRhdGEpCisKKyAgICBpZiBub3QgbG9jYWxkYXRhLmdldFZhckZsYWcodGFzaywgJ25vc3RhbXAnKSBhbmQgbm90IGxvY2FsZGF0YS5nZXRWYXJGbGFnKHRhc2ssICdzZWxmc3RhbXAnKToKKyAgICAgICAgbWFrZV9zdGFtcCh0YXNrLCBsb2NhbGRhdGEpCisKKyAgICByZXR1cm4gMAorCitkZWYgZXhlY190YXNrKGZuLCB0YXNrLCBkLCBwcm9maWxlID0gRmFsc2UpOgorICAgIHRyeToKKyAgICAgICAgcXVpZXRlcnIgPSBGYWxzZQorICAgICAgICBpZiBkLmdldFZhckZsYWcodGFzaywgInF1aWV0ZXJyb3JzIikgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBxdWlldGVyciA9IFRydWUKKworICAgICAgICBpZiBwcm9maWxlOgorICAgICAgICAgICAgcHJvZm5hbWUgPSAicHJvZmlsZS0lcy5sb2ciICUgKGQuZ2V0VmFyKCJQTiIsIFRydWUpICsgIi0iICsgdGFzaykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgY1Byb2ZpbGUgYXMgcHJvZmlsZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxlCisgICAgICAgICAgICBwcm9mID0gcHJvZmlsZS5Qcm9maWxlKCkKKyAgICAgICAgICAgIHJldCA9IHByb2ZpbGUuUHJvZmlsZS5ydW5jYWxsKHByb2YsIF9leGVjX3Rhc2ssIGZuLCB0YXNrLCBkLCBxdWlldGVycikKKyAgICAgICAgICAgIHByb2YuZHVtcF9zdGF0cyhwcm9mbmFtZSkKKyAgICAgICAgICAgIGJiLnV0aWxzLnByb2Nlc3NfcHJvZmlsZWxvZyhwcm9mbmFtZSkKKworICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIF9leGVjX3Rhc2soZm4sIHRhc2ssIGQsIHF1aWV0ZXJyKQorCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgZnJvbSB0cmFjZWJhY2sgaW1wb3J0IGZvcm1hdF9leGMKKyAgICAgICAgaWYgbm90IHF1aWV0ZXJyOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJCdWlsZCBvZiAlcyBmYWlsZWQiICUgKHRhc2spKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGZvcm1hdF9leGMoKSkKKyAgICAgICAgICAgIGZhaWxlZGV2ZW50ID0gVGFza0ZhaWxlZCh0YXNrLCBOb25lLCBkLCBUcnVlKQorICAgICAgICAgICAgZXZlbnQuZmlyZShmYWlsZWRldmVudCwgZCkKKyAgICAgICAgcmV0dXJuIDEKKworZGVmIHN0YW1wX2ludGVybmFsKHRhc2tuYW1lLCBkLCBmaWxlX25hbWUsIGJhc2Vvbmx5PUZhbHNlKToKKyAgICAiIiIKKyAgICBJbnRlcm5hbCBzdGFtcCBoZWxwZXIgZnVuY3Rpb24KKyAgICBNYWtlcyBzdXJlIHRoZSBzdGFtcCBkaXJlY3RvcnkgZXhpc3RzCisgICAgUmV0dXJucyB0aGUgc3RhbXAgcGF0aCtmaWxlbmFtZQorCisgICAgSW4gdGhlIGJpdGJha2UgY29yZSwgZCBjYW4gYmUgYSBDYWNoZURhdGEgYW5kIGZpbGVfbmFtZSB3aWxsIGJlIHNldC4KKyAgICBXaGVuIGNhbGxlZCBpbiB0YXNrIGNvbnRleHQsIGQgd2lsbCBiZSBhIGRhdGEgc3RvcmUsIGZpbGVfbmFtZSB3aWxsIG5vdCBiZSBzZXQKKyAgICAiIiIKKyAgICB0YXNrZmxhZ25hbWUgPSB0YXNrbmFtZQorICAgIGlmIHRhc2tuYW1lLmVuZHN3aXRoKCJfc2V0c2NlbmUiKSBhbmQgdGFza25hbWUgIT0gImRvX3NldHNjZW5lIjoKKyAgICAgICAgdGFza2ZsYWduYW1lID0gdGFza25hbWUucmVwbGFjZSgiX3NldHNjZW5lIiwgIiIpCisKKyAgICBpZiBmaWxlX25hbWU6CisgICAgICAgIHN0YW1wID0gZC5zdGFtcF9iYXNlW2ZpbGVfbmFtZV0uZ2V0KHRhc2tmbGFnbmFtZSkgb3IgZC5zdGFtcFtmaWxlX25hbWVdCisgICAgICAgIGV4dHJhaW5mbyA9IGQuc3RhbXBfZXh0cmFpbmZvW2ZpbGVfbmFtZV0uZ2V0KHRhc2tmbGFnbmFtZSkgb3IgIiIKKyAgICBlbHNlOgorICAgICAgICBzdGFtcCA9IGQuZ2V0VmFyRmxhZyh0YXNrZmxhZ25hbWUsICdzdGFtcC1iYXNlJywgVHJ1ZSkgb3IgZC5nZXRWYXIoJ1NUQU1QJywgVHJ1ZSkKKyAgICAgICAgZmlsZV9uYW1lID0gZC5nZXRWYXIoJ0JCX0ZJTEVOQU1FJywgVHJ1ZSkKKyAgICAgICAgZXh0cmFpbmZvID0gZC5nZXRWYXJGbGFnKHRhc2tmbGFnbmFtZSwgJ3N0YW1wLWV4dHJhLWluZm8nLCBUcnVlKSBvciAiIgorCisgICAgaWYgYmFzZW9ubHk6CisgICAgICAgIHJldHVybiBzdGFtcAorCisgICAgaWYgbm90IHN0YW1wOgorICAgICAgICByZXR1cm4KKworICAgIHN0YW1wID0gYmIucGFyc2Uuc2lnZ2VuLnN0YW1wZmlsZShzdGFtcCwgZmlsZV9uYW1lLCB0YXNrbmFtZSwgZXh0cmFpbmZvKQorCisgICAgc3RhbXBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoc3RhbXApCisgICAgaWYgY2FjaGVkX210aW1lX25vZXJyb3Ioc3RhbXBkaXIpID09IDA6CisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihzdGFtcGRpcikKKworICAgIHJldHVybiBzdGFtcAorCitkZWYgc3RhbXBfY2xlYW5tYXNrX2ludGVybmFsKHRhc2tuYW1lLCBkLCBmaWxlX25hbWUpOgorICAgICIiIgorICAgIEludGVybmFsIHN0YW1wIGhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSBzdGFtcCBjbGVhbmluZyBtYXNrCisgICAgUmV0dXJucyB0aGUgc3RhbXAgcGF0aCtmaWxlbmFtZQorCisgICAgSW4gdGhlIGJpdGJha2UgY29yZSwgZCBjYW4gYmUgYSBDYWNoZURhdGEgYW5kIGZpbGVfbmFtZSB3aWxsIGJlIHNldC4KKyAgICBXaGVuIGNhbGxlZCBpbiB0YXNrIGNvbnRleHQsIGQgd2lsbCBiZSBhIGRhdGEgc3RvcmUsIGZpbGVfbmFtZSB3aWxsIG5vdCBiZSBzZXQKKyAgICAiIiIKKyAgICB0YXNrZmxhZ25hbWUgPSB0YXNrbmFtZQorICAgIGlmIHRhc2tuYW1lLmVuZHN3aXRoKCJfc2V0c2NlbmUiKSBhbmQgdGFza25hbWUgIT0gImRvX3NldHNjZW5lIjoKKyAgICAgICAgdGFza2ZsYWduYW1lID0gdGFza25hbWUucmVwbGFjZSgiX3NldHNjZW5lIiwgIiIpCisKKyAgICBpZiBmaWxlX25hbWU6CisgICAgICAgIHN0YW1wID0gZC5zdGFtcF9iYXNlX2NsZWFuW2ZpbGVfbmFtZV0uZ2V0KHRhc2tmbGFnbmFtZSkgb3IgZC5zdGFtcGNsZWFuW2ZpbGVfbmFtZV0KKyAgICAgICAgZXh0cmFpbmZvID0gZC5zdGFtcF9leHRyYWluZm9bZmlsZV9uYW1lXS5nZXQodGFza2ZsYWduYW1lKSBvciAiIgorICAgIGVsc2U6CisgICAgICAgIHN0YW1wID0gZC5nZXRWYXJGbGFnKHRhc2tmbGFnbmFtZSwgJ3N0YW1wLWJhc2UtY2xlYW4nLCBUcnVlKSBvciBkLmdldFZhcignU1RBTVBDTEVBTicsIFRydWUpCisgICAgICAgIGZpbGVfbmFtZSA9IGQuZ2V0VmFyKCdCQl9GSUxFTkFNRScsIFRydWUpCisgICAgICAgIGV4dHJhaW5mbyA9IGQuZ2V0VmFyRmxhZyh0YXNrZmxhZ25hbWUsICdzdGFtcC1leHRyYS1pbmZvJywgVHJ1ZSkgb3IgIiIKKworICAgIGlmIG5vdCBzdGFtcDoKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBjbGVhbm1hc2sgPSBiYi5wYXJzZS5zaWdnZW4uc3RhbXBjbGVhbm1hc2soc3RhbXAsIGZpbGVfbmFtZSwgdGFza25hbWUsIGV4dHJhaW5mbykKKworICAgIHJldHVybiBbY2xlYW5tYXNrLCBjbGVhbm1hc2sucmVwbGFjZSh0YXNrZmxhZ25hbWUsIHRhc2tmbGFnbmFtZSArICJfc2V0c2NlbmUiKV0KKworZGVmIG1ha2Vfc3RhbXAodGFzaywgZCwgZmlsZV9uYW1lID0gTm9uZSk6CisgICAgIiIiCisgICAgQ3JlYXRlcy91cGRhdGVzIGEgc3RhbXAgZm9yIGEgZ2l2ZW4gdGFzaworICAgIChkIGNhbiBiZSBhIGRhdGEgZGljdCBvciBkYXRhQ2FjaGUpCisgICAgIiIiCisgICAgY2xlYW5tYXNrID0gc3RhbXBfY2xlYW5tYXNrX2ludGVybmFsKHRhc2ssIGQsIGZpbGVfbmFtZSkKKyAgICBmb3IgbWFzayBpbiBjbGVhbm1hc2s6CisgICAgICAgIGZvciBuYW1lIGluIGdsb2IuZ2xvYihtYXNrKToKKyAgICAgICAgICAgICMgUHJlc2VydmUgc2lnZGF0YSBmaWxlcyBpbiB0aGUgc3RhbXBzIGRpcmVjdG9yeQorICAgICAgICAgICAgaWYgInNpZ2RhdGEiIGluIG5hbWU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgUHJlc2VydmUgdGFpbnQgZmlsZXMgaW4gdGhlIHN0YW1wcyBkaXJlY3RvcnkKKyAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy50YWludCcpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIHN0YW1wID0gc3RhbXBfaW50ZXJuYWwodGFzaywgZCwgZmlsZV9uYW1lKQorICAgICMgUmVtb3ZlIHRoZSBmaWxlIGFuZCByZWNyZWF0ZSB0byBmb3JjZSB0aW1lc3RhbXAKKyAgICAjIGNoYW5nZSBvbiBicm9rZW4gTkZTIGZpbGVzeXN0ZW1zCisgICAgaWYgc3RhbXA6CisgICAgICAgIGJiLnV0aWxzLnJlbW92ZShzdGFtcCkKKyAgICAgICAgb3BlbihzdGFtcCwgInciKS5jbG9zZSgpCisKKyAgICAjIElmIHdlJ3JlIGluIHRhc2sgY29udGV4dCwgd3JpdGUgb3V0IGEgc2lnbmF0dXJlIGZpbGUgZm9yIGVhY2ggdGFzaworICAgICMgYXMgaXQgY29tcGxldGVzCisgICAgaWYgbm90IHRhc2suZW5kc3dpdGgoIl9zZXRzY2VuZSIpIGFuZCB0YXNrICE9ICJkb19zZXRzY2VuZSIgYW5kIG5vdCBmaWxlX25hbWU6CisgICAgICAgIHN0YW1wYmFzZSA9IHN0YW1wX2ludGVybmFsKHRhc2ssIGQsIE5vbmUsIFRydWUpCisgICAgICAgIGZpbGVfbmFtZSA9IGQuZ2V0VmFyKCdCQl9GSUxFTkFNRScsIFRydWUpCisgICAgICAgIGJiLnBhcnNlLnNpZ2dlbi5kdW1wX3NpZ3Rhc2soZmlsZV9uYW1lLCB0YXNrLCBzdGFtcGJhc2UsIFRydWUpCisKK2RlZiBkZWxfc3RhbXAodGFzaywgZCwgZmlsZV9uYW1lID0gTm9uZSk6CisgICAgIiIiCisgICAgUmVtb3ZlcyBhIHN0YW1wIGZvciBhIGdpdmVuIHRhc2sKKyAgICAoZCBjYW4gYmUgYSBkYXRhIGRpY3Qgb3IgZGF0YUNhY2hlKQorICAgICIiIgorICAgIHN0YW1wID0gc3RhbXBfaW50ZXJuYWwodGFzaywgZCwgZmlsZV9uYW1lKQorICAgIGJiLnV0aWxzLnJlbW92ZShzdGFtcCkKKworZGVmIHdyaXRlX3RhaW50KHRhc2ssIGQsIGZpbGVfbmFtZSA9IE5vbmUpOgorICAgICIiIgorICAgIENyZWF0ZXMgYSAidGFpbnQiIGZpbGUgd2hpY2ggd2lsbCBmb3JjZSB0aGUgc3BlY2lmaWVkIHRhc2sgYW5kIGl0cworICAgIGRlcGVuZGVudHMgdG8gYmUgcmUtcnVuIHRoZSBuZXh0IHRpbWUgYnkgaW5mbHVlbmNpbmcgdGhlIHZhbHVlIG9mIGl0cworICAgIHRhc2toYXNoLgorICAgIChkIGNhbiBiZSBhIGRhdGEgZGljdCBvciBkYXRhQ2FjaGUpCisgICAgIiIiCisgICAgaW1wb3J0IHV1aWQKKyAgICBpZiBmaWxlX25hbWU6CisgICAgICAgIHRhaW50Zm4gPSBkLnN0YW1wW2ZpbGVfbmFtZV0gKyAnLicgKyB0YXNrICsgJy50YWludCcKKyAgICBlbHNlOgorICAgICAgICB0YWludGZuID0gZC5nZXRWYXIoJ1NUQU1QJywgVHJ1ZSkgKyAnLicgKyB0YXNrICsgJy50YWludCcKKyAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKHRhaW50Zm4pKQorICAgICMgVGhlIHNwZWNpZmljIGNvbnRlbnQgb2YgdGhlIHRhaW50IGZpbGUgaXMgbm90IHJlYWxseSBpbXBvcnRhbnQsCisgICAgIyB3ZSBqdXN0IG5lZWQgaXQgdG8gYmUgcmFuZG9tLCBzbyBhIHJhbmRvbSBVVUlEIGlzIHVzZWQKKyAgICB3aXRoIG9wZW4odGFpbnRmbiwgJ3cnKSBhcyB0YWludGY6CisgICAgICAgIHRhaW50Zi53cml0ZShzdHIodXVpZC51dWlkNCgpKSkKKworZGVmIHN0YW1wZmlsZSh0YXNrbmFtZSwgZCwgZmlsZV9uYW1lID0gTm9uZSk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBzdGFtcCBmb3IgYSBnaXZlbiB0YXNrCisgICAgKGQgY2FuIGJlIGEgZGF0YSBkaWN0IG9yIGRhdGFDYWNoZSkKKyAgICAiIiIKKyAgICByZXR1cm4gc3RhbXBfaW50ZXJuYWwodGFza25hbWUsIGQsIGZpbGVfbmFtZSkKKworZGVmIGFkZF90YXNrcyh0YXNrbGlzdCwgZCk6CisgICAgdGFza19kZXBzID0gZC5nZXRWYXIoJ190YXNrX2RlcHMnLCBGYWxzZSkKKyAgICBpZiBub3QgdGFza19kZXBzOgorICAgICAgICB0YXNrX2RlcHMgPSB7fQorICAgIGlmIG5vdCAndGFza3MnIGluIHRhc2tfZGVwczoKKyAgICAgICAgdGFza19kZXBzWyd0YXNrcyddID0gW10KKyAgICBpZiBub3QgJ3BhcmVudHMnIGluIHRhc2tfZGVwczoKKyAgICAgICAgdGFza19kZXBzWydwYXJlbnRzJ10gPSB7fQorCisgICAgZm9yIHRhc2sgaW4gdGFza2xpc3Q6CisgICAgICAgIHRhc2sgPSBkLmV4cGFuZCh0YXNrKQorCisgICAgICAgIGQuc2V0VmFyRmxhZyh0YXNrLCAndGFzaycsIDEpCisKKyAgICAgICAgaWYgbm90IHRhc2sgaW4gdGFza19kZXBzWyd0YXNrcyddOgorICAgICAgICAgICAgdGFza19kZXBzWyd0YXNrcyddLmFwcGVuZCh0YXNrKQorCisgICAgICAgIGZsYWdzID0gZC5nZXRWYXJGbGFncyh0YXNrKQorICAgICAgICBkZWYgZ2V0VGFzayhuYW1lKToKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lIGluIHRhc2tfZGVwczoKKyAgICAgICAgICAgICAgICB0YXNrX2RlcHNbbmFtZV0gPSB7fQorICAgICAgICAgICAgaWYgbmFtZSBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBkZXB0YXNrID0gZC5leHBhbmQoZmxhZ3NbbmFtZV0pCisgICAgICAgICAgICAgICAgdGFza19kZXBzW25hbWVdW3Rhc2tdID0gZGVwdGFzaworICAgICAgICBnZXRUYXNrKCdkZXBlbmRzJykKKyAgICAgICAgZ2V0VGFzaygncmRlcGVuZHMnKQorICAgICAgICBnZXRUYXNrKCdkZXB0YXNrJykKKyAgICAgICAgZ2V0VGFzaygncmRlcHRhc2snKQorICAgICAgICBnZXRUYXNrKCdyZWNyZGVwdGFzaycpCisgICAgICAgIGdldFRhc2soJ3JlY2lkZXB0YXNrJykKKyAgICAgICAgZ2V0VGFzaygnbm9zdGFtcCcpCisgICAgICAgIGdldFRhc2soJ2Zha2Vyb290JykKKyAgICAgICAgZ2V0VGFzaygnbm9leGVjJykKKyAgICAgICAgZ2V0VGFzaygndW1hc2snKQorICAgICAgICB0YXNrX2RlcHNbJ3BhcmVudHMnXVt0YXNrXSA9IFtdCisgICAgICAgIGlmICdkZXBzJyBpbiBmbGFnczoKKyAgICAgICAgICAgIGZvciBkZXAgaW4gZmxhZ3NbJ2RlcHMnXToKKyAgICAgICAgICAgICAgICBkZXAgPSBkLmV4cGFuZChkZXApCisgICAgICAgICAgICAgICAgdGFza19kZXBzWydwYXJlbnRzJ11bdGFza10uYXBwZW5kKGRlcCkKKworICAgICMgZG9uJ3QgYXNzdW1lIGhvbGRpbmcgYSByZWZlcmVuY2UKKyAgICBkLnNldFZhcignX3Rhc2tfZGVwcycsIHRhc2tfZGVwcykKKworZGVmIGFkZHRhc2sodGFzaywgYmVmb3JlLCBhZnRlciwgZCk6CisgICAgaWYgdGFza1s6M10gIT0gImRvXyI6CisgICAgICAgIHRhc2sgPSAiZG9fIiArIHRhc2sKKworICAgIGQuc2V0VmFyRmxhZyh0YXNrLCAidGFzayIsIDEpCisgICAgYmJ0YXNrcyA9IGQuZ2V0VmFyKCdfX0JCVEFTS1MnLCBGYWxzZSkgb3IgW10KKyAgICBpZiB0YXNrIG5vdCBpbiBiYnRhc2tzOgorICAgICAgICBiYnRhc2tzLmFwcGVuZCh0YXNrKQorICAgIGQuc2V0VmFyKCdfX0JCVEFTS1MnLCBiYnRhc2tzKQorCisgICAgZXhpc3RpbmcgPSBkLmdldFZhckZsYWcodGFzaywgImRlcHMiKSBvciBbXQorICAgIGlmIGFmdGVyIGlzIG5vdCBOb25lOgorICAgICAgICAjIHNldCB1cCBkZXBzIGZvciBmdW5jdGlvbgorICAgICAgICBmb3IgZW50cnkgaW4gYWZ0ZXIuc3BsaXQoKToKKyAgICAgICAgICAgIGlmIGVudHJ5IG5vdCBpbiBleGlzdGluZzoKKyAgICAgICAgICAgICAgICBleGlzdGluZy5hcHBlbmQoZW50cnkpCisgICAgZC5zZXRWYXJGbGFnKHRhc2ssICJkZXBzIiwgZXhpc3RpbmcpCisgICAgaWYgYmVmb3JlIGlzIG5vdCBOb25lOgorICAgICAgICAjIHNldCB1cCB0aGluZ3MgdGhhdCBkZXBlbmQgb24gdGhpcyBmdW5jCisgICAgICAgIGZvciBlbnRyeSBpbiBiZWZvcmUuc3BsaXQoKToKKyAgICAgICAgICAgIGV4aXN0aW5nID0gZC5nZXRWYXJGbGFnKGVudHJ5LCAiZGVwcyIpIG9yIFtdCisgICAgICAgICAgICBpZiB0YXNrIG5vdCBpbiBleGlzdGluZzoKKyAgICAgICAgICAgICAgICBkLnNldFZhckZsYWcoZW50cnksICJkZXBzIiwgW3Rhc2tdICsgZXhpc3RpbmcpCisKK2RlZiBkZWx0YXNrKHRhc2ssIGQpOgorICAgIGlmIHRhc2tbOjNdICE9ICJkb18iOgorICAgICAgICB0YXNrID0gImRvXyIgKyB0YXNrCisKKyAgICBiYnRhc2tzID0gZC5nZXRWYXIoJ19fQkJUQVNLUycsIEZhbHNlKSBvciBbXQorICAgIGlmIHRhc2sgaW4gYmJ0YXNrczoKKyAgICAgICAgYmJ0YXNrcy5yZW1vdmUodGFzaykKKyAgICAgICAgZC5zZXRWYXIoJ19fQkJUQVNLUycsIGJidGFza3MpCisKKyAgICBkLmRlbFZhckZsYWcodGFzaywgJ2RlcHMnKQorICAgIGZvciBiYnRhc2sgaW4gZC5nZXRWYXIoJ19fQkJUQVNLUycsIEZhbHNlKSBvciBbXToKKyAgICAgICAgZGVwcyA9IGQuZ2V0VmFyRmxhZyhiYnRhc2ssICdkZXBzJykgb3IgW10KKyAgICAgICAgaWYgdGFzayBpbiBkZXBzOgorICAgICAgICAgICAgZGVwcy5yZW1vdmUodGFzaykKKyAgICAgICAgICAgIGQuc2V0VmFyRmxhZyhiYnRhc2ssICdkZXBzJywgZGVwcykKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2NhY2hlLnB5IGIvYml0YmFrZS9saWIvYmIvY2FjaGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZDY2MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2NhY2hlLnB5CkBAIC0wLDAgKzEsODM3IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIENhY2hlIGltcGxlbWVudGF0aW9uCisjCisjIENhY2hpbmcgb2YgYml0YmFrZSB2YXJpYWJsZXMgYmVmb3JlIHRhc2sgZXhlY3V0aW9uCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgICBSaWNoYXJkIFB1cmRpZQorIyBDb3B5cmlnaHQgKEMpIDIwMTIgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisKKyMgYnV0IHNtYWxsIHNlY3Rpb25zIGJhc2VkIG9uIGNvZGUgZnJvbSBiaW4vYml0YmFrZToKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgUk9BRCBHbWJICisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CitpbXBvcnQgYmIudXRpbHMKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuQ2FjaGUiKQorCit0cnk6CisgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IHBpY2tsZQorICAgIGxvZ2dlci5pbmZvKCJJbXBvcnRpbmcgY1BpY2tsZSBmYWlsZWQuICIKKyAgICAgICAgICAgICAgICAiRmFsbGluZyBiYWNrIHRvIGEgdmVyeSBzbG93IGltcGxlbWVudGF0aW9uLiIpCisKK19fY2FjaGVfdmVyc2lvbl9fID0gIjE0OCIKKworZGVmIGdldENhY2hlRmlsZShwYXRoLCBmaWxlbmFtZSwgZGF0YV9oYXNoKToKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHBhdGgsIGZpbGVuYW1lICsgIi4iICsgZGF0YV9oYXNoKQorCisjIFJlY2lwZUluZm9Db21tb24gZGVmaW5lcyBjb21tb24gZGF0YSByZXRyaWV2aW5nIG1ldGhvZHMKKyMgZnJvbSBtZXRhIGRhdGEgZm9yIGNhY2hlcy4gQ29yZVJlY2lwZUluZm8gYXMgd2VsbCBhcyBvdGhlcgorIyBFeHRyYSBSZWNpcGVJbmZvIG5lZWRzIHRvIGluaGVyaXQgdGhpcyBjbGFzcworY2xhc3MgUmVjaXBlSW5mb0NvbW1vbihvYmplY3QpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGxpc3R2YXIoY2xzLCB2YXIsIG1ldGFkYXRhKToKKyAgICAgICAgcmV0dXJuIGNscy5nZXR2YXIodmFyLCBtZXRhZGF0YSkuc3BsaXQoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGludHZhcihjbHMsIHZhciwgbWV0YWRhdGEpOgorICAgICAgICByZXR1cm4gaW50KGNscy5nZXR2YXIodmFyLCBtZXRhZGF0YSkgb3IgMCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkZXB2YXIoY2xzLCB2YXIsIG1ldGFkYXRhKToKKyAgICAgICAgcmV0dXJuIGJiLnV0aWxzLmV4cGxvZGVfZGVwcyhjbHMuZ2V0dmFyKHZhciwgbWV0YWRhdGEpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHBrZ3ZhcihjbHMsIHZhciwgcGFja2FnZXMsIG1ldGFkYXRhKToKKyAgICAgICAgcmV0dXJuIGRpY3QoKHBrZywgY2xzLmRlcHZhcigiJXNfJXMiICUgKHZhciwgcGtnKSwgbWV0YWRhdGEpKQorICAgICAgICAgICAgICAgICAgICBmb3IgcGtnIGluIHBhY2thZ2VzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRhc2t2YXIoY2xzLCB2YXIsIHRhc2tzLCBtZXRhZGF0YSk6CisgICAgICAgIHJldHVybiBkaWN0KCh0YXNrLCBjbHMuZ2V0dmFyKCIlc190YXNrLSVzIiAlICh2YXIsIHRhc2spLCBtZXRhZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIGZvciB0YXNrIGluIHRhc2tzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZsYWdsaXN0KGNscywgZmxhZywgdmFybGlzdCwgbWV0YWRhdGEsIHNxdWFzaD1GYWxzZSk6CisgICAgICAgIG91dF9kaWN0ID0gZGljdCgodmFyLCBtZXRhZGF0YS5nZXRWYXJGbGFnKHZhciwgZmxhZywgVHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIGZvciB2YXIgaW4gdmFybGlzdCkKKyAgICAgICAgaWYgc3F1YXNoOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QoKGssdikgZm9yIChrLHYpIGluIG91dF9kaWN0Lml0ZXJpdGVtcygpIGlmIHYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3V0X2RpY3QKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnZXR2YXIoY2xzLCB2YXIsIG1ldGFkYXRhKToKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmdldFZhcih2YXIsIFRydWUpIG9yICcnCisKKworY2xhc3MgQ29yZVJlY2lwZUluZm8oUmVjaXBlSW5mb0NvbW1vbik6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGNhY2hlZmlsZSA9ICJiYl9jYWNoZS5kYXQiICAgCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1ldGFkYXRhKTogICAgICAKKyAgICAgICAgc2VsZi5maWxlX2RlcGVuZHMgPSBtZXRhZGF0YS5nZXRWYXIoJ19fZGVwZW5kcycsIEZhbHNlKQorICAgICAgICBzZWxmLnRpbWVzdGFtcCA9IGJiLnBhcnNlLmNhY2hlZF9tdGltZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi52YXJpYW50cyA9IHNlbGYubGlzdHZhcignX19WQVJJQU5UUycsIG1ldGFkYXRhKSArIFsnJ10KKyAgICAgICAgc2VsZi5hcHBlbmRzID0gc2VsZi5saXN0dmFyKCdfX0JCQVBQRU5EJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYubm9jYWNoZSA9IHNlbGYuZ2V0dmFyKCdfX0JCX0RPTlRfQ0FDSEUnLCBtZXRhZGF0YSkKKworICAgICAgICBzZWxmLnNraXByZWFzb24gPSBzZWxmLmdldHZhcignX19TS0lQUEVEJywgbWV0YWRhdGEpCisgICAgICAgIGlmIHNlbGYuc2tpcHJlYXNvbjoKKyAgICAgICAgICAgIHNlbGYucG4gPSBzZWxmLmdldHZhcignUE4nLCBtZXRhZGF0YSkgb3IgYmIucGFyc2UuQkJIYW5kbGVyLnZhcnNfZnJvbV9maWxlKGZpbGVuYW1lLG1ldGFkYXRhKVswXQorICAgICAgICAgICAgc2VsZi5za2lwcGVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5wcm92aWRlcyAgPSBzZWxmLmRlcHZhcignUFJPVklERVMnLCBtZXRhZGF0YSkKKyAgICAgICAgICAgIHNlbGYucnByb3ZpZGVzID0gc2VsZi5kZXB2YXIoJ1JQUk9WSURFUycsIG1ldGFkYXRhKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi50YXNrcyA9IG1ldGFkYXRhLmdldFZhcignX19CQlRBU0tTJywgRmFsc2UpCisKKyAgICAgICAgc2VsZi5wbiA9IHNlbGYuZ2V0dmFyKCdQTicsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnBhY2thZ2VzID0gc2VsZi5saXN0dmFyKCdQQUNLQUdFUycsIG1ldGFkYXRhKQorICAgICAgICBpZiBub3Qgc2VsZi5wbiBpbiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlcy5hcHBlbmQoc2VsZi5wbikKKworICAgICAgICBzZWxmLmJhc2V0YXNraGFzaGVzID0gc2VsZi50YXNrdmFyKCdCQl9CQVNFSEFTSCcsIHNlbGYudGFza3MsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmhhc2hmaWxlbmFtZSA9IHNlbGYuZ2V0dmFyKCdCQl9IQVNIRklMRU5BTUUnLCBtZXRhZGF0YSkKKworICAgICAgICBzZWxmLnRhc2tfZGVwcyA9IG1ldGFkYXRhLmdldFZhcignX3Rhc2tfZGVwcycsIEZhbHNlKSBvciB7J3Rhc2tzJzogW10sICdwYXJlbnRzJzoge319CisKKyAgICAgICAgc2VsZi5za2lwcGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wZSA9IHNlbGYuZ2V0dmFyKCdQRScsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnB2ID0gc2VsZi5nZXR2YXIoJ1BWJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucHIgPSBzZWxmLmdldHZhcignUFInLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5kZWZhdWx0cHJlZiA9IHNlbGYuaW50dmFyKCdERUZBVUxUX1BSRUZFUkVOQ0UnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5ub3Rfd29ybGQgPSBzZWxmLmdldHZhcignRVhDTFVERV9GUk9NX1dPUkxEJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuc3RhbXAgPSBzZWxmLmdldHZhcignU1RBTVAnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5zdGFtcGNsZWFuID0gc2VsZi5nZXR2YXIoJ1NUQU1QQ0xFQU4nLCBtZXRhZGF0YSkgICAgICAgIAorICAgICAgICBzZWxmLnN0YW1wX2Jhc2UgPSBzZWxmLmZsYWdsaXN0KCdzdGFtcC1iYXNlJywgc2VsZi50YXNrcywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuc3RhbXBfYmFzZV9jbGVhbiA9IHNlbGYuZmxhZ2xpc3QoJ3N0YW1wLWJhc2UtY2xlYW4nLCBzZWxmLnRhc2tzLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5zdGFtcF9leHRyYWluZm8gPSBzZWxmLmZsYWdsaXN0KCdzdGFtcC1leHRyYS1pbmZvJywgc2VsZi50YXNrcywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuZmlsZV9jaGVja3N1bXMgPSBzZWxmLmZsYWdsaXN0KCdmaWxlLWNoZWNrc3VtcycsIHNlbGYudGFza3MsIG1ldGFkYXRhLCBUcnVlKQorICAgICAgICBzZWxmLnBhY2thZ2VzX2R5bmFtaWMgPSBzZWxmLmxpc3R2YXIoJ1BBQ0tBR0VTX0RZTkFNSUMnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5kZXBlbmRzICAgICAgICAgID0gc2VsZi5kZXB2YXIoJ0RFUEVORFMnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5wcm92aWRlcyAgICAgICAgID0gc2VsZi5kZXB2YXIoJ1BST1ZJREVTJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucmRlcGVuZHMgICAgICAgICA9IHNlbGYuZGVwdmFyKCdSREVQRU5EUycsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnJwcm92aWRlcyAgICAgICAgPSBzZWxmLmRlcHZhcignUlBST1ZJREVTJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucnJlY29tbWVuZHMgICAgICA9IHNlbGYuZGVwdmFyKCdSUkVDT01NRU5EUycsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnJwcm92aWRlc19wa2cgICAgPSBzZWxmLnBrZ3ZhcignUlBST1ZJREVTJywgc2VsZi5wYWNrYWdlcywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucmRlcGVuZHNfcGtnICAgICA9IHNlbGYucGtndmFyKCdSREVQRU5EUycsIHNlbGYucGFja2FnZXMsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLnJyZWNvbW1lbmRzX3BrZyAgPSBzZWxmLnBrZ3ZhcignUlJFQ09NTUVORFMnLCBzZWxmLnBhY2thZ2VzLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5pbmhlcml0cyAgICAgICAgID0gc2VsZi5nZXR2YXIoJ19faW5oZXJpdF9jYWNoZScsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmZha2Vyb290ZW52ICAgICAgPSBzZWxmLmdldHZhcignRkFLRVJPT1RFTlYnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5mYWtlcm9vdGRpcnMgICAgID0gc2VsZi5nZXR2YXIoJ0ZBS0VST09URElSUycsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmZha2Vyb290bm9lbnYgICAgPSBzZWxmLmdldHZhcignRkFLRVJPT1ROT0VOVicsIG1ldGFkYXRhKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGluaXRfY2FjaGVEYXRhKGNscywgY2FjaGVkYXRhKToKKyAgICAgICAgIyBDYWNoZURhdGEgaW4gQ29yZSBSZWNpcGVJbmZvIENsYXNzCisgICAgICAgIGNhY2hlZGF0YS50YXNrX2RlcHMgPSB7fQorICAgICAgICBjYWNoZWRhdGEucGtnX2ZuID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnBrZ19wbiA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIGNhY2hlZGF0YS5wa2dfcGVwdnByID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnBrZ19kcCA9IHt9CisKKyAgICAgICAgY2FjaGVkYXRhLnN0YW1wID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnN0YW1wY2xlYW4gPSB7fQorICAgICAgICBjYWNoZWRhdGEuc3RhbXBfYmFzZSA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5zdGFtcF9iYXNlX2NsZWFuID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnN0YW1wX2V4dHJhaW5mbyA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5maWxlX2NoZWNrc3VtcyA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5mbl9wcm92aWRlcyA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5wbl9wcm92aWRlcyA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIGNhY2hlZGF0YS5hbGxfZGVwZW5kcyA9IFtdCisKKyAgICAgICAgY2FjaGVkYXRhLmRlcHMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBjYWNoZWRhdGEucGFja2FnZXMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBjYWNoZWRhdGEucHJvdmlkZXJzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgY2FjaGVkYXRhLnJwcm92aWRlcnMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBjYWNoZWRhdGEucGFja2FnZXNfZHluYW1pYyA9IGRlZmF1bHRkaWN0KGxpc3QpCisKKyAgICAgICAgY2FjaGVkYXRhLnJ1bmRlcHMgPSBkZWZhdWx0ZGljdChsYW1iZGE6IGRlZmF1bHRkaWN0KGxpc3QpKQorICAgICAgICBjYWNoZWRhdGEucnVucmVjcyA9IGRlZmF1bHRkaWN0KGxhbWJkYTogZGVmYXVsdGRpY3QobGlzdCkpCisgICAgICAgIGNhY2hlZGF0YS5wb3NzaWJsZV93b3JsZCA9IFtdCisgICAgICAgIGNhY2hlZGF0YS51bml2ZXJzZV90YXJnZXQgPSBbXQorICAgICAgICBjYWNoZWRhdGEuaGFzaGZuID0ge30KKworICAgICAgICBjYWNoZWRhdGEuYmFzZXRhc2toYXNoID0ge30KKyAgICAgICAgY2FjaGVkYXRhLmluaGVyaXRzID0ge30KKyAgICAgICAgY2FjaGVkYXRhLmZha2Vyb290ZW52ID0ge30KKyAgICAgICAgY2FjaGVkYXRhLmZha2Vyb290bm9lbnYgPSB7fQorICAgICAgICBjYWNoZWRhdGEuZmFrZXJvb3RkaXJzID0ge30KKworICAgIGRlZiBhZGRfY2FjaGVEYXRhKHNlbGYsIGNhY2hlZGF0YSwgZm4pOgorICAgICAgICBjYWNoZWRhdGEudGFza19kZXBzW2ZuXSA9IHNlbGYudGFza19kZXBzCisgICAgICAgIGNhY2hlZGF0YS5wa2dfZm5bZm5dID0gc2VsZi5wbgorICAgICAgICBjYWNoZWRhdGEucGtnX3BuW3NlbGYucG5dLmFwcGVuZChmbikKKyAgICAgICAgY2FjaGVkYXRhLnBrZ19wZXB2cHJbZm5dID0gKHNlbGYucGUsIHNlbGYucHYsIHNlbGYucHIpCisgICAgICAgIGNhY2hlZGF0YS5wa2dfZHBbZm5dID0gc2VsZi5kZWZhdWx0cHJlZgorICAgICAgICBjYWNoZWRhdGEuc3RhbXBbZm5dID0gc2VsZi5zdGFtcAorICAgICAgICBjYWNoZWRhdGEuc3RhbXBjbGVhbltmbl0gPSBzZWxmLnN0YW1wY2xlYW4KKyAgICAgICAgY2FjaGVkYXRhLnN0YW1wX2Jhc2VbZm5dID0gc2VsZi5zdGFtcF9iYXNlCisgICAgICAgIGNhY2hlZGF0YS5zdGFtcF9iYXNlX2NsZWFuW2ZuXSA9IHNlbGYuc3RhbXBfYmFzZV9jbGVhbgorICAgICAgICBjYWNoZWRhdGEuc3RhbXBfZXh0cmFpbmZvW2ZuXSA9IHNlbGYuc3RhbXBfZXh0cmFpbmZvCisgICAgICAgIGNhY2hlZGF0YS5maWxlX2NoZWNrc3Vtc1tmbl0gPSBzZWxmLmZpbGVfY2hlY2tzdW1zCisKKyAgICAgICAgcHJvdmlkZXMgPSBbc2VsZi5wbl0KKyAgICAgICAgZm9yIHByb3ZpZGUgaW4gc2VsZi5wcm92aWRlczoKKyAgICAgICAgICAgIGlmIHByb3ZpZGUgbm90IGluIHByb3ZpZGVzOgorICAgICAgICAgICAgICAgIHByb3ZpZGVzLmFwcGVuZChwcm92aWRlKQorICAgICAgICBjYWNoZWRhdGEuZm5fcHJvdmlkZXNbZm5dID0gcHJvdmlkZXMKKworICAgICAgICBmb3IgcHJvdmlkZSBpbiBwcm92aWRlczoKKyAgICAgICAgICAgIGNhY2hlZGF0YS5wcm92aWRlcnNbcHJvdmlkZV0uYXBwZW5kKGZuKQorICAgICAgICAgICAgaWYgcHJvdmlkZSBub3QgaW4gY2FjaGVkYXRhLnBuX3Byb3ZpZGVzW3NlbGYucG5dOgorICAgICAgICAgICAgICAgIGNhY2hlZGF0YS5wbl9wcm92aWRlc1tzZWxmLnBuXS5hcHBlbmQocHJvdmlkZSkKKworICAgICAgICBmb3IgZGVwIGluIHNlbGYuZGVwZW5kczoKKyAgICAgICAgICAgIGlmIGRlcCBub3QgaW4gY2FjaGVkYXRhLmRlcHNbZm5dOgorICAgICAgICAgICAgICAgIGNhY2hlZGF0YS5kZXBzW2ZuXS5hcHBlbmQoZGVwKQorICAgICAgICAgICAgaWYgZGVwIG5vdCBpbiBjYWNoZWRhdGEuYWxsX2RlcGVuZHM6CisgICAgICAgICAgICAgICAgY2FjaGVkYXRhLmFsbF9kZXBlbmRzLmFwcGVuZChkZXApCisKKyAgICAgICAgcnByb3ZpZGVzID0gc2VsZi5ycHJvdmlkZXMKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgIGNhY2hlZGF0YS5wYWNrYWdlc1twYWNrYWdlXS5hcHBlbmQoZm4pCisgICAgICAgICAgICBycHJvdmlkZXMgKz0gc2VsZi5ycHJvdmlkZXNfcGtnW3BhY2thZ2VdCisKKyAgICAgICAgZm9yIHJwcm92aWRlIGluIHJwcm92aWRlczoKKyAgICAgICAgICAgIGNhY2hlZGF0YS5ycHJvdmlkZXJzW3Jwcm92aWRlXS5hcHBlbmQoZm4pCisKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlc19keW5hbWljOgorICAgICAgICAgICAgY2FjaGVkYXRhLnBhY2thZ2VzX2R5bmFtaWNbcGFja2FnZV0uYXBwZW5kKGZuKQorCisgICAgICAgICMgQnVpbGQgaGFzaCBvZiBydW50aW1lIGRlcGVuZHMgYW5kIHJlY29tbWVuZHMKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyArIFtzZWxmLnBuXToKKyAgICAgICAgICAgIGNhY2hlZGF0YS5ydW5kZXBzW2ZuXVtwYWNrYWdlXSA9IGxpc3Qoc2VsZi5yZGVwZW5kcykgKyBzZWxmLnJkZXBlbmRzX3BrZ1twYWNrYWdlXQorICAgICAgICAgICAgY2FjaGVkYXRhLnJ1bnJlY3NbZm5dW3BhY2thZ2VdID0gbGlzdChzZWxmLnJyZWNvbW1lbmRzKSArIHNlbGYucnJlY29tbWVuZHNfcGtnW3BhY2thZ2VdCisKKyAgICAgICAgIyBDb2xsZWN0IGZpbGVzIHdlIG1heSBuZWVkIGZvciBwb3NzaWJsZSB3b3JsZC1kZXAKKyAgICAgICAgIyBjYWxjdWxhdGlvbnMKKyAgICAgICAgaWYgc2VsZi5ub3Rfd29ybGQ6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkVYQ0xVREUgRlJPTSBXT1JMRDogJXMiLCBmbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhY2hlZGF0YS5wb3NzaWJsZV93b3JsZC5hcHBlbmQoZm4pCisKKyAgICAgICAgIyBjcmVhdGUgYSBjb2xsZWN0aW9uIG9mIGFsbCB0YXJnZXRzIGZvciBzYW5pdHkgY2hlY2tpbmcKKyAgICAgICAgIyB0YXNrcywgc3VjaCBhcyB1cHN0cmVhbSB2ZXJzaW9ucywgbGljZW5zZSwgYW5kIHRvb2xzIGZvcgorICAgICAgICAjIHRhc2sgYW5kIGltYWdlIGNyZWF0aW9uLgorICAgICAgICBjYWNoZWRhdGEudW5pdmVyc2VfdGFyZ2V0LmFwcGVuZChzZWxmLnBuKQorCisgICAgICAgIGNhY2hlZGF0YS5oYXNoZm5bZm5dID0gc2VsZi5oYXNoZmlsZW5hbWUKKyAgICAgICAgZm9yIHRhc2ssIHRhc2toYXNoIGluIHNlbGYuYmFzZXRhc2toYXNoZXMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZGVudGlmaWVyID0gJyVzLiVzJyAlIChmbiwgdGFzaykKKyAgICAgICAgICAgIGNhY2hlZGF0YS5iYXNldGFza2hhc2hbaWRlbnRpZmllcl0gPSB0YXNraGFzaAorCisgICAgICAgIGNhY2hlZGF0YS5pbmhlcml0c1tmbl0gPSBzZWxmLmluaGVyaXRzCisgICAgICAgIGNhY2hlZGF0YS5mYWtlcm9vdGVudltmbl0gPSBzZWxmLmZha2Vyb290ZW52CisgICAgICAgIGNhY2hlZGF0YS5mYWtlcm9vdG5vZW52W2ZuXSA9IHNlbGYuZmFrZXJvb3Rub2VudgorICAgICAgICBjYWNoZWRhdGEuZmFrZXJvb3RkaXJzW2ZuXSA9IHNlbGYuZmFrZXJvb3RkaXJzCisKKworCitjbGFzcyBDYWNoZShvYmplY3QpOgorICAgICIiIgorICAgIEJpdEJha2UgQ2FjaGUgaW1wbGVtZW50YXRpb24KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCBkYXRhX2hhc2gsIGNhY2hlc19hcnJheSk6CisgICAgICAgICMgUGFzcyBjYWNoZXNfYXJyYXkgaW5mb3JtYXRpb24gaW50byBDYWNoZSBDb25zdHJ1Y3RvcgorICAgICAgICAjIEl0IHdpbGwgYmUgdXNlZCBsYXRlciBmb3IgZGVjaWRpbmcgd2hldGhlciB3ZSAKKyAgICAgICAgIyBuZWVkIGV4dHJhIGNhY2hlIGZpbGUgZHVtcC9sb2FkIHN1cHBvcnQgCisgICAgICAgIHNlbGYuY2FjaGVzX2FycmF5ID0gY2FjaGVzX2FycmF5CisgICAgICAgIHNlbGYuY2FjaGVkaXIgPSBkYXRhLmdldFZhcigiQ0FDSEUiLCBUcnVlKQorICAgICAgICBzZWxmLmNsZWFuID0gc2V0KCkKKyAgICAgICAgc2VsZi5jaGVja2VkID0gc2V0KCkKKyAgICAgICAgc2VsZi5kZXBlbmRzX2NhY2hlID0ge30KKyAgICAgICAgc2VsZi5kYXRhID0gTm9uZQorICAgICAgICBzZWxmLmRhdGFfZm4gPSBOb25lCisgICAgICAgIHNlbGYuY2FjaGVjbGVhbiA9IFRydWUKKyAgICAgICAgc2VsZi5kYXRhX2hhc2ggPSBkYXRhX2hhc2gKKworICAgICAgICBpZiBzZWxmLmNhY2hlZGlyIGluIFtOb25lLCAnJ106CisgICAgICAgICAgICBzZWxmLmhhc19jYWNoZSA9IEZhbHNlCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiTm90IHVzaW5nIGEgY2FjaGUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgQ0FDSEUgPSA8ZGlyZWN0b3J5PiB0byBlbmFibGUuIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuaGFzX2NhY2hlID0gVHJ1ZQorICAgICAgICBzZWxmLmNhY2hlZmlsZSA9IGdldENhY2hlRmlsZShzZWxmLmNhY2hlZGlyLCAiYmJfY2FjaGUuZGF0Iiwgc2VsZi5kYXRhX2hhc2gpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJVc2luZyBjYWNoZSBpbiAnJXMnIiwgc2VsZi5jYWNoZWRpcikKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHNlbGYuY2FjaGVkaXIpCisKKyAgICAgICAgY2FjaGVfb2sgPSBUcnVlCisgICAgICAgIGlmIHNlbGYuY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgZm9yIGNhY2hlX2NsYXNzIGluIHNlbGYuY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgICAgICBjYWNoZWZpbGUgPSBnZXRDYWNoZUZpbGUoc2VsZi5jYWNoZWRpciwgY2FjaGVfY2xhc3MuY2FjaGVmaWxlLCBzZWxmLmRhdGFfaGFzaCkKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfb2sgPSBjYWNoZV9vayBhbmQgb3MucGF0aC5leGlzdHMoY2FjaGVmaWxlKQorICAgICAgICAgICAgICAgICAgICBjYWNoZV9jbGFzcy5pbml0X2NhY2hlRGF0YShzZWxmKQorICAgICAgICBpZiBjYWNoZV9vazoKKyAgICAgICAgICAgIHNlbGYubG9hZF9jYWNoZWZpbGUoKQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuY2FjaGVmaWxlKToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPdXQgb2YgZGF0ZSBjYWNoZSBmb3VuZCwgcmVidWlsZGluZy4uLiIpCisKKyAgICBkZWYgbG9hZF9jYWNoZWZpbGUoc2VsZik6CisgICAgICAgICMgRmlyc3RseSwgdXNpbmcgY29yZSBjYWNoZSBmaWxlIGluZm9ybWF0aW9uIGZvcgorICAgICAgICAjIHZhbGlkIGNoZWNraW5nCisgICAgICAgIHdpdGggb3BlbihzZWxmLmNhY2hlZmlsZSwgInJiIikgYXMgY2FjaGVmaWxlOgorICAgICAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5VbnBpY2tsZXIoY2FjaGVmaWxlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNhY2hlX3ZlciA9IHBpY2tsZWQubG9hZCgpCisgICAgICAgICAgICAgICAgYml0YmFrZV92ZXIgPSBwaWNrbGVkLmxvYWQoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnSW52YWxpZCBjYWNoZSwgcmVidWlsZGluZy4uLicpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIGNhY2hlX3ZlciAhPSBfX2NhY2hlX3ZlcnNpb25fXzoKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQ2FjaGUgdmVyc2lvbiBtaXNtYXRjaCwgcmVidWlsZGluZy4uLicpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbGlmIGJpdGJha2VfdmVyICE9IGJiLl9fdmVyc2lvbl9fOgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdCaXRiYWtlIHZlcnNpb24gbWlzbWF0Y2gsIHJlYnVpbGRpbmcuLi4nKQorICAgICAgICAgICAgICAgIHJldHVybgorCisKKyAgICAgICAgY2FjaGVzaXplID0gMAorICAgICAgICBwcmV2aW91c19wcm9ncmVzcyA9IDAKKyAgICAgICAgcHJldmlvdXNfcGVyY2VudCA9IDAKKworICAgICAgICAjIENhbGN1bGF0ZSB0aGUgY29ycmVjdCBjYWNoZXNpemUgb2YgYWxsIHRob3NlIGNhY2hlIGZpbGVzCisgICAgICAgIGZvciBjYWNoZV9jbGFzcyBpbiBzZWxmLmNhY2hlc19hcnJheToKKyAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgIGNhY2hlZmlsZSA9IGdldENhY2hlRmlsZShzZWxmLmNhY2hlZGlyLCBjYWNoZV9jbGFzcy5jYWNoZWZpbGUsIHNlbGYuZGF0YV9oYXNoKQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihjYWNoZWZpbGUsICJyYiIpIGFzIGNhY2hlZmlsZToKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVzaXplICs9IG9zLmZzdGF0KGNhY2hlZmlsZS5maWxlbm8oKSkuc3Rfc2l6ZQorCisgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZChjYWNoZXNpemUpLCBzZWxmLmRhdGEpCisgICAgICAgIAorICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICBpZiB0eXBlKGNhY2hlX2NsYXNzKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKGNhY2hlX2NsYXNzLCBSZWNpcGVJbmZvQ29tbW9uKToKKyAgICAgICAgICAgICAgICBjYWNoZWZpbGUgPSBnZXRDYWNoZUZpbGUoc2VsZi5jYWNoZWRpciwgY2FjaGVfY2xhc3MuY2FjaGVmaWxlLCBzZWxmLmRhdGFfaGFzaCkKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY2FjaGVmaWxlLCAicmIiKSBhcyBjYWNoZWZpbGU6CisgICAgICAgICAgICAgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuVW5waWNrbGVyKGNhY2hlZmlsZSkgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB3aGlsZSBjYWNoZWZpbGU6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGlja2xlZC5sb2FkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpY2tsZWQubG9hZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlcGVuZHNfY2FjaGUuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVwZW5kc19jYWNoZVtrZXldLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXBlbmRzX2NhY2hlW2tleV0gPSBbdmFsdWVdCisgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgZmlyZSBldmVudHMgb24gZXZlbiBwZXJjZW50YWdlIGJvdW5kYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcHJvZ3Jlc3MgPSBjYWNoZWZpbGUudGVsbCgpICsgcHJldmlvdXNfcHJvZ3Jlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcGVyY2VudCA9IDEwMCAqIGN1cnJlbnRfcHJvZ3Jlc3MgLyBjYWNoZXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfcGVyY2VudCA+IHByZXZpb3VzX3BlcmNlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfcGVyY2VudCA9IGN1cnJlbnRfcGVyY2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQ2FjaGVMb2FkUHJvZ3Jlc3MoY3VycmVudF9wcm9ncmVzcywgY2FjaGVzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSkKKworICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19wcm9ncmVzcyArPSBjdXJyZW50X3Byb2dyZXNzCisKKyAgICAgICAgIyBOb3RlOiBkZXBlbmRzIGNhY2hlIG51bWJlciBpcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXJzaW5nIGZpbGUgbnVtYmVycy4KKyAgICAgICAgIyBUaGUgc2FtZSBmaWxlIGhhcyBzZXZlcmFsIGNhY2hlcywgc3RpbGwgcmVnYXJkZWQgYXMgb25lIGl0ZW0gaW4gdGhlIGNhY2hlCisgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkKGNhY2hlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNlbGYuZGVwZW5kc19jYWNoZSkpLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSkKKworICAgIAorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgdmlydHVhbGZuMnJlYWxmbih2aXJ0dWFsZm4pOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVydCBhIHZpcnR1YWwgZmlsZSBuYW1lIHRvIGEgcmVhbCBvbmUgKyB0aGUgYXNzb2NpYXRlZCBzdWJjbGFzcyBrZXl3b3JkCisgICAgICAgICIiIgorCisgICAgICAgIGZuID0gdmlydHVhbGZuCisgICAgICAgIGNscyA9ICIiCisgICAgICAgIGlmIHZpcnR1YWxmbi5zdGFydHN3aXRoKCd2aXJ0dWFsOicpOgorICAgICAgICAgICAgZWxlbXMgPSB2aXJ0dWFsZm4uc3BsaXQoJzonKQorICAgICAgICAgICAgY2xzID0gIjoiLmpvaW4oZWxlbXNbMTotMV0pCisgICAgICAgICAgICBmbiA9IGVsZW1zWy0xXQorICAgICAgICByZXR1cm4gKGZuLCBjbHMpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHJlYWxmbjJ2aXJ0dWFsKHJlYWxmbiwgY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbnZlcnQgYSByZWFsIGZpbGVuYW1lICsgdGhlIGFzc29jaWF0ZWQgc3ViY2xhc3Mga2V5d29yZCB0byBhIHZpcnR1YWwgZmlsZW5hbWUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNscyA9PSAiIjoKKyAgICAgICAgICAgIHJldHVybiByZWFsZm4KKyAgICAgICAgcmV0dXJuICJ2aXJ0dWFsOiIgKyBjbHMgKyAiOiIgKyByZWFsZm4KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBsb2FkRGF0YUZ1bGwoY2xzLCB2aXJ0dWFsZm4sIGFwcGVuZHMsIGNmZ0RhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgY29tcGxldGUgc2V0IG9mIGRhdGEgZm9yIGZuLgorICAgICAgICBUbyBkbyB0aGlzLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBmaWxlLgorICAgICAgICAiIiIKKworICAgICAgICAoZm4sIHZpcnR1YWwpID0gY2xzLnZpcnR1YWxmbjJyZWFsZm4odmlydHVhbGZuKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUGFyc2luZyAlcyAoZnVsbCkiLCBmbikKKworICAgICAgICBjZmdEYXRhLnNldFZhcigiX19PTkxZRklOQUxJU0UiLCB2aXJ0dWFsIG9yICJkZWZhdWx0IikKKyAgICAgICAgYmJfZGF0YSA9IGNscy5sb2FkX2JiZmlsZShmbiwgYXBwZW5kcywgY2ZnRGF0YSkKKyAgICAgICAgcmV0dXJuIGJiX2RhdGFbdmlydHVhbF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBwYXJzZShjbHMsIGZpbGVuYW1lLCBhcHBlbmRzLCBjb25maWdkYXRhLCBjYWNoZXNfYXJyYXkpOgorICAgICAgICAiIiJQYXJzZSB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLCByZXR1cm5pbmcgdGhlIHJlY2lwZSBpbmZvcm1hdGlvbiIiIgorICAgICAgICBpbmZvcyA9IFtdCisgICAgICAgIGRhdGFzdG9yZXMgPSBjbHMubG9hZF9iYmZpbGUoZmlsZW5hbWUsIGFwcGVuZHMsIGNvbmZpZ2RhdGEpCisgICAgICAgIGRlcGVuZHMgPSBbXQorICAgICAgICBmb3IgdmFyaWFudCwgZGF0YSBpbiBzb3J0ZWQoZGF0YXN0b3Jlcy5pdGVyaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgaTogaVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2U9VHJ1ZSk6CisgICAgICAgICAgICB2aXJ0dWFsZm4gPSBjbHMucmVhbGZuMnZpcnR1YWwoZmlsZW5hbWUsIHZhcmlhbnQpCisgICAgICAgICAgICBkZXBlbmRzID0gZGVwZW5kcyArIChkYXRhLmdldFZhcigiX19kZXBlbmRzIiwgRmFsc2UpIG9yIFtdKQorICAgICAgICAgICAgaWYgZGVwZW5kcyBhbmQgbm90IHZhcmlhbnQ6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXIoIl9fZGVwZW5kcyIsIGRlcGVuZHMpCisKKyAgICAgICAgICAgIGluZm9fYXJyYXkgPSBbXQorICAgICAgICAgICAgZm9yIGNhY2hlX2NsYXNzIGluIGNhY2hlc19hcnJheToKKyAgICAgICAgICAgICAgICBpZiB0eXBlKGNhY2hlX2NsYXNzKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKGNhY2hlX2NsYXNzLCBSZWNpcGVJbmZvQ29tbW9uKToKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGNhY2hlX2NsYXNzKGZpbGVuYW1lLCBkYXRhKQorICAgICAgICAgICAgICAgICAgICBpbmZvX2FycmF5LmFwcGVuZChpbmZvKQorICAgICAgICAgICAgaW5mb3MuYXBwZW5kKCh2aXJ0dWFsZm4sIGluZm9fYXJyYXkpKQorCisgICAgICAgIHJldHVybiBpbmZvcworCisgICAgZGVmIGxvYWQoc2VsZiwgZmlsZW5hbWUsIGFwcGVuZHMsIGNvbmZpZ2RhdGEpOgorICAgICAgICAiIiJPYnRhaW4gdGhlIHJlY2lwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwKKyAgICAgICAgdXNpbmcgY2FjaGVkIHZhbHVlcyBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBwYXJzaW5nLgorCisgICAgICAgIE5vdGUgdGhhdCBpZiBpdCBkb2VzIHBhcnNlIHRvIG9idGFpbiB0aGUgaW5mbywgaXQgd2lsbCBub3QKKyAgICAgICAgYXV0b21hdGljYWxseSBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBjYWNoZSBvciB0byB5b3VyCisgICAgICAgIENhY2hlRGF0YS4gIFVzZSB0aGUgYWRkIG9yIGFkZF9pbmZvIG1ldGhvZCB0byBkbyBzbyBhZnRlcgorICAgICAgICBydW5uaW5nIHRoaXMsIG9yIHVzZSBsb2FkRGF0YSBpbnN0ZWFkLiIiIgorICAgICAgICBjYWNoZWQgPSBzZWxmLmNhY2hlVmFsaWQoZmlsZW5hbWUsIGFwcGVuZHMpCisgICAgICAgIGlmIGNhY2hlZDoKKyAgICAgICAgICAgIGluZm9zID0gW10KKyAgICAgICAgICAgICMgaW5mb19hcnJheSBpdGVtIGlzIGEgbGlzdCBvZiBbQ29yZVJlY2lwZUluZm8sIFhYWFJlY2lwZUluZm9dCisgICAgICAgICAgICBpbmZvX2FycmF5ID0gc2VsZi5kZXBlbmRzX2NhY2hlW2ZpbGVuYW1lXQorICAgICAgICAgICAgZm9yIHZhcmlhbnQgaW4gaW5mb19hcnJheVswXS52YXJpYW50czoKKyAgICAgICAgICAgICAgICB2aXJ0dWFsZm4gPSBzZWxmLnJlYWxmbjJ2aXJ0dWFsKGZpbGVuYW1lLCB2YXJpYW50KQorICAgICAgICAgICAgICAgIGluZm9zLmFwcGVuZCgodmlydHVhbGZuLCBzZWxmLmRlcGVuZHNfY2FjaGVbdmlydHVhbGZuXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlBhcnNpbmcgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlKGZpbGVuYW1lLCBhcHBlbmRzLCBjb25maWdkYXRhLCBzZWxmLmNhY2hlc19hcnJheSkKKworICAgICAgICByZXR1cm4gY2FjaGVkLCBpbmZvcworCisgICAgZGVmIGxvYWREYXRhKHNlbGYsIGZuLCBhcHBlbmRzLCBjZmdEYXRhLCBjYWNoZURhdGEpOgorICAgICAgICAiIiJMb2FkIHRoZSByZWNpcGUgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSwKKyAgICAgICAgcGFyc2luZyBhbmQgYWRkaW5nIHRvIHRoZSBjYWNoZSBpZiBuZWNlc3NhcnksIGFuZCBhZGRpbmcKKyAgICAgICAgdGhlIHJlY2lwZSBpbmZvcm1hdGlvbiB0byB0aGUgc3VwcGxpZWQgQ2FjaGVEYXRhIGluc3RhbmNlLiIiIgorICAgICAgICBza2lwcGVkLCB2aXJ0dWFscyA9IDAsIDAKKworICAgICAgICBjYWNoZWQsIGluZm9zID0gc2VsZi5sb2FkKGZuLCBhcHBlbmRzLCBjZmdEYXRhKQorICAgICAgICBmb3IgdmlydHVhbGZuLCBpbmZvX2FycmF5IGluIGluZm9zOgorICAgICAgICAgICAgaWYgaW5mb19hcnJheVswXS5za2lwcGVkOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiU2tpcHBpbmcgJXM6ICVzIiwgdmlydHVhbGZuLCBpbmZvX2FycmF5WzBdLnNraXByZWFzb24pCisgICAgICAgICAgICAgICAgc2tpcHBlZCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX2luZm8odmlydHVhbGZuLCBpbmZvX2FycmF5LCBjYWNoZURhdGEsIG5vdCBjYWNoZWQpCisgICAgICAgICAgICAgICAgdmlydHVhbHMgKz0gMQorCisgICAgICAgIHJldHVybiBjYWNoZWQsIHNraXBwZWQsIHZpcnR1YWxzCisKKyAgICBkZWYgY2FjaGVWYWxpZChzZWxmLCBmbiwgYXBwZW5kcyk6CisgICAgICAgICIiIgorICAgICAgICBJcyB0aGUgY2FjaGUgdmFsaWQgZm9yIGZuPworICAgICAgICBGYXN0IHZlcnNpb24sIG5vIHRpbWVzdGFtcHMgY2hlY2tlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZuIG5vdCBpbiBzZWxmLmNoZWNrZWQ6CisgICAgICAgICAgICBzZWxmLmNhY2hlVmFsaWRVcGRhdGUoZm4sIGFwcGVuZHMpCisKKyAgICAgICAgIyBJcyBjYWNoZSBlbmFibGVkPworICAgICAgICBpZiBub3Qgc2VsZi5oYXNfY2FjaGU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgZm4gaW4gc2VsZi5jbGVhbjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGNhY2hlVmFsaWRVcGRhdGUoc2VsZiwgZm4sIGFwcGVuZHMpOgorICAgICAgICAiIiIKKyAgICAgICAgSXMgdGhlIGNhY2hlIHZhbGlkIGZvciBmbj8KKyAgICAgICAgTWFrZSB0aG9yb3VnaCAoc2xvd2VyKSBjaGVja3MgaW5jbHVkaW5nIHRpbWVzdGFtcHMuCisgICAgICAgICIiIgorICAgICAgICAjIElzIGNhY2hlIGVuYWJsZWQ/CisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19jYWNoZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuY2hlY2tlZC5hZGQoZm4pCisKKyAgICAgICAgIyBGaWxlIGlzbid0IGluIGRlcGVuZHNfY2FjaGUKKyAgICAgICAgaWYgbm90IGZuIGluIHNlbGYuZGVwZW5kc19jYWNoZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQ2FjaGU6ICVzIGlzIG5vdCBjYWNoZWQiLCBmbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIG10aW1lID0gYmIucGFyc2UuY2FjaGVkX210aW1lX25vZXJyb3IoZm4pCisKKyAgICAgICAgIyBDaGVjayBmaWxlIHN0aWxsIGV4aXN0cworICAgICAgICBpZiBtdGltZSA9PSAwOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogJXMgbm8gbG9uZ2VyIGV4aXN0cyIsIGZuKQorICAgICAgICAgICAgc2VsZi5yZW1vdmUoZm4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpbmZvX2FycmF5ID0gc2VsZi5kZXBlbmRzX2NhY2hlW2ZuXQorICAgICAgICAjIENoZWNrIHRoZSBmaWxlJ3MgdGltZXN0YW1wCisgICAgICAgIGlmIG10aW1lICE9IGluZm9fYXJyYXlbMF0udGltZXN0YW1wOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogJXMgY2hhbmdlZCIsIGZuKQorICAgICAgICAgICAgc2VsZi5yZW1vdmUoZm4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIENoZWNrIGRlcGVuZGVuY2llcyBhcmUgc3RpbGwgdmFsaWQKKyAgICAgICAgZGVwZW5kcyA9IGluZm9fYXJyYXlbMF0uZmlsZV9kZXBlbmRzCisgICAgICAgIGlmIGRlcGVuZHM6CisgICAgICAgICAgICBmb3IgZiwgb2xkX210aW1lIGluIGRlcGVuZHM6CisgICAgICAgICAgICAgICAgZm10aW1lID0gYmIucGFyc2UuY2FjaGVkX210aW1lX25vZXJyb3IoZikKKyAgICAgICAgICAgICAgICAjIENoZWNrIGlmIGZpbGUgc3RpbGwgZXhpc3RzCisgICAgICAgICAgICAgICAgaWYgb2xkX210aW1lICE9IDAgYW5kIGZtdGltZSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiAlcydzIGRlcGVuZGVuY3kgJXMgd2FzIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4sIGYpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKGZuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgICAgIGlmIChmbXRpbWUgIT0gb2xkX210aW1lKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogJXMncyBkZXBlbmRlbmN5ICVzIGNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4sIGYpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKGZuKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBoYXNhdHRyKGluZm9fYXJyYXlbMF0sICdmaWxlX2NoZWNrc3VtcycpOgorICAgICAgICAgICAgZm9yIF8sIGZsIGluIGluZm9fYXJyYXlbMF0uZmlsZV9jaGVja3N1bXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmb3IgZiBpbiBmbC5zcGxpdCgpOgorICAgICAgICAgICAgICAgICAgICBpZiAiKiIgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGYsIGV4aXN0ID0gZi5zcGxpdCgiOiIpCisgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdCA9PSAiVHJ1ZSIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhmKSkgb3IgKGV4aXN0ID09ICJGYWxzZSIgYW5kIG9zLnBhdGguZXhpc3RzKGYpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQ2FjaGU6ICVzJ3MgZmlsZSBjaGVja3N1bSBsaXN0IGZpbGUgJXMgY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4sIGYpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShmbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIGFwcGVuZHMgIT0gaW5mb19hcnJheVswXS5hcHBlbmRzOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogYXBwZW5kcyBmb3IgJXMgY2hhbmdlZCIsIGZuKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICIlcyB0byAlcyIgJSAoc3RyKGFwcGVuZHMpLCBzdHIoaW5mb19hcnJheVswXS5hcHBlbmRzKSkpCisgICAgICAgICAgICBzZWxmLnJlbW92ZShmbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGludmFsaWQgPSBGYWxzZQorICAgICAgICBmb3IgY2xzIGluIGluZm9fYXJyYXlbMF0udmFyaWFudHM6CisgICAgICAgICAgICB2aXJ0dWFsZm4gPSBzZWxmLnJlYWxmbjJ2aXJ0dWFsKGZuLCBjbHMpCisgICAgICAgICAgICBzZWxmLmNsZWFuLmFkZCh2aXJ0dWFsZm4pCisgICAgICAgICAgICBpZiB2aXJ0dWFsZm4gbm90IGluIHNlbGYuZGVwZW5kc19jYWNoZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkNhY2hlOiAlcyBpcyBub3QgY2FjaGVkIiwgdmlydHVhbGZuKQorICAgICAgICAgICAgICAgIGludmFsaWQgPSBUcnVlCisKKyAgICAgICAgIyBJZiBhbnkgb25lIG9mIHRoZSB2YXJpYW50cyBpcyBub3QgcHJlc2VudCwgbWFyayBhcyBpbnZhbGlkIGZvciBhbGwKKyAgICAgICAgaWYgaW52YWxpZDoKKyAgICAgICAgICAgIGZvciBjbHMgaW4gaW5mb19hcnJheVswXS52YXJpYW50czoKKyAgICAgICAgICAgICAgICB2aXJ0dWFsZm4gPSBzZWxmLnJlYWxmbjJ2aXJ0dWFsKGZuLCBjbHMpCisgICAgICAgICAgICAgICAgaWYgdmlydHVhbGZuIGluIHNlbGYuY2xlYW46CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQ2FjaGU6IFJlbW92aW5nICVzIGZyb20gY2FjaGUiLCB2aXJ0dWFsZm4pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYW4ucmVtb3ZlKHZpcnR1YWxmbikKKyAgICAgICAgICAgIGlmIGZuIGluIHNlbGYuY2xlYW46CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZTogTWFya2luZyAlcyBhcyBub3QgY2xlYW4iLCBmbikKKyAgICAgICAgICAgICAgICBzZWxmLmNsZWFuLnJlbW92ZShmbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuY2xlYW4uYWRkKGZuKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBmbik6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgYSBmbiBmcm9tIHRoZSBjYWNoZQorICAgICAgICBDYWxsZWQgZnJvbSB0aGUgcGFyc2VyIGluIGVycm9yIGNhc2VzCisgICAgICAgICIiIgorICAgICAgICBpZiBmbiBpbiBzZWxmLmRlcGVuZHNfY2FjaGU6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJlbW92aW5nICVzIGZyb20gY2FjaGUiLCBmbikKKyAgICAgICAgICAgIGRlbCBzZWxmLmRlcGVuZHNfY2FjaGVbZm5dCisgICAgICAgIGlmIGZuIGluIHNlbGYuY2xlYW46CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIk1hcmtpbmcgJXMgYXMgdW5jbGVhbiIsIGZuKQorICAgICAgICAgICAgc2VsZi5jbGVhbi5yZW1vdmUoZm4pCisKKyAgICBkZWYgc3luYyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFNhdmUgdGhlIGNhY2hlCisgICAgICAgIENhbGxlZCBmcm9tIHRoZSBwYXJzZXIgd2hlbiBjb21wbGV0ZSAob3IgZXhpdGluZykKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5jYWNoZWNsZWFuOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDYWNoZSBpcyBjbGVhbiwgbm90IHNhdmluZy4iKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZmlsZV9kaWN0ID0ge30KKyAgICAgICAgcGlja2xlcl9kaWN0ID0ge30KKyAgICAgICAgZm9yIGNhY2hlX2NsYXNzIGluIHNlbGYuY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgaWYgdHlwZShjYWNoZV9jbGFzcykgaXMgdHlwZSBhbmQgaXNzdWJjbGFzcyhjYWNoZV9jbGFzcywgUmVjaXBlSW5mb0NvbW1vbik6CisgICAgICAgICAgICAgICAgY2FjaGVfY2xhc3NfbmFtZSA9IGNhY2hlX2NsYXNzLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgY2FjaGVmaWxlID0gZ2V0Q2FjaGVGaWxlKHNlbGYuY2FjaGVkaXIsIGNhY2hlX2NsYXNzLmNhY2hlZmlsZSwgc2VsZi5kYXRhX2hhc2gpCisgICAgICAgICAgICAgICAgZmlsZV9kaWN0W2NhY2hlX2NsYXNzX25hbWVdID0gb3BlbihjYWNoZWZpbGUsICJ3YiIpCisgICAgICAgICAgICAgICAgcGlja2xlcl9kaWN0W2NhY2hlX2NsYXNzX25hbWVdID0gIHBpY2tsZS5QaWNrbGVyKGZpbGVfZGljdFtjYWNoZV9jbGFzc19uYW1lXSwgcGlja2xlLkhJR0hFU1RfUFJPVE9DT0wpCisgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHBpY2tsZXJfZGljdFsnQ29yZVJlY2lwZUluZm8nXS5kdW1wKF9fY2FjaGVfdmVyc2lvbl9fKQorICAgICAgICBwaWNrbGVyX2RpY3RbJ0NvcmVSZWNpcGVJbmZvJ10uZHVtcChiYi5fX3ZlcnNpb25fXykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3Iga2V5LCBpbmZvX2FycmF5IGluIHNlbGYuZGVwZW5kc19jYWNoZS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiBpbmZvX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZm8sIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfY2xhc3NfbmFtZSA9IGluZm8uX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGVyX2RpY3RbY2FjaGVfY2xhc3NfbmFtZV0uZHVtcChrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGVyX2RpY3RbY2FjaGVfY2xhc3NfbmFtZV0uZHVtcChpbmZvKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGNhY2hlX2NsYXNzIGluIHNlbGYuY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIFJlY2lwZUluZm9Db21tb24pOgorICAgICAgICAgICAgICAgICAgICBjYWNoZV9jbGFzc19uYW1lID0gY2FjaGVfY2xhc3MuX19uYW1lX18KKyAgICAgICAgICAgICAgICAgICAgZmlsZV9kaWN0W2NhY2hlX2NsYXNzX25hbWVdLmNsb3NlKCkKKworICAgICAgICBkZWwgc2VsZi5kZXBlbmRzX2NhY2hlCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG10aW1lKGNhY2hlZmlsZSk6CisgICAgICAgIHJldHVybiBiYi5wYXJzZS5jYWNoZWRfbXRpbWVfbm9lcnJvcihjYWNoZWZpbGUpCisKKyAgICBkZWYgYWRkX2luZm8oc2VsZiwgZmlsZW5hbWUsIGluZm9fYXJyYXksIGNhY2hlRGF0YSwgcGFyc2VkPU5vbmUsIHdhdGNoZXI9Tm9uZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mb19hcnJheVswXSwgQ29yZVJlY2lwZUluZm8pIGFuZCAobm90IGluZm9fYXJyYXlbMF0uc2tpcHBlZCk6CisgICAgICAgICAgICBjYWNoZURhdGEuYWRkX2Zyb21fcmVjaXBlaW5mbyhmaWxlbmFtZSwgaW5mb19hcnJheSkKKworICAgICAgICAgICAgaWYgd2F0Y2hlcjoKKyAgICAgICAgICAgICAgICB3YXRjaGVyKGluZm9fYXJyYXlbMF0uZmlsZV9kZXBlbmRzKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19jYWNoZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIChpbmZvX2FycmF5WzBdLnNraXBwZWQgb3IgJ1NSQ1JFVklOQUNUSU9OJyBub3QgaW4gaW5mb19hcnJheVswXS5wdikgYW5kIG5vdCBpbmZvX2FycmF5WzBdLm5vY2FjaGU6CisgICAgICAgICAgICBpZiBwYXJzZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5jYWNoZWNsZWFuID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuZGVwZW5kc19jYWNoZVtmaWxlbmFtZV0gPSBpbmZvX2FycmF5CisKKyAgICBkZWYgYWRkKHNlbGYsIGZpbGVfbmFtZSwgZGF0YSwgY2FjaGVEYXRhLCBwYXJzZWQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBTYXZlIGRhdGEgd2UgbmVlZCBpbnRvIHRoZSBjYWNoZQorICAgICAgICAiIiIKKworICAgICAgICByZWFsZm4gPSBzZWxmLnZpcnR1YWxmbjJyZWFsZm4oZmlsZV9uYW1lKVswXQorCisgICAgICAgIGluZm9fYXJyYXkgPSBbXQorICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICBpZiB0eXBlKGNhY2hlX2NsYXNzKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKGNhY2hlX2NsYXNzLCBSZWNpcGVJbmZvQ29tbW9uKToKKyAgICAgICAgICAgICAgICBpbmZvX2FycmF5LmFwcGVuZChjYWNoZV9jbGFzcyhyZWFsZm4sIGRhdGEpKQorICAgICAgICBzZWxmLmFkZF9pbmZvKGZpbGVfbmFtZSwgaW5mb19hcnJheSwgY2FjaGVEYXRhLCBwYXJzZWQpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGxvYWRfYmJmaWxlKGJiZmlsZSwgYXBwZW5kcywgY29uZmlnKToKKyAgICAgICAgIiIiCisgICAgICAgIExvYWQgYW5kIHBhcnNlIG9uZSAuYmIgYnVpbGQgZmlsZQorICAgICAgICBSZXR1cm4gdGhlIGRhdGEgYW5kIHdoZXRoZXIgcGFyc2luZyByZXN1bHRlZCBpbiB0aGUgZmlsZSBiZWluZyBza2lwcGVkCisgICAgICAgICIiIgorICAgICAgICBjaGRpcl9iYWNrID0gRmFsc2UKKworICAgICAgICBmcm9tIGJiIGltcG9ydCBwYXJzZQorCisgICAgICAgICMgZXhwYW5kIHRtcGRpciB0byBpbmNsdWRlIHRoaXMgdG9wZGlyCisgICAgICAgIGNvbmZpZy5zZXRWYXIoJ1RNUERJUicsIGNvbmZpZy5nZXRWYXIoJ1RNUERJUicsIFRydWUpIG9yICIiKQorICAgICAgICBiYmZpbGVfbG9jID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShiYmZpbGUpKQorICAgICAgICBvbGRwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLmdldGN3ZCgpKQorICAgICAgICBwYXJzZS5jYWNoZWRfbXRpbWVfbm9lcnJvcihiYmZpbGVfbG9jKQorICAgICAgICBiYl9kYXRhID0gY29uZmlnLmNyZWF0ZUNvcHkoKQorICAgICAgICAjIFRoZSBDb25mSGFuZGxlciBmaXJzdCBsb29rcyBpZiB0aGVyZSBpcyBhIFRPUERJUiBhbmQgaWYgbm90CisgICAgICAgICMgdGhlbiBpdCB3b3VsZCBjYWxsIGdldGN3ZCgpLgorICAgICAgICAjIFByZXZpb3VzbHksIHdlIGNoZGlyKCllZCB0byBiYmZpbGVfbG9jLCBjYWxsZWQgdGhlIGhhbmRsZXIKKyAgICAgICAgIyBhbmQgZmluYWxseSBjaGRpcigpZWQgYmFjaywgYSBjb3VwbGUgb2YgdGhvdXNhbmQgdGltZXMuIFdlIG5vdworICAgICAgICAjIGp1c3QgZmlsbCBpbiBUT1BESVIgdG8gcG9pbnQgdG8gYmJmaWxlX2xvYyBpZiB0aGVyZSBpcyBubyBUT1BESVIgeWV0LgorICAgICAgICBpZiBub3QgYmJfZGF0YS5nZXRWYXIoJ1RPUERJUicsIEZhbHNlKToKKyAgICAgICAgICAgIGNoZGlyX2JhY2sgPSBUcnVlCisgICAgICAgICAgICBiYl9kYXRhLnNldFZhcignVE9QRElSJywgYmJmaWxlX2xvYykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgYXBwZW5kczoKKyAgICAgICAgICAgICAgICBiYl9kYXRhLnNldFZhcignX19CQkFQUEVORCcsICIgIi5qb2luKGFwcGVuZHMpKQorICAgICAgICAgICAgYmJfZGF0YSA9IHBhcnNlLmhhbmRsZShiYmZpbGUsIGJiX2RhdGEpCisgICAgICAgICAgICBpZiBjaGRpcl9iYWNrOgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZHBhdGgpCisgICAgICAgICAgICByZXR1cm4gYmJfZGF0YQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBjaGRpcl9iYWNrOgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZHBhdGgpCisgICAgICAgICAgICByYWlzZQorCisKK2RlZiBpbml0KGNvb2tlcik6CisgICAgIiIiCisgICAgVGhlIE9iamVjdGl2ZTogQ2FjaGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgcG9zc2libGUgeWV0IGdldCB0byB0aGUKKyAgICBzdGFnZSBvZiBidWlsZGluZyBwYWNrYWdlcyAoaS5lLiB0cnlCdWlsZCkgd2l0aG91dCByZXBhcnNpbmcgYW55IC5iYiBmaWxlcy4KKworICAgIFRvIGRvIHRoaXMsIHdlIGludGVyY2VwdCBnZXRWYXIgY2FsbHMgYW5kIG9ubHkgY2FjaGUgdGhlIHZhcmlhYmxlcyB3ZSBzZWUKKyAgICBiZWluZyBhY2Nlc3NlZC4gV2UgcmVseSBvbiB0aGUgY2FjaGUgZ2V0VmFyIGNhbGxzIGJlaW5nIG1hZGUgZm9yIGFsbAorICAgIHZhcmlhYmxlcyBiaXRiYWtlIG1pZ2h0IG5lZWQgdG8gdXNlIHRvIHJlYWNoIHRoaXMgc3RhZ2UuIEZvciBlYWNoIGNhY2hlZAorICAgIGZpbGUgd2UgbmVlZCB0byB0cmFjazoKKworICAgICogSXRzIG10aW1lCisgICAgKiBUaGUgbXRpbWVzIG9mIGFsbCBpdHMgZGVwZW5kZW5jaWVzCisgICAgKiBXaGV0aGVyIGl0IGNhdXNlZCBhIHBhcnNlLlNraXBSZWNpcGUgZXhjZXB0aW9uCisKKyAgICBGaWxlcyBjYXVzaW5nIHBhcnNpbmcgZXJyb3JzIGFyZSBldmljdGVkIGZyb20gdGhlIGNhY2hlLgorCisgICAgIiIiCisgICAgcmV0dXJuIENhY2hlKGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGFfaGFzaCkKKworCitjbGFzcyBDYWNoZURhdGEob2JqZWN0KToKKyAgICAiIiIKKyAgICBUaGUgZGF0YSBzdHJ1Y3R1cmVzIHdlIGNvbXBpbGUgZnJvbSB0aGUgY2FjaGVkIGRhdGEKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZXNfYXJyYXkpOgorICAgICAgICBzZWxmLmNhY2hlc19hcnJheSA9IGNhY2hlc19hcnJheQorICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICBpZiB0eXBlKGNhY2hlX2NsYXNzKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKGNhY2hlX2NsYXNzLCBSZWNpcGVJbmZvQ29tbW9uKToKKyAgICAgICAgICAgICAgICBjYWNoZV9jbGFzcy5pbml0X2NhY2hlRGF0YShzZWxmKSAgICAgICAgCisKKyAgICAgICAgIyBEaXJlY3QgY2FjaGUgdmFyaWFibGVzCisgICAgICAgIHNlbGYudGFza19xdWV1ZXMgPSB7fQorICAgICAgICBzZWxmLnByZWZlcnJlZCA9IHt9CisgICAgICAgIHNlbGYudGFza3MgPSB7fQorICAgICAgICAjIEluZGlyZWN0IENhY2hlIHZhcmlhYmxlcyAoc2V0IGVsc2V3aGVyZSkKKyAgICAgICAgc2VsZi5pZ25vcmVkX2RlcGVuZGVuY2llcyA9IFtdCisgICAgICAgIHNlbGYud29ybGRfdGFyZ2V0ID0gc2V0KCkKKyAgICAgICAgc2VsZi5iYmZpbGVfcHJpb3JpdHkgPSB7fQorCisgICAgZGVmIGFkZF9mcm9tX3JlY2lwZWluZm8oc2VsZiwgZm4sIGluZm9fYXJyYXkpOgorICAgICAgICBmb3IgaW5mbyBpbiBpbmZvX2FycmF5OgorICAgICAgICAgICAgaW5mby5hZGRfY2FjaGVEYXRhKHNlbGYsIGZuKQorCitjbGFzcyBNdWx0aVByb2Nlc3NDYWNoZShvYmplY3QpOgorICAgICIiIgorICAgIEJpdEJha2UgbXVsdGktcHJvY2VzcyBjYWNoZSBpbXBsZW1lbnRhdGlvbgorCisgICAgVXNlZCBieSB0aGUgY29kZXBhcnNlciAmIGZpbGUgY2hlY2tzdW0gY2FjaGVzCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FjaGVmaWxlID0gTm9uZQorICAgICAgICBzZWxmLmNhY2hlZGF0YSA9IHNlbGYuY3JlYXRlX2NhY2hlZGF0YSgpCisgICAgICAgIHNlbGYuY2FjaGVkYXRhX2V4dHJhcyA9IHNlbGYuY3JlYXRlX2NhY2hlZGF0YSgpCisKKyAgICBkZWYgaW5pdF9jYWNoZShzZWxmLCBkKToKKyAgICAgICAgY2FjaGVkaXIgPSAoZC5nZXRWYXIoIlBFUlNJU1RFTlRfRElSIiwgVHJ1ZSkgb3IKKyAgICAgICAgICAgICAgICAgICAgZC5nZXRWYXIoIkNBQ0hFIiwgVHJ1ZSkpCisgICAgICAgIGlmIGNhY2hlZGlyIGluIFtOb25lLCAnJ106CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKGNhY2hlZGlyKQorICAgICAgICBzZWxmLmNhY2hlZmlsZSA9IG9zLnBhdGguam9pbihjYWNoZWRpciwgc2VsZi5fX2NsYXNzX18uY2FjaGVfZmlsZV9uYW1lKQorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlVzaW5nIGNhY2hlIGluICclcyciLCBzZWxmLmNhY2hlZmlsZSkKKworICAgICAgICBnbGYgPSBiYi51dGlscy5sb2NrZmlsZShzZWxmLmNhY2hlZmlsZSArICIubG9jayIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuY2FjaGVmaWxlLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIHAgPSBwaWNrbGUuVW5waWNrbGVyKGYpCisgICAgICAgICAgICAgICAgZGF0YSwgdmVyc2lvbiA9IHAubG9hZCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUoZ2xmKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYmIudXRpbHMudW5sb2NrZmlsZShnbGYpCisKKyAgICAgICAgaWYgdmVyc2lvbiAhPSBzZWxmLl9fY2xhc3NfXy5DQUNIRV9WRVJTSU9OOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5jYWNoZWRhdGEgPSBkYXRhCisKKyAgICBkZWYgY3JlYXRlX2NhY2hlZGF0YShzZWxmKToKKyAgICAgICAgZGF0YSA9IFt7fV0KKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBzYXZlX2V4dHJhcyhzZWxmLCBkKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2FjaGVmaWxlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZ2xmID0gYmIudXRpbHMubG9ja2ZpbGUoc2VsZi5jYWNoZWZpbGUgKyAiLmxvY2siLCBzaGFyZWQ9VHJ1ZSkKKworICAgICAgICBpID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgbGYgPSBOb25lCisgICAgICAgIHdoaWxlIG5vdCBsZjoKKyAgICAgICAgICAgIGxmID0gYmIudXRpbHMubG9ja2ZpbGUoc2VsZi5jYWNoZWZpbGUgKyAiLmxvY2suIiArIHN0cihpKSwgcmV0cnk9RmFsc2UpCisgICAgICAgICAgICBpZiBub3QgbGYgb3Igb3MucGF0aC5leGlzdHMoc2VsZi5jYWNoZWZpbGUgKyAiLSIgKyBzdHIoaSkpOgorICAgICAgICAgICAgICAgIGlmIGxmOgorICAgICAgICAgICAgICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGxmKQorICAgICAgICAgICAgICAgICAgICBsZiA9IE5vbmUKKyAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5jYWNoZWZpbGUgKyAiLSIgKyBzdHIoaSksICJ3YiIpIGFzIGY6CisgICAgICAgICAgICAgICAgcCA9IHBpY2tsZS5QaWNrbGVyKGYsIC0xKQorICAgICAgICAgICAgICAgIHAuZHVtcChbc2VsZi5jYWNoZWRhdGFfZXh0cmFzLCBzZWxmLl9fY2xhc3NfXy5DQUNIRV9WRVJTSU9OXSkKKworICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGxmKQorICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGdsZikKKworICAgIGRlZiBtZXJnZV9kYXRhKHNlbGYsIHNvdXJjZSwgZGVzdCk6CisgICAgICAgIGZvciBqIGluIHJhbmdlKDAsbGVuKGRlc3QpKToKKyAgICAgICAgICAgIGZvciBoIGluIHNvdXJjZVtqXToKKyAgICAgICAgICAgICAgICBpZiBoIG5vdCBpbiBkZXN0W2pdOgorICAgICAgICAgICAgICAgICAgICBkZXN0W2pdW2hdID0gc291cmNlW2pdW2hdCisKKyAgICBkZWYgc2F2ZV9tZXJnZShzZWxmLCBkKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2FjaGVmaWxlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZ2xmID0gYmIudXRpbHMubG9ja2ZpbGUoc2VsZi5jYWNoZWZpbGUgKyAiLmxvY2siKQorCisgICAgICAgIGRhdGEgPSBzZWxmLmNhY2hlZGF0YQorCisgICAgICAgIGZvciBmIGluIFt5IGZvciB5IGluIG9zLmxpc3RkaXIob3MucGF0aC5kaXJuYW1lKHNlbGYuY2FjaGVmaWxlKSkgaWYgeS5zdGFydHN3aXRoKG9zLnBhdGguYmFzZW5hbWUoc2VsZi5jYWNoZWZpbGUpICsgJy0nKV06CisgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzZWxmLmNhY2hlZmlsZSksIGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyYiIpIGFzIGZkOgorICAgICAgICAgICAgICAgICAgICBwID0gcGlja2xlLlVucGlja2xlcihmZCkKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFkYXRhLCB2ZXJzaW9uID0gcC5sb2FkKCkKKyAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgRU9GRXJyb3IpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHZlcnNpb24gIT0gc2VsZi5fX2NsYXNzX18uQ0FDSEVfVkVSU0lPTjoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzZWxmLm1lcmdlX2RhdGEoZXh0cmFkYXRhLCBkYXRhKQorICAgICAgICAgICAgb3MudW5saW5rKGYpCisKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuY2FjaGVmaWxlLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgcCA9IHBpY2tsZS5QaWNrbGVyKGYsIC0xKQorICAgICAgICAgICAgcC5kdW1wKFtkYXRhLCBzZWxmLl9fY2xhc3NfXy5DQUNIRV9WRVJTSU9OXSkKKworICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGdsZikKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvY2FjaGVfZXh0cmEucHkgYi9iaXRiYWtlL2xpYi9iYi9jYWNoZV9leHRyYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2Y0OTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvY2FjaGVfZXh0cmEucHkKQEAgLTAsMCArMSw3NSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgRXh0cmEgUmVjaXBlSW5mbyB3aWxsIGJlIGFsbCBkZWZpbmVkIGluIHRoaXMgZmlsZS4gQ3VycmVudGx5LAorIyBPbmx5IEhvYiAoSW1hZ2UgQ3JlYXRvcikgUmVxdWVzdHMgc29tZSBleHRyYSBmaWVsZHMuIFNvCisjIEhvYlJlY2lwZUluZm8gaXMgZGVmaW5lZC4gSXQncyBuYW1lZCBIb2JSZWNpcGVJbmZvIGJlY2F1c2UgaXQKKyMgaXMgaW50cm9kdWNlZCBieSAnaG9iJy4gVXNlcnMgY291bGQgYWxzbyBpbnRyb2R1Y2Ugb3RoZXIKKyMgUmVjaXBlSW5mbyBvciBzaW1wbHkgdXNlIHRob3NlIGFscmVhZHkgZGVmaW5lZCBSZWNpcGVJbmZvLgorIyBJbiB0aGUgZm9sbG93aW5nIHBhdGNoLCB0aGlzIG5ld2x5IGRlZmluZWQgbmV3IGV4dHJhIFJlY2lwZUluZm8KKyMgd2lsbCBiZSBkeW5hbWljYWxseSBsb2FkZWQgYW5kIHVzZWQgZm9yIGxvYWRpbmcvc2F2aW5nIHRoZSBleHRyYQorIyBjYWNoZSBmaWVsZHMgIAorCisjIENvcHlyaWdodCAoQykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gYmIuY2FjaGUgaW1wb3J0IFJlY2lwZUluZm9Db21tb24KKworY2xhc3MgSG9iUmVjaXBlSW5mbyhSZWNpcGVJbmZvQ29tbW9uKToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgY2xhc3NuYW1lID0gIkhvYlJlY2lwZUluZm8iCisgICAgIyBwbGVhc2Ugb3ZlcnJpZGUgdGhpcyBtZW1iZXIgd2l0aCB0aGUgY29ycmVjdCBkYXRhIGNhY2hlIGZpbGUKKyAgICAjIHN1Y2ggYXMgKGJiX2NhY2hlLmRhdCwgYmJfZXh0cmFjYWNoZV9ob2IuZGF0KSAKKyAgICBjYWNoZWZpbGUgPSAiYmJfZXh0cmFjYWNoZV8iICsgY2xhc3NuYW1lICsiLmRhdCIgICAgICAgIAorCisgICAgIyBvdmVycmlkZSB0aGlzIG1lbWJlciB3aXRoIHRoZSBsaXN0IG9mIGV4dHJhIGNhY2hlIGZpZWxkcworICAgICMgdGhhdCB0aGlzIGNsYXNzIHdpbGwgcHJvdmlkZQorICAgIGNhY2hlZmllbGRzID0gWydzdW1tYXJ5JywgJ2xpY2Vuc2UnLCAnc2VjdGlvbicsCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nLCAnaG9tZXBhZ2UnLCAnYnVndHJhY2tlcicsCisgICAgICAgICAgICAncHJldmlzaW9uJywgJ2ZpbGVzX2luZm8nXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBtZXRhZGF0YSk6CisKKyAgICAgICAgc2VsZi5zdW1tYXJ5ID0gc2VsZi5nZXR2YXIoJ1NVTU1BUlknLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5saWNlbnNlID0gc2VsZi5nZXR2YXIoJ0xJQ0VOU0UnLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5zZWN0aW9uID0gc2VsZi5nZXR2YXIoJ1NFQ1RJT04nLCBtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IHNlbGYuZ2V0dmFyKCdERVNDUklQVElPTicsIG1ldGFkYXRhKQorICAgICAgICBzZWxmLmhvbWVwYWdlID0gc2VsZi5nZXR2YXIoJ0hPTUVQQUdFJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuYnVndHJhY2tlciA9IHNlbGYuZ2V0dmFyKCdCVUdUUkFDS0VSJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYucHJldmlzaW9uID0gc2VsZi5nZXR2YXIoJ1BSJywgbWV0YWRhdGEpCisgICAgICAgIHNlbGYuZmlsZXNfaW5mbyA9IHNlbGYuZ2V0dmFyKCdGSUxFU19JTkZPJywgbWV0YWRhdGEpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgaW5pdF9jYWNoZURhdGEoY2xzLCBjYWNoZWRhdGEpOgorICAgICAgICAjIENhY2hlRGF0YSBpbiBIb2IgUmVjaXBlSW5mbyBDbGFzcworICAgICAgICBjYWNoZWRhdGEuc3VtbWFyeSA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5saWNlbnNlID0ge30KKyAgICAgICAgY2FjaGVkYXRhLnNlY3Rpb24gPSB7fQorICAgICAgICBjYWNoZWRhdGEuZGVzY3JpcHRpb24gPSB7fQorICAgICAgICBjYWNoZWRhdGEuaG9tZXBhZ2UgPSB7fQorICAgICAgICBjYWNoZWRhdGEuYnVndHJhY2tlciA9IHt9CisgICAgICAgIGNhY2hlZGF0YS5wcmV2aXNpb24gPSB7fQorICAgICAgICBjYWNoZWRhdGEuZmlsZXNfaW5mbyA9IHt9CisKKyAgICBkZWYgYWRkX2NhY2hlRGF0YShzZWxmLCBjYWNoZWRhdGEsIGZuKToKKyAgICAgICAgY2FjaGVkYXRhLnN1bW1hcnlbZm5dID0gc2VsZi5zdW1tYXJ5CisgICAgICAgIGNhY2hlZGF0YS5saWNlbnNlW2ZuXSA9IHNlbGYubGljZW5zZQorICAgICAgICBjYWNoZWRhdGEuc2VjdGlvbltmbl0gPSBzZWxmLnNlY3Rpb24KKyAgICAgICAgY2FjaGVkYXRhLmRlc2NyaXB0aW9uW2ZuXSA9IHNlbGYuZGVzY3JpcHRpb24KKyAgICAgICAgY2FjaGVkYXRhLmhvbWVwYWdlW2ZuXSA9IHNlbGYuaG9tZXBhZ2UKKyAgICAgICAgY2FjaGVkYXRhLmJ1Z3RyYWNrZXJbZm5dID0gc2VsZi5idWd0cmFja2VyCisgICAgICAgIGNhY2hlZGF0YS5wcmV2aXNpb25bZm5dID0gc2VsZi5wcmV2aXNpb24KKyAgICAgICAgY2FjaGVkYXRhLmZpbGVzX2luZm9bZm5dID0gc2VsZi5maWxlc19pbmZvCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9jaGVja3N1bS5weSBiL2JpdGJha2UvbGliL2JiL2NoZWNrc3VtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNGZmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9jaGVja3N1bS5weQpAQCAtMCwwICsxLDkwIEBACisjIExvY2FsIGZpbGUgY2hlY2tzdW0gY2FjaGUgaW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdGF0CitpbXBvcnQgYmIudXRpbHMKK2ltcG9ydCBsb2dnaW5nCitmcm9tIGJiLmNhY2hlIGltcG9ydCBNdWx0aVByb2Nlc3NDYWNoZQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5DYWNoZSIpCisKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgcGlja2xlCisgICAgbG9nZ2VyLmluZm8oIkltcG9ydGluZyBjUGlja2xlIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJGYWxsaW5nIGJhY2sgdG8gYSB2ZXJ5IHNsb3cgaW1wbGVtZW50YXRpb24uIikKKworCisjIG10aW1lIGNhY2hlIChub24tcGVyc2lzdGVudCkKKyMgYmFzZWQgdXBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGZpbGVzIGRvIG5vdCBjaGFuZ2UgZHVyaW5nIGJpdGJha2UgcnVuCitjbGFzcyBGaWxlTXRpbWVDYWNoZShvYmplY3QpOgorICAgIGNhY2hlID0ge30KKworICAgIGRlZiBjYWNoZWRfbXRpbWUoc2VsZiwgZik6CisgICAgICAgIGlmIGYgbm90IGluIHNlbGYuY2FjaGU6CisgICAgICAgICAgICBzZWxmLmNhY2hlW2ZdID0gb3Muc3RhdChmKVtzdGF0LlNUX01USU1FXQorICAgICAgICByZXR1cm4gc2VsZi5jYWNoZVtmXQorCisgICAgZGVmIGNhY2hlZF9tdGltZV9ub2Vycm9yKHNlbGYsIGYpOgorICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLmNhY2hlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2FjaGVbZl0gPSBvcy5zdGF0KGYpW3N0YXQuU1RfTVRJTUVdCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gc2VsZi5jYWNoZVtmXQorCisgICAgZGVmIHVwZGF0ZV9tdGltZShzZWxmLCBmKToKKyAgICAgICAgc2VsZi5jYWNoZVtmXSA9IG9zLnN0YXQoZilbc3RhdC5TVF9NVElNRV0KKyAgICAgICAgcmV0dXJuIHNlbGYuY2FjaGVbZl0KKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi5jYWNoZS5jbGVhcigpCisKKyMgQ2hlY2tzdW0gKyBtdGltZSBjYWNoZSAocGVyc2lzdGVudCkKK2NsYXNzIEZpbGVDaGVja3N1bUNhY2hlKE11bHRpUHJvY2Vzc0NhY2hlKToKKyAgICBjYWNoZV9maWxlX25hbWUgPSAibG9jYWxfZmlsZV9jaGVja3N1bV9jYWNoZS5kYXQiCisgICAgQ0FDSEVfVkVSU0lPTiA9IDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tdGltZV9jYWNoZSA9IEZpbGVNdGltZUNhY2hlKCkKKyAgICAgICAgTXVsdGlQcm9jZXNzQ2FjaGUuX19pbml0X18oc2VsZikKKworICAgIGRlZiBnZXRfY2hlY2tzdW0oc2VsZiwgZik6CisgICAgICAgIGVudHJ5ID0gc2VsZi5jYWNoZWRhdGFbMF0uZ2V0KGYpCisgICAgICAgIGNtdGltZSA9IHNlbGYubXRpbWVfY2FjaGUuY2FjaGVkX210aW1lKGYpCisgICAgICAgIGlmIGVudHJ5OgorICAgICAgICAgICAgKG10aW1lLCBoYXNodmFsKSA9IGVudHJ5CisgICAgICAgICAgICBpZiBjbXRpbWUgPT0gbXRpbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2h2YWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmIuZGVidWcoMiwgImZpbGUgJXMgY2hhbmdlZCBtdGltZSwgcmVjb21wdXRlIGNoZWNrc3VtIiAlIGYpCisKKyAgICAgICAgaGFzaHZhbCA9IGJiLnV0aWxzLm1kNV9maWxlKGYpCisgICAgICAgIHNlbGYuY2FjaGVkYXRhX2V4dHJhc1swXVtmXSA9IChjbXRpbWUsIGhhc2h2YWwpCisgICAgICAgIHJldHVybiBoYXNodmFsCisKKyAgICBkZWYgbWVyZ2VfZGF0YShzZWxmLCBzb3VyY2UsIGRlc3QpOgorICAgICAgICBmb3IgaCBpbiBzb3VyY2VbMF06CisgICAgICAgICAgICBpZiBoIGluIGRlc3Q6CisgICAgICAgICAgICAgICAgKHNtdGltZSwgXykgPSBzb3VyY2VbMF1baF0KKyAgICAgICAgICAgICAgICAoZG10aW1lLCBfKSA9IGRlc3RbMF1baF0KKyAgICAgICAgICAgICAgICBpZiBzbXRpbWUgPiBkbXRpbWU6CisgICAgICAgICAgICAgICAgICAgIGRlc3RbMF1baF0gPSBzb3VyY2VbMF1baF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzdFswXVtoXSA9IHNvdXJjZVswXVtoXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvY29kZXBhcnNlci5weSBiL2JpdGJha2UvbGliL2JiL2NvZGVwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhM2FmNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2NvZGVwYXJzZXIucHkKQEAgLTAsMCArMSw0MTQgQEAKK2ltcG9ydCBhc3QKK2ltcG9ydCBjb2RlZ2VuCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBiYi51dGlscywgYmIuZGF0YQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCitmcm9tIHB5c2ggaW1wb3J0IHB5c2h5YWNjLCBweXNobGV4LCBzaGVycm9ycworZnJvbSBiYi5jYWNoZSBpbXBvcnQgTXVsdGlQcm9jZXNzQ2FjaGUKKworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5Db2RlUGFyc2VyJykKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKyAgICBsb2dnZXIuaW5mbygnSW1wb3J0aW5nIGNQaWNrbGUgZmFpbGVkLiAgRmFsbGluZyBiYWNrIHRvIGEgdmVyeSBzbG93IGltcGxlbWVudGF0aW9uLicpCisKKworZGVmIGNoZWNrX2luZGVudChjb2Rlc3RyKToKKyAgICAiIiJJZiB0aGUgY29kZSBpcyBpbmRlbnRlZCwgYWRkIGEgdG9wIGxldmVsIHBpZWNlIG9mIGNvZGUgdG8gJ3JlbW92ZScgdGhlIGluZGVudGF0aW9uIiIiCisKKyAgICBpID0gMAorICAgIHdoaWxlIGNvZGVzdHJbaV0gaW4gWyJcbiIsICJcdCIsICIgIl06CisgICAgICAgIGkgPSBpICsgMQorCisgICAgaWYgaSA9PSAwOgorICAgICAgICByZXR1cm4gY29kZXN0cgorCisgICAgaWYgY29kZXN0cltpLTFdID09ICJcdCIgb3IgY29kZXN0cltpLTFdID09ICIgIjoKKyAgICAgICAgcmV0dXJuICJpZiAxOlxuIiArIGNvZGVzdHIKKworICAgIHJldHVybiBjb2Rlc3RyCisKKworIyBCYXNpY2FsbHkgcGlja2xlLCBpbiBweXRob24gMi43LjMgYXQgbGVhc3QsIGRvZXMgYmFkbHkgd2l0aCBkYXRhIGR1cGxpY2F0aW9uIAorIyB1cG9uIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nLiBDb21iaW5lIHRoaXMgd2l0aCBkdXBsaWNhdGUgb2JqZWN0cyBhbmQgdGhpbmdzCisjIGFyZSBhIG1lc3MuCisjCisjIFdoZW4gdGhlIHNldHMgYXJlIG9yaWdpbmFsbHkgY3JlYXRlZCwgcHl0aG9uIGNhbGxzIGludGVybigpIG9uIHRoZSBzZXQga2V5cworIyB3aGljaCBzaWduaWZpY2FudGx5IGltcHJvdmVzIG1lbW9yeSB1c2FnZS4gU2FkbHkgdGhlIHBpY2tsZS91bnBpY2tsZSBwcm9jZXNzCisjIGRvZXNuJ3QgY2FsbCBpbnRlcm4oKSBvbiB0aGUga2V5cyBhbmQgcmVzdWx0cyBpbiB0aGUgc2FtZSBzdHJpbmdzIGJlaW5nIGR1cGxpY2F0ZWQKKyMgaW4gbWVtb3J5LiBUaGlzIGFsc28gbWVhbnMgcGlja2xlIHdpbGwgc2F2ZSB0aGUgc2FtZSBzdHJpbmcgbXVsdGlwbGUgdGltZXMgaW4KKyMgdGhlIGNhY2hlIGZpbGUuCisjCisjIEJ5IGhhdmluZyBzaGVsbCBhbmQgcHl0aG9uIGNhY2hlbGluZSBvYmplY3RzIHdpdGggc2V0c3RhdGUvZ2V0c3RhdGUsIHdlIGZvcmNlCisjIHRoZSBvYmplY3QgY3JlYXRpb24gdGhyb3VnaCBvdXIgb3duIHJvdXRpbmUgd2hlcmUgd2UgY2FuIGNhbGwgaW50ZXJuICh2aWEgaW50ZXJuU2V0KS4KKyMKKyMgV2UgYWxzbyB1c2UgaGFzaGFibGUgZnJvemVuc2V0cyBhbmQgZW5zdXJlIHdlIHVzZSByZWZlcmVuY2VzIHRvIHRoZXNlIHNvIHRoYXQKKyMgZHVwbGljYXRlcyBjYW4gYmUgcmVtb3ZlZCwgYm90aCBpbiBtZW1vcnkgYW5kIGluIHRoZSByZXN1bHRpbmcgcGlja2xlZCBkYXRhLgorIworIyBCeSBwbGF5aW5nIHRoZXNlIGdhbWVzLCB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUgZmlsZSBzaHJpbmtzIGRyYW1hdGljYWxseQorIyBtZWFuaW5nIGZhc3RlciBsb2FkIHRpbWVzIGFuZCB0aGUgcmVsb2FkZWQgY2FjaGUgZmlsZXMgYWxzbyBjb25zdW1lIG11Y2ggbGVzcworIyBtZW1vcnkuIFNtYWxsZXIgY2FjaGUgZmlsZXMsIGZhc3RlciBsb2FkIHRpbWVzIGFuZCBsb3dlciBtZW1vcnkgdXNhZ2UgaXMgZ29vZC4KKyMKKyMgQSBjdXN0b20gZ2V0c3RhdGUvc2V0c3RhdGUgdXNpbmcgdHVwbGVzIGlzIGFjdHVhbGx5IHdvcnRoIDE1JSBjYWNoZXNpemUgYnkKKyMgYXZvaWRpbmcgZHVwbGljYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSBuYW1lcyEKKworY2xhc3MgU2V0Q2FjaGUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2V0Y2FjaGUgPSB7fQorCisgICAgZGVmIGludGVyblNldChzZWxmLCBpdGVtcyk6CisgICAgICAgIAorICAgICAgICBuZXcgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIG5ldy5hcHBlbmQoaW50ZXJuKGkpKQorICAgICAgICBzID0gZnJvemVuc2V0KG5ldykKKyAgICAgICAgaWYgaGFzaChzKSBpbiBzZWxmLnNldGNhY2hlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0Y2FjaGVbaGFzaChzKV0KKyAgICAgICAgc2VsZi5zZXRjYWNoZVtoYXNoKHMpXSA9IHMKKyAgICAgICAgcmV0dXJuIHMKKworY29kZWNhY2hlID0gU2V0Q2FjaGUoKQorCitjbGFzcyBweXRob25DYWNoZUxpbmUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVmcywgZXhlY3MsIGNvbnRhaW5zKToKKyAgICAgICAgc2VsZi5yZWZzID0gY29kZWNhY2hlLmludGVyblNldChyZWZzKQorICAgICAgICBzZWxmLmV4ZWNzID0gY29kZWNhY2hlLmludGVyblNldChleGVjcykKKyAgICAgICAgc2VsZi5jb250YWlucyA9IHt9CisgICAgICAgIGZvciBjIGluIGNvbnRhaW5zOgorICAgICAgICAgICAgc2VsZi5jb250YWluc1tjXSA9IGNvZGVjYWNoZS5pbnRlcm5TZXQoY29udGFpbnNbY10pCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYucmVmcywgc2VsZi5leGVjcywgc2VsZi5jb250YWlucykKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAocmVmcywgZXhlY3MsIGNvbnRhaW5zKSA9IHN0YXRlCisgICAgICAgIHNlbGYuX19pbml0X18ocmVmcywgZXhlY3MsIGNvbnRhaW5zKQorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgbCA9IChoYXNoKHNlbGYucmVmcyksIGhhc2goc2VsZi5leGVjcykpCisgICAgICAgIGZvciBjIGluIHNvcnRlZChzZWxmLmNvbnRhaW5zLmtleXMoKSk6CisgICAgICAgICAgICBsID0gbCArIChjLCBoYXNoKHNlbGYuY29udGFpbnNbY10pKQorICAgICAgICByZXR1cm4gaGFzaChsKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIgIi5qb2luKFtzdHIoc2VsZi5yZWZzKSwgc3RyKHNlbGYuZXhlY3MpLCBzdHIoc2VsZi5jb250YWlucyldKSAKKworCitjbGFzcyBzaGVsbENhY2hlTGluZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleGVjcyk6CisgICAgICAgIHNlbGYuZXhlY3MgPSBjb2RlY2FjaGUuaW50ZXJuU2V0KGV4ZWNzKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmV4ZWNzKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIChleGVjcykgPSBzdGF0ZQorICAgICAgICBzZWxmLl9faW5pdF9fKGV4ZWNzKQorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5leGVjcykKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi5leGVjcykKKworY2xhc3MgQ29kZVBhcnNlckNhY2hlKE11bHRpUHJvY2Vzc0NhY2hlKToKKyAgICBjYWNoZV9maWxlX25hbWUgPSAiYmJfY29kZXBhcnNlci5kYXQiCisgICAgQ0FDSEVfVkVSU0lPTiA9IDcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgTXVsdGlQcm9jZXNzQ2FjaGUuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5weXRob25jYWNoZSA9IHNlbGYuY2FjaGVkYXRhWzBdCisgICAgICAgIHNlbGYuc2hlbGxjYWNoZSA9IHNlbGYuY2FjaGVkYXRhWzFdCisgICAgICAgIHNlbGYucHl0aG9uY2FjaGVleHRyYXMgPSBzZWxmLmNhY2hlZGF0YV9leHRyYXNbMF0KKyAgICAgICAgc2VsZi5zaGVsbGNhY2hlZXh0cmFzID0gc2VsZi5jYWNoZWRhdGFfZXh0cmFzWzFdCisKKyAgICAgICAgIyBUbyBhdm9pZCBkdXBsaWNhdGlvbiBpbiB0aGUgY29kZXBhcnNlciBjYWNoZSwga2VlcAorICAgICAgICAjIGEgbG9va3VwIG9mIGhhc2hlcyBvZiBvYmplY3RzIHdlIGFscmVhZHkgaGF2ZQorICAgICAgICBzZWxmLnB5dGhvbmNhY2hlbGluZXMgPSB7fQorICAgICAgICBzZWxmLnNoZWxsY2FjaGVsaW5lcyA9IHt9CisKKyAgICBkZWYgbmV3UHl0aG9uQ2FjaGVMaW5lKHNlbGYsIHJlZnMsIGV4ZWNzLCBjb250YWlucyk6CisgICAgICAgIGNhY2hlbGluZSA9IHB5dGhvbkNhY2hlTGluZShyZWZzLCBleGVjcywgY29udGFpbnMpCisgICAgICAgIGggPSBoYXNoKGNhY2hlbGluZSkKKyAgICAgICAgaWYgaCBpbiBzZWxmLnB5dGhvbmNhY2hlbGluZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5weXRob25jYWNoZWxpbmVzW2hdCisgICAgICAgIHNlbGYucHl0aG9uY2FjaGVsaW5lc1toXSA9IGNhY2hlbGluZQorICAgICAgICByZXR1cm4gY2FjaGVsaW5lCisKKyAgICBkZWYgbmV3U2hlbGxDYWNoZUxpbmUoc2VsZiwgZXhlY3MpOgorICAgICAgICBjYWNoZWxpbmUgPSBzaGVsbENhY2hlTGluZShleGVjcykKKyAgICAgICAgaCA9IGhhc2goY2FjaGVsaW5lKQorICAgICAgICBpZiBoIGluIHNlbGYuc2hlbGxjYWNoZWxpbmVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGxjYWNoZWxpbmVzW2hdCisgICAgICAgIHNlbGYuc2hlbGxjYWNoZWxpbmVzW2hdID0gY2FjaGVsaW5lCisgICAgICAgIHJldHVybiBjYWNoZWxpbmUKKworICAgIGRlZiBpbml0X2NhY2hlKHNlbGYsIGQpOgorICAgICAgICBNdWx0aVByb2Nlc3NDYWNoZS5pbml0X2NhY2hlKHNlbGYsIGQpCisKKyAgICAgICAgIyBjYWNoZWRhdGEgZ2V0cyByZS1hc3NpZ25lZCBpbiB0aGUgcGFyZW50CisgICAgICAgIHNlbGYucHl0aG9uY2FjaGUgPSBzZWxmLmNhY2hlZGF0YVswXQorICAgICAgICBzZWxmLnNoZWxsY2FjaGUgPSBzZWxmLmNhY2hlZGF0YVsxXQorCisgICAgZGVmIGNyZWF0ZV9jYWNoZWRhdGEoc2VsZik6CisgICAgICAgIGRhdGEgPSBbe30sIHt9XQorICAgICAgICByZXR1cm4gZGF0YQorCitjb2RlcGFyc2VyY2FjaGUgPSBDb2RlUGFyc2VyQ2FjaGUoKQorCitkZWYgcGFyc2VyX2NhY2hlX2luaXQoZCk6CisgICAgY29kZXBhcnNlcmNhY2hlLmluaXRfY2FjaGUoZCkKKworZGVmIHBhcnNlcl9jYWNoZV9zYXZlKGQpOgorICAgIGNvZGVwYXJzZXJjYWNoZS5zYXZlX2V4dHJhcyhkKQorCitkZWYgcGFyc2VyX2NhY2hlX3NhdmVtZXJnZShkKToKKyAgICBjb2RlcGFyc2VyY2FjaGUuc2F2ZV9tZXJnZShkKQorCitMb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlckNsYXNzKCkKK2NsYXNzIEJ1ZmZlcmVkTG9nZ2VyKExvZ2dlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGxldmVsPTAsIHRhcmdldD1Ob25lKToKKyAgICAgICAgTG9nZ2VyLl9faW5pdF9fKHNlbGYsIG5hbWUpCisgICAgICAgIHNlbGYuc2V0TGV2ZWwobGV2ZWwpCisgICAgICAgIHNlbGYuYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi50YXJnZXQgPSB0YXJnZXQKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKHJlY29yZCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgZm9yIHJlY29yZCBpbiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYudGFyZ2V0LmhhbmRsZShyZWNvcmQpCisgICAgICAgIHNlbGYuYnVmZmVyID0gW10KKworY2xhc3MgUHl0aG9uUGFyc2VyKCk6CisgICAgZ2V0dmFycyA9ICgiLmdldFZhciIsICIuYXBwZW5kVmFyIiwgIi5wcmVwZW5kVmFyIikKKyAgICBjb250YWluc2Z1bmNzID0gKCJiYi51dGlscy5jb250YWlucyIsICJiYXNlX2NvbnRhaW5zIiwgImJiLnV0aWxzLmNvbnRhaW5zX2FueSIpCisgICAgZXhlY2Z1bmNzID0gKCJiYi5idWlsZC5leGVjX2Z1bmMiLCAiYmIuYnVpbGQuZXhlY190YXNrIikKKworICAgIGRlZiB3YXJuKHNlbGYsIGZ1bmMsIGFyZyk6CisgICAgICAgICIiIldhcm4gYWJvdXQgY2FsbHMgb2YgYml0YmFrZSBBUElzIHdoaWNoIHBhc3MgYSBub24tbGl0ZXJhbAorICAgICAgICBhcmd1bWVudCBmb3IgdGhlIHZhcmlhYmxlIG5hbWUsIGFzIHdlJ3JlIG5vdCBhYmxlIHRvIHRyYWNrIHN1Y2gKKyAgICAgICAgYSByZWZlcmVuY2UuCisgICAgICAgICIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmNzdHIgPSBjb2RlZ2VuLnRvX3NvdXJjZShmdW5jKQorICAgICAgICAgICAgYXJnc3RyID0gY29kZWdlbi50b19zb3VyY2UoYXJnKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgc2VsZi5sb2cuZGVidWcoMiwgJ0ZhaWxlZCB0byBjb252ZXJ0IGZ1bmN0aW9uIGFuZCBhcmd1bWVudCB0byBzb3VyY2UgZm9ybScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZy5kZWJ1ZygxLCBzZWxmLnVuaGFuZGxlZF9tZXNzYWdlICUgKGZ1bmNzdHIsIGFyZ3N0cikpCisKKyAgICBkZWYgdmlzaXRfQ2FsbChzZWxmLCBub2RlKToKKyAgICAgICAgbmFtZSA9IHNlbGYuY2FsbGVkX25vZGVfbmFtZShub2RlLmZ1bmMpCisgICAgICAgIGlmIG5hbWUgYW5kIG5hbWUuZW5kc3dpdGgoc2VsZi5nZXR2YXJzKSBvciBuYW1lIGluIHNlbGYuY29udGFpbnNmdW5jczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5hcmdzWzBdLCBhc3QuU3RyKToKKyAgICAgICAgICAgICAgICB2YXJuYW1lID0gbm9kZS5hcmdzWzBdLnMKKyAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuY29udGFpbnNmdW5jcyBhbmQgaXNpbnN0YW5jZShub2RlLmFyZ3NbMV0sIGFzdC5TdHIpOgorICAgICAgICAgICAgICAgICAgICBpZiB2YXJuYW1lIG5vdCBpbiBzZWxmLmNvbnRhaW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250YWluc1t2YXJuYW1lXSA9IHNldCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbnNbdmFybmFtZV0uYWRkKG5vZGUuYXJnc1sxXS5zKQorICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZmVyZW5jZXMuYWRkKG5vZGUuYXJnc1swXS5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndhcm4obm9kZS5mdW5jLCBub2RlLmFyZ3NbMF0pCisgICAgICAgIGVsaWYgbmFtZSBpbiBzZWxmLmV4ZWNmdW5jczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5hcmdzWzBdLCBhc3QuU3RyKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhcl9leGVjcy5hZGQobm9kZS5hcmdzWzBdLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud2Fybihub2RlLmZ1bmMsIG5vZGUuYXJnc1swXSkKKyAgICAgICAgZWxpZiBuYW1lIGFuZCBpc2luc3RhbmNlKG5vZGUuZnVuYywgKGFzdC5OYW1lLCBhc3QuQXR0cmlidXRlKSk6CisgICAgICAgICAgICBzZWxmLmV4ZWNzLmFkZChuYW1lKQorCisgICAgZGVmIGNhbGxlZF9ub2RlX25hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkdpdmVuIGEgY2FsbGVkIG5vZGUsIHJldHVybiBpdHMgb3JpZ2luYWwgc3RyaW5nIGZvcm0iIiIKKyAgICAgICAgY29tcG9uZW50cyA9IFtdCisgICAgICAgIHdoaWxlIG5vZGU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdC5BdHRyaWJ1dGUpOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXBwZW5kKG5vZGUuYXR0cikKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS52YWx1ZQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIGFzdC5OYW1lKToKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFwcGVuZChub2RlLmlkKQorICAgICAgICAgICAgICAgIHJldHVybiAnLicuam9pbihyZXZlcnNlZChjb21wb25lbnRzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBsb2cpOgorICAgICAgICBzZWxmLnZhcl9leGVjcyA9IHNldCgpCisgICAgICAgIHNlbGYuY29udGFpbnMgPSB7fQorICAgICAgICBzZWxmLmV4ZWNzID0gc2V0KCkKKyAgICAgICAgc2VsZi5yZWZlcmVuY2VzID0gc2V0KCkKKyAgICAgICAgc2VsZi5sb2cgPSBCdWZmZXJlZExvZ2dlcignQml0QmFrZS5EYXRhLlB5dGhvblBhcnNlcicsIGxvZ2dpbmcuREVCVUcsIGxvZykKKworICAgICAgICBzZWxmLnVuaGFuZGxlZF9tZXNzYWdlID0gImluIGNhbGwgb2YgJXMsIGFyZ3VtZW50ICclcycgaXMgbm90IGEgc3RyaW5nIGxpdGVyYWwiCisgICAgICAgIHNlbGYudW5oYW5kbGVkX21lc3NhZ2UgPSAid2hpbGUgcGFyc2luZyAlcywgJXMiICUgKG5hbWUsIHNlbGYudW5oYW5kbGVkX21lc3NhZ2UpCisKKyAgICBkZWYgcGFyc2VfcHl0aG9uKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgbm9kZSBvciBub3Qgbm9kZS5zdHJpcCgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaCA9IGhhc2goc3RyKG5vZGUpKQorCisgICAgICAgIGlmIGggaW4gY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlOgorICAgICAgICAgICAgc2VsZi5yZWZlcmVuY2VzID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZVtoXS5yZWZzKQorICAgICAgICAgICAgc2VsZi5leGVjcyA9IHNldChjb2RlcGFyc2VyY2FjaGUucHl0aG9uY2FjaGVbaF0uZXhlY3MpCisgICAgICAgICAgICBzZWxmLmNvbnRhaW5zID0ge30KKyAgICAgICAgICAgIGZvciBpIGluIGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZVtoXS5jb250YWluczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5zW2ldID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZVtoXS5jb250YWluc1tpXSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGggaW4gY29kZXBhcnNlcmNhY2hlLnB5dGhvbmNhY2hlZXh0cmFzOgorICAgICAgICAgICAgc2VsZi5yZWZlcmVuY2VzID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZWV4dHJhc1toXS5yZWZzKQorICAgICAgICAgICAgc2VsZi5leGVjcyA9IHNldChjb2RlcGFyc2VyY2FjaGUucHl0aG9uY2FjaGVleHRyYXNbaF0uZXhlY3MpCisgICAgICAgICAgICBzZWxmLmNvbnRhaW5zID0ge30KKyAgICAgICAgICAgIGZvciBpIGluIGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZWV4dHJhc1toXS5jb250YWluczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5zW2ldID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZWV4dHJhc1toXS5jb250YWluc1tpXSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNvZGUgPSBjb21waWxlKGNoZWNrX2luZGVudChzdHIobm9kZSkpLCAiPHN0cmluZz4iLCAiZXhlYyIsCisgICAgICAgICAgICAgICAgICAgICAgIGFzdC5QeUNGX09OTFlfQVNUKQorCisgICAgICAgIGZvciBuIGluIGFzdC53YWxrKGNvZGUpOgorICAgICAgICAgICAgaWYgbi5fX2NsYXNzX18uX19uYW1lX18gPT0gIkNhbGwiOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXRfQ2FsbChuKQorCisgICAgICAgIHNlbGYuZXhlY3MudXBkYXRlKHNlbGYudmFyX2V4ZWNzKQorCisgICAgICAgIGNvZGVwYXJzZXJjYWNoZS5weXRob25jYWNoZWV4dHJhc1toXSA9IGNvZGVwYXJzZXJjYWNoZS5uZXdQeXRob25DYWNoZUxpbmUoc2VsZi5yZWZlcmVuY2VzLCBzZWxmLmV4ZWNzLCBzZWxmLmNvbnRhaW5zKQorCitjbGFzcyBTaGVsbFBhcnNlcigpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBsb2cpOgorICAgICAgICBzZWxmLmZ1bmNkZWZzID0gc2V0KCkKKyAgICAgICAgc2VsZi5hbGxleGVjcyA9IHNldCgpCisgICAgICAgIHNlbGYuZXhlY3MgPSBzZXQoKQorICAgICAgICBzZWxmLmxvZyA9IEJ1ZmZlcmVkTG9nZ2VyKCdCaXRCYWtlLkRhdGEuJXMnICUgbmFtZSwgbG9nZ2luZy5ERUJVRywgbG9nKQorICAgICAgICBzZWxmLnVuaGFuZGxlZF90ZW1wbGF0ZSA9ICJ1bmFibGUgdG8gaGFuZGxlIG5vbi1saXRlcmFsIGNvbW1hbmQgJyVzJyIKKyAgICAgICAgc2VsZi51bmhhbmRsZWRfdGVtcGxhdGUgPSAid2hpbGUgcGFyc2luZyAlcywgJXMiICUgKG5hbWUsIHNlbGYudW5oYW5kbGVkX3RlbXBsYXRlKQorCisgICAgZGVmIHBhcnNlX3NoZWxsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIHN1cHBsaWVkIHNoZWxsIGNvZGUgaW4gYSBzdHJpbmcsIHJldHVybmluZyB0aGUgZXh0ZXJuYWwKKyAgICAgICAgY29tbWFuZHMgaXQgZXhlY3V0ZXMuCisgICAgICAgICIiIgorCisgICAgICAgIGggPSBoYXNoKHN0cih2YWx1ZSkpCisKKyAgICAgICAgaWYgaCBpbiBjb2RlcGFyc2VyY2FjaGUuc2hlbGxjYWNoZToKKyAgICAgICAgICAgIHNlbGYuZXhlY3MgPSBzZXQoY29kZXBhcnNlcmNhY2hlLnNoZWxsY2FjaGVbaF0uZXhlY3MpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5leGVjcworCisgICAgICAgIGlmIGggaW4gY29kZXBhcnNlcmNhY2hlLnNoZWxsY2FjaGVleHRyYXM6CisgICAgICAgICAgICBzZWxmLmV4ZWNzID0gc2V0KGNvZGVwYXJzZXJjYWNoZS5zaGVsbGNhY2hlZXh0cmFzW2hdLmV4ZWNzKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhlY3MKKworICAgICAgICBzZWxmLl9wYXJzZV9zaGVsbCh2YWx1ZSkKKyAgICAgICAgc2VsZi5leGVjcyA9IHNldChjbWQgZm9yIGNtZCBpbiBzZWxmLmFsbGV4ZWNzIGlmIGNtZCBub3QgaW4gc2VsZi5mdW5jZGVmcykKKworICAgICAgICBjb2RlcGFyc2VyY2FjaGUuc2hlbGxjYWNoZWV4dHJhc1toXSA9IGNvZGVwYXJzZXJjYWNoZS5uZXdTaGVsbENhY2hlTGluZShzZWxmLmV4ZWNzKQorCisgICAgICAgIHJldHVybiBzZWxmLmV4ZWNzCisKKyAgICBkZWYgX3BhcnNlX3NoZWxsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9rZW5zLCBfID0gcHlzaHlhY2MucGFyc2UodmFsdWUsIGVvZj1UcnVlLCBkZWJ1Zz1GYWxzZSkKKyAgICAgICAgZXhjZXB0IHB5c2hsZXguTmVlZE1vcmU6CisgICAgICAgICAgICByYWlzZSBzaGVycm9ycy5TaGVsbFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIEVPRiIpCisKKyAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc190b2tlbnModG9rZW4pCisKKyAgICBkZWYgcHJvY2Vzc190b2tlbnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIHN1cHBsaWVkIHBvcnRpb24gb2YgdGhlIHN5bnRheCB0cmVlIGFzIHJldHVybmVkIGJ5CisgICAgICAgIHB5c2h5YWNjLnBhcnNlLgorICAgICAgICAiIiIKKworICAgICAgICBkZWYgZnVuY3Rpb25fZGVmaW5pdGlvbih2YWx1ZSk6CisgICAgICAgICAgICBzZWxmLmZ1bmNkZWZzLmFkZCh2YWx1ZS5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZS5ib2R5XSwgTm9uZQorCisgICAgICAgIGRlZiBjYXNlX2NsYXVzZSh2YWx1ZSk6CisgICAgICAgICAgICAjIEVsZW1lbnQgMCBvZiBlYWNoIGl0ZW0gaW4gdGhlIGNhc2UgaXMgdGhlIGxpc3Qgb2YgcGF0dGVybnMsIGFuZAorICAgICAgICAgICAgIyBFbGVtZW50IDEgb2YgZWFjaCBpdGVtIGluIHRoZSBjYXNlIGlzIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGJlCisgICAgICAgICAgICAjIGV4ZWN1dGVkIHdoZW4gdGhhdCBwYXR0ZXJuIG1hdGNoZXMuCisgICAgICAgICAgICB3b3JkcyA9IGNoYWluKCpbaXRlbVswXSBmb3IgaXRlbSBpbiB2YWx1ZS5pdGVtc10pCisgICAgICAgICAgICBjbWRzICA9IGNoYWluKCpbaXRlbVsxXSBmb3IgaXRlbSBpbiB2YWx1ZS5pdGVtc10pCisgICAgICAgICAgICByZXR1cm4gY21kcywgd29yZHMKKworICAgICAgICBkZWYgaWZfY2xhdXNlKHZhbHVlKToKKyAgICAgICAgICAgIG1haW4gPSBjaGFpbih2YWx1ZS5jb25kLCB2YWx1ZS5pZl9jbWRzKQorICAgICAgICAgICAgcmVzdCA9IHZhbHVlLmVsc2VfY21kcworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN0LCB0dXBsZSkgYW5kIHJlc3RbMF0gPT0gImVsaWYiOgorICAgICAgICAgICAgICAgIHJldHVybiBjaGFpbihtYWluLCBpZl9jbGF1c2UocmVzdFsxXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaGFpbihtYWluLCByZXN0KQorCisgICAgICAgIGRlZiBzaW1wbGVfY29tbWFuZCh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgY2hhaW4odmFsdWUud29yZHMsIChhc3NpZ25bMV0gZm9yIGFzc2lnbiBpbiB2YWx1ZS5hc3NpZ25zKSkKKworICAgICAgICB0b2tlbl9oYW5kbGVycyA9IHsKKyAgICAgICAgICAgICJhbmRfb3IiOiBsYW1iZGEgeDogKCh4LmxlZnQsIHgucmlnaHQpLCBOb25lKSwKKyAgICAgICAgICAgICJhc3luYyI6IGxhbWJkYSB4OiAoW3hdLCBOb25lKSwKKyAgICAgICAgICAgICJicmFjZV9ncm91cCI6IGxhbWJkYSB4OiAoeC5jbWRzLCBOb25lKSwKKyAgICAgICAgICAgICJmb3JfY2xhdXNlIjogbGFtYmRhIHg6ICh4LmNtZHMsIHguaXRlbXMpLAorICAgICAgICAgICAgImZ1bmN0aW9uX2RlZmluaXRpb24iOiBmdW5jdGlvbl9kZWZpbml0aW9uLAorICAgICAgICAgICAgImlmX2NsYXVzZSI6IGxhbWJkYSB4OiAoaWZfY2xhdXNlKHgpLCBOb25lKSwKKyAgICAgICAgICAgICJwaXBlbGluZSI6IGxhbWJkYSB4OiAoeC5jb21tYW5kcywgTm9uZSksCisgICAgICAgICAgICAicmVkaXJlY3RfbGlzdCI6IGxhbWJkYSB4OiAoW3guY21kXSwgTm9uZSksCisgICAgICAgICAgICAic3Vic2hlbGwiOiBsYW1iZGEgeDogKHguY21kcywgTm9uZSksCisgICAgICAgICAgICAid2hpbGVfY2xhdXNlIjogbGFtYmRhIHg6IChjaGFpbih4LmNvbmRpdGlvbiwgeC5jbWRzKSwgTm9uZSksCisgICAgICAgICAgICAidW50aWxfY2xhdXNlIjogbGFtYmRhIHg6IChjaGFpbih4LmNvbmRpdGlvbiwgeC5jbWRzKSwgTm9uZSksCisgICAgICAgICAgICAic2ltcGxlX2NvbW1hbmQiOiBzaW1wbGVfY29tbWFuZCwKKyAgICAgICAgICAgICJjYXNlX2NsYXVzZSI6IGNhc2VfY2xhdXNlLAorICAgICAgICB9CisKKyAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoKKyAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gdG9rZW4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb3JlX3Rva2Vucywgd29yZHMgPSB0b2tlbl9oYW5kbGVyc1tuYW1lXSh2YWx1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJVbnN1cHBvcnRlZCB0b2tlbiB0eXBlICIgKyBuYW1lKQorCisgICAgICAgICAgICBpZiBtb3JlX3Rva2VuczoKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfdG9rZW5zKG1vcmVfdG9rZW5zKQorCisgICAgICAgICAgICBpZiB3b3JkczoKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nfd29yZHMod29yZHMpCisKKyAgICBkZWYgcHJvY2Vzc193b3JkcyhzZWxmLCB3b3Jkcyk6CisgICAgICAgICIiIlByb2Nlc3MgYSBzZXQgb2YgJ3dvcmRzJyBpbiBweXNoeWFjYyBwYXJsYW5jZSwgd2hpY2ggaW5jbHVkZXMKKyAgICAgICAgZXh0cmFjdGlvbiBvZiBleGVjdXRlZCBjb21tYW5kcyBmcm9tICQoKSBibG9ja3MsIGFzIHdlbGwgYXMgZ3JhYmJpbmcKKyAgICAgICAgdGhlIGNvbW1hbmQgbmFtZSBhcmd1bWVudC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgd29yZHMgPSBsaXN0KHdvcmRzKQorICAgICAgICBmb3Igd29yZCBpbiBsaXN0KHdvcmRzKToKKyAgICAgICAgICAgIHd0cmVlID0gcHlzaGxleC5tYWtlX3dvcmR0cmVlKHdvcmRbMV0pCisgICAgICAgICAgICBmb3IgcGFydCBpbiB3dHJlZToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXJ0LCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHBhcnRbMF0gaW4gKCdgJywgJyQoJyk6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBweXNobGV4LndvcmR0cmVlX2FzX3N0cmluZyhwYXJ0WzE6LTFdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZV9zaGVsbChjb21tYW5kKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHdvcmRbMF0gaW4gKCJjbWRfbmFtZSIsICJjbWRfd29yZCIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgd29yZCBpbiB3b3JkczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jkcy5yZW1vdmUod29yZCkKKworICAgICAgICB1c2V0b2tlbiA9IEZhbHNlCisgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgaWYgd29yZFswXSBpbiAoImNtZF9uYW1lIiwgImNtZF93b3JkIikgb3IgXAorICAgICAgICAgICAgICAgKHVzZXRva2VuIGFuZCB3b3JkWzBdID09ICJUT0tFTiIpOgorICAgICAgICAgICAgICAgIGlmICI9IiBpbiB3b3JkWzFdOgorICAgICAgICAgICAgICAgICAgICB1c2V0b2tlbiA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGNtZCA9IHdvcmRbMV0KKyAgICAgICAgICAgICAgICBpZiBjbWQuc3RhcnRzd2l0aCgiJCIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5kZWJ1ZygxLCBzZWxmLnVuaGFuZGxlZF90ZW1wbGF0ZSAlIGNtZCkKKyAgICAgICAgICAgICAgICBlbGlmIGNtZCA9PSAiZXZhbCI6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAiICIuam9pbih3b3JkIGZvciBfLCB3b3JkIGluIHdvcmRzWzE6XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2Vfc2hlbGwoY29tbWFuZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbGV4ZWNzLmFkZChjbWQpCisgICAgICAgICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2NvbW1hbmQucHkgYi9iaXRiYWtlL2xpYi9iYi9jb21tYW5kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OGMxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9jb21tYW5kLnB5CkBAIC0wLDAgKzEsNDYzIEBACisiIiIKK0JpdEJha2UgJ0NvbW1hbmQnIG1vZHVsZQorCitQcm92aWRlIGFuIGludGVyZmFjZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBiaXRiYWtlIHNlcnZlciB0aHJvdWdoICdjb21tYW5kcycKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIiIiCitUaGUgYml0YmFrZSBzZXJ2ZXIgdGFrZXMgJ2NvbW1hbmRzJyBmcm9tIGl0cyBVSS9jb21tYW5kbGluZS4KK0NvbW1hbmRzIGFyZSBlaXRoZXIgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzLgorQXN5bmMgY29tbWFuZHMgcmV0dXJuIGRhdGEgdG8gdGhlIGNsaWVudCBpbiB0aGUgZm9ybSBvZiBldmVudHMuCitTeW5jIGNvbW1hbmRzIG11c3Qgb25seSByZXR1cm4gZGF0YSB0aHJvdWdoIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUKK2FuZCBtdXN0IG5vdCB0cmlnZ2VyIGV2ZW50cywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KK0NvbW1hbmRzIGFyZSBxdWV1ZWQgaW4gYSBDb21tYW5kUXVldWUKKyIiIgorCitpbXBvcnQgYmIuZXZlbnQKK2ltcG9ydCBiYi5jb29rZXIKKworY2xhc3MgQ29tbWFuZENvbXBsZXRlZChiYi5ldmVudC5FdmVudCk6CisgICAgcGFzcworCitjbGFzcyBDb21tYW5kRXhpdChiYi5ldmVudC5FdmVudCk6CisgICAgZGVmICBfX2luaXRfXyhzZWxmLCBleGl0Y29kZSk6CisgICAgICAgIGJiLmV2ZW50LkV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuZXhpdGNvZGUgPSBpbnQoZXhpdGNvZGUpCisKK2NsYXNzIENvbW1hbmRGYWlsZWQoQ29tbWFuZEV4aXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5lcnJvciA9IG1lc3NhZ2UKKyAgICAgICAgQ29tbWFuZEV4aXQuX19pbml0X18oc2VsZiwgMSkKKworY2xhc3MgQ29tbWFuZEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBDb21tYW5kOgorICAgICIiIgorICAgIEEgcXVldWUgb2YgYXN5bmNocm9ub3VzIGNvbW1hbmRzIGZvciBiaXRiYWtlCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvb2tlcik6CisgICAgICAgIHNlbGYuY29va2VyID0gY29va2VyCisgICAgICAgIHNlbGYuY21kc19zeW5jID0gQ29tbWFuZHNTeW5jKCkKKyAgICAgICAgc2VsZi5jbWRzX2FzeW5jID0gQ29tbWFuZHNBc3luYygpCisKKyAgICAgICAgIyBGSVhNRSBBZGQgbG9jayBmb3IgdGhpcworICAgICAgICBzZWxmLmN1cnJlbnRBc3luY0NvbW1hbmQgPSBOb25lCisKKyAgICBkZWYgcnVuQ29tbWFuZChzZWxmLCBjb21tYW5kbGluZSwgcm9fb25seSA9IEZhbHNlKToKKyAgICAgICAgY29tbWFuZCA9IGNvbW1hbmRsaW5lLnBvcCgwKQorICAgICAgICBpZiBoYXNhdHRyKENvbW1hbmRzU3luYywgY29tbWFuZCk6CisgICAgICAgICAgICAjIENhbiBydW4gc3luY2hyb25vdXMgY29tbWFuZHMgc3RyYWlnaHQgYXdheQorICAgICAgICAgICAgY29tbWFuZF9tZXRob2QgPSBnZXRhdHRyKHNlbGYuY21kc19zeW5jLCBjb21tYW5kKQorICAgICAgICAgICAgaWYgcm9fb25seToKKyAgICAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjb21tYW5kX21ldGhvZCwgJ3JlYWRvbmx5Jykgb3IgRmFsc2UgPT0gZ2V0YXR0cihjb21tYW5kX21ldGhvZCwgJ3JlYWRvbmx5Jyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCAiTm90IGFibGUgdG8gZXhlY3V0ZSBub3QgcmVhZG9ubHkgY29tbWFuZHMgaW4gcmVhZG9ubHkgbW9kZSIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKGNvbW1hbmRfbWV0aG9kLCAnbmVlZGNvbmZpZycsIEZhbHNlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29rZXIudXBkYXRlQ2FjaGVTeW5jKCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb21tYW5kX21ldGhvZChzZWxmLCBjb21tYW5kbGluZSkKKyAgICAgICAgICAgIGV4Y2VwdCBDb21tYW5kRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBleGMuYXJnc1swXQorICAgICAgICAgICAgZXhjZXB0IChFeGNlcHRpb24sIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZSwgdHJhY2ViYWNrLmZvcm1hdF9leGMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LCBOb25lCisgICAgICAgIGlmIHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCAiQnVzeSAoJXMgaW4gcHJvZ3Jlc3MpIiAlIHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZFswXQorICAgICAgICBpZiBjb21tYW5kIG5vdCBpbiBDb21tYW5kc0FzeW5jLl9fZGljdF9fOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsICJObyBzdWNoIGNvbW1hbmQiCisgICAgICAgIHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZCA9IChjb21tYW5kLCBjb21tYW5kbGluZSkKKyAgICAgICAgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5zZXJ2ZXJfcmVnaXN0ZXJfaWRsZWNhbGxiYWNrKHNlbGYuY29va2VyLnJ1bkNvbW1hbmRzLCBzZWxmLmNvb2tlcikKKyAgICAgICAgcmV0dXJuIFRydWUsIE5vbmUKKworICAgIGRlZiBydW5Bc3luY0NvbW1hbmQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuY29va2VyLnN0YXRlIGluIChiYi5jb29rZXIuc3RhdGUuZXJyb3IsIGJiLmNvb2tlci5zdGF0ZS5zaHV0ZG93biwgYmIuY29va2VyLnN0YXRlLmZvcmNlc2h1dGRvd24pOgorICAgICAgICAgICAgICAgICMgdXBkYXRlQ2FjaGUgd2lsbCB0cmlnZ2VyIGEgc2h1dGRvd24gb2YgdGhlIHBhcnNlcgorICAgICAgICAgICAgICAgICMgYW5kIHRoZW4gcmFpc2UgQkJIYW5kbGVkRXhjZXB0aW9uIHRyaWdnZXJpbmcgYW4gZXhpdAorICAgICAgICAgICAgICAgIHNlbGYuY29va2VyLnVwZGF0ZUNhY2hlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAoY29tbWFuZCwgb3B0aW9ucykgPSBzZWxmLmN1cnJlbnRBc3luY0NvbW1hbmQKKyAgICAgICAgICAgICAgICBjb21tYW5kbWV0aG9kID0gZ2V0YXR0cihDb21tYW5kc0FzeW5jLCBjb21tYW5kKQorICAgICAgICAgICAgICAgIG5lZWRjYWNoZSA9IGdldGF0dHIoIGNvbW1hbmRtZXRob2QsICJuZWVkY2FjaGUiICkKKyAgICAgICAgICAgICAgICBpZiBuZWVkY2FjaGUgYW5kIHNlbGYuY29va2VyLnN0YXRlICE9IGJiLmNvb2tlci5zdGF0ZS5ydW5uaW5nOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvb2tlci51cGRhdGVDYWNoZSgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZG1ldGhvZChzZWxmLmNtZHNfYXN5bmMsIHNlbGYsIG9wdGlvbnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0IGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZmluaXNoQXN5bmNDb21tYW5kKCJJbnRlcnJ1cHRlZCIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgZXhjOgorICAgICAgICAgICAgYXJnID0gZXhjLmFyZ3NbMF0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaEFzeW5jQ29tbWFuZChhcmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoQXN5bmNDb21tYW5kKCJFeGl0ZWQgd2l0aCAlcyIgJSBhcmcpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4YywgYmIuQkJIYW5kbGVkRXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaEFzeW5jQ29tbWFuZCgiIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hBc3luY0NvbW1hbmQodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGZpbmlzaEFzeW5jQ29tbWFuZChzZWxmLCBtc2c9Tm9uZSwgY29kZT1Ob25lKToKKyAgICAgICAgaWYgbXNnIG9yIG1zZyA9PSAiIjoKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoQ29tbWFuZEZhaWxlZChtc2cpLCBzZWxmLmNvb2tlci5leHBhbmRlZF9kYXRhKQorICAgICAgICBlbGlmIGNvZGU6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKENvbW1hbmRFeGl0KGNvZGUpLCBzZWxmLmNvb2tlci5leHBhbmRlZF9kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShDb21tYW5kQ29tcGxldGVkKCksIHNlbGYuY29va2VyLmV4cGFuZGVkX2RhdGEpCisgICAgICAgIHNlbGYuY3VycmVudEFzeW5jQ29tbWFuZCA9IE5vbmUKKyAgICAgICAgc2VsZi5jb29rZXIuZmluaXNoY29tbWFuZCgpCisKK2NsYXNzIENvbW1hbmRzU3luYzoKKyAgICAiIiIKKyAgICBBIGNsYXNzIG9mIHN5bmNocm9ub3VzIGNvbW1hbmRzCisgICAgVGhlc2Ugc2hvdWxkIHJ1biBxdWlja2x5IHNvIGFzIG5vdCB0byBodXJ0IGludGVyYWN0aXZlIHBlcmZvcm1hbmNlLgorICAgIFRoZXNlIG11c3Qgbm90IGluZmx1ZW5jZSBhbnkgcnVubmluZyBzeW5jaHJvbm91cyBjb21tYW5kLgorICAgICIiIgorCisgICAgZGVmIHN0YXRlU2h1dGRvd24oc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFRyaWdnZXIgY29va2VyICdzaHV0ZG93bicgbW9kZQorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZC5jb29rZXIuc2h1dGRvd24oRmFsc2UpCisKKyAgICBkZWYgc3RhdGVGb3JjZVNodXRkb3duKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBTdG9wIHRoZSBjb29rZXIKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmQuY29va2VyLnNodXRkb3duKFRydWUpCisKKyAgICBkZWYgZ2V0QWxsS2V5c1dpdGhGbGFncyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGR1bXAgb2YgdGhlIGdsb2JhbCBzdGF0ZS4gQ2FsbCB3aXRoCisgICAgICAgIHZhcmlhYmxlIGZsYWdzIHRvIGJlIHJldHJpZXZlZCBhcyBwYXJhbXMuCisgICAgICAgICIiIgorICAgICAgICBmbGFnbGlzdCA9IHBhcmFtc1swXQorICAgICAgICByZXR1cm4gY29tbWFuZC5jb29rZXIuZ2V0QWxsS2V5c1dpdGhGbGFncyhmbGFnbGlzdCkKKyAgICBnZXRBbGxLZXlzV2l0aEZsYWdzLnJlYWRvbmx5ID0gVHJ1ZQorCisgICAgZGVmIGdldFZhcmlhYmxlKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBSZWFkIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIGZyb20gZGF0YQorICAgICAgICAiIiIKKyAgICAgICAgdmFybmFtZSA9IHBhcmFtc1swXQorICAgICAgICBleHBhbmQgPSBUcnVlCisgICAgICAgIGlmIGxlbihwYXJhbXMpID4gMToKKyAgICAgICAgICAgIGV4cGFuZCA9IChwYXJhbXNbMV0gPT0gIlRydWUiKQorCisgICAgICAgIHJldHVybiBjb21tYW5kLmNvb2tlci5kYXRhLmdldFZhcih2YXJuYW1lLCBleHBhbmQpCisgICAgZ2V0VmFyaWFibGUucmVhZG9ubHkgPSBUcnVlCisKKyAgICBkZWYgc2V0VmFyaWFibGUoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFNldCB0aGUgdmFsdWUgb2YgdmFyaWFibGUgaW4gZGF0YQorICAgICAgICAiIiIKKyAgICAgICAgdmFybmFtZSA9IHBhcmFtc1swXQorICAgICAgICB2YWx1ZSA9IHN0cihwYXJhbXNbMV0pCisgICAgICAgIGNvbW1hbmQuY29va2VyLmRhdGEuc2V0VmFyKHZhcm5hbWUsIHZhbHVlKQorCisgICAgZGVmIHNldENvbmZpZyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSB2YWx1ZSBvZiB2YXJpYWJsZSBpbiBjb25maWd1cmF0aW9uCisgICAgICAgICIiIgorICAgICAgICB2YXJuYW1lID0gcGFyYW1zWzBdCisgICAgICAgIHZhbHVlID0gc3RyKHBhcmFtc1sxXSkKKyAgICAgICAgc2V0YXR0cihjb21tYW5kLmNvb2tlci5jb25maWd1cmF0aW9uLCB2YXJuYW1lLCB2YWx1ZSkKKworICAgIGRlZiBlbmFibGVEYXRhVHJhY2tpbmcoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuYWJsZSBoaXN0b3J5IHRyYWNraW5nIGZvciB2YXJpYWJsZXMKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmQuY29va2VyLmVuYWJsZURhdGFUcmFja2luZygpCisKKyAgICBkZWYgZGlzYWJsZURhdGFUcmFja2luZyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgRGlzYWJsZSBoaXN0b3J5IHRyYWNraW5nIGZvciB2YXJpYWJsZXMKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmQuY29va2VyLmRpc2FibGVEYXRhVHJhY2tpbmcoKQorCisgICAgZGVmIHNldFByZVBvc3RDb25mRmlsZXMoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgcHJlZmlsZXMgPSBwYXJhbXNbMF0uc3BsaXQoKQorICAgICAgICBwb3N0ZmlsZXMgPSBwYXJhbXNbMV0uc3BsaXQoKQorICAgICAgICBjb21tYW5kLmNvb2tlci5jb25maWd1cmF0aW9uLnByZWZpbGUgPSBwcmVmaWxlcworICAgICAgICBjb21tYW5kLmNvb2tlci5jb25maWd1cmF0aW9uLnBvc3RmaWxlID0gcG9zdGZpbGVzCisgICAgc2V0UHJlUG9zdENvbmZGaWxlcy5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBnZXRDcHVDb3VudChzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSBDUFUgY291bnQgb24gdGhlIGJpdGJha2Ugc2VydmVyCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gYmIudXRpbHMuY3B1X2NvdW50KCkKKyAgICBnZXRDcHVDb3VudC5yZWFkb25seSA9IFRydWUKKyAgICBnZXRDcHVDb3VudC5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBtYXRjaEZpbGUoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgZk1hdGNoID0gcGFyYW1zWzBdCisgICAgICAgIHJldHVybiBjb21tYW5kLmNvb2tlci5tYXRjaEZpbGUoZk1hdGNoKQorICAgIG1hdGNoRmlsZS5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBnZW5lcmF0ZU5ld0ltYWdlKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgIGltYWdlID0gcGFyYW1zWzBdCisgICAgICAgIGJhc2VfaW1hZ2UgPSBwYXJhbXNbMV0KKyAgICAgICAgcGFja2FnZV9xdWV1ZSA9IHBhcmFtc1syXQorICAgICAgICB0aW1lc3RhbXAgPSBwYXJhbXNbM10KKyAgICAgICAgZGVzY3JpcHRpb24gPSBwYXJhbXNbNF0KKyAgICAgICAgcmV0dXJuIGNvbW1hbmQuY29va2VyLmdlbmVyYXRlTmV3SW1hZ2UoaW1hZ2UsIGJhc2VfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX3F1ZXVlLCB0aW1lc3RhbXAsIGRlc2NyaXB0aW9uKQorCisgICAgZGVmIGVuc3VyZURpcihzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICBkaXJlY3RvcnkgPSBwYXJhbXNbMF0KKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKGRpcmVjdG9yeSkKKyAgICBlbnN1cmVEaXIubmVlZGNvbmZpZyA9IEZhbHNlCisKKyAgICBkZWYgc2V0VmFyRmlsZShzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2F2ZSBhIHZhcmlhYmxlIGluIGEgZmlsZTsgdXNlZCBmb3Igc2F2aW5nIGluIGEgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgICIiIgorICAgICAgICB2YXIgPSBwYXJhbXNbMF0KKyAgICAgICAgdmFsID0gcGFyYW1zWzFdCisgICAgICAgIGRlZmF1bHRfZmlsZSA9IHBhcmFtc1syXQorICAgICAgICBvcCA9IHBhcmFtc1szXQorICAgICAgICBjb21tYW5kLmNvb2tlci5tb2RpZnlDb25maWd1cmF0aW9uVmFyKHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUsIG9wKQorICAgIHNldFZhckZpbGUubmVlZGNvbmZpZyA9IEZhbHNlCisKKyAgICBkZWYgcmVtb3ZlVmFyRmlsZShzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlIGEgdmFyaWFibGUgZGVjbGFyYXRpb24gZnJvbSBhIGZpbGUKKyAgICAgICAgIiIiCisgICAgICAgIHZhciA9IHBhcmFtc1swXQorICAgICAgICBjb21tYW5kLmNvb2tlci5yZW1vdmVDb25maWd1cmF0aW9uVmFyKHZhcikKKyAgICByZW1vdmVWYXJGaWxlLm5lZWRjb25maWcgPSBGYWxzZQorCisgICAgZGVmIGNyZWF0ZUNvbmZpZ0ZpbGUoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhbiBleHRyYSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBwYXJhbXNbMF0KKyAgICAgICAgY29tbWFuZC5jb29rZXIuY3JlYXRlQ29uZmlnRmlsZShuYW1lKQorICAgIGNyZWF0ZUNvbmZpZ0ZpbGUubmVlZGNvbmZpZyA9IEZhbHNlCisKKyAgICBkZWYgc2V0RXZlbnRNYXNrKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgIGhhbmRsZXJOdW0gPSBwYXJhbXNbMF0KKyAgICAgICAgbGxldmVsID0gcGFyYW1zWzFdCisgICAgICAgIGRlYnVnX2RvbWFpbnMgPSBwYXJhbXNbMl0KKyAgICAgICAgbWFzayA9IHBhcmFtc1szXQorICAgICAgICByZXR1cm4gYmIuZXZlbnQuc2V0X1VJSG1hc2soaGFuZGxlck51bSwgbGxldmVsLCBkZWJ1Z19kb21haW5zLCBtYXNrKQorICAgIHNldEV2ZW50TWFzay5uZWVkY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBzZXRGZWF0dXJlcyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSBjb29rZXIgZmVhdHVyZXMgdG8gaW5jbHVkZSB0aGUgcGFzc2VkIGxpc3Qgb2YgZmVhdHVyZXMKKyAgICAgICAgIiIiCisgICAgICAgIGZlYXR1cmVzID0gcGFyYW1zWzBdCisgICAgICAgIGNvbW1hbmQuY29va2VyLnNldEZlYXR1cmVzKGZlYXR1cmVzKQorICAgIHNldEZlYXR1cmVzLm5lZWRjb25maWcgPSBGYWxzZQorICAgICMgYWx0aG91Z2ggd2UgY2hhbmdlIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29va2VyLCB0aGlzIGlzIHRyYW5zcGFyZW50IHNpbmNlCisgICAgIyB3ZSBhbHdheXMgdGFrZSBhbmQgbGVhdmUgdGhlIGNvb2tlciBpbiBzdGF0ZS5pbml0aWFsCisgICAgc2V0RmVhdHVyZXMucmVhZG9ubHkgPSBUcnVlCisKKyAgICBkZWYgdXBkYXRlQ29uZmlnKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgIG9wdGlvbnMgPSBwYXJhbXNbMF0KKyAgICAgICAgZW52aXJvbm1lbnQgPSBwYXJhbXNbMV0KKyAgICAgICAgY29tbWFuZC5jb29rZXIudXBkYXRlQ29uZmlnT3B0cyhvcHRpb25zLCBlbnZpcm9ubWVudCkKKyAgICB1cGRhdGVDb25maWcubmVlZGNvbmZpZyA9IEZhbHNlCisKK2NsYXNzIENvbW1hbmRzQXN5bmM6CisgICAgIiIiCisgICAgQSBjbGFzcyBvZiBhc3luY2hyb25vdXMgY29tbWFuZHMKKyAgICBUaGVzZSBmdW5jdGlvbnMgY29tbXVuaWNhdGUgdmlhIGdlbmVyYXRlZCBldmVudHMuCisgICAgQW55IGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgbWV0YWRhdGEgcGFyc2luZyBzaG91bGQgYmUgaGVyZS4KKyAgICAiIiIKKworICAgIGRlZiBidWlsZEZpbGUoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEJ1aWxkIGEgc2luZ2xlIHNwZWNpZmllZCAuYmIgZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgYmZpbGUgPSBwYXJhbXNbMF0KKyAgICAgICAgdGFzayA9IHBhcmFtc1sxXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLmJ1aWxkRmlsZShiZmlsZSwgdGFzaykKKyAgICBidWlsZEZpbGUubmVlZGNhY2hlID0gRmFsc2UKKworICAgIGRlZiBidWlsZFRhcmdldHMoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEJ1aWxkIGEgc2V0IG9mIHRhcmdldHMKKyAgICAgICAgIiIiCisgICAgICAgIHBrZ3NfdG9fYnVpbGQgPSBwYXJhbXNbMF0KKyAgICAgICAgdGFzayA9IHBhcmFtc1sxXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLmJ1aWxkVGFyZ2V0cyhwa2dzX3RvX2J1aWxkLCB0YXNrKQorICAgIGJ1aWxkVGFyZ2V0cy5uZWVkY2FjaGUgPSBUcnVlCisKKyAgICBkZWYgZ2VuZXJhdGVEZXBUcmVlRXZlbnQoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRlIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIHBrZ3NfdG9fYnVpbGQgPSBwYXJhbXNbMF0KKyAgICAgICAgdGFzayA9IHBhcmFtc1sxXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLmdlbmVyYXRlRGVwVHJlZUV2ZW50KHBrZ3NfdG9fYnVpbGQsIHRhc2spCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBnZW5lcmF0ZURlcFRyZWVFdmVudC5uZWVkY2FjaGUgPSBUcnVlCisKKyAgICBkZWYgZ2VuZXJhdGVEb3RHcmFwaChzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgRHVtcCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHRvIGRpc2sgYXMgLmRvdCBmaWxlcworICAgICAgICAiIiIKKyAgICAgICAgcGtnc190b19idWlsZCA9IHBhcmFtc1swXQorICAgICAgICB0YXNrID0gcGFyYW1zWzFdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZ2VuZXJhdGVEb3RHcmFwaEZpbGVzKHBrZ3NfdG9fYnVpbGQsIHRhc2spCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBnZW5lcmF0ZURvdEdyYXBoLm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiBnZW5lcmF0ZVRhcmdldHNUcmVlKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBHZW5lcmF0ZSBhIHRyZWUgb2YgYnVpbGRhYmxlIHRhcmdldHMuCisgICAgICAgIElmIGtsYXNzIGlzIHByb3ZpZGVkIGVuc3VyZSBhbGwgcmVjaXBlcyB0aGF0IGluaGVyaXQgdGhlIGNsYXNzIGFyZQorICAgICAgICBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZSBsaXN0LgorICAgICAgICBJZiBwa2dfbGlzdCBwcm92aWRlZCB1c2UgdGhhdCBsaXN0IChwbHVzIGFueSBleHRyYXMgYnJvdWdodCBpbiBieQorICAgICAgICBrbGFzcykgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBhIHRyZWUgZm9yIGFsbCBwYWNrYWdlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGtsYXNzID0gcGFyYW1zWzBdCisgICAgICAgIHBrZ19saXN0ID0gcGFyYW1zWzFdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZ2VuZXJhdGVUYXJnZXRzVHJlZShrbGFzcywgcGtnX2xpc3QpCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBnZW5lcmF0ZVRhcmdldHNUcmVlLm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiBmaW5kQ29yZUJhc2VGaWxlcyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCBjZXJ0YWluIGZpbGVzIGluIENPUkVCQVNFIGRpcmVjdG9yeS4gaS5lLiBMYXllcnMKKyAgICAgICAgIiIiCisgICAgICAgIHN1YmRpciA9IHBhcmFtc1swXQorICAgICAgICBmaWxlbmFtZSA9IHBhcmFtc1sxXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLmZpbmRDb3JlQmFzZUZpbGVzKHN1YmRpciwgZmlsZW5hbWUpCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBmaW5kQ29yZUJhc2VGaWxlcy5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIGZpbmRDb25maWdGaWxlcyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCBjb25maWcgZmlsZXMgd2hpY2ggcHJvdmlkZSBhcHByb3ByaWF0ZSB2YWx1ZXMKKyAgICAgICAgZm9yIHRoZSBwYXNzZWQgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4gaS5lLiBNQUNISU5FCisgICAgICAgICIiIgorICAgICAgICB2YXJuYW1lID0gcGFyYW1zWzBdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuZmluZENvbmZpZ0ZpbGVzKHZhcm5hbWUpCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICBmaW5kQ29uZmlnRmlsZXMubmVlZGNhY2hlID0gRmFsc2UKKworICAgIGRlZiBmaW5kRmlsZXNNYXRjaGluZ0luRGlyKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIGltcGxlbWVudGF0aW9uIGZpbGVzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcGF0dGVybgorICAgICAgICBpbiB0aGUgcmVxdWVzdGVkIHN1YmRpcmVjdG9yeSBvZiBhIEJCUEFUSAorICAgICAgICAiIiIKKyAgICAgICAgcGF0dGVybiA9IHBhcmFtc1swXQorICAgICAgICBkaXJlY3RvcnkgPSBwYXJhbXNbMV0KKworICAgICAgICBjb21tYW5kLmNvb2tlci5maW5kRmlsZXNNYXRjaGluZ0luRGlyKHBhdHRlcm4sIGRpcmVjdG9yeSkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGZpbmRGaWxlc01hdGNoaW5nSW5EaXIubmVlZGNhY2hlID0gRmFsc2UKKworICAgIGRlZiBmaW5kQ29uZmlnRmlsZVBhdGgoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgdGhlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgICAgIiIiCisgICAgICAgIGNvbmZpZ2ZpbGUgPSBwYXJhbXNbMF0KKworICAgICAgICBjb21tYW5kLmNvb2tlci5maW5kQ29uZmlnRmlsZVBhdGgoY29uZmlnZmlsZSkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIGZpbmRDb25maWdGaWxlUGF0aC5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIHNob3dWZXJzaW9ucyhzZWxmLCBjb21tYW5kLCBwYXJhbXMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZlcnNpb25zCisgICAgICAgICIiIgorICAgICAgICBjb21tYW5kLmNvb2tlci5zaG93VmVyc2lvbnMoKQorICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgc2hvd1ZlcnNpb25zLm5lZWRjYWNoZSA9IFRydWUKKworICAgIGRlZiBzaG93RW52aXJvbm1lbnRUYXJnZXQoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IHRoZSBlbnZpcm9ubWVudCBvZiBhIHRhcmdldCByZWNpcGUKKyAgICAgICAgKG5lZWRzIHRoZSBjYWNoZSB0byB3b3JrIG91dCB3aGljaCByZWNpcGUgdG8gdXNlKQorICAgICAgICAiIiIKKyAgICAgICAgcGtnID0gcGFyYW1zWzBdCisKKyAgICAgICAgY29tbWFuZC5jb29rZXIuc2hvd0Vudmlyb25tZW50KE5vbmUsIHBrZykKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIHNob3dFbnZpcm9ubWVudFRhcmdldC5uZWVkY2FjaGUgPSBUcnVlCisKKyAgICBkZWYgc2hvd0Vudmlyb25tZW50KHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCB0aGUgc3RhbmRhcmQgZW52aXJvbm1lbnQKKyAgICAgICAgb3IgaWYgc3BlY2lmaWVkIHRoZSBlbnZpcm9ubWVudCBmb3IgYSBzcGVjaWZpZWQgcmVjaXBlCisgICAgICAgICIiIgorICAgICAgICBiZmlsZSA9IHBhcmFtc1swXQorCisgICAgICAgIGNvbW1hbmQuY29va2VyLnNob3dFbnZpcm9ubWVudChiZmlsZSkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIHNob3dFbnZpcm9ubWVudC5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIHBhcnNlRmlsZXMoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFBhcnNlIHRoZSAuYmIgZmlsZXMKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmQuY29va2VyLnVwZGF0ZUNhY2hlKCkKKyAgICAgICAgY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgIHBhcnNlRmlsZXMubmVlZGNhY2hlID0gVHJ1ZQorCisgICAgZGVmIGNvbXBhcmVSZXZpc2lvbnMoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKKyAgICAgICAgIiIiCisgICAgICAgIFBhcnNlIHRoZSAuYmIgZmlsZXMKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGJiLmZldGNoLmZldGNoZXJfY29tcGFyZV9yZXZpc2lvbnMoY29tbWFuZC5jb29rZXIuZGF0YSk6CisgICAgICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZChjb2RlPTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgY29tcGFyZVJldmlzaW9ucy5uZWVkY2FjaGUgPSBUcnVlCisKKyAgICBkZWYgdHJpZ2dlckV2ZW50KHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBUcmlnZ2VyIGEgY2VydGFpbiBldmVudAorICAgICAgICAiIiIKKyAgICAgICAgZXZlbnQgPSBwYXJhbXNbMF0KKyAgICAgICAgYmIuZXZlbnQuZmlyZShldmFsKGV2ZW50KSwgY29tbWFuZC5jb29rZXIuZGF0YSkKKyAgICAgICAgY29tbWFuZC5jdXJyZW50QXN5bmNDb21tYW5kID0gTm9uZQorICAgIHRyaWdnZXJFdmVudC5uZWVkY2FjaGUgPSBGYWxzZQorCisgICAgZGVmIHJlc2V0Q29va2VyKHNlbGYsIGNvbW1hbmQsIHBhcmFtcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXNldCB0aGUgY29va2VyIHRvIGl0cyBpbml0aWFsIHN0YXRlLCB0aHVzIGZvcmNpbmcgYSByZXBhcnNlIGZvcgorICAgICAgICBhbnkgYXN5bmMgY29tbWFuZCB0aGF0IGhhcyB0aGUgbmVlZGNhY2hlIHByb3BlcnR5IHNldCB0byBUcnVlCisgICAgICAgICIiIgorICAgICAgICBjb21tYW5kLmNvb2tlci5yZXNldCgpCisgICAgICAgIGNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKCkKKyAgICByZXNldENvb2tlci5uZWVkY2FjaGUgPSBGYWxzZQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9jb21wYXQucHkgYi9iaXRiYWtlL2xpYi9iYi9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxOTIzZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2NvbXBhdC5weQpAQCAtMCwwICsxLDYgQEAKKyIiIkNvZGUgcHVsbGVkIGZyb20gZnV0dXJlIHB5dGhvbiB2ZXJzaW9ucywgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSIiIgorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNdXRhYmxlTWFwcGluZywgS2V5c1ZpZXcsIFZhbHVlc1ZpZXcsIEl0ZW1zVmlldywgT3JkZXJlZERpY3QKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCB0b3RhbF9vcmRlcmluZworCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2Nvb2tlci5weSBiL2JpdGJha2UvbGliL2JiL2Nvb2tlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ3ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvY29va2VyLnB5CkBAIC0wLDAgKzEsMjEzOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMgQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBNaWNoYWVsICdNaWNrZXknIExhdWVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBST0FEIEdtYkgKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN5cywgb3MsIGdsb2IsIG9zLnBhdGgsIHJlLCB0aW1lCitpbXBvcnQgYXRleGl0CitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IHNyZV9jb25zdGFudHMKK2ltcG9ydCB0aHJlYWRpbmcKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CitpbXBvcnQgYmIsIGJiLmV4Y2VwdGlvbnMsIGJiLmNvbW1hbmQKK2Zyb20gYmIgaW1wb3J0IHV0aWxzLCBkYXRhLCBwYXJzZSwgZXZlbnQsIGNhY2hlLCBwcm92aWRlcnMsIHRhc2tkYXRhLCBydW5xdWV1ZSwgYnVpbGQKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHByc2Vydi5zZXJ2CitpbXBvcnQgcHlpbm90aWZ5CisKK2xvZ2dlciAgICAgID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorY29sbGVjdGxvZyAgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5Db2xsZWN0aW9uIikKK2J1aWxkbG9nICAgID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuQnVpbGQiKQorcGFyc2Vsb2cgICAgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5QYXJzaW5nIikKK3Byb3ZpZGVybG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUHJvdmlkZXIiKQorCitjbGFzcyBOb1NwZWNpZmljTWF0Y2goYmIuQkJIYW5kbGVkRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gbm8gb3IgbXVsdGlwbGUgZmlsZSBtYXRjaGVzIGFyZSBmb3VuZAorICAgICIiIgorCitjbGFzcyBOb3RoaW5nVG9CdWlsZChFeGNlcHRpb24pOgorICAgICIiIgorICAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGJ1aWxkCisgICAgIiIiCisKK2NsYXNzIENvbGxlY3Rpb25FcnJvcihiYi5CQkhhbmRsZWRFeGNlcHRpb24pOgorICAgICIiIgorICAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBsYXllciBjb25maWd1cmF0aW9uIGlzIGluY29ycmVjdAorICAgICIiIgorCitjbGFzcyBzdGF0ZToKKyAgICBpbml0aWFsLCBwYXJzaW5nLCBydW5uaW5nLCBzaHV0ZG93biwgZm9yY2VzaHV0ZG93biwgc3RvcHBlZCwgZXJyb3IgPSByYW5nZSg3KQorCisKK2NsYXNzIFNraXBwZWRQYWNrYWdlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmZvID0gTm9uZSwgcmVhc29uID0gTm9uZSk6CisgICAgICAgIHNlbGYucG4gPSBOb25lCisgICAgICAgIHNlbGYuc2tpcHJlYXNvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5wcm92aWRlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5ycHJvdmlkZXMgPSBOb25lCisKKyAgICAgICAgaWYgaW5mbzoKKyAgICAgICAgICAgIHNlbGYucG4gPSBpbmZvLnBuCisgICAgICAgICAgICBzZWxmLnNraXByZWFzb24gPSBpbmZvLnNraXByZWFzb24KKyAgICAgICAgICAgIHNlbGYucHJvdmlkZXMgPSBpbmZvLnByb3ZpZGVzCisgICAgICAgICAgICBzZWxmLnJwcm92aWRlcyA9IGluZm8ucnByb3ZpZGVzCisgICAgICAgIGVsaWYgcmVhc29uOgorICAgICAgICAgICAgc2VsZi5za2lwcmVhc29uID0gcmVhc29uCisKKworY2xhc3MgQ29va2VyRmVhdHVyZXMob2JqZWN0KToKKyAgICBfZmVhdHVyZV9saXN0ID0gW0hPQl9FWFRSQV9DQUNIRVMsIFNFTkRfREVQRU5EU19UUkVFLCBCQVNFREFUQVNUT1JFX1RSQUNLSU5HLCBTRU5EX1NBTklUWUVWRU5UU10gPSByYW5nZSg0KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9mZWF0dXJlcz1zZXQoKQorCisgICAgZGVmIHNldEZlYXR1cmUoc2VsZiwgZik6CisgICAgICAgICMgdmFsaWRhdGUgd2UgZ290IGEgcmVxdWVzdCBmb3IgYSBmZWF0dXJlIHdlIHN1cHBvcnQKKyAgICAgICAgaWYgZiBub3QgaW4gQ29va2VyRmVhdHVyZXMuX2ZlYXR1cmVfbGlzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9mZWF0dXJlcy5hZGQoZikKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZik6CisgICAgICAgIHJldHVybiBmIGluIHNlbGYuX2ZlYXR1cmVzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9mZWF0dXJlcy5fX2l0ZXJfXygpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZlYXR1cmVzLm5leHQoKQorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IworIyBCQkNvb2tlcgorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jCitjbGFzcyBCQkNvb2tlcjoKKyAgICAiIiIKKyAgICBNYW5hZ2VzIG9uZSBiaXRiYWtlIGJ1aWxkIHJ1bgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZ3VyYXRpb24sIGZlYXR1cmVTZXQ9Tm9uZSk6CisgICAgICAgIHNlbGYucmVjaXBlY2FjaGUgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcGxpc3QgPSB7fQorICAgICAgICBzZWxmLmZlYXR1cmVzZXQgPSBDb29rZXJGZWF0dXJlcygpCisgICAgICAgIGlmIGZlYXR1cmVTZXQ6CisgICAgICAgICAgICBmb3IgZiBpbiBmZWF0dXJlU2V0OgorICAgICAgICAgICAgICAgIHNlbGYuZmVhdHVyZXNldC5zZXRGZWF0dXJlKGYpCisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgorCisgICAgICAgIHNlbGYuY29uZmlnd2F0Y2hlciA9IHB5aW5vdGlmeS5XYXRjaE1hbmFnZXIoKQorICAgICAgICBzZWxmLmNvbmZpZ3dhdGNoZXIuYmJzZWVuID0gW10KKyAgICAgICAgc2VsZi5jb25maWd3YXRjaGVyLmJid2F0Y2hlZGZpbGVzID0gW10KKyAgICAgICAgc2VsZi5jb25maWdub3RpZmllciA9IHB5aW5vdGlmeS5Ob3RpZmllcihzZWxmLmNvbmZpZ3dhdGNoZXIsIHNlbGYuY29uZmlnX25vdGlmaWNhdGlvbnMpCisgICAgICAgIHNlbGYud2F0Y2htYXNrID0gcHlpbm90aWZ5LklOX0NMT1NFX1dSSVRFIHwgcHlpbm90aWZ5LklOX0NSRUFURSB8IHB5aW5vdGlmeS5JTl9ERUxFVEUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHlpbm90aWZ5LklOX0RFTEVURV9TRUxGIHwgcHlpbm90aWZ5LklOX01PRElGWSB8IHB5aW5vdGlmeS5JTl9NT1ZFX1NFTEYgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHlpbm90aWZ5LklOX01PVkVEX0ZST00gfCBweWlub3RpZnkuSU5fTU9WRURfVE8gCisgICAgICAgIHNlbGYud2F0Y2hlciA9IHB5aW5vdGlmeS5XYXRjaE1hbmFnZXIoKQorICAgICAgICBzZWxmLndhdGNoZXIuYmJzZWVuID0gW10KKyAgICAgICAgc2VsZi53YXRjaGVyLmJid2F0Y2hlZGZpbGVzID0gW10KKyAgICAgICAgc2VsZi5ub3RpZmllciA9IHB5aW5vdGlmeS5Ob3RpZmllcihzZWxmLndhdGNoZXIsIHNlbGYubm90aWZpY2F0aW9ucykKKworCisgICAgICAgIHNlbGYuaW5pdENvbmZpZ3VyYXRpb25EYXRhKCkKKworICAgICAgICBzZWxmLmlub3RpZnlfbW9kaWZpZWRfZmlsZXMgPSBbXQorCisgICAgICAgIGRlZiBfcHJvY2Vzc19pbm90aWZ5X3VwZGF0ZXMoc2VydmVyLCBub3RpZmllcl9saXN0LCBhYm9ydCk6CisgICAgICAgICAgICBmb3IgbiBpbiBub3RpZmllcl9saXN0OgorICAgICAgICAgICAgICAgIGlmIG4uY2hlY2tfZXZlbnRzKHRpbWVvdXQ9MCk6CisgICAgICAgICAgICAgICAgICAgICMgcmVhZCBub3RpZmllZCBldmVudHMgYW5kIGVucWV1ZSB0aGVtCisgICAgICAgICAgICAgICAgICAgIG4ucmVhZF9ldmVudHMoKQorICAgICAgICAgICAgICAgICAgICBuLnByb2Nlc3NfZXZlbnRzKCkKKyAgICAgICAgICAgIHJldHVybiAxLjAKKworICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2VydmVyX3JlZ2lzdGVyX2lkbGVjYWxsYmFjayhfcHJvY2Vzc19pbm90aWZ5X3VwZGF0ZXMsIFtzZWxmLmNvbmZpZ25vdGlmaWVyLCBzZWxmLm5vdGlmaWVyXSkKKworICAgICAgICBzZWxmLmJhc2Vjb25maWdfdmFsaWQgPSBUcnVlCisgICAgICAgIHNlbGYucGFyc2VjYWNoZV92YWxpZCA9IEZhbHNlCisKKyAgICAgICAgIyBUYWtlIGEgbG9jayBzbyBvbmx5IG9uZSBjb3B5IG9mIGJpdGJha2UgY2FuIHJ1biBhZ2FpbnN0IGEgZ2l2ZW4gYnVpbGQKKyAgICAgICAgIyBkaXJlY3RvcnkgYXQgYSB0aW1lCisgICAgICAgIGlmIG5vdCBzZWxmLmxvY2tCaXRiYWtlKCk6CisgICAgICAgICAgICBiYi5mYXRhbCgiT25seSBvbmUgY29weSBvZiBiaXRiYWtlIHNob3VsZCBiZSBydW4gYWdhaW5zdCBhIGJ1aWxkIGRpcmVjdG9yeSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubG9jay5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmxvY2sudHJ1bmNhdGUoKQorICAgICAgICAgICAgaWYgbGVuKGNvbmZpZ3VyYXRpb24uaW50ZXJmYWNlKSA+PSAyOgorICAgICAgICAgICAgICAgIHNlbGYubG9jay53cml0ZSgiJXM6JXNcbiIgJSAoY29uZmlndXJhdGlvbi5pbnRlcmZhY2VbMF0sIGNvbmZpZ3VyYXRpb24uaW50ZXJmYWNlWzFdKSk7CisgICAgICAgICAgICBzZWxmLmxvY2suZmx1c2goKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBUT1NUT1AgbXVzdCBub3QgYmUgc2V0IG9yIG91ciBjaGlsZHJlbiB3aWxsIGhhbmcgd2hlbiB0aGV5IG91dHB1dAorICAgICAgICBmZCA9IHN5cy5zdGRvdXQuZmlsZW5vKCkKKyAgICAgICAgaWYgb3MuaXNhdHR5KGZkKToKKyAgICAgICAgICAgIGltcG9ydCB0ZXJtaW9zCisgICAgICAgICAgICB0Y2F0dHIgPSB0ZXJtaW9zLnRjZ2V0YXR0cihmZCkKKyAgICAgICAgICAgIGlmIHRjYXR0clszXSAmIHRlcm1pb3MuVE9TVE9QOgorICAgICAgICAgICAgICAgIGJ1aWxkbG9nLmluZm8oIlRoZSB0ZXJtaW5hbCBoYWQgdGhlIFRPU1RPUCBiaXQgc2V0LCBjbGVhcmluZy4uLiIpCisgICAgICAgICAgICAgICAgdGNhdHRyWzNdID0gdGNhdHRyWzNdICYgfnRlcm1pb3MuVE9TVE9QCisgICAgICAgICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQU5PVywgdGNhdHRyKQorCisgICAgICAgIHNlbGYuY29tbWFuZCA9IGJiLmNvbW1hbmQuQ29tbWFuZChzZWxmKQorICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUuaW5pdGlhbAorCisgICAgICAgIHNlbGYucGFyc2VyID0gTm9uZQorCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sIHNlbGYuc2lndGVybV9leGNlcHRpb24pCisgICAgICAgICMgTGV0IFNJR0hVUCBleGl0IGFzIFNJR1RFUk0KKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzZWxmLnNpZ3Rlcm1fZXhjZXB0aW9uKQorCisgICAgZGVmIGNvbmZpZ19ub3RpZmljYXRpb25zKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IGV2ZW50LnBhdGhuYW1lIGluIHNlbGYuY29uZmlnd2F0Y2hlci5iYndhdGNoZWRmaWxlczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgZXZlbnQucGF0aCBpbiBzZWxmLmlub3RpZnlfbW9kaWZpZWRfZmlsZXM6CisgICAgICAgICAgICBzZWxmLmlub3RpZnlfbW9kaWZpZWRfZmlsZXMuYXBwZW5kKGV2ZW50LnBhdGgpCisgICAgICAgIHNlbGYuYmFzZWNvbmZpZ192YWxpZCA9IEZhbHNlCisKKyAgICBkZWYgbm90aWZpY2F0aW9ucyhzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBldmVudC5wYXRoIGluIHNlbGYuaW5vdGlmeV9tb2RpZmllZF9maWxlczoKKyAgICAgICAgICAgIHNlbGYuaW5vdGlmeV9tb2RpZmllZF9maWxlcy5hcHBlbmQoZXZlbnQucGF0aCkKKyAgICAgICAgc2VsZi5wYXJzZWNhY2hlX3ZhbGlkID0gRmFsc2UKKworICAgIGRlZiBhZGRfZmlsZXdhdGNoKHNlbGYsIGRlcHMsIHdhdGNoZXI9Tm9uZSk6CisgICAgICAgIGlmIG5vdCB3YXRjaGVyOgorICAgICAgICAgICAgd2F0Y2hlciA9IHNlbGYud2F0Y2hlcgorICAgICAgICBmb3IgaSBpbiBkZXBzOgorICAgICAgICAgICAgd2F0Y2hlci5iYndhdGNoZWRmaWxlcy5hcHBlbmQoaVswXSkKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmRpcm5hbWUoaVswXSkKKyAgICAgICAgICAgIGlmIGYgaW4gd2F0Y2hlci5iYnNlZW46CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHdhdGNoZXIuYmJzZWVuLmFwcGVuZChmKQorICAgICAgICAgICAgd2F0Y2h0YXJnZXQgPSBOb25lCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICMgV2UgdHJ5IGFuZCBhZGQgd2F0Y2hlcyBmb3IgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBidXQgaWYgdGhleSBkaWQsIHdvdWxkIGluZmx1ZW5jZQorICAgICAgICAgICAgICAgICMgdGhlIHBhcnNlci4gVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlc2UgZmlsZXMgbWF5IG5vdCBleGlzdCwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIAorICAgICAgICAgICAgICAgICMgdG8gd2F0Y2ggYW55IHBhcmVudCB0aGF0IGRvZXMgZXhpc3QgZm9yIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLmFkZF93YXRjaChmLCBzZWxmLndhdGNobWFzaywgcXVpZXQ9RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIGlmIHdhdGNodGFyZ2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hlci5iYndhdGNoZWRmaWxlcy5hcHBlbmQod2F0Y2h0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IHB5aW5vdGlmeS5XYXRjaE1hbmFnZXJFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiAnRU5PRU5UJyBpbiBzdHIoZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaHRhcmdldCA9IGYKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmRpcm5hbWUoZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgaW4gd2F0Y2hlci5iYnNlZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIuYmJzZWVuLmFwcGVuZChmKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgJ0VOT1NQQycgaW4gc3RyKGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJsb2cuZXJyb3IoIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIG9yIGV4Y2VlZHMgZnMuaW5vdGlmeS5tYXhfdXNlcl93YXRjaGVzPyIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcmxvZy5lcnJvcigiVG8gY2hlY2sgbWF4X3VzZXJfd2F0Y2hlczogc3lzY3RsIC1uIGZzLmlub3RpZnkubWF4X3VzZXJfd2F0Y2hlcy4iKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJsb2cuZXJyb3IoIlRvIG1vZGlmeSBtYXhfdXNlcl93YXRjaGVzOiBzeXNjdGwgLW4gLXcgZnMuaW5vdGlmeS5tYXhfdXNlcl93YXRjaGVzPTx2YWx1ZT4uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVybG9nLmVycm9yKCJSb290IHByaXZpbGVnZSBpcyByZXF1aXJlZCB0byBtb2RpZnkgbWF4X3VzZXJfd2F0Y2hlcy4iKQorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHNpZ3Rlcm1fZXhjZXB0aW9uKHNlbGYsIHNpZ251bSwgc3RhY2tmcmFtZSk6CisgICAgICAgIGlmIHNpZ251bSA9PSBzaWduYWwuU0lHVEVSTToKKyAgICAgICAgICAgIGJiLndhcm4oIkNvb2tlciByZWNpZXZlZCBTSUdURVJNLCBzaHV0dGluZyBkb3duLi4uIikKKyAgICAgICAgZWxpZiBzaWdudW0gPT0gc2lnbmFsLlNJR0hVUDoKKyAgICAgICAgICAgIGJiLndhcm4oIkNvb2tlciByZWNpZXZlZCBTSUdIVVAsIHNodXR0aW5nIGRvd24uLi4iKQorICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUuZm9yY2VzaHV0ZG93bgorCisgICAgZGVmIHNldEZlYXR1cmVzKHNlbGYsIGZlYXR1cmVzKToKKyAgICAgICAgIyB3ZSBvbmx5IGFjY2VwdCBhIG5ldyBmZWF0dXJlIHNldCBpZiB3ZSdyZSBpbiBzdGF0ZSBpbml0aWFsLCBzbyB3ZSBjYW4gcmVzZXQgd2l0aG91dCBwcm9ibGVtcworICAgICAgICBpZiBub3Qgc2VsZi5zdGF0ZSBpbiBbc3RhdGUuaW5pdGlhbCwgc3RhdGUuc2h1dGRvd24sIHN0YXRlLmZvcmNlc2h1dGRvd24sIHN0YXRlLnN0b3BwZWQsIHN0YXRlLmVycm9yXToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiSWxsZWdhbCBzdGF0ZSBmb3IgZmVhdHVyZSBzZXQgY2hhbmdlIikKKyAgICAgICAgb3JpZ2luYWxfZmVhdHVyZXNldCA9IGxpc3Qoc2VsZi5mZWF0dXJlc2V0KQorICAgICAgICBmb3IgZmVhdHVyZSBpbiBmZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuZmVhdHVyZXNldC5zZXRGZWF0dXJlKGZlYXR1cmUpCisgICAgICAgIGJiLmRlYnVnKDEsICJGZWF0dXJlcyBzZXQgJXMgKHdhcyAlcykiICUgKG9yaWdpbmFsX2ZlYXR1cmVzZXQsIGxpc3Qoc2VsZi5mZWF0dXJlc2V0KSkpCisgICAgICAgIGlmIChvcmlnaW5hbF9mZWF0dXJlc2V0ICE9IGxpc3Qoc2VsZi5mZWF0dXJlc2V0KSkgYW5kIHNlbGYuc3RhdGUgIT0gc3RhdGUuZXJyb3I6CisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBpbml0Q29uZmlndXJhdGlvbkRhdGEoc2VsZik6CisKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlLmluaXRpYWwKKyAgICAgICAgc2VsZi5jYWNoZXNfYXJyYXkgPSBbXQorCisgICAgICAgIGlmIENvb2tlckZlYXR1cmVzLkJBU0VEQVRBU1RPUkVfVFJBQ0tJTkcgaW4gc2VsZi5mZWF0dXJlc2V0OgorICAgICAgICAgICAgc2VsZi5lbmFibGVEYXRhVHJhY2tpbmcoKQorCisgICAgICAgIGFsbF9leHRyYV9jYWNoZV9uYW1lcyA9IFtdCisgICAgICAgICMgV2UgaGFyZGNvZGUgYWxsIGtub3duIGNhY2hlIHR5cGVzIGluIGEgc2luZ2xlIHBsYWNlLCBoZXJlLgorICAgICAgICBpZiBDb29rZXJGZWF0dXJlcy5IT0JfRVhUUkFfQ0FDSEVTIGluIHNlbGYuZmVhdHVyZXNldDoKKyAgICAgICAgICAgIGFsbF9leHRyYV9jYWNoZV9uYW1lcy5hcHBlbmQoImJiLmNhY2hlX2V4dHJhOkhvYlJlY2lwZUluZm8iKQorCisgICAgICAgIGNhY2hlc19uYW1lX2FycmF5ID0gWydiYi5jYWNoZTpDb3JlUmVjaXBlSW5mbyddICsgYWxsX2V4dHJhX2NhY2hlX25hbWVzCisKKyAgICAgICAgIyBBdCBsZWFzdCBDb3JlUmVjaXBlSW5mbyB3aWxsIGJlIGxvYWRlZCwgc28gY2FjaGVzX2FycmF5IHdpbGwgbmV2ZXIgYmUgZW1wdHkhCisgICAgICAgICMgVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQsIG5vIGZ1cnRoZXIgY2hlY2sgbmVlZGVkIQorICAgICAgICBmb3IgdmFyIGluIGNhY2hlc19uYW1lX2FycmF5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lLCBjYWNoZV9uYW1lID0gdmFyLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lLCBmcm9tbGlzdD0oY2FjaGVfbmFtZSwpKQorICAgICAgICAgICAgICAgIHNlbGYuY2FjaGVzX2FycmF5LmFwcGVuZChnZXRhdHRyKG1vZHVsZSwgY2FjaGVfbmFtZSkpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiVW5hYmxlIHRvIGltcG9ydCBleHRyYSBSZWNpcGVJbmZvICclcycgZnJvbSAnJXMnOiAlcyIgJSAoY2FjaGVfbmFtZSwgbW9kdWxlX25hbWUsIGV4YykpCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoIkZBVEFMOiBGYWlsZWQgdG8gaW1wb3J0IGV4dHJhIGNhY2hlIGNsYXNzICclcycuIiAlIGNhY2hlX25hbWUpCisKKyAgICAgICAgc2VsZi5kYXRhYnVpbGRlciA9IGJiLmNvb2tlcmRhdGEuQ29va2VyRGF0YUJ1aWxkZXIoc2VsZi5jb25maWd1cmF0aW9uLCBGYWxzZSkKKyAgICAgICAgc2VsZi5kYXRhYnVpbGRlci5wYXJzZUJhc2VDb25maWd1cmF0aW9uKCkKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhYnVpbGRlci5kYXRhCisgICAgICAgIHNlbGYuZGF0YV9oYXNoID0gc2VsZi5kYXRhYnVpbGRlci5kYXRhX2hhc2gKKworCisgICAgICAgICMgd2UgbG9nIGFsbCBldmVudHMgdG8gYSBmaWxlIGlmIHNvIGRpcmVjdGVkCisgICAgICAgIGlmIHNlbGYuY29uZmlndXJhdGlvbi53cml0ZWV2ZW50bG9nOgorICAgICAgICAgICAgaW1wb3J0IGpzb24sIHBpY2tsZQorICAgICAgICAgICAgREVGQVVMVF9FVkVOVEZJTEUgPSBzZWxmLmNvbmZpZ3VyYXRpb24ud3JpdGVldmVudGxvZworICAgICAgICAgICAgY2xhc3MgRXZlbnRMb2dXcml0ZUhhbmRsZXIoKToKKworICAgICAgICAgICAgICAgIGNsYXNzIEV2ZW50V3JpdGVyKCk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb29rZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlX2luaXRlZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2VyID0gY29va2VyCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlID0gW10KKworICAgICAgICAgICAgICAgICAgICBkZWYgaW5pdF9maWxlKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBvbGQgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKERFRkFVTFRfRVZFTlRGSUxFKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgICAgICAgICAgIyB3cml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKERFRkFVTFRfRVZFTlRGSUxFLCAidyIpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiJXNcbiIgJSBqc29uLmR1bXBzKHsgImFsbHZhcmlhYmxlcyIgOiBzZWxmLmNvb2tlci5nZXRBbGxLZXlzV2l0aEZsYWdzKFsiZG9jIiwgImZ1bmMiXSl9KSkKKworICAgICAgICAgICAgICAgICAgICBkZWYgd3JpdGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKERFRkFVTFRfRVZFTlRGSUxFLCAiYSIpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlc1xuIiAlIGpzb24uZHVtcHMoeyJjbGFzcyI6ZXZlbnQuX19tb2R1bGVfXyArICIuIiArIGV2ZW50Ll9fY2xhc3NfXy5fX25hbWVfXywgInZhcnMiOmpzb24uZHVtcHMocGlja2xlLmR1bXBzKGV2ZW50KSkgfSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGUsIHRyYWNlYmFjay5mb3JtYXRfZXhjKGUpKQorCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIHNlbmQoc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2xhc3MgPSBldmVudC5fX21vZHVsZV9fICsgIi4iICsgZXZlbnQuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaW5pdCBvbiBiYi5ldmVudC5CdWlsZFN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlsZV9pbml0ZWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAgZXZlbnRfY2xhc3MgPT0gImJiLmV2ZW50LkJ1aWxkU3RhcnRlZCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5pdF9maWxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlX2luaXRlZCA9IFRydWUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIHBlbmRpbmcgZXZlbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXZlbnRfcXVldWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2V2ZW50KGUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbHNvIHdyaXRlIHRoZSBjdXJyZW50IGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZXZlbnQoZXZlbnQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHF1ZXVlIGFsbCBldmVudHMgdW50aWwgdGhlIGZpbGUgaXMgaW5pdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfcXVldWUuYXBwZW5kKGV2ZW50KQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgaGF2ZSB0aGUgZmlsZSwganVzdCB3cml0ZSB0aGUgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2V2ZW50KGV2ZW50KQorCisgICAgICAgICAgICAgICAgIyBzZXQgb3VyIGhhbmRsZXIncyBldmVudCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICBldmVudCA9IEV2ZW50V3JpdGVyKHNlbGYpICAgICAgICMgc2VsZiBpcyB0aGUgY29va2VyIGhlcmUKKworCisgICAgICAgICAgICAjIHNldCB1cCBjb29rZXIgZmVhdHVyZXMgZm9yIHRoaXMgbW9jayBVSSBoYW5kbGVyCisKKyAgICAgICAgICAgICMgd2UgbmVlZCB0byB3cml0ZSB0aGUgZGVwZW5kZW5jeSB0cmVlIGluIHRoZSBsb2cKKyAgICAgICAgICAgIHNlbGYuZmVhdHVyZXNldC5zZXRGZWF0dXJlKENvb2tlckZlYXR1cmVzLlNFTkRfREVQRU5EU19UUkVFKQorICAgICAgICAgICAgIyByZWdpc3RlciB0aGUgbG9nIGZpbGUgd3JpdGVyIGFzIFVJIEhhbmRsZXIKKyAgICAgICAgICAgIGJiLmV2ZW50LnJlZ2lzdGVyX1VJSGhhbmRsZXIoRXZlbnRMb2dXcml0ZUhhbmRsZXIoKSkKKworCisgICAgICAgICMKKyAgICAgICAgIyBDb3B5IG9mIHRoZSBkYXRhIHN0b3JlIHdoaWNoIGhhcyBiZWVuIGV4cGFuZGVkLgorICAgICAgICAjIFVzZWQgZm9yIGZpcmluZyBldmVudHMgYW5kIGFjY2Vzc2luZyB2YXJpYWJsZXMgd2hlcmUgZXhwYW5zaW9uIG5lZWRzIHRvIGJlIGFjY291bnRlZCBmb3IKKyAgICAgICAgIworICAgICAgICBzZWxmLmV4cGFuZGVkX2RhdGEgPSBiYi5kYXRhLmNyZWF0ZUNvcHkoc2VsZi5kYXRhKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgYmIucGFyc2UuaW5pdF9wYXJzZXIoc2VsZi5leHBhbmRlZF9kYXRhKQorCisgICAgICAgIGlmIENvb2tlckZlYXR1cmVzLkJBU0VEQVRBU1RPUkVfVFJBQ0tJTkcgaW4gc2VsZi5mZWF0dXJlc2V0OgorICAgICAgICAgICAgc2VsZi5kaXNhYmxlRGF0YVRyYWNraW5nKCkKKworICAgICAgICBzZWxmLmRhdGEucmVuYW1lVmFyKCJfX2RlcGVuZHMiLCAiX19iYXNlX2RlcGVuZHMiKQorICAgICAgICBzZWxmLmFkZF9maWxld2F0Y2goc2VsZi5kYXRhLmdldFZhcigiX19iYXNlX2RlcGVuZHMiLCBGYWxzZSksIHNlbGYuY29uZmlnd2F0Y2hlcikKKworCisgICAgZGVmIGVuYWJsZURhdGFUcmFja2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnRyYWNraW5nID0gVHJ1ZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJkYXRhIik6CisgICAgICAgICAgICBzZWxmLmRhdGEuZW5hYmxlVHJhY2tpbmcoKQorCisgICAgZGVmIGRpc2FibGVEYXRhVHJhY2tpbmcoc2VsZik6CisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi50cmFja2luZyA9IEZhbHNlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgImRhdGEiKToKKyAgICAgICAgICAgIHNlbGYuZGF0YS5kaXNhYmxlVHJhY2tpbmcoKQorCisgICAgZGVmIG1vZGlmeUNvbmZpZ3VyYXRpb25WYXIoc2VsZiwgdmFyLCB2YWwsIGRlZmF1bHRfZmlsZSwgb3ApOgorICAgICAgICBpZiBvcCA9PSAiYXBwZW5kIjoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kQ29uZmlndXJhdGlvblZhcih2YXIsIHZhbCwgZGVmYXVsdF9maWxlKQorICAgICAgICBlbGlmIG9wID09ICJzZXQiOgorICAgICAgICAgICAgc2VsZi5zYXZlQ29uZmlndXJhdGlvblZhcih2YXIsIHZhbCwgZGVmYXVsdF9maWxlLCAiPSIpCisgICAgICAgIGVsaWYgb3AgPT0gImVhcmx5QXNzaWduIjoKKyAgICAgICAgICAgIHNlbGYuc2F2ZUNvbmZpZ3VyYXRpb25WYXIodmFyLCB2YWwsIGRlZmF1bHRfZmlsZSwgIj89IikKKworCisgICAgZGVmIGFwcGVuZENvbmZpZ3VyYXRpb25WYXIoc2VsZiwgdmFyLCB2YWwsIGRlZmF1bHRfZmlsZSk6CisgICAgICAgICNhZGQgYXBwZW5kIHZhciBvcGVyYXRpb24gdG8gdGhlIGVuZCBvZiBkZWZhdWx0X2ZpbGUKKyAgICAgICAgZGVmYXVsdF9maWxlID0gYmIuY29va2VyZGF0YS5maW5kQ29uZmlnRmlsZShkZWZhdWx0X2ZpbGUsIHNlbGYuZGF0YSkKKworICAgICAgICB0b3RhbCA9ICIjYWRkZWQgYnkgaG9iIgorICAgICAgICB0b3RhbCArPSAiXG4lcyArPSBcIiVzXCJcbiIgJSAodmFyLCB2YWwpCisKKyAgICAgICAgd2l0aCBvcGVuKGRlZmF1bHRfZmlsZSwgJ2EnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSh0b3RhbCkKKworICAgICAgICAjYWRkIHRvIGhpc3RvcnkKKyAgICAgICAgbG9naW5mbyA9IHsib3AiOiJhcHBlbmQiLCAiZmlsZSI6ZGVmYXVsdF9maWxlLCAibGluZSI6dG90YWwuY291bnQoIlxuIil9CisgICAgICAgIHNlbGYuZGF0YS5hcHBlbmRWYXIodmFyLCB2YWwsICoqbG9naW5mbykKKworICAgIGRlZiBzYXZlQ29uZmlndXJhdGlvblZhcihzZWxmLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlLCBvcCk6CisKKyAgICAgICAgcmVwbGFjZWQgPSBGYWxzZQorICAgICAgICAjZG8gbm90IHNhdmUgaWYgbm90aGluZyBjaGFuZ2VkCisgICAgICAgIGlmIHN0cih2YWwpID09IHNlbGYuZGF0YS5nZXRWYXIodmFyLCBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBjb25mX2ZpbGVzID0gc2VsZi5kYXRhLnZhcmhpc3RvcnkuZ2V0X3ZhcmlhYmxlX2ZpbGVzKHZhcikKKworICAgICAgICAjZm9ybWF0IHRoZSB2YWx1ZSB3aGVuIGl0IGlzIGEgbGlzdAorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgbGlzdCk6CisgICAgICAgICAgICBsaXN0dmFsID0gIiIKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWw6CisgICAgICAgICAgICAgICAgbGlzdHZhbCArPSAiJXMgICAiICUgdmFsdWUKKyAgICAgICAgICAgIHZhbCA9IGxpc3R2YWwKKworICAgICAgICB0b3BkaXIgPSBzZWxmLmRhdGEuZ2V0VmFyKCJUT1BESVIiLCBGYWxzZSkKKworICAgICAgICAjY29tbWVudCBvciByZXBsYWNlIG9wZXJhdGlvbnMgbWFkZSBvbiB2YXIKKyAgICAgICAgZm9yIGNvbmZfZmlsZSBpbiBjb25mX2ZpbGVzOgorICAgICAgICAgICAgaWYgdG9wZGlyIGluIGNvbmZfZmlsZToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29uZl9maWxlLCAncicpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkbGluZXMoKQorCisgICAgICAgICAgICAgICAgbGluZXMgPSBzZWxmLmRhdGEudmFyaGlzdG9yeS5nZXRfdmFyaWFibGVfbGluZXModmFyLCBjb25mX2ZpbGUpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgICAgIHRvdGFsID0gIiIKKyAgICAgICAgICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gY29udGVudHM6CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGk9PWludChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5kZXggPSBsZW4odG90YWwpCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdG90YWwucmZpbmQodmFyLCAwLCBlbmRfaW5kZXgpCisKKyAgICAgICAgICAgICAgICAgICAgYmVnaW5fbGluZSA9IHRvdGFsLmNvdW50KCJcbiIsMCxpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgZW5kX2xpbmUgPSBpbnQobGluZSkKKworICAgICAgICAgICAgICAgICAgICAjY2hlY2sgaWYgdGhlIHZhcmlhYmxlIHdhcyBzYXZlZCBiZWZvcmUgaW4gdGhlIHNhbWUgd2F5CisgICAgICAgICAgICAgICAgICAgICNpZiB0cnVlIGl0IHJlcGxhY2UgdGhlIHBsYWNlIHdoZXJlIHRoZSB2YXJpYWJsZSB3YXMgZGVjbGFyZWQKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UgaXQgY29tbWVudHMgaXQKKyAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudHNbYmVnaW5fbGluZS0xXT09ICIjYWRkZWQgYnkgaG9iXG4iOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNbYmVnaW5fbGluZV0gPSAiJXMgJXMgXCIlc1wiXG4iICUgKHZhciwgb3AsIHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlpIGluIHJhbmdlKGJlZ2luX2xpbmUsIGVuZF9saW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1tpaV0gPSAiIyIgKyBjb250ZW50c1tpaV0KKworICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb25mX2ZpbGUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZWxpbmVzKGNvbnRlbnRzKQorCisgICAgICAgIGlmIHJlcGxhY2VkID09IEZhbHNlOgorICAgICAgICAgICAgI3JlbW92ZSB2YXIgZnJvbSBoaXN0b3J5CisgICAgICAgICAgICBzZWxmLmRhdGEudmFyaGlzdG9yeS5kZWxfdmFyX2hpc3RvcnkodmFyKQorCisgICAgICAgICAgICAjYWRkIHZhciB0byB0aGUgZW5kIG9mIGRlZmF1bHRfZmlsZQorICAgICAgICAgICAgZGVmYXVsdF9maWxlID0gYmIuY29va2VyZGF0YS5maW5kQ29uZmlnRmlsZShkZWZhdWx0X2ZpbGUsIHNlbGYuZGF0YSkKKworICAgICAgICAgICAgI2FkZCB0aGUgdmFyaWFibGUgb24gYSBzaW5nbGUgbGluZSwgdG8gYmUgZWFzeSB0byByZXBsYWNlIHRoZSBzZWNvbmQgdGltZQorICAgICAgICAgICAgdG90YWwgPSAiXG4jYWRkZWQgYnkgaG9iIgorICAgICAgICAgICAgdG90YWwgKz0gIlxuJXMgJXMgXCIlc1wiXG4iICUgKHZhciwgb3AsIHZhbCkKKworICAgICAgICAgICAgd2l0aCBvcGVuKGRlZmF1bHRfZmlsZSwgJ2EnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUodG90YWwpCisKKyAgICAgICAgICAgICNhZGQgdG8gaGlzdG9yeQorICAgICAgICAgICAgbG9naW5mbyA9IHsib3AiOiJzZXQiLCAiZmlsZSI6ZGVmYXVsdF9maWxlLCAibGluZSI6dG90YWwuY291bnQoIlxuIil9CisgICAgICAgICAgICBzZWxmLmRhdGEuc2V0VmFyKHZhciwgdmFsLCAqKmxvZ2luZm8pCisKKyAgICBkZWYgcmVtb3ZlQ29uZmlndXJhdGlvblZhcihzZWxmLCB2YXIpOgorICAgICAgICBjb25mX2ZpbGVzID0gc2VsZi5kYXRhLnZhcmhpc3RvcnkuZ2V0X3ZhcmlhYmxlX2ZpbGVzKHZhcikKKyAgICAgICAgdG9wZGlyID0gc2VsZi5kYXRhLmdldFZhcigiVE9QRElSIiwgRmFsc2UpCisKKyAgICAgICAgZm9yIGNvbmZfZmlsZSBpbiBjb25mX2ZpbGVzOgorICAgICAgICAgICAgaWYgdG9wZGlyIGluIGNvbmZfZmlsZToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29uZl9maWxlLCAncicpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkbGluZXMoKQorCisgICAgICAgICAgICAgICAgbGluZXMgPSBzZWxmLmRhdGEudmFyaGlzdG9yeS5nZXRfdmFyaWFibGVfbGluZXModmFyLCBjb25mX2ZpbGUpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgICAgIHRvdGFsID0gIiIKKyAgICAgICAgICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gY29udGVudHM6CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGk9PWludChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5kZXggPSBsZW4odG90YWwpCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdG90YWwucmZpbmQodmFyLCAwLCBlbmRfaW5kZXgpCisKKyAgICAgICAgICAgICAgICAgICAgYmVnaW5fbGluZSA9IHRvdGFsLmNvdW50KCJcbiIsMCxpbmRleCkKKworICAgICAgICAgICAgICAgICAgICAjY2hlY2sgaWYgdGhlIHZhcmlhYmxlIHdhcyBzYXZlZCBiZWZvcmUgaW4gdGhlIHNhbWUgd2F5CisgICAgICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRzW2JlZ2luX2xpbmUtMV09PSAiI2FkZGVkIGJ5IGhvYlxuIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2JlZ2luX2xpbmUtMV0gPSBjb250ZW50c1tiZWdpbl9saW5lXSA9ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzW2JlZ2luX2xpbmVdID0gIlxuIgorICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHZhciBmcm9tIGhpc3RvcnkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnZhcmhpc3RvcnkuZGVsX3Zhcl9oaXN0b3J5KHZhciwgY29uZl9maWxlLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICAjcmVtb3ZlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5kZWxWYXIodmFyKQorCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbmZfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlbGluZXMoY29udGVudHMpCisKKyAgICBkZWYgY3JlYXRlQ29uZmlnRmlsZShzZWxmLCBuYW1lKToKKyAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCisgICAgICAgIGNvbmZwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJjb25mIiwgbmFtZSkKKyAgICAgICAgb3Blbihjb25mcGF0aCwgJ3cnKS5jbG9zZSgpCisKKyAgICBkZWYgcGFyc2VDb25maWd1cmF0aW9uKHNlbGYpOgorICAgICAgICAjIFNldCBsb2cgZmlsZSB2ZXJib3NpdHkKKyAgICAgICAgdmVyYm9zZWxvZ3MgPSBiYi51dGlscy50b19ib29sZWFuKHNlbGYuZGF0YS5nZXRWYXIoIkJCX1ZFUkJPU0VfTE9HUyIsIEZhbHNlKSkKKyAgICAgICAgaWYgdmVyYm9zZWxvZ3M6CisgICAgICAgICAgICBiYi5tc2cubG9nZ2VyVmVyYm9zZUxvZ3MgPSBUcnVlCisKKyAgICAgICAgIyBDaGFuZ2UgbmljZSBsZXZlbCBpZiB3ZSdyZSBhc2tlZCB0bworICAgICAgICBuaWNlID0gc2VsZi5kYXRhLmdldFZhcigiQkJfTklDRV9MRVZFTCIsIFRydWUpCisgICAgICAgIGlmIG5pY2U6CisgICAgICAgICAgICBjdXJuaWNlID0gb3MubmljZSgwKQorICAgICAgICAgICAgbmljZSA9IGludChuaWNlKSAtIGN1cm5pY2UKKyAgICAgICAgICAgIGJ1aWxkbG9nLnZlcmJvc2UoIlJlbmljZSB0byAlcyAiICUgb3MubmljZShuaWNlKSkKKworICAgICAgICBpZiBzZWxmLnJlY2lwZWNhY2hlOgorICAgICAgICAgICAgZGVsIHNlbGYucmVjaXBlY2FjaGUKKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZSA9IGJiLmNhY2hlLkNhY2hlRGF0YShzZWxmLmNhY2hlc19hcnJheSkKKworICAgICAgICBzZWxmLmhhbmRsZUNvbGxlY3Rpb25zKCBzZWxmLmRhdGEuZ2V0VmFyKCJCQkZJTEVfQ09MTEVDVElPTlMiLCBUcnVlKSApCisKKyAgICBkZWYgdXBkYXRlQ29uZmlnT3B0cyhzZWxmLCBvcHRpb25zLCBlbnZpcm9ubWVudCk6CisgICAgICAgIGNsZWFuID0gVHJ1ZQorICAgICAgICBmb3IgbyBpbiBvcHRpb25zOgorICAgICAgICAgICAgaWYgbyBpbiBbJ3ByZWZpbGUnLCAncG9zdGZpbGUnXToKKyAgICAgICAgICAgICAgICBjbGVhbiA9IEZhbHNlCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYuY29uZmlndXJhdGlvbiwgbywgb3B0aW9uc1tvXSkKKyAgICAgICAgZm9yIGsgaW4gYmIudXRpbHMuYXBwcm92ZWRfdmFyaWFibGVzKCk6CisgICAgICAgICAgICBpZiBrIGluIGVudmlyb25tZW50IGFuZCBrIG5vdCBpbiBzZWxmLmNvbmZpZ3VyYXRpb24uZW52OgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVXBkYXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMgdG8gJXMiICUgKGssIGVudmlyb25tZW50W2tdKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uZW52W2tdID0gZW52aXJvbm1lbnRba10KKyAgICAgICAgICAgICAgICBjbGVhbiA9IEZhbHNlCisgICAgICAgICAgICBpZiBrIGluIHNlbGYuY29uZmlndXJhdGlvbi5lbnYgYW5kIGsgbm90IGluIGVudmlyb25tZW50OgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVXBkYXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMgKGRlbGV0ZWQpIiAlIChrKSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5jb25maWd1cmF0aW9uLmVudltrXQorICAgICAgICAgICAgICAgIGNsZWFuID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGsgbm90IGluIHNlbGYuY29uZmlndXJhdGlvbi5lbnYgYW5kIGsgbm90IGluIGVudmlyb25tZW50OgorICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZW52aXJvbm1lbnRba10gIT0gc2VsZi5jb25maWd1cmF0aW9uLmVudltrXToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlVwZGF0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlICVzIHRvICVzIiAlIChrLCBlbnZpcm9ubWVudFtrXSkpCisgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmVudltrXSA9IGVudmlyb25tZW50W2tdCisgICAgICAgICAgICAgICAgY2xlYW4gPSBGYWxzZQorICAgICAgICBpZiBub3QgY2xlYW46CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkJhc2UgZW52aXJvbm1lbnQgY2hhbmdlLCB0cmlnZ2VyaW5nIHJlcGFyc2UiKQorICAgICAgICAgICAgc2VsZi5iYXNlY29uZmlnX3ZhbGlkID0gRmFsc2UgICAgICAgIAorICAgICAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcnVuQ29tbWFuZHMoc2VsZiwgc2VydmVyLCBkYXRhLCBhYm9ydCk6CisgICAgICAgICIiIgorICAgICAgICBSdW4gYW55IHF1ZXVlZCBhc3luY2hyb25vdXMgY29tbWFuZAorICAgICAgICBUaGlzIGlzIGRvbmUgYnkgdGhlIGlkbGUgaGFuZGxlciBzbyBpdCBydW5zIGluIHRydWUgY29udGV4dCByYXRoZXIgdGhhbgorICAgICAgICB0aWVkIHRvIGFueSBVSS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZC5ydW5Bc3luY0NvbW1hbmQoKQorCisgICAgZGVmIHNob3dWZXJzaW9ucyhzZWxmKToKKworICAgICAgICBwa2dfcG4gPSBzZWxmLnJlY2lwZWNhY2hlLnBrZ19wbgorICAgICAgICAobGF0ZXN0X3ZlcnNpb25zLCBwcmVmZXJyZWRfdmVyc2lvbnMpID0gYmIucHJvdmlkZXJzLmZpbmRQcm92aWRlcnMoc2VsZi5kYXRhLCBzZWxmLnJlY2lwZWNhY2hlLCBwa2dfcG4pCisKKyAgICAgICAgbG9nZ2VyLnBsYWluKCIlLTM1cyAlMjVzICUyNXMiLCAiUmVjaXBlIE5hbWUiLCAiTGF0ZXN0IFZlcnNpb24iLCAiUHJlZmVycmVkIFZlcnNpb24iKQorICAgICAgICBsb2dnZXIucGxhaW4oIiUtMzVzICUyNXMgJTI1c1xuIiwgIj09PT09PT09PT09IiwgIj09PT09PT09PT09PT09IiwgIj09PT09PT09PT09PT09PT09IikKKworICAgICAgICBmb3IgcCBpbiBzb3J0ZWQocGtnX3BuKToKKyAgICAgICAgICAgIHByZWYgPSBwcmVmZXJyZWRfdmVyc2lvbnNbcF0KKyAgICAgICAgICAgIGxhdGVzdCA9IGxhdGVzdF92ZXJzaW9uc1twXQorCisgICAgICAgICAgICBwcmVmc3RyID0gcHJlZlswXVswXSArICI6IiArIHByZWZbMF1bMV0gKyAnLScgKyBwcmVmWzBdWzJdCisgICAgICAgICAgICBsYXRlc3RzdHIgPSBsYXRlc3RbMF1bMF0gKyAiOiIgKyBsYXRlc3RbMF1bMV0gKyAiLSIgKyBsYXRlc3RbMF1bMl0KKworICAgICAgICAgICAgaWYgcHJlZiA9PSBsYXRlc3Q6CisgICAgICAgICAgICAgICAgcHJlZnN0ciA9ICIiCisKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiJS0zNXMgJTI1cyAlMjVzIiwgcCwgbGF0ZXN0c3RyLCBwcmVmc3RyKQorCisgICAgZGVmIHNob3dFbnZpcm9ubWVudChzZWxmLCBidWlsZGZpbGU9Tm9uZSwgcGtnc190b19idWlsZD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFNob3cgdGhlIG91dGVyIG9yIHBlci1yZWNpcGUgZW52aXJvbm1lbnQKKyAgICAgICAgIiIiCisgICAgICAgIGZuID0gTm9uZQorICAgICAgICBlbnZkYXRhID0gTm9uZQorICAgICAgICBpZiBub3QgcGtnc190b19idWlsZDoKKyAgICAgICAgICAgIHBrZ3NfdG9fYnVpbGQgPSBbXQorCisgICAgICAgIGlmIGJ1aWxkZmlsZToKKyAgICAgICAgICAgICMgUGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24gaGVyZS4gV2UgbmVlZCB0byBkbyBpdCBleHBsaWNpdGx5IGhlcmUgc2luY2UKKyAgICAgICAgICAgICMgdGhpcyBzaG93RW52aXJvbm1lbnQoKSBjb2RlIHBhdGggZG9lc24ndCB1c2UgdGhlIGNhY2hlCisgICAgICAgICAgICBzZWxmLnBhcnNlQ29uZmlndXJhdGlvbigpCisKKyAgICAgICAgICAgIGZuLCBjbHMgPSBiYi5jYWNoZS5DYWNoZS52aXJ0dWFsZm4ycmVhbGZuKGJ1aWxkZmlsZSkKKyAgICAgICAgICAgIGZuID0gc2VsZi5tYXRjaEZpbGUoZm4pCisgICAgICAgICAgICBmbiA9IGJiLmNhY2hlLkNhY2hlLnJlYWxmbjJ2aXJ0dWFsKGZuLCBjbHMpCisgICAgICAgIGVsaWYgbGVuKHBrZ3NfdG9fYnVpbGQpID09IDE6CisgICAgICAgICAgICBpZ25vcmUgPSBzZWxmLmV4cGFuZGVkX2RhdGEuZ2V0VmFyKCJBU1NVTUVfUFJPVklERUQiLCBUcnVlKSBvciAiIgorICAgICAgICAgICAgaWYgcGtnc190b19idWlsZFswXSBpbiBzZXQoaWdub3JlLnNwbGl0KCkpOgorICAgICAgICAgICAgICAgIGJiLmZhdGFsKCIlcyBpcyBpbiBBU1NVTUVfUFJPVklERUQiICUgcGtnc190b19idWlsZFswXSkKKworICAgICAgICAgICAgdGFza2RhdGEsIHJ1bmxpc3QsIHBrZ3NfdG9fYnVpbGQgPSBzZWxmLmJ1aWxkVGFza0RhdGEocGtnc190b19idWlsZCwgTm9uZSwgc2VsZi5jb25maWd1cmF0aW9uLmFib3J0LCBhbGxvd2luY29tcGxldGU9VHJ1ZSkKKworICAgICAgICAgICAgdGFyZ2V0aWQgPSB0YXNrZGF0YS5nZXRidWlsZF9pZChwa2dzX3RvX2J1aWxkWzBdKQorICAgICAgICAgICAgZm5pZCA9IHRhc2tkYXRhLmJ1aWxkX3RhcmdldHNbdGFyZ2V0aWRdWzBdCisgICAgICAgICAgICBmbiA9IHRhc2tkYXRhLmZuX2luZGV4W2ZuaWRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnZkYXRhID0gc2VsZi5kYXRhCisKKyAgICAgICAgaWYgZm46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZW52ZGF0YSA9IGJiLmNhY2hlLkNhY2hlLmxvYWREYXRhRnVsbChmbiwgc2VsZi5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZm4pLCBzZWxmLmRhdGEpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCAlcyIsIGZuKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgIyBEaXNwbGF5IGhpc3RvcnkKKyAgICAgICAgd2l0aCBjbG9zaW5nKFN0cmluZ0lPKCkpIGFzIGVudjoKKyAgICAgICAgICAgIHNlbGYuZGF0YS5pbmNoaXN0b3J5LmVtaXQoZW52KQorICAgICAgICAgICAgbG9nZ2VyLnBsYWluKGVudi5nZXR2YWx1ZSgpKQorCisgICAgICAgICMgZW1pdCB2YXJpYWJsZXMgYW5kIHNoZWxsIGZ1bmN0aW9ucworICAgICAgICBkYXRhLnVwZGF0ZV9kYXRhKGVudmRhdGEpCisgICAgICAgIHdpdGggY2xvc2luZyhTdHJpbmdJTygpKSBhcyBlbnY6CisgICAgICAgICAgICBkYXRhLmVtaXRfZW52KGVudiwgZW52ZGF0YSwgVHJ1ZSkKKyAgICAgICAgICAgIGxvZ2dlci5wbGFpbihlbnYuZ2V0dmFsdWUoKSkKKworICAgICAgICAjIGVtaXQgdGhlIG1ldGFkYXRhIHdoaWNoIGlzbnQgdmFsaWQgc2hlbGwKKyAgICAgICAgZGF0YS5leHBhbmRLZXlzKGVudmRhdGEpCisgICAgICAgIGZvciBlIGluIGVudmRhdGEua2V5cygpOgorICAgICAgICAgICAgaWYgZGF0YS5nZXRWYXJGbGFnKCBlLCAncHl0aG9uJywgZW52ZGF0YSApOgorICAgICAgICAgICAgICAgIGxvZ2dlci5wbGFpbigiXG5weXRob24gJXMgKCkge1xuJXN9XG4iLCBlLCBlbnZkYXRhLmdldFZhcihlLCBUcnVlKSkKKworCisgICAgZGVmIGJ1aWxkVGFza0RhdGEoc2VsZiwgcGtnc190b19idWlsZCwgdGFzaywgYWJvcnQsIGFsbG93aW5jb21wbGV0ZT1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBQcmVwYXJlIGEgcnVucXVldWUgYW5kIHRhc2tkYXRhIG9iamVjdCBmb3IgaXRlcmF0aW9uIG92ZXIgcGtnc190b19idWlsZAorICAgICAgICAiIiIKKyAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uU3RhcnRlZCgpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgIyBBIHRhc2sgb2YgTm9uZSBtZWFucyB1c2UgdGhlIGRlZmF1bHQgdGFzaworICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICB0YXNrID0gc2VsZi5jb25maWd1cmF0aW9uLmNtZAorCisgICAgICAgIGZ1bGx0YXJnZXRsaXN0ID0gc2VsZi5jaGVja1BhY2thZ2VzKHBrZ3NfdG9fYnVpbGQpCisKKyAgICAgICAgbG9jYWxkYXRhID0gZGF0YS5jcmVhdGVDb3B5KHNlbGYuZGF0YSkKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShsb2NhbGRhdGEpCisgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhsb2NhbGRhdGEpCisgICAgICAgIHRhc2tkYXRhID0gYmIudGFza2RhdGEuVGFza0RhdGEoYWJvcnQsIHNraXBsaXN0PXNlbGYuc2tpcGxpc3QsIGFsbG93aW5jb21wbGV0ZT1hbGxvd2luY29tcGxldGUpCisKKyAgICAgICAgY3VycmVudCA9IDAKKyAgICAgICAgcnVubGlzdCA9IFtdCisgICAgICAgIGZvciBrIGluIGZ1bGx0YXJnZXRsaXN0OgorICAgICAgICAgICAga3Rhc2sgPSB0YXNrCisgICAgICAgICAgICBpZiAiOmRvXyIgaW4gazoKKyAgICAgICAgICAgICAgICBrMiA9IGsuc3BsaXQoIjpkb18iKQorICAgICAgICAgICAgICAgIGsgPSBrMlswXQorICAgICAgICAgICAgICAgIGt0YXNrID0gazJbMV0KKyAgICAgICAgICAgIHRhc2tkYXRhLmFkZF9wcm92aWRlcihsb2NhbGRhdGEsIHNlbGYucmVjaXBlY2FjaGUsIGspCisgICAgICAgICAgICBjdXJyZW50ICs9IDEKKyAgICAgICAgICAgIGlmIG5vdCBrdGFzay5zdGFydHN3aXRoKCJkb18iKToKKyAgICAgICAgICAgICAgICBrdGFzayA9ICJkb18lcyIgJSBrdGFzaworICAgICAgICAgICAgcnVubGlzdC5hcHBlbmQoW2ssIGt0YXNrXSkKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuVHJlZURhdGFQcmVwYXJhdGlvblByb2dyZXNzKGN1cnJlbnQsIGxlbihmdWxsdGFyZ2V0bGlzdCkpLCBzZWxmLmRhdGEpCisgICAgICAgIHRhc2tkYXRhLmFkZF91bnJlc29sdmVkKGxvY2FsZGF0YSwgc2VsZi5yZWNpcGVjYWNoZSkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uQ29tcGxldGVkKGxlbihmdWxsdGFyZ2V0bGlzdCkpLCBzZWxmLmRhdGEpCisgICAgICAgIHJldHVybiB0YXNrZGF0YSwgcnVubGlzdCwgZnVsbHRhcmdldGxpc3QKKworICAgIGRlZiBwcmVwYXJlVHJlZURhdGEoc2VsZiwgcGtnc190b19idWlsZCwgdGFzayk6CisgICAgICAgICIiIgorICAgICAgICBQcmVwYXJlIGEgcnVucXVldWUgYW5kIHRhc2tkYXRhIG9iamVjdCBmb3IgaXRlcmF0aW9uIG92ZXIgcGtnc190b19idWlsZAorICAgICAgICAiIiIKKworICAgICAgICAjIFdlIHNldCBhYm9ydCB0byBGYWxzZSBoZXJlIHRvIHByZXZlbnQgdW5idWlsZGFibGUgdGFyZ2V0cyByYWlzaW5nCisgICAgICAgICMgYW4gZXhjZXB0aW9uIHdoZW4gd2UncmUganVzdCBnZW5lcmF0aW5nIGRhdGEKKyAgICAgICAgdGFza2RhdGEsIHJ1bmxpc3QsIHBrZ3NfdG9fYnVpbGQgPSBzZWxmLmJ1aWxkVGFza0RhdGEocGtnc190b19idWlsZCwgdGFzaywgRmFsc2UsIGFsbG93aW5jb21wbGV0ZT1UcnVlKQorCisgICAgICAgIHJldHVybiBydW5saXN0LCB0YXNrZGF0YQorCisgICAgIyMjIyMjIyMgV0FSTklORyA6IHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgY2FjaGVfZXh0cmEgdG8gYmUgZW5hYmxlZCAjIyMjIyMjIworCisgICAgZGVmIGdlbmVyYXRlVGFza0RlcFRyZWVEYXRhKHNlbGYsIHBrZ3NfdG9fYnVpbGQsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgZGVwZW5kZW5jeSBncmFwaCBvZiBwa2dzX3RvX2J1aWxkIGluY2x1ZGluZyByZXZlcnNlIGRlcGVuZGVuY3kKKyAgICAgICAgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBydW5saXN0LCB0YXNrZGF0YSA9IHNlbGYucHJlcGFyZVRyZWVEYXRhKHBrZ3NfdG9fYnVpbGQsIHRhc2spCisgICAgICAgIHJxID0gYmIucnVucXVldWUuUnVuUXVldWUoc2VsZiwgc2VsZi5kYXRhLCBzZWxmLnJlY2lwZWNhY2hlLCB0YXNrZGF0YSwgcnVubGlzdCkKKyAgICAgICAgcnEucnFkYXRhLnByZXBhcmUoKQorICAgICAgICByZXR1cm4gc2VsZi5idWlsZERlcGVuZFRyZWUocnEsIHRhc2tkYXRhKQorCisKKyAgICBkZWYgYnVpbGREZXBlbmRUcmVlKHNlbGYsIHJxLCB0YXNrZGF0YSk6CisgICAgICAgIHNlZW5fZm5pZHMgPSBbXQorICAgICAgICBkZXBlbmRfdHJlZSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJkZXBlbmRzIl0gPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsidGRlcGVuZHMiXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBuIl0gPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsicGFja2FnZXMiXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJyZGVwZW5kcy1wa2ciXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJycmVjcy1wa2ciXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJsYXllci1wcmlvcml0aWVzIl0gPSBzZWxmLnJlY2lwZWNhY2hlLmJiZmlsZV9jb25maWdfcHJpb3JpdGllcworCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4ocnEucnFkYXRhLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgdGFza25hbWUgPSBycS5ycWRhdGEucnVucV90YXNrW3Rhc2tdCisgICAgICAgICAgICBmbmlkID0gcnEucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXQorICAgICAgICAgICAgZm4gPSB0YXNrZGF0YS5mbl9pbmRleFtmbmlkXQorICAgICAgICAgICAgcG4gPSBzZWxmLnJlY2lwZWNhY2hlLnBrZ19mbltmbl0KKyAgICAgICAgICAgIHZlcnNpb24gID0gIiVzOiVzLSVzIiAlIHNlbGYucmVjaXBlY2FjaGUucGtnX3BlcHZwcltmbl0KKyAgICAgICAgICAgIGlmIHBuIG5vdCBpbiBkZXBlbmRfdHJlZVsicG4iXToKKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicG4iXVtwbl0gPSB7fQorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXVsiZmlsZW5hbWUiXSA9IGZuCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dWyJ2ZXJzaW9uIl0gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dWyJpbmhlcml0cyJdID0gc2VsZi5yZWNpcGVjYWNoZS5pbmhlcml0cy5nZXQoZm4sIE5vbmUpCisKKyAgICAgICAgICAgICAgICAjIGlmIHdlIGhhdmUgZXh0cmEgY2FjaGVzLCBsaXN0IGFsbCBhdHRyaWJ1dGVzIHRoZXkgYnJpbmcgaW4KKyAgICAgICAgICAgICAgICBleHRyYV9pbmZvID0gW10KKyAgICAgICAgICAgICAgICBmb3IgY2FjaGVfY2xhc3MgaW4gc2VsZi5jYWNoZXNfYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUoY2FjaGVfY2xhc3MpIGlzIHR5cGUgYW5kIGlzc3ViY2xhc3MoY2FjaGVfY2xhc3MsIGJiLmNhY2hlLlJlY2lwZUluZm9Db21tb24pIGFuZCBoYXNhdHRyKGNhY2hlX2NsYXNzLCAnY2FjaGVmaWVsZHMnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZmllbGRzID0gZ2V0YXR0cihjYWNoZV9jbGFzcywgJ2NhY2hlZmllbGRzJywgW10pCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9pbmZvID0gZXh0cmFfaW5mbyArIGNhY2hlZmllbGRzCisKKyAgICAgICAgICAgICAgICAjIGZvciBhbGwgYXR0cmlidXRlcyBzdG9yZWQsIGFkZCB0aGVtIHRvIHRoZSBkZXBlbmRlbmN5IHRyZWUKKyAgICAgICAgICAgICAgICBmb3IgZWkgaW4gZXh0cmFfaW5mbzoKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBuIl1bcG5dW2VpXSA9IHZhcnMoc2VsZi5yZWNpcGVjYWNoZSlbZWldW2ZuXQorCisKKyAgICAgICAgICAgIGZvciBkZXAgaW4gcnEucnFkYXRhLnJ1bnFfZGVwZW5kc1t0YXNrXToKKyAgICAgICAgICAgICAgICBkZXBmbiA9IHRhc2tkYXRhLmZuX2luZGV4W3JxLnJxZGF0YS5ydW5xX2ZuaWRbZGVwXV0KKyAgICAgICAgICAgICAgICBkZXBwbiA9IHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuW2RlcGZuXQorICAgICAgICAgICAgICAgIGRvdG5hbWUgPSAiJXMuJXMiICUgKHBuLCBycS5ycWRhdGEucnVucV90YXNrW3Rhc2tdKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkb3RuYW1lIGluIGRlcGVuZF90cmVlWyJ0ZGVwZW5kcyJdOgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsidGRlcGVuZHMiXVtkb3RuYW1lXSA9IFtdCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInRkZXBlbmRzIl1bZG90bmFtZV0uYXBwZW5kKCIlcy4lcyIgJSAoZGVwcG4sIHJxLnJxZGF0YS5ydW5xX3Rhc2tbZGVwXSkpCisgICAgICAgICAgICBpZiBmbmlkIG5vdCBpbiBzZWVuX2ZuaWRzOgorICAgICAgICAgICAgICAgIHNlZW5fZm5pZHMuYXBwZW5kKGZuaWQpCisgICAgICAgICAgICAgICAgcGFja2FnZXMgPSBbXQorCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbImRlcGVuZHMiXVtwbl0gPSBbXQorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gdGFza2RhdGEuZGVwaWRzW2ZuaWRdOgorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsiZGVwZW5kcyJdW3BuXS5hcHBlbmQodGFza2RhdGEuYnVpbGRfbmFtZXNfaW5kZXhbZGVwXSkKKworICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJyZGVwZW5kcy1wbiJdW3BuXSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIHJkZXAgaW4gdGFza2RhdGEucmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBuIl1bcG5dLmFwcGVuZCh0YXNrZGF0YS5ydW5fbmFtZXNfaW5kZXhbcmRlcF0pCisKKyAgICAgICAgICAgICAgICByZGVwZW5kcyA9IHNlbGYucmVjaXBlY2FjaGUucnVuZGVwc1tmbl0KKyAgICAgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiByZGVwZW5kczoKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBrZyJdW3BhY2thZ2VdID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHJkZXBlbmQgaW4gcmRlcGVuZHNbcGFja2FnZV06CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcGtnIl1bcGFja2FnZV0uYXBwZW5kKHJkZXBlbmQpCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLmFwcGVuZChwYWNrYWdlKQorCisgICAgICAgICAgICAgICAgcnJlY3MgPSBzZWxmLnJlY2lwZWNhY2hlLnJ1bnJlY3NbZm5dCisgICAgICAgICAgICAgICAgZm9yIHBhY2thZ2UgaW4gcnJlY3M6CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJycmVjcy1wa2ciXVtwYWNrYWdlXSA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciByZGVwZW5kIGluIHJyZWNzW3BhY2thZ2VdOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJyZWNzLXBrZyJdW3BhY2thZ2VdLmFwcGVuZChyZGVwZW5kKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGFja2FnZSBpbiBwYWNrYWdlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLmFwcGVuZChwYWNrYWdlKQorCisgICAgICAgICAgICAgICAgZm9yIHBhY2thZ2UgaW4gcGFja2FnZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHBhY2thZ2Ugbm90IGluIGRlcGVuZF90cmVlWyJwYWNrYWdlcyJdOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBhY2thZ2VzIl1bcGFja2FnZV0gPSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBhY2thZ2VzIl1bcGFja2FnZV1bInBuIl0gPSBwbgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBhY2thZ2VzIl1bcGFja2FnZV1bImZpbGVuYW1lIl0gPSBmbgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInBhY2thZ2VzIl1bcGFja2FnZV1bInZlcnNpb24iXSA9IHZlcnNpb24KKworICAgICAgICByZXR1cm4gZGVwZW5kX3RyZWUKKworICAgICMjIyMjIyMjIFdBUk5JTkcgOiB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGNhY2hlX2V4dHJhIHRvIGJlIGVuYWJsZWQgIyMjIyMjIyMKKyAgICBkZWYgZ2VuZXJhdGVQa2dEZXBUcmVlRGF0YShzZWxmLCBwa2dzX3RvX2J1aWxkLCB0YXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIGRlcGVuZGVuY3kgdHJlZSBvZiBwa2dzX3RvX2J1aWxkLCByZXR1cm5pbmcgdGhlIGRhdGEuCisgICAgICAgICIiIgorICAgICAgICBfLCB0YXNrZGF0YSA9IHNlbGYucHJlcGFyZVRyZWVEYXRhKHBrZ3NfdG9fYnVpbGQsIHRhc2spCisgICAgICAgIHRhc2tzX2ZuaWQgPSBbXQorICAgICAgICBpZiBsZW4odGFza2RhdGEudGFza3NfbmFtZSkgIT0gMDoKKyAgICAgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4odGFza2RhdGEudGFza3NfbmFtZSkpOgorICAgICAgICAgICAgICAgIHRhc2tzX2ZuaWQuYXBwZW5kKHRhc2tkYXRhLnRhc2tzX2ZuaWRbdGFza10pCisKKyAgICAgICAgc2Vlbl9mbmlkcyA9IFtdCisgICAgICAgIGRlcGVuZF90cmVlID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbImRlcGVuZHMiXSA9IHt9CisgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdID0ge30KKyAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBuIl0gPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcGtnIl0gPSB7fQorICAgICAgICBkZXBlbmRfdHJlZVsicnJlY3MtcGtnIl0gPSB7fQorCisgICAgICAgICMgaWYgd2UgaGF2ZSBleHRyYSBjYWNoZXMsIGxpc3QgYWxsIGF0dHJpYnV0ZXMgdGhleSBicmluZyBpbgorICAgICAgICBleHRyYV9pbmZvID0gW10KKyAgICAgICAgZm9yIGNhY2hlX2NsYXNzIGluIHNlbGYuY2FjaGVzX2FycmF5OgorICAgICAgICAgICAgaWYgdHlwZShjYWNoZV9jbGFzcykgaXMgdHlwZSBhbmQgaXNzdWJjbGFzcyhjYWNoZV9jbGFzcywgYmIuY2FjaGUuUmVjaXBlSW5mb0NvbW1vbikgYW5kIGhhc2F0dHIoY2FjaGVfY2xhc3MsICdjYWNoZWZpZWxkcycpOgorICAgICAgICAgICAgICAgIGNhY2hlZmllbGRzID0gZ2V0YXR0cihjYWNoZV9jbGFzcywgJ2NhY2hlZmllbGRzJywgW10pCisgICAgICAgICAgICAgICAgZXh0cmFfaW5mbyA9IGV4dHJhX2luZm8gKyBjYWNoZWZpZWxkcworCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4odGFza3NfZm5pZCkpOgorICAgICAgICAgICAgZm5pZCA9IHRhc2tzX2ZuaWRbdGFza10KKyAgICAgICAgICAgIGZuID0gdGFza2RhdGEuZm5faW5kZXhbZm5pZF0KKyAgICAgICAgICAgIHBuID0gc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm5bZm5dCisKKyAgICAgICAgICAgIGlmIHBuIG5vdCBpbiBkZXBlbmRfdHJlZVsicG4iXToKKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicG4iXVtwbl0gPSB7fQorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXVsiZmlsZW5hbWUiXSA9IGZuCisgICAgICAgICAgICAgICAgdmVyc2lvbiAgPSAiJXM6JXMtJXMiICUgc2VsZi5yZWNpcGVjYWNoZS5wa2dfcGVwdnByW2ZuXQorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXVsidmVyc2lvbiJdID0gdmVyc2lvbgorICAgICAgICAgICAgICAgIHJkZXBlbmRzID0gc2VsZi5yZWNpcGVjYWNoZS5ydW5kZXBzW2ZuXQorICAgICAgICAgICAgICAgIHJyZWNzID0gc2VsZi5yZWNpcGVjYWNoZS5ydW5yZWNzW2ZuXQorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXVsiaW5oZXJpdHMiXSA9IHNlbGYucmVjaXBlY2FjaGUuaW5oZXJpdHMuZ2V0KGZuLCBOb25lKQorCisgICAgICAgICAgICAgICAgIyBmb3IgYWxsIGV4dHJhIGF0dHJpYnV0ZXMgc3RvcmVkLCBhZGQgdGhlbSB0byB0aGUgZGVwZW5kZW5jeSB0cmVlCisgICAgICAgICAgICAgICAgZm9yIGVpIGluIGV4dHJhX2luZm86CisgICAgICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJwbiJdW3BuXVtlaV0gPSB2YXJzKHNlbGYucmVjaXBlY2FjaGUpW2VpXVtmbl0KKworICAgICAgICAgICAgaWYgZm5pZCBub3QgaW4gc2Vlbl9mbmlkczoKKyAgICAgICAgICAgICAgICBzZWVuX2ZuaWRzLmFwcGVuZChmbmlkKQorCisgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbImRlcGVuZHMiXVtwbl0gPSBbXQorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gdGFza2RhdGEuZGVwaWRzW2ZuaWRdOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gdGFza2RhdGEuYnVpbGRfbmFtZXNfaW5kZXhbZGVwXQorICAgICAgICAgICAgICAgICAgICBwbl9wcm92aWRlciA9ICIiCisgICAgICAgICAgICAgICAgICAgIHRhcmdldGlkID0gdGFza2RhdGEuZ2V0YnVpbGRfaWQoaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFyZ2V0aWQgaW4gdGFza2RhdGEuYnVpbGRfdGFyZ2V0cyBhbmQgdGFza2RhdGEuYnVpbGRfdGFyZ2V0c1t0YXJnZXRpZF06CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRhc2tkYXRhLmJ1aWxkX3RhcmdldHNbdGFyZ2V0aWRdWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBmbl9wcm92aWRlciA9IHRhc2tkYXRhLmZuX2luZGV4W2lkXQorICAgICAgICAgICAgICAgICAgICAgICAgcG5fcHJvdmlkZXIgPSBzZWxmLnJlY2lwZWNhY2hlLnBrZ19mbltmbl9wcm92aWRlcl0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuX3Byb3ZpZGVyID0gaXRlbQorICAgICAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsiZGVwZW5kcyJdW3BuXS5hcHBlbmQocG5fcHJvdmlkZXIpCisKKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcG4iXVtwbl0gPSBbXQorICAgICAgICAgICAgICAgIGZvciByZGVwIGluIHRhc2tkYXRhLnJkZXBpZHNbZm5pZF06CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSB0YXNrZGF0YS5ydW5fbmFtZXNfaW5kZXhbcmRlcF0KKyAgICAgICAgICAgICAgICAgICAgcG5fcnByb3ZpZGVyID0gIiIKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0aWQgPSB0YXNrZGF0YS5nZXRydW5faWQoaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFyZ2V0aWQgaW4gdGFza2RhdGEucnVuX3RhcmdldHMgYW5kIHRhc2tkYXRhLnJ1bl90YXJnZXRzW3RhcmdldGlkXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gdGFza2RhdGEucnVuX3RhcmdldHNbdGFyZ2V0aWRdWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBmbl9ycHJvdmlkZXIgPSB0YXNrZGF0YS5mbl9pbmRleFtpZF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBuX3Jwcm92aWRlciA9IHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuW2ZuX3Jwcm92aWRlcl0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuX3Jwcm92aWRlciA9IGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kX3RyZWVbInJkZXBlbmRzLXBuIl1bcG5dLmFwcGVuZChwbl9ycHJvdmlkZXIpCisKKyAgICAgICAgICAgICAgICBkZXBlbmRfdHJlZVsicmRlcGVuZHMtcGtnIl0udXBkYXRlKHJkZXBlbmRzKQorICAgICAgICAgICAgICAgIGRlcGVuZF90cmVlWyJycmVjcy1wa2ciXS51cGRhdGUocnJlY3MpCisKKyAgICAgICAgcmV0dXJuIGRlcGVuZF90cmVlCisKKyAgICBkZWYgZ2VuZXJhdGVEZXBUcmVlRXZlbnQoc2VsZiwgcGtnc190b19idWlsZCwgdGFzayk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSB0YXNrIGRlcGVuZGVuY3kgZ3JhcGggb2YgcGtnc190b19idWlsZC4KKyAgICAgICAgR2VuZXJhdGUgYW4gZXZlbnQgd2l0aCB0aGUgcmVzdWx0CisgICAgICAgICIiIgorICAgICAgICBkZXBncmFwaCA9IHNlbGYuZ2VuZXJhdGVUYXNrRGVwVHJlZURhdGEocGtnc190b19idWlsZCwgdGFzaykKKyAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5EZXBUcmVlR2VuZXJhdGVkKGRlcGdyYXBoKSwgc2VsZi5kYXRhKQorCisgICAgZGVmIGdlbmVyYXRlRG90R3JhcGhGaWxlcyhzZWxmLCBwa2dzX3RvX2J1aWxkLCB0YXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIHRhc2sgZGVwZW5kZW5jeSBncmFwaCBvZiBwa2dzX3RvX2J1aWxkLgorICAgICAgICBTYXZlIHRoZSByZXN1bHQgdG8gYSBzZXQgb2YgLmRvdCBmaWxlcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZGVwZ3JhcGggPSBzZWxmLmdlbmVyYXRlVGFza0RlcFRyZWVEYXRhKHBrZ3NfdG9fYnVpbGQsIHRhc2spCisKKyAgICAgICAgIyBQcmludHMgYSBmbGF0dGVuZWQgZm9ybSBvZiBwYWNrYWdlLWRlcGVuZHMgYmVsb3cgd2hlcmUgc3VicGFja2FnZXMgb2YgYSBwYWNrYWdlIGFyZSBtZXJnZWQgaW50byB0aGUgbWFpbiBwbgorICAgICAgICBkZXBlbmRzX2ZpbGUgPSBmaWxlKCdwbi1kZXBlbmRzLmRvdCcsICd3JyApCisgICAgICAgIGJ1aWxkbGlzdF9maWxlID0gZmlsZSgncG4tYnVpbGRsaXN0JywgJ3cnICkKKyAgICAgICAgcHJpbnQoImRpZ3JhcGggZGVwZW5kcyB7IiwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIGZvciBwbiBpbiBkZXBncmFwaFsicG4iXToKKyAgICAgICAgICAgIGZuID0gZGVwZ3JhcGhbInBuIl1bcG5dWyJmaWxlbmFtZSJdCisgICAgICAgICAgICB2ZXJzaW9uID0gZGVwZ3JhcGhbInBuIl1bcG5dWyJ2ZXJzaW9uIl0KKyAgICAgICAgICAgIHByaW50KCciJXMiIFtsYWJlbD0iJXMgJXNcXG4lcyJdJyAlIChwbiwgcG4sIHZlcnNpb24sIGZuKSwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgICAgICBwcmludCgiJXMiICUgcG4sIGZpbGU9YnVpbGRsaXN0X2ZpbGUpCisgICAgICAgIGJ1aWxkbGlzdF9maWxlLmNsb3NlKCkKKyAgICAgICAgbG9nZ2VyLmluZm8oIlBOIGJ1aWxkIGxpc3Qgc2F2ZWQgdG8gJ3BuLWJ1aWxkbGlzdCciKQorICAgICAgICBmb3IgcG4gaW4gZGVwZ3JhcGhbImRlcGVuZHMiXToKKyAgICAgICAgICAgIGZvciBkZXBlbmQgaW4gZGVwZ3JhcGhbImRlcGVuZHMiXVtwbl06CisgICAgICAgICAgICAgICAgcHJpbnQoJyIlcyIgLT4gIiVzIicgJSAocG4sIGRlcGVuZCksIGZpbGU9ZGVwZW5kc19maWxlKQorICAgICAgICBmb3IgcG4gaW4gZGVwZ3JhcGhbInJkZXBlbmRzLXBuIl06CisgICAgICAgICAgICBmb3IgcmRlcGVuZCBpbiBkZXBncmFwaFsicmRlcGVuZHMtcG4iXVtwbl06CisgICAgICAgICAgICAgICAgcHJpbnQoJyIlcyIgLT4gIiVzIiBbc3R5bGU9ZGFzaGVkXScgJSAocG4sIHJkZXBlbmQpLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgcHJpbnQoIn0iLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgbG9nZ2VyLmluZm8oIlBOIGRlcGVuZGVuY2llcyBzYXZlZCB0byAncG4tZGVwZW5kcy5kb3QnIikKKworICAgICAgICBkZXBlbmRzX2ZpbGUgPSBmaWxlKCdwYWNrYWdlLWRlcGVuZHMuZG90JywgJ3cnICkKKyAgICAgICAgcHJpbnQoImRpZ3JhcGggZGVwZW5kcyB7IiwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIGZvciBwYWNrYWdlIGluIGRlcGdyYXBoWyJwYWNrYWdlcyJdOgorICAgICAgICAgICAgcG4gPSBkZXBncmFwaFsicGFja2FnZXMiXVtwYWNrYWdlXVsicG4iXQorICAgICAgICAgICAgZm4gPSBkZXBncmFwaFsicGFja2FnZXMiXVtwYWNrYWdlXVsiZmlsZW5hbWUiXQorICAgICAgICAgICAgdmVyc2lvbiA9IGRlcGdyYXBoWyJwYWNrYWdlcyJdW3BhY2thZ2VdWyJ2ZXJzaW9uIl0KKyAgICAgICAgICAgIGlmIHBhY2thZ2UgPT0gcG46CisgICAgICAgICAgICAgICAgcHJpbnQoJyIlcyIgW2xhYmVsPSIlcyAlc1xcbiVzIl0nICUgKHBuLCBwbiwgdmVyc2lvbiwgZm4pLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoJyIlcyIgW2xhYmVsPSIlcyglcykgJXNcXG4lcyJdJyAlIChwYWNrYWdlLCBwYWNrYWdlLCBwbiwgdmVyc2lvbiwgZm4pLCBmaWxlPWRlcGVuZHNfZmlsZSkKKyAgICAgICAgICAgIGZvciBkZXBlbmQgaW4gZGVwZ3JhcGhbImRlcGVuZHMiXVtwbl06CisgICAgICAgICAgICAgICAgcHJpbnQoJyIlcyIgLT4gIiVzIicgJSAocGFja2FnZSwgZGVwZW5kKSwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIGZvciBwYWNrYWdlIGluIGRlcGdyYXBoWyJyZGVwZW5kcy1wa2ciXToKKyAgICAgICAgICAgIGZvciByZGVwZW5kIGluIGRlcGdyYXBoWyJyZGVwZW5kcy1wa2ciXVtwYWNrYWdlXToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiAtPiAiJXMiIFtzdHlsZT1kYXNoZWRdJyAlIChwYWNrYWdlLCByZGVwZW5kKSwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIGZvciBwYWNrYWdlIGluIGRlcGdyYXBoWyJycmVjcy1wa2ciXToKKyAgICAgICAgICAgIGZvciByZGVwZW5kIGluIGRlcGdyYXBoWyJycmVjcy1wa2ciXVtwYWNrYWdlXToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiAtPiAiJXMiIFtzdHlsZT1kYXNoZWRdJyAlIChwYWNrYWdlLCByZGVwZW5kKSwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIHByaW50KCJ9IiwgZmlsZT1kZXBlbmRzX2ZpbGUpCisgICAgICAgIGxvZ2dlci5pbmZvKCJQYWNrYWdlIGRlcGVuZGVuY2llcyBzYXZlZCB0byAncGFja2FnZS1kZXBlbmRzLmRvdCciKQorCisgICAgICAgIHRkZXBlbmRzX2ZpbGUgPSBmaWxlKCd0YXNrLWRlcGVuZHMuZG90JywgJ3cnICkKKyAgICAgICAgcHJpbnQoImRpZ3JhcGggZGVwZW5kcyB7IiwgZmlsZT10ZGVwZW5kc19maWxlKQorICAgICAgICBmb3IgdGFzayBpbiBkZXBncmFwaFsidGRlcGVuZHMiXToKKyAgICAgICAgICAgIChwbiwgdGFza25hbWUpID0gdGFzay5yc3BsaXQoIi4iLCAxKQorICAgICAgICAgICAgZm4gPSBkZXBncmFwaFsicG4iXVtwbl1bImZpbGVuYW1lIl0KKyAgICAgICAgICAgIHZlcnNpb24gPSBkZXBncmFwaFsicG4iXVtwbl1bInZlcnNpb24iXQorICAgICAgICAgICAgcHJpbnQoJyIlcy4lcyIgW2xhYmVsPSIlcyAlc1xcbiVzXFxuJXMiXScgJSAocG4sIHRhc2tuYW1lLCBwbiwgdGFza25hbWUsIHZlcnNpb24sIGZuKSwgZmlsZT10ZGVwZW5kc19maWxlKQorICAgICAgICAgICAgZm9yIGRlcCBpbiBkZXBncmFwaFsidGRlcGVuZHMiXVt0YXNrXToKKyAgICAgICAgICAgICAgICBwcmludCgnIiVzIiAtPiAiJXMiJyAlICh0YXNrLCBkZXApLCBmaWxlPXRkZXBlbmRzX2ZpbGUpCisgICAgICAgIHByaW50KCJ9IiwgZmlsZT10ZGVwZW5kc19maWxlKQorICAgICAgICBsb2dnZXIuaW5mbygiVGFzayBkZXBlbmRlbmNpZXMgc2F2ZWQgdG8gJ3Rhc2stZGVwZW5kcy5kb3QnIikKKworICAgIGRlZiBzaG93X2FwcGVuZHNfd2l0aF9ub19yZWNpcGVzKHNlbGYpOgorICAgICAgICAjIERldGVybWluZSB3aGljaCBiYmFwcGVuZHMgaGF2ZW4ndCBiZWVuIGFwcGxpZWQKKworICAgICAgICAjIEZpcnN0IGdldCBsaXN0IG9mIHJlY2lwZXMsIGluY2x1ZGluZyBza2lwcGVkCisgICAgICAgIHJlY2lwZWZucyA9IHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuLmtleXMoKQorICAgICAgICByZWNpcGVmbnMuZXh0ZW5kKHNlbGYuc2tpcGxpc3Qua2V5cygpKQorCisgICAgICAgICMgV29yayBvdXQgbGlzdCBvZiBiYmFwcGVuZHMgdGhhdCBoYXZlIGJlZW4gYXBwbGllZAorICAgICAgICBhcHBsaWVkX2FwcGVuZHMgPSBbXQorICAgICAgICBmb3IgZm4gaW4gcmVjaXBlZm5zOgorICAgICAgICAgICAgYXBwbGllZF9hcHBlbmRzLmV4dGVuZChzZWxmLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmbikpCisKKyAgICAgICAgYXBwZW5kc193aXRob3V0X3JlY2lwZXMgPSBbXQorICAgICAgICBmb3IgXywgYXBwZW5kZm4gaW4gc2VsZi5jb2xsZWN0aW9uLmJiYXBwZW5kczoKKyAgICAgICAgICAgIGlmIG5vdCBhcHBlbmRmbiBpbiBhcHBsaWVkX2FwcGVuZHM6CisgICAgICAgICAgICAgICAgYXBwZW5kc193aXRob3V0X3JlY2lwZXMuYXBwZW5kKGFwcGVuZGZuKQorCisgICAgICAgIGlmIGFwcGVuZHNfd2l0aG91dF9yZWNpcGVzOgorICAgICAgICAgICAgbXNnID0gJ05vIHJlY2lwZXMgYXZhaWxhYmxlIGZvcjpcbiAgJXMnICUgJ1xuICAnLmpvaW4oYXBwZW5kc193aXRob3V0X3JlY2lwZXMpCisgICAgICAgICAgICB3YXJuX29ubHkgPSBzZWxmLmRhdGEuZ2V0VmFyKCJCQl9EQU5HTElOR0FQUEVORFNfV0FSTk9OTFkiLCBcCisgICAgICAgICAgICAgICAgIEZhbHNlKSBvciAibm8iCisgICAgICAgICAgICBpZiB3YXJuX29ubHkubG93ZXIoKSBpbiAoIjEiLCAieWVzIiwgInRydWUiKToKKyAgICAgICAgICAgICAgICBiYi53YXJuKG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmIuZmF0YWwobXNnKQorCisgICAgZGVmIGhhbmRsZVByZWZQcm92aWRlcnMoc2VsZik6CisKKyAgICAgICAgbG9jYWxkYXRhID0gZGF0YS5jcmVhdGVDb3B5KHNlbGYuZGF0YSkKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShsb2NhbGRhdGEpCisgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhsb2NhbGRhdGEpCisKKyAgICAgICAgIyBIYW5kbGUgUFJFRkVSUkVEX1BST1ZJREVSUworICAgICAgICBmb3IgcCBpbiAobG9jYWxkYXRhLmdldFZhcignUFJFRkVSUkVEX1BST1ZJREVSUycsIFRydWUpIG9yICIiKS5zcGxpdCgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIChwcm92aWRlZSwgcHJvdmlkZXIpID0gcC5zcGxpdCgnOicpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJvdmlkZXJsb2cuY3JpdGljYWwoIk1hbGZvcm1lZCBvcHRpb24gaW4gUFJFRkVSUkVEX1BST1ZJREVSUyB2YXJpYWJsZTogJXMiICUgcCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgcHJvdmlkZWUgaW4gc2VsZi5yZWNpcGVjYWNoZS5wcmVmZXJyZWQgYW5kIHNlbGYucmVjaXBlY2FjaGUucHJlZmVycmVkW3Byb3ZpZGVlXSAhPSBwcm92aWRlcjoKKyAgICAgICAgICAgICAgICBwcm92aWRlcmxvZy5lcnJvcigiY29uZmxpY3RpbmcgcHJlZmVyZW5jZXMgZm9yICVzOiBib3RoICVzIGFuZCAlcyBzcGVjaWZpZWQiLCBwcm92aWRlZSwgcHJvdmlkZXIsIHNlbGYucmVjaXBlY2FjaGUucHJlZmVycmVkW3Byb3ZpZGVlXSkKKyAgICAgICAgICAgIHNlbGYucmVjaXBlY2FjaGUucHJlZmVycmVkW3Byb3ZpZGVlXSA9IHByb3ZpZGVyCisKKyAgICBkZWYgZmluZENvcmVCYXNlRmlsZXMoc2VsZiwgc3ViZGlyLCBjb25maWdmaWxlKToKKyAgICAgICAgY29yZWJhc2UgPSBzZWxmLmRhdGEuZ2V0VmFyKCdDT1JFQkFTRScsIFRydWUpIG9yICIiCisgICAgICAgIHBhdGhzID0gW10KKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoY29yZWJhc2UgKyAnLycgKyBzdWJkaXIpOgorICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKKyAgICAgICAgICAgICAgICBjb25maWdmaWxlcGF0aCA9IG9zLnBhdGguam9pbihyb290LCBkLCBjb25maWdmaWxlKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmZpZ2ZpbGVwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgcGF0aHMuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBkKSkKKworICAgICAgICBpZiBwYXRoczoKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQ29yZUJhc2VGaWxlc0ZvdW5kKHBhdGhzKSwgc2VsZi5kYXRhKQorCisgICAgZGVmIGZpbmRDb25maWdGaWxlUGF0aChzZWxmLCBjb25maWdmaWxlKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgdGhlIGxvY2F0aW9uIG9uIGRpc2sgb2YgY29uZmlnZmlsZSBhbmQgaWYgaXQgZXhpc3RzIGFuZCB3YXMgcGFyc2VkIGJ5IEJpdEJha2UKKyAgICAgICAgZW1pdCB0aGUgQ29uZmlnRmlsZVBhdGhGb3VuZCBldmVudCB3aXRoIHRoZSBwYXRoIHRvIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgcGF0aCA9IGJiLmNvb2tlcmRhdGEuZmluZENvbmZpZ0ZpbGUoY29uZmlnZmlsZSwgc2VsZi5kYXRhKQorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgR2VuZXJhdGUgYSBsaXN0IG9mIHBhcnNlZCBjb25maWd1cmF0aW9uIGZpbGVzIGJ5IHNlYXJjaGluZyB0aGUgZmlsZXMKKyAgICAgICAgIyBsaXN0ZWQgaW4gdGhlIF9fZGVwZW5kcyBhbmQgX19iYXNlX2RlcGVuZHMgdmFyaWFibGVzIHdpdGggYSAuY29uZiBzdWZmaXguCisgICAgICAgIGNvbmZmaWxlcyA9IFtdCisgICAgICAgIGRlcF9maWxlcyA9IHNlbGYuZGF0YS5nZXRWYXIoJ19fYmFzZV9kZXBlbmRzJywgRmFsc2UpIG9yIFtdCisgICAgICAgIGRlcF9maWxlcyA9IGRlcF9maWxlcyArIChzZWxmLmRhdGEuZ2V0VmFyKCdfX2RlcGVuZHMnLCBGYWxzZSkgb3IgW10pCisKKyAgICAgICAgZm9yIGYgaW4gZGVwX2ZpbGVzOgorICAgICAgICAgICAgaWYgZlswXS5lbmRzd2l0aCgiLmNvbmYiKToKKyAgICAgICAgICAgICAgICBjb25mZmlsZXMuYXBwZW5kKGZbMF0pCisKKyAgICAgICAgXywgY29uZiwgY29uZmZpbGUgPSBwYXRoLnJwYXJ0aXRpb24oImNvbmYvIikKKyAgICAgICAgbWF0Y2ggPSBvcy5wYXRoLmpvaW4oY29uZiwgY29uZmZpbGUpCisgICAgICAgICMgVHJ5IGFuZCBmaW5kIG1hdGNoZXMgZm9yIGNvbmYvY29uZmZpbGVuYW1lLmNvbmYgYXMgd2UgZG9uJ3QgYWx3YXlzCisgICAgICAgICMgaGF2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlLgorICAgICAgICBmb3IgY2ZnIGluIGNvbmZmaWxlczoKKyAgICAgICAgICAgIGlmIGNmZy5lbmRzd2l0aChtYXRjaCk6CisgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5Db25maWdGaWxlUGF0aEZvdW5kKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgZmluZEZpbGVzTWF0Y2hpbmdJbkRpcihzZWxmLCBmaWxlcGF0dGVybiwgZGlyZWN0b3J5KToKKyAgICAgICAgIiIiCisgICAgICAgIFNlYXJjaGVzIGZvciBmaWxlcyBtYXRjaGluZyB0aGUgcmVnZXggJ3BhdHRlcm4nIHdoaWNoIGFyZSBjaGlsZHJlbiBvZgorICAgICAgICAnZGlyZWN0b3J5JyBpbiBlYWNoIEJCUEFUSC4gaS5lLiB0byBmaW5kIGFsbCByb290ZnMgcGFja2FnZSBjbGFzc2VzIGF2YWlsYWJsZQorICAgICAgICB0byBCaXRCYWtlIG9uZSBjb3VsZCBjYWxsIGZpbmRGaWxlc01hdGNoaW5nSW5EaXIoc2VsZiwgJ3Jvb3Rmc18nLCAnY2xhc3NlcycpCisgICAgICAgIG9yIHRvIGZpbmQgYWxsIG1hY2hpbmUgY29uZmlndXJhdGlvbiBmaWxlcyBvbmUgY291bGQgY2FsbDoKKyAgICAgICAgZmluZEZpbGVzTWF0Y2hpbmdJbkRpcihzZWxmLCAnY29uZi9tYWNoaW5lcycsICdjb25mJykKKyAgICAgICAgIiIiCisKKyAgICAgICAgbWF0Y2hlcyA9IFtdCisgICAgICAgIHAgPSByZS5jb21waWxlKHJlLmVzY2FwZShmaWxlcGF0dGVybikpCisgICAgICAgIGJicGF0aHMgPSBzZWxmLmRhdGEuZ2V0VmFyKCdCQlBBVEgnLCBUcnVlKS5zcGxpdCgnOicpCisgICAgICAgIGZvciBwYXRoIGluIGJicGF0aHM6CisgICAgICAgICAgICBkaXJwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGRpcmVjdG9yeSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpcnBhdGgpOgorICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGRpcnBhdGgpOgorICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAuc2VhcmNoKGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKGYpCisKKyAgICAgICAgaWYgbWF0Y2hlczoKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuRmlsZXNNYXRjaGluZ0ZvdW5kKGZpbGVwYXR0ZXJuLCBtYXRjaGVzKSwgc2VsZi5kYXRhKQorCisgICAgZGVmIGZpbmRDb25maWdGaWxlcyhzZWxmLCB2YXJuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgY29uZmlnIGZpbGVzIHdoaWNoIGFyZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHZhcm5hbWUuCisgICAgICAgIGkuZS4gTUFDSElORSwgRElTVFJPCisgICAgICAgICIiIgorICAgICAgICBwb3NzaWJsZSA9IFtdCisgICAgICAgIHZhciA9IHZhcm5hbWUubG93ZXIoKQorCisgICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKKyAgICAgICAgIyBpdGVyYXRlIGNvbmZpZ3MKKyAgICAgICAgYmJwYXRocyA9IGRhdGEuZ2V0VmFyKCdCQlBBVEgnLCBUcnVlKS5zcGxpdCgnOicpCisgICAgICAgIGZvciBwYXRoIGluIGJicGF0aHM6CisgICAgICAgICAgICBjb25mcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiY29uZiIsIHZhcikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmZwYXRoKToKKyAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayhjb25mcGF0aCk6CisgICAgICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBjaGlsZCBmaWxlcywgdGhlc2UgYXJlIGFwcHJvcHJpYXRlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgc2VwLCBlbmQgPSBmLnJwYXJ0aXRpb24oJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW5kID09ICdjb25mJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS5hcHBlbmQodmFsKQorCisgICAgICAgIGlmIHBvc3NpYmxlOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5Db25maWdGaWxlc0ZvdW5kKHZhciwgcG9zc2libGUpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgZmluZEluaGVyaXRzQ2xhc3Moc2VsZiwga2xhc3MpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCBhbGwgcmVjaXBlcyB3aGljaCBpbmhlcml0IHRoZSBzcGVjaWZpZWQgY2xhc3MKKyAgICAgICAgIiIiCisgICAgICAgIHBrZ19saXN0ID0gW10KKworICAgICAgICBmb3IgcGZuIGluIHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuOgorICAgICAgICAgICAgaW5oZXJpdHMgPSBzZWxmLnJlY2lwZWNhY2hlLmluaGVyaXRzLmdldChwZm4sIE5vbmUpCisgICAgICAgICAgICBpZiBpbmhlcml0cyBhbmQgaW5oZXJpdHMuY291bnQoa2xhc3MpID4gMDoKKyAgICAgICAgICAgICAgICBwa2dfbGlzdC5hcHBlbmQoc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm5bcGZuXSkKKworICAgICAgICByZXR1cm4gcGtnX2xpc3QKKworICAgIGRlZiBnZW5lcmF0ZVRhcmdldHNUcmVlKHNlbGYsIGtsYXNzPU5vbmUsIHBrZ3M9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBHZW5lcmF0ZSBhIGRlcGVuZGVuY3kgdHJlZSBvZiBidWlsZGFibGUgdGFyZ2V0cworICAgICAgICBHZW5lcmF0ZSBhbiBldmVudCB3aXRoIHRoZSByZXN1bHQKKyAgICAgICAgIiIiCisgICAgICAgICMgaWYgdGhlIGNhbGxlciBoYXNuJ3Qgc3BlY2lmaWVkIGEgcGtncyBsaXN0IGRlZmF1bHQgdG8gdW5pdmVyc2UKKyAgICAgICAgaWYgbm90IHBrZ3M6CisgICAgICAgICAgICBwa2dzID0gWyd1bml2ZXJzZSddCisgICAgICAgICMgaWYgaW5oZXJpdGVkX2NsYXNzIHBhc3NlZCBlbnN1cmUgYWxsIHJlY2lwZXMgd2hpY2ggaW5oZXJpdCB0aGUKKyAgICAgICAgIyBzcGVjaWZpZWQgY2xhc3MgYXJlIGluY2x1ZGVkIGluIHBrZ3MKKyAgICAgICAgaWYga2xhc3M6CisgICAgICAgICAgICBleHRyYV9wa2dzID0gc2VsZi5maW5kSW5oZXJpdHNDbGFzcyhrbGFzcykKKyAgICAgICAgICAgIHBrZ3MgPSBwa2dzICsgZXh0cmFfcGtncworCisgICAgICAgICMgZ2VuZXJhdGUgYSBkZXBlbmRlbmN5IHRyZWUgZm9yIGFsbCBvdXIgcGFja2FnZXMKKyAgICAgICAgdHJlZSA9IHNlbGYuZ2VuZXJhdGVQa2dEZXBUcmVlRGF0YShwa2dzLCAnYnVpbGQnKQorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LlRhcmdldHNUcmVlR2VuZXJhdGVkKHRyZWUpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgYnVpbGRXb3JsZFRhcmdldExpc3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICAgQnVpbGQgcGFja2FnZSBsaXN0IGZvciAiYml0YmFrZSB3b3JsZCIKKyAgICAgICAgIiIiCisgICAgICAgIHBhcnNlbG9nLmRlYnVnKDEsICJjb2xsYXRpbmcgcGFja2FnZXMgZm9yIFwid29ybGRcIiIpCisgICAgICAgIGZvciBmIGluIHNlbGYucmVjaXBlY2FjaGUucG9zc2libGVfd29ybGQ6CisgICAgICAgICAgICB0ZXJtaW5hbCA9IFRydWUKKyAgICAgICAgICAgIHBuID0gc2VsZi5yZWNpcGVjYWNoZS5wa2dfZm5bZl0KKworICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5yZWNpcGVjYWNoZS5wbl9wcm92aWRlc1twbl06CisgICAgICAgICAgICAgICAgaWYgcC5zdGFydHN3aXRoKCd2aXJ0dWFsLycpOgorICAgICAgICAgICAgICAgICAgICBwYXJzZWxvZy5kZWJ1ZygyLCAiV29ybGQgYnVpbGQgc2tpcHBpbmcgJXMgZHVlIHRvICVzIHByb3ZpZGVyIHN0YXJ0aW5nIHdpdGggdmlydHVhbC8iLCBmLCBwKQorICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZm9yIHBmIGluIHNlbGYucmVjaXBlY2FjaGUucHJvdmlkZXJzW3BdOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnJlY2lwZWNhY2hlLnBrZ19mbltwZl0gIT0gcG46CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWxvZy5kZWJ1ZygyLCAiV29ybGQgYnVpbGQgc2tpcHBpbmcgJXMgZHVlIHRvIGJvdGggdXMgYW5kICVzIHByb3ZpZGluZyAlcyIsIGYsIHBmLCBwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWwgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHRlcm1pbmFsOgorICAgICAgICAgICAgICAgIHNlbGYucmVjaXBlY2FjaGUud29ybGRfdGFyZ2V0LmFkZChwbikKKworICAgIGRlZiBpbnRlcmFjdGl2ZU1vZGUoIHNlbGYgKToKKyAgICAgICAgIiIiRHJvcCBvZmYgaW50byBhIHNoZWxsIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gYmIgaW1wb3J0IHNoZWxsCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhcnNlbG9nLmV4Y2VwdGlvbigiSW50ZXJhY3RpdmUgbW9kZSBub3QgYXZhaWxhYmxlIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaGVsbC5zdGFydCggc2VsZiApCisKKworICAgIGRlZiBoYW5kbGVDb2xsZWN0aW9ucyggc2VsZiwgY29sbGVjdGlvbnMgKToKKyAgICAgICAgIiIiSGFuZGxlIGNvbGxlY3Rpb25zIiIiCisgICAgICAgIGVycm9ycyA9IEZhbHNlCisgICAgICAgIHNlbGYucmVjaXBlY2FjaGUuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzID0gW10KKyAgICAgICAgaWYgY29sbGVjdGlvbnM6CisgICAgICAgICAgICBjb2xsZWN0aW9uX3ByaW9yaXRpZXMgPSB7fQorICAgICAgICAgICAgY29sbGVjdGlvbl9kZXBlbmRzID0ge30KKyAgICAgICAgICAgIGNvbGxlY3Rpb25fbGlzdCA9IGNvbGxlY3Rpb25zLnNwbGl0KCkKKyAgICAgICAgICAgIG1pbl9wcmlvID0gMAorICAgICAgICAgICAgZm9yIGMgaW4gY29sbGVjdGlvbl9saXN0OgorICAgICAgICAgICAgICAgICMgR2V0IGNvbGxlY3Rpb24gcHJpb3JpdHkgaWYgZGVmaW5lZCBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBzZWxmLmRhdGEuZ2V0VmFyKCJCQkZJTEVfUFJJT1JJVFlfJXMiICUgYywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiBwcmlvcml0eToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbyA9IGludChwcmlvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWxvZy5lcnJvcigiaW52YWxpZCB2YWx1ZSBmb3IgQkJGSUxFX1BSSU9SSVRZXyVzOiBcIiVzXCIiLCBjLCBwcmlvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgbWluX3ByaW8gPT0gMCBvciBwcmlvIDwgbWluX3ByaW86CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcHJpbyA9IHByaW8KKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9wcmlvcml0aWVzW2NdID0gcHJpbworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25fcHJpb3JpdGllc1tjXSA9IE5vbmUKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgZGVwZW5kZW5jaWVzIGFuZCBzdG9yZSBpbmZvcm1hdGlvbiBmb3IgcHJpb3JpdHkgY2FsY3VsYXRpb24KKyAgICAgICAgICAgICAgICBkZXBzID0gc2VsZi5kYXRhLmdldFZhcigiTEFZRVJERVBFTkRTXyVzIiAlIGMsIFRydWUpCisgICAgICAgICAgICAgICAgaWYgZGVwczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwbGlzdCA9IGJiLnV0aWxzLmV4cGxvZGVfZGVwX3ZlcnNpb25zMihkZXBzKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgYmIudXRpbHMuVmVyc2lvblN0cmluZ0V4Y2VwdGlvbiBhcyB2c2U6CisgICAgICAgICAgICAgICAgICAgICAgICBiYi5mYXRhbCgnRXJyb3IgcGFyc2luZyBMQVlFUkRFUEVORFNfJXM6ICVzJyAlIChjLCBzdHIodnNlKSkpCisgICAgICAgICAgICAgICAgICAgIGZvciBkZXAsIG9wbGlzdCBpbiBkZXBsaXN0Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVwIGluIGNvbGxlY3Rpb25fbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igb3BzdHIgaW4gb3BsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcnZlciA9IHNlbGYuZGF0YS5nZXRWYXIoIkxBWUVSVkVSU0lPTl8lcyIgJSBkZXAsIFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcCwgZGVwdmVyKSA9IG9wc3RyLnNwbGl0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGF5ZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gYmIudXRpbHMudmVyY21wX3N0cmluZ19vcChsYXllcnZlciwgZGVwdmVyLCBvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBiYi51dGlscy5WZXJzaW9uU3RyaW5nRXhjZXB0aW9uIGFzIHZzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5mYXRhbCgnRXJyb3IgcGFyc2luZyBMQVlFUkRFUEVORFNfJXM6ICVzJyAlIChjLCBzdHIodnNlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmVycm9yKCJMYXllciAnJXMnIGRlcGVuZHMgb24gdmVyc2lvbiAlcyBvZiBsYXllciAnJXMnLCBidXQgdmVyc2lvbiAlcyBpcyBjdXJyZW50bHkgZW5hYmxlZCBpbiB5b3VyIGNvbmZpZ3VyYXRpb24uIENoZWNrIHRoYXQgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBtYXRjaGluZyB2ZXJzaW9ucy9icmFuY2hlcyBvZiB0aGVzZSB0d28gbGF5ZXJzLiIsIGMsIG9wc3RyLCBkZXAsIGxheWVydmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmVycm9yKCJMYXllciAnJXMnIGRlcGVuZHMgb24gdmVyc2lvbiAlcyBvZiBsYXllciAnJXMnLCB3aGljaCBleGlzdHMgaW4geW91ciBjb25maWd1cmF0aW9uIGJ1dCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbi4gQ2hlY2sgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBjb3JyZWN0IG1hdGNoaW5nIHZlcnNpb25zL2JyYW5jaGVzIG9mIHRoZXNlIHR3byBsYXllcnMuIiwgYywgb3BzdHIsIGRlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXJyb3IoIkxheWVyICclcycgZGVwZW5kcyBvbiBsYXllciAnJXMnLCBidXQgdGhpcyBsYXllciBpcyBub3QgZW5hYmxlZCBpbiB5b3VyIGNvbmZpZ3VyYXRpb24iLCBjLCBkZXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX2RlcGVuZHNbY10gPSBkZXBsaXN0LmtleXMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25fZGVwZW5kc1tjXSA9IFtdCisKKyAgICAgICAgICAgICMgUmVjdXJzaXZlbHkgd29yayBvdXQgY29sbGVjdGlvbiBwcmlvcml0aWVzIGJhc2VkIG9uIGRlcGVuZGVuY2llcworICAgICAgICAgICAgZGVmIGNhbGNfbGF5ZXJfcHJpb3JpdHkoY29sbGVjdGlvbik6CisgICAgICAgICAgICAgICAgaWYgbm90IGNvbGxlY3Rpb25fcHJpb3JpdGllc1tjb2xsZWN0aW9uXToKKyAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHByaW8gPSBtaW5fcHJpbworICAgICAgICAgICAgICAgICAgICBmb3IgZGVwIGluIGNvbGxlY3Rpb25fZGVwZW5kc1tjb2xsZWN0aW9uXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNfbGF5ZXJfcHJpb3JpdHkoZGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVwcHJpbyA9IGNvbGxlY3Rpb25fcHJpb3JpdGllc1tkZXBdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZXBwcmlvID4gbWF4X2RlcHByaW86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHByaW8gPSBkZXBwcmlvCisgICAgICAgICAgICAgICAgICAgIG1heF9kZXBwcmlvICs9IDEKKyAgICAgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZGVidWcoMSwgIkNhbGN1bGF0ZWQgcHJpb3JpdHkgb2YgbGF5ZXIgJXMgYXMgJWQiLCBjb2xsZWN0aW9uLCBtYXhfZGVwcHJpbykKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9wcmlvcml0aWVzW2NvbGxlY3Rpb25dID0gbWF4X2RlcHByaW8KKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgYWxsIGxheWVyIHByaW9yaXRpZXMgdXNpbmcgY2FsY19sYXllcl9wcmlvcml0eSBhbmQgc3RvcmUgaW4gYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzCisgICAgICAgICAgICBmb3IgYyBpbiBjb2xsZWN0aW9uX2xpc3Q6CisgICAgICAgICAgICAgICAgY2FsY19sYXllcl9wcmlvcml0eShjKQorICAgICAgICAgICAgICAgIHJlZ2V4ID0gc2VsZi5kYXRhLmdldFZhcigiQkJGSUxFX1BBVFRFUk5fJXMiICUgYywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiByZWdleCA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICBwYXJzZWxvZy5lcnJvcigiQkJGSUxFX1BBVFRFUk5fJXMgbm90IGRlZmluZWQiICUgYykKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY3JlID0gcmUuY29tcGlsZShyZWdleCkKKyAgICAgICAgICAgICAgICBleGNlcHQgcmUuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlbG9nLmVycm9yKCJCQkZJTEVfUEFUVEVSTl8lcyBcIiVzXCIgaXMgbm90IGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uIiwgYywgcmVnZXgpCisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmJiZmlsZV9jb25maWdfcHJpb3JpdGllcy5hcHBlbmQoKGMsIHJlZ2V4LCBjcmUsIGNvbGxlY3Rpb25fcHJpb3JpdGllc1tjXSkpCisgICAgICAgIGlmIGVycm9yczoKKyAgICAgICAgICAgICMgV2UndmUgYWxyZWFkeSBwcmludGVkIHRoZSBhY3R1YWwgZXJyb3IocykKKyAgICAgICAgICAgIHJhaXNlIENvbGxlY3Rpb25FcnJvcigiRXJyb3JzIGR1cmluZyBwYXJzaW5nIGxheWVyIGNvbmZpZ3VyYXRpb24iKQorCisgICAgZGVmIGJ1aWxkU2V0VmFycyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFNldHVwIGFueSB2YXJpYWJsZXMgbmVlZGVkIGJlZm9yZSBzdGFydGluZyBhIGJ1aWxkCisgICAgICAgICIiIgorICAgICAgICB0ID0gdGltZS5nbXRpbWUoKSAKKyAgICAgICAgaWYgbm90IHNlbGYuZGF0YS5nZXRWYXIoIkJVSUxETkFNRSIsIEZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIoIkJVSUxETkFNRSIsICIke0RBVEV9JHtUSU1FfSIpCisgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIoIkJVSUxEU1RBUlQiLCB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWSAlSDolTTolUycsIHQpKQorICAgICAgICBzZWxmLmRhdGEuc2V0VmFyKCJEQVRFIiwgdGltZS5zdHJmdGltZSgnJVklbSVkJywgdCkpCisgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIoIlRJTUUiLCB0aW1lLnN0cmZ0aW1lKCclSCVNJVMnLCB0KSkKKworICAgIGRlZiBtYXRjaEZpbGVzKHNlbGYsIGJmKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgdGhlIC5iYiBmaWxlcyB3aGljaCBtYXRjaCB0aGUgZXhwcmVzc2lvbiBpbiAnYnVpbGRmaWxlJy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGJmLnN0YXJ0c3dpdGgoIi8iKSBvciBiZi5zdGFydHN3aXRoKCIuLi8iKToKKyAgICAgICAgICAgIGJmID0gb3MucGF0aC5hYnNwYXRoKGJmKQorCisgICAgICAgIHNlbGYuY29sbGVjdGlvbiA9IENvb2tlckNvbGxlY3RGaWxlcyhzZWxmLnJlY2lwZWNhY2hlLmJiZmlsZV9jb25maWdfcHJpb3JpdGllcykKKyAgICAgICAgZmlsZWxpc3QsIG1hc2tlZCA9IHNlbGYuY29sbGVjdGlvbi5jb2xsZWN0X2JiZmlsZXMoc2VsZi5kYXRhLCBzZWxmLmV4cGFuZGVkX2RhdGEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnN0YXQoYmYpCisgICAgICAgICAgICBiZiA9IG9zLnBhdGguYWJzcGF0aChiZikKKyAgICAgICAgICAgIHJldHVybiBbYmZdCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmVnZXhwID0gcmUuY29tcGlsZShiZikKKyAgICAgICAgICAgIG1hdGNoZXMgPSBbXQorICAgICAgICAgICAgZm9yIGYgaW4gZmlsZWxpc3Q6CisgICAgICAgICAgICAgICAgaWYgcmVnZXhwLnNlYXJjaChmKSBhbmQgb3MucGF0aC5pc2ZpbGUoZik6CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKGYpCisgICAgICAgICAgICByZXR1cm4gbWF0Y2hlcworCisgICAgZGVmIG1hdGNoRmlsZShzZWxmLCBidWlsZGZpbGUpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCB0aGUgLmJiIGZpbGUgd2hpY2ggbWF0Y2hlcyB0aGUgZXhwcmVzc2lvbiBpbiAnYnVpbGRmaWxlJy4KKyAgICAgICAgUmFpc2UgYW4gZXJyb3IgaWYgbXVsdGlwbGUgZmlsZXMKKyAgICAgICAgIiIiCisgICAgICAgIG1hdGNoZXMgPSBzZWxmLm1hdGNoRmlsZXMoYnVpbGRmaWxlKQorICAgICAgICBpZiBsZW4obWF0Y2hlcykgIT0gMToKKyAgICAgICAgICAgIGlmIG1hdGNoZXM6CisgICAgICAgICAgICAgICAgbXNnID0gIlVuYWJsZSB0byBtYXRjaCAnJXMnIHRvIGEgc3BlY2lmaWMgcmVjaXBlIGZpbGUgLSAlcyBtYXRjaGVzIGZvdW5kOiIgJSAoYnVpbGRmaWxlLCBsZW4obWF0Y2hlcykpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiXG4gICAgJXMiICUgZgorICAgICAgICAgICAgICAgIHBhcnNlbG9nLmVycm9yKG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZXJyb3IoIlVuYWJsZSB0byBmaW5kIGFueSByZWNpcGUgZmlsZSBtYXRjaGluZyAnJXMnIiAlIGJ1aWxkZmlsZSkKKyAgICAgICAgICAgIHJhaXNlIE5vU3BlY2lmaWNNYXRjaAorICAgICAgICByZXR1cm4gbWF0Y2hlc1swXQorCisgICAgZGVmIGJ1aWxkRmlsZShzZWxmLCBidWlsZGZpbGUsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgdGhlIGZpbGUgbWF0Y2hpbmcgcmVnZXhwIGJ1aWxkZmlsZQorICAgICAgICAiIiIKKworICAgICAgICAjIFRvbyBtYW55IHBlb3BsZSB1c2UgLWIgYmVjYXVzZSB0aGV5IHRoaW5rIGl0J3MgaG93IHlvdSBub3JtYWxseQorICAgICAgICAjIHNwZWNpZnkgYSB0YXJnZXQgdG8gYmUgYnVpbHQsIHNvIHNob3cgYSB3YXJuaW5nCisgICAgICAgIGJiLndhcm4oIkJ1aWxkZmlsZSBzcGVjaWZpZWQsIGRlcGVuZGVuY2llcyB3aWxsIG5vdCBiZSBoYW5kbGVkLiBJZiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LCBkbyBub3QgdXNlIC1iIC8gLS1idWlsZGZpbGUuIikKKworICAgICAgICAjIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIGhlcmUuIFdlIG5lZWQgdG8gZG8gaXQgZXhwbGljaXRseSBoZXJlIHNpbmNlCisgICAgICAgICMgYnVpbGRGaWxlKCkgZG9lc24ndCB1c2UgdGhlIGNhY2hlCisgICAgICAgIHNlbGYucGFyc2VDb25maWd1cmF0aW9uKCkKKworICAgICAgICAjIElmIHdlIGFyZSB0b2xkIHRvIGRvIHRoZSBOb25lIHRhc2sgdGhlbiBxdWVyeSB0aGUgZGVmYXVsdCB0YXNrCisgICAgICAgIGlmICh0YXNrID09IE5vbmUpOgorICAgICAgICAgICAgdGFzayA9IHNlbGYuY29uZmlndXJhdGlvbi5jbWQKKworICAgICAgICBmbiwgY2xzID0gYmIuY2FjaGUuQ2FjaGUudmlydHVhbGZuMnJlYWxmbihidWlsZGZpbGUpCisgICAgICAgIGZuID0gc2VsZi5tYXRjaEZpbGUoZm4pCisKKyAgICAgICAgc2VsZi5idWlsZFNldFZhcnMoKQorCisgICAgICAgIGluZm9zID0gYmIuY2FjaGUuQ2FjaGUucGFyc2UoZm4sIHNlbGYuY29sbGVjdGlvbi5nZXRfZmlsZV9hcHBlbmRzKGZuKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlc19hcnJheSkKKyAgICAgICAgaW5mb3MgPSBkaWN0KGluZm9zKQorCisgICAgICAgIGZuID0gYmIuY2FjaGUuQ2FjaGUucmVhbGZuMnZpcnR1YWwoZm4sIGNscykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5mb19hcnJheSA9IGluZm9zW2ZuXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBiYi5mYXRhbCgiJXMgZG9lcyBub3QgZXhpc3QiICUgZm4pCisKKyAgICAgICAgaWYgaW5mb19hcnJheVswXS5za2lwcGVkOgorICAgICAgICAgICAgYmIuZmF0YWwoIiVzIHdhcyBza2lwcGVkOiAlcyIgJSAoZm4sIGluZm9fYXJyYXlbMF0uc2tpcHJlYXNvbikpCisKKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5hZGRfZnJvbV9yZWNpcGVpbmZvKGZuLCBpbmZvX2FycmF5KQorCisgICAgICAgICMgVHdlYWsgc29tZSB2YXJpYWJsZXMKKyAgICAgICAgaXRlbSA9IGluZm9fYXJyYXlbMF0ucG4KKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5pZ25vcmVkX2RlcGVuZGVuY2llcyA9IHNldCgpCisgICAgICAgIHNlbGYucmVjaXBlY2FjaGUuYmJmaWxlX3ByaW9yaXR5W2ZuXSA9IDEKKworICAgICAgICAjIFJlbW92ZSBleHRlcm5hbCBkZXBlbmRlbmNpZXMKKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS50YXNrX2RlcHNbZm5dWydkZXBlbmRzJ10gPSB7fQorICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmRlcHNbZm5dID0gW10KKyAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5ydW5kZXBzW2ZuXSA9IFtdCisgICAgICAgIHNlbGYucmVjaXBlY2FjaGUucnVucmVjc1tmbl0gPSBbXQorCisgICAgICAgICMgSW52YWxpZGF0ZSB0YXNrIGZvciB0YXJnZXQgaWYgZm9yY2UgbW9kZSBhY3RpdmUKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLmZvcmNlOgorICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIkludmFsaWRhdGUgdGFzayAlcywgJXMiLCB0YXNrLCBmbikKKyAgICAgICAgICAgIGlmIG5vdCB0YXNrLnN0YXJ0c3dpdGgoImRvXyIpOgorICAgICAgICAgICAgICAgIHRhc2sgPSAiZG9fJXMiICUgdGFzaworICAgICAgICAgICAgYmIucGFyc2Uuc2lnZ2VuLmludmFsaWRhdGVfdGFzayh0YXNrLCBzZWxmLnJlY2lwZWNhY2hlLCBmbikKKworICAgICAgICAjIFNldHVwIHRhc2tkYXRhIHN0cnVjdHVyZQorICAgICAgICB0YXNrZGF0YSA9IGJiLnRhc2tkYXRhLlRhc2tEYXRhKHNlbGYuY29uZmlndXJhdGlvbi5hYm9ydCkKKyAgICAgICAgdGFza2RhdGEuYWRkX3Byb3ZpZGVyKHNlbGYuZGF0YSwgc2VsZi5yZWNpcGVjYWNoZSwgaXRlbSkKKworICAgICAgICBidWlsZG5hbWUgPSBzZWxmLmRhdGEuZ2V0VmFyKCJCVUlMRE5BTUUiLCBUcnVlKQorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkJ1aWxkU3RhcnRlZChidWlsZG5hbWUsIFtpdGVtXSksIHNlbGYuZXhwYW5kZWRfZGF0YSkKKworICAgICAgICAjIEV4ZWN1dGUgdGhlIHJ1bnF1ZXVlCisgICAgICAgIGlmIG5vdCB0YXNrLnN0YXJ0c3dpdGgoImRvXyIpOgorICAgICAgICAgICAgdGFzayA9ICJkb18lcyIgJSB0YXNrCisgICAgICAgIHJ1bmxpc3QgPSBbW2l0ZW0sIHRhc2tdXQorCisgICAgICAgIHJxID0gYmIucnVucXVldWUuUnVuUXVldWUoc2VsZiwgc2VsZi5kYXRhLCBzZWxmLnJlY2lwZWNhY2hlLCB0YXNrZGF0YSwgcnVubGlzdCkKKworICAgICAgICBkZWYgYnVpbGRGaWxlSWRsZShzZXJ2ZXIsIHJxLCBhYm9ydCk6CisKKyAgICAgICAgICAgIG1zZyA9IE5vbmUKKyAgICAgICAgICAgIGludGVycnVwdGVkID0gMAorICAgICAgICAgICAgaWYgYWJvcnQgb3Igc2VsZi5zdGF0ZSA9PSBzdGF0ZS5mb3JjZXNodXRkb3duOgorICAgICAgICAgICAgICAgIHJxLmZpbmlzaF9ydW5xdWV1ZShUcnVlKQorICAgICAgICAgICAgICAgIG1zZyA9ICJGb3JjZWQgc2h1dGRvd24iCisgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSAyCisgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gc3RhdGUuc2h1dGRvd246CisgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKEZhbHNlKQorICAgICAgICAgICAgICAgIG1zZyA9ICJTdG9wcGVkIGJ1aWxkIgorICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gMQorICAgICAgICAgICAgZmFpbHVyZXMgPSAwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcnEuZXhlY3V0ZV9ydW5xdWV1ZSgpCisgICAgICAgICAgICBleGNlcHQgcnVucXVldWUuVGFza0ZhaWx1cmUgYXMgZXhjOgorICAgICAgICAgICAgICAgIGZhaWx1cmVzICs9IGxlbihleGMuYXJncykKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBGYWxzZQorICAgICAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgZXhjOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICBpZiBub3QgcmV0dmFsOgorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuQnVpbGRDb21wbGV0ZWQobGVuKHJxLnJxZGF0YS5ydW5xX2ZuaWQpLCBidWlsZG5hbWUsIGl0ZW0sIGZhaWx1cmVzLCBpbnRlcnJ1cHRlZCksIHNlbGYuZXhwYW5kZWRfZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmQuZmluaXNoQXN5bmNDb21tYW5kKG1zZykKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHJldHZhbCBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gcmV0dmFsCisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNlcnZlcl9yZWdpc3Rlcl9pZGxlY2FsbGJhY2soYnVpbGRGaWxlSWRsZSwgcnEpCisKKyAgICBkZWYgYnVpbGRUYXJnZXRzKHNlbGYsIHRhcmdldHMsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgQXR0ZW1wdCB0byBidWlsZCB0aGUgdGFyZ2V0cyBzcGVjaWZpZWQKKyAgICAgICAgIiIiCisKKyAgICAgICAgZGVmIGJ1aWxkVGFyZ2V0c0lkbGUoc2VydmVyLCBycSwgYWJvcnQpOgorICAgICAgICAgICAgbXNnID0gTm9uZQorICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSAwCisgICAgICAgICAgICBpZiBhYm9ydCBvciBzZWxmLnN0YXRlID09IHN0YXRlLmZvcmNlc2h1dGRvd246CisgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKFRydWUpCisgICAgICAgICAgICAgICAgbXNnID0gIkZvcmNlZCBzaHV0ZG93biIKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IDIKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBzdGF0ZS5zaHV0ZG93bjoKKyAgICAgICAgICAgICAgICBycS5maW5pc2hfcnVucXVldWUoRmFsc2UpCisgICAgICAgICAgICAgICAgbXNnID0gIlN0b3BwZWQgYnVpbGQiCisgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSAxCisgICAgICAgICAgICBmYWlsdXJlcyA9IDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBycS5leGVjdXRlX3J1bnF1ZXVlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBydW5xdWV1ZS5UYXNrRmFpbHVyZSBhcyBleGM6CisgICAgICAgICAgICAgICAgZmFpbHVyZXMgKz0gbGVuKGV4Yy5hcmdzKQorICAgICAgICAgICAgICAgIHJldHZhbCA9IEZhbHNlCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyBleGM6CisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kLmZpbmlzaEFzeW5jQ29tbWFuZCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIGlmIG5vdCByZXR2YWw6CisgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5CdWlsZENvbXBsZXRlZChsZW4ocnEucnFkYXRhLnJ1bnFfZm5pZCksIGJ1aWxkbmFtZSwgdGFyZ2V0cywgZmFpbHVyZXMsIGludGVycnVwdGVkKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZC5maW5pc2hBc3luY0NvbW1hbmQobXNnKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgcmV0dmFsIGlzIFRydWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiByZXR2YWwKKworICAgICAgICBidWlsZC5yZXNldF9jYWNoZSgpCisgICAgICAgIHNlbGYuYnVpbGRTZXRWYXJzKCkKKworICAgICAgICB0YXNrZGF0YSwgcnVubGlzdCwgZnVsbHRhcmdldGxpc3QgPSBzZWxmLmJ1aWxkVGFza0RhdGEodGFyZ2V0cywgdGFzaywgc2VsZi5jb25maWd1cmF0aW9uLmFib3J0KQorCisgICAgICAgIGJ1aWxkbmFtZSA9IHNlbGYuZGF0YS5nZXRWYXIoIkJVSUxETkFNRSIsIEZhbHNlKQorICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkJ1aWxkU3RhcnRlZChidWlsZG5hbWUsIGZ1bGx0YXJnZXRsaXN0KSwgc2VsZi5kYXRhKQorCisgICAgICAgIHJxID0gYmIucnVucXVldWUuUnVuUXVldWUoc2VsZiwgc2VsZi5kYXRhLCBzZWxmLnJlY2lwZWNhY2hlLCB0YXNrZGF0YSwgcnVubGlzdCkKKyAgICAgICAgaWYgJ3VuaXZlcnNlJyBpbiB0YXJnZXRzOgorICAgICAgICAgICAgcnEucnFkYXRhLndhcm5fbXVsdGlfYmIgPSBUcnVlCisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNlcnZlcl9yZWdpc3Rlcl9pZGxlY2FsbGJhY2soYnVpbGRUYXJnZXRzSWRsZSwgcnEpCisKKworICAgIGRlZiBnZXRBbGxLZXlzV2l0aEZsYWdzKHNlbGYsIGZsYWdsaXN0KToKKyAgICAgICAgZHVtcCA9IHt9CisgICAgICAgIGZvciBrIGluIHNlbGYuZGF0YS5rZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdiA9IHNlbGYuZGF0YS5nZXRWYXIoaywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgay5zdGFydHN3aXRoKCJfXyIpIGFuZCBub3QgaXNpbnN0YW5jZSh2LCBiYi5kYXRhX3NtYXJ0LkRhdGFTbWFydCk6CisgICAgICAgICAgICAgICAgICAgIGR1bXBba10gPSB7CisgICAgJ3YnIDogdiAsCisgICAgJ2hpc3RvcnknIDogc2VsZi5kYXRhLnZhcmhpc3RvcnkudmFyaWFibGUoayksCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZmxhZ2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wW2tdW2RdID0gc2VsZi5kYXRhLmdldFZhckZsYWcoaywgZCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBwcmludChlKQorICAgICAgICByZXR1cm4gZHVtcAorCisKKyAgICBkZWYgZ2VuZXJhdGVOZXdJbWFnZShzZWxmLCBpbWFnZSwgYmFzZV9pbWFnZSwgcGFja2FnZV9xdWV1ZSwgdGltZXN0YW1wLCBkZXNjcmlwdGlvbik6CisgICAgICAgICcnJworICAgICAgICBDcmVhdGUgYSBuZXcgaW1hZ2Ugd2l0aCBhICJyZXF1aXJlIi8iaW5oZXJpdCIgYmFzZV9pbWFnZSBzdGF0ZW1lbnQKKyAgICAgICAgJycnCisgICAgICAgIGlmIHRpbWVzdGFtcDoKKyAgICAgICAgICAgIGltYWdlX25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGltYWdlKVswXQorICAgICAgICAgICAgdGltZXN0ciA9IHRpbWUuc3RyZnRpbWUoIi0lWSVtJWQtJUglTSVTIikKKyAgICAgICAgICAgIGRlc3QgPSBpbWFnZV9uYW1lICsgc3RyKHRpbWVzdHIpICsgIi5iYiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBpbWFnZS5lbmRzd2l0aCgiLmJiIik6CisgICAgICAgICAgICAgICAgZGVzdCA9IGltYWdlICsgIi5iYiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzdCA9IGltYWdlCisKKyAgICAgICAgYmFzZW5hbWUgPSBGYWxzZQorICAgICAgICBpZiBiYXNlX2ltYWdlOgorICAgICAgICAgICAgd2l0aCBvcGVuKGJhc2VfaW1hZ2UsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICByZXF1aXJlX2xpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBwID0gcmUuY29tcGlsZSgiSU1BR0VfQkFTRU5BTUUgKj0iKQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgICAgIGlmIHAuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSBUcnVlCisKKyAgICAgICAgd2l0aCBvcGVuKGRlc3QsICJ3IikgYXMgaW1hZ2VmaWxlOgorICAgICAgICAgICAgaWYgYmFzZV9pbWFnZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGltYWdlZmlsZS53cml0ZSgiaW5oZXJpdCBjb3JlLWltYWdlXG4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0b3BkaXIgPSBzZWxmLmRhdGEuZ2V0VmFyKCJUT1BESVIiLCBGYWxzZSkKKyAgICAgICAgICAgICAgICBpZiB0b3BkaXIgaW4gYmFzZV9pbWFnZToKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9pbWFnZSA9IHJlcXVpcmVfbGluZS5zcGxpdCgpWzFdCisgICAgICAgICAgICAgICAgaW1hZ2VmaWxlLndyaXRlKCJyZXF1aXJlICIgKyBiYXNlX2ltYWdlICsgIlxuIikKKyAgICAgICAgICAgIGltYWdlX2luc3RhbGwgPSAiSU1BR0VfSU5TVEFMTCA9IFwiIgorICAgICAgICAgICAgZm9yIHBhY2thZ2UgaW4gcGFja2FnZV9xdWV1ZToKKyAgICAgICAgICAgICAgICBpbWFnZV9pbnN0YWxsICs9IHN0cihwYWNrYWdlKSArICIgIgorICAgICAgICAgICAgaW1hZ2VfaW5zdGFsbCArPSAiXCJcbiIKKyAgICAgICAgICAgIGltYWdlZmlsZS53cml0ZShpbWFnZV9pbnN0YWxsKQorCisgICAgICAgICAgICBkZXNjcmlwdGlvbl92YXIgPSAiREVTQ1JJUFRJT04gPSBcIiIgKyBkZXNjcmlwdGlvbiArICJcIlxuIgorICAgICAgICAgICAgaW1hZ2VmaWxlLndyaXRlKGRlc2NyaXB0aW9uX3ZhcikKKworICAgICAgICAgICAgaWYgYmFzZW5hbWU6CisgICAgICAgICAgICAgICAgIyBJZiB0aGlzIGlzIG92ZXJ3cml0dGVuIGluIGEgaW5oZXJpdGVkIGltYWdlLCByZXNldCBpdCB0byBkZWZhdWx0CisgICAgICAgICAgICAgICAgaW1hZ2VfYmFzZW5hbWUgPSAiSU1BR0VfQkFTRU5BTUUgPSBcIiR7UE59XCJcbiIKKyAgICAgICAgICAgICAgICBpbWFnZWZpbGUud3JpdGUoaW1hZ2VfYmFzZW5hbWUpCisKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlLmluaXRpYWwKKyAgICAgICAgaWYgdGltZXN0YW1wOgorICAgICAgICAgICAgcmV0dXJuIHRpbWVzdHIKKworICAgIGRlZiB1cGRhdGVDYWNoZVN5bmMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gc3RhdGUucnVubmluZzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgcmVsb2FkIGZpbGVzIGZvciB3aGljaCB3ZSBnb3Qgbm90aWZpY2F0aW9ucworICAgICAgICBmb3IgcCBpbiBzZWxmLmlub3RpZnlfbW9kaWZpZWRfZmlsZXM6CisgICAgICAgICAgICBiYi5wYXJzZS51cGRhdGVfY2FjaGUocCkKKyAgICAgICAgc2VsZi5pbm90aWZ5X21vZGlmaWVkX2ZpbGVzID0gW10KKworICAgICAgICBpZiBub3Qgc2VsZi5iYXNlY29uZmlnX3ZhbGlkOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSZWxvYWRpbmcgYmFzZSBjb25maWd1cmF0aW9uIGRhdGEiKQorICAgICAgICAgICAgc2VsZi5pbml0Q29uZmlndXJhdGlvbkRhdGEoKQorICAgICAgICAgICAgc2VsZi5iYXNlY29uZmlnX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5wYXJzZWNhY2hlX3ZhbGlkID0gRmFsc2UKKworICAgICMgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCBhc3luYyBjb21tYW5kcyB3aGVuIHNlbGYuc3RhdGUgIT0gcnVubmluZworICAgIGRlZiB1cGRhdGVDYWNoZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBzdGF0ZS5ydW5uaW5nOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpbiAoc3RhdGUuc2h1dGRvd24sIHN0YXRlLmZvcmNlc2h1dGRvd24sIHN0YXRlLmVycm9yKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5wYXJzZXIsICdzaHV0ZG93bicpOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnNodXRkb3duKGNsZWFuPUZhbHNlLCBmb3JjZSA9IFRydWUpCisgICAgICAgICAgICByYWlzZSBiYi5CQkhhbmRsZWRFeGNlcHRpb24oKQorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gc3RhdGUucGFyc2luZzoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlQ2FjaGVTeW5jKCkKKworICAgICAgICBpZiBzZWxmLnN0YXRlICE9IHN0YXRlLnBhcnNpbmcgYW5kIG5vdCBzZWxmLnBhcnNlY2FjaGVfdmFsaWQ6CisgICAgICAgICAgICBzZWxmLnBhcnNlQ29uZmlndXJhdGlvbiAoKQorICAgICAgICAgICAgaWYgQ29va2VyRmVhdHVyZXMuU0VORF9TQU5JVFlFVkVOVFMgaW4gc2VsZi5mZWF0dXJlc2V0OgorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuU2FuaXR5Q2hlY2soRmFsc2UpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgICAgIGlnbm9yZSA9IHNlbGYuZXhwYW5kZWRfZGF0YS5nZXRWYXIoIkFTU1VNRV9QUk9WSURFRCIsIFRydWUpIG9yICIiCisgICAgICAgICAgICBzZWxmLnJlY2lwZWNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzID0gc2V0KGlnbm9yZS5zcGxpdCgpKQorCisgICAgICAgICAgICBmb3IgZGVwIGluIHNlbGYuY29uZmlndXJhdGlvbi5leHRyYV9hc3N1bWVfcHJvdmlkZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5pZ25vcmVkX2RlcGVuZGVuY2llcy5hZGQoZGVwKQorCisgICAgICAgICAgICBzZWxmLmNvbGxlY3Rpb24gPSBDb29rZXJDb2xsZWN0RmlsZXMoc2VsZi5yZWNpcGVjYWNoZS5iYmZpbGVfY29uZmlnX3ByaW9yaXRpZXMpCisgICAgICAgICAgICAoZmlsZWxpc3QsIG1hc2tlZCkgPSBzZWxmLmNvbGxlY3Rpb24uY29sbGVjdF9iYmZpbGVzKHNlbGYuZGF0YSwgc2VsZi5leHBhbmRlZF9kYXRhKQorCisgICAgICAgICAgICBzZWxmLnBhcnNlciA9IENvb2tlclBhcnNlcihzZWxmLCBmaWxlbGlzdCwgbWFza2VkKQorICAgICAgICAgICAgc2VsZi5wYXJzZWNhY2hlX3ZhbGlkID0gVHJ1ZQorCisgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5wYXJzaW5nCisKKyAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLnBhcnNlX25leHQoKToKKyAgICAgICAgICAgIGNvbGxlY3Rsb2cuZGVidWcoMSwgInBhcnNpbmcgY29tcGxldGUiKQorICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgYmIuQkJIYW5kbGVkRXhjZXB0aW9uKCkKKyAgICAgICAgICAgIHNlbGYuc2hvd19hcHBlbmRzX3dpdGhfbm9fcmVjaXBlcygpCisgICAgICAgICAgICBzZWxmLmhhbmRsZVByZWZQcm92aWRlcnMoKQorICAgICAgICAgICAgc2VsZi5yZWNpcGVjYWNoZS5iYmZpbGVfcHJpb3JpdHkgPSBzZWxmLmNvbGxlY3Rpb24uY29sbGVjdGlvbl9wcmlvcml0aWVzKHNlbGYucmVjaXBlY2FjaGUucGtnX2ZuLCBzZWxmLmRhdGEpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUucnVubmluZworCisgICAgICAgICAgICAjIFNlbmQgYW4gZXZlbnQgbGlzdGluZyBhbGwgc3RhbXBzIHJlYWNoYWJsZSBhZnRlciBwYXJzaW5nCisgICAgICAgICAgICAjIHdoaWNoIHRoZSBtZXRhZGF0YSBtYXkgdXNlIHRvIGNsZWFuIHVwIHN0YWxlIGRhdGEKKyAgICAgICAgICAgIGV2ZW50ID0gYmIuZXZlbnQuUmVhY2hhYmxlU3RhbXBzKHNlbGYucmVjaXBlY2FjaGUuc3RhbXApCisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGV2ZW50LCBzZWxmLmV4cGFuZGVkX2RhdGEpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hlY2tQYWNrYWdlcyhzZWxmLCBwa2dzX3RvX2J1aWxkKToKKworICAgICAgICAjIFJldHVybiBhIGNvcHksIGRvbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwKKyAgICAgICAgcGtnc190b19idWlsZCA9IHBrZ3NfdG9fYnVpbGRbOl0KKworICAgICAgICBpZiBsZW4ocGtnc190b19idWlsZCkgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIE5vdGhpbmdUb0J1aWxkCisKKyAgICAgICAgaWdub3JlID0gKHNlbGYuZXhwYW5kZWRfZGF0YS5nZXRWYXIoIkFTU1VNRV9QUk9WSURFRCIsIFRydWUpIG9yICIiKS5zcGxpdCgpCisgICAgICAgIGZvciBwa2cgaW4gcGtnc190b19idWlsZDoKKyAgICAgICAgICAgIGlmIHBrZyBpbiBpZ25vcmU6CisgICAgICAgICAgICAgICAgcGFyc2Vsb2cud2FybigiRXhwbGljaXQgdGFyZ2V0IFwiJXNcIiBpcyBpbiBBU1NVTUVfUFJPVklERUQsIGlnbm9yaW5nIiAlIHBrZykKKworICAgICAgICBpZiAnd29ybGQnIGluIHBrZ3NfdG9fYnVpbGQ6CisgICAgICAgICAgICBzZWxmLmJ1aWxkV29ybGRUYXJnZXRMaXN0KCkKKyAgICAgICAgICAgIHBrZ3NfdG9fYnVpbGQucmVtb3ZlKCd3b3JsZCcpCisgICAgICAgICAgICBmb3IgdCBpbiBzZWxmLnJlY2lwZWNhY2hlLndvcmxkX3RhcmdldDoKKyAgICAgICAgICAgICAgICBwa2dzX3RvX2J1aWxkLmFwcGVuZCh0KQorCisgICAgICAgIGlmICd1bml2ZXJzZScgaW4gcGtnc190b19idWlsZDoKKyAgICAgICAgICAgIHBhcnNlbG9nLndhcm4oIlRoZSBcInVuaXZlcnNlXCIgdGFyZ2V0IGlzIG9ubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcgYW5kIG1heSBwcm9kdWNlIGVycm9ycy4iKQorICAgICAgICAgICAgcGFyc2Vsb2cuZGVidWcoMSwgImNvbGxhdGluZyBwYWNrYWdlcyBmb3IgXCJ1bml2ZXJzZVwiIikKKyAgICAgICAgICAgIHBrZ3NfdG9fYnVpbGQucmVtb3ZlKCd1bml2ZXJzZScpCisgICAgICAgICAgICBmb3IgdCBpbiBzZWxmLnJlY2lwZWNhY2hlLnVuaXZlcnNlX3RhcmdldDoKKyAgICAgICAgICAgICAgICBwa2dzX3RvX2J1aWxkLmFwcGVuZCh0KQorCisgICAgICAgIHJldHVybiBwa2dzX3RvX2J1aWxkCisKKworCisKKyAgICBkZWYgcHJlX3NlcnZlKHNlbGYpOgorICAgICAgICAjIEVtcHR5IHRoZSBlbnZpcm9ubWVudC4gVGhlIGVudmlyb25tZW50IHdpbGwgYmUgcG9wdWxhdGVkIGFzCisgICAgICAgICMgbmVjZXNzYXJ5IGZyb20gdGhlIGRhdGEgc3RvcmUuCisgICAgICAgICNiYi51dGlscy5lbXB0eV9lbnZpcm9ubWVudCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucHJob3N0ID0gcHJzZXJ2LnNlcnYuYXV0b19zdGFydChzZWxmLmRhdGEpCisgICAgICAgIGV4Y2VwdCBwcnNlcnYuc2Vydi5QUlNlcnZpY2VDb25maWdFcnJvcjoKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoQ29va2VyRXhpdCgpLCBzZWxmLmV4cGFuZGVkX2RhdGEpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUuZXJyb3IKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcG9zdF9zZXJ2ZShzZWxmKToKKyAgICAgICAgcHJzZXJ2LnNlcnYuYXV0b19zaHV0ZG93bihzZWxmLmRhdGEpCisgICAgICAgIGJiLmV2ZW50LmZpcmUoQ29va2VyRXhpdCgpLCBzZWxmLmV4cGFuZGVkX2RhdGEpCisgICAgICAgIGxvY2tmaWxlID0gc2VsZi5sb2NrLm5hbWUKKyAgICAgICAgc2VsZi5sb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5sb2NrID0gTm9uZQorCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmxvY2s6CisgICAgICAgICAgICB3aXRoIGJiLnV0aWxzLnRpbWVvdXQoMyk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2NrID0gYmIudXRpbHMubG9ja2ZpbGUobG9ja2ZpbGUsIHNoYXJlZD1GYWxzZSwgcmV0cnk9RmFsc2UsIGJsb2NrPVRydWUpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubG9jazoKKyAgICAgICAgICAgICAgICAgICAgIyBTb21lIHN5c3RlbXMgbWF5IG5vdCBoYXZlIGxzb2YgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIHByb2NzID0gTm9uZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jcyA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsibHNvZiIsICctdycsIGxvY2tmaWxlXSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvY3MgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIGZ1c2VyIGlmIGxzb2YgaXMgdW5hdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jcyA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFsiZnVzZXIiLCAnLXYnLCBsb2NrZmlsZV0sIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIkRlbGF5aW5nIHNodXRkb3duIGR1ZSB0byBhY3RpdmUgcHJvY2Vzc2VzIHdoaWNoIGFwcGVhciB0byBiZSBob2xkaW5nIGJpdGJha2UubG9jayIKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvY3M6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIjpcbiVzIiAlIHN0cihwcm9jcykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQobXNnKQorCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZiwgZm9yY2UgPSBGYWxzZSk6CisgICAgICAgIGlmIGZvcmNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlLmZvcmNlc2h1dGRvd24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5zaHV0ZG93bgorCisgICAgZGVmIGZpbmlzaGNvbW1hbmQoc2VsZik6CisgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZS5pbml0aWFsCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuaW5pdENvbmZpZ3VyYXRpb25EYXRhKCkKKworICAgIGRlZiBsb2NrQml0YmFrZShzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ2xvY2snKToKKyAgICAgICAgICAgIHNlbGYubG9jayA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuZGF0YToKKyAgICAgICAgICAgICAgICBsb2NrZmlsZSA9IHNlbGYuZGF0YS5leHBhbmQoIiR7VE9QRElSfS9iaXRiYWtlLmxvY2siKQorICAgICAgICAgICAgICAgIGlmIGxvY2tmaWxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2sgPSBiYi51dGlscy5sb2NrZmlsZShsb2NrZmlsZSwgRmFsc2UsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5sb2NrCisKKyAgICBkZWYgdW5sb2NrQml0YmFrZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnbG9jaycpIGFuZCBzZWxmLmxvY2s6CisgICAgICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKHNlbGYubG9jaykKKworZGVmIHNlcnZlcl9tYWluKGNvb2tlciwgZnVuYywgKmFyZ3MpOgorICAgIGNvb2tlci5wcmVfc2VydmUoKQorCisgICAgaWYgY29va2VyLmNvbmZpZ3VyYXRpb24ucHJvZmlsZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGNQcm9maWxlIGFzIHByb2ZpbGUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGUKKyAgICAgICAgcHJvZiA9IHByb2ZpbGUuUHJvZmlsZSgpCisKKyAgICAgICAgcmV0ID0gcHJvZmlsZS5Qcm9maWxlLnJ1bmNhbGwocHJvZiwgZnVuYywgKmFyZ3MpCisKKyAgICAgICAgcHJvZi5kdW1wX3N0YXRzKCJwcm9maWxlLmxvZyIpCisgICAgICAgIGJiLnV0aWxzLnByb2Nlc3NfcHJvZmlsZWxvZygicHJvZmlsZS5sb2ciKQorICAgICAgICBwcmludCgiUmF3IHByb2ZpbGluZyBpbmZvcm1hdGlvbiBzYXZlZCB0byBwcm9maWxlLmxvZyBhbmQgcHJvY2Vzc2VkIHN0YXRpc3RpY3MgdG8gcHJvZmlsZS5sb2cucHJvY2Vzc2VkIikKKworICAgIGVsc2U6CisgICAgICAgIHJldCA9IGZ1bmMoKmFyZ3MpCisKKyAgICBjb29rZXIucG9zdF9zZXJ2ZSgpCisKKyAgICByZXR1cm4gcmV0CisKK2NsYXNzIENvb2tlckV4aXQoYmIuZXZlbnQuRXZlbnQpOgorICAgICIiIgorICAgIE5vdGlmeSBjbGllbnRzIG9mIHRoZSBDb29rZXIgc2h1dGRvd24KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgYmIuZXZlbnQuRXZlbnQuX19pbml0X18oc2VsZikKKworCitjbGFzcyBDb29rZXJDb2xsZWN0RmlsZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJpb3JpdGllcyk6CisgICAgICAgIHNlbGYuYmJhcHBlbmRzID0gW10KKyAgICAgICAgc2VsZi5iYmZpbGVfY29uZmlnX3ByaW9yaXRpZXMgPSBwcmlvcml0aWVzCisKKyAgICBkZWYgY2FsY19iYmZpbGVfcHJpb3JpdHkoIHNlbGYsIGZpbGVuYW1lLCBtYXRjaGVkID0gTm9uZSApOgorICAgICAgICBmb3IgXywgXywgcmVnZXgsIHByaSBpbiBzZWxmLmJiZmlsZV9jb25maWdfcHJpb3JpdGllczoKKyAgICAgICAgICAgIGlmIHJlZ2V4Lm1hdGNoKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBpZiBtYXRjaGVkICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWdleCBpbiBtYXRjaGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQocmVnZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHByaQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGdldF9iYmZpbGVzKHNlbGYpOgorICAgICAgICAiIiJHZXQgbGlzdCBvZiBkZWZhdWx0IC5iYiBmaWxlcyBieSByZWFkaW5nIG91dCB0aGUgY3VycmVudCBkaXJlY3RvcnkiIiIKKyAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCisgICAgICAgIGNvbnRlbnRzID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICBiYmZpbGVzID0gW10KKyAgICAgICAgZm9yIGYgaW4gY29udGVudHM6CisgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCIuYmIiKToKKyAgICAgICAgICAgICAgICBiYmZpbGVzLmFwcGVuZChvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHBhdGgsIGYpKSkKKyAgICAgICAgcmV0dXJuIGJiZmlsZXMKKworICAgIGRlZiBmaW5kX2JiZmlsZXMoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIkZpbmQgYWxsIHRoZSAuYmIgYW5kIC5iYmFwcGVuZCBmaWxlcyBpbiBhIGRpcmVjdG9yeSIiIgorICAgICAgICBmb3VuZCA9IFtdCisgICAgICAgIGZvciBkaXIsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CisgICAgICAgICAgICBmb3IgaWdub3JlZCBpbiAoJ1NDQ1MnLCAnQ1ZTJywgJy5zdm4nKToKKyAgICAgICAgICAgICAgICBpZiBpZ25vcmVkIGluIGRpcnM6CisgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGlnbm9yZWQpCisgICAgICAgICAgICBmb3VuZCArPSBbb3MucGF0aC5qb2luKGRpciwgZikgZm9yIGYgaW4gZmlsZXMgaWYgKGYuZW5kc3dpdGgoWycuYmInLCAnLmJiYXBwZW5kJ10pKV0KKworICAgICAgICByZXR1cm4gZm91bmQKKworICAgIGRlZiBjb2xsZWN0X2JiZmlsZXMoc2VsZiwgY29uZmlnLCBldmVudGRhdGEpOgorICAgICAgICAiIiJDb2xsZWN0IGFsbCBhdmFpbGFibGUgLmJiIGJ1aWxkIGZpbGVzIiIiCisgICAgICAgIG1hc2tlZCA9IDAKKworICAgICAgICBjb2xsZWN0bG9nLmRlYnVnKDEsICJjb2xsZWN0aW5nIC5iYiBmaWxlcyIpCisKKyAgICAgICAgZmlsZXMgPSAoY29uZmlnLmdldFZhciggIkJCRklMRVMiLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgICAgICBjb25maWcuc2V0VmFyKCJCQkZJTEVTIiwgIiAiLmpvaW4oZmlsZXMpKQorCisgICAgICAgICMgU29ydCBmaWxlcyBieSBwcmlvcml0eQorICAgICAgICBmaWxlcy5zb3J0KCBrZXk9bGFtYmRhIGZpbGVpdGVtOiBzZWxmLmNhbGNfYmJmaWxlX3ByaW9yaXR5KGZpbGVpdGVtKSApCisKKyAgICAgICAgaWYgbm90IGxlbihmaWxlcyk6CisgICAgICAgICAgICBmaWxlcyA9IHNlbGYuZ2V0X2JiZmlsZXMoKQorCisgICAgICAgIGlmIG5vdCBsZW4oZmlsZXMpOgorICAgICAgICAgICAgY29sbGVjdGxvZy5lcnJvcigibm8gcmVjaXBlIGZpbGVzIHRvIGJ1aWxkLCBjaGVjayB5b3VyIEJCUEFUSCBhbmQgQkJGSUxFUz8iKQorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShDb29rZXJFeGl0KCksIGV2ZW50ZGF0YSkKKworICAgICAgICAjIENhbid0IHVzZSBzZXQgaGVyZSBhcyBvcmRlciBpcyBpbXBvcnRhbnQKKyAgICAgICAgbmV3ZmlsZXMgPSBbXQorICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZik6CisgICAgICAgICAgICAgICAgZGlyZmlsZXMgPSBzZWxmLmZpbmRfYmJmaWxlcyhmKQorICAgICAgICAgICAgICAgIGZvciBnIGluIGRpcmZpbGVzOgorICAgICAgICAgICAgICAgICAgICBpZiBnIG5vdCBpbiBuZXdmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ZpbGVzLmFwcGVuZChnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBnbG9iYmVkID0gZ2xvYi5nbG9iKGYpCisgICAgICAgICAgICAgICAgaWYgbm90IGdsb2JiZWQgYW5kIG9zLnBhdGguZXhpc3RzKGYpOgorICAgICAgICAgICAgICAgICAgICBnbG9iYmVkID0gW2ZdCisgICAgICAgICAgICAgICAgZm9yIGcgaW4gZ2xvYmJlZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgZyBub3QgaW4gbmV3ZmlsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdmaWxlcy5hcHBlbmQoZykKKworICAgICAgICBiYm1hc2sgPSBjb25maWcuZ2V0VmFyKCdCQk1BU0snLCBUcnVlKQorCisgICAgICAgIGlmIGJibWFzazoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiYm1hc2tfY29tcGlsZWQgPSByZS5jb21waWxlKGJibWFzaykKKyAgICAgICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOgorICAgICAgICAgICAgICAgIGNvbGxlY3Rsb2cuY3JpdGljYWwoIkJCTUFTSyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sIGlnbm9yaW5nLiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QobmV3ZmlsZXMpLCAwCisKKyAgICAgICAgYmJmaWxlcyA9IFtdCisgICAgICAgIGJiYXBwZW5kID0gW10KKyAgICAgICAgZm9yIGYgaW4gbmV3ZmlsZXM6CisgICAgICAgICAgICBpZiBiYm1hc2sgYW5kIGJibWFza19jb21waWxlZC5zZWFyY2goZik6CisgICAgICAgICAgICAgICAgY29sbGVjdGxvZy5kZWJ1ZygxLCAic2tpcHBpbmcgbWFza2VkIGZpbGUgJXMiLCBmKQorICAgICAgICAgICAgICAgIG1hc2tlZCArPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGYuZW5kc3dpdGgoJy5iYicpOgorICAgICAgICAgICAgICAgIGJiZmlsZXMuYXBwZW5kKGYpCisgICAgICAgICAgICBlbGlmIGYuZW5kc3dpdGgoJy5iYmFwcGVuZCcpOgorICAgICAgICAgICAgICAgIGJiYXBwZW5kLmFwcGVuZChmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2xsZWN0bG9nLmRlYnVnKDEsICJza2lwcGluZyAlczogdW5rbm93biBmaWxlIGV4dGVuc2lvbiIsIGYpCisKKyAgICAgICAgIyBCdWlsZCBhIGxpc3Qgb2YgLmJiYXBwZW5kIGZpbGVzIGZvciBlYWNoIC5iYiBmaWxlCisgICAgICAgIGZvciBmIGluIGJiYXBwZW5kOgorICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoZikucmVwbGFjZSgnLmJiYXBwZW5kJywgJy5iYicpCisgICAgICAgICAgICBzZWxmLmJiYXBwZW5kcy5hcHBlbmQoKGJhc2UsIGYpKQorCisgICAgICAgICMgRmluZCBvdmVybGF5ZWQgcmVjaXBlcworICAgICAgICAjIGJiZmlsZXMgd2lsbCBiZSBpbiBwcmlvcml0eSBvcmRlciB3aGljaCBtYWtlcyB0aGlzIGVhc3kKKyAgICAgICAgYmJmaWxlX3NlZW4gPSBkaWN0KCkKKyAgICAgICAgc2VsZi5vdmVybGF5ZWQgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBmb3IgZiBpbiByZXZlcnNlZChiYmZpbGVzKToKKyAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKGYpCisgICAgICAgICAgICBpZiBiYXNlIG5vdCBpbiBiYmZpbGVfc2VlbjoKKyAgICAgICAgICAgICAgICBiYmZpbGVfc2VlbltiYXNlXSA9IGYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdG9wZmlsZSA9IGJiZmlsZV9zZWVuW2Jhc2VdCisgICAgICAgICAgICAgICAgc2VsZi5vdmVybGF5ZWRbdG9wZmlsZV0uYXBwZW5kKGYpCisKKyAgICAgICAgcmV0dXJuIChiYmZpbGVzLCBtYXNrZWQpCisKKyAgICBkZWYgZ2V0X2ZpbGVfYXBwZW5kcyhzZWxmLCBmbik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiAuYmJhcHBlbmQgZmlsZXMgdG8gYXBwbHkgdG8gZm4KKyAgICAgICAgIiIiCisgICAgICAgIGZpbGVsaXN0ID0gW10KKyAgICAgICAgZiA9IG9zLnBhdGguYmFzZW5hbWUoZm4pCisgICAgICAgIGZvciBiIGluIHNlbGYuYmJhcHBlbmRzOgorICAgICAgICAgICAgKGJiYXBwZW5kLCBmaWxlbmFtZSkgPSBiCisgICAgICAgICAgICBpZiAoYmJhcHBlbmQgPT0gZikgb3IgKCclJyBpbiBiYmFwcGVuZCBhbmQgYmJhcHBlbmQuc3RhcnRzd2l0aChmWzpiYmFwcGVuZC5pbmRleCgnJScpXSkpOgorICAgICAgICAgICAgICAgIGZpbGVsaXN0LmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIGZpbGVsaXN0CisKKyAgICBkZWYgY29sbGVjdGlvbl9wcmlvcml0aWVzKHNlbGYsIHBrZ2ZucywgZCk6CisKKyAgICAgICAgcHJpb3JpdGllcyA9IHt9CisKKyAgICAgICAgIyBDYWxjdWxhdGUgcHJpb3JpdGllcyBmb3IgZWFjaCBmaWxlCisgICAgICAgIG1hdGNoZWQgPSBzZXQoKQorICAgICAgICBmb3IgcCBpbiBwa2dmbnM6CisgICAgICAgICAgICByZWFsZm4sIGNscyA9IGJiLmNhY2hlLkNhY2hlLnZpcnR1YWxmbjJyZWFsZm4ocCkKKyAgICAgICAgICAgIHByaW9yaXRpZXNbcF0gPSBzZWxmLmNhbGNfYmJmaWxlX3ByaW9yaXR5KHJlYWxmbiwgbWF0Y2hlZCkKKworICAgICAgICAjIERvbid0IHNob3cgdGhlIHdhcm5pbmcgaWYgdGhlIEJCRklMRV9QQVRURVJOIGRpZCBtYXRjaCAuYmJhcHBlbmQgZmlsZXMKKyAgICAgICAgdW5tYXRjaGVkID0gc2V0KCkKKyAgICAgICAgZm9yIF8sIF8sIHJlZ2V4LCBwcmkgaW4gc2VsZi5iYmZpbGVfY29uZmlnX3ByaW9yaXRpZXM6CisgICAgICAgICAgICBpZiBub3QgcmVnZXggaW4gbWF0Y2hlZDoKKyAgICAgICAgICAgICAgICB1bm1hdGNoZWQuYWRkKHJlZ2V4KQorCisgICAgICAgIGRlZiBmaW5kbWF0Y2gocmVnZXgpOgorICAgICAgICAgICAgZm9yIGIgaW4gc2VsZi5iYmFwcGVuZHM6CisgICAgICAgICAgICAgICAgKGJiZmlsZSwgYXBwZW5kKSA9IGIKKyAgICAgICAgICAgICAgICBpZiByZWdleC5tYXRjaChhcHBlbmQpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZm9yIHVubWF0Y2ggaW4gdW5tYXRjaGVkLmNvcHkoKToKKyAgICAgICAgICAgIGlmIGZpbmRtYXRjaCh1bm1hdGNoKToKKyAgICAgICAgICAgICAgICB1bm1hdGNoZWQucmVtb3ZlKHVubWF0Y2gpCisKKyAgICAgICAgZm9yIGNvbGxlY3Rpb24sIHBhdHRlcm4sIHJlZ2V4LCBfIGluIHNlbGYuYmJmaWxlX2NvbmZpZ19wcmlvcml0aWVzOgorICAgICAgICAgICAgaWYgcmVnZXggaW4gdW5tYXRjaGVkOgorICAgICAgICAgICAgICAgIGlmIGQuZ2V0VmFyKCdCQkZJTEVfUEFUVEVSTl9JR05PUkVfRU1QVFlfJXMnICUgY29sbGVjdGlvbiwgVHJ1ZSkgIT0gJzEnOgorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0bG9nLndhcm4oIk5vIGJiIGZpbGVzIG1hdGNoZWQgQkJGSUxFX1BBVFRFUk5fJXMgJyVzJyIgJSAoY29sbGVjdGlvbiwgcGF0dGVybikpCisKKyAgICAgICAgcmV0dXJuIHByaW9yaXRpZXMKKworY2xhc3MgUGFyc2luZ0ZhaWx1cmUoRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVhbGV4Y2VwdGlvbiwgcmVjaXBlKToKKyAgICAgICAgc2VsZi5yZWFsZXhjZXB0aW9uID0gcmVhbGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnJlY2lwZSA9IHJlY2lwZQorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgcmVhbGV4Y2VwdGlvbiwgcmVjaXBlKQorCitjbGFzcyBGZWVkZXIobXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBqb2JzLCB0b19wYXJzZXJzLCBxdWl0KToKKyAgICAgICAgc2VsZi5xdWl0ID0gcXVpdAorICAgICAgICBzZWxmLmpvYnMgPSBqb2JzCisgICAgICAgIHNlbGYudG9fcGFyc2VycyA9IHRvX3BhcnNlcnMKKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MuX19pbml0X18oc2VsZikKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcXVpdCA9IHNlbGYucXVpdC5nZXRfbm93YWl0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHF1aXQgPT0gJ2NhbmNlbCc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9fcGFyc2Vycy5jYW5jZWxfam9pbl90aHJlYWQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBqb2IgPSBzZWxmLmpvYnMucG9wKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRvX3BhcnNlcnMucHV0KGpvYiwgdGltZW91dD0wLjUpCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRnVsbDoKKyAgICAgICAgICAgICAgICBzZWxmLmpvYnMuaW5zZXJ0KDAsIGpvYikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCitjbGFzcyBQYXJzZXIobXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBqb2JzLCByZXN1bHRzLCBxdWl0LCBpbml0LCBwcm9maWxlKToKKyAgICAgICAgc2VsZi5qb2JzID0gam9icworICAgICAgICBzZWxmLnJlc3VsdHMgPSByZXN1bHRzCisgICAgICAgIHNlbGYucXVpdCA9IHF1aXQKKyAgICAgICAgc2VsZi5pbml0ID0gaW5pdAorICAgICAgICBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNvbnRleHQgPSBiYi51dGlscy5nZXRfY29udGV4dCgpLmNvcHkoKQorICAgICAgICBzZWxmLmhhbmRsZXJzID0gYmIuZXZlbnQuZ2V0X2NsYXNzX2hhbmRsZXJzKCkuY29weSgpCisgICAgICAgIHNlbGYucHJvZmlsZSA9IHByb2ZpbGUKKworICAgIGRlZiBydW4oc2VsZik6CisKKyAgICAgICAgaWYgbm90IHNlbGYucHJvZmlsZToKKyAgICAgICAgICAgIHNlbGYucmVhbHJ1bigpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY1Byb2ZpbGUgYXMgcHJvZmlsZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpbXBvcnQgcHJvZmlsZQorICAgICAgICBwcm9mID0gcHJvZmlsZS5Qcm9maWxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvZmlsZS5Qcm9maWxlLnJ1bmNhbGwocHJvZiwgc2VsZi5yZWFscnVuKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZmlsZSA9ICJwcm9maWxlLXBhcnNlLSVzLmxvZyIgJSBtdWx0aXByb2Nlc3NpbmcuY3VycmVudF9wcm9jZXNzKCkubmFtZQorICAgICAgICAgICAgcHJvZi5kdW1wX3N0YXRzKGxvZ2ZpbGUpCisKKyAgICBkZWYgcmVhbHJ1bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbml0OgorICAgICAgICAgICAgc2VsZi5pbml0KCkKKworICAgICAgICBwZW5kaW5nID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnF1aXQuZ2V0X25vd2FpdCgpCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHMuY2FuY2VsX2pvaW5fdGhyZWFkKCkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBwZW5kaW5nOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBlbmRpbmcucG9wKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBqb2IgPSBzZWxmLmpvYnMuZ2V0KHRpbWVvdXQ9MC4yNSkKKyAgICAgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBqb2IgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnBhcnNlKCpqb2IpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHMucHV0KHJlc3VsdCwgdGltZW91dD0wLjI1KQorICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkZ1bGw6CisgICAgICAgICAgICAgICAgcGVuZGluZy5hcHBlbmQocmVzdWx0KQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGZpbGVuYW1lLCBhcHBlbmRzLCBjYWNoZXNfYXJyYXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFJlc2V0IG91ciBlbnZpcm9ubWVudCBhbmQgaGFuZGxlcnMgdG8gdGhlIG9yaWdpbmFsIHNldHRpbmdzCisgICAgICAgICAgICBiYi51dGlscy5zZXRfY29udGV4dChzZWxmLmNvbnRleHQuY29weSgpKQorICAgICAgICAgICAgYmIuZXZlbnQuc2V0X2NsYXNzX2hhbmRsZXJzKHNlbGYuaGFuZGxlcnMuY29weSgpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUsIGJiLmNhY2hlLkNhY2hlLnBhcnNlKGZpbGVuYW1lLCBhcHBlbmRzLCBzZWxmLmNmZywgY2FjaGVzX2FycmF5KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgICAgIGV4Yy5yZWNpcGUgPSBmaWxlbmFtZQorICAgICAgICAgICAgZXhjLnRyYWNlYmFjayA9IGxpc3QoYmIuZXhjZXB0aW9ucy5leHRyYWN0X3RyYWNlYmFjayh0YiwgY29udGV4dD0zKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlLCBleGMKKyAgICAgICAgIyBOZWVkIHRvIHR1cm4gQmFzZUV4Y2VwdGlvbnMgaW50byBFeGNlcHRpb25zIGhlcmUgc28gd2UgZ3JhY2VmdWxseSBzaHV0ZG93bgorICAgICAgICAjIGFuZCBmb3IgZXhhbXBsZSBhIHdvcmtlciB0aHJlYWQgZG9lc24ndCBqdXN0IGV4aXQgb24gaXRzIG93biBpbiByZXNwb25zZSB0bworICAgICAgICAjIGEgU3lzdGVtRXhpdCBldmVudCBmb3IgZXhhbXBsZS4KKyAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgcmV0dXJuIFRydWUsIFBhcnNpbmdGYWlsdXJlKGV4YywgZmlsZW5hbWUpCisKK2NsYXNzIENvb2tlclBhcnNlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb29rZXIsIGZpbGVsaXN0LCBtYXNrZWQpOgorICAgICAgICBzZWxmLmZpbGVsaXN0ID0gZmlsZWxpc3QKKyAgICAgICAgc2VsZi5jb29rZXIgPSBjb29rZXIKKyAgICAgICAgc2VsZi5jZmdkYXRhID0gY29va2VyLmRhdGEKKyAgICAgICAgc2VsZi5jZmdoYXNoID0gY29va2VyLmRhdGFfaGFzaAorCisgICAgICAgICMgQWNjb3VudGluZyBzdGF0aXN0aWNzCisgICAgICAgIHNlbGYucGFyc2VkID0gMAorICAgICAgICBzZWxmLmNhY2hlZCA9IDAKKyAgICAgICAgc2VsZi5lcnJvciA9IDAKKyAgICAgICAgc2VsZi5tYXNrZWQgPSBtYXNrZWQKKworICAgICAgICBzZWxmLnNraXBwZWQgPSAwCisgICAgICAgIHNlbGYudmlydHVhbHMgPSAwCisgICAgICAgIHNlbGYudG90YWwgPSBsZW4oZmlsZWxpc3QpCisKKyAgICAgICAgc2VsZi5jdXJyZW50ID0gMAorICAgICAgICBzZWxmLm51bV9wcm9jZXNzZXMgPSBpbnQoc2VsZi5jZmdkYXRhLmdldFZhcigiQkJfTlVNQkVSX1BBUlNFX1RIUkVBRFMiLCBUcnVlKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpKQorICAgICAgICBzZWxmLnByb2Nlc3NfbmFtZXMgPSBbXQorCisgICAgICAgIHNlbGYuYmJfY2FjaGUgPSBiYi5jYWNoZS5DYWNoZShzZWxmLmNmZ2RhdGEsIHNlbGYuY2ZnaGFzaCwgY29va2VyLmNhY2hlc19hcnJheSkKKyAgICAgICAgc2VsZi5mcm9tY2FjaGUgPSBbXQorICAgICAgICBzZWxmLndpbGxwYXJzZSA9IFtdCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLmZpbGVsaXN0OgorICAgICAgICAgICAgYXBwZW5kcyA9IHNlbGYuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmJiX2NhY2hlLmNhY2hlVmFsaWQoZmlsZW5hbWUsIGFwcGVuZHMpOgorICAgICAgICAgICAgICAgIHNlbGYud2lsbHBhcnNlLmFwcGVuZCgoZmlsZW5hbWUsIGFwcGVuZHMsIGNvb2tlci5jYWNoZXNfYXJyYXkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZyb21jYWNoZS5hcHBlbmQoKGZpbGVuYW1lLCBhcHBlbmRzKSkKKyAgICAgICAgc2VsZi50b3BhcnNlID0gc2VsZi50b3RhbCAtIGxlbihzZWxmLmZyb21jYWNoZSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19jaHVuayA9IG1heChzZWxmLnRvcGFyc2UgLyAxMDAsIDEpCisKKyAgICAgICAgc2VsZi5zdGFydCgpCisgICAgICAgIHNlbGYuaGF2ZXNodXRkb3duID0gRmFsc2UKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5yZXN1bHRzID0gc2VsZi5sb2FkX2NhY2hlZCgpCisgICAgICAgIHNlbGYucHJvY2Vzc2VzID0gW10KKyAgICAgICAgaWYgc2VsZi50b3BhcnNlOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5QYXJzZVN0YXJ0ZWQoc2VsZi50b3BhcnNlKSwgc2VsZi5jZmdkYXRhKQorICAgICAgICAgICAgZGVmIGluaXQoKToKKyAgICAgICAgICAgICAgICBQYXJzZXIuY2ZnID0gc2VsZi5jZmdkYXRhCisgICAgICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnV0aWwuRmluYWxpemUoTm9uZSwgYmIuY29kZXBhcnNlci5wYXJzZXJfY2FjaGVfc2F2ZSwgYXJncz0oc2VsZi5jZmdkYXRhLCksIGV4aXRwcmlvcml0eT0xKQorICAgICAgICAgICAgICAgIG11bHRpcHJvY2Vzc2luZy51dGlsLkZpbmFsaXplKE5vbmUsIGJiLmZldGNoLmZldGNoZXJfcGFyc2Vfc2F2ZSwgYXJncz0oc2VsZi5jZmdkYXRhLCksIGV4aXRwcmlvcml0eT0xKQorCisgICAgICAgICAgICBzZWxmLmZlZWRlcl9xdWl0ID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKG1heHNpemU9MSkKKyAgICAgICAgICAgIHNlbGYucGFyc2VyX3F1aXQgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUobWF4c2l6ZT1zZWxmLm51bV9wcm9jZXNzZXMpCisgICAgICAgICAgICBzZWxmLmpvYnMgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUobWF4c2l6ZT1zZWxmLm51bV9wcm9jZXNzZXMpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9xdWV1ZSA9IG11bHRpcHJvY2Vzc2luZy5RdWV1ZSgpCisgICAgICAgICAgICBzZWxmLmZlZWRlciA9IEZlZWRlcihzZWxmLndpbGxwYXJzZSwgc2VsZi5qb2JzLCBzZWxmLmZlZWRlcl9xdWl0KQorICAgICAgICAgICAgc2VsZi5mZWVkZXIuc3RhcnQoKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgc2VsZi5udW1fcHJvY2Vzc2VzKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBQYXJzZXIoc2VsZi5qb2JzLCBzZWxmLnJlc3VsdF9xdWV1ZSwgc2VsZi5wYXJzZXJfcXVpdCwgaW5pdCwgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5wcm9maWxlKQorICAgICAgICAgICAgICAgIHBhcnNlci5zdGFydCgpCisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX25hbWVzLmFwcGVuZChwYXJzZXIubmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nlcy5hcHBlbmQocGFyc2VyKQorCisgICAgICAgICAgICBzZWxmLnJlc3VsdHMgPSBpdGVydG9vbHMuY2hhaW4oc2VsZi5yZXN1bHRzLCBzZWxmLnBhcnNlX2dlbmVyYXRvcigpKQorCisgICAgZGVmIHNodXRkb3duKHNlbGYsIGNsZWFuPVRydWUsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgaWYgbm90IHNlbGYudG9wYXJzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmhhdmVzaHV0ZG93bjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmhhdmVzaHV0ZG93biA9IFRydWUKKworICAgICAgICBpZiBjbGVhbjoKKyAgICAgICAgICAgIGV2ZW50ID0gYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQoc2VsZi5jYWNoZWQsIHNlbGYucGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBwZWQsIHNlbGYubWFza2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZpcnR1YWxzLCBzZWxmLmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRvdGFsKQorCisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGV2ZW50LCBzZWxmLmNmZ2RhdGEpCisgICAgICAgICAgICBzZWxmLmZlZWRlcl9xdWl0LnB1dChOb25lKQorICAgICAgICAgICAgZm9yIHByb2Nlc3MgaW4gc2VsZi5wcm9jZXNzZXM6CisgICAgICAgICAgICAgICAgc2VsZi5qb2JzLnB1dChOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mZWVkZXJfcXVpdC5wdXQoJ2NhbmNlbCcpCisKKyAgICAgICAgICAgIHNlbGYucGFyc2VyX3F1aXQuY2FuY2VsX2pvaW5fdGhyZWFkKCkKKyAgICAgICAgICAgIGZvciBwcm9jZXNzIGluIHNlbGYucHJvY2Vzc2VzOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyX3F1aXQucHV0KE5vbmUpCisKKyAgICAgICAgICAgIHNlbGYuam9icy5jYW5jZWxfam9pbl90aHJlYWQoKQorCisgICAgICAgIGZvciBwcm9jZXNzIGluIHNlbGYucHJvY2Vzc2VzOgorICAgICAgICAgICAgaWYgZm9yY2U6CisgICAgICAgICAgICAgICAgcHJvY2Vzcy5qb2luKC4xKQorICAgICAgICAgICAgICAgIHByb2Nlc3MudGVybWluYXRlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvY2Vzcy5qb2luKCkKKyAgICAgICAgc2VsZi5mZWVkZXIuam9pbigpCisKKyAgICAgICAgc3luYyA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuYmJfY2FjaGUuc3luYykKKyAgICAgICAgc3luYy5zdGFydCgpCisgICAgICAgIG11bHRpcHJvY2Vzc2luZy51dGlsLkZpbmFsaXplKE5vbmUsIHN5bmMuam9pbiwgZXhpdHByaW9yaXR5PS0xMDApCisgICAgICAgIGJiLmNvZGVwYXJzZXIucGFyc2VyX2NhY2hlX3NhdmVtZXJnZShzZWxmLmNvb2tlci5kYXRhKQorICAgICAgICBiYi5mZXRjaC5mZXRjaGVyX3BhcnNlX2RvbmUoc2VsZi5jb29rZXIuZGF0YSkKKyAgICAgICAgaWYgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5wcm9maWxlOgorICAgICAgICAgICAgcHJvZmlsZXMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5wcm9jZXNzX25hbWVzOgorICAgICAgICAgICAgICAgIGxvZ2ZpbGUgPSAicHJvZmlsZS1wYXJzZS0lcy5sb2ciICUgaQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvZ2ZpbGUpOgorICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hcHBlbmQobG9nZmlsZSkKKworICAgICAgICAgICAgcG91dCA9ICJwcm9maWxlLXBhcnNlLmxvZy5wcm9jZXNzZWQiCisgICAgICAgICAgICBiYi51dGlscy5wcm9jZXNzX3Byb2ZpbGVsb2cocHJvZmlsZXMsIHBvdXQgPSBwb3V0KQorICAgICAgICAgICAgcHJpbnQoIlByb2Nlc3NlZCBwYXJzaW5nIHN0YXRpc3RpY3Mgc2F2ZWQgdG8gJXMiICUgKHBvdXQpKQorCisgICAgZGVmIGxvYWRfY2FjaGVkKHNlbGYpOgorICAgICAgICBmb3IgZmlsZW5hbWUsIGFwcGVuZHMgaW4gc2VsZi5mcm9tY2FjaGU6CisgICAgICAgICAgICBjYWNoZWQsIGluZm9zID0gc2VsZi5iYl9jYWNoZS5sb2FkKGZpbGVuYW1lLCBhcHBlbmRzLCBzZWxmLmNmZ2RhdGEpCisgICAgICAgICAgICB5aWVsZCBub3QgY2FjaGVkLCBpbmZvcworCisgICAgZGVmIHBhcnNlX2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNlbGYucGFyc2VkID49IHNlbGYudG9wYXJzZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5yZXN1bHRfcXVldWUuZ2V0KHRpbWVvdXQ9MC4yNSkKKyAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0WzFdCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgQmFzZUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHZhbHVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzdWx0CisKKyAgICBkZWYgcGFyc2VfbmV4dChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgcGFyc2VkID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZWQsIHJlc3VsdCA9IHNlbGYucmVzdWx0cy5uZXh0KCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBzZWxmLnNodXRkb3duKCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgYmIuQkJIYW5kbGVkRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgKz0gMQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgcmVjaXBlOiAlcycgJSBleGMucmVjaXBlKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bihjbGVhbj1GYWxzZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgUGFyc2luZ0ZhaWx1cmUgYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5lcnJvciArPSAxCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBwYXJzZSAlczogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgIChleGMucmVjaXBlLCBiYi5leGNlcHRpb25zLnRvX3N0cmluZyhleGMucmVhbGV4Y2VwdGlvbikpKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bihjbGVhbj1GYWxzZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgYmIucGFyc2UuUGFyc2VFcnJvciBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmVycm9yICs9IDEKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzdHIoZXhjKSkKKyAgICAgICAgICAgIHNlbGYuc2h1dGRvd24oY2xlYW49RmFsc2UpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5lcnJvciArPSAxCisgICAgICAgICAgICBfLCB2YWx1ZSwgXyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0V4cGFuc2lvbkVycm9yIGR1cmluZyBwYXJzaW5nICVzOiAlcycsIHZhbHVlLnJlY2lwZSwgc3RyKGV4YykpCisgICAgICAgICAgICBzZWxmLnNodXRkb3duKGNsZWFuPUZhbHNlKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmVycm9yICs9IDEKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHBhcnNlICVzJywgZXhjLnJlY2lwZSkKKyAgICAgICAgICAgIHNlbGYuc2h1dGRvd24oY2xlYW49RmFsc2UpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmVycm9yICs9IDEKKyAgICAgICAgICAgIGV0eXBlLCB2YWx1ZSwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgaWYgaGFzYXR0cih2YWx1ZSwgInJlY2lwZSIpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHBhcnNlICVzJywgdmFsdWUucmVjaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y19pbmZvPShldHlwZSwgdmFsdWUsIGV4Yy50cmFjZWJhY2spKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE1vc3QgbGlrZWx5LCBhbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHJhaXNpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXhjZXB0aW9uIGR1cmluZyBwYXJzZTogJXMnICUgdHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKyAgICAgICAgICAgIHNlbGYuc2h1dGRvd24oY2xlYW49RmFsc2UpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBzZWxmLmN1cnJlbnQgKz0gMQorICAgICAgICBzZWxmLnZpcnR1YWxzICs9IGxlbihyZXN1bHQpCisgICAgICAgIGlmIHBhcnNlZDoKKyAgICAgICAgICAgIHNlbGYucGFyc2VkICs9IDEKKyAgICAgICAgICAgIGlmIHNlbGYucGFyc2VkICUgc2VsZi5wcm9ncmVzc19jaHVuayA9PSAwOgorICAgICAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyhzZWxmLnBhcnNlZCwgc2VsZi50b3BhcnNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2ZnZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2FjaGVkICs9IDEKKworICAgICAgICBmb3IgdmlydHVhbGZuLCBpbmZvX2FycmF5IGluIHJlc3VsdDoKKyAgICAgICAgICAgIGlmIGluZm9fYXJyYXlbMF0uc2tpcHBlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBwZWQgKz0gMQorICAgICAgICAgICAgICAgIHNlbGYuY29va2VyLnNraXBsaXN0W3ZpcnR1YWxmbl0gPSBTa2lwcGVkUGFja2FnZShpbmZvX2FycmF5WzBdKQorICAgICAgICAgICAgc2VsZi5iYl9jYWNoZS5hZGRfaW5mbyh2aXJ0dWFsZm4sIGluZm9fYXJyYXksIHNlbGYuY29va2VyLnJlY2lwZWNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZD1wYXJzZWQsIHdhdGNoZXIgPSBzZWxmLmNvb2tlci5hZGRfZmlsZXdhdGNoKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlcGFyc2Uoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBpbmZvcyA9IHNlbGYuYmJfY2FjaGUucGFyc2UoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZmdkYXRhLCBzZWxmLmNvb2tlci5jYWNoZXNfYXJyYXkpCisgICAgICAgIGZvciB2Zm4sIGluZm9fYXJyYXkgaW4gaW5mb3M6CisgICAgICAgICAgICBzZWxmLmNvb2tlci5yZWNpcGVjYWNoZS5hZGRfZnJvbV9yZWNpcGVpbmZvKHZmbiwgaW5mb19hcnJheSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2Nvb2tlcmRhdGEucHkgYi9iaXRiYWtlL2xpYi9iYi9jb29rZXJkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOWMyODMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9jb29rZXJkYXRhLnB5CkBAIC0wLDAgKzEsMzM2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUGhpbCBCbHVuZGVsbAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA1IE1pY2hhZWwgJ01pY2tleScgTGF1ZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIFJPQUQgR21iSAorIyBDb3B5cmlnaHQgKEMpIDIwMDYgICAgICAgIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3MsIHN5cworZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCitmcm9tIGJiIGltcG9ydCBkYXRhCitpbXBvcnQgYmIucGFyc2UKKworbG9nZ2VyICAgICAgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCitwYXJzZWxvZyAgICA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlBhcnNpbmciKQorCitjbGFzcyBDb25maWdQYXJhbWV0ZXJzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3Y9c3lzLmFyZ3YpOgorICAgICAgICBzZWxmLm9wdGlvbnMsIHRhcmdldHMgPSBzZWxmLnBhcnNlQ29tbWFuZExpbmUoYXJndikKKyAgICAgICAgc2VsZi5lbnZpcm9ubWVudCA9IHNlbGYucGFyc2VFbnZpcm9ubWVudCgpCisKKyAgICAgICAgc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQgPSB0YXJnZXRzIG9yIFtdCisKKyAgICAgICAgc2VsZi5vcHRpb25zLnRyYWNraW5nID0gRmFsc2UKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLm9wdGlvbnMsICJzaG93X2Vudmlyb25tZW50IikgYW5kIHNlbGYub3B0aW9ucy5zaG93X2Vudmlyb25tZW50OgorICAgICAgICAgICAgc2VsZi5vcHRpb25zLnRyYWNraW5nID0gVHJ1ZQorCisgICAgICAgIGZvciBrZXksIHZhbCBpbiBzZWxmLm9wdGlvbnMuX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWwpCisKKyAgICBkZWYgcGFyc2VDb21tYW5kTGluZShzZWxmLCBhcmd2PXN5cy5hcmd2KToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDYWxsZXIgbXVzdCBpbXBsZW1lbnQgY29tbWFuZGxpbmUgb3B0aW9uIHBhcnNpbmciKQorCisgICAgZGVmIHBhcnNlRW52aXJvbm1lbnQoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uLmNvcHkoKQorCisgICAgZGVmIHVwZGF0ZUZyb21TZXJ2ZXIoc2VsZiwgc2VydmVyKToKKyAgICAgICAgaWYgbm90IHNlbGYub3B0aW9ucy5jbWQ6CisgICAgICAgICAgICBkZWZhdWx0dGFzaywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX0RFRkFVTFRfVEFTSyJdKQorICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQl9ERUZBVUxUX1RBU0sgZnJvbSB0aGUgc2VydmVyOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgIHNlbGYub3B0aW9ucy5jbWQgPSBkZWZhdWx0dGFzayBvciAiYnVpbGQiCisgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzZXRDb25maWciLCAiY21kIiwgc2VsZi5vcHRpb25zLmNtZF0pCisgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJVbmFibGUgdG8gc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9uICdjbWQnIG9uIHRoZSBzZXJ2ZXI6ICVzIiAlIGVycm9yKQorCisgICAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZDoKKyAgICAgICAgICAgIGJicGtncywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCUEtHUyJdKQorICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQlBLR1MgZnJvbSB0aGUgc2VydmVyOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgIGlmIGJicGtnczoKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZC5leHRlbmQoYmJwa2dzLnNwbGl0KCkpCisKKyAgICBkZWYgdXBkYXRlVG9TZXJ2ZXIoc2VsZiwgc2VydmVyLCBlbnZpcm9ubWVudCk6CisgICAgICAgIG9wdGlvbnMgPSB7fQorICAgICAgICBmb3IgbyBpbiBbImFib3J0IiwgInRyeWFsdGNvbmZpZ3MiLCAiZm9yY2UiLCAiaW52YWxpZGF0ZV9zdGFtcCIsIAorICAgICAgICAgICAgICAgICAgInZlcmJvc2UiLCAiZGVidWciLCAiZHJ5X3J1biIsICJkdW1wX3NpZ25hdHVyZXMiLCAKKyAgICAgICAgICAgICAgICAgICJkZWJ1Z19kb21haW5zIiwgImV4dHJhX2Fzc3VtZV9wcm92aWRlZCIsICJwcm9maWxlIiwKKyAgICAgICAgICAgICAgICAgICJwcmVmaWxlIiwgInBvc3RmaWxlIl06CisgICAgICAgICAgICBvcHRpb25zW29dID0gZ2V0YXR0cihzZWxmLm9wdGlvbnMsIG8pCisKKyAgICAgICAgcmV0LCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsidXBkYXRlQ29uZmlnIiwgb3B0aW9ucywgZW52aXJvbm1lbnRdKQorICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIlVuYWJsZSB0byB1cGRhdGUgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIHdpdGggbG9jYWwgcGFyYW1ldGVyczogJXMiICUgZXJyb3IpCisKKyAgICBkZWYgcGFyc2VBY3Rpb25zKHNlbGYpOgorICAgICAgICAjIFBhcnNlIGFueSBjb21tYW5kbGluZSBpbnRvIGFjdGlvbnMKKyAgICAgICAgYWN0aW9uID0geydhY3Rpb24nOk5vbmUsICdtc2cnOk5vbmV9CisgICAgICAgIGlmIHNlbGYub3B0aW9ucy5zaG93X2Vudmlyb25tZW50OgorICAgICAgICAgICAgaWYgJ3dvcmxkJyBpbiBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZDoKKyAgICAgICAgICAgICAgICBhY3Rpb25bJ21zZyddID0gIid3b3JsZCcgaXMgbm90IGEgdmFsaWQgdGFyZ2V0IGZvciAtLWVudmlyb25tZW50LiIKKyAgICAgICAgICAgIGVsaWYgJ3VuaXZlcnNlJyBpbiBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZDoKKyAgICAgICAgICAgICAgICBhY3Rpb25bJ21zZyddID0gIid1bml2ZXJzZScgaXMgbm90IGEgdmFsaWQgdGFyZ2V0IGZvciAtLWVudmlyb25tZW50LiIKKyAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkKSA+IDE6CisgICAgICAgICAgICAgICAgYWN0aW9uWydtc2cnXSA9ICJPbmx5IG9uZSB0YXJnZXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgLS1lbnZpcm9ubWVudCBvcHRpb24uIgorICAgICAgICAgICAgZWxpZiBzZWxmLm9wdGlvbnMuYnVpbGRmaWxlIGFuZCBsZW4oc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGQpID4gMDoKKyAgICAgICAgICAgICAgICBhY3Rpb25bJ21zZyddID0gIk5vIHRhcmdldCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSAtLWVudmlyb25tZW50IGFuZCAtLWJ1aWxkZmlsZSBvcHRpb25zLiIKKyAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkKSA+IDA6CisgICAgICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsic2hvd0Vudmlyb25tZW50VGFyZ2V0Iiwgc2VsZi5vcHRpb25zLnBrZ3NfdG9fYnVpbGRdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFjdGlvblsnYWN0aW9uJ10gPSBbInNob3dFbnZpcm9ubWVudCIsIHNlbGYub3B0aW9ucy5idWlsZGZpbGVdCisgICAgICAgIGVsaWYgc2VsZi5vcHRpb25zLmJ1aWxkZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFjdGlvblsnYWN0aW9uJ10gPSBbImJ1aWxkRmlsZSIsIHNlbGYub3B0aW9ucy5idWlsZGZpbGUsIHNlbGYub3B0aW9ucy5jbWRdCisgICAgICAgIGVsaWYgc2VsZi5vcHRpb25zLnJldmlzaW9uc19jaGFuZ2VkOgorICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsiY29tcGFyZVJldmlzaW9ucyJdCisgICAgICAgIGVsaWYgc2VsZi5vcHRpb25zLnNob3dfdmVyc2lvbnM6CisgICAgICAgICAgICBhY3Rpb25bJ2FjdGlvbiddID0gWyJzaG93VmVyc2lvbnMiXQorICAgICAgICBlbGlmIHNlbGYub3B0aW9ucy5wYXJzZV9vbmx5OgorICAgICAgICAgICAgYWN0aW9uWydhY3Rpb24nXSA9IFsicGFyc2VGaWxlcyJdCisgICAgICAgIGVsaWYgc2VsZi5vcHRpb25zLmRvdF9ncmFwaDoKKyAgICAgICAgICAgIGlmIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgICAgIGFjdGlvblsnYWN0aW9uJ10gPSBbImdlbmVyYXRlRG90R3JhcGgiLCBzZWxmLm9wdGlvbnMucGtnc190b19idWlsZCwgc2VsZi5vcHRpb25zLmNtZF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWN0aW9uWydtc2cnXSA9ICJQbGVhc2Ugc3BlY2lmeSBhIHBhY2thZ2UgbmFtZSBmb3IgZGVwZW5kZW5jeSBncmFwaCBnZW5lcmF0aW9uLiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkOgorICAgICAgICAgICAgICAgIGFjdGlvblsnYWN0aW9uJ10gPSBbImJ1aWxkVGFyZ2V0cyIsIHNlbGYub3B0aW9ucy5wa2dzX3RvX2J1aWxkLCBzZWxmLm9wdGlvbnMuY21kXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjYWN0aW9uWydtc2cnXSA9ICJOb3RoaW5nIHRvIGRvLiAgVXNlICdiaXRiYWtlIHdvcmxkJyB0byBidWlsZCBldmVyeXRoaW5nLCBvciBydW4gJ2JpdGJha2UgLS1oZWxwJyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uIgorICAgICAgICAgICAgICAgIGFjdGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5vcHRpb25zLmluaXRpYWxhY3Rpb24gPSBhY3Rpb24KKyAgICAgICAgcmV0dXJuIGFjdGlvbgorCitjbGFzcyBDb29rZXJDb25maWd1cmF0aW9uKG9iamVjdCk6CisgICAgIiIiCisgICAgTWFuYWdlcyBidWlsZCBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9ucyBmb3Igb25lIHJ1bgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmRlYnVnX2RvbWFpbnMgPSBbXQorICAgICAgICBzZWxmLmV4dHJhX2Fzc3VtZV9wcm92aWRlZCA9IFtdCisgICAgICAgIHNlbGYucHJlZmlsZSA9IFtdCisgICAgICAgIHNlbGYucG9zdGZpbGUgPSBbXQorICAgICAgICBzZWxmLmRlYnVnID0gMAorICAgICAgICBzZWxmLmNtZCA9IE5vbmUKKyAgICAgICAgc2VsZi5hYm9ydCA9IFRydWUKKyAgICAgICAgc2VsZi5mb3JjZSA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvZmlsZSA9IEZhbHNlCisgICAgICAgIHNlbGYubm9zZXRzY2VuZSA9IEZhbHNlCisgICAgICAgIHNlbGYuaW52YWxpZGF0ZV9zdGFtcCA9IEZhbHNlCisgICAgICAgIHNlbGYuZHVtcF9zaWduYXR1cmVzID0gW10KKyAgICAgICAgc2VsZi5kcnlfcnVuID0gRmFsc2UKKyAgICAgICAgc2VsZi50cmFja2luZyA9IEZhbHNlCisgICAgICAgIHNlbGYuaW50ZXJmYWNlID0gW10KKyAgICAgICAgc2VsZi53cml0ZWV2ZW50bG9nID0gRmFsc2UKKworICAgICAgICBzZWxmLmVudiA9IHt9CisKKyAgICBkZWYgc2V0Q29uZmlnUGFyYW1ldGVycyhzZWxmLCBwYXJhbWV0ZXJzKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9fZGljdF9fLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSBpbiBwYXJhbWV0ZXJzLm9wdGlvbnMuX19kaWN0X186CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHBhcmFtZXRlcnMub3B0aW9ucy5fX2RpY3RfX1trZXldKQorICAgICAgICBzZWxmLmVudiA9IHBhcmFtZXRlcnMuZW52aXJvbm1lbnQuY29weSgpCisgICAgICAgIHNlbGYudHJhY2tpbmcgPSBwYXJhbWV0ZXJzLnRyYWNraW5nCisKKyAgICBkZWYgc2V0U2VydmVyUmVnSWRsZUNhbGxiYWNrKHNlbGYsIHNyY2IpOgorICAgICAgICBzZWxmLnNlcnZlcl9yZWdpc3Rlcl9pZGxlY2FsbGJhY2sgPSBzcmNiCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICBzdGF0ZSA9IHt9CisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fX2RpY3RfXy5rZXlzKCk6CisgICAgICAgICAgICBpZiBrZXkgPT0gInNlcnZlcl9yZWdpc3Rlcl9pZGxlY2FsbGJhY2siOgorICAgICAgICAgICAgICAgIHN0YXRlW2tleV0gPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXRlW2tleV0gPSBnZXRhdHRyKHNlbGYsIGtleSkKKyAgICAgICAgcmV0dXJuIHN0YXRlCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsc3RhdGUpOgorICAgICAgICBmb3IgayBpbiBzdGF0ZToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgaywgc3RhdGVba10pIAorCisKK2RlZiBjYXRjaF9wYXJzZV9lcnJvcihmdW5jKToKKyAgICAiIiJFeGNlcHRpb24gaGFuZGxpbmcgYml0cyBmb3Igb3VyIHBhcnNpbmciIiIKKyAgICBAd3JhcHMoZnVuYykKKyAgICBkZWYgd3JhcHBlZChmbiwgKmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZnVuYyhmbiwgKmFyZ3MpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIHBhcnNlbG9nLmNyaXRpY2FsKHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCisgICAgICAgICAgICBwYXJzZWxvZy5jcml0aWNhbCgiVW5hYmxlIHRvIHBhcnNlICVzOiAlcyIgJSAoZm4sIGV4YykpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBleGNlcHQgKGJiLnBhcnNlLlBhcnNlRXJyb3IsIGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IpIGFzIGV4YzoKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKworICAgICAgICAgICAgYmJkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pICsgb3Muc2VwCisgICAgICAgICAgICBleGNfY2xhc3MsIGV4YywgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgZm9yIHRiIGluIGl0ZXIobGFtYmRhOiB0Yi50Yl9uZXh0LCBOb25lKToKKyAgICAgICAgICAgICAgICAjIFNraXAgZnJhbWVzIGluIGJpdGJha2UgaXRzZWxmLCB3ZSBvbmx5IHdhbnQgdGhlIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgZm4sIF8sIF8sIF8gPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YiwgMSlbMF0KKyAgICAgICAgICAgICAgICBpZiBub3QgZm4uc3RhcnRzd2l0aChiYmRpcik6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBwYXJzZWxvZy5jcml0aWNhbCgiVW5hYmxlIHRvIHBhcnNlICVzIiwgZm4sIGV4Y19pbmZvPShleGNfY2xhc3MsIGV4YywgdGIpKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXR1cm4gd3JhcHBlZAorCitAY2F0Y2hfcGFyc2VfZXJyb3IKK2RlZiBwYXJzZV9jb25maWdfZmlsZShmbiwgZGF0YSwgaW5jbHVkZT1UcnVlKToKKyAgICByZXR1cm4gYmIucGFyc2UuaGFuZGxlKGZuLCBkYXRhLCBpbmNsdWRlKQorCitAY2F0Y2hfcGFyc2VfZXJyb3IKK2RlZiBfaW5oZXJpdChiYmNsYXNzLCBkYXRhKToKKyAgICBiYi5wYXJzZS5CQkhhbmRsZXIuaW5oZXJpdChiYmNsYXNzLCAiY29uZmlndXJhdGlvbiBJTkhFUklUcyIsIDAsIGRhdGEpCisgICAgcmV0dXJuIGRhdGEKKworZGVmIGZpbmRDb25maWdGaWxlKGNvbmZpZ2ZpbGUsIGRhdGEpOgorICAgIHNlYXJjaCA9IFtdCisgICAgYmJwYXRoID0gZGF0YS5nZXRWYXIoIkJCUEFUSCIsIFRydWUpCisgICAgaWYgYmJwYXRoOgorICAgICAgICBmb3IgaSBpbiBiYnBhdGguc3BsaXQoIjoiKToKKyAgICAgICAgICAgIHNlYXJjaC5hcHBlbmQob3MucGF0aC5qb2luKGksICJjb25mIiwgY29uZmlnZmlsZSkpCisgICAgcGF0aCA9IG9zLmdldGN3ZCgpCisgICAgd2hpbGUgcGF0aCAhPSAiLyI6CisgICAgICAgIHNlYXJjaC5hcHBlbmQob3MucGF0aC5qb2luKHBhdGgsICJjb25mIiwgY29uZmlnZmlsZSkpCisgICAgICAgIHBhdGgsIF8gPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisKKyAgICBmb3IgaSBpbiBzZWFyY2g6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGkpOgorICAgICAgICAgICAgcmV0dXJuIGkKKworICAgIHJldHVybiBOb25lCisKK2NsYXNzIENvb2tlckRhdGFCdWlsZGVyKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29va2VyY2ZnLCB3b3JrZXIgPSBGYWxzZSk6CisKKyAgICAgICAgc2VsZi5wcmVmaWxlcyA9IGNvb2tlcmNmZy5wcmVmaWxlCisgICAgICAgIHNlbGYucG9zdGZpbGVzID0gY29va2VyY2ZnLnBvc3RmaWxlCisgICAgICAgIHNlbGYudHJhY2tpbmcgPSBjb29rZXJjZmcudHJhY2tpbmcKKworICAgICAgICBiYi51dGlscy5zZXRfY29udGV4dChiYi51dGlscy5jbGVhbl9jb250ZXh0KCkpCisgICAgICAgIGJiLmV2ZW50LnNldF9jbGFzc19oYW5kbGVycyhiYi5ldmVudC5jbGVhbl9jbGFzc19oYW5kbGVycygpKQorICAgICAgICBzZWxmLmRhdGEgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBpZiBzZWxmLnRyYWNraW5nOgorICAgICAgICAgICAgc2VsZi5kYXRhLmVuYWJsZVRyYWNraW5nKCkKKworICAgICAgICAjIEtlZXAgYSBkYXRhc3RvcmUgb2YgdGhlIGluaXRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB0aGVpcgorICAgICAgICAjIHZhbHVlcyBmcm9tIHdoZW4gQml0QmFrZSB3YXMgbGF1bmNoZWQgdG8gZW5hYmxlIGNoaWxkIHByb2Nlc3NlcworICAgICAgICAjIHRvIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpY2ggaGF2ZSBiZWVuIGNsZWFuZWQgZnJvbSB0aGUKKyAgICAgICAgIyBCaXRCYWtlIHByb2Nlc3NlcyBlbnYKKyAgICAgICAgc2VsZi5zYXZlZGVudiA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGZvciBrIGluIGNvb2tlcmNmZy5lbnY6CisgICAgICAgICAgICBzZWxmLnNhdmVkZW52LnNldFZhcihrLCBjb29rZXJjZmcuZW52W2tdKQorCisgICAgICAgIGZpbHRlcmVkX2tleXMgPSBiYi51dGlscy5hcHByb3ZlZF92YXJpYWJsZXMoKQorICAgICAgICBiYi5kYXRhLmluaGVyaXRGcm9tT1Moc2VsZi5kYXRhLCBzZWxmLnNhdmVkZW52LCBmaWx0ZXJlZF9rZXlzKQorICAgICAgICBzZWxmLmRhdGEuc2V0VmFyKCJCQl9PUklHRU5WIiwgc2VsZi5zYXZlZGVudikKKyAgICAgICAgCisgICAgICAgIGlmIHdvcmtlcjoKKyAgICAgICAgICAgIHNlbGYuZGF0YS5zZXRWYXIoIkJCX1dPUktFUkNPTlRFWFQiLCAiMSIpCisKKyAgICBkZWYgcGFyc2VCYXNlQ29uZmlndXJhdGlvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wYXJzZUNvbmZpZ3VyYXRpb25GaWxlcyhzZWxmLnByZWZpbGVzLCBzZWxmLnBvc3RmaWxlcykKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcmFpc2UgYmIuQkJIYW5kbGVkRXhjZXB0aW9uCisgICAgICAgIGV4Y2VwdCBiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yIGFzIGU6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGUpKQorICAgICAgICAgICAgcmFpc2UgYmIuQkJIYW5kbGVkRXhjZXB0aW9uCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMiKQorICAgICAgICAgICAgcmFpc2UgYmIuQkJIYW5kbGVkRXhjZXB0aW9uCisKKyAgICBkZWYgX2ZpbmRMYXllckNvbmYoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBmaW5kQ29uZmlnRmlsZSgiYmJsYXllcnMuY29uZiIsIGRhdGEpCisKKyAgICBkZWYgcGFyc2VDb25maWd1cmF0aW9uRmlsZXMoc2VsZiwgcHJlZmlsZXMsIHBvc3RmaWxlcyk6CisgICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKKyAgICAgICAgYmIucGFyc2UuaW5pdF9wYXJzZXIoZGF0YSkKKworICAgICAgICAjIFBhcnNlIGZpbGVzIGZvciBsb2FkaW5nICpiZWZvcmUqIGJpdGJha2UuY29uZiBhbmQgYW55IGluY2x1ZGVzCisgICAgICAgIGZvciBmIGluIHByZWZpbGVzOgorICAgICAgICAgICAgZGF0YSA9IHBhcnNlX2NvbmZpZ19maWxlKGYsIGRhdGEpCisKKyAgICAgICAgbGF5ZXJjb25mID0gc2VsZi5fZmluZExheWVyQ29uZihkYXRhKQorICAgICAgICBpZiBsYXllcmNvbmY6CisgICAgICAgICAgICBwYXJzZWxvZy5kZWJ1ZygyLCAiRm91bmQgYmJsYXllcnMuY29uZiAoJXMpIiwgbGF5ZXJjb25mKQorICAgICAgICAgICAgIyBCeSBkZWZpbml0aW9uIGJibGF5ZXJzLmNvbmYgaXMgaW4gY29uZi8gb2YgVE9QRElSLgorICAgICAgICAgICAgIyBXZSBtYXkgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoIGN3ZCBzb21ld2hlcmUgZWxzZSBzbyByZXNldCBUT1BESVIKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJUT1BESVIiLCBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKGxheWVyY29uZikpKQorICAgICAgICAgICAgZGF0YSA9IHBhcnNlX2NvbmZpZ19maWxlKGxheWVyY29uZiwgZGF0YSkKKworICAgICAgICAgICAgbGF5ZXJzID0gKGRhdGEuZ2V0VmFyKCdCQkxBWUVSUycsIFRydWUpIG9yICIiKS5zcGxpdCgpCisKKyAgICAgICAgICAgIGRhdGEgPSBiYi5kYXRhLmNyZWF0ZUNvcHkoZGF0YSkKKyAgICAgICAgICAgIGFwcHJvdmVkID0gYmIudXRpbHMuYXBwcm92ZWRfdmFyaWFibGVzKCkKKyAgICAgICAgICAgIGZvciBsYXllciBpbiBsYXllcnM6CisgICAgICAgICAgICAgICAgcGFyc2Vsb2cuZGVidWcoMiwgIkFkZGluZyBsYXllciAlcyIsIGxheWVyKQorICAgICAgICAgICAgICAgIGlmICdIT01FJyBpbiBhcHByb3ZlZCBhbmQgJ34nIGluIGxheWVyOgorICAgICAgICAgICAgICAgICAgICBsYXllciA9IG9zLnBhdGguZXhwYW5kdXNlcihsYXllcikKKyAgICAgICAgICAgICAgICBkYXRhLnNldFZhcignTEFZRVJESVInLCBsYXllcikKKyAgICAgICAgICAgICAgICBkYXRhID0gcGFyc2VfY29uZmlnX2ZpbGUob3MucGF0aC5qb2luKGxheWVyLCAiY29uZiIsICJsYXllci5jb25mIiksIGRhdGEpCisgICAgICAgICAgICAgICAgZGF0YS5leHBhbmRWYXJyZWYoJ0xBWUVSRElSJykKKworICAgICAgICAgICAgZGF0YS5kZWxWYXIoJ0xBWUVSRElSJykKKworICAgICAgICBpZiBub3QgZGF0YS5nZXRWYXIoIkJCUEFUSCIsIFRydWUpOgorICAgICAgICAgICAgbXNnID0gIlRoZSBCQlBBVEggdmFyaWFibGUgaXMgbm90IHNldCIKKyAgICAgICAgICAgIGlmIG5vdCBsYXllcmNvbmY6CisgICAgICAgICAgICAgICAgbXNnICs9ICgiIGFuZCBiaXRiYWtlIGRpZCBub3QgZmluZCBhIGNvbmYvYmJsYXllcnMuY29uZiBmaWxlIGluIgorICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGUgZXhwZWN0ZWQgbG9jYXRpb24uXG5NYXliZSB5b3UgYWNjaWRlbnRhbGx5IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZva2VkIGJpdGJha2UgZnJvbSB0aGUgd3JvbmcgZGlyZWN0b3J5PyIpCisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KG1zZykKKworICAgICAgICBkYXRhID0gcGFyc2VfY29uZmlnX2ZpbGUob3MucGF0aC5qb2luKCJjb25mIiwgImJpdGJha2UuY29uZiIpLCBkYXRhKQorCisgICAgICAgICMgUGFyc2UgZmlsZXMgZm9yIGxvYWRpbmcgKmFmdGVyKiBiaXRiYWtlLmNvbmYgYW5kIGFueSBpbmNsdWRlcworICAgICAgICBmb3IgcCBpbiBwb3N0ZmlsZXM6CisgICAgICAgICAgICBkYXRhID0gcGFyc2VfY29uZmlnX2ZpbGUocCwgZGF0YSkKKworICAgICAgICAjIEhhbmRsZSBhbnkgSU5IRVJJVHMgYW5kIGluaGVyaXQgdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgYmJjbGFzc2VzICA9IFsiYmFzZSJdICsgKGRhdGEuZ2V0VmFyKCdJTkhFUklUJywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKyAgICAgICAgZm9yIGJiY2xhc3MgaW4gYmJjbGFzc2VzOgorICAgICAgICAgICAgZGF0YSA9IF9pbmhlcml0KGJiY2xhc3MsIGRhdGEpCisKKyAgICAgICAgIyBOb21hbGx5IHdlIG9ubHkgcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnMgYXQgdGhlIGVuZCBvZiBwYXJzaW5nIC5iYiBmaWxlcworICAgICAgICAjIFdlIHJlZ2lzdGVyIGFueSBoYW5kbGVycyB3ZSd2ZSBmb3VuZCBzbyBmYXIgaGVyZS4uLgorICAgICAgICBmb3IgdmFyIGluIGRhdGEuZ2V0VmFyKCdfX0JCSEFORExFUlMnLCBGYWxzZSkgb3IgW106CisgICAgICAgICAgICBiYi5ldmVudC5yZWdpc3Rlcih2YXIsIGRhdGEuZ2V0VmFyKHZhciwgRmFsc2UpLCAgKGRhdGEuZ2V0VmFyRmxhZyh2YXIsICJldmVudG1hc2siLCBUcnVlKSBvciAiIikuc3BsaXQoKSkKKworICAgICAgICBpZiBkYXRhLmdldFZhcigiQkJfV09SS0VSQ09OVEVYVCIsIEZhbHNlKSBpcyBOb25lOgorICAgICAgICAgICAgYmIuZmV0Y2guZmV0Y2hlcl9pbml0KGRhdGEpCisgICAgICAgIGJiLmNvZGVwYXJzZXIucGFyc2VyX2NhY2hlX2luaXQoZGF0YSkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5Db25maWdQYXJzZWQoKSwgZGF0YSkKKworICAgICAgICBpZiBkYXRhLmdldFZhcigiQkJfSU5WQUxJRENPTkYiLCBGYWxzZSkgaXMgVHJ1ZToKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJCQl9JTlZBTElEQ09ORiIsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5wYXJzZUNvbmZpZ3VyYXRpb25GaWxlcyhzZWxmLnByZWZpbGVzLCBzZWxmLnBvc3RmaWxlcykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGJiLnBhcnNlLmluaXRfcGFyc2VyKGRhdGEpCisgICAgICAgIGRhdGEuc2V0VmFyKCdCQklOQ0xVREVEJyxiYi5wYXJzZS5nZXRfZmlsZV9kZXBlbmRzKGRhdGEpKQorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYuZGF0YV9oYXNoID0gZGF0YS5nZXRfaGFzaCgpCisKKworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9kYWVtb25pemUucHkgYi9iaXRiYWtlL2xpYi9iYi9kYWVtb25pemUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2YTYxOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2RhZW1vbml6ZS5weQpAQCAtMCwwICsxLDE5MyBAQAorIiIiCitQeXRob24gRGFlbW9uaXppbmcgaGVscGVyCisKK0NvbmZpZ3VyYWJsZSBkYWVtb24gYmVoYXZpb3JzOgorCisgICAgMS4pIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHNldCB0byB0aGUgIi8iIGRpcmVjdG9yeS4KKyAgICAyLikgVGhlIGN1cnJlbnQgZmlsZSBjcmVhdGlvbiBtb2RlIG1hc2sgc2V0IHRvIDAuCisgICAgMy4pIENsb3NlIGFsbCBvcGVuIGZpbGVzICgxMDI0KS4gCisgICAgNC4pIFJlZGlyZWN0IHN0YW5kYXJkIEkvTyBzdHJlYW1zIHRvICIvZGV2L251bGwiLgorCitBIGZhaWxlZCBjYWxsIHRvIGZvcmsoKSBub3cgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKworUmVmZXJlbmNlczoKKyAgICAxKSBBZHZhbmNlZCBQcm9ncmFtbWluZyBpbiB0aGUgVW5peCBFbnZpcm9ubWVudDogVy4gUmljaGFyZCBTdGV2ZW5zCisJaHR0cDovL3d3dy5hcHVlYm9vay5jb20vYXB1ZTNlLmh0bWwKKyAgICAyKSBUaGUgTGludXggUHJvZ3JhbW1pbmcgSW50ZXJmYWNlOiBNaWNoYWVsIEtlcnJpc2sKKwlodHRwOi8vbWFuNy5vcmcvdGxwaS9pbmRleC5odG1sCisgICAgMykgVW5peCBQcm9ncmFtbWluZyBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczoKKwlodHRwOi8vd3d3LmZhcXMub3JnL2ZhcXMvdW5peC1mYXEvcHJvZ3JhbW1lci9mYXEvCisKK01vZGlmaWVkIHRvIGFsbG93IGEgZnVuY3Rpb24gdG8gYmUgZGFlbW9uaXplZCBhbmQgcmV0dXJuIGZvciAKK2JpdGJha2UgdXNlIGJ5IFJpY2hhcmQgUHVyZGllCisiIiIKKworX19hdXRob3JfXyA9ICJDaGFkIEouIFNjaHJvZWRlciIKK19fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IChDKSAyMDA1IENoYWQgSi4gU2Nocm9lZGVyIgorX192ZXJzaW9uX18gPSAiMC4yIgorCisjIFN0YW5kYXJkIFB5dGhvbiBtb2R1bGVzLgoraW1wb3J0IG9zICAgICAgICAgICAgICAgICAgICAjIE1pc2NlbGxhbmVvdXMgT1MgaW50ZXJmYWNlcy4KK2ltcG9ydCBzeXMgICAgICAgICAgICAgICAgICAgIyBTeXN0ZW0tc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgZnVuY3Rpb25zLgorCisjIERlZmF1bHQgZGFlbW9uIHBhcmFtZXRlcnMuCisjIEZpbGUgbW9kZSBjcmVhdGlvbiBtYXNrIG9mIHRoZSBkYWVtb24uCisjIEZvciBCaXRCYWtlJ3MgY2hpbGRyZW4sIHdlIGRvIHdhbnQgdG8gaW5oZXJpdCB0aGUgcGFyZW50IHVtYXNrLgorVU1BU0sgPSBOb25lCisKKyMgRGVmYXVsdCBtYXhpbXVtIGZvciB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBmaWxlIGRlc2NyaXB0b3JzLgorTUFYRkQgPSAxMDI0CisKKyMgVGhlIHN0YW5kYXJkIEkvTyBmaWxlIGRlc2NyaXB0b3JzIGFyZSByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCBieSBkZWZhdWx0LgoraWYgKGhhc2F0dHIob3MsICJkZXZudWxsIikpOgorICAgIFJFRElSRUNUX1RPID0gb3MuZGV2bnVsbAorZWxzZToKKyAgICBSRURJUkVDVF9UTyA9ICIvZGV2L251bGwiCisKK2RlZiBjcmVhdGVEYWVtb24oZnVuY3Rpb24sIGxvZ2ZpbGUpOgorICAgICIiIgorICAgIERldGFjaCBhIHByb2Nlc3MgZnJvbSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgYW5kIHJ1biBpdCBpbiB0aGUKKyAgICBiYWNrZ3JvdW5kIGFzIGEgZGFlbW9uLCByZXR1cm5pbmcgY29udHJvbCB0byB0aGUgY2FsbGVyLgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgICAjIEZvcmsgYSBjaGlsZCBwcm9jZXNzIHNvIHRoZSBwYXJlbnQgY2FuIGV4aXQuICBUaGlzIHJldHVybnMgY29udHJvbCB0bworICAgICAgICAjIHRoZSBjb21tYW5kLWxpbmUgb3Igc2hlbGwuICBJdCBhbHNvIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2hpbGQgd2lsbCBub3QKKyAgICAgICAgIyBiZSBhIHByb2Nlc3MgZ3JvdXAgbGVhZGVyLCBzaW5jZSB0aGUgY2hpbGQgcmVjZWl2ZXMgYSBuZXcgcHJvY2VzcyBJRAorICAgICAgICAjIGFuZCBpbmhlcml0cyB0aGUgcGFyZW50J3MgcHJvY2VzcyBncm91cCBJRC4gIFRoaXMgc3RlcCBpcyByZXF1aXJlZAorICAgICAgICAjIHRvIGluc3VyZSB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gb3Muc2V0c2lkIGlzIHN1Y2Nlc3NmdWwuCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiJXMgWyVkXSIgJSAoZS5zdHJlcnJvciwgZS5lcnJubykpCisKKyAgICBpZiAocGlkID09IDApOiAgICAgICMgVGhlIGZpcnN0IGNoaWxkLgorICAgICAgICAjIFRvIGJlY29tZSB0aGUgc2Vzc2lvbiBsZWFkZXIgb2YgdGhpcyBuZXcgc2Vzc2lvbiBhbmQgdGhlIHByb2Nlc3MgZ3JvdXAKKyAgICAgICAgIyBsZWFkZXIgb2YgdGhlIG5ldyBwcm9jZXNzIGdyb3VwLCB3ZSBjYWxsIG9zLnNldHNpZCgpLiAgVGhlIHByb2Nlc3MgaXMKKyAgICAgICAgIyBhbHNvIGd1YXJhbnRlZWQgbm90IHRvIGhhdmUgYSBjb250cm9sbGluZyB0ZXJtaW5hbC4KKyAgICAgICAgb3Muc2V0c2lkKCkKKworICAgICAgICAjIElzIGlnbm9yaW5nIFNJR0hVUCBuZWNlc3Nhcnk/CisgICAgICAgICMKKyAgICAgICAgIyBJdCdzIG9mdGVuIHN1Z2dlc3RlZCB0aGF0IHRoZSBTSUdIVVAgc2lnbmFsIHNob3VsZCBiZSBpZ25vcmVkIGJlZm9yZQorICAgICAgICAjIHRoZSBzZWNvbmQgZm9yayB0byBhdm9pZCBwcmVtYXR1cmUgdGVybWluYXRpb24gb2YgdGhlIHByb2Nlc3MuICBUaGUKKyAgICAgICAgIyByZWFzb24gaXMgdGhhdCB3aGVuIHRoZSBmaXJzdCBjaGlsZCB0ZXJtaW5hdGVzLCBhbGwgcHJvY2Vzc2VzLCBlLmcuCisgICAgICAgICMgdGhlIHNlY29uZCBjaGlsZCwgaW4gdGhlIG9ycGhhbmVkIGdyb3VwIHdpbGwgYmUgc2VudCBhIFNJR0hVUC4KKyAgICAgICAgIworICAgICAgICAjICJIb3dldmVyLCBhcyBwYXJ0IG9mIHRoZSBzZXNzaW9uIG1hbmFnZW1lbnQgc3lzdGVtLCB0aGVyZSBhcmUgZXhhY3RseQorICAgICAgICAjIHR3byBjYXNlcyB3aGVyZSBTSUdIVVAgaXMgc2VudCBvbiB0aGUgZGVhdGggb2YgYSBwcm9jZXNzOgorICAgICAgICAjCisgICAgICAgICMgICAgMSkgV2hlbiB0aGUgcHJvY2VzcyB0aGF0IGRpZXMgaXMgdGhlIHNlc3Npb24gbGVhZGVyIG9mIGEgc2Vzc2lvbiB0aGF0CisgICAgICAgICMgICAgICAgIGlzIGF0dGFjaGVkIHRvIGEgdGVybWluYWwgZGV2aWNlLCBTSUdIVVAgaXMgc2VudCB0byBhbGwgcHJvY2Vzc2VzCisgICAgICAgICMgICAgICAgIGluIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAgb2YgdGhhdCB0ZXJtaW5hbCBkZXZpY2UuCisgICAgICAgICMgICAgMikgV2hlbiB0aGUgZGVhdGggb2YgYSBwcm9jZXNzIGNhdXNlcyBhIHByb2Nlc3MgZ3JvdXAgdG8gYmVjb21lCisgICAgICAgICMgICAgICAgIG9ycGhhbmVkLCBhbmQgb25lIG9yIG1vcmUgcHJvY2Vzc2VzIGluIHRoZSBvcnBoYW5lZCBncm91cCBhcmUKKyAgICAgICAgIyAgICAgICAgc3RvcHBlZCwgdGhlbiBTSUdIVVAgYW5kIFNJR0NPTlQgYXJlIHNlbnQgdG8gYWxsIG1lbWJlcnMgb2YgdGhlCisgICAgICAgICMgICAgICAgIG9ycGhhbmVkIGdyb3VwLiIgWzJdCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgZmlyc3QgY2FzZSBjYW4gYmUgaWdub3JlZCBzaW5jZSB0aGUgY2hpbGQgaXMgZ3VhcmFudGVlZCBub3QgdG8gaGF2ZQorICAgICAgICAjIGEgY29udHJvbGxpbmcgdGVybWluYWwuICBUaGUgc2Vjb25kIGNhc2UgaXNuJ3Qgc28gZWFzeSB0byBkaXNtaXNzLgorICAgICAgICAjIFRoZSBwcm9jZXNzIGdyb3VwIGlzIG9ycGhhbmVkIHdoZW4gdGhlIGZpcnN0IGNoaWxkIHRlcm1pbmF0ZXMgYW5kCisgICAgICAgICMgUE9TSVguMSByZXF1aXJlcyB0aGF0IGV2ZXJ5IFNUT1BQRUQgcHJvY2VzcyBpbiBhbiBvcnBoYW5lZCBwcm9jZXNzCisgICAgICAgICMgZ3JvdXAgYmUgc2VudCBhIFNJR0hVUCBzaWduYWwgZm9sbG93ZWQgYnkgYSBTSUdDT05UIHNpZ25hbC4gIFNpbmNlIHRoZQorICAgICAgICAjIHNlY29uZCBjaGlsZCBpcyBub3QgU1RPUFBFRCB0aG91Z2gsIHdlIGNhbiBzYWZlbHkgZm9yZWdvIGlnbm9yaW5nIHRoZQorICAgICAgICAjIFNJR0hVUCBzaWduYWwuICBJbiBhbnkgY2FzZSwgdGhlcmUgYXJlIG5vIGlsbC1lZmZlY3RzIGlmIGl0IGlzIGlnbm9yZWQuCisgICAgICAgICMKKyAgICAgICAgIyBpbXBvcnQgc2lnbmFsICAgICAgICAgICAgICAjIFNldCBoYW5kbGVycyBmb3IgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAgICAgICAgIyBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNpZ25hbC5TSUdfSUdOKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgRm9yayBhIHNlY29uZCBjaGlsZCBhbmQgZXhpdCBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHpvbWJpZXMuICBUaGlzCisgICAgICAgICAgICAjIGNhdXNlcyB0aGUgc2Vjb25kIGNoaWxkIHByb2Nlc3MgdG8gYmUgb3JwaGFuZWQsIG1ha2luZyB0aGUgaW5pdAorICAgICAgICAgICAgIyBwcm9jZXNzIHJlc3BvbnNpYmxlIGZvciBpdHMgY2xlYW51cC4gIEFuZCwgc2luY2UgdGhlIGZpcnN0IGNoaWxkIGlzCisgICAgICAgICAgICAjIGEgc2Vzc2lvbiBsZWFkZXIgd2l0aG91dCBhIGNvbnRyb2xsaW5nIHRlcm1pbmFsLCBpdCdzIHBvc3NpYmxlIGZvcgorICAgICAgICAgICAgIyBpdCB0byBhY3F1aXJlIG9uZSBieSBvcGVuaW5nIGEgdGVybWluYWwgaW4gdGhlIGZ1dHVyZSAoU3lzdGVtIFYtCisgICAgICAgICAgICAjIGJhc2VkIHN5c3RlbXMpLiAgVGhpcyBzZWNvbmQgZm9yayBndWFyYW50ZWVzIHRoYXQgdGhlIGNoaWxkIGlzIG5vCisgICAgICAgICAgICAjIGxvbmdlciBhIHNlc3Npb24gbGVhZGVyLCBwcmV2ZW50aW5nIHRoZSBkYWVtb24gZnJvbSBldmVyIGFjcXVpcmluZworICAgICAgICAgICAgIyBhIGNvbnRyb2xsaW5nIHRlcm1pbmFsLgorICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpICAgICAjIEZvcmsgYSBzZWNvbmQgY2hpbGQuCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIiVzIFslZF0iICUgKGUuc3RyZXJyb3IsIGUuZXJybm8pKQorCisgICAgICAgIGlmIChwaWQgPT0gMCk6ICAjIFRoZSBzZWNvbmQgY2hpbGQuCisgICAgICAgICAgICAjIFdlIHByb2JhYmx5IGRvbid0IHdhbnQgdGhlIGZpbGUgbW9kZSBjcmVhdGlvbiBtYXNrIGluaGVyaXRlZCBmcm9tCisgICAgICAgICAgICAjIHRoZSBwYXJlbnQsIHNvIHdlIGdpdmUgdGhlIGNoaWxkIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBwZXJtaXNzaW9ucy4KKyAgICAgICAgICAgIGlmIFVNQVNLIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG9zLnVtYXNrKFVNQVNLKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQYXJlbnQgKHRoZSBmaXJzdCBjaGlsZCkgb2YgdGhlIHNlY29uZCBjaGlsZC4KKyAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgZWxzZToKKyAgICAgICAgIyBleGl0KCkgb3IgX2V4aXQoKT8KKyAgICAgICAgIyBfZXhpdCBpcyBsaWtlIGV4aXQoKSwgYnV0IGl0IGRvZXNuJ3QgY2FsbCBhbnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQKKyAgICAgICAgIyB3aXRoIGF0ZXhpdCAoYW5kIG9uX2V4aXQpIG9yIGFueSByZWdpc3RlcmVkIHNpZ25hbCBoYW5kbGVycy4gIEl0IGFsc28KKyAgICAgICAgIyBjbG9zZXMgYW55IG9wZW4gZmlsZSBkZXNjcmlwdG9ycy4gIFVzaW5nIGV4aXQoKSBtYXkgY2F1c2UgYWxsIHN0ZGlvCisgICAgICAgICMgc3RyZWFtcyB0byBiZSBmbHVzaGVkIHR3aWNlIGFuZCBhbnkgdGVtcG9yYXJ5IGZpbGVzIG1heSBiZSB1bmV4cGVjdGVkbHkKKyAgICAgICAgIyByZW1vdmVkLiAgSXQncyB0aGVyZWZvcmUgcmVjb21tZW5kZWQgdGhhdCBjaGlsZCBicmFuY2hlcyBvZiBhIGZvcmsoKQorICAgICAgICAjIGFuZCB0aGUgcGFyZW50IGJyYW5jaChlcykgb2YgYSBkYWVtb24gdXNlIF9leGl0KCkuCisgICAgICAgIHJldHVybgorCisgICAgIyBDbG9zZSBhbGwgb3BlbiBmaWxlIGRlc2NyaXB0b3JzLiAgVGhpcyBwcmV2ZW50cyB0aGUgY2hpbGQgZnJvbSBrZWVwaW5nCisgICAgIyBvcGVuIGFueSBmaWxlIGRlc2NyaXB0b3JzIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQuICBUaGVyZSBpcyBhIHZhcmlldHkKKyAgICAjIG9mIG1ldGhvZHMgdG8gYWNjb21wbGlzaCB0aGlzIHRhc2suICBUaHJlZSBhcmUgbGlzdGVkIGJlbG93LgorICAgICMKKyAgICAjIFRyeSB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUsIFNDX09QRU5fTUFYLCB0byBvYnRhaW4gdGhlIG1heGltdW0KKyAgICAjIG51bWJlciBvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgdG8gY2xvc2UuICBJZiBpdCBkb2Vzbid0IGV4aXN0LCB1c2UKKyAgICAjIHRoZSBkZWZhdWx0IHZhbHVlIChjb25maWd1cmFibGUpLgorICAgICMKKyAgICAjIHRyeToKKyAgICAjICAgICBtYXhmZCA9IG9zLnN5c2NvbmYoIlNDX09QRU5fTUFYIikKKyAgICAjIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICMgICAgIG1heGZkID0gTUFYRkQKKyAgICAjCisgICAgIyBPUgorICAgICMKKyAgICAjIGlmIChvcy5zeXNjb25mX25hbWVzLmhhc19rZXkoIlNDX09QRU5fTUFYIikpOgorICAgICMgICAgIG1heGZkID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorICAgICMgZWxzZToKKyAgICAjICAgICBtYXhmZCA9IE1BWEZECisgICAgIworICAgICMgT1IKKyAgICAjCisgICAgIyBVc2UgdGhlIGdldHJsaW1pdCBtZXRob2QgdG8gcmV0cmlldmUgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIG51bWJlcgorICAgICMgdGhhdCBjYW4gYmUgb3BlbmVkIGJ5IHRoaXMgcHJvY2Vzcy4gIElmIHRoZXJlIGlzIG5vIGxpbWl0IG9uIHRoZQorICAgICMgcmVzb3VyY2UsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAjCisgICAgaW1wb3J0IHJlc291cmNlICAgICAgICAgICAgICMgUmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24uCisgICAgbWF4ZmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX05PRklMRSlbMV0KKyAgICBpZiAobWF4ZmQgPT0gcmVzb3VyY2UuUkxJTV9JTkZJTklUWSk6CisgICAgICAgIG1heGZkID0gTUFYRkQKKyAgCisgICAgIyBJdGVyYXRlIHRocm91Z2ggYW5kIGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzLgorIyAgICBmb3IgZmQgaW4gcmFuZ2UoMCwgbWF4ZmQpOgorIyAgICAgICAgdHJ5OgorIyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorIyAgICAgICAgZXhjZXB0IE9TRXJyb3I6ICAgICAgICAjIEVSUk9SLCBmZCB3YXNuJ3Qgb3BlbiB0byBiZWdpbiB3aXRoIChpZ25vcmVkKQorIyAgICAgICAgICAgIHBhc3MKKworICAgICMgUmVkaXJlY3QgdGhlIHN0YW5kYXJkIEkvTyBmaWxlIGRlc2NyaXB0b3JzIHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4gIFNpbmNlCisgICAgIyB0aGUgZGFlbW9uIGhhcyBubyBjb250cm9sbGluZyB0ZXJtaW5hbCwgbW9zdCBkYWVtb25zIHJlZGlyZWN0IHN0ZGluLAorICAgICMgc3Rkb3V0LCBhbmQgc3RkZXJyIHRvIC9kZXYvbnVsbC4gIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHNpZGUtZWZmZWN0cworICAgICMgZnJvbSByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBzdGFuZGFyZCBJL08gZmlsZSBkZXNjcmlwdG9ycy4KKworICAgICMgVGhpcyBjYWxsIHRvIG9wZW4gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIGxvd2VzdCBmaWxlIGRlc2NyaXB0b3IsCisgICAgIyB3aGljaCB3aWxsIGJlIDAgKHN0ZGluKSwgc2luY2UgaXQgd2FzIGNsb3NlZCBhYm92ZS4KKyMgICAgb3Mub3BlbihSRURJUkVDVF9UTywgb3MuT19SRFdSKSAgICAjIHN0YW5kYXJkIGlucHV0ICgwKQorCisgICAgIyBEdXBsaWNhdGUgc3RhbmRhcmQgaW5wdXQgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvci4KKyMgICAgb3MuZHVwMigwLCAxKSAgICAgICAgICAgICAgICAgICAgICAjIHN0YW5kYXJkIG91dHB1dCAoMSkKKyMgICAgb3MuZHVwMigwLCAyKSAgICAgICAgICAgICAgICAgICAgICAjIHN0YW5kYXJkIGVycm9yICgyKQorCisKKyAgICBzaSA9IGZpbGUoJy9kZXYvbnVsbCcsICdyJykKKyAgICBzbyA9IGZpbGUobG9nZmlsZSwgJ3cnKQorICAgIHNlID0gc28KKworCisgICAgIyBSZXBsYWNlIHRob3NlIGZkcyB3aXRoIG91ciBvd24KKyAgICBvcy5kdXAyKHNpLmZpbGVubygpLCBzeXMuc3RkaW4uZmlsZW5vKCkpCisgICAgb3MuZHVwMihzby5maWxlbm8oKSwgc3lzLnN0ZG91dC5maWxlbm8oKSkKKyAgICBvcy5kdXAyKHNlLmZpbGVubygpLCBzeXMuc3RkZXJyLmZpbGVubygpKQorCisgICAgZnVuY3Rpb24oKQorCisgICAgb3MuX2V4aXQoMCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2RhdGEucHkgYi9iaXRiYWtlL2xpYi9iYi9kYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDE1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9kYXRhLnB5CkBAIC0wLDAgKzEsNDQ2IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdEYXRhJyBpbXBsZW1lbnRhdGlvbnMKKworRnVuY3Rpb25zIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKworVGhlIGV4cGFuZEtleXMgYW5kIHVwZGF0ZV9kYXRhIGFyZSB0aGUgbW9zdCBleHBlbnNpdmUKK29wZXJhdGlvbnMuIEF0IG5pZ2h0IHRoZSBjb29raWUgbW9uc3RlciBjYW1lIGJ5IGFuZAorc3VnZ2VzdGVkICdnaXZlIG1lIGNvb2tpZXMgb24gc2V0dGluZyB0aGUgdmFyaWFibGVzIGFuZAordGhpbmdzIHdpbGwgd29yayBvdXQnLiBUYWtpbmcgdGhpcyBzdWdnZXN0aW9uIGludG8gYWNjb3VudAorYXBwbHlpbmcgdGhlIHNraWxscyBmcm9tIHRoZSBub3QgeWV0IHBhc3NlZCAnRW50d3VyZiB1bmQKK0FuYWx5c2Ugdm9uIEFsZ29yaXRobWVuJyBsZWN0dXJlIGFuZCB0aGUgY29va2llCittb25zdGVyIHNlZW1zIHRvIGJlIHJpZ2h0LiBXZSB3aWxsIHRyYWNrIHNldFZhciBtb3JlIGNhcmVmdWxseQordG8gaGF2ZSBmYXN0ZXIgdXBkYXRlX2RhdGEgYW5kIGV4cGFuZEtleXMgb3BlcmF0aW9ucy4KKworVGhpcyBpcyBhIHRyYWRlLW9mZiBiZXR3ZWVuIHNwZWVkIGFuZCBtZW1vcnkgYWdhaW4gYnV0Cit0aGUgc3BlZWQgaXMgbW9yZSBjcml0aWNhbCBoZXJlLgorIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgc3lzLCBvcywgcmUKK2lmIHN5cy5hcmd2WzBdWy01Ol0gPT0gInB5ZG9jIjoKKyAgICBwYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlsxXSkpCitlbHNlOgorICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSkKK3N5cy5wYXRoLmluc2VydCgwLCBwYXRoKQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnkKKworZnJvbSBiYiBpbXBvcnQgZGF0YV9zbWFydAorZnJvbSBiYiBpbXBvcnQgY29kZXBhcnNlcgoraW1wb3J0IGJiCisKK2xvZ2dlciA9IGRhdGFfc21hcnQubG9nZ2VyCitfZGljdF90eXBlID0gZGF0YV9zbWFydC5EYXRhU21hcnQKKworZGVmIGluaXQoKToKKyAgICAiIiJSZXR1cm4gYSBuZXcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgQml0YmFrZSBkYXRhIiIiCisgICAgcmV0dXJuIF9kaWN0X3R5cGUoKQorCitkZWYgaW5pdF9kYihwYXJlbnQgPSBOb25lKToKKyAgICAiIiJSZXR1cm4gYSBuZXcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgQml0YmFrZSBkYXRhLAorICAgIG9wdGlvbmFsbHkgYmFzZWQgb24gYW4gZXhpc3Rpbmcgb2JqZWN0IiIiCisgICAgaWYgcGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcGFyZW50LmNyZWF0ZUNvcHkoKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfZGljdF90eXBlKCkKKworZGVmIGNyZWF0ZUNvcHkoc291cmNlKToKKyAgICAiIiJMaW5rIHRoZSBzb3VyY2Ugc2V0IHRvIHRoZSBkZXN0aW5hdGlvbgorICAgIElmIG9uZSBkb2VzIG5vdCBmaW5kIHRoZSB2YWx1ZSBpbiB0aGUgZGVzdGluYXRpb24gc2V0LAorICAgIHNlYXJjaCB3aWxsIGdvIG9uIHRvIHRoZSBzb3VyY2Ugc2V0IHRvIGdldCB0aGUgdmFsdWUuCisgICAgVmFsdWUgZnJvbSBzb3VyY2UgYXJlIGNvcHktb24td3JpdGUuIGkuZS4gYW55IHRyeSB0bworICAgIG1vZGlmeSBvbmUgb2YgdGhlbSB3aWxsIGVuZCB1cCBwdXR0aW5nIHRoZSBtb2RpZmllZCB2YWx1ZQorICAgIGluIHRoZSBkZXN0aW5hdGlvbiBzZXQuCisgICAgIiIiCisgICAgcmV0dXJuIHNvdXJjZS5jcmVhdGVDb3B5KCkKKworZGVmIGluaXRWYXIodmFyLCBkKToKKyAgICAiIiJOb24tZGVzdHJ1Y3RpdmUgdmFyIGluaXQgZm9yIGRhdGEgc3RydWN0dXJlIiIiCisgICAgZC5pbml0VmFyKHZhcikKKworCitkZWYgc2V0VmFyKHZhciwgdmFsdWUsIGQpOgorICAgICIiIlNldCBhIHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdmFsdWUiIiIKKyAgICBkLnNldFZhcih2YXIsIHZhbHVlKQorCisKK2RlZiBnZXRWYXIodmFyLCBkLCBleHAgPSBGYWxzZSk6CisgICAgIiIiR2V0cyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSIiIgorICAgIHJldHVybiBkLmdldFZhcih2YXIsIGV4cCkKKworCitkZWYgcmVuYW1lVmFyKGtleSwgbmV3a2V5LCBkKToKKyAgICAiIiJSZW5hbWVzIGEgdmFyaWFibGUgZnJvbSBrZXkgdG8gbmV3a2V5IiIiCisgICAgZC5yZW5hbWVWYXIoa2V5LCBuZXdrZXkpCisKK2RlZiBkZWxWYXIodmFyLCBkKToKKyAgICAiIiJSZW1vdmVzIGEgdmFyaWFibGUgZnJvbSB0aGUgZGF0YSBzZXQiIiIKKyAgICBkLmRlbFZhcih2YXIpCisKK2RlZiBhcHBlbmRWYXIodmFyLCB2YWx1ZSwgZCk6CisgICAgIiIiQXBwZW5kIGFkZGl0aW9uYWwgdmFsdWUgdG8gYSB2YXJpYWJsZSIiIgorICAgIGQuYXBwZW5kVmFyKHZhciwgdmFsdWUpCisKK2RlZiBzZXRWYXJGbGFnKHZhciwgZmxhZywgZmxhZ3ZhbHVlLCBkKToKKyAgICAiIiJTZXQgYSBmbGFnIGZvciBhIGdpdmVuIHZhcmlhYmxlIHRvIGEgZ2l2ZW4gdmFsdWUiIiIKKyAgICBkLnNldFZhckZsYWcodmFyLCBmbGFnLCBmbGFndmFsdWUpCisKK2RlZiBnZXRWYXJGbGFnKHZhciwgZmxhZywgZCk6CisgICAgIiIiR2V0cyBnaXZlbiBmbGFnIGZyb20gZ2l2ZW4gdmFyIiIiCisgICAgcmV0dXJuIGQuZ2V0VmFyRmxhZyh2YXIsIGZsYWcpCisKK2RlZiBkZWxWYXJGbGFnKHZhciwgZmxhZywgZCk6CisgICAgIiIiUmVtb3ZlcyBhIGdpdmVuIGZsYWcgZnJvbSB0aGUgdmFyaWFibGUncyBmbGFncyIiIgorICAgIGQuZGVsVmFyRmxhZyh2YXIsIGZsYWcpCisKK2RlZiBzZXRWYXJGbGFncyh2YXIsIGZsYWdzLCBkKToKKyAgICAiIiJTZXQgdGhlIGZsYWdzIGZvciBhIGdpdmVuIHZhcmlhYmxlCisKKyAgICBOb3RlOgorICAgICAgICBzZXRWYXJGbGFncyB3aWxsIG5vdCBjbGVhciBwcmV2aW91cworICAgICAgICBmbGFncy4gVGhpbmsgb2YgdGhpcyBtZXRob2QgYXMKKyAgICAgICAgYWRkVmFyRmxhZ3MKKyAgICAiIiIKKyAgICBkLnNldFZhckZsYWdzKHZhciwgZmxhZ3MpCisKK2RlZiBnZXRWYXJGbGFncyh2YXIsIGQpOgorICAgICIiIkdldHMgYSB2YXJpYWJsZSdzIGZsYWdzIiIiCisgICAgcmV0dXJuIGQuZ2V0VmFyRmxhZ3ModmFyKQorCitkZWYgZGVsVmFyRmxhZ3ModmFyLCBkKToKKyAgICAiIiJSZW1vdmVzIGEgdmFyaWFibGUncyBmbGFncyIiIgorICAgIGQuZGVsVmFyRmxhZ3ModmFyKQorCitkZWYga2V5cyhkKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGtleXMgaW4gZCIiIgorICAgIHJldHVybiBkLmtleXMoKQorCisKK19fZXhwYW5kX3Zhcl9yZWdleHBfXyA9IHJlLmNvbXBpbGUociJcJHtbXnt9XSt9IikKK19fZXhwYW5kX3B5dGhvbl9yZWdleHBfXyA9IHJlLmNvbXBpbGUociJcJHtALis/fSIpCisKK2RlZiBleHBhbmQocywgZCwgdmFybmFtZSA9IE5vbmUpOgorICAgICIiIlZhcmlhYmxlIGV4cGFuc2lvbiB1c2luZyB0aGUgZGF0YSBzdG9yZSIiIgorICAgIHJldHVybiBkLmV4cGFuZChzLCB2YXJuYW1lKQorCitkZWYgZXhwYW5kS2V5cyhhbHRlcmRhdGEsIHJlYWRkYXRhID0gTm9uZSk6CisgICAgaWYgcmVhZGRhdGEgPT0gTm9uZToKKyAgICAgICAgcmVhZGRhdGEgPSBhbHRlcmRhdGEKKworICAgIHRvZG9saXN0ID0ge30KKyAgICBmb3Iga2V5IGluIGFsdGVyZGF0YToKKyAgICAgICAgaWYgbm90ICckeycgaW4ga2V5OgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBla2V5ID0gZXhwYW5kKGtleSwgcmVhZGRhdGEpCisgICAgICAgIGlmIGtleSA9PSBla2V5OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdG9kb2xpc3Rba2V5XSA9IGVrZXkKKworICAgICMgVGhlc2UgdHdvIGZvciBsb29wcyBhcmUgc3BsaXQgZm9yIHBlcmZvcm1hbmNlIHRvIG1heGltaXNlIHRoZQorICAgICMgdXNlZnVsbmVzcyBvZiB0aGUgZXhwYW5kIGNhY2hlCisgICAgZm9yIGtleSBpbiBzb3J0ZWQodG9kb2xpc3QpOgorICAgICAgICBla2V5ID0gdG9kb2xpc3Rba2V5XQorICAgICAgICBuZXd2YWwgPSBhbHRlcmRhdGEuZ2V0VmFyKGVrZXksIEZhbHNlKQorICAgICAgICBpZiBuZXd2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB2YWwgPSBhbHRlcmRhdGEuZ2V0VmFyKGtleSwgRmFsc2UpCisgICAgICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYmIud2FybigiVmFyaWFibGUga2V5ICVzICglcykgcmVwbGFjZXMgb3JpZ2luYWwga2V5ICVzICglcykuIiAlIChrZXksIHZhbCwgZWtleSwgbmV3dmFsKSkKKyAgICAgICAgYWx0ZXJkYXRhLnJlbmFtZVZhcihrZXksIGVrZXkpCisKK2RlZiBpbmhlcml0RnJvbU9TKGQsIHNhdmVkZW52LCBwZXJtaXR0ZWQpOgorICAgICIiIkluaGVyaXQgdmFyaWFibGVzIGZyb20gdGhlIGluaXRpYWwgZW52aXJvbm1lbnQuIiIiCisgICAgZXhwb3J0bGlzdCA9IGJiLnV0aWxzLnByZXNlcnZlZF9lbnZ2YXJzX2V4cG9ydGVkKCkKKyAgICBmb3IgcyBpbiBzYXZlZGVudi5rZXlzKCk6CisgICAgICAgIGlmIHMgaW4gcGVybWl0dGVkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGQuc2V0VmFyKHMsIHNhdmVkZW52LmdldFZhcihzLCBUcnVlKSwgb3AgPSAnZnJvbSBlbnYnKQorICAgICAgICAgICAgICAgIGlmIHMgaW4gZXhwb3J0bGlzdDoKKyAgICAgICAgICAgICAgICAgICAgZC5zZXRWYXJGbGFnKHMsICJleHBvcnQiLCBUcnVlLCBvcCA9ICdhdXRvIGVudiBleHBvcnQnKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKK2RlZiBlbWl0X3Zhcih2YXIsIG89c3lzLl9fc3Rkb3V0X18sIGQgPSBpbml0KCksIGFsbD1GYWxzZSk6CisgICAgIiIiRW1pdCBhIHZhcmlhYmxlIHRvIGJlIHNvdXJjZWQgYnkgYSBzaGVsbC4iIiIKKyAgICBpZiBkLmdldFZhckZsYWcodmFyLCAicHl0aG9uIik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZXhwb3J0ID0gZC5nZXRWYXJGbGFnKHZhciwgImV4cG9ydCIpCisgICAgdW5leHBvcnQgPSBkLmdldFZhckZsYWcodmFyLCAidW5leHBvcnQiKQorICAgIGZ1bmMgPSBkLmdldFZhckZsYWcodmFyLCAiZnVuYyIpCisgICAgaWYgbm90IGFsbCBhbmQgbm90IGV4cG9ydCBhbmQgbm90IHVuZXhwb3J0IGFuZCBub3QgZnVuYzoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICB0cnk6CisgICAgICAgIGlmIGFsbDoKKyAgICAgICAgICAgIG92YWwgPSBkLmdldFZhcih2YXIsIEZhbHNlKQorICAgICAgICB2YWwgPSBkLmdldFZhcih2YXIsIFRydWUpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgYmIuYnVpbGQuRnVuY0ZhaWxlZCk6CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgIG8ud3JpdGUoJyMgZXhwYW5zaW9uIG9mICVzIHRocmV3ICVzOiAlc1xuJyAlICh2YXIsIGV4Yy5fX2NsYXNzX18uX19uYW1lX18sIHN0cihleGMpKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBpZiBhbGw6CisgICAgICAgIGQudmFyaGlzdG9yeS5lbWl0KHZhciwgb3ZhbCwgdmFsLCBvLCBkKQorCisgICAgaWYgKHZhci5maW5kKCItIikgIT0gLTEgb3IgdmFyLmZpbmQoIi4iKSAhPSAtMSBvciB2YXIuZmluZCgneycpICE9IC0xIG9yIHZhci5maW5kKCd9JykgIT0gLTEgb3IgdmFyLmZpbmQoJysnKSAhPSAtMSkgYW5kIG5vdCBhbGw6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgdmFyRXhwYW5kZWQgPSBkLmV4cGFuZCh2YXIpCisKKyAgICBpZiB1bmV4cG9ydDoKKyAgICAgICAgby53cml0ZSgndW5zZXQgJXNcbicgJSB2YXJFeHBhbmRlZCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICB2YWwgPSBzdHIodmFsKQorCisgICAgaWYgdmFyRXhwYW5kZWQuc3RhcnRzd2l0aCgiQkFTSF9GVU5DXyIpOgorICAgICAgICB2YXJFeHBhbmRlZCA9IHZhckV4cGFuZGVkWzEwOi0yXQorICAgICAgICB2YWwgPSB2YWxbMzpdICMgU3RyaXAgb2ZmICIoKSAiCisgICAgICAgIG8ud3JpdGUoIiVzKCkgJXNcbiIgJSAodmFyRXhwYW5kZWQsIHZhbCkpCisgICAgICAgIG8ud3JpdGUoImV4cG9ydCAtZiAlc1xuIiAlICh2YXJFeHBhbmRlZCkpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBpZiBmdW5jOgorICAgICAgICAjIE5PVEU6IHNob3VsZCBwcm9iYWJseSBjaGVjayBmb3IgdW5iYWxhbmNlZCB7fSB3aXRoaW4gdGhlIHZhcgorICAgICAgICBvLndyaXRlKCIlcygpIHtcbiVzXG59XG4iICUgKHZhckV4cGFuZGVkLCB2YWwpKQorICAgICAgICByZXR1cm4gMQorCisgICAgaWYgZXhwb3J0OgorICAgICAgICBvLndyaXRlKCdleHBvcnQgJykKKworICAgICMgaWYgd2UncmUgZ29pbmcgdG8gb3V0cHV0IHRoaXMgd2l0aGluIGRvdWJsZXF1b3RlcywKKyAgICAjIHRvIGEgc2hlbGwsIHdlIG5lZWQgdG8gZXNjYXBlIHRoZSBxdW90ZXMgaW4gdGhlIHZhcgorICAgIGFsdGVyID0gcmUuc3ViKCciJywgJ1xcIicsIHZhbCkKKyAgICBhbHRlciA9IHJlLnN1YignXG4nLCAnIFxcXG4nLCBhbHRlcikKKyAgICBhbHRlciA9IHJlLnN1YignXFwkJywgJ1xcXFwkJywgYWx0ZXIpCisgICAgby53cml0ZSgnJXM9IiVzIlxuJyAlICh2YXJFeHBhbmRlZCwgYWx0ZXIpKQorICAgIHJldHVybiBGYWxzZQorCitkZWYgZW1pdF9lbnYobz1zeXMuX19zdGRvdXRfXywgZCA9IGluaXQoKSwgYWxsPUZhbHNlKToKKyAgICAiIiJFbWl0cyBhbGwgaXRlbXMgaW4gdGhlIGRhdGEgc3RvcmUgaW4gYSBmb3JtYXQgc3VjaCB0aGF0IGl0IGNhbiBiZSBzb3VyY2VkIGJ5IGEgc2hlbGwuIiIiCisKKyAgICBpc2Z1bmMgPSBsYW1iZGEga2V5OiBib29sKGQuZ2V0VmFyRmxhZyhrZXksICJmdW5jIikpCisgICAga2V5cyA9IHNvcnRlZCgoa2V5IGZvciBrZXkgaW4gZC5rZXlzKCkgaWYgbm90IGtleS5zdGFydHN3aXRoKCJfXyIpKSwga2V5PWlzZnVuYykKKyAgICBncm91cGVkID0gZ3JvdXBieShrZXlzLCBpc2Z1bmMpCisgICAgZm9yIGlzZnVuYywga2V5cyBpbiBncm91cGVkOgorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICBlbWl0X3ZhcihrZXksIG8sIGQsIGFsbCBhbmQgbm90IGlzZnVuYykgYW5kIG8ud3JpdGUoJ1xuJykKKworZGVmIGV4cG9ydGVkX2tleXMoZCk6CisgICAgcmV0dXJuIChrZXkgZm9yIGtleSBpbiBkLmtleXMoKSBpZiBub3Qga2V5LnN0YXJ0c3dpdGgoJ19fJykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZ2V0VmFyRmxhZyhrZXksICdleHBvcnQnKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGQuZ2V0VmFyRmxhZyhrZXksICd1bmV4cG9ydCcpKQorCitkZWYgZXhwb3J0ZWRfdmFycyhkKToKKyAgICBmb3Iga2V5IGluIGV4cG9ydGVkX2tleXMoZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gZC5nZXRWYXIoa2V5LCBUcnVlKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQga2V5LCBzdHIodmFsdWUpCisKK2RlZiBlbWl0X2Z1bmMoZnVuYywgbz1zeXMuX19zdGRvdXRfXywgZCA9IGluaXQoKSk6CisgICAgIiIiRW1pdHMgYWxsIGl0ZW1zIGluIHRoZSBkYXRhIHN0b3JlIGluIGEgZm9ybWF0IHN1Y2ggdGhhdCBpdCBjYW4gYmUgc291cmNlZCBieSBhIHNoZWxsLiIiIgorCisgICAga2V5cyA9IChrZXkgZm9yIGtleSBpbiBkLmtleXMoKSBpZiBub3Qga2V5LnN0YXJ0c3dpdGgoIl9fIikgYW5kIG5vdCBkLmdldFZhckZsYWcoa2V5LCAiZnVuYyIpKQorICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgZW1pdF92YXIoa2V5LCBvLCBkLCBGYWxzZSkKKworICAgIG8ud3JpdGUoJ1xuJykKKyAgICBlbWl0X3ZhcihmdW5jLCBvLCBkLCBGYWxzZSkgYW5kIG8ud3JpdGUoJ1xuJykKKyAgICBuZXdkZXBzID0gYmIuY29kZXBhcnNlci5TaGVsbFBhcnNlcihmdW5jLCBsb2dnZXIpLnBhcnNlX3NoZWxsKGQuZ2V0VmFyKGZ1bmMsIFRydWUpKQorICAgIG5ld2RlcHMgfD0gc2V0KChkLmdldFZhckZsYWcoZnVuYywgInZhcmRlcHMiLCBUcnVlKSBvciAiIikuc3BsaXQoKSkKKyAgICBzZWVuID0gc2V0KCkKKyAgICB3aGlsZSBuZXdkZXBzOgorICAgICAgICBkZXBzID0gbmV3ZGVwcworICAgICAgICBzZWVuIHw9IGRlcHMKKyAgICAgICAgbmV3ZGVwcyA9IHNldCgpCisgICAgICAgIGZvciBkZXAgaW4gZGVwczoKKyAgICAgICAgICAgIGlmIGQuZ2V0VmFyRmxhZyhkZXAsICJmdW5jIikgYW5kIG5vdCBkLmdldFZhckZsYWcoZGVwLCAicHl0aG9uIik6CisgICAgICAgICAgICAgICBlbWl0X3ZhcihkZXAsIG8sIGQsIEZhbHNlKSBhbmQgby53cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgbmV3ZGVwcyB8PSAgYmIuY29kZXBhcnNlci5TaGVsbFBhcnNlcihkZXAsIGxvZ2dlcikucGFyc2Vfc2hlbGwoZC5nZXRWYXIoZGVwLCBUcnVlKSkKKyAgICAgICAgICAgICAgIG5ld2RlcHMgfD0gc2V0KChkLmdldFZhckZsYWcoZGVwLCAidmFyZGVwcyIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorICAgICAgICBuZXdkZXBzIC09IHNlZW4KKworX2Z1bmN0aW9uZm10ID0gIiIiCitkZWYge2Z1bmN0aW9ufShkKToKK3tib2R5fSIiIgorCitkZWYgZW1pdF9mdW5jX3B5dGhvbihmdW5jLCBvPXN5cy5fX3N0ZG91dF9fLCBkID0gaW5pdCgpKToKKyAgICAiIiJFbWl0cyBhbGwgaXRlbXMgaW4gdGhlIGRhdGEgc3RvcmUgaW4gYSBmb3JtYXQgc3VjaCB0aGF0IGl0IGNhbiBiZSBzb3VyY2VkIGJ5IGEgc2hlbGwuIiIiCisKKyAgICBkZWYgd3JpdGVfZnVuYyhmdW5jLCBvLCBjYWxsID0gRmFsc2UpOgorICAgICAgICBib2R5ID0gZC5nZXRWYXIoZnVuYywgVHJ1ZSkKKyAgICAgICAgaWYgbm90IGJvZHkuc3RhcnRzd2l0aCgiZGVmIik6CisgICAgICAgICAgICBib2R5ID0gX2Z1bmN0aW9uZm10LmZvcm1hdChmdW5jdGlvbj1mdW5jLCBib2R5PWJvZHkpCisKKyAgICAgICAgby53cml0ZShib2R5LnN0cmlwKCkgKyAiXG5cbiIpCisgICAgICAgIGlmIGNhbGw6CisgICAgICAgICAgICBvLndyaXRlKGZ1bmMgKyAiKGQpIiArICJcblxuIikKKworICAgIHdyaXRlX2Z1bmMoZnVuYywgbywgVHJ1ZSkKKyAgICBwcCA9IGJiLmNvZGVwYXJzZXIuUHl0aG9uUGFyc2VyKGZ1bmMsIGxvZ2dlcikKKyAgICBwcC5wYXJzZV9weXRob24oZC5nZXRWYXIoZnVuYywgVHJ1ZSkpCisgICAgbmV3ZGVwcyA9IHBwLmV4ZWNzCisgICAgbmV3ZGVwcyB8PSBzZXQoKGQuZ2V0VmFyRmxhZyhmdW5jLCAidmFyZGVwcyIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorICAgIHNlZW4gPSBzZXQoKQorICAgIHdoaWxlIG5ld2RlcHM6CisgICAgICAgIGRlcHMgPSBuZXdkZXBzCisgICAgICAgIHNlZW4gfD0gZGVwcworICAgICAgICBuZXdkZXBzID0gc2V0KCkKKyAgICAgICAgZm9yIGRlcCBpbiBkZXBzOgorICAgICAgICAgICAgaWYgZC5nZXRWYXJGbGFnKGRlcCwgImZ1bmMiKSBhbmQgZC5nZXRWYXJGbGFnKGRlcCwgInB5dGhvbiIpOgorICAgICAgICAgICAgICAgd3JpdGVfZnVuYyhkZXAsIG8pCisgICAgICAgICAgICAgICBwcCA9IGJiLmNvZGVwYXJzZXIuUHl0aG9uUGFyc2VyKGRlcCwgbG9nZ2VyKQorICAgICAgICAgICAgICAgcHAucGFyc2VfcHl0aG9uKGQuZ2V0VmFyKGRlcCwgVHJ1ZSkpCisgICAgICAgICAgICAgICBuZXdkZXBzIHw9IHBwLmV4ZWNzCisgICAgICAgICAgICAgICBuZXdkZXBzIHw9IHNldCgoZC5nZXRWYXJGbGFnKGRlcCwgInZhcmRlcHMiLCBUcnVlKSBvciAiIikuc3BsaXQoKSkKKyAgICAgICAgbmV3ZGVwcyAtPSBzZWVuCisKK2RlZiB1cGRhdGVfZGF0YShkKToKKyAgICAiIiJQZXJmb3JtcyBmaW5hbCBzdGVwcyB1cG9uIHRoZSBkYXRhc3RvcmUsIGluY2x1ZGluZyBhcHBsaWNhdGlvbiBvZiBvdmVycmlkZXMiIiIKKyAgICBkLmZpbmFsaXplKHBhcmVudCA9IFRydWUpCisKK2RlZiBidWlsZF9kZXBlbmRlbmNpZXMoa2V5LCBrZXlzLCBzaGVsbGRlcHMsIHZhcmZsYWdzZXhjbCwgZCk6CisgICAgZGVwcyA9IHNldCgpCisgICAgdHJ5OgorICAgICAgICBpZiBrZXlbLTFdID09ICddJzoKKyAgICAgICAgICAgIHZmID0ga2V5WzotMV0uc3BsaXQoJ1snKQorICAgICAgICAgICAgdmFsdWUgPSBkLmdldFZhckZsYWcodmZbMF0sIHZmWzFdLCBGYWxzZSkKKyAgICAgICAgICAgIHBhcnNlciA9IGQuZXhwYW5kV2l0aFJlZnModmFsdWUsIGtleSkKKyAgICAgICAgICAgIGRlcHMgfD0gcGFyc2VyLnJlZmVyZW5jZXMKKyAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgKGtleXMgJiBwYXJzZXIuZXhlY3MpCisgICAgICAgICAgICByZXR1cm4gZGVwcywgdmFsdWUKKyAgICAgICAgdmFyZmxhZ3MgPSBkLmdldFZhckZsYWdzKGtleSwgWyJ2YXJkZXBzIiwgInZhcmRlcHZhbHVlIiwgInZhcmRlcHNleGNsdWRlIiwgInZhcmRlcHZhbHVlZXhjbHVkZSIsICJwb3N0ZnVuY3MiLCAicHJlZnVuY3MiXSkgb3Ige30KKyAgICAgICAgdmFyZGVwcyA9IHZhcmZsYWdzLmdldCgidmFyZGVwcyIpCisgICAgICAgIHZhbHVlID0gZC5nZXRWYXIoa2V5LCBGYWxzZSkKKworICAgICAgICBkZWYgaGFuZGxlX2NvbnRhaW5zKHZhbHVlLCBjb250YWlucywgZCk6CisgICAgICAgICAgICBuZXd2YWx1ZSA9ICIiCisgICAgICAgICAgICBmb3IgayBpbiBzb3J0ZWQoY29udGFpbnMpOgorICAgICAgICAgICAgICAgIGwgPSAoZC5nZXRWYXIoaywgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBmb3Igd29yZCBpbiBzb3J0ZWQoY29udGFpbnNba10pOgorICAgICAgICAgICAgICAgICAgICBpZiB3b3JkIGluIGw6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSArPSAiXG4lc3slc30gPSBTZXQiICUgIChrLCB3b3JkKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUgKz0gIlxuJXN7JXN9ID0gVW5zZXQiICUgIChrLCB3b3JkKQorICAgICAgICAgICAgaWYgbm90IG5ld3ZhbHVlOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXd2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlICsgbmV3dmFsdWUKKworICAgICAgICBpZiAidmFyZGVwdmFsdWUiIGluIHZhcmZsYWdzOgorICAgICAgICAgICB2YWx1ZSA9IHZhcmZsYWdzLmdldCgidmFyZGVwdmFsdWUiKQorICAgICAgICBlbGlmIHZhcmZsYWdzLmdldCgiZnVuYyIpOgorICAgICAgICAgICAgaWYgdmFyZmxhZ3MuZ2V0KCJweXRob24iKToKKyAgICAgICAgICAgICAgICBwYXJzZWR2YXIgPSBkLmV4cGFuZFdpdGhSZWZzKHZhbHVlLCBrZXkpCisgICAgICAgICAgICAgICAgcGFyc2VyID0gYmIuY29kZXBhcnNlci5QeXRob25QYXJzZXIoa2V5LCBsb2dnZXIpCisgICAgICAgICAgICAgICAgaWYgcGFyc2VkdmFyLnZhbHVlIGFuZCAiXHQiIGluIHBhcnNlZHZhci52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlZhcmlhYmxlICVzIGNvbnRhaW5zIHRhYnMsIHBsZWFzZSByZW1vdmUgdGhlc2UgKCVzKSIgJSAoa2V5LCBkLmdldFZhcigiRklMRSIsIFRydWUpKSkKKyAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfcHl0aG9uKHBhcnNlZHZhci52YWx1ZSkKKyAgICAgICAgICAgICAgICBkZXBzID0gZGVwcyB8IHBhcnNlci5yZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgdmFsdWUgPSBoYW5kbGVfY29udGFpbnModmFsdWUsIHBhcnNlci5jb250YWlucywgZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyc2VkdmFyID0gZC5leHBhbmRXaXRoUmVmcyh2YWx1ZSwga2V5KQorICAgICAgICAgICAgICAgIHBhcnNlciA9IGJiLmNvZGVwYXJzZXIuU2hlbGxQYXJzZXIoa2V5LCBsb2dnZXIpCisgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX3NoZWxsKHBhcnNlZHZhci52YWx1ZSkKKyAgICAgICAgICAgICAgICBkZXBzID0gZGVwcyB8IHNoZWxsZGVwcworICAgICAgICAgICAgaWYgdmFyZGVwcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBhcnNlci5sb2cuZmx1c2goKQorICAgICAgICAgICAgaWYgInByZWZ1bmNzIiBpbiB2YXJmbGFnczoKKyAgICAgICAgICAgICAgICBkZXBzID0gZGVwcyB8IHNldCh2YXJmbGFnc1sicHJlZnVuY3MiXS5zcGxpdCgpKQorICAgICAgICAgICAgaWYgInBvc3RmdW5jcyIgaW4gdmFyZmxhZ3M6CisgICAgICAgICAgICAgICAgZGVwcyA9IGRlcHMgfCBzZXQodmFyZmxhZ3NbInBvc3RmdW5jcyJdLnNwbGl0KCkpCisgICAgICAgICAgICBkZXBzID0gZGVwcyB8IHBhcnNlZHZhci5yZWZlcmVuY2VzCisgICAgICAgICAgICBkZXBzID0gZGVwcyB8IChrZXlzICYgcGFyc2VyLmV4ZWNzKSB8IChrZXlzICYgcGFyc2VkdmFyLmV4ZWNzKQorICAgICAgICAgICAgdmFsdWUgPSBoYW5kbGVfY29udGFpbnModmFsdWUsIHBhcnNlZHZhci5jb250YWlucywgZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlciA9IGQuZXhwYW5kV2l0aFJlZnModmFsdWUsIGtleSkKKyAgICAgICAgICAgIGRlcHMgfD0gcGFyc2VyLnJlZmVyZW5jZXMKKyAgICAgICAgICAgIGRlcHMgPSBkZXBzIHwgKGtleXMgJiBwYXJzZXIuZXhlY3MpCisgICAgICAgICAgICB2YWx1ZSA9IGhhbmRsZV9jb250YWlucyh2YWx1ZSwgcGFyc2VyLmNvbnRhaW5zLCBkKQorCisgICAgICAgIGlmICJ2YXJkZXB2YWx1ZWV4Y2x1ZGUiIGluIHZhcmZsYWdzOgorICAgICAgICAgICAgZXhjbHVkZSA9IHZhcmZsYWdzLmdldCgidmFyZGVwdmFsdWVleGNsdWRlIikKKyAgICAgICAgICAgIGZvciBleGNsIGluIGV4Y2x1ZGUuc3BsaXQoJ3wnKToKKyAgICAgICAgICAgICAgICBpZiBleGNsOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoZXhjbCwgJycpCisKKyAgICAgICAgIyBBZGQgdmFyZmxhZ3MsIGFzc3VtaW5nIGFuIGV4Y2x1c2lvbiBsaXN0IGlzIHNldAorICAgICAgICBpZiB2YXJmbGFnc2V4Y2w6CisgICAgICAgICAgICB2YXJmZGVwcyA9IFtdCisgICAgICAgICAgICBmb3IgZiBpbiB2YXJmbGFnczoKKyAgICAgICAgICAgICAgICBpZiBmIG5vdCBpbiB2YXJmbGFnc2V4Y2w6CisgICAgICAgICAgICAgICAgICAgIHZhcmZkZXBzLmFwcGVuZCgnJXNbJXNdJyAlIChrZXksIGYpKQorICAgICAgICAgICAgaWYgdmFyZmRlcHM6CisgICAgICAgICAgICAgICAgZGVwcyB8PSBzZXQodmFyZmRlcHMpCisKKyAgICAgICAgZGVwcyB8PSBzZXQoKHZhcmRlcHMgb3IgIiIpLnNwbGl0KCkpCisgICAgICAgIGRlcHMgLT0gc2V0KHZhcmZsYWdzLmdldCgidmFyZGVwc2V4Y2x1ZGUiLCAiIikuc3BsaXQoKSkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIHJhaXNlIGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3Ioa2V5LCBOb25lLCBlKQorICAgIHJldHVybiBkZXBzLCB2YWx1ZQorICAgICNiYi5ub3RlKCJWYXJpYWJsZSAlcyByZWZlcmVuY2VzICVzIGFuZCBjYWxscyAlcyIgJSAoa2V5LCBzdHIoZGVwcyksIHN0cihleGVjcykpKQorICAgICNkLnNldFZhckZsYWcoa2V5LCAidmFyZGVwcyIsIGRlcHMpCisKK2RlZiBnZW5lcmF0ZV9kZXBlbmRlbmNpZXMoZCk6CisKKyAgICBrZXlzID0gc2V0KGtleSBmb3Iga2V5IGluIGQgaWYgbm90IGtleS5zdGFydHN3aXRoKCJfXyIpKQorICAgIHNoZWxsZGVwcyA9IHNldChrZXkgZm9yIGtleSBpbiBkLmdldFZhcigiX19leHBvcnRsaXN0IiwgRmFsc2UpIGlmIGQuZ2V0VmFyRmxhZyhrZXksICJleHBvcnQiKSBhbmQgbm90IGQuZ2V0VmFyRmxhZyhrZXksICJ1bmV4cG9ydCIpKQorICAgIHZhcmZsYWdzZXhjbCA9IGQuZ2V0VmFyKCdCQl9TSUdOQVRVUkVfRVhDTFVERV9GTEFHUycsIFRydWUpCisKKyAgICBkZXBzID0ge30KKyAgICB2YWx1ZXMgPSB7fQorCisgICAgdGFza2xpc3QgPSBkLmdldFZhcignX19CQlRBU0tTJywgRmFsc2UpIG9yIFtdCisgICAgZm9yIHRhc2sgaW4gdGFza2xpc3Q6CisgICAgICAgIGRlcHNbdGFza10sIHZhbHVlc1t0YXNrXSA9IGJ1aWxkX2RlcGVuZGVuY2llcyh0YXNrLCBrZXlzLCBzaGVsbGRlcHMsIHZhcmZsYWdzZXhjbCwgZCkKKyAgICAgICAgbmV3ZGVwcyA9IGRlcHNbdGFza10KKyAgICAgICAgc2VlbiA9IHNldCgpCisgICAgICAgIHdoaWxlIG5ld2RlcHM6CisgICAgICAgICAgICBuZXh0ZGVwcyA9IG5ld2RlcHMKKyAgICAgICAgICAgIHNlZW4gfD0gbmV4dGRlcHMKKyAgICAgICAgICAgIG5ld2RlcHMgPSBzZXQoKQorICAgICAgICAgICAgZm9yIGRlcCBpbiBuZXh0ZGVwczoKKyAgICAgICAgICAgICAgICBpZiBkZXAgbm90IGluIGRlcHM6CisgICAgICAgICAgICAgICAgICAgIGRlcHNbZGVwXSwgdmFsdWVzW2RlcF0gPSBidWlsZF9kZXBlbmRlbmNpZXMoZGVwLCBrZXlzLCBzaGVsbGRlcHMsIHZhcmZsYWdzZXhjbCwgZCkKKyAgICAgICAgICAgICAgICBuZXdkZXBzIHw9ICBkZXBzW2RlcF0KKyAgICAgICAgICAgIG5ld2RlcHMgLT0gc2VlbgorICAgICAgICAjcHJpbnQgIkZvciAlczogJXMiICUgKHRhc2ssIHN0cihkZXBzW3Rhc2tdKSkKKyAgICByZXR1cm4gdGFza2xpc3QsIGRlcHMsIHZhbHVlcworCitkZWYgaW5oZXJpdHNfY2xhc3Moa2xhc3MsIGQpOgorICAgIHZhbCA9IGQuZ2V0VmFyKCdfX2luaGVyaXRfY2FjaGUnLCBGYWxzZSkgb3IgW10KKyAgICBuZWVkbGUgPSBvcy5wYXRoLmpvaW4oJ2NsYXNzZXMnLCAnJXMuYmJjbGFzcycgJSBrbGFzcykKKyAgICBmb3IgdiBpbiB2YWw6CisgICAgICAgIGlmIHYuZW5kc3dpdGgobmVlZGxlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9kYXRhX3NtYXJ0LnB5IGIvYml0YmFrZS9saWIvYmIvZGF0YV9zbWFydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWI0ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZGF0YV9zbWFydC5weQpAQCAtMCwwICsxLDk0MiBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSBTbWFydCBEaWN0aW9uYXJ5IEltcGxlbWVudGF0aW9uCisKK0Z1bmN0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUKK0JpdEJha2UgYnVpbGQgdG9vbHMuCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSAgU2ViIEZyYW5rZW5ndWwKKyMgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2ICBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIFVsaSBMdWNrYXMKKyMgQ29weXJpZ2h0IChDKSAyMDA1ICAgICAgICBST0FEIEdtYkgKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworaW1wb3J0IGNvcHksIHJlLCBzeXMsIHRyYWNlYmFjaworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IGJiLCBiYi5jb2RlcGFyc2VyCitmcm9tIGJiICAgaW1wb3J0IHV0aWxzCitmcm9tIGJiLkNPVyAgaW1wb3J0IENPV0RpY3RCYXNlCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLkRhdGEiKQorCitfX3NldHZhcl9rZXl3b3JkX18gPSBbIl9hcHBlbmQiLCAiX3ByZXBlbmQiLCAiX3JlbW92ZSJdCitfX3NldHZhcl9yZWdleHBfXyA9IHJlLmNvbXBpbGUoJyg/UDxiYXNlPi4qPykoP1A8a2V5d29yZD5fYXBwZW5kfF9wcmVwZW5kfF9yZW1vdmUpKF8oP1A8YWRkPi4qKSk/JCcpCitfX2V4cGFuZF92YXJfcmVnZXhwX18gPSByZS5jb21waWxlKHIiXCR7W157fUBcblx0IF0rfSIpCitfX2V4cGFuZF9weXRob25fcmVnZXhwX18gPSByZS5jb21waWxlKHIiXCR7QC4rP30iKQorCitkZWYgaW5mZXJfY2FsbGVyX2RldGFpbHMobG9naW5mbywgcGFyZW50ID0gRmFsc2UsIHZhcnZhbCA9IFRydWUpOgorICAgICIiIlNhdmUgdGhlIGNhbGxlciB0aGUgdHJvdWJsZSBvZiBzcGVjaWZ5aW5nIGV2ZXJ5dGhpbmcuIiIiCisgICAgIyBTYXZlIGVmZm9ydC4KKyAgICBpZiAnaWdub3JlJyBpbiBsb2dpbmZvIGFuZCBsb2dpbmZvWydpZ25vcmUnXToKKyAgICAgICAgcmV0dXJuCisgICAgIyBJZiBub3RoaW5nIHdhcyBwcm92aWRlZCwgbWFyayB0aGlzIGFzIHBvc3NpYmx5IHVubmVlZGVkLgorICAgIGlmIG5vdCBsb2dpbmZvOgorICAgICAgICBsb2dpbmZvWydpZ25vcmUnXSA9IFRydWUKKyAgICAgICAgcmV0dXJuCisgICAgIyBJbmZlciBjYWxsZXIncyBsaWtlbHkgdmFsdWVzIGZvciB2YXJpYWJsZSAodmFyKSBhbmQgdmFsdWUgKHZhbHVlKSwgCisgICAgIyB0byByZWR1Y2UgY2x1dHRlciBpbiB0aGUgcmVzdCBvZiB0aGUgY29kZS4KKyAgICBhYm92ZSA9IE5vbmUKKyAgICBkZWYgc2V0X2Fib3ZlKCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXQorICAgICAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgICAgIHJldHVybiB0Yi50Yl9mcmFtZS5mX2JhY2suZl9iYWNrLmZfYmFjaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGIudGJfZnJhbWUuZl9iYWNrLmZfYmFjaworCisgICAgaWYgdmFydmFsIGFuZCAoJ3ZhcmlhYmxlJyBub3QgaW4gbG9naW5mbyBvciAnZGV0YWlsJyBub3QgaW4gbG9naW5mbyk6CisgICAgICAgIGlmIG5vdCBhYm92ZToKKyAgICAgICAgICAgIGFib3ZlID0gc2V0X2Fib3ZlKCkKKyAgICAgICAgbGNscyA9IGFib3ZlLmZfbG9jYWxzLml0ZW1zKCkKKyAgICAgICAgZm9yIGssIHYgaW4gbGNsczoKKyAgICAgICAgICAgIGlmIGsgPT0gJ3ZhbHVlJyBhbmQgJ2RldGFpbCcgbm90IGluIGxvZ2luZm86CisgICAgICAgICAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSB2CisgICAgICAgICAgICBpZiBrID09ICd2YXInIGFuZCAndmFyaWFibGUnIG5vdCBpbiBsb2dpbmZvOgorICAgICAgICAgICAgICAgIGxvZ2luZm9bJ3ZhcmlhYmxlJ10gPSB2CisgICAgIyBJbmZlciBmaWxlL2xpbmUvZnVuY3Rpb24gZnJvbSB0cmFjZWJhY2sKKyAgICAjIERvbid0IHVzZSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjaygpIHNpbmNlIGl0IGZpbGxzIHRoZSBsaW5lIGNvbnRlbnRzIHdoaWNoCisgICAgIyB3ZSBkb24ndCBuZWVkIGFuZCB0aGF0IGhpdHMgc3RhdCBzeXNjYWxscworICAgIGlmICdmaWxlJyBub3QgaW4gbG9naW5mbzoKKyAgICAgICAgaWYgbm90IGFib3ZlOgorICAgICAgICAgICAgYWJvdmUgPSBzZXRfYWJvdmUoKQorICAgICAgICBmID0gYWJvdmUuZl9iYWNrCisgICAgICAgIGxpbmUgPSBmLmZfbGluZW5vCisgICAgICAgIGZpbGUgPSBmLmZfY29kZS5jb19maWxlbmFtZQorICAgICAgICBmdW5jID0gZi5mX2NvZGUuY29fbmFtZQorICAgICAgICBsb2dpbmZvWydmaWxlJ10gPSBmaWxlCisgICAgICAgIGxvZ2luZm9bJ2xpbmUnXSA9IGxpbmUKKyAgICAgICAgaWYgZnVuYyBub3QgaW4gbG9naW5mbzoKKyAgICAgICAgICAgIGxvZ2luZm9bJ2Z1bmMnXSA9IGZ1bmMKKworY2xhc3MgVmFyaWFibGVQYXJzZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFybmFtZSwgZCwgdmFsID0gTm9uZSk6CisgICAgICAgIHNlbGYudmFybmFtZSA9IHZhcm5hbWUKKyAgICAgICAgc2VsZi5kID0gZAorICAgICAgICBzZWxmLnZhbHVlID0gdmFsCisKKyAgICAgICAgc2VsZi5yZWZlcmVuY2VzID0gc2V0KCkKKyAgICAgICAgc2VsZi5leGVjcyA9IHNldCgpCisgICAgICAgIHNlbGYuY29udGFpbnMgPSB7fQorCisgICAgZGVmIHZhcl9zdWIoc2VsZiwgbWF0Y2gpOgorICAgICAgICAgICAga2V5ID0gbWF0Y2guZ3JvdXAoKVsyOi0xXQorICAgICAgICAgICAgaWYgc2VsZi52YXJuYW1lIGFuZCBrZXk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi52YXJuYW1lID09IGtleToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJ2YXJpYWJsZSAlcyByZWZlcmVuY2VzIGl0c2VsZiEiICUgc2VsZi52YXJuYW1lKQorICAgICAgICAgICAgaWYga2V5IGluIHNlbGYuZC5leHBhbmRfY2FjaGU6CisgICAgICAgICAgICAgICAgdmFycGFyc2UgPSBzZWxmLmQuZXhwYW5kX2NhY2hlW2tleV0KKyAgICAgICAgICAgICAgICB2YXIgPSB2YXJwYXJzZS52YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YXIgPSBzZWxmLmQuZ2V0VmFyRmxhZyhrZXksICJfY29udGVudCIsIFRydWUpCisgICAgICAgICAgICBzZWxmLnJlZmVyZW5jZXMuYWRkKGtleSkKKyAgICAgICAgICAgIGlmIHZhciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgpCisKKyAgICBkZWYgcHl0aG9uX3N1YihzZWxmLCBtYXRjaCk6CisgICAgICAgICAgICBjb2RlID0gbWF0Y2guZ3JvdXAoKVszOi0xXQorICAgICAgICAgICAgY29kZW9iaiA9IGNvbXBpbGUoY29kZS5zdHJpcCgpLCBzZWxmLnZhcm5hbWUgb3IgIjxleHBhbnNpb24+IiwgImV2YWwiKQorCisgICAgICAgICAgICBwYXJzZXIgPSBiYi5jb2RlcGFyc2VyLlB5dGhvblBhcnNlcihzZWxmLnZhcm5hbWUsIGxvZ2dlcikKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZV9weXRob24oY29kZSkKKyAgICAgICAgICAgIGlmIHNlbGYudmFybmFtZToKKyAgICAgICAgICAgICAgICB2YXJkZXBzID0gc2VsZi5kLmdldFZhckZsYWcoc2VsZi52YXJuYW1lLCAidmFyZGVwcyIsIFRydWUpCisgICAgICAgICAgICAgICAgaWYgdmFyZGVwcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBwYXJzZXIubG9nLmZsdXNoKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyc2VyLmxvZy5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLnJlZmVyZW5jZXMgfD0gcGFyc2VyLnJlZmVyZW5jZXMKKyAgICAgICAgICAgIHNlbGYuZXhlY3MgfD0gcGFyc2VyLmV4ZWNzCisKKyAgICAgICAgICAgIGZvciBrIGluIHBhcnNlci5jb250YWluczoKKyAgICAgICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWxmLmNvbnRhaW5zOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5zW2tdID0gcGFyc2VyLmNvbnRhaW5zW2tdLmNvcHkoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbnNba10udXBkYXRlKHBhcnNlci5jb250YWluc1trXSkKKyAgICAgICAgICAgIHZhbHVlID0gdXRpbHMuYmV0dGVyX2V2YWwoY29kZW9iaiwgRGF0YUNvbnRleHQoc2VsZi5kKSkKKyAgICAgICAgICAgIHJldHVybiBzdHIodmFsdWUpCisKKworY2xhc3MgRGF0YUNvbnRleHQoZGljdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGFkYXRhLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYubWV0YWRhdGEgPSBtZXRhZGF0YQorICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYsICoqa3dhcmdzKQorICAgICAgICBzZWxmWydkJ10gPSBtZXRhZGF0YQorCisgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgIHZhbHVlID0gc2VsZi5tZXRhZGF0YS5nZXRWYXIoa2V5LCBUcnVlKQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lIG9yIHNlbGYubWV0YWRhdGEuZ2V0VmFyRmxhZyhrZXksICdmdW5jJyk6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworY2xhc3MgRXhwYW5zaW9uRXJyb3IoRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFybmFtZSwgZXhwcmVzc2lvbiwgZXhjZXB0aW9uKToKKyAgICAgICAgc2VsZi5leHByZXNzaW9uID0gZXhwcmVzc2lvbgorICAgICAgICBzZWxmLnZhcmlhYmxlbmFtZSA9IHZhcm5hbWUKKyAgICAgICAgc2VsZi5leGNlcHRpb24gPSBleGNlcHRpb24KKyAgICAgICAgaWYgdmFybmFtZToKKyAgICAgICAgICAgIGlmIGV4cHJlc3Npb246CisgICAgICAgICAgICAgICAgc2VsZi5tc2cgPSAiRmFpbHVyZSBleHBhbmRpbmcgdmFyaWFibGUgJXMsIGV4cHJlc3Npb24gd2FzICVzIHdoaWNoIHRyaWdnZXJlZCBleGNlcHRpb24gJXM6ICVzIiAlICh2YXJuYW1lLCBleHByZXNzaW9uLCB0eXBlKGV4Y2VwdGlvbikuX19uYW1lX18sIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5tc2cgPSAiRmFpbHVyZSBleHBhbmRpbmcgdmFyaWFibGUgJXM6ICVzOiAlcyIgJSAodmFybmFtZSwgdHlwZShleGNlcHRpb24pLl9fbmFtZV9fLCBleGNlcHRpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1zZyA9ICJGYWlsdXJlIGV4cGFuZGluZyBleHByZXNzaW9uICVzIHdoaWNoIHRyaWdnZXJlZCBleGNlcHRpb24gJXM6ICVzIiAlIChleHByZXNzaW9uLCB0eXBlKGV4Y2VwdGlvbikuX19uYW1lX18sIGV4Y2VwdGlvbikKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIHNlbGYubXNnKQorICAgICAgICBzZWxmLmFyZ3MgPSAodmFybmFtZSwgZXhwcmVzc2lvbiwgZXhjZXB0aW9uKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tc2cKKworY2xhc3MgSW5jbHVkZUhpc3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50ID0gTm9uZSwgZmlsZW5hbWUgPSAnW1RPUCBMRVZFTF0nKToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgbmV3ID0gSW5jbHVkZUhpc3Rvcnkoc2VsZi5wYXJlbnQsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGZvciBjIGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBuZXcuY2hpbGRyZW4uYXBwZW5kKGMpCisgICAgICAgIHJldHVybiBuZXcKKworICAgIGRlZiBpbmNsdWRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgbmV3ZmlsZSA9IEluY2x1ZGVIaXN0b3J5KHNlbGYuY3VycmVudCwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY3VycmVudC5jaGlsZHJlbi5hcHBlbmQobmV3ZmlsZSkKKyAgICAgICAgc2VsZi5jdXJyZW50ID0gbmV3ZmlsZQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGEsIGIsIGMpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnQucGFyZW50OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50ID0gc2VsZi5jdXJyZW50LnBhcmVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmIud2FybigiSW5jbHVkZSBsb2c6IFRyaWVkIHRvIGZpbmlzaCAnJXMnIGF0IHRvcCBsZXZlbC4iICUgZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGVtaXQoc2VsZiwgbywgbGV2ZWwgPSAwKToKKyAgICAgICAgIiIiRW1pdCBhbiBpbmNsdWRlIGhpc3RvcnkgZmlsZSwgYW5kIGl0cyBjaGlsZHJlbi4iIiIKKyAgICAgICAgaWYgbGV2ZWw6CisgICAgICAgICAgICBzcGFjZXMgPSAiICAiICogKGxldmVsIC0gMSkKKyAgICAgICAgICAgIG8ud3JpdGUoIiMgJXMlcyIgJSAoc3BhY2VzLCBzZWxmLmZpbGVuYW1lKSkKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmNoaWxkcmVuKSA+IDA6CisgICAgICAgICAgICAgICAgby53cml0ZSgiIGluY2x1ZGVzOiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvLndyaXRlKCIjXG4jIElOQ0xVREUgSElTVE9SWTpcbiMiKQorICAgICAgICBsZXZlbCA9IGxldmVsICsgMQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIG8ud3JpdGUoIlxuIikKKyAgICAgICAgICAgIGNoaWxkLmVtaXQobywgbGV2ZWwpCisKK2NsYXNzIFZhcmlhYmxlSGlzdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhcm9vdCk6CisgICAgICAgIHNlbGYuZGF0YXJvb3QgPSBkYXRhcm9vdAorICAgICAgICBzZWxmLnZhcmlhYmxlcyA9IENPV0RpY3RCYXNlLmNvcHkoKQorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIG5ldyA9IFZhcmlhYmxlSGlzdG9yeShzZWxmLmRhdGFyb290KQorICAgICAgICBuZXcudmFyaWFibGVzID0gc2VsZi52YXJpYWJsZXMuY29weSgpCisgICAgICAgIHJldHVybiBuZXcKKworICAgIGRlZiByZWNvcmQoc2VsZiwgKmt3b25seSwgKipsb2dpbmZvKToKKyAgICAgICAgaWYgbm90IHNlbGYuZGF0YXJvb3QuX3RyYWNraW5nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGxlbihrd29ubHkpID4gMDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorICAgICAgICBpbmZlcl9jYWxsZXJfZGV0YWlscyhsb2dpbmZvLCBwYXJlbnQgPSBUcnVlKQorICAgICAgICBpZiAnaWdub3JlJyBpbiBsb2dpbmZvIGFuZCBsb2dpbmZvWydpZ25vcmUnXToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiAnb3AnIG5vdCBpbiBsb2dpbmZvIG9yIG5vdCBsb2dpbmZvWydvcCddOgorICAgICAgICAgICAgbG9naW5mb1snb3AnXSA9ICdzZXQnCisgICAgICAgIGlmICdkZXRhaWwnIGluIGxvZ2luZm86CisgICAgICAgICAgICBsb2dpbmZvWydkZXRhaWwnXSA9IHN0cihsb2dpbmZvWydkZXRhaWwnXSkKKyAgICAgICAgaWYgJ3ZhcmlhYmxlJyBub3QgaW4gbG9naW5mbyBvciAnZmlsZScgbm90IGluIGxvZ2luZm86CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWNvcmQoKSBtaXNzaW5nIHZhcmlhYmxlIG9yIGZpbGUuIikKKyAgICAgICAgdmFyID0gbG9naW5mb1sndmFyaWFibGUnXQorCisgICAgICAgIGlmIHZhciBub3QgaW4gc2VsZi52YXJpYWJsZXM6CisgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1t2YXJdID0gW10KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi52YXJpYWJsZXNbdmFyXSwgbGlzdCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgJ25vZHVwcycgaW4gbG9naW5mbyBhbmQgbG9naW5mbyBpbiBzZWxmLnZhcmlhYmxlc1t2YXJdOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudmFyaWFibGVzW3Zhcl0uYXBwZW5kKGxvZ2luZm8uY29weSgpKQorCisgICAgZGVmIHZhcmlhYmxlKHNlbGYsIHZhcik6CisgICAgICAgIGlmIHZhciBpbiBzZWxmLnZhcmlhYmxlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhcmlhYmxlc1t2YXJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBlbWl0KHNlbGYsIHZhciwgb3ZhbCwgdmFsLCBvLCBkKToKKyAgICAgICAgaGlzdG9yeSA9IHNlbGYudmFyaWFibGUodmFyKQorCisgICAgICAgICMgQXBwZW5kIG92ZXJyaWRlIGhpc3RvcnkKKyAgICAgICAgaWYgdmFyIGluIGQub3ZlcnJpZGVkYXRhOgorICAgICAgICAgICAgZm9yIChyLCBvdmVycmlkZSkgaW4gZC5vdmVycmlkZWRhdGFbdmFyXToKKyAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi52YXJpYWJsZShyKToKKyAgICAgICAgICAgICAgICAgICAgbG9naW5mbyA9IGV2ZW50LmNvcHkoKQorICAgICAgICAgICAgICAgICAgICBpZiAnZmxhZycgaW4gbG9naW5mbyBhbmQgbm90IGxvZ2luZm9bJ2ZsYWcnXS5zdGFydHN3aXRoKCJfIik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBsb2dpbmZvWyd2YXJpYWJsZSddID0gdmFyCisgICAgICAgICAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAnb3ZlcnJpZGVbJXNdOiVzJyAlIChvdmVycmlkZSwgbG9naW5mb1snb3AnXSkKKyAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5hcHBlbmQobG9naW5mbykKKworICAgICAgICBjb21tZW50VmFsID0gcmUuc3ViKCdcbicsICdcbiMnLCBzdHIob3ZhbCkpCisgICAgICAgIGlmIGhpc3Rvcnk6CisgICAgICAgICAgICBpZiBsZW4oaGlzdG9yeSkgPT0gMToKKyAgICAgICAgICAgICAgICBvLndyaXRlKCIjXG4jICQlc1xuIiAlIHZhcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgby53cml0ZSgiI1xuIyAkJXMgWyVkIG9wZXJhdGlvbnNdXG4iICUgKHZhciwgbGVuKGhpc3RvcnkpKSkKKyAgICAgICAgICAgIGZvciBldmVudCBpbiBoaXN0b3J5OgorICAgICAgICAgICAgICAgICMgby53cml0ZSgiIyAlc1xuIiAlIHN0cihldmVudCkpCisgICAgICAgICAgICAgICAgaWYgJ2Z1bmMnIGluIGV2ZW50OgorICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGhhdmUgYSBmdW5jdGlvbiBsaXN0ZWQsIHRoaXMgaXMgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgIyBjb2RlLCBub3QgYW4gb3BlcmF0aW9uIGluIGEgY29uZmlnIGZpbGUsIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBmdWxsIHBhdGggaXMgZGlzdHJhY3RpbmcuCisgICAgICAgICAgICAgICAgICAgIGV2ZW50WydmaWxlJ10gPSByZS5zdWIoJy4qLycsICcnLCBldmVudFsnZmlsZSddKQorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2Z1bmMgPSAnIFslc10nICUgZXZlbnRbJ2Z1bmMnXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZnVuYyA9ICcnCisgICAgICAgICAgICAgICAgaWYgJ2ZsYWcnIGluIGV2ZW50OgorICAgICAgICAgICAgICAgICAgICBmbGFnID0gJ1slc10gJyAlIChldmVudFsnZmxhZyddKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAnJworICAgICAgICAgICAgICAgIG8ud3JpdGUoIiMgICAlcyAlczolcyVzXG4jICAgICAlc1wiJXNcIlxuIiAlIChldmVudFsnb3AnXSwgZXZlbnRbJ2ZpbGUnXSwgZXZlbnRbJ2xpbmUnXSwgZGlzcGxheV9mdW5jLCBmbGFnLCByZS5zdWIoJ1xuJywgJ1xuIyAgICAgJywgZXZlbnRbJ2RldGFpbCddKSkpCisgICAgICAgICAgICBpZiBsZW4oaGlzdG9yeSkgPiAxOgorICAgICAgICAgICAgICAgIG8ud3JpdGUoIiMgcHJlLWV4cGFuc2lvbiB2YWx1ZTpcbiIpCisgICAgICAgICAgICAgICAgby53cml0ZSgnIyAgICIlcyJcbicgJSAoY29tbWVudFZhbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvLndyaXRlKCIjXG4jICQlc1xuIyAgIFtubyBoaXN0b3J5IHJlY29yZGVkXVxuI1xuIiAlIHZhcikKKyAgICAgICAgICAgIG8ud3JpdGUoJyMgICAiJXMiXG4nICUgKGNvbW1lbnRWYWwpKQorCisgICAgZGVmIGdldF92YXJpYWJsZV9maWxlcyhzZWxmLCB2YXIpOgorICAgICAgICAiIiJHZXQgdGhlIGZpbGVzIHdoZXJlIG9wZXJhdGlvbnMgYXJlIG1hZGUgb24gYSB2YXJpYWJsZSIiIgorICAgICAgICB2YXJfaGlzdG9yeSA9IHNlbGYudmFyaWFibGUodmFyKQorICAgICAgICBmaWxlcyA9IFtdCisgICAgICAgIGZvciBldmVudCBpbiB2YXJfaGlzdG9yeToKKyAgICAgICAgICAgIGZpbGVzLmFwcGVuZChldmVudFsnZmlsZSddKQorICAgICAgICByZXR1cm4gZmlsZXMKKworICAgIGRlZiBnZXRfdmFyaWFibGVfbGluZXMoc2VsZiwgdmFyLCBmKToKKyAgICAgICAgIiIiR2V0IHRoZSBsaW5lIHdoZXJlIGEgb3BlcmF0aW9uIGlzIG1hZGUgb24gYSB2YXJpYWJsZSBpbiBmaWxlIGYiIiIKKyAgICAgICAgdmFyX2hpc3RvcnkgPSBzZWxmLnZhcmlhYmxlKHZhcikKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgZXZlbnQgaW4gdmFyX2hpc3Rvcnk6CisgICAgICAgICAgICBpZiBmPT0gZXZlbnRbJ2ZpbGUnXToKKyAgICAgICAgICAgICAgICBsaW5lID0gZXZlbnRbJ2xpbmUnXQorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICByZXR1cm4gbGluZXMKKworICAgIGRlZiBnZXRfdmFyaWFibGVfaXRlbXNfZmlsZXMoc2VsZiwgdmFyLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIFVzZSB2YXJpYWJsZSBoaXN0b3J5IHRvIG1hcCBpdGVtcyBhZGRlZCB0byBhIGxpc3QgdmFyaWFibGUgYW5kCisgICAgICAgIHRoZSBmaWxlcyBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuCisgICAgICAgICIiIgorICAgICAgICBoaXN0b3J5ID0gc2VsZi52YXJpYWJsZSh2YXIpCisgICAgICAgIGZpbmFsaXRlbXMgPSAoZC5nZXRWYXIodmFyLCBUcnVlKSBvciAnJykuc3BsaXQoKQorICAgICAgICBmaWxlbWFwID0ge30KKyAgICAgICAgaXNzZXQgPSBGYWxzZQorICAgICAgICBmb3IgZXZlbnQgaW4gaGlzdG9yeToKKyAgICAgICAgICAgIGlmICdmbGFnJyBpbiBldmVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZXZlbnRbJ29wJ10gPT0gJ19yZW1vdmUnOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc3NldCBhbmQgZXZlbnRbJ29wJ10gPT0gJ3NldD8nOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpc3NldCA9IFRydWUKKyAgICAgICAgICAgIGl0ZW1zID0gZC5leHBhbmQoZXZlbnRbJ2RldGFpbCddKS5zcGxpdCgpCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBsaXR0bGUgY3J1ZGUgYnV0IGlzIGJlbHQtYW5kLWJyYWNlcyB0byBhdm9pZCB1cworICAgICAgICAgICAgICAgICMgaGF2aW5nIHRvIGhhbmRsZSBldmVyeSBwb3NzaWJsZSBvcGVyYXRpb24gdHlwZSBzcGVjaWZpY2FsbHkKKyAgICAgICAgICAgICAgICBpZiBpdGVtIGluIGZpbmFsaXRlbXMgYW5kIG5vdCBpdGVtIGluIGZpbGVtYXA6CisgICAgICAgICAgICAgICAgICAgIGZpbGVtYXBbaXRlbV0gPSBldmVudFsnZmlsZSddCisgICAgICAgIHJldHVybiBmaWxlbWFwCisKKyAgICBkZWYgZGVsX3Zhcl9oaXN0b3J5KHNlbGYsIHZhciwgZj1Ob25lLCBsaW5lPU5vbmUpOgorICAgICAgICAiIiJJZiBmaWxlIGYgYW5kIGxpbmUgYXJlIG5vdCBnaXZlbiwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHZhciBpcyBkZWxldGVkIiIiCisgICAgICAgIGlmIHZhciBpbiBzZWxmLnZhcmlhYmxlczoKKyAgICAgICAgICAgIGlmIGYgYW5kIGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbdmFyXSA9IFsgeCBmb3IgeCBpbiBzZWxmLnZhcmlhYmxlc1t2YXJdIGlmIHhbJ2ZpbGUnXSE9ZiBhbmQgeFsnbGluZSddIT1saW5lXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1t2YXJdID0gW10KKworY2xhc3MgRGF0YVNtYXJ0KE11dGFibGVNYXBwaW5nKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGljdCA9IHt9CisKKyAgICAgICAgc2VsZi5pbmNoaXN0b3J5ID0gSW5jbHVkZUhpc3RvcnkoKQorICAgICAgICBzZWxmLnZhcmhpc3RvcnkgPSBWYXJpYWJsZUhpc3Rvcnkoc2VsZikKKyAgICAgICAgc2VsZi5fdHJhY2tpbmcgPSBGYWxzZQorCisgICAgICAgIHNlbGYuZXhwYW5kX2NhY2hlID0ge30KKworICAgICAgICAjIGNvb2tpZSBtb25zdGVyIHRyaWJ1dGUKKyAgICAgICAgIyBOZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgd3JpdGVzIHRvIG92ZXJyaWRlZGF0YSBhcworICAgICAgICAjIGl0cyBvbmx5IGEgc2hhbGxvdyBjb3B5LCBjb3VsZCBpbmZsdWVuY2Ugb3RoZXIgZGF0YSBzdG9yZQorICAgICAgICAjIGNvcGllcyEKKyAgICAgICAgc2VsZi5vdmVycmlkZWRhdGEgPSB7fQorICAgICAgICBzZWxmLm92ZXJyaWRlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5vdmVycmlkZXZhcnMgPSBzZXQoWyJPVkVSUklERVMiLCAiRklMRSJdKQorICAgICAgICBzZWxmLmlub3ZlcnJpZGUgPSBGYWxzZQorCisgICAgZGVmIGVuYWJsZVRyYWNraW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90cmFja2luZyA9IFRydWUKKworICAgIGRlZiBkaXNhYmxlVHJhY2tpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3RyYWNraW5nID0gRmFsc2UKKworICAgIGRlZiBleHBhbmRXaXRoUmVmcyhzZWxmLCBzLCB2YXJuYW1lKToKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCBiYXNlc3RyaW5nKTogIyBzYW5pdHkgY2hlY2sKKyAgICAgICAgICAgIHJldHVybiBWYXJpYWJsZVBhcnNlKHZhcm5hbWUsIHNlbGYsIHMpCisKKyAgICAgICAgaWYgdmFybmFtZSBhbmQgdmFybmFtZSBpbiBzZWxmLmV4cGFuZF9jYWNoZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4cGFuZF9jYWNoZVt2YXJuYW1lXQorCisgICAgICAgIHZhcnBhcnNlID0gVmFyaWFibGVQYXJzZSh2YXJuYW1lLCBzZWxmKQorCisgICAgICAgIHdoaWxlIHMuZmluZCgnJHsnKSAhPSAtMToKKyAgICAgICAgICAgIG9sZHMgPSBzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IF9fZXhwYW5kX3Zhcl9yZWdleHBfXy5zdWIodmFycGFyc2UudmFyX3N1YiwgcykKKyAgICAgICAgICAgICAgICBzID0gX19leHBhbmRfcHl0aG9uX3JlZ2V4cF9fLnN1Yih2YXJwYXJzZS5weXRob25fc3ViLCBzKQorICAgICAgICAgICAgICAgIGlmIHMgPT0gb2xkczoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBFeHBhbnNpb25FcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IGJiLnBhcnNlLlNraXBSZWNpcGU6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgICAgIGV4Y19jbGFzcywgZXhjLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgcmFpc2UgRXhwYW5zaW9uRXJyb3IsIEV4cGFuc2lvbkVycm9yKHZhcm5hbWUsIHMsIGV4YyksIHRiCisKKyAgICAgICAgdmFycGFyc2UudmFsdWUgPSBzCisKKyAgICAgICAgaWYgdmFybmFtZToKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kX2NhY2hlW3Zhcm5hbWVdID0gdmFycGFyc2UKKworICAgICAgICByZXR1cm4gdmFycGFyc2UKKworICAgIGRlZiBleHBhbmQoc2VsZiwgcywgdmFybmFtZSA9IE5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5leHBhbmRXaXRoUmVmcyhzLCB2YXJuYW1lKS52YWx1ZQorCisgICAgZGVmIGZpbmFsaXplKHNlbGYsIHBhcmVudCA9IEZhbHNlKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgaW50ZXJuYWxfZmluYWxpemUoc2VsZiwgcGFyZW50ID0gRmFsc2UpOgorICAgICAgICAiIiJQZXJmb3JtcyBmaW5hbCBzdGVwcyB1cG9uIHRoZSBkYXRhc3RvcmUsIGluY2x1ZGluZyBhcHBsaWNhdGlvbiBvZiBvdmVycmlkZXMiIiIKKyAgICAgICAgc2VsZi5vdmVycmlkZXMgPSBOb25lCisKKyAgICBkZWYgbmVlZF9vdmVycmlkZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3ZlcnJpZGVzIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmlub3ZlcnJpZGU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmlub3ZlcnJpZGUgPSBUcnVlCisgICAgICAgICAgICAjIENhbiBlbmQgdXAgaGVyZSByZWN1cnNpdmVseSBzbyBzZXR1cCBkdW1teSB2YWx1ZXMKKyAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVzID0gW10KKyAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVzc2V0ID0gc2V0KCkKKyAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVzID0gKHNlbGYuZ2V0VmFyKCJPVkVSUklERVMiLCBUcnVlKSBvciAiIikuc3BsaXQoIjoiKSBvciBbXQorICAgICAgICAgICAgc2VsZi5vdmVycmlkZXNzZXQgPSBzZXQoc2VsZi5vdmVycmlkZXMpCisgICAgICAgICAgICBzZWxmLmlub3ZlcnJpZGUgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5leHBhbmRfY2FjaGUgPSB7fQorCisgICAgZGVmIGluaXRWYXIoc2VsZiwgdmFyKToKKyAgICAgICAgc2VsZi5leHBhbmRfY2FjaGUgPSB7fQorICAgICAgICBpZiBub3QgdmFyIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIHNlbGYuZGljdFt2YXJdID0ge30KKworICAgIGRlZiBfZmluZFZhcihzZWxmLCB2YXIpOgorICAgICAgICBkZXN0ID0gc2VsZi5kaWN0CisgICAgICAgIHdoaWxlIGRlc3Q6CisgICAgICAgICAgICBpZiB2YXIgaW4gZGVzdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzdFt2YXJdCisKKyAgICAgICAgICAgIGlmICJfZGF0YSIgbm90IGluIGRlc3Q6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGRlc3QgPSBkZXN0WyJfZGF0YSJdCisKKyAgICBkZWYgX21ha2VTaGFkb3dDb3B5KHNlbGYsIHZhcik6CisgICAgICAgIGlmIHZhciBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBsb2NhbF92YXIgPSBzZWxmLl9maW5kVmFyKHZhcikKKworICAgICAgICBpZiBsb2NhbF92YXI6CisgICAgICAgICAgICBzZWxmLmRpY3RbdmFyXSA9IGNvcHkuY29weShsb2NhbF92YXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmluaXRWYXIodmFyKQorCisKKyAgICBkZWYgc2V0VmFyKHNlbGYsIHZhciwgdmFsdWUsICoqbG9naW5mbyk6CisgICAgICAgICNwcmludCgidmFyPSIgKyBzdHIodmFyKSArICIgIHZhbD0iICsgc3RyKHZhbHVlKSkKKyAgICAgICAgcGFyc2luZz1GYWxzZQorICAgICAgICBpZiAncGFyc2luZycgaW4gbG9naW5mbzoKKyAgICAgICAgICAgIHBhcnNpbmc9VHJ1ZQorCisgICAgICAgIGlmICdvcCcgbm90IGluIGxvZ2luZm86CisgICAgICAgICAgICBsb2dpbmZvWydvcCddID0gInNldCIKKyAgICAgICAgc2VsZi5leHBhbmRfY2FjaGUgPSB7fQorICAgICAgICBtYXRjaCAgPSBfX3NldHZhcl9yZWdleHBfXy5tYXRjaCh2YXIpCisgICAgICAgIGlmIG1hdGNoIGFuZCBtYXRjaC5ncm91cCgia2V5d29yZCIpIGluIF9fc2V0dmFyX2tleXdvcmRfXzoKKyAgICAgICAgICAgIGJhc2UgPSBtYXRjaC5ncm91cCgnYmFzZScpCisgICAgICAgICAgICBrZXl3b3JkID0gbWF0Y2guZ3JvdXAoImtleXdvcmQiKQorICAgICAgICAgICAgb3ZlcnJpZGUgPSBtYXRjaC5ncm91cCgnYWRkJykKKyAgICAgICAgICAgIGwgPSBzZWxmLmdldFZhckZsYWcoYmFzZSwga2V5d29yZCkgb3IgW10KKyAgICAgICAgICAgIGwuYXBwZW5kKFt2YWx1ZSwgb3ZlcnJpZGVdKQorICAgICAgICAgICAgc2VsZi5zZXRWYXJGbGFnKGJhc2UsIGtleXdvcmQsIGwsIGlnbm9yZT1UcnVlKQorICAgICAgICAgICAgIyBBbmQgY2F1c2UgdGhhdCB0byBiZSByZWNvcmRlZDoKKyAgICAgICAgICAgIGxvZ2luZm9bJ2RldGFpbCddID0gdmFsdWUKKyAgICAgICAgICAgIGxvZ2luZm9bJ3ZhcmlhYmxlJ10gPSBiYXNlCisgICAgICAgICAgICBpZiBvdmVycmlkZToKKyAgICAgICAgICAgICAgICBsb2dpbmZvWydvcCddID0gJyVzWyVzXScgJSAoa2V5d29yZCwgb3ZlcnJpZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSBrZXl3b3JkCisgICAgICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgICAgICMgdG9kbyBtYWtlIHN1cmUga2V5d29yZCBpcyBub3QgX19kb2NfXyBvciBfX21vZHVsZV9fCisgICAgICAgICAgICAjIHBheSB0aGUgY29va2llIG1vbnN0ZXIKKworICAgICAgICAgICAgIyBtb3JlIGNvb2tpZXMgZm9yIHRoZSBjb29raWUgbW9uc3RlcgorICAgICAgICAgICAgaWYgJ18nIGluIHZhcjoKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXR2YXJfdXBkYXRlX292ZXJyaWRlcyhiYXNlLCAqKmxvZ2luZm8pCisKKworICAgICAgICAgICAgaWYgYmFzZSBpbiBzZWxmLm92ZXJyaWRldmFyczoKKyAgICAgICAgICAgICAgICBzZWxmLm92ZXJyaWRldmFycy51cGRhdGUoc2VsZi5leHBhbmRXaXRoUmVmcyh2YWx1ZSwgdmFyKS5yZWZlcmVuY2VzKQorICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJuYWxfZmluYWxpemUoVHJ1ZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgc2VsZi5fbWFrZVNoYWRvd0NvcHkodmFyKQorCisgICAgICAgIGlmIG5vdCBwYXJzaW5nOgorICAgICAgICAgICAgaWYgIl9hcHBlbmQiIGluIHNlbGYuZGljdFt2YXJdOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRpY3RbdmFyXVsiX2FwcGVuZCJdCisgICAgICAgICAgICBpZiAiX3ByZXBlbmQiIGluIHNlbGYuZGljdFt2YXJdOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRpY3RbdmFyXVsiX3ByZXBlbmQiXQorICAgICAgICAgICAgaWYgdmFyIGluIHNlbGYub3ZlcnJpZGVkYXRhOgorICAgICAgICAgICAgICAgIGFjdGl2ZSA9IFtdCisgICAgICAgICAgICAgICAgc2VsZi5uZWVkX292ZXJyaWRlcygpCisgICAgICAgICAgICAgICAgZm9yIChyLCBvKSBpbiBzZWxmLm92ZXJyaWRlZGF0YVt2YXJdOgorICAgICAgICAgICAgICAgICAgICBpZiBvIGluIHNlbGYub3ZlcnJpZGVzc2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLmFwcGVuZChyKQorICAgICAgICAgICAgICAgICAgICBlbGlmICJfIiBpbiBvOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2V0KG8uc3BsaXQoIl8iKSkuaXNzdWJzZXQoc2VsZi5vdmVycmlkZXNzZXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5hcHBlbmQocikKKyAgICAgICAgICAgICAgICBmb3IgYSBpbiBhY3RpdmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVsVmFyKGEpCisgICAgICAgICAgICAgICAgZGVsIHNlbGYub3ZlcnJpZGVkYXRhW3Zhcl0KKworICAgICAgICAjIG1vcmUgY29va2llcyBmb3IgdGhlIGNvb2tpZSBtb25zdGVyCisgICAgICAgIGlmICdfJyBpbiB2YXI6CisgICAgICAgICAgICBzZWxmLl9zZXR2YXJfdXBkYXRlX292ZXJyaWRlcyh2YXIsICoqbG9naW5mbykKKworICAgICAgICAjIHNldHRpbmcgdmFyCisgICAgICAgIHNlbGYuZGljdFt2YXJdWyJfY29udGVudCJdID0gdmFsdWUKKyAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisKKyAgICAgICAgaWYgdmFyIGluIHNlbGYub3ZlcnJpZGV2YXJzOgorICAgICAgICAgICAgc2VsZi5vdmVycmlkZXZhcnMudXBkYXRlKHNlbGYuZXhwYW5kV2l0aFJlZnModmFsdWUsIHZhcikucmVmZXJlbmNlcykKKyAgICAgICAgICAgIHNlbGYuaW50ZXJuYWxfZmluYWxpemUoVHJ1ZSkKKworICAgIGRlZiBfc2V0dmFyX3VwZGF0ZV9vdmVycmlkZXMoc2VsZiwgdmFyLCAqKmxvZ2luZm8pOgorICAgICAgICAjIGFrYSBwYXkgdGhlIGNvb2tpZSBtb25zdGVyCisgICAgICAgIG92ZXJyaWRlID0gdmFyW3Zhci5yZmluZCgnXycpKzE6XQorICAgICAgICBzaG9ydHZhciA9IHZhcls6dmFyLnJmaW5kKCdfJyldCisgICAgICAgIHdoaWxlIG92ZXJyaWRlOgorICAgICAgICAgICAgaWYgc2hvcnR2YXIgbm90IGluIHNlbGYub3ZlcnJpZGVkYXRhOgorICAgICAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVkYXRhW3Nob3J0dmFyXSA9IFtdCisgICAgICAgICAgICBpZiBbdmFyLCBvdmVycmlkZV0gbm90IGluIHNlbGYub3ZlcnJpZGVkYXRhW3Nob3J0dmFyXToKKyAgICAgICAgICAgICAgICAjIEZvcmNlIENvVyBieSByZWNyZWF0aW5nIHRoZSBsaXN0IGZpcnN0CisgICAgICAgICAgICAgICAgc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdID0gbGlzdChzZWxmLm92ZXJyaWRlZGF0YVtzaG9ydHZhcl0pCisgICAgICAgICAgICAgICAgc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdLmFwcGVuZChbdmFyLCBvdmVycmlkZV0pCisgICAgICAgICAgICBvdmVycmlkZSA9IE5vbmUKKyAgICAgICAgICAgIGlmICJfIiBpbiBzaG9ydHZhcjoKKyAgICAgICAgICAgICAgICBvdmVycmlkZSA9IHZhcltzaG9ydHZhci5yZmluZCgnXycpKzE6XQorICAgICAgICAgICAgICAgIHNob3J0dmFyID0gdmFyWzpzaG9ydHZhci5yZmluZCgnXycpXQorICAgICAgICAgICAgICAgIGlmIGxlbihzaG9ydHZhcikgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBOb25lCisKKyAgICBkZWYgZ2V0VmFyKHNlbGYsIHZhciwgZXhwYW5kPUZhbHNlLCBub3dlYWtkZWZhdWx0PUZhbHNlLCBwYXJzaW5nPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VmFyRmxhZyh2YXIsICJfY29udGVudCIsIGV4cGFuZCwgbm93ZWFrZGVmYXVsdCwgcGFyc2luZykKKworICAgIGRlZiByZW5hbWVWYXIoc2VsZiwga2V5LCBuZXdrZXksICoqbG9naW5mbyk6CisgICAgICAgICIiIgorICAgICAgICBSZW5hbWUgdGhlIHZhcmlhYmxlIGtleSB0byBuZXdrZXkKKyAgICAgICAgIiIiCisgICAgICAgIHZhbCA9IHNlbGYuZ2V0VmFyKGtleSwgMCwgcGFyc2luZz1UcnVlKQorICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2dpbmZvWyd2YXJpYWJsZSddID0gbmV3a2V5CisgICAgICAgICAgICBsb2dpbmZvWydvcCddID0gJ3JlbmFtZSBmcm9tICVzJyAlIGtleQorICAgICAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSB2YWwKKyAgICAgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorICAgICAgICAgICAgc2VsZi5zZXRWYXIobmV3a2V5LCB2YWwsIGlnbm9yZT1UcnVlLCBwYXJzaW5nPVRydWUpCisKKyAgICAgICAgZm9yIGkgaW4gKF9fc2V0dmFyX2tleXdvcmRfXyk6CisgICAgICAgICAgICBzcmMgPSBzZWxmLmdldFZhckZsYWcoa2V5LCBpKQorICAgICAgICAgICAgaWYgc3JjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZGVzdCA9IHNlbGYuZ2V0VmFyRmxhZyhuZXdrZXksIGkpIG9yIFtdCisgICAgICAgICAgICBkZXN0LmV4dGVuZChzcmMpCisgICAgICAgICAgICBzZWxmLnNldFZhckZsYWcobmV3a2V5LCBpLCBkZXN0LCBpZ25vcmU9VHJ1ZSkKKworICAgICAgICBpZiBrZXkgaW4gc2VsZi5vdmVycmlkZWRhdGE6CisgICAgICAgICAgICBzZWxmLm92ZXJyaWRlZGF0YVtuZXdrZXldID0gW10KKyAgICAgICAgICAgIGZvciAodiwgbykgaW4gc2VsZi5vdmVycmlkZWRhdGFba2V5XToKKyAgICAgICAgICAgICAgICBzZWxmLm92ZXJyaWRlZGF0YVtuZXdrZXldLmFwcGVuZChbdi5yZXBsYWNlKGtleSwgbmV3a2V5KSwgb10pCisgICAgICAgICAgICAgICAgc2VsZi5yZW5hbWVWYXIodiwgdi5yZXBsYWNlKGtleSwgbmV3a2V5KSkKKworICAgICAgICBpZiAnXycgaW4gbmV3a2V5IGFuZCB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3NldHZhcl91cGRhdGVfb3ZlcnJpZGVzKG5ld2tleSwgKipsb2dpbmZvKQorCisgICAgICAgIGxvZ2luZm9bJ3ZhcmlhYmxlJ10gPSBrZXkKKyAgICAgICAgbG9naW5mb1snb3AnXSA9ICdyZW5hbWUgKHRvKScKKyAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSBuZXdrZXkKKyAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgIHNlbGYuZGVsVmFyKGtleSwgaWdub3JlPVRydWUpCisKKyAgICBkZWYgYXBwZW5kVmFyKHNlbGYsIHZhciwgdmFsdWUsICoqbG9naW5mbyk6CisgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAnYXBwZW5kJworICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgc2VsZi5zZXRWYXIodmFyICsgIl9hcHBlbmQiLCB2YWx1ZSwgaWdub3JlPVRydWUsIHBhcnNpbmc9VHJ1ZSkKKworICAgIGRlZiBwcmVwZW5kVmFyKHNlbGYsIHZhciwgdmFsdWUsICoqbG9naW5mbyk6CisgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAncHJlcGVuZCcKKyAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgIHNlbGYuc2V0VmFyKHZhciArICJfcHJlcGVuZCIsIHZhbHVlLCBpZ25vcmU9VHJ1ZSwgcGFyc2luZz1UcnVlKQorCisgICAgZGVmIGRlbFZhcihzZWxmLCB2YXIsICoqbG9naW5mbyk6CisgICAgICAgIGxvZ2luZm9bJ2RldGFpbCddID0gIiIKKyAgICAgICAgbG9naW5mb1snb3AnXSA9ICdkZWwnCisgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYuZGljdFt2YXJdID0ge30KKyAgICAgICAgaWYgdmFyIGluIHNlbGYub3ZlcnJpZGVkYXRhOgorICAgICAgICAgICAgZGVsIHNlbGYub3ZlcnJpZGVkYXRhW3Zhcl0KKyAgICAgICAgaWYgJ18nIGluIHZhcjoKKyAgICAgICAgICAgIG92ZXJyaWRlID0gdmFyW3Zhci5yZmluZCgnXycpKzE6XQorICAgICAgICAgICAgc2hvcnR2YXIgPSB2YXJbOnZhci5yZmluZCgnXycpXQorICAgICAgICAgICAgd2hpbGUgb3ZlcnJpZGU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBzaG9ydHZhciBpbiBzZWxmLm92ZXJyaWRlZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRm9yY2UgQ29XIGJ5IHJlY3JlYXRpbmcgdGhlIGxpc3QgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3ZlcnJpZGVkYXRhW3Nob3J0dmFyXSA9IGxpc3Qoc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdmVycmlkZWRhdGFbc2hvcnR2YXJdLnJlbW92ZShbdmFyLCBvdmVycmlkZV0pCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIG92ZXJyaWRlID0gTm9uZQorICAgICAgICAgICAgICAgIGlmICJfIiBpbiBzaG9ydHZhcjoKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSB2YXJbc2hvcnR2YXIucmZpbmQoJ18nKSsxOl0KKyAgICAgICAgICAgICAgICAgICAgc2hvcnR2YXIgPSB2YXJbOnNob3J0dmFyLnJmaW5kKCdfJyldCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihzaG9ydHZhcikgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSA9IE5vbmUKKworICAgIGRlZiBzZXRWYXJGbGFnKHNlbGYsIHZhciwgZmxhZywgdmFsdWUsICoqbG9naW5mbyk6CisgICAgICAgIHNlbGYuZXhwYW5kX2NhY2hlID0ge30KKyAgICAgICAgaWYgJ29wJyBub3QgaW4gbG9naW5mbzoKKyAgICAgICAgICAgIGxvZ2luZm9bJ29wJ10gPSAic2V0IgorICAgICAgICBsb2dpbmZvWydmbGFnJ10gPSBmbGFnCisgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorICAgICAgICBpZiBub3QgdmFyIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIHNlbGYuX21ha2VTaGFkb3dDb3B5KHZhcikKKyAgICAgICAgc2VsZi5kaWN0W3Zhcl1bZmxhZ10gPSB2YWx1ZQorCisgICAgICAgIGlmIGZsYWcgPT0gIl9kZWZhdWx0dmFsIiBhbmQgJ18nIGluIHZhcjoKKyAgICAgICAgICAgIHNlbGYuX3NldHZhcl91cGRhdGVfb3ZlcnJpZGVzKHZhciwgKipsb2dpbmZvKQorCisgICAgICAgIGlmIGZsYWcgPT0gInVuZXhwb3J0IiBvciBmbGFnID09ICJleHBvcnQiOgorICAgICAgICAgICAgaWYgbm90ICJfX2V4cG9ydGxpc3QiIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgICAgICBzZWxmLl9tYWtlU2hhZG93Q29weSgiX19leHBvcnRsaXN0IikKKyAgICAgICAgICAgIGlmIG5vdCAiX2NvbnRlbnQiIGluIHNlbGYuZGljdFsiX19leHBvcnRsaXN0Il06CisgICAgICAgICAgICAgICAgc2VsZi5kaWN0WyJfX2V4cG9ydGxpc3QiXVsiX2NvbnRlbnQiXSA9IHNldCgpCisgICAgICAgICAgICBzZWxmLmRpY3RbIl9fZXhwb3J0bGlzdCJdWyJfY29udGVudCJdLmFkZCh2YXIpCisKKyAgICBkZWYgZ2V0VmFyRmxhZyhzZWxmLCB2YXIsIGZsYWcsIGV4cGFuZD1GYWxzZSwgbm93ZWFrZGVmYXVsdD1GYWxzZSwgcGFyc2luZz1GYWxzZSk6CisgICAgICAgIGxvY2FsX3ZhciA9IHNlbGYuX2ZpbmRWYXIodmFyKQorICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgaWYgZmxhZyA9PSAiX2NvbnRlbnQiIGFuZCB2YXIgaW4gc2VsZi5vdmVycmlkZWRhdGEgYW5kIG5vdCBwYXJzaW5nOgorICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZQorICAgICAgICAgICAgYWN0aXZlID0ge30KKyAgICAgICAgICAgIHNlbGYubmVlZF9vdmVycmlkZXMoKQorICAgICAgICAgICAgZm9yIChyLCBvKSBpbiBzZWxmLm92ZXJyaWRlZGF0YVt2YXJdOgorICAgICAgICAgICAgICAgICMgV2hhdCBhYm91dCBkb3VibGUgb3ZlcnJpZGVzIGJvdGggd2l0aCAiXyIgaW4gdGhlIG5hbWU/CisgICAgICAgICAgICAgICAgaWYgbyBpbiBzZWxmLm92ZXJyaWRlc3NldDoKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlW29dID0gcgorICAgICAgICAgICAgICAgIGVsaWYgIl8iIGluIG86CisgICAgICAgICAgICAgICAgICAgIGlmIHNldChvLnNwbGl0KCJfIikpLmlzc3Vic2V0KHNlbGYub3ZlcnJpZGVzc2V0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVtvXSA9IHIKKworICAgICAgICAgICAgbW9kID0gVHJ1ZQorICAgICAgICAgICAgd2hpbGUgbW9kOgorICAgICAgICAgICAgICAgIG1vZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIG8gaW4gc2VsZi5vdmVycmlkZXM6CisgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGFjdGl2ZS5jb3B5KCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhLmVuZHN3aXRoKCJfIiArIG8pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBhY3RpdmVbYV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYWN0aXZlW2FdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlW2EucmVwbGFjZSgiXyIgKyBvLCAiIildID0gdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYSA9PSBvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gYWN0aXZlW2FdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGFjdGl2ZVthXQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmdldFZhcihtYXRjaCkKKworICAgICAgICBpZiBsb2NhbF92YXIgaXMgbm90IE5vbmUgYW5kIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBmbGFnIGluIGxvY2FsX3ZhcjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvcHkuY29weShsb2NhbF92YXJbZmxhZ10pCisgICAgICAgICAgICBlbGlmIGZsYWcgPT0gIl9jb250ZW50IiBhbmQgIl9kZWZhdWx0dmFsIiBpbiBsb2NhbF92YXIgYW5kIG5vdCBub3dlYWtkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhbHVlID0gY29weS5jb3B5KGxvY2FsX3ZhclsiX2RlZmF1bHR2YWwiXSkKKworCisgICAgICAgIGlmIGZsYWcgPT0gIl9jb250ZW50IiBhbmQgbG9jYWxfdmFyIGlzIG5vdCBOb25lIGFuZCAiX2FwcGVuZCIgaW4gbG9jYWxfdmFyIGFuZCBub3QgcGFyc2luZzoKKyAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiCisgICAgICAgICAgICBzZWxmLm5lZWRfb3ZlcnJpZGVzKCkKKyAgICAgICAgICAgIGZvciAociwgbykgaW4gbG9jYWxfdmFyWyJfYXBwZW5kIl06CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIG8yIGluIG8uc3BsaXQoIl8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvMiBpbiBzZWxmLm92ZXJyaWRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IEZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgcgorCisgICAgICAgIGlmIGZsYWcgPT0gIl9jb250ZW50IiBhbmQgbG9jYWxfdmFyIGlzIG5vdCBOb25lIGFuZCAiX3ByZXBlbmQiIGluIGxvY2FsX3ZhciBhbmQgbm90IHBhcnNpbmc6CisgICAgICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiIgorICAgICAgICAgICAgc2VsZi5uZWVkX292ZXJyaWRlcygpCisgICAgICAgICAgICBmb3IgKHIsIG8pIGluIGxvY2FsX3ZhclsiX3ByZXBlbmQiXToKKworICAgICAgICAgICAgICAgIG1hdGNoID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIG86CisgICAgICAgICAgICAgICAgICAgIGZvciBvMiBpbiBvLnNwbGl0KCJfIik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbzIgaW4gc2VsZi5vdmVycmlkZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByICsgdmFsdWUKKworICAgICAgICBpZiBleHBhbmQgYW5kIHZhbHVlOgorICAgICAgICAgICAgIyBPbmx5IGdldHZhciAoZmxhZyA9PSBfY29udGVudCkgaGl0cyB0aGUgZXhwYW5kIGNhY2hlCisgICAgICAgICAgICBjYWNoZW5hbWUgPSBOb25lCisgICAgICAgICAgICBpZiBmbGFnID09ICJfY29udGVudCI6CisgICAgICAgICAgICAgICAgY2FjaGVuYW1lID0gdmFyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNhY2hlbmFtZSA9IHZhciArICJbIiArIGZsYWcgKyAiXSIKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5leHBhbmQodmFsdWUsIGNhY2hlbmFtZSkKKworICAgICAgICBpZiB2YWx1ZSBhbmQgZmxhZyA9PSAiX2NvbnRlbnQiIGFuZCBsb2NhbF92YXIgaXMgbm90IE5vbmUgYW5kICJfcmVtb3ZlIiBpbiBsb2NhbF92YXI6CisgICAgICAgICAgICByZW1vdmVzID0gW10KKyAgICAgICAgICAgIHNlbGYubmVlZF9vdmVycmlkZXMoKQorICAgICAgICAgICAgZm9yIChyLCBvKSBpbiBsb2NhbF92YXJbIl9yZW1vdmUiXToKKyAgICAgICAgICAgICAgICBtYXRjaCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBvOgorICAgICAgICAgICAgICAgICAgICBmb3IgbzIgaW4gby5zcGxpdCgiXyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG8yIGluIHNlbGYub3ZlcnJpZGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZXMuZXh0ZW5kKHNlbGYuZXhwYW5kKHIpLnNwbGl0KCkpCisKKyAgICAgICAgICAgIGZpbHRlcmVkID0gZmlsdGVyKGxhbWJkYSB2OiB2IG5vdCBpbiByZW1vdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3BsaXQoKSkKKyAgICAgICAgICAgIHZhbHVlID0gIiAiLmpvaW4oZmlsdGVyZWQpCisgICAgICAgICAgICBpZiBleHBhbmQgYW5kIHZhciBpbiBzZWxmLmV4cGFuZF9jYWNoZToKKyAgICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgZXhwYW5kIGNhY2hlIGhhcyB0aGUgY29ycmVjdCB2YWx1ZQorICAgICAgICAgICAgICAgICAjIGZsYWcgPT0gIl9jb250ZW50IiBoZXJlCisgICAgICAgICAgICAgICAgc2VsZi5leHBhbmRfY2FjaGVbdmFyXS52YWx1ZSA9IHZhbHVlCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIGRlbFZhckZsYWcoc2VsZiwgdmFyLCBmbGFnLCAqKmxvZ2luZm8pOgorICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisgICAgICAgIGxvY2FsX3ZhciA9IHNlbGYuX2ZpbmRWYXIodmFyKQorICAgICAgICBpZiBub3QgbG9jYWxfdmFyOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgc2VsZi5fbWFrZVNoYWRvd0NvcHkodmFyKQorCisgICAgICAgIGlmIHZhciBpbiBzZWxmLmRpY3QgYW5kIGZsYWcgaW4gc2VsZi5kaWN0W3Zhcl06CisgICAgICAgICAgICBsb2dpbmZvWydkZXRhaWwnXSA9ICIiCisgICAgICAgICAgICBsb2dpbmZvWydvcCddID0gJ2RlbEZsYWcnCisgICAgICAgICAgICBsb2dpbmZvWydmbGFnJ10gPSBmbGFnCisgICAgICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKworICAgICAgICAgICAgZGVsIHNlbGYuZGljdFt2YXJdW2ZsYWddCisKKyAgICBkZWYgYXBwZW5kVmFyRmxhZyhzZWxmLCB2YXIsIGZsYWcsIHZhbHVlLCAqKmxvZ2luZm8pOgorICAgICAgICBsb2dpbmZvWydvcCddID0gJ2FwcGVuZCcKKyAgICAgICAgbG9naW5mb1snZmxhZyddID0gZmxhZworICAgICAgICBzZWxmLnZhcmhpc3RvcnkucmVjb3JkKCoqbG9naW5mbykKKyAgICAgICAgbmV3dmFsdWUgPSAoc2VsZi5nZXRWYXJGbGFnKHZhciwgZmxhZywgRmFsc2UpIG9yICIiKSArIHZhbHVlCisgICAgICAgIHNlbGYuc2V0VmFyRmxhZyh2YXIsIGZsYWcsIG5ld3ZhbHVlLCBpZ25vcmU9VHJ1ZSkKKworICAgIGRlZiBwcmVwZW5kVmFyRmxhZyhzZWxmLCB2YXIsIGZsYWcsIHZhbHVlLCAqKmxvZ2luZm8pOgorICAgICAgICBsb2dpbmZvWydvcCddID0gJ3ByZXBlbmQnCisgICAgICAgIGxvZ2luZm9bJ2ZsYWcnXSA9IGZsYWcKKyAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgIG5ld3ZhbHVlID0gdmFsdWUgKyAoc2VsZi5nZXRWYXJGbGFnKHZhciwgZmxhZywgRmFsc2UpIG9yICIiKQorICAgICAgICBzZWxmLnNldFZhckZsYWcodmFyLCBmbGFnLCBuZXd2YWx1ZSwgaWdub3JlPVRydWUpCisKKyAgICBkZWYgc2V0VmFyRmxhZ3Moc2VsZiwgdmFyLCBmbGFncywgKipsb2dpbmZvKToKKyAgICAgICAgc2VsZi5leHBhbmRfY2FjaGUgPSB7fQorICAgICAgICBpbmZlcl9jYWxsZXJfZGV0YWlscyhsb2dpbmZvKQorICAgICAgICBpZiBub3QgdmFyIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIHNlbGYuX21ha2VTaGFkb3dDb3B5KHZhcikKKworICAgICAgICBmb3IgaSBpbiBmbGFnczoKKyAgICAgICAgICAgIGlmIGkgPT0gIl9jb250ZW50IjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbG9naW5mb1snZmxhZyddID0gaQorICAgICAgICAgICAgbG9naW5mb1snZGV0YWlsJ10gPSBmbGFnc1tpXQorICAgICAgICAgICAgc2VsZi52YXJoaXN0b3J5LnJlY29yZCgqKmxvZ2luZm8pCisgICAgICAgICAgICBzZWxmLmRpY3RbdmFyXVtpXSA9IGZsYWdzW2ldCisKKyAgICBkZWYgZ2V0VmFyRmxhZ3Moc2VsZiwgdmFyLCBleHBhbmQgPSBGYWxzZSwgaW50ZXJuYWxmbGFncz1GYWxzZSk6CisgICAgICAgIGxvY2FsX3ZhciA9IHNlbGYuX2ZpbmRWYXIodmFyKQorICAgICAgICBmbGFncyA9IHt9CisKKyAgICAgICAgaWYgbG9jYWxfdmFyOgorICAgICAgICAgICAgZm9yIGkgaW4gbG9jYWxfdmFyOgorICAgICAgICAgICAgICAgIGlmIGkuc3RhcnRzd2l0aCgiXyIpIGFuZCBub3QgaW50ZXJuYWxmbGFnczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmbGFnc1tpXSA9IGxvY2FsX3ZhcltpXQorICAgICAgICAgICAgICAgIGlmIGV4cGFuZCBhbmQgaSBpbiBleHBhbmQ6CisgICAgICAgICAgICAgICAgICAgIGZsYWdzW2ldID0gc2VsZi5leHBhbmQoZmxhZ3NbaV0sIHZhciArICJbIiArIGkgKyAiXSIpCisgICAgICAgIGlmIGxlbihmbGFncykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBmbGFncworCisKKyAgICBkZWYgZGVsVmFyRmxhZ3Moc2VsZiwgdmFyLCAqKmxvZ2luZm8pOgorICAgICAgICBzZWxmLmV4cGFuZF9jYWNoZSA9IHt9CisgICAgICAgIGlmIG5vdCB2YXIgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgc2VsZi5fbWFrZVNoYWRvd0NvcHkodmFyKQorCisgICAgICAgIGlmIHZhciBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICBjb250ZW50ID0gTm9uZQorCisgICAgICAgICAgICBsb2dpbmZvWydvcCddID0gJ2RlbGV0ZSBmbGFncycKKyAgICAgICAgICAgIHNlbGYudmFyaGlzdG9yeS5yZWNvcmQoKipsb2dpbmZvKQorCisgICAgICAgICAgICAjIHRyeSB0byBzYXZlIHRoZSBjb250ZW50CisgICAgICAgICAgICBpZiAiX2NvbnRlbnQiIGluIHNlbGYuZGljdFt2YXJdOgorICAgICAgICAgICAgICAgIGNvbnRlbnQgID0gc2VsZi5kaWN0W3Zhcl1bIl9jb250ZW50Il0KKyAgICAgICAgICAgICAgICBzZWxmLmRpY3RbdmFyXSAgICAgICAgICAgID0ge30KKyAgICAgICAgICAgICAgICBzZWxmLmRpY3RbdmFyXVsiX2NvbnRlbnQiXSA9IGNvbnRlbnQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGljdFt2YXJdCisKKyAgICBkZWYgY3JlYXRlQ29weShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIGNvcHkgb2Ygc2VsZiBieSBzZXR0aW5nIF9kYXRhIHRvIHNlbGYKKyAgICAgICAgIiIiCisgICAgICAgICMgd2UgcmVhbGx5IHdhbnQgdGhpcyB0byBiZSBhIERhdGFTbWFydC4uLgorICAgICAgICBkYXRhID0gRGF0YVNtYXJ0KCkKKyAgICAgICAgZGF0YS5kaWN0WyJfZGF0YSJdID0gc2VsZi5kaWN0CisgICAgICAgIGRhdGEudmFyaGlzdG9yeSA9IHNlbGYudmFyaGlzdG9yeS5jb3B5KCkKKyAgICAgICAgZGF0YS52YXJoaXN0b3J5LmRhdGFzbWFydCA9IGRhdGEKKyAgICAgICAgZGF0YS5pbmNoaXN0b3J5ID0gc2VsZi5pbmNoaXN0b3J5LmNvcHkoKQorCisgICAgICAgIGRhdGEuX3RyYWNraW5nID0gc2VsZi5fdHJhY2tpbmcKKworICAgICAgICBkYXRhLm92ZXJyaWRlcyA9IE5vbmUKKyAgICAgICAgZGF0YS5vdmVycmlkZXZhcnMgPSBjb3B5LmNvcHkoc2VsZi5vdmVycmlkZXZhcnMpCisgICAgICAgICMgU2hvdWxkIHJlYWxseSBiZSBhIGRlZXBjb3B5IGJ1dCBoYXMgaGVhdnkgb3ZlcmhlYWQuCisgICAgICAgICMgSW5zdGVhZCwgd2UncmUgY2FyZWZ1bCB3aXRoIHdyaXRlcy4KKyAgICAgICAgZGF0YS5vdmVycmlkZWRhdGEgPSBjb3B5LmNvcHkoc2VsZi5vdmVycmlkZWRhdGEpCisKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBleHBhbmRWYXJyZWYoc2VsZiwgdmFyaWFibGUsIHBhcmVudHM9RmFsc2UpOgorICAgICAgICAiIiJGaW5kIGFsbCByZWZlcmVuY2VzIHRvIHZhcmlhYmxlIGluIHRoZSBkYXRhIGFuZCBleHBhbmQgaXQKKyAgICAgICAgICAgaW4gcGxhY2UsIG9wdGlvbmFsbHkgZGVzY2VuZGluZyB0byBwYXJlbnQgZGF0YXN0b3Jlcy4iIiIKKworICAgICAgICBpZiBwYXJlbnRzOgorICAgICAgICAgICAga2V5cyA9IGl0ZXIoc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleXMgPSBzZWxmLmxvY2Fsa2V5cygpCisKKyAgICAgICAgcmVmID0gJyR7JXN9JyAlIHZhcmlhYmxlCisgICAgICAgIHZhbHVlID0gc2VsZi5nZXRWYXIodmFyaWFibGUsIEZhbHNlKQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICByZWZlcnJlcnZhbHVlID0gc2VsZi5nZXRWYXIoa2V5LCBGYWxzZSkKKyAgICAgICAgICAgIGlmIHJlZmVycmVydmFsdWUgYW5kIHJlZiBpbiByZWZlcnJlcnZhbHVlOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0VmFyKGtleSwgcmVmZXJyZXJ2YWx1ZS5yZXBsYWNlKHJlZiwgdmFsdWUpKQorCisgICAgZGVmIGxvY2Fsa2V5cyhzZWxmKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICBpZiBrZXkgIT0gJ19kYXRhJzoKKyAgICAgICAgICAgICAgICB5aWVsZCBrZXkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZGVsZXRlZCA9IHNldCgpCisgICAgICAgIG92ZXJyaWRlcyA9IHNldCgpCisgICAgICAgIGRlZiBrZXlsaXN0KGQpOiAgICAgICAgCisgICAgICAgICAgICBrbGlzdCA9IHNldCgpCisgICAgICAgICAgICBmb3Iga2V5IGluIGQ6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICJfZGF0YSI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYga2V5IGluIGRlbGV0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYga2V5IGluIG92ZXJyaWRlczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBub3QgZFtrZXldOgorICAgICAgICAgICAgICAgICAgICBkZWxldGVkLmFkZChrZXkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAga2xpc3QuYWRkKGtleSkKKworICAgICAgICAgICAgaWYgIl9kYXRhIiBpbiBkOgorICAgICAgICAgICAgICAgIGtsaXN0IHw9IGtleWxpc3QoZFsiX2RhdGEiXSkKKworICAgICAgICAgICAgcmV0dXJuIGtsaXN0CisKKyAgICAgICAgc2VsZi5uZWVkX292ZXJyaWRlcygpCisgICAgICAgIGZvciB2YXIgaW4gc2VsZi5vdmVycmlkZWRhdGE6CisgICAgICAgICAgICBmb3IgKHIsIG8pIGluIHNlbGYub3ZlcnJpZGVkYXRhW3Zhcl06CisgICAgICAgICAgICAgICAgaWYgbyBpbiBzZWxmLm92ZXJyaWRlc3NldDoKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzLmFkZCh2YXIpCisgICAgICAgICAgICAgICAgZWxpZiAiXyIgaW4gbzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2V0KG8uc3BsaXQoIl8iKSkuaXNzdWJzZXQoc2VsZi5vdmVycmlkZXNzZXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzLmFkZCh2YXIpCisKKyAgICAgICAgZm9yIGsgaW4ga2V5bGlzdChzZWxmLmRpY3QpOgorICAgICAgICAgICAgIHlpZWxkIGsKKworICAgICAgICBmb3IgayBpbiBvdmVycmlkZXM6CisgICAgICAgICAgICAgeWllbGQgaworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oZnJvemVuc2V0KHNlbGYpKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pOgorICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0VmFyKGl0ZW0sIEZhbHNlKQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoaXRlbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIHZhciwgdmFsdWUpOgorICAgICAgICBzZWxmLnNldFZhcih2YXIsIHZhbHVlKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIHZhcik6CisgICAgICAgIHNlbGYuZGVsVmFyKHZhcikKKworICAgIGRlZiBnZXRfaGFzaChzZWxmKToKKyAgICAgICAgZGF0YSA9IHt9CisgICAgICAgIGQgPSBzZWxmLmNyZWF0ZUNvcHkoKQorICAgICAgICBiYi5kYXRhLmV4cGFuZEtleXMoZCkKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShkKQorCisgICAgICAgIGNvbmZpZ193aGl0ZWxpc3QgPSBzZXQoKGQuZ2V0VmFyKCJCQl9IQVNIQ09ORklHX1dISVRFTElTVCIsIFRydWUpIG9yICIiKS5zcGxpdCgpKQorICAgICAgICBrZXlzID0gc2V0KGtleSBmb3Iga2V5IGluIGl0ZXIoZCkgaWYgbm90IGtleS5zdGFydHN3aXRoKCJfXyIpKQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICBpZiBrZXkgaW4gY29uZmlnX3doaXRlbGlzdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB2YWx1ZSA9IGQuZ2V0VmFyKGtleSwgRmFsc2UpIG9yICIiCisgICAgICAgICAgICBkYXRhLnVwZGF0ZSh7a2V5OnZhbHVlfSkKKworICAgICAgICAgICAgdmFyZmxhZ3MgPSBkLmdldFZhckZsYWdzKGtleSwgaW50ZXJuYWxmbGFncyA9IFRydWUpCisgICAgICAgICAgICBpZiBub3QgdmFyZmxhZ3M6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBmIGluIHZhcmZsYWdzOgorICAgICAgICAgICAgICAgIGlmIGYgPT0gIl9jb250ZW50IjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBkYXRhLnVwZGF0ZSh7JyVzWyVzXScgJSAoa2V5LCBmKTp2YXJmbGFnc1tmXX0pCisKKyAgICAgICAgZm9yIGtleSBpbiBbIl9fQkJUQVNLUyIsICJfX0JCQU5PTkZVTkNTIiwgIl9fQkJIQU5ETEVSUyJdOgorICAgICAgICAgICAgYmJfbGlzdCA9IGQuZ2V0VmFyKGtleSwgRmFsc2UpIG9yIFtdCisgICAgICAgICAgICBiYl9saXN0LnNvcnQoKQorICAgICAgICAgICAgZGF0YS51cGRhdGUoe2tleTpzdHIoYmJfbGlzdCl9KQorCisgICAgICAgICAgICBpZiBrZXkgPT0gIl9fQkJBTk9ORlVOQ1MiOgorICAgICAgICAgICAgICAgIGZvciBpIGluIGJiX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZC5nZXRWYXIoaSwgVHJ1ZSkgb3IgIiIKKyAgICAgICAgICAgICAgICAgICAgZGF0YS51cGRhdGUoe2k6dmFsdWV9KQorCisgICAgICAgIGRhdGFfc3RyID0gc3RyKFsoaywgZGF0YVtrXSkgZm9yIGsgaW4gc29ydGVkKGRhdGEua2V5cygpKV0pCisgICAgICAgIHJldHVybiBoYXNobGliLm1kNShkYXRhX3N0cikuaGV4ZGlnZXN0KCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2V2ZW50LnB5IGIvYml0YmFrZS9saWIvYmIvZXZlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2YmM0MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2V2ZW50LnB5CkBAIC0wLDAgKzEsNjY4IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdFdmVudCcgaW1wbGVtZW50YXRpb24KKworQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgJ2V2ZW50cycgaW4gdGhlCitCaXRCYWtlIGJ1aWxkIHRvb2xzLgorIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcywgc3lzCitpbXBvcnQgd2FybmluZ3MKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgcGlja2xlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGF0ZXhpdAoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IGJiLnV0aWxzCitpbXBvcnQgYmIuY29tcGF0CitpbXBvcnQgYmIuZXhjZXB0aW9ucworCisjIFRoaXMgaXMgdGhlIHBpZCBmb3Igd2hpY2ggd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZSBldmVudC4gVGhpcyBpcyBzZXQgd2hlbgorIyB0aGUgcnVucXVldWUgZm9ya3Mgb2ZmLgord29ya2VyX3BpZCA9IDAKK3dvcmtlcl9maXJlID0gTm9uZQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5FdmVudCcpCisKK2NsYXNzIEV2ZW50KG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgZXZlbnRzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucGlkID0gd29ya2VyX3BpZAorCitSZWdpc3RlcmVkICAgICAgICA9IDEwCitBbHJlYWR5UmVnaXN0ZXJlZCA9IDE0CisKK2RlZiBnZXRfY2xhc3NfaGFuZGxlcnMoKToKKyAgICByZXR1cm4gX2hhbmRsZXJzCisKK2RlZiBzZXRfY2xhc3NfaGFuZGxlcnMoaCk6CisgICAgZ2xvYmFsIF9oYW5kbGVycworICAgIF9oYW5kbGVycyA9IGgKKworZGVmIGNsZWFuX2NsYXNzX2hhbmRsZXJzKCk6CisgICAgcmV0dXJuIGJiLmNvbXBhdC5PcmRlcmVkRGljdCgpCisKKyMgSW50ZXJuYWwKK19oYW5kbGVycyA9IGNsZWFuX2NsYXNzX2hhbmRsZXJzKCkKK191aV9oYW5kbGVycyA9IHt9CitfdWlfbG9nZmlsdGVycyA9IHt9CitfdWlfaGFuZGxlcl9zZXEgPSAwCitfZXZlbnRfaGFuZGxlcl9tYXAgPSB7fQorX2NhdGNoYWxsX2hhbmRsZXJzID0ge30KK19ldmVudGZpbHRlciA9IE5vbmUKK191aXJlYWR5ID0gRmFsc2UKKworZGVmIGV4ZWN1dGVfaGFuZGxlcihuYW1lLCBoYW5kbGVyLCBldmVudCwgZCk6CisgICAgZXZlbnQuZGF0YSA9IGQKKyAgICBhZGRlZGQgPSBGYWxzZQorICAgIGlmICdkJyBub3QgaW4gX19idWlsdGluc19fOgorICAgICAgICBfX2J1aWx0aW5zX19bJ2QnXSA9IGQKKyAgICAgICAgYWRkZWRkID0gVHJ1ZQorICAgIHRyeToKKyAgICAgICAgcmV0ID0gaGFuZGxlcihldmVudCkKKyAgICBleGNlcHQgKGJiLnBhcnNlLlNraXBSZWNpcGUsIGJiLkJCSGFuZGxlZEV4Y2VwdGlvbik6CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgZXR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIGxvZ2dlci5lcnJvcigiRXhlY3V0aW9uIG9mIGV2ZW50IGhhbmRsZXIgJyVzJyBmYWlsZWQiICUgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y19pbmZvPShldHlwZSwgdmFsdWUsIHRiLnRiX25leHQpKQorICAgICAgICByYWlzZQorICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIGV4YzoKKyAgICAgICAgaWYgZXhjLmNvZGUgIT0gMDoKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRXhlY3V0aW9uIG9mIGV2ZW50IGhhbmRsZXIgJyVzJyBmYWlsZWQiICUgbmFtZSkKKyAgICAgICAgcmFpc2UKKyAgICBmaW5hbGx5OgorICAgICAgICBkZWwgZXZlbnQuZGF0YQorICAgICAgICBpZiBhZGRlZGQ6CisgICAgICAgICAgICBkZWwgX19idWlsdGluc19fWydkJ10KKworZGVmIGZpcmVfY2xhc3NfaGFuZGxlcnMoZXZlbnQsIGQpOgorICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBlaWQgPSBzdHIoZXZlbnQuX19jbGFzc19fKVs4Oi0yXQorICAgIGV2dF9obWFwID0gX2V2ZW50X2hhbmRsZXJfbWFwLmdldChlaWQsIHt9KQorICAgIGZvciBuYW1lLCBoYW5kbGVyIGluIF9oYW5kbGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgaWYgbmFtZSBpbiBfY2F0Y2hhbGxfaGFuZGxlcnMgb3IgbmFtZSBpbiBldnRfaG1hcDoKKyAgICAgICAgICAgIGlmIF9ldmVudGZpbHRlcjoKKyAgICAgICAgICAgICAgICBpZiBub3QgX2V2ZW50ZmlsdGVyKG5hbWUsIGhhbmRsZXIsIGV2ZW50LCBkKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4ZWN1dGVfaGFuZGxlcihuYW1lLCBoYW5kbGVyLCBldmVudCwgZCkKKwordWlfcXVldWUgPSBbXQorQGF0ZXhpdC5yZWdpc3RlcgorZGVmIHByaW50X3VpX3F1ZXVlKCk6CisgICAgIiIiSWYgd2UncmUgZXhpdGluZyBiZWZvcmUgYSBVSSBoYXMgYmVlbiBzcGF3bmVkLCBkaXNwbGF5IGFueSBxdWV1ZWQKKyAgICBMb2dSZWNvcmRzIHRvIHRoZSBjb25zb2xlLiIiIgorICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKKyAgICBpZiBub3QgX3VpcmVhZHk6CisgICAgICAgIGZyb20gYmIubXNnIGltcG9ydCBCQkxvZ0Zvcm1hdHRlcgorICAgICAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpCisgICAgICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKEJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpKQorICAgICAgICBsb2dnZXIuaGFuZGxlcnMgPSBbY29uc29sZV0KKworICAgICAgICAjIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBwcm9wZXIgbWVzc2FnZXMKKyAgICAgICAgbXNncHJpbnQgPSBGYWxzZQorICAgICAgICBmb3IgZXZlbnQgaW4gdWlfcXVldWU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBsb2dnaW5nLkxvZ1JlY29yZCk6CisgICAgICAgICAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA+IGxvZ2dpbmcuREVCVUc6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGUoZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIG1zZ3ByaW50ID0gVHJ1ZQorICAgICAgICBpZiBtc2dwcmludDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgTm9wZSwgc28ganVzdCBwcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIHdlIGhhdmUgKGluY2x1ZGluZyBkZWJ1ZyBtZXNzYWdlcykKKyAgICAgICAgZm9yIGV2ZW50IGluIHVpX3F1ZXVlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGUoZXZlbnQpCisKK2RlZiBmaXJlX3VpX2hhbmRsZXJzKGV2ZW50LCBkKToKKyAgICBpZiBub3QgX3VpcmVhZHk6CisgICAgICAgICMgTm8gVUkgaGFuZGxlcnMgcmVnaXN0ZXJlZCB5ZXQsIHF1ZXVlIHVwIHRoZSBtZXNzYWdlcworICAgICAgICB1aV9xdWV1ZS5hcHBlbmQoZXZlbnQpCisgICAgICAgIHJldHVybgorCisgICAgZXJyb3JzID0gW10KKyAgICBmb3IgaCBpbiBfdWlfaGFuZGxlcnM6CisgICAgICAgICNwcmludCAiU2VuZGluZyBldmVudCAlcyIgJSBldmVudAorICAgICAgICB0cnk6CisgICAgICAgICAgICAgaWYgbm90IF91aV9sb2dmaWx0ZXJzW2hdLmZpbHRlcihldmVudCk6CisgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgIyBXZSB1c2UgcGlja2xlIGhlcmUgc2luY2UgaXQgYmV0dGVyIGhhbmRsZXMgb2JqZWN0IGluc3RhbmNlcworICAgICAgICAgICAgICMgd2hpY2ggeG1scnBjJ3MgbWFyc2hhbGxlciBkb2VzIG5vdC4gRXZlbnRzICptdXN0KiBiZSBzZXJpYWxpemFibGUKKyAgICAgICAgICAgICAjIGJ5IHBpY2tsZS4KKyAgICAgICAgICAgICBpZiBoYXNhdHRyKF91aV9oYW5kbGVyc1toXS5ldmVudCwgInNlbmRwaWNrbGUiKToKKyAgICAgICAgICAgICAgICBfdWlfaGFuZGxlcnNbaF0uZXZlbnQuc2VuZHBpY2tsZSgocGlja2xlLmR1bXBzKGV2ZW50KSkpCisgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBfdWlfaGFuZGxlcnNbaF0uZXZlbnQuc2VuZChldmVudCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChoKQorICAgIGZvciBoIGluIGVycm9yczoKKyAgICAgICAgZGVsIF91aV9oYW5kbGVyc1toXQorCitkZWYgZmlyZShldmVudCwgZCk6CisgICAgIiIiRmlyZSBvZmYgYW4gRXZlbnQiIiIKKworICAgICMgV2UgY2FuIGZpcmUgY2xhc3MgaGFuZGxlcnMgaW4gdGhlIHdvcmtlciBwcm9jZXNzIGNvbnRleHQgYW5kIHRoaXMgaXMKKyAgICAjIGRlc2lyZWQgc28gdGhleSBnZXQgdGhlIHRhc2sgYmFzZWQgZGF0YXN0b3JlLgorICAgICMgVUkgaGFuZGxlcnMgbmVlZCB0byBiZSBmaXJlZCBpbiB0aGUgc2VydmVyIGNvbnRleHQgc28gd2UgZGVmZXIgdGhpcy4gVGhleQorICAgICMgZG9uJ3QgaGF2ZSBhIGRhdGFzdG9yZSBzbyB0aGUgZGF0YXN0b3JlIGNvbnRleHQgaXNuJ3QgYSBwcm9ibGVtLgorCisgICAgZmlyZV9jbGFzc19oYW5kbGVycyhldmVudCwgZCkKKyAgICBpZiB3b3JrZXJfZmlyZToKKyAgICAgICAgd29ya2VyX2ZpcmUoZXZlbnQsIGQpCisgICAgZWxzZToKKyAgICAgICAgZmlyZV91aV9oYW5kbGVycyhldmVudCwgZCkKKworZGVmIGZpcmVfZnJvbV93b3JrZXIoZXZlbnQsIGQpOgorICAgIGZpcmVfdWlfaGFuZGxlcnMoZXZlbnQsIGQpCisKK25vb3AgPSBsYW1iZGEgXzogTm9uZQorZGVmIHJlZ2lzdGVyKG5hbWUsIGhhbmRsZXIsIG1hc2s9Tm9uZSk6CisgICAgIiIiUmVnaXN0ZXIgYW4gRXZlbnQgaGFuZGxlciIiIgorCisgICAgIyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgICBpZiBuYW1lIGluIF9oYW5kbGVyczoKKyAgICAgICAgcmV0dXJuIEFscmVhZHlSZWdpc3RlcmVkCisKKyAgICBpZiBoYW5kbGVyIGlzIG5vdCBOb25lOgorICAgICAgICAjIGhhbmRsZSBzdHJpbmcgY29udGFpbmluZyBweXRob24gY29kZQorICAgICAgICBpZiBpc2luc3RhbmNlKGhhbmRsZXIsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgdG1wID0gImRlZiAlcyhlKTpcbiVzIiAlIChuYW1lLCBoYW5kbGVyKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKHRtcCwgIiVzKGUpIiAlIG5hbWUsICJleGVjIikKKyAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byByZWdpc3RlciBldmVudCBoYW5kbGVyICclcyc6XG4lcyIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9leGMobGltaXQ9MCkpKQorICAgICAgICAgICAgICAgIF9oYW5kbGVyc1tuYW1lXSA9IG5vb3AKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVudiA9IHt9CisgICAgICAgICAgICBiYi51dGlscy5iZXR0ZXJfZXhlYyhjb2RlLCBlbnYpCisgICAgICAgICAgICBmdW5jID0gYmIudXRpbHMuYmV0dGVyX2V2YWwobmFtZSwgZW52KQorICAgICAgICAgICAgX2hhbmRsZXJzW25hbWVdID0gZnVuYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgX2hhbmRsZXJzW25hbWVdID0gaGFuZGxlcgorCisgICAgICAgIGlmIG5vdCBtYXNrIG9yICcqJyBpbiBtYXNrOgorICAgICAgICAgICAgX2NhdGNoYWxsX2hhbmRsZXJzW25hbWVdID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIG0gaW4gbWFzazoKKyAgICAgICAgICAgICAgICBpZiBfZXZlbnRfaGFuZGxlcl9tYXAuZ2V0KG0sIE5vbmUpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIF9ldmVudF9oYW5kbGVyX21hcFttXSA9IHt9CisgICAgICAgICAgICAgICAgX2V2ZW50X2hhbmRsZXJfbWFwW21dW25hbWVdID0gVHJ1ZQorCisgICAgICAgIHJldHVybiBSZWdpc3RlcmVkCisKK2RlZiByZW1vdmUobmFtZSwgaGFuZGxlcik6CisgICAgIiIiUmVtb3ZlIGFuIEV2ZW50IGhhbmRsZXIiIiIKKyAgICBfaGFuZGxlcnMucG9wKG5hbWUpCisKK2RlZiBzZXRfZXZlbnRmaWx0ZXIoZnVuYyk6CisgICAgZ2xvYmFsIF9ldmVudGZpbHRlcgorICAgIF9ldmVudGZpbHRlciA9IGZ1bmMKKworZGVmIHJlZ2lzdGVyX1VJSGhhbmRsZXIoaGFuZGxlciwgbWFpbnVpPUZhbHNlKToKKyAgICBpZiBtYWludWk6CisgICAgICAgIGdsb2JhbCBfdWlyZWFkeQorICAgICAgICBfdWlyZWFkeSA9IFRydWUKKyAgICBiYi5ldmVudC5fdWlfaGFuZGxlcl9zZXEgPSBiYi5ldmVudC5fdWlfaGFuZGxlcl9zZXEgKyAxCisgICAgX3VpX2hhbmRsZXJzW191aV9oYW5kbGVyX3NlcV0gPSBoYW5kbGVyCisgICAgbGV2ZWwsIGRlYnVnX2RvbWFpbnMgPSBiYi5tc2cuY29uc3RydWN0TG9nT3B0aW9ucygpCisgICAgX3VpX2xvZ2ZpbHRlcnNbX3VpX2hhbmRsZXJfc2VxXSA9IFVJRXZlbnRGaWx0ZXIobGV2ZWwsIGRlYnVnX2RvbWFpbnMpCisgICAgcmV0dXJuIF91aV9oYW5kbGVyX3NlcQorCitkZWYgdW5yZWdpc3Rlcl9VSUhoYW5kbGVyKGhhbmRsZXJOdW0pOgorICAgIGlmIGhhbmRsZXJOdW0gaW4gX3VpX2hhbmRsZXJzOgorICAgICAgICBkZWwgX3VpX2hhbmRsZXJzW2hhbmRsZXJOdW1dCisgICAgcmV0dXJuCisKKyMgQ2xhc3MgdG8gYWxsb3cgZmlsdGVyaW5nIG9mIGV2ZW50cyBhbmQgc3BlY2lmaWMgZmlsdGVyaW5nIG9mIExvZ1JlY29yZHMgKmJlZm9yZSogd2UgcHV0IHRoZW0gb3ZlciB0aGUgSVBDCitjbGFzcyBVSUV2ZW50RmlsdGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsLCBkZWJ1Z19kb21haW5zKToKKyAgICAgICAgc2VsZi51cGRhdGUoTm9uZSwgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGV2ZW50bWFzaywgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpOgorICAgICAgICBzZWxmLmV2ZW50bWFzayA9IGV2ZW50bWFzaworICAgICAgICBzZWxmLnN0ZGxldmVsID0gbGV2ZWwKKyAgICAgICAgc2VsZi5kZWJ1Z19kb21haW5zID0gZGVidWdfZG9tYWlucworCisgICAgZGVmIGZpbHRlcihzZWxmLCBldmVudCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgIGlmIGV2ZW50LmxldmVsbm8gPj0gc2VsZi5zdGRsZXZlbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgaWYgZXZlbnQubmFtZSBpbiBzZWxmLmRlYnVnX2RvbWFpbnMgYW5kIGV2ZW50LmxldmVsbm8gPj0gc2VsZi5kZWJ1Z19kb21haW5zW2V2ZW50Lm5hbWVdOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWlkID0gc3RyKGV2ZW50Ll9fY2xhc3NfXylbODotMl0KKyAgICAgICAgaWYgc2VsZi5ldmVudG1hc2sgYW5kIGVpZCBub3QgaW4gc2VsZi5ldmVudG1hc2s6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworZGVmIHNldF9VSUhtYXNrKGhhbmRsZXJOdW0sIGxldmVsLCBkZWJ1Z19kb21haW5zLCBtYXNrKToKKyAgICBpZiBub3QgaGFuZGxlck51bSBpbiBfdWlfaGFuZGxlcnM6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmICcqJyBpbiBtYXNrOgorICAgICAgICBfdWlfbG9nZmlsdGVyc1toYW5kbGVyTnVtXS51cGRhdGUoTm9uZSwgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpCisgICAgZWxzZToKKyAgICAgICAgX3VpX2xvZ2ZpbHRlcnNbaGFuZGxlck51bV0udXBkYXRlKG1hc2ssIGxldmVsLCBkZWJ1Z19kb21haW5zKQorICAgIHJldHVybiBUcnVlCisKK2RlZiBnZXROYW1lKGUpOgorICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgYSBjbGFzcyBvciBjbGFzcyBpbnN0YW5jZSIiIgorICAgIGlmIGdldGF0dHIoZSwgIl9fbmFtZV9fIiwgTm9uZSkgPT0gTm9uZToKKyAgICAgICAgcmV0dXJuIGUuX19jbGFzc19fLl9fbmFtZV9fCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGUuX19uYW1lX18KKworY2xhc3MgT3BlcmF0aW9uU3RhcnRlZChFdmVudCk6CisgICAgIiIiQW4gb3BlcmF0aW9uIGhhcyBiZWd1biIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cgPSAiT3BlcmF0aW9uIFN0YXJ0ZWQiKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKworY2xhc3MgT3BlcmF0aW9uQ29tcGxldGVkKEV2ZW50KToKKyAgICAiIiJBbiBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbCwgbXNnID0gIk9wZXJhdGlvbiBDb21wbGV0ZWQiKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi50b3RhbCA9IHRvdGFsCisgICAgICAgIHNlbGYubXNnID0gbXNnCisKK2NsYXNzIE9wZXJhdGlvblByb2dyZXNzKEV2ZW50KToKKyAgICAiIiJBbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3VycmVudCwgdG90YWwsIG1zZyA9ICJPcGVyYXRpb24gaW4gUHJvZ3Jlc3MiKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jdXJyZW50ID0gY3VycmVudAorICAgICAgICBzZWxmLnRvdGFsID0gdG90YWwKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cgKyAiOiAlcy8lcyIgJSAoY3VycmVudCwgdG90YWwpOworCitjbGFzcyBDb25maWdQYXJzZWQoRXZlbnQpOgorICAgICIiIkNvbmZpZ3VyYXRpb24gUGFyc2luZyBDb21wbGV0ZSIiIgorCitjbGFzcyBSZWNpcGVFdmVudChFdmVudCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZuKToKKyAgICAgICAgc2VsZi5mbiA9IGZuCisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisKK2NsYXNzIFJlY2lwZVByZUZpbmFsaXNlKFJlY2lwZUV2ZW50KToKKyAgICAiIiIgUmVjaXBlIFBhcnNpbmcgQ29tcGxldGUgYnV0IG5vdCB5ZXQgZmluaWFsaXNlZCIiIgorCitjbGFzcyBSZWNpcGVQYXJzZWQoUmVjaXBlRXZlbnQpOgorICAgICIiIiBSZWNpcGUgUGFyc2luZyBDb21wbGV0ZSAiIiIKKworY2xhc3MgU3RhbXBVcGRhdGUoRXZlbnQpOgorICAgICIiIlRyaWdnZXIgZm9yIGFueSBhZGp1c3RtZW50IG9mIHRoZSBzdGFtcCBmaWxlcyB0byBoYXBwZW4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXRzLCBzdGFtcGZucyk6CisgICAgICAgIHNlbGYuX3RhcmdldHMgPSB0YXJnZXRzCisgICAgICAgIHNlbGYuX3N0YW1wZm5zID0gc3RhbXBmbnMKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKworICAgIGRlZiBnZXRTdGFtcFByZWZpeChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N0YW1wZm5zCisKKyAgICBkZWYgZ2V0VGFyZ2V0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RhcmdldHMKKworICAgIHN0YW1wUHJlZml4ID0gcHJvcGVydHkoZ2V0U3RhbXBQcmVmaXgpCisgICAgdGFyZ2V0cyA9IHByb3BlcnR5KGdldFRhcmdldHMpCisKK2NsYXNzIEJ1aWxkQmFzZShFdmVudCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYmJtYWtlIHJ1biBldmVudHMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuLCBwLCBmYWlsdXJlcyA9IDApOgorICAgICAgICBzZWxmLl9uYW1lID0gbgorICAgICAgICBzZWxmLl9wa2dzID0gcAorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9mYWlsdXJlcyA9IGZhaWx1cmVzCisKKyAgICBkZWYgZ2V0UGtncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ3MKKworICAgIGRlZiBzZXRQa2dzKHNlbGYsIHBrZ3MpOgorICAgICAgICBzZWxmLl9wa2dzID0gcGtncworCisgICAgZGVmIGdldE5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgc2V0TmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKworICAgIGRlZiBnZXRDZmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEKKworICAgIGRlZiBzZXRDZmcoc2VsZiwgY2ZnKToKKyAgICAgICAgc2VsZi5kYXRhID0gY2ZnCisKKyAgICBkZWYgZ2V0RmFpbHVyZXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBmYWlsZWQgcGFja2FnZXMKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9mYWlsdXJlcworCisgICAgcGtncyA9IHByb3BlcnR5KGdldFBrZ3MsIHNldFBrZ3MsIE5vbmUsICJwa2dzIHByb3BlcnR5IikKKyAgICBuYW1lID0gcHJvcGVydHkoZ2V0TmFtZSwgc2V0TmFtZSwgTm9uZSwgIm5hbWUgcHJvcGVydHkiKQorICAgIGNmZyA9IHByb3BlcnR5KGdldENmZywgc2V0Q2ZnLCBOb25lLCAiY2ZnIHByb3BlcnR5IikKKworCisKKworCitjbGFzcyBCdWlsZFN0YXJ0ZWQoQnVpbGRCYXNlLCBPcGVyYXRpb25TdGFydGVkKToKKyAgICAiIiJiYm1ha2UgYnVpbGQgcnVuIHN0YXJ0ZWQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbiwgcCwgZmFpbHVyZXMgPSAwKToKKyAgICAgICAgT3BlcmF0aW9uU3RhcnRlZC5fX2luaXRfXyhzZWxmLCAiQnVpbGRpbmcgU3RhcnRlZCIpCisgICAgICAgIEJ1aWxkQmFzZS5fX2luaXRfXyhzZWxmLCBuLCBwLCBmYWlsdXJlcykKKworY2xhc3MgQnVpbGRDb21wbGV0ZWQoQnVpbGRCYXNlLCBPcGVyYXRpb25Db21wbGV0ZWQpOgorICAgICIiImJibWFrZSBidWlsZCBydW4gY29tcGxldGVkIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRvdGFsLCBuLCBwLCBmYWlsdXJlcz0wLCBpbnRlcnJ1cHRlZD0wKToKKyAgICAgICAgaWYgbm90IGZhaWx1cmVzOgorICAgICAgICAgICAgT3BlcmF0aW9uQ29tcGxldGVkLl9faW5pdF9fKHNlbGYsIHRvdGFsLCAiQnVpbGRpbmcgU3VjY2VlZGVkIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIE9wZXJhdGlvbkNvbXBsZXRlZC5fX2luaXRfXyhzZWxmLCB0b3RhbCwgIkJ1aWxkaW5nIEZhaWxlZCIpCisgICAgICAgIHNlbGYuX2ludGVycnVwdGVkID0gaW50ZXJydXB0ZWQKKyAgICAgICAgQnVpbGRCYXNlLl9faW5pdF9fKHNlbGYsIG4sIHAsIGZhaWx1cmVzKQorCitjbGFzcyBEaXNrRnVsbChFdmVudCk6CisgICAgIiIiRGlzayBmdWxsIGNhc2UgYnVpbGQgYWJvcnRlZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXYsIHR5cGUsIGZyZWVzcGFjZSwgbW91bnRwb2ludCk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX2RldiA9IGRldgorICAgICAgICBzZWxmLl90eXBlID0gdHlwZQorICAgICAgICBzZWxmLl9mcmVlID0gZnJlZXNwYWNlCisgICAgICAgIHNlbGYuX21vdW50cG9pbnQgPSBtb3VudHBvaW50CisKK2NsYXNzIE5vUHJvdmlkZXIoRXZlbnQpOgorICAgICIiIk5vIFByb3ZpZGVyIGZvciBhbiBFdmVudCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW0sIHJ1bnRpbWU9RmFsc2UsIGRlcGVuZGVlcz1Ob25lLCByZWFzb25zPU5vbmUsIGNsb3NlX21hdGNoZXM9Tm9uZSk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX2l0ZW0gPSBpdGVtCisgICAgICAgIHNlbGYuX3J1bnRpbWUgPSBydW50aW1lCisgICAgICAgIHNlbGYuX2RlcGVuZGVlcyA9IGRlcGVuZGVlcworICAgICAgICBzZWxmLl9yZWFzb25zID0gcmVhc29ucworICAgICAgICBzZWxmLl9jbG9zZV9tYXRjaGVzID0gY2xvc2VfbWF0Y2hlcworCisgICAgZGVmIGdldEl0ZW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pdGVtCisKKyAgICBkZWYgaXNSdW50aW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcnVudGltZQorCitjbGFzcyBNdWx0aXBsZVByb3ZpZGVycyhFdmVudCk6CisgICAgIiIiTXVsdGlwbGUgUHJvdmlkZXJzIiIiCisKKyAgICBkZWYgIF9faW5pdF9fKHNlbGYsIGl0ZW0sIGNhbmRpZGF0ZXMsIHJ1bnRpbWUgPSBGYWxzZSk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX2l0ZW0gPSBpdGVtCisgICAgICAgIHNlbGYuX2NhbmRpZGF0ZXMgPSBjYW5kaWRhdGVzCisgICAgICAgIHNlbGYuX2lzX3J1bnRpbWUgPSBydW50aW1lCisKKyAgICBkZWYgaXNSdW50aW1lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSXMgdGhpcyBhIHJ1bnRpbWUgaXNzdWU/CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5faXNfcnVudGltZQorCisgICAgZGVmIGdldEl0ZW0oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgbmFtZSBmb3IgdGhlIHRvIGJlIGJ1aWxkIGl0ZW0KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVtCisKKyAgICBkZWYgZ2V0Q2FuZGlkYXRlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCB0aGUgcG9zc2libGUgQ2FuZGlkYXRlcyBmb3IgYSBQUk9WSURFUi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jYW5kaWRhdGVzCisKK2NsYXNzIFBhcnNlU3RhcnRlZChPcGVyYXRpb25TdGFydGVkKToKKyAgICAiIiJSZWNpcGUgcGFyc2luZyBmb3IgdGhlIHJ1bnF1ZXVlIGhhcyBiZWd1biIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbCk6CisgICAgICAgIE9wZXJhdGlvblN0YXJ0ZWQuX19pbml0X18oc2VsZiwgIlJlY2lwZSBwYXJzaW5nIFN0YXJ0ZWQiKQorICAgICAgICBzZWxmLnRvdGFsID0gdG90YWwKKworY2xhc3MgUGFyc2VDb21wbGV0ZWQoT3BlcmF0aW9uQ29tcGxldGVkKToKKyAgICAiIiJSZWNpcGUgcGFyc2luZyBmb3IgdGhlIHJ1bnF1ZXVlIGhhcyBjb21wbGV0ZWQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGVkLCBwYXJzZWQsIHNraXBwZWQsIG1hc2tlZCwgdmlydHVhbHMsIGVycm9ycywgdG90YWwpOgorICAgICAgICBPcGVyYXRpb25Db21wbGV0ZWQuX19pbml0X18oc2VsZiwgdG90YWwsICJSZWNpcGUgcGFyc2luZyBDb21wbGV0ZWQiKQorICAgICAgICBzZWxmLmNhY2hlZCA9IGNhY2hlZAorICAgICAgICBzZWxmLnBhcnNlZCA9IHBhcnNlZAorICAgICAgICBzZWxmLnNraXBwZWQgPSBza2lwcGVkCisgICAgICAgIHNlbGYudmlydHVhbHMgPSB2aXJ0dWFscworICAgICAgICBzZWxmLm1hc2tlZCA9IG1hc2tlZAorICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLnNvZmFyID0gY2FjaGVkICsgcGFyc2VkCisKK2NsYXNzIFBhcnNlUHJvZ3Jlc3MoT3BlcmF0aW9uUHJvZ3Jlc3MpOgorICAgICIiIlJlY2lwZSBwYXJzaW5nIHByb2dyZXNzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN1cnJlbnQsIHRvdGFsKToKKyAgICAgICAgT3BlcmF0aW9uUHJvZ3Jlc3MuX19pbml0X18oc2VsZiwgY3VycmVudCwgdG90YWwsICJSZWNpcGUgcGFyc2luZyIpCisKKworY2xhc3MgQ2FjaGVMb2FkU3RhcnRlZChPcGVyYXRpb25TdGFydGVkKToKKyAgICAiIiJMb2FkaW5nIG9mIHRoZSBkZXBlbmRlbmN5IGNhY2hlIGhhcyBiZWd1biIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbCk6CisgICAgICAgIE9wZXJhdGlvblN0YXJ0ZWQuX19pbml0X18oc2VsZiwgIkxvYWRpbmcgY2FjaGUgU3RhcnRlZCIpCisgICAgICAgIHNlbGYudG90YWwgPSB0b3RhbAorCitjbGFzcyBDYWNoZUxvYWRQcm9ncmVzcyhPcGVyYXRpb25Qcm9ncmVzcyk6CisgICAgIiIiQ2FjaGUgbG9hZGluZyBwcm9ncmVzcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdXJyZW50LCB0b3RhbCk6CisgICAgICAgIE9wZXJhdGlvblByb2dyZXNzLl9faW5pdF9fKHNlbGYsIGN1cnJlbnQsIHRvdGFsLCAiTG9hZGluZyBjYWNoZSIpCisKK2NsYXNzIENhY2hlTG9hZENvbXBsZXRlZChPcGVyYXRpb25Db21wbGV0ZWQpOgorICAgICIiIkNhY2hlIGxvYWRpbmcgaXMgY29tcGxldGUiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWwsIG51bV9lbnRyaWVzKToKKyAgICAgICAgT3BlcmF0aW9uQ29tcGxldGVkLl9faW5pdF9fKHNlbGYsIHRvdGFsLCAiTG9hZGluZyBjYWNoZSBDb21wbGV0ZWQiKQorICAgICAgICBzZWxmLm51bV9lbnRyaWVzID0gbnVtX2VudHJpZXMKKworY2xhc3MgVHJlZURhdGFQcmVwYXJhdGlvblN0YXJ0ZWQoT3BlcmF0aW9uU3RhcnRlZCk6CisgICAgIiIiVHJlZSBkYXRhIHByZXBhcmF0aW9uIHN0YXJ0ZWQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIE9wZXJhdGlvblN0YXJ0ZWQuX19pbml0X18oc2VsZiwgIlByZXBhcmluZyB0cmVlIGRhdGEgU3RhcnRlZCIpCisKK2NsYXNzIFRyZWVEYXRhUHJlcGFyYXRpb25Qcm9ncmVzcyhPcGVyYXRpb25Qcm9ncmVzcyk6CisgICAgIiIiVHJlZSBkYXRhIHByZXBhcmF0aW9uIGlzIGluIHByb2dyZXNzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN1cnJlbnQsIHRvdGFsKToKKyAgICAgICAgT3BlcmF0aW9uUHJvZ3Jlc3MuX19pbml0X18oc2VsZiwgY3VycmVudCwgdG90YWwsICJQcmVwYXJpbmcgdHJlZSBkYXRhIikKKworY2xhc3MgVHJlZURhdGFQcmVwYXJhdGlvbkNvbXBsZXRlZChPcGVyYXRpb25Db21wbGV0ZWQpOgorICAgICIiIlRyZWUgZGF0YSBwcmVwYXJhdGlvbiBjb21wbGV0ZWQiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWwpOgorICAgICAgICBPcGVyYXRpb25Db21wbGV0ZWQuX19pbml0X18oc2VsZiwgdG90YWwsICJQcmVwYXJpbmcgdHJlZSBkYXRhIENvbXBsZXRlZCIpCisKK2NsYXNzIERlcFRyZWVHZW5lcmF0ZWQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYSBkZXBlbmRlbmN5IHRyZWUgaGFzIGJlZW4gZ2VuZXJhdGVkCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVwZ3JhcGgpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9kZXBncmFwaCA9IGRlcGdyYXBoCisKK2NsYXNzIFRhcmdldHNUcmVlR2VuZXJhdGVkKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB3aGVuIGEgc2V0IG9mIGJ1aWxkYWJsZSB0YXJnZXRzIGhhcyBiZWVuIGdlbmVyYXRlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbCk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX21vZGVsID0gbW9kZWwKKworY2xhc3MgUmVhY2hhYmxlU3RhbXBzKEV2ZW50KToKKyAgICAiIiIKKyAgICBBbiBldmVudCBsaXN0aW5nIGFsbCBzdGFtcHMgcmVhY2hhYmxlIGFmdGVyIHBhcnNpbmcKKyAgICB3aGljaCB0aGUgbWV0YWRhdGEgbWF5IHVzZSB0byBjbGVhbiB1cCBzdGFsZSBkYXRhCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhbXBzKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zdGFtcHMgPSBzdGFtcHMKKworY2xhc3MgRmlsZXNNYXRjaGluZ0ZvdW5kKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB3aGVuIGEgbGlzdCBvZiBmaWxlcyBtYXRjaGluZyB0aGUgc3VwcGxpZWQgcGF0dGVybiBoYXMKKyAgICBiZWVuIGdlbmVyYXRlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXR0ZXJuLCBtYXRjaGVzKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fcGF0dGVybiA9IHBhdHRlcm4KKyAgICAgICAgc2VsZi5fbWF0Y2hlcyA9IG1hdGNoZXMKKworY2xhc3MgQ29yZUJhc2VGaWxlc0ZvdW5kKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB3aGVuIGEgbGlzdCBvZiBhcHByb3ByaWF0ZSBjb25maWcgZmlsZXMgaGFzIGJlZW4gZ2VuZXJhdGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGhzKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fcGF0aHMgPSBwYXRocworCitjbGFzcyBDb25maWdGaWxlc0ZvdW5kKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB3aGVuIGEgbGlzdCBvZiBhcHByb3ByaWF0ZSBjb25maWcgZmlsZXMgaGFzIGJlZW4gZ2VuZXJhdGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhcmlhYmxlLCB2YWx1ZXMpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl92YXJpYWJsZSA9IHZhcmlhYmxlCisgICAgICAgIHNlbGYuX3ZhbHVlcyA9IHZhbHVlcworCitjbGFzcyBDb25maWdGaWxlUGF0aEZvdW5kKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB3aGVuIGEgcGF0aCBmb3IgYSBjb25maWcgZmlsZSBoYXMgYmVlbiBmb3VuZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fcGF0aCA9IHBhdGgKKworY2xhc3MgTXNnQmFzZShFdmVudCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgbWVzc2FnZXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLl9tZXNzYWdlID0gbXNnCisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisKK2NsYXNzIE1zZ0RlYnVnKE1zZ0Jhc2UpOgorICAgICIiIkRlYnVnIE1lc3NhZ2UiIiIKKworY2xhc3MgTXNnTm90ZShNc2dCYXNlKToKKyAgICAiIiJOb3RlIE1lc3NhZ2UiIiIKKworY2xhc3MgTXNnV2FybihNc2dCYXNlKToKKyAgICAiIiJXYXJuaW5nIE1lc3NhZ2UiIiIKKworY2xhc3MgTXNnRXJyb3IoTXNnQmFzZSk6CisgICAgIiIiRXJyb3IgTWVzc2FnZSIiIgorCitjbGFzcyBNc2dGYXRhbChNc2dCYXNlKToKKyAgICAiIiJGYXRhbCBNZXNzYWdlIiIiCisKK2NsYXNzIE1zZ1BsYWluKE1zZ0Jhc2UpOgorICAgICIiIkdlbmVyYWwgb3V0cHV0IiIiCisKK2NsYXNzIExvZ0V4ZWNUVFkoRXZlbnQpOgorICAgICIiIlNlbmQgZXZlbnQgY29udGFpbmluZyBwcm9ncmFtIHRvIHNwYXduIG9uIHR0eSBvZiB0aGUgbG9nZ2VyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgcHJvZywgc2xlZXBfZGVsYXksIHJldHJpZXMpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBzZWxmLnByb2cgPSBwcm9nCisgICAgICAgIHNlbGYuc2xlZXBfZGVsYXkgPSBzbGVlcF9kZWxheQorICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCisKK2NsYXNzIExvZ0hhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiJEaXNwYXRjaCBsb2dnaW5nIG1lc3NhZ2VzIGFzIGJpdGJha2UgZXZlbnRzIiIiCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICBpZiByZWNvcmQuZXhjX2luZm86CisgICAgICAgICAgICBldHlwZSwgdmFsdWUsIHRiID0gcmVjb3JkLmV4Y19pbmZvCisgICAgICAgICAgICBpZiBoYXNhdHRyKHRiLCAndGJfbmV4dCcpOgorICAgICAgICAgICAgICAgIHRiID0gbGlzdChiYi5leGNlcHRpb25zLmV4dHJhY3RfdHJhY2ViYWNrKHRiLCBjb250ZXh0PTMpKQorICAgICAgICAgICAgcmVjb3JkLmJiX2V4Y19pbmZvID0gKGV0eXBlLCB2YWx1ZSwgdGIpCisgICAgICAgICAgICByZWNvcmQuZXhjX2luZm8gPSBOb25lCisgICAgICAgIGZpcmUocmVjb3JkLCBOb25lKQorCisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICByZWNvcmQudGFza3BpZCA9IHdvcmtlcl9waWQKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgUmVxdWVzdFBhY2thZ2VJbmZvKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB0byByZXF1ZXN0IHBhY2thZ2UgaW5mb3JtYXRpb24KKyAgICAiIiIKKworY2xhc3MgUGFja2FnZUluZm8oRXZlbnQpOgorICAgICIiIgorICAgIFBhY2thZ2UgaW5mb3JtYXRpb24gZm9yIEdVSQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwa2dpbmZvbGlzdCk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3BrZ2luZm9saXN0ID0gcGtnaW5mb2xpc3QKKworY2xhc3MgTWV0YWRhdGFFdmVudChFdmVudCk6CisgICAgIiIiCisgICAgR2VuZXJpYyBldmVudCB0aGF0IHRhcmdldCBmb3IgT0UtQ29yZSBjbGFzc2VzCisgICAgdG8gcmVwb3J0IGluZm9ybWF0aW9uIGR1cmluZyBhc3luY2hyb3VzIGV4ZWN1dGlvbgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBldmVudHR5cGUsIGV2ZW50ZGF0YSk6CisgICAgICAgIEV2ZW50Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYudHlwZSA9IGV2ZW50dHlwZQorICAgICAgICBzZWxmLl9sb2NhbGRhdGEgPSBldmVudGRhdGEKKworY2xhc3MgU2FuaXR5Q2hlY2soRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHRvIHJ1biBzYW5pdHkgY2hlY2tzLCBlaXRoZXIgcmFpc2UgZXJyb3JzIG9yIGdlbmVyYXRlIGV2ZW50cyBhcyByZXR1cm4gc3RhdHVzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5lcmF0ZWV2ZW50cyA9IFRydWUpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmdlbmVyYXRlZXZlbnRzID0gZ2VuZXJhdGVldmVudHMKKworY2xhc3MgU2FuaXR5Q2hlY2tQYXNzZWQoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHRvIGluZGljYXRlIHNhbml0eSBjaGVjayBoYXMgcGFzc2VkCisgICAgIiIiCisKK2NsYXNzIFNhbml0eUNoZWNrRmFpbGVkKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB0byBpbmRpY2F0ZSBzYW5pdHkgY2hlY2sgaGFzIGZhaWxlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIG5ldHdvcmtfZXJyb3I9RmFsc2UpOgorICAgICAgICBFdmVudC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5fbmV0d29ya19lcnJvciA9IG5ldHdvcmtfZXJyb3IKKworY2xhc3MgTmV0d29ya1Rlc3QoRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHRvIHJ1biBuZXR3b3JrIGNvbm5lY3Rpdml0eSB0ZXN0cywgZWl0aGVyIHJhaXNlIGVycm9ycyBvciBnZW5lcmF0ZSBldmVudHMgYXMgcmV0dXJuIHN0YXR1cy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuZXJhdGVldmVudHMgPSBUcnVlKToKKyAgICAgICAgRXZlbnQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5nZW5lcmF0ZWV2ZW50cyA9IGdlbmVyYXRlZXZlbnRzCisKK2NsYXNzIE5ldHdvcmtUZXN0UGFzc2VkKEV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB0byBpbmRpY2F0ZSBuZXR3b3JrIHRlc3QgaGFzIHBhc3NlZAorICAgICIiIgorCitjbGFzcyBOZXR3b3JrVGVzdEZhaWxlZChFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgdG8gaW5kaWNhdGUgbmV0d29yayB0ZXN0IGhhcyBmYWlsZWQKKyAgICAiIiIKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZXhjZXB0aW9ucy5weSBiL2JpdGJha2UvbGliL2JiL2V4Y2VwdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MmM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw5MSBAQAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgYmIubmFtZWR0dXBsZV93aXRoX2FiYworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorCisKK2NsYXNzIFRyYWNlYmFja0VudHJ5KG5hbWVkdHVwbGUuYWJjKToKKyAgICAiIiJQaWNrbGVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhY2ViYWNrIGVudHJ5IiIiCisgICAgX2ZpZWxkcyA9ICdmaWxlbmFtZSBsaW5lbm8gZnVuY3Rpb24gYXJncyBjb2RlX2NvbnRleHQgaW5kZXgnCisgICAgX2hlYWRlciA9ICcgIEZpbGUgInswLmZpbGVuYW1lfSIsIGxpbmUgezAubGluZW5vfSwgaW4gezAuZnVuY3Rpb259ezAuYXJnc30nCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIGZvcm1hdHRlcj1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYuY29kZV9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWRlci5mb3JtYXQoc2VsZikgKyAnXG4nCisKKyAgICAgICAgZm9ybWF0dGVkID0gW3NlbGYuX2hlYWRlci5mb3JtYXQoc2VsZikgKyAnOlxuJ10KKworICAgICAgICBmb3IgbGluZWluZGV4LCBsaW5lIGluIGVudW1lcmF0ZShzZWxmLmNvZGVfY29udGV4dCk6CisgICAgICAgICAgICBpZiBmb3JtYXR0ZXI6CisgICAgICAgICAgICAgICAgbGluZSA9IGZvcm1hdHRlcihsaW5lKQorCisgICAgICAgICAgICBpZiBsaW5laW5kZXggPT0gc2VsZi5pbmRleDoKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZWQuYXBwZW5kKCcgICAgPiVzJyAlIGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvcm1hdHRlZC5hcHBlbmQoJyAgICAgJXMnICUgbGluZSkKKyAgICAgICAgcmV0dXJuIGZvcm1hdHRlZAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJy5qb2luKHNlbGYuZm9ybWF0KCkpCisKK2RlZiBfZ2V0X2ZyYW1lX2FyZ3MoZnJhbWUpOgorICAgICIiIkdldCB0aGUgZm9ybWF0dGVkIGFyZ3VtZW50cyBhbmQgY2xhc3MgKGlmIGF2YWlsYWJsZSkgZm9yIGEgZnJhbWUiIiIKKyAgICBhcmdpbmZvID0gaW5zcGVjdC5nZXRhcmd2YWx1ZXMoZnJhbWUpCisKKyAgICB0cnk6CisgICAgICAgIGlmIG5vdCBhcmdpbmZvLmFyZ3M6CisgICAgICAgICAgICByZXR1cm4gJycsIE5vbmUKKyAgICAjIFRoZXJlIGhhdmUgYmVlbiByZXBvcnRzIGZyb20gdGhlIGZpZWxkIG9mIHB5dGhvbiAyLjYgd2hpY2ggZG9lc24ndCAKKyAgICAjIHJldHVybiBhIG5hbWVkdHVwbGUgaGVyZSBidXQgc2ltcGx5IGEgdHVwbGUgc28gZmFsbGJhY2sgZ3JhY2VmdWxseSBpZgorICAgICMgYXJncyBpc24ndCBwcmVzZW50LgorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcmV0dXJuICcnLCBOb25lCisKKyAgICBmaXJzdGFyZyA9IGFyZ2luZm8uYXJnc1swXQorICAgIGlmIGZpcnN0YXJnID09ICdzZWxmJzoKKyAgICAgICAgc2VsZiA9IGFyZ2luZm8ubG9jYWxzWydzZWxmJ10KKyAgICAgICAgY2xzID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBhcmdpbmZvLmFyZ3MucG9wKDApCisgICAgICAgIGRlbCBhcmdpbmZvLmxvY2Fsc1snc2VsZiddCisgICAgZWxzZToKKyAgICAgICAgY2xzID0gTm9uZQorCisgICAgZm9ybWF0dGVkID0gaW5zcGVjdC5mb3JtYXRhcmd2YWx1ZXMoKmFyZ2luZm8pCisgICAgcmV0dXJuIGZvcm1hdHRlZCwgY2xzCisKK2RlZiBleHRyYWN0X3RyYWNlYmFjayh0YiwgY29udGV4dD0xKToKKyAgICBmcmFtZXMgPSBpbnNwZWN0LmdldGlubmVyZnJhbWVzKHRiLCBjb250ZXh0KQorICAgIGZvciBmcmFtZSwgZmlsZW5hbWUsIGxpbmVubywgZnVuY3Rpb24sIGNvZGVfY29udGV4dCwgaW5kZXggaW4gZnJhbWVzOgorICAgICAgICBmb3JtYXR0ZWRfYXJncywgY2xzID0gX2dldF9mcmFtZV9hcmdzKGZyYW1lKQorICAgICAgICBpZiBjbHM6CisgICAgICAgICAgICBmdW5jdGlvbiA9ICclcy4lcycgJSAoY2xzLCBmdW5jdGlvbikKKyAgICAgICAgeWllbGQgVHJhY2ViYWNrRW50cnkoZmlsZW5hbWUsIGxpbmVubywgZnVuY3Rpb24sIGZvcm1hdHRlZF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2NvbnRleHQsIGluZGV4KQorCitkZWYgZm9ybWF0X2V4dHJhY3RlZChleHRyYWN0ZWQsIGZvcm1hdHRlcj1Ob25lLCBsaW1pdD1Ob25lKToKKyAgICBpZiBsaW1pdDoKKyAgICAgICAgZXh0cmFjdGVkID0gZXh0cmFjdGVkWy1saW1pdDpdCisKKyAgICBmb3JtYXR0ZWQgPSBbXQorICAgIGZvciB0cmFjZWJhY2tpbmZvIGluIGV4dHJhY3RlZDoKKyAgICAgICAgZm9ybWF0dGVkLmV4dGVuZCh0cmFjZWJhY2tpbmZvLmZvcm1hdChmb3JtYXR0ZXIpKQorICAgIHJldHVybiBmb3JtYXR0ZWQKKworCitkZWYgZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBjb250ZXh0PTEsIGxpbWl0PU5vbmUsIGZvcm1hdHRlcj1Ob25lKToKKyAgICBmb3JtYXR0ZWQgPSBbJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiddCisKKyAgICBpZiBoYXNhdHRyKHRiLCAndGJfbmV4dCcpOgorICAgICAgICB0YiA9IGV4dHJhY3RfdHJhY2ViYWNrKHRiLCBjb250ZXh0KQorCisgICAgZm9ybWF0dGVkLmV4dGVuZChmb3JtYXRfZXh0cmFjdGVkKHRiLCBmb3JtYXR0ZXIsIGxpbWl0KSkKKyAgICBmb3JtYXR0ZWQuZXh0ZW5kKHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoZXR5cGUsIHZhbHVlKSkKKyAgICByZXR1cm4gZm9ybWF0dGVkCisKK2RlZiB0b19zdHJpbmcoZXhjKToKKyAgICBpZiBpc2luc3RhbmNlKGV4YywgU3lzdGVtRXhpdCk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4Yy5jb2RlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiAnRXhpdGVkIHdpdGggIiVkIicgJSBleGMuY29kZQorICAgIHJldHVybiBzdHIoZXhjKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTNiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNzg3IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgaW1wbGVtZW50YXRpb25zCisKK0NsYXNzZXMgZm9yIG9idGFpbmluZyB1cHN0cmVhbSBzb3VyY2VzIGZvciB0aGUKK0JpdEJha2UgYnVpbGQgdG9vbHMuCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTIgIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgb3MsIHJlCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgZ2xvYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB1cmxwYXJzZQoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgYmIucGVyc2lzdF9kYXRhLCBiYi51dGlscworaW1wb3J0IGJiLmNoZWNrc3VtCitmcm9tIGJiIGltcG9ydCBkYXRhCitpbXBvcnQgYmIucHJvY2VzcworaW1wb3J0IHN1YnByb2Nlc3MKKworX192ZXJzaW9uX18gPSAiMiIKK19jaGVja3N1bV9jYWNoZSA9IGJiLmNoZWNrc3VtLkZpbGVDaGVja3N1bUNhY2hlKCkKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuRmV0Y2hlciIpCisKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgcGlja2xlCisgICAgbG9nZ2VyLmluZm8oIkltcG9ydGluZyBjUGlja2xlIGZhaWxlZC4gIgorICAgICAgICAgICAgICAgICJGYWxsaW5nIGJhY2sgdG8gYSB2ZXJ5IHNsb3cgaW1wbGVtZW50YXRpb24uIikKKworY2xhc3MgQkJGZXRjaEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkNsYXNzIGFsbCBmZXRjaCBleGNlcHRpb25zIGluaGVyaXQgZnJvbSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIHNlbGYubXNnID0gbWVzc2FnZQorICAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIHJldHVybiBzZWxmLm1zZworCitjbGFzcyBVbnRydXN0ZWRVcmwoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGVuY291bnRlcmluZyBhIGhvc3Qgbm90IGxpc3RlZCBpbiBCQl9BTExPV0VEX05FVFdPUktTIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgbWVzc2FnZT0nJyk6CisgICAgICAgIGlmIG1lc3NhZ2U6CisgICAgICAgICAgICBtc2cgPSBtZXNzYWdlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSAiVGhlIFVSTDogJyVzJyBpcyBub3QgdHJ1c3RlZCBhbmQgY2Fubm90IGJlIHVzZWQiICUgdXJsCisgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgIEJCRmV0Y2hFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorICAgICAgICBzZWxmLmFyZ3MgPSAodXJsLCkKKworY2xhc3MgTWFsZm9ybWVkVXJsKEJCRmV0Y2hFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBlbmNvdW50ZXJpbmcgYW4gaW52YWxpZCB1cmwiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBtZXNzYWdlPScnKToKKyAgICAgICAgIGlmIG1lc3NhZ2U6CisgICAgICAgICAgICAgbXNnID0gbWVzc2FnZQorICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICBtc2cgPSAiVGhlIFVSTDogJyVzJyBpcyBpbnZhbGlkIGFuZCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQiICUgdXJsCisgICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICAgQkJGZXRjaEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgICBzZWxmLmFyZ3MgPSAodXJsLCkKKworY2xhc3MgRmV0Y2hFcnJvcihCQkZldGNoRXhjZXB0aW9uKToKKyAgICAiIiJHZW5lcmFsIGZldGNoZXIgZXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIGhhcHBlbnMgaW5jb3JyZWN0bHkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgdXJsID0gTm9uZSk6CisgICAgICAgICBpZiB1cmw6CisgICAgICAgICAgICBtc2cgPSAiRmV0Y2hlciBmYWlsdXJlIGZvciBVUkw6ICclcycuICVzIiAlICh1cmwsIG1lc3NhZ2UpCisgICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gIkZldGNoZXIgZmFpbHVyZTogJXMiICUgbWVzc2FnZQorICAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgIEJCRmV0Y2hFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorICAgICAgICAgc2VsZi5hcmdzID0gKG1lc3NhZ2UsIHVybCkKKworY2xhc3MgQ2hlY2tzdW1FcnJvcihGZXRjaEVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gd2hlbiBtaXNtYXRjaGVkIGNoZWNrc3VtIGVuY291bnRlcmVkIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHVybCA9IE5vbmUsIGNoZWNrc3VtID0gTm9uZSk6CisgICAgICAgIHNlbGYuY2hlY2tzdW0gPSBjaGVja3N1bQorICAgICAgICBGZXRjaEVycm9yLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHVybCkKKworY2xhc3MgTm9DaGVja3N1bUVycm9yKEZldGNoRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiB3aGVuIG5vIGNoZWNrc3VtIGlzIHNwZWNpZmllZCwgYnV0IEJCX1NUUklDVF9DSEVDS1NVTSBpcyBzZXQiIiIKKworY2xhc3MgVW5wYWNrRXJyb3IoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiR2VuZXJhbCBmZXRjaGVyIGV4Y2VwdGlvbiB3aGVuIHNvbWV0aGluZyBoYXBwZW5zIGluY29ycmVjdGx5IHdoZW4gdW5wYWNraW5nIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHVybCk6CisgICAgICAgICBtc2cgPSAiVW5wYWNrIGZhaWx1cmUgZm9yIFVSTDogJyVzJy4gJXMiICUgKHVybCwgbWVzc2FnZSkKKyAgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgICBCQkZldGNoRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZykKKyAgICAgICAgIHNlbGYuYXJncyA9IChtZXNzYWdlLCB1cmwpCisKK2NsYXNzIE5vTWV0aG9kRXJyb3IoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHRoZXJlIGlzIG5vIG1ldGhvZCB0byBvYnRhaW4gYSBzdXBwbGllZCB1cmwgb3Igc2V0IG9mIHVybHMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsKToKKyAgICAgICAgIG1zZyA9ICJDb3VsZCBub3QgZmluZCBhIGZldGNoZXIgd2hpY2ggc3VwcG9ydHMgdGhlIFVSTDogJyVzJyIgJSB1cmwKKyAgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgICBCQkZldGNoRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZykKKyAgICAgICAgIHNlbGYuYXJncyA9ICh1cmwsKQorCitjbGFzcyBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgZmV0Y2ggbWV0aG9kIGlzIG1pc3NpbmcgYSBjcml0aWNhbCBwYXJhbWV0ZXIgaW4gdGhlIHVybCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtaXNzaW5nLCB1cmwpOgorICAgICAgICAgbXNnID0gIlVSTDogJyVzJyBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgJyVzJyIgJSAodXJsLCBtaXNzaW5nKQorICAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgIHNlbGYubWlzc2luZyA9IG1pc3NpbmcKKyAgICAgICAgIEJCRmV0Y2hFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorICAgICAgICAgc2VsZi5hcmdzID0gKG1pc3NpbmcsIHVybCkKKworY2xhc3MgUGFyYW1ldGVyRXJyb3IoQkJGZXRjaEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgdXJsIGNhbm5vdCBiZSBwcm9jY2Vzc2VkIGR1ZSB0byBpbnZhbGlkIHBhcmFtZXRlcnMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHVybCk6CisgICAgICAgICBtc2cgPSAiVVJMOiAnJXMnIGhhcyBpbnZhbGlkIHBhcmFtZXRlcnMuICVzIiAlICh1cmwsIG1lc3NhZ2UpCisgICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICAgQkJGZXRjaEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgICBzZWxmLmFyZ3MgPSAobWVzc2FnZSwgdXJsKQorCitjbGFzcyBOZXR3b3JrQWNjZXNzKEJCRmV0Y2hFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBuZXR3b3JrIGFjY2VzcyBpcyBkaXNhYmxlZCBidXQgaXQgaXMgcmVxdWlyZWQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgY21kKToKKyAgICAgICAgIG1zZyA9ICJOZXR3b3JrIGFjY2VzcyBkaXNhYmxlZCB0aHJvdWdoIEJCX05PX05FVFdPUksgKG9yIHNldCBpbmRpcmVjdGx5IGR1ZSB0byB1c2Ugb2YgQkJfRkVUQ0hfUFJFTUlSUk9ST05MWSkgYnV0IGFjY2VzcyByZXF1ZXN0ZWQgd2l0aCBjb21tYW5kICVzIChmb3IgdXJsICVzKSIgJSAoY21kLCB1cmwpCisgICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgIEJCRmV0Y2hFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorICAgICAgICAgc2VsZi5hcmdzID0gKHVybCwgY21kKQorCitjbGFzcyBOb25Mb2NhbE1ldGhvZChFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYpCisKKworY2xhc3MgVVJJKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBjbGFzcyByZXByZXNlbnRpbmcgYSBnZW5lcmljIFVSSSwgd2l0aCBtZXRob2RzIGZvcgorICAgIGFjY2Vzc2luZyB0aGUgVVJJIGNvbXBvbmVudHMsIGFuZCBzdHJpbmdpZmllcyB0byB0aGUKKyAgICBVUkkuCisKKyAgICBJdCBpcyBjb25zdHJ1Y3RlZCBieSBjYWxsaW5nIGl0IHdpdGggYSBVUkksIG9yIHNldHRpbmcKKyAgICB0aGUgYXR0cmlidXRlcyBtYW51YWxseToKKworICAgICB1cmkgPSBVUkkoImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorCisgICAgIHVyaSA9IFVSSSgpCisgICAgIHVyaS5zY2hlbWUgPSAnaHR0cCcKKyAgICAgdXJpLmhvc3RuYW1lID0gJ2V4YW1wbGUuY29tJworICAgICB1cmkucGF0aCA9ICcvJworCisgICAgSXQgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKworICAgICAgKiBzY2hlbWUgKHJlYWQvd3JpdGUpCisgICAgICAqIHVzZXJpbmZvIChhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbikgKHJlYWQvd3JpdGUpCisgICAgICAgICogdXNlcm5hbWUgKHJlYWQvd3JpdGUpCisgICAgICAgICogcGFzc3dvcmQgKHJlYWQvd3JpdGUpCisKKyAgICAgICAgTm90ZSwgcGFzc3dvcmQgaXMgZGVwcmVjYXRlZCBhcyBvZiBSRkMgMzk4Ni4KKworICAgICAgKiBob3N0bmFtZSAocmVhZC93cml0ZSkKKyAgICAgICogcG9ydCAocmVhZC93cml0ZSkKKyAgICAgICogaG9zdHBvcnQgKHJlYWQgb25seSkKKyAgICAgICAgImhvc3RuYW1lOnBvcnQiLCBpZiBib3RoIGFyZSBzZXQsIG90aGVyd2lzZSBqdXN0ICJob3N0bmFtZSIKKyAgICAgICogcGF0aCAocmVhZC93cml0ZSkKKyAgICAgICogcGF0aF9xdW90ZWQgKHJlYWQvd3JpdGUpCisgICAgICAgIEEgVVJJIHF1b3RlZCB2ZXJzaW9uIG9mIHBhdGgKKyAgICAgICogcGFyYW1zIChkaWN0KSAocmVhZC93cml0ZSkKKyAgICAgICogcXVlcnkgKGRpY3QpIChyZWFkL3dyaXRlKQorICAgICAgKiByZWxhdGl2ZSAoYm9vbCkgKHJlYWQgb25seSkKKyAgICAgICAgVHJ1ZSBpZiB0aGlzIGlzIGEgInJlbGF0aXZlIFVSSSIsIChlLmcuIGZpbGU6Zm9vLmRpZmYpCisKKyAgICBJdCBzdHJpbmdpZmllcyB0byB0aGUgVVJJIGl0c2VsZi4KKworICAgIFNvbWUgbm90ZXMgYWJvdXQgcmVsYXRpdmUgVVJJczogd2hpbGUgaXQncyBzcGVjaWZpZWQgdGhhdAorICAgIGEgVVJJIGJlZ2lubmluZyB3aXRoIDxzY2hlbWU+Oi8vIHNob3VsZCBlaXRoZXIgYmUgZGlyZWN0bHkKKyAgICBmb2xsb3dlZCBieSBhIGhvc3RuYW1lIG9yIGEgLywgdGhlIG9sZCBVUkkgaGFuZGxpbmcgb2YgdGhlCisgICAgZmV0Y2gyIGxpYnJhcnkgZGlkIG5vdCBjb21mb3JtIHRvIHRoaXMuIFRoZXJlZm9yZSwgdGhpcyBVUkkKKyAgICBjbGFzcyBoYXMgc29tZSBrbHVkZ2VzIHRvIG1ha2Ugc3VyZSB0aGF0IFVSSXMgYXJlIHBhcnNlZCBpbgorICAgIGEgd2F5IGNvbWZvcm1pbmcgdG8gYml0YmFrZSdzIGN1cnJlbnQgdXNhZ2UuIFRoaXMgVVJJIGNsYXNzCisgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZzoKKworICAgICBmaWxlOnJlbGF0aXZlL3BhdGguZGlmZiAoSUVURiBjb21wbGlhbnQpCisgICAgIGdpdDpyZWxhdGl2ZS9wYXRoLmdpdCAoSUVURiBjb21wbGlhbnQpCisgICAgIGdpdDovLy9hYnNvbHV0ZS9wYXRoLmdpdCAoSUVURiBjb21wbGlhbnQpCisgICAgIGZpbGU6Ly8vYWJzb2x1dGUvcGF0aC5kaWZmIChJRVRGIGNvbXBsaWFudCkKKworICAgICBmaWxlOi8vcmVsYXRpdmUvcGF0aC5kaWZmIChub3QgSUVURiBjb21wbGlhbnQpCisKKyAgICBCdXQgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nOgorCisgICAgIGZpbGU6Ly9ob3N0bmFtZS9hYnNvbHV0ZS9wYXRoLmRpZmYgKHdvdWxkIGJlIElFVEYgY29tcGxpYW50KQorCisgICAgTm90ZSB0aGF0IHRoZSBsYXN0IGNhc2Ugb25seSBhcHBsaWVzIHRvIGEgbGlzdCBvZgorICAgICJ3aGl0ZWxpc3RlZCIgc2NoZW1lcyAoY3VycmVudGx5IG9ubHkgZmlsZTovLyksIHRoYXQgcmVxdWlyZXMKKyAgICBpdHMgVVJJcyB0byBub3QgaGF2ZSBhIG5ldHdvcmsgbG9jYXRpb24uCisgICAgIiIiCisKKyAgICBfcmVsYXRpdmVfc2NoZW1lcyA9IFsnZmlsZScsICdnaXQnXQorICAgIF9uZXRsb2NfZm9yYmlkZGVuID0gWydmaWxlJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmk9Tm9uZSk6CisgICAgICAgIHNlbGYuc2NoZW1lID0gJycKKyAgICAgICAgc2VsZi51c2VyaW5mbyA9ICcnCisgICAgICAgIHNlbGYuaG9zdG5hbWUgPSAnJworICAgICAgICBzZWxmLnBvcnQgPSBOb25lCisgICAgICAgIHNlbGYuX3BhdGggPSAnJworICAgICAgICBzZWxmLnBhcmFtcyA9IHt9CisgICAgICAgIHNlbGYucXVlcnkgPSB7fQorICAgICAgICBzZWxmLnJlbGF0aXZlID0gRmFsc2UKKworICAgICAgICBpZiBub3QgdXJpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBXZSBoaWphY2sgdGhlIFVSTCBwYXJhbWV0ZXJzLCBzaW5jZSB0aGUgd2F5IGJpdGJha2UgdXNlcworICAgICAgICAjIHRoZW0gYXJlIG5vdCBxdWl0ZSBSRkMgY29tcGxpYW50LgorICAgICAgICB1cmksIHBhcmFtX3N0ciA9ICh1cmkuc3BsaXQoIjsiLCAxKSArIFtOb25lXSlbOjJdCisKKyAgICAgICAgdXJscCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaSkKKyAgICAgICAgc2VsZi5zY2hlbWUgPSB1cmxwLnNjaGVtZQorCisgICAgICAgIHJlcGFyc2UgPSAwCisKKyAgICAgICAgIyBDb2VyY2UgdXJscGFyc2UgdG8gbWFrZSBVUkkgc2NoZW1lIHVzZSBuZXRsb2MKKyAgICAgICAgaWYgbm90IHNlbGYuc2NoZW1lIGluIHVybHBhcnNlLnVzZXNfbmV0bG9jOgorICAgICAgICAgICAgdXJscGFyc2UudXNlc19wYXJhbXMuYXBwZW5kKHNlbGYuc2NoZW1lKQorICAgICAgICAgICAgcmVwYXJzZSA9IDEKKworICAgICAgICAjIE1ha2UgdXJscGFyc2UgaGFwcHkoL2llcikgYnkgY29udmVydGluZyBsb2NhbCByZXNvdXJjZXMKKyAgICAgICAgIyB0byBSRkMgY29tcGxpYW50IFVSTCBmb3JtYXQuIEUuZy46CisgICAgICAgICMgICBmaWxlOi8vZm9vLmRpZmYgLT4gZmlsZTpmb28uZGlmZgorICAgICAgICBpZiB1cmxwLnNjaGVtZSBpbiBzZWxmLl9uZXRsb2NfZm9yYmlkZGVuOgorICAgICAgICAgICAgdXJpID0gcmUuc3ViKCIoPzw9OikvLyg/IS8pIiwgIiIsIHVyaSwgMSkKKyAgICAgICAgICAgIHJlcGFyc2UgPSAxCisKKyAgICAgICAgaWYgcmVwYXJzZToKKyAgICAgICAgICAgIHVybHAgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmkpCisKKyAgICAgICAgIyBJZGVudGlmeSBpZiB0aGUgVVJJIGlzIHJlbGF0aXZlIG9yIG5vdAorICAgICAgICBpZiB1cmxwLnNjaGVtZSBpbiBzZWxmLl9yZWxhdGl2ZV9zY2hlbWVzIGFuZCBcCisgICAgICAgICAgIHJlLmNvbXBpbGUoIl5cdys6KD8hLy8pIikubWF0Y2godXJpKToKKyAgICAgICAgICAgIHNlbGYucmVsYXRpdmUgPSBUcnVlCisKKyAgICAgICAgaWYgbm90IHNlbGYucmVsYXRpdmU6CisgICAgICAgICAgICBzZWxmLmhvc3RuYW1lID0gdXJscC5ob3N0bmFtZSBvciAnJworICAgICAgICAgICAgc2VsZi5wb3J0ID0gdXJscC5wb3J0CisKKyAgICAgICAgICAgIHNlbGYudXNlcmluZm8gKz0gdXJscC51c2VybmFtZSBvciAnJworCisgICAgICAgICAgICBpZiB1cmxwLnBhc3N3b3JkOgorICAgICAgICAgICAgICAgIHNlbGYudXNlcmluZm8gKz0gJzolcycgJSB1cmxwLnBhc3N3b3JkCisKKyAgICAgICAgc2VsZi5wYXRoID0gdXJsbGliLnVucXVvdGUodXJscC5wYXRoKQorCisgICAgICAgIGlmIHBhcmFtX3N0cjoKKyAgICAgICAgICAgIHNlbGYucGFyYW1zID0gc2VsZi5fcGFyYW1fc3RyX3NwbGl0KHBhcmFtX3N0ciwgIjsiKQorICAgICAgICBpZiB1cmxwLnF1ZXJ5OgorICAgICAgICAgICAgc2VsZi5xdWVyeSA9IHNlbGYuX3BhcmFtX3N0cl9zcGxpdCh1cmxwLnF1ZXJ5LCAiJiIpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgdXNlcmluZm8gPSBzZWxmLnVzZXJpbmZvCisgICAgICAgIGlmIHVzZXJpbmZvOgorICAgICAgICAgICAgdXNlcmluZm8gKz0gJ0AnCisKKyAgICAgICAgcmV0dXJuICIlczolcyVzJXMlcyVzJXMiICUgKAorICAgICAgICAgICAgc2VsZi5zY2hlbWUsCisgICAgICAgICAgICAnJyBpZiBzZWxmLnJlbGF0aXZlIGVsc2UgJy8vJywKKyAgICAgICAgICAgIHVzZXJpbmZvLAorICAgICAgICAgICAgc2VsZi5ob3N0cG9ydCwKKyAgICAgICAgICAgIHNlbGYucGF0aF9xdW90ZWQsCisgICAgICAgICAgICBzZWxmLl9xdWVyeV9zdHIoKSwKKyAgICAgICAgICAgIHNlbGYuX3BhcmFtX3N0cigpKQorCisgICAgZGVmIF9wYXJhbV9zdHIoc2VsZik6CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAnJy5qb2luKFsnOycsIHNlbGYuX3BhcmFtX3N0cl9qb2luKHNlbGYucGFyYW1zLCAiOyIpXSkKKyAgICAgICAgICAgIGlmIHNlbGYucGFyYW1zIGVsc2UgJycpCisKKyAgICBkZWYgX3F1ZXJ5X3N0cihzZWxmKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICcnLmpvaW4oWyc/Jywgc2VsZi5fcGFyYW1fc3RyX2pvaW4oc2VsZi5xdWVyeSwgIiYiKV0pCisgICAgICAgICAgICBpZiBzZWxmLnF1ZXJ5IGVsc2UgJycpCisKKyAgICBkZWYgX3BhcmFtX3N0cl9zcGxpdChzZWxmLCBzdHJpbmcsIGVsbWRlbGltLCBrdmRlbGltPSI9Iik6CisgICAgICAgIHJldCA9IHt9CisgICAgICAgIGZvciBrLCB2IGluIFt4LnNwbGl0KGt2ZGVsaW0sIDEpIGZvciB4IGluIHN0cmluZy5zcGxpdChlbG1kZWxpbSldOgorICAgICAgICAgICAgcmV0W2tdID0gdgorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgX3BhcmFtX3N0cl9qb2luKHNlbGYsIGRpY3RfLCBlbG1kZWxpbSwga3ZkZWxpbT0iPSIpOgorICAgICAgICByZXR1cm4gZWxtZGVsaW0uam9pbihba3ZkZWxpbS5qb2luKFtrLCB2XSkgZm9yIGssIHYgaW4gZGljdF8uaXRlbXMoKV0pCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaG9zdHBvcnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBvcnQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ob3N0bmFtZQorICAgICAgICByZXR1cm4gIiVzOiVkIiAlIChzZWxmLmhvc3RuYW1lLCBzZWxmLnBvcnQpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGF0aF9xdW90ZWQoc2VsZik6CisgICAgICAgIHJldHVybiB1cmxsaWIucXVvdGUoc2VsZi5wYXRoKQorCisgICAgQHBhdGhfcXVvdGVkLnNldHRlcgorICAgIGRlZiBwYXRoX3F1b3RlZChzZWxmLCBwYXRoKToKKyAgICAgICAgc2VsZi5wYXRoID0gdXJsbGliLnVucXVvdGUocGF0aCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGF0aAorCisgICAgQHBhdGguc2V0dGVyCisgICAgZGVmIHBhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIHNlbGYuX3BhdGggPSBwYXRoCisKKyAgICAgICAgaWYgcmUuY29tcGlsZSgiXi8iKS5tYXRjaChwYXRoKToKKyAgICAgICAgICAgIHNlbGYucmVsYXRpdmUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWxhdGl2ZSA9IFRydWUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB1c2VybmFtZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi51c2VyaW5mbzoKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi51c2VyaW5mby5zcGxpdCgiOiIsIDEpKVswXQorICAgICAgICByZXR1cm4gJycKKworICAgIEB1c2VybmFtZS5zZXR0ZXIKKyAgICBkZWYgdXNlcm5hbWUoc2VsZiwgdXNlcm5hbWUpOgorICAgICAgICBwYXNzd29yZCA9IHNlbGYucGFzc3dvcmQKKyAgICAgICAgc2VsZi51c2VyaW5mbyA9IHVzZXJuYW1lCisgICAgICAgIGlmIHBhc3N3b3JkOgorICAgICAgICAgICAgc2VsZi51c2VyaW5mbyArPSAiOiVzIiAlIHBhc3N3b3JkCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFzc3dvcmQoc2VsZik6CisgICAgICAgIGlmIHNlbGYudXNlcmluZm8gYW5kICI6IiBpbiBzZWxmLnVzZXJpbmZvOgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLnVzZXJpbmZvLnNwbGl0KCI6IiwgMSkpWzFdCisgICAgICAgIHJldHVybiAnJworCisgICAgQHBhc3N3b3JkLnNldHRlcgorICAgIGRlZiBwYXNzd29yZChzZWxmLCBwYXNzd29yZCk6CisgICAgICAgIHNlbGYudXNlcmluZm8gPSAiJXM6JXMiICUgKHNlbGYudXNlcm5hbWUsIHBhc3N3b3JkKQorCitkZWYgZGVjb2RldXJsKHVybCk6CisgICAgIiIiRGVjb2RlcyBhbiBVUkwgaW50byB0aGUgdG9rZW5zIChzY2hlbWUsIG5ldHdvcmsgbG9jYXRpb24sIHBhdGgsCisgICAgdXNlciwgcGFzc3dvcmQsIHBhcmFtZXRlcnMpLgorICAgICIiIgorCisgICAgbSA9IHJlLmNvbXBpbGUoJyg/UDx0eXBlPlteOl0qKTovLygoP1A8dXNlcj5bXi9dKylAKT8oP1A8bG9jYXRpb24+W147XSspKDsoP1A8cGFybT4uKikpPycpLm1hdGNoKHVybCkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcmFpc2UgTWFsZm9ybWVkVXJsKHVybCkKKworICAgIHR5cGUgPSBtLmdyb3VwKCd0eXBlJykKKyAgICBsb2NhdGlvbiA9IG0uZ3JvdXAoJ2xvY2F0aW9uJykKKyAgICBpZiBub3QgbG9jYXRpb246CisgICAgICAgIHJhaXNlIE1hbGZvcm1lZFVybCh1cmwpCisgICAgdXNlciA9IG0uZ3JvdXAoJ3VzZXInKQorICAgIHBhcm0gPSBtLmdyb3VwKCdwYXJtJykKKworICAgIGxvY2lkeCA9IGxvY2F0aW9uLmZpbmQoJy8nKQorICAgIGlmIGxvY2lkeCAhPSAtMSBhbmQgdHlwZS5sb3dlcigpICE9ICdmaWxlJzoKKyAgICAgICAgaG9zdCA9IGxvY2F0aW9uWzpsb2NpZHhdCisgICAgICAgIHBhdGggPSBsb2NhdGlvbltsb2NpZHg6XQorICAgIGVsc2U6CisgICAgICAgIGhvc3QgPSAiIgorICAgICAgICBwYXRoID0gbG9jYXRpb24KKyAgICBpZiB1c2VyOgorICAgICAgICBtID0gcmUuY29tcGlsZSgnKD9QPHVzZXI+W146XSspKDo/KD9QPHBzd2Q+LiopKScpLm1hdGNoKHVzZXIpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICB1c2VyID0gbS5ncm91cCgndXNlcicpCisgICAgICAgICAgICBwc3dkID0gbS5ncm91cCgncHN3ZCcpCisgICAgZWxzZToKKyAgICAgICAgdXNlciA9ICcnCisgICAgICAgIHBzd2QgPSAnJworCisgICAgcCA9IHt9CisgICAgaWYgcGFybToKKyAgICAgICAgZm9yIHMgaW4gcGFybS5zcGxpdCgnOycpOgorICAgICAgICAgICAgaWYgczoKKyAgICAgICAgICAgICAgICBpZiBub3QgJz0nIGluIHM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE1hbGZvcm1lZFVybCh1cmwsICJUaGUgVVJMOiAnJXMnIGlzIGludmFsaWQ6IHBhcmFtZXRlciAlcyBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgKG1pc3NpbmcgJz0nKSIgJSAodXJsLCBzKSkKKyAgICAgICAgICAgICAgICBzMSwgczIgPSBzLnNwbGl0KCc9JykKKyAgICAgICAgICAgICAgICBwW3MxXSA9IHMyCisKKyAgICByZXR1cm4gdHlwZSwgaG9zdCwgdXJsbGliLnVucXVvdGUocGF0aCksIHVzZXIsIHBzd2QsIHAKKworZGVmIGVuY29kZXVybChkZWNvZGVkKToKKyAgICAiIiJFbmNvZGVzIGEgVVJMIGZyb20gdG9rZW5zIChzY2hlbWUsIG5ldHdvcmsgbG9jYXRpb24sIHBhdGgsCisgICAgdXNlciwgcGFzc3dvcmQsIHBhcmFtZXRlcnMpLgorICAgICIiIgorCisgICAgdHlwZSwgaG9zdCwgcGF0aCwgdXNlciwgcHN3ZCwgcCA9IGRlY29kZWQKKworICAgIGlmIG5vdCBwYXRoOgorICAgICAgICByYWlzZSBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ3BhdGgnLCAiZW5jb2RlZCBmcm9tIHRoZSBkYXRhICVzIiAlIHN0cihkZWNvZGVkKSkKKyAgICBpZiBub3QgdHlwZToKKyAgICAgICAgcmFpc2UgTWlzc2luZ1BhcmFtZXRlckVycm9yKCd0eXBlJywgImVuY29kZWQgZnJvbSB0aGUgZGF0YSAlcyIgJSBzdHIoZGVjb2RlZCkpCisgICAgdXJsID0gJyVzOi8vJyAlIHR5cGUKKyAgICBpZiB1c2VyIGFuZCB0eXBlICE9ICJmaWxlIjoKKyAgICAgICAgdXJsICs9ICIlcyIgJSB1c2VyCisgICAgICAgIGlmIHBzd2Q6CisgICAgICAgICAgICB1cmwgKz0gIjolcyIgJSBwc3dkCisgICAgICAgIHVybCArPSAiQCIKKyAgICBpZiBob3N0IGFuZCB0eXBlICE9ICJmaWxlIjoKKyAgICAgICAgdXJsICs9ICIlcyIgJSBob3N0CisgICAgIyBTdGFuZGFyZGlzZSBwYXRoIHRvIGVuc3VyZSBjb21wYXJpc29ucyB3b3JrCisgICAgd2hpbGUgJy8vJyBpbiBwYXRoOgorICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCIvLyIsICIvIikKKyAgICB1cmwgKz0gIiVzIiAlIHVybGxpYi5xdW90ZShwYXRoKQorICAgIGlmIHA6CisgICAgICAgIGZvciBwYXJtIGluIHA6CisgICAgICAgICAgICB1cmwgKz0gIjslcz0lcyIgJSAocGFybSwgcFtwYXJtXSkKKworICAgIHJldHVybiB1cmwKKworZGVmIHVyaV9yZXBsYWNlKHVkLCB1cmlfZmluZCwgdXJpX3JlcGxhY2UsIHJlcGxhY2VtZW50cywgZCk6CisgICAgaWYgbm90IHVkLnVybCBvciBub3QgdXJpX2ZpbmQgb3Igbm90IHVyaV9yZXBsYWNlOgorICAgICAgICBsb2dnZXIuZXJyb3IoInVyaV9yZXBsYWNlOiBwYXNzZWQgYW4gdW5kZWZpbmVkIHZhbHVlLCBub3QgcmVwbGFjaW5nIikKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB1cmlfZGVjb2RlZCA9IGxpc3QoZGVjb2RldXJsKHVkLnVybCkpCisgICAgdXJpX2ZpbmRfZGVjb2RlZCA9IGxpc3QoZGVjb2RldXJsKHVyaV9maW5kKSkKKyAgICB1cmlfcmVwbGFjZV9kZWNvZGVkID0gbGlzdChkZWNvZGV1cmwodXJpX3JlcGxhY2UpKQorICAgIGxvZ2dlci5kZWJ1ZygyLCAiRm9yIHVybCAlcyBjb21wYXJpbmcgJXMgdG8gJXMiICUgKHVyaV9kZWNvZGVkLCB1cmlfZmluZF9kZWNvZGVkLCB1cmlfcmVwbGFjZV9kZWNvZGVkKSkKKyAgICByZXN1bHRfZGVjb2RlZCA9IFsnJywgJycsICcnLCAnJywgJycsIHt9XQorICAgIGZvciBsb2MsIGkgaW4gZW51bWVyYXRlKHVyaV9maW5kX2RlY29kZWQpOgorICAgICAgICByZXN1bHRfZGVjb2RlZFtsb2NdID0gdXJpX2RlY29kZWRbbG9jXQorICAgICAgICByZWdleHAgPSBpCisgICAgICAgIGlmIGxvYyA9PSAwIGFuZCByZWdleHAgYW5kIG5vdCByZWdleHAuZW5kc3dpdGgoIiQiKToKKyAgICAgICAgICAgICMgTGVhdmluZyB0aGUgdHlwZSB1bmFuY2hvcmVkIGNhbiBtZWFuICJodHRwcyIgbWF0Y2hpbmcgImZpbGUiIGNhbiBiZWNvbWUgImZpbGVzIgorICAgICAgICAgICAgIyB3aGljaCBpcyBjbGVhcmx5IHVuZGVzaXJhYmxlLgorICAgICAgICAgICAgcmVnZXhwICs9ICIkIgorICAgICAgICBpZiBsb2MgPT0gNToKKyAgICAgICAgICAgICMgSGFuZGxlIFVSTCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgICMgQW55IHNwZWNpZmllZCBVUkwgcGFyYW1ldGVycyBtdXN0IG1hdGNoCisgICAgICAgICAgICAgICAgZm9yIGsgaW4gdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdOgorICAgICAgICAgICAgICAgICAgICBpZiB1cmlfZGVjb2RlZFtsb2NdW2tdICE9IHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXVtrXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAjIE92ZXJ3cml0ZSBhbnkgc3BlY2lmaWVkIHJlcGxhY2VtZW50IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGZvciBrIGluIHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXToKKyAgICAgICAgICAgICAgICBmb3IgbCBpbiByZXBsYWNlbWVudHM6CisgICAgICAgICAgICAgICAgICAgIHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXVtrXSA9IHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXVtrXS5yZXBsYWNlKGwsIHJlcGxhY2VtZW50c1tsXSkKKyAgICAgICAgICAgICAgICByZXN1bHRfZGVjb2RlZFtsb2NdW2tdID0gdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdW2tdCisgICAgICAgIGVsaWYgKHJlLm1hdGNoKHJlZ2V4cCwgdXJpX2RlY29kZWRbbG9jXSkpOgorICAgICAgICAgICAgaWYgbm90IHVyaV9yZXBsYWNlX2RlY29kZWRbbG9jXToKKyAgICAgICAgICAgICAgICByZXN1bHRfZGVjb2RlZFtsb2NdID0gIiIgICAgCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBrIGluIHJlcGxhY2VtZW50czoKKyAgICAgICAgICAgICAgICAgICAgdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdID0gdXJpX3JlcGxhY2VfZGVjb2RlZFtsb2NdLnJlcGxhY2UoaywgcmVwbGFjZW1lbnRzW2tdKQorICAgICAgICAgICAgICAgICNiYi5ub3RlKCIlcyAlcyAlcyIgJSAocmVnZXhwLCB1cmlfcmVwbGFjZV9kZWNvZGVkW2xvY10sIHVyaV9kZWNvZGVkW2xvY10pKQorICAgICAgICAgICAgICAgIHJlc3VsdF9kZWNvZGVkW2xvY10gPSByZS5zdWIocmVnZXhwLCB1cmlfcmVwbGFjZV9kZWNvZGVkW2xvY10sIHVyaV9kZWNvZGVkW2xvY10pCisgICAgICAgICAgICBpZiBsb2MgPT0gMjoKKyAgICAgICAgICAgICAgICAjIEhhbmRsZSBwYXRoIG1hbmlwdWxhdGlvbnMKKyAgICAgICAgICAgICAgICBiYXNlbmFtZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiB1cmlfZGVjb2RlZFswXSAhPSB1cmlfcmVwbGFjZV9kZWNvZGVkWzBdIGFuZCB1ZC5taXJyb3J0YXJiYWxsOgorICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHVybCB0eXBlcyBkaWZmZXIsIG11c3QgYmUgYSBtaXJyb3J0YXJiYWxsIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHVkLm1pcnJvcnRhcmJhbGwpCisgICAgICAgICAgICAgICAgICAgICMgS2lsbCBwYXJhbWV0ZXJzLCB0aGV5IG1ha2Ugbm8gc2Vuc2UgZm9yIG1pcnJvciB0YXJiYWxscworICAgICAgICAgICAgICAgICAgICB1cmlfZGVjb2RlZFs1XSA9IHt9CisgICAgICAgICAgICAgICAgZWxpZiB1ZC5sb2NhbHBhdGggYW5kIHVkLm1ldGhvZC5zdXBwb3J0c19jaGVja3N1bSh1ZCk6CisgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh1ZC5sb2NhbHBhdGgpCisgICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUgYW5kIG5vdCByZXN1bHRfZGVjb2RlZFtsb2NdLmVuZHN3aXRoKGJhc2VuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2RlY29kZWRbbG9jXSA9IG9zLnBhdGguam9pbihyZXN1bHRfZGVjb2RlZFtsb2NdLCBiYXNlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgcmVzdWx0ID0gZW5jb2RldXJsKHJlc3VsdF9kZWNvZGVkKQorICAgIGlmIHJlc3VsdCA9PSB1ZC51cmw6CisgICAgICAgIHJldHVybiBOb25lCisgICAgbG9nZ2VyLmRlYnVnKDIsICJGb3IgdXJsICVzIHJldHVybmluZyAlcyIgJSAodWQudXJsLCByZXN1bHQpKQorICAgIHJldHVybiByZXN1bHQKKworbWV0aG9kcyA9IFtdCit1cmxkYXRhX2NhY2hlID0ge30KK3NhdmVkX2hlYWRyZXZzID0ge30KKworZGVmIGZldGNoZXJfaW5pdChkKToKKyAgICAiIiIKKyAgICBDYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmV0Y2hlcnMgb25jZSB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGlzIGtub3duLgorICAgIENhbGxzIGJlZm9yZSB0aGlzIG11c3Qgbm90IGhpdCB0aGUgY2FjaGUuCisgICAgIiIiCisgICAgIyBXaGVuIHRvIGRyb3AgU0NNIGhlYWQgcmV2aXNpb25zIGNvbnRyb2xsZWQgYnkgdXNlciBwb2xpY3kKKyAgICBzcmNyZXZfcG9saWN5ID0gZC5nZXRWYXIoJ0JCX1NSQ1JFVl9QT0xJQ1knLCBUcnVlKSBvciAiY2xlYXIiCisgICAgaWYgc3JjcmV2X3BvbGljeSA9PSAiY2FjaGUiOgorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIktlZXBpbmcgU1JDUkVWIGNhY2hlIGR1ZSB0byBjYWNoZSBwb2xpY3kgb2Y6ICVzIiwgc3JjcmV2X3BvbGljeSkKKyAgICBlbGlmIHNyY3Jldl9wb2xpY3kgPT0gImNsZWFyIjoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJDbGVhcmluZyBTUkNSRVYgY2FjaGUgZHVlIHRvIGNhY2hlIHBvbGljeSBvZjogJXMiLCBzcmNyZXZfcG9saWN5KQorICAgICAgICByZXZzID0gYmIucGVyc2lzdF9kYXRhLnBlcnNpc3QoJ0JCX1VSSV9IRUFEUkVWUycsIGQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJiLmZldGNoMi5zYXZlZF9oZWFkcmV2cyA9IHJldnMuaXRlbXMoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldnMuY2xlYXIoKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkludmFsaWQgU1JDUkVWIGNhY2hlIHBvbGljeSBvZjogJXMiICUgc3JjcmV2X3BvbGljeSkKKworICAgIF9jaGVja3N1bV9jYWNoZS5pbml0X2NhY2hlKGQpCisKKyAgICBmb3IgbSBpbiBtZXRob2RzOgorICAgICAgICBpZiBoYXNhdHRyKG0sICJpbml0Iik6CisgICAgICAgICAgICBtLmluaXQoZCkKKworZGVmIGZldGNoZXJfcGFyc2Vfc2F2ZShkKToKKyAgICBfY2hlY2tzdW1fY2FjaGUuc2F2ZV9leHRyYXMoZCkKKworZGVmIGZldGNoZXJfcGFyc2VfZG9uZShkKToKKyAgICBfY2hlY2tzdW1fY2FjaGUuc2F2ZV9tZXJnZShkKQorCitkZWYgZmV0Y2hlcl9jb21wYXJlX3JldmlzaW9ucyhkKToKKyAgICAiIiIKKyAgICBDb21wYXJlIHRoZSByZXZpc2lvbnMgaW4gdGhlIHBlcnNpc3RhbnQgY2FjaGUgd2l0aCBjdXJyZW50IHZhbHVlcyBhbmQKKyAgICByZXR1cm4gdHJ1ZS9mYWxzZSBvbiB3aGV0aGVyIHRoZXkndmUgY2hhbmdlZC4KKyAgICAiIiIKKworICAgIGRhdGEgPSBiYi5wZXJzaXN0X2RhdGEucGVyc2lzdCgnQkJfVVJJX0hFQURSRVZTJywgZCkuaXRlbXMoKQorICAgIGRhdGEyID0gYmIuZmV0Y2gyLnNhdmVkX2hlYWRyZXZzCisKKyAgICBjaGFuZ2VkID0gRmFsc2UKKyAgICBmb3Iga2V5IGluIGRhdGE6CisgICAgICAgIGlmIGtleSBub3QgaW4gZGF0YTIgb3IgZGF0YTJba2V5XSAhPSBkYXRhW2tleV06CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIiVzIGNoYW5nZWQiLCBrZXkpCisgICAgICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiJXMgZGlkIG5vdCBjaGFuZ2UiLCBrZXkpCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBtaXJyb3JfZnJvbV9zdHJpbmcoZGF0YSk6CisgICAgcmV0dXJuIFsgaS5zcGxpdCgpIGZvciBpIGluIChkYXRhIG9yICIiKS5yZXBsYWNlKCdcXG4nLCdcbicpLnNwbGl0KCdcbicpIGlmIGkgXQorCitkZWYgdmVyaWZ5X2NoZWNrc3VtKHVkLCBkLCBwcmVjb21wdXRlZD17fSk6CisgICAgIiIiCisgICAgdmVyaWZ5IHRoZSBNRDUgYW5kIFNIQTI1NiBjaGVja3N1bSBmb3IgZG93bmxvYWRlZCBzcmMKKworICAgIFJhaXNlcyBhIEZldGNoRXJyb3IgaWYgb25lIG9yIGJvdGggb2YgdGhlIFNSQ19VUkkgY2hlY2tzdW1zIGRvIG5vdCBtYXRjaAorICAgIHRoZSBkb3dubG9hZGVkIGZpbGUsIG9yIGlmIEJCX1NUUklDVF9DSEVDS1NVTSBpcyBzZXQgYW5kIHRoZXJlIGFyZSBubworICAgIGNoZWNrc3VtcyBzcGVjaWZpZWQuCisKKyAgICBSZXR1cm5zIGEgZGljdCBvZiBjaGVja3N1bXMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGEgZG9uZSBzdGFtcCBmaWxlIGFuZAorICAgIHBhc3NlZCBpbiBhcyBwcmVjb21wdXRlZCBwYXJhbWV0ZXIgaW4gYSBsYXRlciBjYWxsIHRvIGF2b2lkIHJlLWNvbXB1dGluZworICAgIHRoZSBjaGVja3N1bXMgZnJvbSB0aGUgZmlsZS4gVGhpcyBhbGxvd3MgdmVyaWZ5aW5nIHRoZSBjaGVja3N1bXMgb2YgdGhlCisgICAgZmlsZSBhZ2FpbnN0IHRob3NlIGluIHRoZSByZWNpcGUgZWFjaCB0aW1lLCByYXRoZXIgdGhhbiBvbmx5IGFmdGVyCisgICAgZG93bmxvYWRpbmcuIFNlZSBodHRwczovL2J1Z3ppbGxhLnlvY3RvcHJvamVjdC5vcmcvc2hvd19idWcuY2dpP2lkPTU1NzEuCisgICAgIiIiCisKKyAgICBfTUQ1X0tFWSA9ICJtZDUiCisgICAgX1NIQTI1Nl9LRVkgPSAic2hhMjU2IgorCisgICAgaWYgdWQuaWdub3JlX2NoZWNrc3VtcyBvciBub3QgdWQubWV0aG9kLnN1cHBvcnRzX2NoZWNrc3VtKHVkKToKKyAgICAgICAgcmV0dXJuIHt9CisKKyAgICBpZiBfTUQ1X0tFWSBpbiBwcmVjb21wdXRlZDoKKyAgICAgICAgbWQ1ZGF0YSA9IHByZWNvbXB1dGVkW19NRDVfS0VZXQorICAgIGVsc2U6CisgICAgICAgIG1kNWRhdGEgPSBiYi51dGlscy5tZDVfZmlsZSh1ZC5sb2NhbHBhdGgpCisKKyAgICBpZiBfU0hBMjU2X0tFWSBpbiBwcmVjb21wdXRlZDoKKyAgICAgICAgc2hhMjU2ZGF0YSA9IHByZWNvbXB1dGVkW19TSEEyNTZfS0VZXQorICAgIGVsc2U6CisgICAgICAgIHNoYTI1NmRhdGEgPSBiYi51dGlscy5zaGEyNTZfZmlsZSh1ZC5sb2NhbHBhdGgpCisKKyAgICBpZiB1ZC5tZXRob2QucmVjb21tZW5kc19jaGVja3N1bSh1ZCk6CisgICAgICAgICMgSWYgc3RyaWN0IGNoZWNraW5nIGVuYWJsZWQgYW5kIG5laXRoZXIgc3VtIGRlZmluZWQsIHJhaXNlIGVycm9yCisgICAgICAgIHN0cmljdCA9IGQuZ2V0VmFyKCJCQl9TVFJJQ1RfQ0hFQ0tTVU0iLCBUcnVlKSBvciAiMCIKKyAgICAgICAgaWYgKHN0cmljdCA9PSAiMSIpIGFuZCBub3QgKHVkLm1kNV9leHBlY3RlZCBvciB1ZC5zaGEyNTZfZXhwZWN0ZWQpOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyBjaGVja3N1bSBzcGVjaWZpZWQgZm9yICVzLCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSB0byB0aGUgcmVjaXBlOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1JDX1VSSVslc10gPSAiJXMiXG5TUkNfVVJJWyVzXSA9ICIlcyInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVkLmxvY2FscGF0aCwgdWQubWQ1X25hbWUsIG1kNWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZC5zaGEyNTZfbmFtZSwgc2hhMjU2ZGF0YSkpCisgICAgICAgICAgICByYWlzZSBOb0NoZWNrc3VtRXJyb3IoJ01pc3NpbmcgU1JDX1VSSSBjaGVja3N1bScsIHVkLnVybCkKKworICAgICAgICAjIExvZyBtaXNzaW5nIHN1bXMgc28gdXNlciBjYW4gbW9yZSBlYXNpbHkgYWRkIHRoZW0KKyAgICAgICAgaWYgbm90IHVkLm1kNV9leHBlY3RlZDoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdNaXNzaW5nIG1kNSBTUkNfVVJJIGNoZWNrc3VtIGZvciAlcywgY29uc2lkZXIgYWRkaW5nIHRvIHRoZSByZWNpcGU6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAnU1JDX1VSSVslc10gPSAiJXMiJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkLmxvY2FscGF0aCwgdWQubWQ1X25hbWUsIG1kNWRhdGEpCisKKyAgICAgICAgaWYgbm90IHVkLnNoYTI1Nl9leHBlY3RlZDoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdNaXNzaW5nIHNoYTI1NiBTUkNfVVJJIGNoZWNrc3VtIGZvciAlcywgY29uc2lkZXIgYWRkaW5nIHRvIHRoZSByZWNpcGU6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAnU1JDX1VSSVslc10gPSAiJXMiJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkLmxvY2FscGF0aCwgdWQuc2hhMjU2X25hbWUsIHNoYTI1NmRhdGEpCisKKyAgICBtZDVtaXNtYXRjaCA9IEZhbHNlCisgICAgc2hhMjU2bWlzbWF0Y2ggPSBGYWxzZQorCisgICAgaWYgdWQubWQ1X2V4cGVjdGVkICE9IG1kNWRhdGE6CisgICAgICAgIG1kNW1pc21hdGNoID0gVHJ1ZQorCisgICAgaWYgdWQuc2hhMjU2X2V4cGVjdGVkICE9IHNoYTI1NmRhdGE6CisgICAgICAgIHNoYTI1Nm1pc21hdGNoID0gVHJ1ZQorCisgICAgIyBXZSB3YW50IHRvIGFsZXJ0IHRoZSB1c2VyIGlmIGEgY2hlY2tzdW0gaXMgZGVmaW5lZCBpbiB0aGUgcmVjaXBlIGJ1dAorICAgICMgaXQgZG9lcyBub3QgbWF0Y2guCisgICAgbXNnID0gIiIKKyAgICBtaXNtYXRjaCA9IEZhbHNlCisgICAgaWYgbWQ1bWlzbWF0Y2ggYW5kIHVkLm1kNV9leHBlY3RlZDoKKyAgICAgICAgbXNnID0gbXNnICsgIlxuRmlsZTogJyVzJyBoYXMgJXMgY2hlY2tzdW0gJXMgd2hlbiAlcyB3YXMgZXhwZWN0ZWQiICUgKHVkLmxvY2FscGF0aCwgJ21kNScsIG1kNWRhdGEsIHVkLm1kNV9leHBlY3RlZCkKKyAgICAgICAgbWlzbWF0Y2ggPSBUcnVlOworCisgICAgaWYgc2hhMjU2bWlzbWF0Y2ggYW5kIHVkLnNoYTI1Nl9leHBlY3RlZDoKKyAgICAgICAgbXNnID0gbXNnICsgIlxuRmlsZTogJyVzJyBoYXMgJXMgY2hlY2tzdW0gJXMgd2hlbiAlcyB3YXMgZXhwZWN0ZWQiICUgKHVkLmxvY2FscGF0aCwgJ3NoYTI1NicsIHNoYTI1NmRhdGEsIHVkLnNoYTI1Nl9leHBlY3RlZCkKKyAgICAgICAgbWlzbWF0Y2ggPSBUcnVlOworCisgICAgaWYgbWlzbWF0Y2g6CisgICAgICAgIG1zZyA9IG1zZyArICdcbklmIHRoaXMgY2hhbmdlIGlzIGV4cGVjdGVkIChlLmcuIHlvdSBoYXZlIHVwZ3JhZGVkIHRvIGEgbmV3IHZlcnNpb24gd2l0aG91dCB1cGRhdGluZyB0aGUgY2hlY2tzdW1zKSB0aGVuIHlvdSBjYW4gdXNlIHRoZXNlIGxpbmVzIHdpdGhpbiB0aGUgcmVjaXBlOlxuU1JDX1VSSVslc10gPSAiJXMiXG5TUkNfVVJJWyVzXSA9ICIlcyJcbk90aGVyd2lzZSB5b3Ugc2hvdWxkIHJldHJ5IHRoZSBkb3dubG9hZCBhbmQvb3IgY2hlY2sgd2l0aCB1cHN0cmVhbSB0byBkZXRlcm1pbmUgaWYgdGhlIGZpbGUgaGFzIGJlY29tZSBjb3JydXB0ZWQgb3Igb3RoZXJ3aXNlIHVuZXhwZWN0ZWRseSBtb2RpZmllZC5cbicgJSAodWQubWQ1X25hbWUsIG1kNWRhdGEsIHVkLnNoYTI1Nl9uYW1lLCBzaGEyNTZkYXRhKQorCisgICAgaWYgbGVuKG1zZyk6CisgICAgICAgIHJhaXNlIENoZWNrc3VtRXJyb3IoJ0NoZWNrc3VtIG1pc21hdGNoISVzJyAlIG1zZywgdWQudXJsLCBtZDVkYXRhKQorCisgICAgcmV0dXJuIHsKKyAgICAgICAgX01ENV9LRVk6IG1kNWRhdGEsCisgICAgICAgIF9TSEEyNTZfS0VZOiBzaGEyNTZkYXRhCisgICAgfQorCisKK2RlZiB2ZXJpZnlfZG9uZXN0YW1wKHVkLCBkLCBvcmlndWQ9Tm9uZSk6CisgICAgIiIiCisgICAgQ2hlY2sgd2hldGhlciB0aGUgZG9uZSBzdGFtcCBmaWxlIGhhcyB0aGUgcmlnaHQgY2hlY2tzdW1zIChpZiB0aGUgZmV0Y2gKKyAgICBtZXRob2Qgc3VwcG9ydHMgdGhlbSkuIElmIGl0IGRvZXNuJ3QsIGRlbGV0ZSB0aGUgZG9uZSBzdGFtcCBhbmQgZm9yY2UKKyAgICBhIHJlLWRvd25sb2FkLgorCisgICAgUmV0dXJucyBUcnVlLCBpZiB0aGUgZG9uZXN0YW1wIGV4aXN0cyBhbmQgaXMgdmFsaWQsIEZhbHNlIG90aGVyd2lzZS4gV2hlbgorICAgIHJldHVybmluZyBGYWxzZSwgYW55IGV4aXN0aW5nIGRvbmUgc3RhbXBzIGFyZSByZW1vdmVkLgorICAgICIiIgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5kb25lc3RhbXApOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIChub3QgdWQubWV0aG9kLnN1cHBvcnRzX2NoZWNrc3VtKHVkKSBvcgorICAgICAgICAob3JpZ3VkIGFuZCBub3Qgb3JpZ3VkLm1ldGhvZC5zdXBwb3J0c19jaGVja3N1bShvcmlndWQpKSk6CisgICAgICAgICMgZG9uZSBzdGFtcCBleGlzdHMsIGNoZWNrc3VtcyBub3Qgc3VwcG9ydGVkOyBhc3N1bWUgdGhlIGxvY2FsIGZpbGUgaXMKKyAgICAgICAgIyBjdXJyZW50CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModWQubG9jYWxwYXRoKToKKyAgICAgICAgIyBkb25lIHN0YW1wIGV4aXN0cywgYnV0IHRoZSBkb3dubG9hZGVkIGZpbGUgZG9lcyBub3Q7IHRoZSBkb25lIHN0YW1wCisgICAgICAgICMgbXVzdCBiZSBpbmNvcnJlY3QsIHJlLXRyaWdnZXIgdGhlIGRvd25sb2FkCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5kb25lc3RhbXApCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcHJlY29tcHV0ZWRfY2hlY2tzdW1zID0ge30KKyAgICAjIE9ubHkgcmUtdXNlIHRoZSBwcmVjb21wdXRlZCBjaGVja3N1bXMgaWYgdGhlIGRvbmVzdGFtcCBpcyBuZXdlciB0aGFuIHRoZQorICAgICMgZmlsZS4gRG8gbm90IHJlbHkgb24gdGhlIG10aW1lIG9mIGRpcmVjdG9yaWVzLCB0aG91Z2guIElmIHVkLmxvY2FscGF0aCBpcworICAgICMgYSBkaXJlY3RvcnksIHRoZXJlIHdpbGwgcHJvYmFibHkgbm90IGJlIGFueSBjaGVja3N1bXMgYW55d2F5LgorICAgIGlmIChvcy5wYXRoLmlzZGlyKHVkLmxvY2FscGF0aCkgb3IKKyAgICAgICAgICAgIG9zLnBhdGguZ2V0bXRpbWUodWQubG9jYWxwYXRoKSA8IG9zLnBhdGguZ2V0bXRpbWUodWQuZG9uZXN0YW1wKSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3Blbih1ZC5kb25lc3RhbXAsICJyYiIpIGFzIGNhY2hlZmlsZToKKyAgICAgICAgICAgICAgICBwaWNrbGVkID0gcGlja2xlLlVucGlja2xlcihjYWNoZWZpbGUpCisgICAgICAgICAgICAgICAgcHJlY29tcHV0ZWRfY2hlY2tzdW1zLnVwZGF0ZShwaWNrbGVkLmxvYWQoKSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgIyBBdm9pZCB0aGUgd2FybmluZ3Mgb24gdGhlIHVwZ3JhZGUgcGF0aCBmcm9tIGVtdHB5IGRvbmUgc3RhbXAKKyAgICAgICAgICAgICMgZmlsZXMgdG8gdGhvc2UgY29udGFpbmluZyB0aGUgY2hlY2tzdW1zLgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZSwgRU9GRXJyb3IpOgorICAgICAgICAgICAgICAgICMgSWdub3JlIGVycm9ycywgdGhleSBhcmVuJ3QgZmF0YWwKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiQ291bGRuJ3QgbG9hZCBjaGVja3N1bXMgZnJvbSBkb25lc3RhbXAgJXM6ICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG1zZzogJXMpIiAlICh1ZC5kb25lc3RhbXAsIHR5cGUoZSkuX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGUpKSkKKworICAgIHRyeToKKyAgICAgICAgY2hlY2tzdW1zID0gdmVyaWZ5X2NoZWNrc3VtKHVkLCBkLCBwcmVjb21wdXRlZF9jaGVja3N1bXMpCisgICAgICAgICMgSWYgdGhlIGNhY2hlIGZpbGUgZGlkIG5vdCBoYXZlIHRoZSBjaGVja3N1bXMsIGNvbXB1dGUgYW5kIHN0b3JlIHRoZW0KKyAgICAgICAgIyBhcyBhbiB1cGdyYWRlIHBhdGggZnJvbSB0aGUgcHJldmlvdXMgZG9uZSBzdGFtcCBmaWxlIGZvcm1hdC4KKyAgICAgICAgaWYgY2hlY2tzdW1zICE9IHByZWNvbXB1dGVkX2NoZWNrc3VtczoKKyAgICAgICAgICAgIHdpdGggb3Blbih1ZC5kb25lc3RhbXAsICJ3YiIpIGFzIGNhY2hlZmlsZToKKyAgICAgICAgICAgICAgICBwID0gcGlja2xlLlBpY2tsZXIoY2FjaGVmaWxlLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCkKKyAgICAgICAgICAgICAgICBwLmR1bXAoY2hlY2tzdW1zKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBDaGVja3N1bUVycm9yIGFzIGU6CisgICAgICAgICMgQ2hlY2tzdW1zIGZhaWxlZCB0byB2ZXJpZnksIHRyaWdnZXIgcmUtZG93bmxvYWQgYW5kIHJlbW92ZSB0aGUKKyAgICAgICAgIyBpbmNvcnJlY3Qgc3RhbXAgZmlsZS4KKyAgICAgICAgbG9nZ2VyLndhcm4oIkNoZWNrc3VtIG1pc21hdGNoIGZvciBsb2NhbCBmaWxlICVzXG4iCisgICAgICAgICAgICAgICAgICAgICJDbGVhbmluZyBhbmQgdHJ5aW5nIGFnYWluLiIgJSB1ZC5sb2NhbHBhdGgpCisgICAgICAgIHJlbmFtZV9iYWRfY2hlY2tzdW0odWQsIGUuY2hlY2tzdW0pCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5kb25lc3RhbXApCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHVwZGF0ZV9zdGFtcCh1ZCwgZCk6CisgICAgIiIiCisgICAgICAgIGRvbmVzdGFtcCBpcyBmaWxlIHN0YW1wIGluZGljYXRpbmcgdGhlIHdob2xlIGZldGNoaW5nIGlzIGRvbmUKKyAgICAgICAgdGhpcyBmdW5jdGlvbiB1cGRhdGUgdGhlIHN0YW1wIGFmdGVyIHZlcmlmeWluZyB0aGUgY2hlY2tzdW0KKyAgICAiIiIKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyh1ZC5kb25lc3RhbXApOgorICAgICAgICAjIFRvdWNoIHRoZSBkb25lIHN0YW1wIGZpbGUgdG8gc2hvdyBhY3RpdmUgdXNlIG9mIHRoZSBkb3dubG9hZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51dGltZSh1ZC5kb25lc3RhbXAsIE5vbmUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgRXJyb3JzIGFyZW4ndCBmYXRhbCBoZXJlCisgICAgICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgY2hlY2tzdW1zID0gdmVyaWZ5X2NoZWNrc3VtKHVkLCBkKQorICAgICAgICAjIFN0b3JlIHRoZSBjaGVja3N1bXMgZm9yIGxhdGVyIHJlLXZlcmlmaWNhdGlvbiBhZ2FpbnN0IHRoZSByZWNpcGUKKyAgICAgICAgd2l0aCBvcGVuKHVkLmRvbmVzdGFtcCwgIndiIikgYXMgY2FjaGVmaWxlOgorICAgICAgICAgICAgcCA9IHBpY2tsZS5QaWNrbGVyKGNhY2hlZmlsZSwgcGlja2xlLkhJR0hFU1RfUFJPVE9DT0wpCisgICAgICAgICAgICBwLmR1bXAoY2hlY2tzdW1zKQorCitkZWYgc3VicHJvY2Vzc19zZXR1cCgpOgorICAgICMgUHl0aG9uIGluc3RhbGxzIGEgU0lHUElQRSBoYW5kbGVyIGJ5IGRlZmF1bHQuIFRoaXMgaXMgdXN1YWxseSBub3Qgd2hhdAorICAgICMgbm9uLVB5dGhvbiBzdWJwcm9jZXNzZXMgZXhwZWN0LgorICAgICMgU0lHUElQRSBlcnJvcnMgYXJlIGtub3duIGlzc3VlcyB3aXRoIGd6aXAvYmFzaAorICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1BJUEUsIHNpZ25hbC5TSUdfREZMKQorCitkZWYgZ2V0X2F1dG9yZXYoZCk6CisgICAgIyAgb25seSBub3QgY2FjaGUgc3JjIHJldiBpbiBhdXRvcmV2IGNhc2UKKyAgICBpZiBkLmdldFZhcignQkJfU1JDUkVWX1BPTElDWScsIFRydWUpICE9ICJjYWNoZSI6CisgICAgICAgIGQuc2V0VmFyKCdfX0JCX0RPTlRfQ0FDSEUnLCAnMScpCisgICAgcmV0dXJuICJBVVRPSU5DIgorCitkZWYgZ2V0X3NyY3JldihkLCBtZXRob2RfbmFtZT0nc29ydGFibGVfcmV2aXNpb24nKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIHJldnNpb24gc3RyaW5nLCB1c3VhbGx5IGZvciB1c2UgaW4gdGhlIHZlcnNpb24gc3RyaW5nIChQVikgb2YgdGhlIGN1cnJlbnQgcGFja2FnZQorICAgIE1vc3QgcGFja2FnZXMgdXN1YWxseSBvbmx5IGhhdmUgb25lIFNDTSBzbyB3ZSBqdXN0IHBhc3Mgb24gdGhlIGNhbGwuCisgICAgSW4gdGhlIG11bHRpIFNDTSBjYXNlLCB3ZSBidWlsZCBhIHZhbHVlIGJhc2VkIG9uIFNSQ1JFVl9GT1JNQVQgd2hpY2ggbXVzdAorICAgIGhhdmUgYmVlbiBzZXQuCisKKyAgICBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgd2UgcHV0IHRoZSBzdHJpbmcgIkFVVE9JTkMrIiBpbnRvIHJldHVybiB2YWx1ZSBpZiB0aGUgcmV2aXNpb25zIGFyZSBub3QgCisgICAgaW5jcmVtZW50YWwsIG90aGVyIGNvZGUgaXMgdGhlbiByZXNwb25zaWJsZSBmb3IgdHVybmluZyB0aGF0IGludG8gYW4gaW5jcmVhc2luZyB2YWx1ZSAoaWYgbmVlZGVkKQorCisgICAgQSBtZXRob2RfbmFtZSBjYW4gYmUgc3VwcGxpZWQgdG8gcmV0cmlldmUgYW4gYWx0ZXJuYXRpdmVseSBmb3JtYXR0ZWQgcmV2aXNpb24gZnJvbSBhIGZldGNoZXIsIGlmCisgICAgdGhhdCBmZXRjaGVyIHByb3ZpZGVzIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBzb3J0YWJsZV9yZXZpc2lvbi4KKyAgICAiIiIKKworICAgIHNjbXMgPSBbXQorICAgIGZldGNoZXIgPSBGZXRjaChkLmdldFZhcignU1JDX1VSSScsIFRydWUpLnNwbGl0KCksIGQpCisgICAgdXJsZGF0YSA9IGZldGNoZXIudWQKKyAgICBmb3IgdSBpbiB1cmxkYXRhOgorICAgICAgICBpZiB1cmxkYXRhW3VdLm1ldGhvZC5zdXBwb3J0c19zcmNyZXYoKToKKyAgICAgICAgICAgIHNjbXMuYXBwZW5kKHUpCisKKyAgICBpZiBsZW4oc2NtcykgPT0gMDoKKyAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiU1JDUkVWIHdhcyB1c2VkIHlldCBubyB2YWxpZCBTQ00gd2FzIGZvdW5kIGluIFNSQ19VUkkiKQorCisgICAgaWYgbGVuKHNjbXMpID09IDEgYW5kIGxlbih1cmxkYXRhW3NjbXNbMF1dLm5hbWVzKSA9PSAxOgorICAgICAgICBhdXRvaW5jLCByZXYgPSBnZXRhdHRyKHVybGRhdGFbc2Ntc1swXV0ubWV0aG9kLCBtZXRob2RfbmFtZSkodXJsZGF0YVtzY21zWzBdXSwgZCwgdXJsZGF0YVtzY21zWzBdXS5uYW1lc1swXSkKKyAgICAgICAgaWYgbGVuKHJldikgPiAxMDoKKyAgICAgICAgICAgIHJldiA9IHJldls6MTBdCisgICAgICAgIGlmIGF1dG9pbmM6CisgICAgICAgICAgICByZXR1cm4gIkFVVE9JTkMrIiArIHJldgorICAgICAgICByZXR1cm4gcmV2CisKKyAgICAjCisgICAgIyBNdXRpcGxlIFNDTXMgYXJlIGluIFNSQ19VUkkgc28gd2UgcmVzb3J0IHRvIFNSQ1JFVl9GT1JNQVQKKyAgICAjCisgICAgZm9ybWF0ID0gZC5nZXRWYXIoJ1NSQ1JFVl9GT1JNQVQnLCBUcnVlKQorICAgIGlmIG5vdCBmb3JtYXQ6CisgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlRoZSBTUkNSRVZfRk9STUFUIHZhcmlhYmxlIG11c3QgYmUgc2V0IHdoZW4gbXVsdGlwbGUgU0NNcyBhcmUgdXNlZC4iKQorCisgICAgc2VlbmF1dG9pbmMgPSBGYWxzZQorICAgIGZvciBzY20gaW4gc2NtczoKKyAgICAgICAgdWQgPSB1cmxkYXRhW3NjbV0KKyAgICAgICAgZm9yIG5hbWUgaW4gdWQubmFtZXM6CisgICAgICAgICAgICBhdXRvaW5jLCByZXYgPSBnZXRhdHRyKHVkLm1ldGhvZCwgbWV0aG9kX25hbWUpKHVkLCBkLCBuYW1lKQorICAgICAgICAgICAgc2VlbmF1dG9pbmMgPSBzZWVuYXV0b2luYyBvciBhdXRvaW5jCisgICAgICAgICAgICBpZiBsZW4ocmV2KSA+IDEwOgorICAgICAgICAgICAgICAgIHJldiA9IHJldls6MTBdCisgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShuYW1lLCByZXYpCisgICAgaWYgc2VlbmF1dG9pbmM6CisgICAgICAgZm9ybWF0ID0gIkFVVE9JTkMrIiArIGZvcm1hdAorCisgICAgcmV0dXJuIGZvcm1hdAorCitkZWYgbG9jYWxwYXRoKHVybCwgZCk6CisgICAgZmV0Y2hlciA9IGJiLmZldGNoMi5GZXRjaChbdXJsXSwgZCkKKyAgICByZXR1cm4gZmV0Y2hlci5sb2NhbHBhdGgodXJsKQorCitkZWYgcnVuZmV0Y2hjbWQoY21kLCBkLCBxdWlldD1GYWxzZSwgY2xlYW51cD1Ob25lKToKKyAgICAiIiIKKyAgICBSdW4gY21kIHJldHVybmluZyB0aGUgY29tbWFuZCBvdXRwdXQKKyAgICBSYWlzZSBhbiBlcnJvciBpZiBpbnRlcnJ1cHRlZCBvciBjbWQgZmFpbHMKKyAgICBPcHRpb25hbGx5IGVjaG8gY29tbWFuZCBvdXRwdXQgdG8gc3Rkb3V0CisgICAgT3B0aW9uYWxseSByZW1vdmUgdGhlIGZpbGVzL2RpcmVjdG9yaWVzIGxpc3RlZCBpbiBjbGVhbnVwIHVwb24gZmFpbHVyZQorICAgICIiIgorCisgICAgIyBOZWVkIHRvIGV4cG9ydCBQQVRIIGFzIGJpbmFyeSBjb3VsZCBiZSBpbiBtZXRhZGF0YSBwYXRocworICAgICMgcmF0aGVyIHRoYW4gaG9zdCBwcm92aWRlZAorICAgICMgQWxzbyBpbmNsdWRlIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorICAgICMgRklYTUU6IFNob3VsZCByZWFsbHkgaW5jbHVkZSBhbGwgZXhwb3J0IHZhcmFpYWJsZXM/CisgICAgZXhwb3J0dmFycyA9IFsnSE9NRScsICdQQVRIJywKKyAgICAgICAgICAgICAgICAgICdIVFRQX1BST1hZJywgJ2h0dHBfcHJveHknLAorICAgICAgICAgICAgICAgICAgJ0hUVFBTX1BST1hZJywgJ2h0dHBzX3Byb3h5JywKKyAgICAgICAgICAgICAgICAgICdGVFBfUFJPWFknLCAnZnRwX3Byb3h5JywKKyAgICAgICAgICAgICAgICAgICdGVFBTX1BST1hZJywgJ2Z0cHNfcHJveHknLAorICAgICAgICAgICAgICAgICAgJ05PX1BST1hZJywgJ25vX3Byb3h5JywKKyAgICAgICAgICAgICAgICAgICdBTExfUFJPWFknLCAnYWxsX3Byb3h5JywKKyAgICAgICAgICAgICAgICAgICdHSVRfUFJPWFlfQ09NTUFORCcsCisgICAgICAgICAgICAgICAgICAnR0lUX1NTTF9DQUlORk8nLAorICAgICAgICAgICAgICAgICAgJ0dJVF9TTUFSVF9IVFRQJywKKyAgICAgICAgICAgICAgICAgICdTU0hfQVVUSF9TT0NLJywgJ1NTSF9BR0VOVF9QSUQnLAorICAgICAgICAgICAgICAgICAgJ1NPQ0tTNV9VU0VSJywgJ1NPQ0tTNV9QQVNTV0QnXQorCisgICAgaWYgbm90IGNsZWFudXA6CisgICAgICAgIGNsZWFudXAgPSBbXQorCisgICAgZm9yIHZhciBpbiBleHBvcnR2YXJzOgorICAgICAgICB2YWwgPSBkLmdldFZhcih2YXIsIFRydWUpCisgICAgICAgIGlmIHZhbDoKKyAgICAgICAgICAgIGNtZCA9ICdleHBvcnQgJyArIHZhciArICc9XCIlc1wiOyAlcycgJSAodmFsLCBjbWQpCisKKyAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBjbWQpCisKKyAgICBzdWNjZXNzID0gRmFsc2UKKyAgICBlcnJvcl9tZXNzYWdlID0gIiIKKworICAgIHRyeToKKyAgICAgICAgKG91dHB1dCwgZXJyb3JzKSA9IGJiLnByb2Nlc3MucnVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3VjY2VzcyA9IFRydWUKKyAgICBleGNlcHQgYmIucHJvY2Vzcy5Ob3RGb3VuZEVycm9yIGFzIGU6CisgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmV0Y2ggY29tbWFuZCAlcyIgJSAoZS5jb21tYW5kKQorICAgIGV4Y2VwdCBiYi5wcm9jZXNzLkV4ZWN1dGlvbkVycm9yIGFzIGU6CisgICAgICAgIGlmIGUuc3Rkb3V0OgorICAgICAgICAgICAgb3V0cHV0ID0gIm91dHB1dDpcbiVzXG4lcyIgJSAoZS5zdGRvdXQsIGUuc3RkZXJyKQorICAgICAgICBlbGlmIGUuc3RkZXJyOgorICAgICAgICAgICAgb3V0cHV0ID0gIm91dHB1dDpcbiVzIiAlIGUuc3RkZXJyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQgPSAibm8gb3V0cHV0IgorICAgICAgICBlcnJvcl9tZXNzYWdlID0gIkZldGNoIGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVzLCAlcyIgJSAoZS5leGl0Y29kZSwgb3V0cHV0KQorICAgIGV4Y2VwdCBiYi5wcm9jZXNzLkNtZEVycm9yIGFzIGU6CisgICAgICAgIGVycm9yX21lc3NhZ2UgPSAiRmV0Y2ggY29tbWFuZCAlcyBjb3VsZCBub3QgYmUgcnVuOlxuJXMiICUgKGUuY29tbWFuZCwgZS5tc2cpCisgICAgaWYgbm90IHN1Y2Nlc3M6CisgICAgICAgIGZvciBmIGluIGNsZWFudXA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYmIudXRpbHMucmVtb3ZlKGYsIFRydWUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcihlcnJvcl9tZXNzYWdlKQorCisgICAgcmV0dXJuIG91dHB1dAorCitkZWYgY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgaW5mbyA9ICIiLCB1cmwgPSBOb25lKToKKyAgICAiIiIKKyAgICBsb2cgcmVtb3RlIG5ldHdvcmsgYWNjZXNzLCBhbmQgZXJyb3IgaWYgQkJfTk9fTkVUV09SSyBpcyBzZXQKKyAgICAiIiIKKyAgICBpZiBkLmdldFZhcigiQkJfTk9fTkVUV09SSyIsIFRydWUpID09ICIxIjoKKyAgICAgICAgcmFpc2UgTmV0d29ya0FjY2Vzcyh1cmwsIGluZm8pCisgICAgZWxzZToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJGZXRjaGVyIGFjY2Vzc2VkIHRoZSBuZXR3b3JrIHdpdGggdGhlIGNvbW1hbmQgJXMiICUgaW5mbykKKworZGVmIGJ1aWxkX21pcnJvcnVyaXMob3JpZ3VkLCBtaXJyb3JzLCBsZCk6CisgICAgdXJpcyA9IFtdCisgICAgdWRzID0gW10KKworICAgIHJlcGxhY2VtZW50cyA9IHt9CisgICAgcmVwbGFjZW1lbnRzWyJUWVBFIl0gPSBvcmlndWQudHlwZQorICAgIHJlcGxhY2VtZW50c1siSE9TVCJdID0gb3JpZ3VkLmhvc3QKKyAgICByZXBsYWNlbWVudHNbIlBBVEgiXSA9IG9yaWd1ZC5wYXRoCisgICAgcmVwbGFjZW1lbnRzWyJCQVNFTkFNRSJdID0gb3JpZ3VkLnBhdGguc3BsaXQoIi8iKVstMV0KKyAgICByZXBsYWNlbWVudHNbIk1JUlJPUk5BTUUiXSA9IG9yaWd1ZC5ob3N0LnJlcGxhY2UoJzonLCcuJykgKyBvcmlndWQucGF0aC5yZXBsYWNlKCcvJywgJy4nKS5yZXBsYWNlKCcqJywgJy4nKQorCisgICAgZGVmIGFkZHVyaSh1ZCwgdXJpcywgdWRzKToKKyAgICAgICAgZm9yIGxpbmUgaW4gbWlycm9yczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAoZmluZCwgcmVwbGFjZSkgPSBsaW5lCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbmV3dXJpID0gdXJpX3JlcGxhY2UodWQsIGZpbmQsIHJlcGxhY2UsIHJlcGxhY2VtZW50cywgbGQpCisgICAgICAgICAgICBpZiBub3QgbmV3dXJpIG9yIG5ld3VyaSBpbiB1cmlzIG9yIG5ld3VyaSA9PSBvcmlndWQudXJsOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG5vdCB0cnVzdGVkX25ldHdvcmsobGQsIG5ld3VyaSk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJNaXJyb3IgJXMgbm90IGluIHRoZSBsaXN0IG9mIHRydXN0ZWQgbmV0d29ya3MsIHNraXBwaW5nIiAlICAobmV3dXJpKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmV3dWQgPSBGZXRjaERhdGEobmV3dXJpLCBsZCkKKyAgICAgICAgICAgICAgICBuZXd1ZC5zZXR1cF9sb2NhbHBhdGgobGQpCisgICAgICAgICAgICBleGNlcHQgYmIuZmV0Y2gyLkJCRmV0Y2hFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIk1pcnJvciBmZXRjaCBmYWlsdXJlIGZvciB1cmwgJXMgKG9yaWdpbmFsIHVybDogJXMpIiAlIChuZXd1cmksIG9yaWd1ZC51cmwpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCBzdHIoZSkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIHNldHVwX2xvY2FscGF0aCBvZiBmaWxlOi8vIHVybHMgbWF5IGZhaWwsIHdlIHNob3VsZCBzdGlsbCBzZWUgCisgICAgICAgICAgICAgICAgICAgICMgaWYgbWlycm9ycyBvZiB0aGUgdXJsIGV4aXN0CisgICAgICAgICAgICAgICAgICAgIGFkZHVyaShuZXd1ZCwgdXJpcywgdWRzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgCisgICAgICAgICAgICB1cmlzLmFwcGVuZChuZXd1cmkpCisgICAgICAgICAgICB1ZHMuYXBwZW5kKG5ld3VkKQorCisgICAgICAgICAgICBhZGR1cmkobmV3dWQsIHVyaXMsIHVkcykKKworICAgIGFkZHVyaShvcmlndWQsIHVyaXMsIHVkcykKKworICAgIHJldHVybiB1cmlzLCB1ZHMKKworZGVmIHJlbmFtZV9iYWRfY2hlY2tzdW0odWQsIHN1ZmZpeCk6CisgICAgIiIiCisgICAgUmVuYW1lcyBmaWxlcyB0byBoYXZlIHN1ZmZpeCBmcm9tIHBhcmFtZXRlcgorICAgICIiIgorCisgICAgaWYgdWQubG9jYWxwYXRoIGlzIE5vbmU6CisgICAgICAgIHJldHVybgorCisgICAgbmV3X2xvY2FscGF0aCA9ICIlc19iYWQtY2hlY2tzdW1fJXMiICUgKHVkLmxvY2FscGF0aCwgc3VmZml4KQorICAgIGJiLndhcm4oIlJlbmFtaW5nICVzIHRvICVzIiAlICh1ZC5sb2NhbHBhdGgsIG5ld19sb2NhbHBhdGgpKQorICAgIGJiLnV0aWxzLm1vdmVmaWxlKHVkLmxvY2FscGF0aCwgbmV3X2xvY2FscGF0aCkKKworCitkZWYgdHJ5X21pcnJvcl91cmwoZmV0Y2gsIG9yaWd1ZCwgdWQsIGxkLCBjaGVjayA9IEZhbHNlKToKKyAgICAjIFJldHVybiBvZiBOb25lIG9yIGEgdmFsdWUgbWVhbnMgd2UncmUgZmluaXNoZWQKKyAgICAjIEZhbHNlIG1lYW5zIHRyeSBhbm90aGVyIHVybAorICAgIHRyeToKKyAgICAgICAgaWYgY2hlY2s6CisgICAgICAgICAgICBmb3VuZCA9IHVkLm1ldGhvZC5jaGVja3N0YXR1cyhmZXRjaCwgdWQsIGxkKQorICAgICAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBvcy5jaGRpcihsZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpKQorCisgICAgICAgIGlmIG5vdCB2ZXJpZnlfZG9uZXN0YW1wKHVkLCBsZCwgb3JpZ3VkKSBvciB1ZC5tZXRob2QubmVlZF91cGRhdGUodWQsIGxkKToKKyAgICAgICAgICAgIHVkLm1ldGhvZC5kb3dubG9hZCh1ZCwgbGQpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHVkLm1ldGhvZCwiYnVpbGRfbWlycm9yX2RhdGEiKToKKyAgICAgICAgICAgICAgICB1ZC5tZXRob2QuYnVpbGRfbWlycm9yX2RhdGEodWQsIGxkKQorCisgICAgICAgIGlmIG5vdCB1ZC5sb2NhbHBhdGggb3Igbm90IG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiB1ZC5sb2NhbHBhdGggPT0gb3JpZ3VkLmxvY2FscGF0aDoKKyAgICAgICAgICAgIHJldHVybiB1ZC5sb2NhbHBhdGgKKworICAgICAgICAjIFdlIG1heSBiZSBvYnRhaW5pbmcgYSBtaXJyb3IgdGFyYmFsbCB3aGljaCBuZWVkcyBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIHJlYWwgZmV0Y2hlcgorICAgICAgICAjIElmIHRoYXQgdGFyYmFsbCBpcyBhIGxvY2FsIGZpbGU6Ly8gd2UgbmVlZCB0byBwcm92aWRlIGEgc3ltbGluayB0byBpdAorICAgICAgICBkbGRpciA9IGxkLmdldFZhcigiRExfRElSIiwgVHJ1ZSkKKyAgICAgICAgaWYgb3JpZ3VkLm1pcnJvcnRhcmJhbGwgYW5kIG9zLnBhdGguYmFzZW5hbWUodWQubG9jYWxwYXRoKSA9PSBvcy5wYXRoLmJhc2VuYW1lKG9yaWd1ZC5taXJyb3J0YXJiYWxsKSBcCisgICAgICAgICAgICAgICAgYW5kIG9zLnBhdGguYmFzZW5hbWUodWQubG9jYWxwYXRoKSAhPSBvcy5wYXRoLmJhc2VuYW1lKG9yaWd1ZC5sb2NhbHBhdGgpOgorICAgICAgICAgICAgIyBDcmVhdGUgZG9uZXN0YW1wIGluIG9sZCBmb3JtYXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBhIHJlLWRvd25sb2FkCisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKHVkLmRvbmVzdGFtcCkpCisgICAgICAgICAgICBvcGVuKHVkLmRvbmVzdGFtcCwgJ3cnKS5jbG9zZSgpCisgICAgICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKGRsZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHVkLmxvY2FscGF0aCkpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGVzdCk6CisgICAgICAgICAgICAgICAgb3Muc3ltbGluayh1ZC5sb2NhbHBhdGgsIGRlc3QpCisgICAgICAgICAgICBpZiBub3QgdmVyaWZ5X2RvbmVzdGFtcChvcmlndWQsIGxkKSBvciBvcmlndWQubWV0aG9kLm5lZWRfdXBkYXRlKG9yaWd1ZCwgbGQpOgorICAgICAgICAgICAgICAgIG9yaWd1ZC5tZXRob2QuZG93bmxvYWQob3JpZ3VkLCBsZCkKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9yaWd1ZC5tZXRob2QsImJ1aWxkX21pcnJvcl9kYXRhIik6CisgICAgICAgICAgICAgICAgICAgIG9yaWd1ZC5tZXRob2QuYnVpbGRfbWlycm9yX2RhdGEob3JpZ3VkLCBsZCkKKyAgICAgICAgICAgIHJldHVybiB1ZC5sb2NhbHBhdGgKKyAgICAgICAgIyBPdGhlcndpc2UgdGhlIHJlc3VsdCBpcyBhIGxvY2FsIGZpbGU6Ly8gYW5kIHdlIHN5bWxpbmsgdG8gaXQKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9yaWd1ZC5sb2NhbHBhdGgpOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsob3JpZ3VkLmxvY2FscGF0aCk6CisgICAgICAgICAgICAgICAgIyBCcm9rZW4gc3ltYm9saWMgbGluaworICAgICAgICAgICAgICAgIG9zLnVubGluayhvcmlndWQubG9jYWxwYXRoKQorCisgICAgICAgICAgICBvcy5zeW1saW5rKHVkLmxvY2FscGF0aCwgb3JpZ3VkLmxvY2FscGF0aCkKKyAgICAgICAgdXBkYXRlX3N0YW1wKG9yaWd1ZCwgbGQpCisgICAgICAgIHJldHVybiB1ZC5sb2NhbHBhdGgKKworICAgIGV4Y2VwdCBiYi5mZXRjaDIuTmV0d29ya0FjY2VzczoKKyAgICAgICAgcmFpc2UKKworICAgIGV4Y2VwdCBiYi5mZXRjaDIuQkJGZXRjaEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICBpZiBpc2luc3RhbmNlKGUsIENoZWNrc3VtRXJyb3IpOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oIk1pcnJvciBjaGVja3N1bSBmYWlsdXJlIGZvciB1cmwgJXMgKG9yaWdpbmFsIHVybDogJXMpXG5DbGVhbmluZyBhbmQgdHJ5aW5nIGFnYWluLiIgJSAodWQudXJsLCBvcmlndWQudXJsKSkKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKHN0cihlKSkKKyAgICAgICAgICAgIHJlbmFtZV9iYWRfY2hlY2tzdW0odWQsIGUuY2hlY2tzdW0pCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLCBOb0NoZWNrc3VtRXJyb3IpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiTWlycm9yIGZldGNoIGZhaWx1cmUgZm9yIHVybCAlcyAob3JpZ2luYWwgdXJsOiAlcykiICUgKHVkLnVybCwgb3JpZ3VkLnVybCkpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgc3RyKGUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1ZC5tZXRob2QuY2xlYW4odWQsIGxkKQorICAgICAgICBleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgdHJ5X21pcnJvcnMoZmV0Y2gsIGQsIG9yaWd1ZCwgbWlycm9ycywgY2hlY2sgPSBGYWxzZSk6CisgICAgIiIiCisgICAgVHJ5IHRvIHVzZSBhIG1pcnJvcmVkIHZlcnNpb24gb2YgdGhlIHNvdXJjZXMuCisgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCBiZWZvcmUgdGhlIGZldGNoZXJzIGdvLgorCisgICAgZCBJcyBhIGJiLmRhdGEgaW5zdGFuY2UKKyAgICB1cmkgaXMgdGhlIG9yaWdpbmFsIHVyaSB3ZSdyZSB0cnlpbmcgdG8gZG93bmxvYWQKKyAgICBtaXJyb3JzIGlzIHRoZSBsaXN0IG9mIG1pcnJvcnMgd2UncmUgZ29pbmcgdG8gdHJ5CisgICAgIiIiCisgICAgbGQgPSBkLmNyZWF0ZUNvcHkoKQorCisgICAgdXJpcywgdWRzID0gYnVpbGRfbWlycm9ydXJpcyhvcmlndWQsIG1pcnJvcnMsIGxkKQorCisgICAgZm9yIGluZGV4LCB1cmkgaW4gZW51bWVyYXRlKHVyaXMpOgorICAgICAgICByZXQgPSB0cnlfbWlycm9yX3VybChmZXRjaCwgb3JpZ3VkLCB1ZHNbaW5kZXhdLCBsZCwgY2hlY2spCisgICAgICAgIGlmIHJldCAhPSBGYWxzZToKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICByZXR1cm4gTm9uZQorCitkZWYgdHJ1c3RlZF9uZXR3b3JrKGQsIHVybCk6CisgICAgIiIiCisgICAgVXNlIGEgdHJ1c3RlZCB1cmwgZHVyaW5nIGRvd25sb2FkIGlmIG5ldHdvcmtpbmcgaXMgZW5hYmxlZCBhbmQKKyAgICBCQl9BTExPV0VEX05FVFdPUktTIGlzIHNldCBnbG9iYWxseSBvciBmb3IgYSBzcGVjaWZpYyByZWNpcGUuCisgICAgTm90ZTogbW9kaWZpZXMgU1JDX1VSSSAmIG1pcnJvcnMuCisgICAgIiIiCisgICAgaWYgZC5nZXRWYXIoJ0JCX05PX05FVFdPUksnLCBUcnVlKSA9PSAiMSI6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBwa2duYW1lID0gZC5leHBhbmQoZC5nZXRWYXIoJ1BOJywgRmFsc2UpKQorICAgIHRydXN0ZWRfaG9zdHMgPSBkLmdldFZhckZsYWcoJ0JCX0FMTE9XRURfTkVUV09SS1MnLCBwa2duYW1lKQorCisgICAgaWYgbm90IHRydXN0ZWRfaG9zdHM6CisgICAgICAgIHRydXN0ZWRfaG9zdHMgPSBkLmdldFZhcignQkJfQUxMT1dFRF9ORVRXT1JLUycsIFRydWUpCisKKyAgICAjIE5vdCBlbmFibGVkLgorICAgIGlmIG5vdCB0cnVzdGVkX2hvc3RzOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgc2NoZW1lLCBuZXR3b3JrLCBwYXRoLCB1c2VyLCBwYXNzd2QsIHBhcmFtID0gZGVjb2RldXJsKHVybCkKKworICAgIGlmIG5vdCBuZXR3b3JrOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgbmV0d29yayA9IG5ldHdvcmsubG93ZXIoKQorCisgICAgZm9yIGhvc3QgaW4gdHJ1c3RlZF9ob3N0cy5zcGxpdCgiICIpOgorICAgICAgICBob3N0ID0gaG9zdC5sb3dlcigpCisgICAgICAgIGlmIGhvc3Quc3RhcnRzd2l0aCgiKi4iKSBhbmQgKCIuIiArIG5ldHdvcmspLmVuZHN3aXRoKGhvc3RbMTpdKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGhvc3QgPT0gbmV0d29yazoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIHNyY3Jldl9pbnRlcm5hbF9oZWxwZXIodWQsIGQsIG5hbWUpOgorICAgICIiIgorICAgIFJldHVybjoKKyAgICAgICAgYSkgYSBzb3VyY2UgcmV2aXNpb24gaWYgc3BlY2lmaWVkCisgICAgICAgIGIpIGxhdGVzdCByZXZpc2lvbiBpZiBTUkNSRVY9IkFVVE9JTkMiCisgICAgICAgIGMpIE5vbmUgaWYgbm90IHNwZWNpZmllZAorICAgICIiIgorCisgICAgc3JjcmV2ID0gTm9uZQorICAgIHBuID0gZC5nZXRWYXIoIlBOIiwgVHJ1ZSkKKyAgICBhdHRlbXB0cyA9IFtdCisgICAgaWYgbmFtZSAhPSAnJyBhbmQgcG46CisgICAgICAgIGF0dGVtcHRzLmFwcGVuZCgiU1JDUkVWXyVzX3BuLSVzIiAlIChuYW1lLCBwbikpCisgICAgaWYgbmFtZSAhPSAnJzoKKyAgICAgICAgYXR0ZW1wdHMuYXBwZW5kKCJTUkNSRVZfJXMiICUgbmFtZSkKKyAgICBpZiBwbjoKKyAgICAgICAgYXR0ZW1wdHMuYXBwZW5kKCJTUkNSRVZfcG4tJXMiICUgcG4pCisgICAgYXR0ZW1wdHMuYXBwZW5kKCJTUkNSRVYiKQorCisgICAgZm9yIGEgaW4gYXR0ZW1wdHM6CisgICAgICAgIHNyY3JldiA9IGQuZ2V0VmFyKGEsIFRydWUpICAgICAgICAgICAgICAKKyAgICAgICAgaWYgc3JjcmV2IGFuZCBzcmNyZXYgIT0gIklOVkFMSUQiOgorICAgICAgICAgICAgYnJlYWsKKworICAgIGlmICdyZXYnIGluIHVkLnBhcm0gYW5kICd0YWcnIGluIHVkLnBhcm06CisgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlBsZWFzZSBzcGVjaWZ5IGEgO3Jldj0gcGFyYW1ldGVyIG9yIGEgO3RhZz0gcGFyYW1ldGVyIGluIHRoZSB1cmwgJXMgYnV0IG5vdCBib3RoLiIgJSAodWQudXJsKSkKKworICAgIGlmICdyZXYnIGluIHVkLnBhcm0gb3IgJ3RhZycgaW4gdWQucGFybToKKyAgICAgICAgaWYgJ3JldicgaW4gdWQucGFybToKKyAgICAgICAgICAgIHBhcm1yZXYgPSB1ZC5wYXJtWydyZXYnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFybXJldiA9IHVkLnBhcm1bJ3RhZyddCisgICAgICAgIGlmIHNyY3JldiA9PSAiSU5WQUxJRCIgb3Igbm90IHNyY3JldjoKKyAgICAgICAgICAgIHJldHVybiBwYXJtcmV2CisgICAgICAgIGlmIHNyY3JldiAhPSBwYXJtcmV2OgorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiQ29uZmxpY3RpbmcgcmV2aXNpb25zICglcyBmcm9tIFNSQ1JFViBhbmQgJXMgZnJvbSB0aGUgdXJsKSBmb3VuZCwgcGxlYXNlIHNwY2lmeSBvbmUgdmFsaWQgdmFsdWUiICUgKHNyY3JldiwgcGFybXJldikpCisgICAgICAgIHJldHVybiBwYXJtcmV2CisKKyAgICBpZiBzcmNyZXYgPT0gIklOVkFMSUQiIG9yIG5vdCBzcmNyZXY6CisgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlBsZWFzZSBzZXQgYSB2YWxpZCBTUkNSRVYgZm9yIHVybCAlcyAocG9zc2libGUga2V5IG5hbWVzIGFyZSAlcywgb3IgdXNlIGEgO3Jldj1YIFVSTCBwYXJhbWV0ZXIpIiAlIChzdHIoYXR0ZW1wdHMpLCB1ZC51cmwpLCB1ZC51cmwpCisgICAgaWYgc3JjcmV2ID09ICJBVVRPSU5DIjoKKyAgICAgICAgc3JjcmV2ID0gdWQubWV0aG9kLmxhdGVzdF9yZXZpc2lvbih1ZCwgZCwgbmFtZSkKKworICAgIHJldHVybiBzcmNyZXYKKworZGVmIGdldF9jaGVja3N1bV9maWxlX2xpc3QoZCk6CisgICAgIiIiIEdldCBhIGxpc3Qgb2YgZmlsZXMgY2hlY2tzdW0gaW4gU1JDX1VSSQorCisgICAgUmV0dXJucyB0aGUgcmVzb2x2ZWQgbG9jYWwgcGF0aHMgb2YgYWxsIGxvY2FsIGZpbGUgZW50cmllcyBpbgorICAgIFNSQ19VUkkgYXMgYSBzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nCisgICAgIiIiCisgICAgZmV0Y2ggPSBGZXRjaChbXSwgZCwgY2FjaGUgPSBGYWxzZSwgbG9jYWxvbmx5ID0gVHJ1ZSkKKworICAgIGRsX2RpciA9IGQuZ2V0VmFyKCdETF9ESVInLCBUcnVlKQorICAgIGZpbGVsaXN0ID0gW10KKyAgICBmb3IgdSBpbiBmZXRjaC51cmxzOgorICAgICAgICB1ZCA9IGZldGNoLnVkW3VdCisKKyAgICAgICAgaWYgdWQgYW5kIGlzaW5zdGFuY2UodWQubWV0aG9kLCBsb2NhbC5Mb2NhbCk6CisgICAgICAgICAgICBwYXRocyA9IHVkLm1ldGhvZC5sb2NhbHBhdGhzKHVkLCBkKQorICAgICAgICAgICAgZm9yIGYgaW4gcGF0aHM6CisgICAgICAgICAgICAgICAgcHRoID0gdWQuZGVjb2RlZHVybAorICAgICAgICAgICAgICAgIGlmICcqJyBpbiBwdGg6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKGYpLCBwdGgpCisgICAgICAgICAgICAgICAgaWYgZi5zdGFydHN3aXRoKGRsX2Rpcik6CisgICAgICAgICAgICAgICAgICAgICMgVGhlIGxvY2FsIGZldGNoZXIncyBiZWhhdmlvdXIgaXMgdG8gcmV0dXJuIGEgcGF0aCB1bmRlciBETF9ESVIgaWYgaXQgY291bGRuJ3QgZmluZCB0aGUgZmlsZSBhbnl3aGVyZSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgYmIud2FybigiR2V0dGluZyBjaGVja3N1bSBmb3IgJXMgU1JDX1VSSSBlbnRyeSAlczogZmlsZSBub3QgZm91bmQgZXhjZXB0IGluIERMX0RJUiIgJSAoZC5nZXRWYXIoJ1BOJywgVHJ1ZSksIG9zLnBhdGguYmFzZW5hbWUoZikpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYmIud2FybigiVW5hYmxlIHRvIGdldCBjaGVja3N1bSBmb3IgJXMgU1JDX1VSSSBlbnRyeSAlczogZmlsZSBjb3VsZCBub3QgYmUgZm91bmQiICUgKGQuZ2V0VmFyKCdQTicsIFRydWUpLCBvcy5wYXRoLmJhc2VuYW1lKGYpKSkKKyAgICAgICAgICAgICAgICBmaWxlbGlzdC5hcHBlbmQoZiArICI6IiArIHN0cihvcy5wYXRoLmV4aXN0cyhmKSkpCisKKyAgICByZXR1cm4gIiAiLmpvaW4oZmlsZWxpc3QpCisKK2RlZiBnZXRfZmlsZV9jaGVja3N1bXMoZmlsZWxpc3QsIHBuKToKKyAgICAiIiJHZXQgYSBsaXN0IG9mIHRoZSBjaGVja3N1bXMgZm9yIGEgbGlzdCBvZiBsb2NhbCBmaWxlcworCisgICAgUmV0dXJucyB0aGUgY2hlY2tzdW1zIGZvciBhIGxpc3Qgb2YgbG9jYWwgZmlsZXMsIGNhY2hpbmcgdGhlIHJlc3VsdHMgYXMKKyAgICBpdCBwcm9jZWVkcworCisgICAgIiIiCisKKyAgICBkZWYgY2hlY2tzdW1fZmlsZShmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2hlY2tzdW0gPSBfY2hlY2tzdW1fY2FjaGUuZ2V0X2NoZWNrc3VtKGYpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBiYi53YXJuKCJVbmFibGUgdG8gZ2V0IGNoZWNrc3VtIGZvciAlcyBTUkNfVVJJIGVudHJ5ICVzOiAlcyIgJSAocG4sIG9zLnBhdGguYmFzZW5hbWUoZiksIGUpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIGNoZWNrc3VtCisKKyAgICBkZWYgY2hlY2tzdW1fZGlyKHB0aCk6CisgICAgICAgICMgSGFuZGxlIGRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5CisgICAgICAgIGRpcmNoZWNrc3VtcyA9IFtdCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHB0aCk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBmdWxscHRoID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCisgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bV9maWxlKGZ1bGxwdGgpCisgICAgICAgICAgICAgICAgaWYgY2hlY2tzdW06CisgICAgICAgICAgICAgICAgICAgIGRpcmNoZWNrc3Vtcy5hcHBlbmQoKGZ1bGxwdGgsIGNoZWNrc3VtKSkKKyAgICAgICAgcmV0dXJuIGRpcmNoZWNrc3VtcworCisgICAgY2hlY2tzdW1zID0gW10KKyAgICBmb3IgcHRoIGluIGZpbGVsaXN0LnNwbGl0KCk6CisgICAgICAgIGV4aXN0ID0gcHRoLnNwbGl0KCI6IilbMV0KKyAgICAgICAgaWYgZXhpc3QgPT0gIkZhbHNlIjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHB0aCA9IHB0aC5zcGxpdCgiOiIpWzBdCisgICAgICAgIGlmICcqJyBpbiBwdGg6CisgICAgICAgICAgICAjIEhhbmRsZSBnbG9icworICAgICAgICAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKHB0aCk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmKToKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1zLmV4dGVuZChjaGVja3N1bV9kaXIoZikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bV9maWxlKGYpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrc3Vtcy5hcHBlbmQoKGYsIGNoZWNrc3VtKSkKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHB0aCk6CisgICAgICAgICAgICBjaGVja3N1bXMuZXh0ZW5kKGNoZWNrc3VtX2RpcihwdGgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bV9maWxlKHB0aCkKKyAgICAgICAgICAgIGNoZWNrc3Vtcy5hcHBlbmQoKHB0aCwgY2hlY2tzdW0pKQorCisgICAgY2hlY2tzdW1zLnNvcnQoa2V5PW9wZXJhdG9yLml0ZW1nZXR0ZXIoMSkpCisgICAgcmV0dXJuIGNoZWNrc3VtcworCisKK2NsYXNzIEZldGNoRGF0YShvYmplY3QpOgorICAgICIiIgorICAgIEEgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyB0aGUgZmV0Y2hlciBzdGF0ZSBmb3IgYSBnaXZlbiBVUkkuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgZCwgbG9jYWxvbmx5ID0gRmFsc2UpOgorICAgICAgICAjIGxvY2FscGF0aCBpcyB0aGUgbG9jYXRpb24gb2YgYSBkb3dubG9hZGVkIHJlc3VsdC4gSWYgbm90IHNldCwgdGhlIGZpbGUgaXMgbG9jYWwuCisgICAgICAgIHNlbGYuZG9uZXN0YW1wID0gTm9uZQorICAgICAgICBzZWxmLmxvY2FsZmlsZSA9ICIiCisgICAgICAgIHNlbGYubG9jYWxwYXRoID0gTm9uZQorICAgICAgICBzZWxmLmxvY2tmaWxlID0gTm9uZQorICAgICAgICBzZWxmLm1pcnJvcnRhcmJhbGwgPSBOb25lCisgICAgICAgIHNlbGYuYmFzZW5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuYmFzZXBhdGggPSBOb25lCisgICAgICAgIChzZWxmLnR5cGUsIHNlbGYuaG9zdCwgc2VsZi5wYXRoLCBzZWxmLnVzZXIsIHNlbGYucHN3ZCwgc2VsZi5wYXJtKSA9IGRlY29kZXVybChkYXRhLmV4cGFuZCh1cmwsIGQpKQorICAgICAgICBzZWxmLmRhdGUgPSBzZWxmLmdldFNSQ0RhdGUoZCkKKyAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgaWYgbm90IHNlbGYudXNlciBhbmQgInVzZXIiIGluIHNlbGYucGFybToKKyAgICAgICAgICAgIHNlbGYudXNlciA9IHNlbGYucGFybVsidXNlciJdCisgICAgICAgIGlmIG5vdCBzZWxmLnBzd2QgYW5kICJwc3dkIiBpbiBzZWxmLnBhcm06CisgICAgICAgICAgICBzZWxmLnBzd2QgPSBzZWxmLnBhcm1bInBzd2QiXQorICAgICAgICBzZWxmLnNldHVwID0gRmFsc2UKKworICAgICAgICBpZiAibmFtZSIgaW4gc2VsZi5wYXJtOgorICAgICAgICAgICAgc2VsZi5tZDVfbmFtZSA9ICIlcy5tZDVzdW0iICUgc2VsZi5wYXJtWyJuYW1lIl0KKyAgICAgICAgICAgIHNlbGYuc2hhMjU2X25hbWUgPSAiJXMuc2hhMjU2c3VtIiAlIHNlbGYucGFybVsibmFtZSJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1kNV9uYW1lID0gIm1kNXN1bSIKKyAgICAgICAgICAgIHNlbGYuc2hhMjU2X25hbWUgPSAic2hhMjU2c3VtIgorICAgICAgICBpZiBzZWxmLm1kNV9uYW1lIGluIHNlbGYucGFybToKKyAgICAgICAgICAgIHNlbGYubWQ1X2V4cGVjdGVkID0gc2VsZi5wYXJtW3NlbGYubWQ1X25hbWVdCisgICAgICAgIGVsaWYgc2VsZi50eXBlIG5vdCBpbiBbImh0dHAiLCAiaHR0cHMiLCAiZnRwIiwgImZ0cHMiLCAic2Z0cCJdOgorICAgICAgICAgICAgc2VsZi5tZDVfZXhwZWN0ZWQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1kNV9leHBlY3RlZCA9IGQuZ2V0VmFyRmxhZygiU1JDX1VSSSIsIHNlbGYubWQ1X25hbWUpCisgICAgICAgIGlmIHNlbGYuc2hhMjU2X25hbWUgaW4gc2VsZi5wYXJtOgorICAgICAgICAgICAgc2VsZi5zaGEyNTZfZXhwZWN0ZWQgPSBzZWxmLnBhcm1bc2VsZi5zaGEyNTZfbmFtZV0KKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgbm90IGluIFsiaHR0cCIsICJodHRwcyIsICJmdHAiLCAiZnRwcyIsICJzZnRwIl06CisgICAgICAgICAgICBzZWxmLnNoYTI1Nl9leHBlY3RlZCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2hhMjU2X2V4cGVjdGVkID0gZC5nZXRWYXJGbGFnKCJTUkNfVVJJIiwgc2VsZi5zaGEyNTZfbmFtZSkKKyAgICAgICAgc2VsZi5pZ25vcmVfY2hlY2tzdW1zID0gRmFsc2UKKworICAgICAgICBzZWxmLm5hbWVzID0gc2VsZi5wYXJtLmdldCgibmFtZSIsJ2RlZmF1bHQnKS5zcGxpdCgnLCcpCisKKyAgICAgICAgc2VsZi5tZXRob2QgPSBOb25lCisgICAgICAgIGZvciBtIGluIG1ldGhvZHM6CisgICAgICAgICAgICBpZiBtLnN1cHBvcnRzKHNlbGYsIGQpOgorICAgICAgICAgICAgICAgIHNlbGYubWV0aG9kID0gbQorICAgICAgICAgICAgICAgIGJyZWFrICAgICAgICAgICAgICAgIAorCisgICAgICAgIGlmIG5vdCBzZWxmLm1ldGhvZDoKKyAgICAgICAgICAgIHJhaXNlIE5vTWV0aG9kRXJyb3IodXJsKQorCisgICAgICAgIGlmIGxvY2Fsb25seSBhbmQgbm90IGlzaW5zdGFuY2Uoc2VsZi5tZXRob2QsIGxvY2FsLkxvY2FsKToKKyAgICAgICAgICAgIHJhaXNlIE5vbkxvY2FsTWV0aG9kKCkKKworICAgICAgICBpZiBzZWxmLnBhcm0uZ2V0KCJwcm90byIsIE5vbmUpIGFuZCAicHJvdG9jb2wiIG5vdCBpbiBzZWxmLnBhcm06CisgICAgICAgICAgICBsb2dnZXIud2FybignQ29uc2lkZXIgdXBkYXRpbmcgJXMgcmVjaXBlIHRvIHVzZSAicHJvdG9jb2wiIG5vdCAicHJvdG8iIGluIFNSQ19VUkkuJywgZC5nZXRWYXIoJ1BOJywgVHJ1ZSkpCisgICAgICAgICAgICBzZWxmLnBhcm1bInByb3RvY29sIl0gPSBzZWxmLnBhcm0uZ2V0KCJwcm90byIsIE5vbmUpCisKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLm1ldGhvZCwgInVybGRhdGFfaW5pdCIpOgorICAgICAgICAgICAgc2VsZi5tZXRob2QudXJsZGF0YV9pbml0KHNlbGYsIGQpCisKKyAgICAgICAgaWYgImxvY2FscGF0aCIgaW4gc2VsZi5wYXJtOgorICAgICAgICAgICAgIyBpZiB1c2VyIHNldHMgbG9jYWxwYXRoIGZvciBmaWxlLCB1c2UgaXQgaW5zdGVhZC4KKyAgICAgICAgICAgIHNlbGYubG9jYWxwYXRoID0gc2VsZi5wYXJtWyJsb2NhbHBhdGgiXQorICAgICAgICAgICAgc2VsZi5iYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5sb2NhbHBhdGgpCisgICAgICAgIGVsaWYgc2VsZi5sb2NhbGZpbGU6CisgICAgICAgICAgICBzZWxmLmxvY2FscGF0aCA9IHNlbGYubWV0aG9kLmxvY2FscGF0aChzZWxmLCBkKQorCisgICAgICAgIGRsZGlyID0gZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpCisgICAgICAgICMgTm90ZTogLmRvbmUgYW5kIC5sb2NrIGZpbGVzIHNob3VsZCBhbHdheXMgYmUgaW4gRExfRElSIHdoZXJlYXMgbG9jYWxwYXRoIG1heSBub3QgYmUuCisgICAgICAgIGlmIHNlbGYubG9jYWxwYXRoIGFuZCBzZWxmLmxvY2FscGF0aC5zdGFydHN3aXRoKGRsZGlyKToKKyAgICAgICAgICAgIGJhc2VwYXRoID0gc2VsZi5sb2NhbHBhdGgKKyAgICAgICAgZWxpZiBzZWxmLmxvY2FscGF0aDoKKyAgICAgICAgICAgIGJhc2VwYXRoID0gZGxkaXIgKyBvcy5zZXAgKyBvcy5wYXRoLmJhc2VuYW1lKHNlbGYubG9jYWxwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZXBhdGggPSBkbGRpciArIG9zLnNlcCArIChzZWxmLmJhc2VwYXRoIG9yIHNlbGYuYmFzZW5hbWUpCisgICAgICAgIHNlbGYuZG9uZXN0YW1wID0gYmFzZXBhdGggKyAnLmRvbmUnCisgICAgICAgIHNlbGYubG9ja2ZpbGUgPSBiYXNlcGF0aCArICcubG9jaycKKworICAgIGRlZiBzZXR1cF9yZXZpc29ucyhzZWxmLCBkKToKKyAgICAgICAgc2VsZi5yZXZpc2lvbnMgPSB7fQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLm5hbWVzOgorICAgICAgICAgICAgc2VsZi5yZXZpc2lvbnNbbmFtZV0gPSBzcmNyZXZfaW50ZXJuYWxfaGVscGVyKHNlbGYsIGQsIG5hbWUpCisKKyAgICAgICAgIyBhZGQgY29tcGF0aWJpbGl0eSBjb2RlIGZvciBub24gbmFtZSBzcGVjaWZpZWQgY2FzZQorICAgICAgICBpZiBsZW4oc2VsZi5uYW1lcykgPT0gMToKKyAgICAgICAgICAgIHNlbGYucmV2aXNpb24gPSBzZWxmLnJldmlzaW9uc1tzZWxmLm5hbWVzWzBdXQorCisgICAgZGVmIHNldHVwX2xvY2FscGF0aChzZWxmLCBkKToKKyAgICAgICAgaWYgbm90IHNlbGYubG9jYWxwYXRoOgorICAgICAgICAgICAgc2VsZi5sb2NhbHBhdGggPSBzZWxmLm1ldGhvZC5sb2NhbHBhdGgoc2VsZiwgZCkKKworICAgIGRlZiBnZXRTUkNEYXRlKHNlbGYsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBTUkMgRGF0ZSBmb3IgdGhlIGNvbXBvbmVudAorCisgICAgICAgIGQgdGhlIGJiLmRhdGEgbW9kdWxlCisgICAgICAgICIiIgorICAgICAgICBpZiAic3JjZGF0ZSIgaW4gc2VsZi5wYXJtOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFybVsnc3JjZGF0ZSddCisKKyAgICAgICAgcG4gPSBkLmdldFZhcigiUE4iLCBUcnVlKQorCisgICAgICAgIGlmIHBuOgorICAgICAgICAgICAgcmV0dXJuIGQuZ2V0VmFyKCJTUkNEQVRFXyVzIiAlIHBuLCBUcnVlKSBvciBkLmdldFZhcigiU1JDREFURSIsIFRydWUpIG9yIGQuZ2V0VmFyKCJEQVRFIiwgVHJ1ZSkKKworICAgICAgICByZXR1cm4gZC5nZXRWYXIoIlNSQ0RBVEUiLCBUcnVlKSBvciBkLmdldFZhcigiREFURSIsIFRydWUpCisKK2NsYXNzIEZldGNoTWV0aG9kKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgJ2ZldGNoJ2luZyBkYXRhIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJscz1Ob25lKToKKyAgICAgICAgc2VsZi51cmxzID0gW10KKworICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiB0aGlzIGZldGNoIGNsYXNzIHN1cHBvcnRzIGEgZ2l2ZW4gdXJsLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBsb2NhbHBhdGgoc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGxvY2FsIGZpbGVuYW1lIG9mIGEgZ2l2ZW4gdXJsIGFzc3VtaW5nIGEgc3VjY2Vzc2Z1bCBmZXRjaC4KKyAgICAgICAgQ2FuIGFsc28gc2V0dXAgdmFyaWFibGVzIGluIHVybGRhdGEgZm9yIHVzZSBpbiBnbyAoc2F2aW5nIGNvZGUgZHVwbGljYXRpb24KKyAgICAgICAgYW5kIGR1cGxpY2F0ZSBjb2RlIGV4ZWN1dGlvbikKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZGF0YS5nZXRWYXIoIkRMX0RJUiIsIGQsIFRydWUpLCB1cmxkYXRhLmxvY2FsZmlsZSkKKworICAgIGRlZiBzdXBwb3J0c19jaGVja3N1bShzZWxmLCB1cmxkYXRhKToKKyAgICAgICAgIiIiCisgICAgICAgIElzIGxvY2FscGF0aCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBjaGVja3N1bT8KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBXZSBjYW5ub3QgY29tcHV0ZSBjaGVja3N1bXMgZm9yIGRpcmVjdG9yaWVzCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodXJsZGF0YS5sb2NhbHBhdGgpID09IFRydWU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgdXJsZGF0YS5sb2NhbHBhdGguZmluZCgiKiIpICE9IC0xOgorICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVjb21tZW5kc19jaGVja3N1bShzZWxmLCB1cmxkYXRhKToKKyAgICAgICAgIiIiCisgICAgICAgIElzIHRoZSBiYWNrZW5kIG9uIHdoZXJlIGNoZWNrc3VtbWluZyBpcyByZWNvbW1lbmRlZCAoc2hvdWxkIHdhcm5pbmdzIAorICAgICAgICBiZSBkaXNwbGF5ZWQgaWYgdGhlcmUgaXMgbm8gY2hlY2tzdW0pPworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX3N0cmlwX2xlYWRpbmdfc2xhc2hlcyhzZWxmLCByZWxwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZSBsZWFkaW5nIHNsYXNoIGFzIG9zLnBhdGguam9pbiBjYW4ndCBjb3BlCisgICAgICAgICIiIgorICAgICAgICB3aGlsZSBvcy5wYXRoLmlzYWJzKHJlbHBhdGgpOgorICAgICAgICAgICAgcmVscGF0aCA9IHJlbHBhdGhbMTpdCisgICAgICAgIHJldHVybiByZWxwYXRoCisKKyAgICBkZWYgc2V0VXJscyhzZWxmLCB1cmxzKToKKyAgICAgICAgc2VsZi5fX3VybHMgPSB1cmxzCisKKyAgICBkZWYgZ2V0VXJscyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX191cmxzCisKKyAgICB1cmxzID0gcHJvcGVydHkoZ2V0VXJscywgc2V0VXJscywgTm9uZSwgIlVybHMgcHJvcGVydHkiKQorCisgICAgZGVmIG5lZWRfdXBkYXRlKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcmNlIGEgZmV0Y2gsIGV2ZW4gaWYgbG9jYWxwYXRoIGV4aXN0cz8KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdXBwb3J0c19zcmNyZXYoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgZmV0Y2hlciBzdXBwb3J0cyBhdXRvIHNvdXJjZSByZXZpc2lvbnMgKFNSQ1JFVikKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgRmV0Y2ggdXJscworICAgICAgICBBc3N1bWVzIGxvY2FscGF0aCB3YXMgY2FsbGVkIGZpcnN0CisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb01ldGhvZEVycm9yKHVybCkKKworICAgIGRlZiB1bnBhY2soc2VsZiwgdXJsZGF0YSwgcm9vdGRpciwgZGF0YSk6CisgICAgICAgIGl0ZXJhdGUgPSBGYWxzZQorICAgICAgICBmaWxlID0gdXJsZGF0YS5sb2NhbHBhdGgKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB1bnBhY2sgPSBiYi51dGlscy50b19ib29sZWFuKHVybGRhdGEucGFybS5nZXQoJ3VucGFjaycpLCBUcnVlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CisgICAgICAgICAgICBiYi5mYXRhbCgiSW52YWxpZCB2YWx1ZSBmb3IgJ3VucGFjaycgcGFyYW1ldGVyIGZvciAlczogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgIChmaWxlLCB1cmxkYXRhLnBhcm0uZ2V0KCd1bnBhY2snKSkpCisKKyAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQorICAgICAgICBpZiBleHQgaW4gWycuZ3onLCAnLmJ6MicsICcuWicsICcueHonLCAnLmx6J106CisgICAgICAgICAgICBlZmlsZSA9IG9zLnBhdGguam9pbihyb290ZGlyLCBvcy5wYXRoLmJhc2VuYW1lKGJhc2UpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZWZpbGUgPSBmaWxlCisgICAgICAgIGNtZCA9IE5vbmUKKworICAgICAgICBpZiB1bnBhY2s6CisgICAgICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcudGFyJyk6CisgICAgICAgICAgICAgICAgY21kID0gJ3RhciB4IC0tbm8tc2FtZS1vd25lciAtZiAlcycgJSBmaWxlCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy50Z3onKSBvciBmaWxlLmVuZHN3aXRoKCcudGFyLmd6Jykgb3IgZmlsZS5lbmRzd2l0aCgnLnRhci5aJyk6CisgICAgICAgICAgICAgICAgY21kID0gJ3RhciB4eiAtLW5vLXNhbWUtb3duZXIgLWYgJXMnICUgZmlsZQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcudGJ6Jykgb3IgZmlsZS5lbmRzd2l0aCgnLnRiejInKSBvciBmaWxlLmVuZHN3aXRoKCcudGFyLmJ6MicpOgorICAgICAgICAgICAgICAgIGNtZCA9ICdiemlwMiAtZGMgJXMgfCB0YXIgeCAtLW5vLXNhbWUtb3duZXIgLWYgLScgJSBmaWxlCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy5neicpIG9yIGZpbGUuZW5kc3dpdGgoJy5aJykgb3IgZmlsZS5lbmRzd2l0aCgnLnonKToKKyAgICAgICAgICAgICAgICBjbWQgPSAnZ3ppcCAtZGMgJXMgPiAlcycgJSAoZmlsZSwgZWZpbGUpCisgICAgICAgICAgICBlbGlmIGZpbGUuZW5kc3dpdGgoJy5iejInKToKKyAgICAgICAgICAgICAgICBjbWQgPSAnYnppcDIgLWRjICVzID4gJXMnICUgKGZpbGUsIGVmaWxlKQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcudGFyLnh6Jyk6CisgICAgICAgICAgICAgICAgY21kID0gJ3h6IC1kYyAlcyB8IHRhciB4IC0tbm8tc2FtZS1vd25lciAtZiAtJyAlIGZpbGUKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLnh6Jyk6CisgICAgICAgICAgICAgICAgY21kID0gJ3h6IC1kYyAlcyA+ICVzJyAlIChmaWxlLCBlZmlsZSkKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLnRhci5seicpOgorICAgICAgICAgICAgICAgIGNtZCA9ICdsemlwIC1kYyAlcyB8IHRhciB4IC0tbm8tc2FtZS1vd25lciAtZiAtJyAlIGZpbGUKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLmx6Jyk6CisgICAgICAgICAgICAgICAgY21kID0gJ2x6aXAgLWRjICVzID4gJXMnICUgKGZpbGUsIGVmaWxlKQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcuemlwJykgb3IgZmlsZS5lbmRzd2l0aCgnLmphcicpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZG9zID0gYmIudXRpbHMudG9fYm9vbGVhbih1cmxkYXRhLnBhcm0uZ2V0KCdkb3MnKSwgRmFsc2UpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgICAgICBiYi5mYXRhbCgiSW52YWxpZCB2YWx1ZSBmb3IgJ2RvcycgcGFyYW1ldGVyIGZvciAlczogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGUsIHVybGRhdGEucGFybS5nZXQoJ2RvcycpKSkKKyAgICAgICAgICAgICAgICBjbWQgPSAndW56aXAgLXEgLW8nCisgICAgICAgICAgICAgICAgaWYgZG9zOgorICAgICAgICAgICAgICAgICAgICBjbWQgPSAnJXMgLWEnICUgY21kCisgICAgICAgICAgICAgICAgY21kID0gIiVzICclcyciICUgKGNtZCwgZmlsZSkKKyAgICAgICAgICAgIGVsaWYgZmlsZS5lbmRzd2l0aCgnLnJwbScpIG9yIGZpbGUuZW5kc3dpdGgoJy5zcnBtJyk6CisgICAgICAgICAgICAgICAgaWYgJ2V4dHJhY3QnIGluIHVybGRhdGEucGFybToKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrX2ZpbGUgPSB1cmxkYXRhLnBhcm0uZ2V0KCdleHRyYWN0JykKKyAgICAgICAgICAgICAgICAgICAgY21kID0gJ3JwbTJjcGlvLnNoICVzIHwgY3BpbyAtaWQgJXMnICUgKGZpbGUsIHVucGFja19maWxlKQorICAgICAgICAgICAgICAgICAgICBpdGVyYXRlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpdGVyYXRlX2ZpbGUgPSB1bnBhY2tfZmlsZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNtZCA9ICdycG0yY3Bpby5zaCAlcyB8IGNwaW8gLWlkJyAlIChmaWxlKQorICAgICAgICAgICAgZWxpZiBmaWxlLmVuZHN3aXRoKCcuZGViJykgb3IgZmlsZS5lbmRzd2l0aCgnLmlwaycpOgorICAgICAgICAgICAgICAgIGNtZCA9ICdhciAtcCAlcyBkYXRhLnRhci5neiB8IHpjYXQgfCB0YXIgLS1uby1zYW1lLW93bmVyIC14cGYgLScgJSBmaWxlCisKKyAgICAgICAgaWYgbm90IHVucGFjayBvciBub3QgY21kOgorICAgICAgICAgICAgIyBJZiBmaWxlID09IGRlc3QsIHRoZW4gYXZvaWQgYW55IGNvcGllcywgYXMgd2UgYWxyZWFkeSBwdXQgdGhlIGZpbGUgaW50byBkZXN0IQorICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihyb290ZGlyLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGUpKQorICAgICAgICAgICAgaWYgKGZpbGUgIT0gZGVzdCkgYW5kIG5vdCAob3MucGF0aC5leGlzdHMoZGVzdCkgYW5kIG9zLnBhdGguc2FtZWZpbGUoZmlsZSwgZGVzdCkpOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZSk6CisgICAgICAgICAgICAgICAgICAgICMgSWYgZm9yIGV4YW1wbGUgd2UncmUgYXNrZWQgdG8gY29weSBmaWxlOi8vZm9vL2Jhciwgd2UgbmVlZCB0byB1bnBhY2sgdGhlIHJlc3VsdCBpbnRvIGZvby9iYXIKKyAgICAgICAgICAgICAgICAgICAgYmFzZXBhdGggPSBnZXRhdHRyKHVybGRhdGEsICJiYXNlcGF0aCIsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIgPSAiLiIKKyAgICAgICAgICAgICAgICAgICAgaWYgYmFzZXBhdGggYW5kIGJhc2VwYXRoLmVuZHN3aXRoKCIvIik6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlcGF0aCA9IGJhc2VwYXRoLnJzdHJpcCgiLyIpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgYmFzZXBhdGg6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlcGF0aCA9IG9zLnBhdGguZGlybmFtZShiYXNlcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgaWYgYmFzZXBhdGggYW5kIGJhc2VwYXRoLmZpbmQoIi8iKSAhPSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIgPSBiYXNlcGF0aFs6YmFzZXBhdGgucmZpbmQoJy8nKV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIgPSBkZXN0ZGlyLnN0cmlwKCcvJykKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVzdGRpciAhPSAiLiIgYW5kIG5vdCBvcy5hY2Nlc3MoIiVzLyVzIiAlIChyb290ZGlyLCBkZXN0ZGlyKSwgb3MuRl9PSyk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycygiJXMvJXMiICUgKHJvb3RkaXIsIGRlc3RkaXIpKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAnY3AgLWZwUFIgJXMgJXMvJXMvJyAlIChmaWxlLCByb290ZGlyLCBkZXN0ZGlyKQorICAgICAgICAgICAgICAgICAgICAjY21kID0gJ3RhciAtY2YgLSAtQyAiJWQiIC1wcyAuIHwgdGFyIC14ZiAtIC1DICIlcy8lcy8iJyAlIChmaWxlLCByb290ZGlyLCBkZXN0ZGlyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVGhlICJkZXN0ZGlyIiBoYW5kbGluZyB3YXMgc3BlY2lmaWNhbGx5IGRvbmUgZm9yIEZJTEVTUEFUSAorICAgICAgICAgICAgICAgICAgICAjIGl0ZW1zLiAgU28sIG9ubHkgZG8gc28gZm9yIGZpbGU6Ly8gZW50cmllcy4KKyAgICAgICAgICAgICAgICAgICAgaWYgdXJsZGF0YS50eXBlID09ICJmaWxlIiBhbmQgdXJsZGF0YS5wYXRoLmZpbmQoIi8iKSAhPSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzdGRpciA9IHVybGRhdGEucGF0aC5yc3BsaXQoIi8iLCAxKVswXQorICAgICAgICAgICAgICAgICAgICAgICBpZiB1cmxkYXRhLnBhcm0uZ2V0KCdzdWJkaXInKSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyID0gdXJsZGF0YS5wYXJtLmdldCgnc3ViZGlyJykgKyAiLyIgKyBkZXN0ZGlyCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgIGlmIHVybGRhdGEucGFybS5nZXQoJ3N1YmRpcicpICE9IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RkaXIgPSB1cmxkYXRhLnBhcm0uZ2V0KCdzdWJkaXInKQorICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyID0gIi4iCisgICAgICAgICAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcigiJXMvJXMiICUgKHJvb3RkaXIsIGRlc3RkaXIpKQorICAgICAgICAgICAgICAgICAgICBjbWQgPSAnY3AgLWYgJXMgJXMvJXMvJyAlIChmaWxlLCByb290ZGlyLCBkZXN0ZGlyKQorCisgICAgICAgIGlmIG5vdCBjbWQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIENoYW5nZSB0byBzdWJkaXIgYmVmb3JlIGV4ZWN1dGluZyBjb21tYW5kCisgICAgICAgIHNhdmVfY3dkID0gb3MuZ2V0Y3dkKCk7CisgICAgICAgIG9zLmNoZGlyKHJvb3RkaXIpCisgICAgICAgIGlmICdzdWJkaXInIGluIHVybGRhdGEucGFybToKKyAgICAgICAgICAgIG5ld2RpciA9ICgiJXMvJXMiICUgKHJvb3RkaXIsIHVybGRhdGEucGFybS5nZXQoJ3N1YmRpcicpKSkKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihuZXdkaXIpCisgICAgICAgICAgICBvcy5jaGRpcihuZXdkaXIpCisKKyAgICAgICAgcGF0aCA9IGRhdGEuZ2V0VmFyKCdQQVRIJywgVHJ1ZSkKKyAgICAgICAgaWYgcGF0aDoKKyAgICAgICAgICAgIGNtZCA9ICJQQVRIPVwiJXNcIiAlcyIgJSAocGF0aCwgY21kKQorICAgICAgICBiYi5ub3RlKCJVbnBhY2tpbmcgJXMgdG8gJXMvIiAlIChmaWxlLCBvcy5nZXRjd2QoKSkpCisgICAgICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChjbWQsIHByZWV4ZWNfZm49c3VicHJvY2Vzc19zZXR1cCwgc2hlbGw9VHJ1ZSkKKworICAgICAgICBvcy5jaGRpcihzYXZlX2N3ZCkKKworICAgICAgICBpZiByZXQgIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFVucGFja0Vycm9yKCJVbnBhY2sgY29tbWFuZCAlcyBmYWlsZWQgd2l0aCByZXR1cm4gdmFsdWUgJXMiICUgKGNtZCwgcmV0KSwgdXJsZGF0YS51cmwpCisKKyAgICAgICAgaWYgaXRlcmF0ZSBpcyBUcnVlOgorICAgICAgICAgICAgaXRlcmF0ZV91cmxkYXRhID0gdXJsZGF0YQorICAgICAgICAgICAgaXRlcmF0ZV91cmxkYXRhLmxvY2FscGF0aCA9ICIlcy8lcyIgJSAocm9vdGRpciwgaXRlcmF0ZV9maWxlKQorICAgICAgICAgICAgc2VsZi51bnBhY2sodXJsZGF0YSwgcm9vdGRpciwgZGF0YSkKKworICAgICAgICByZXR1cm4KKworICAgIGRlZiBjbGVhbihzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENsZWFuIGFueSBleGlzdGluZyBmdWxsIG9yIHBhcnRpYWwgZG93bmxvYWQKKyAgICAgICAgIiIiCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1cmxkYXRhLmxvY2FscGF0aCkKKworICAgIGRlZiB0cnlfcHJlbWlycm9yKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdWxkIHByZW1pcnJvcnMgYmUgdXNlZD8KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hlY2tzdGF0dXMoc2VsZiwgZmV0Y2gsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdGhlIHN0YXR1cyBvZiBhIFVSTAorICAgICAgICBBc3N1bWVzIGxvY2FscGF0aCB3YXMgY2FsbGVkIGZpcnN0CisgICAgICAgICIiIgorICAgICAgICBsb2dnZXIuaW5mbygiVVJMICVzIGNvdWxkIG5vdCBiZSBjaGVja2VkIGZvciBzdGF0dXMgc2luY2Ugbm8gbWV0aG9kIGV4aXN0cy4iLCB1cmwpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgbGF0ZXN0X3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIExvb2sgaW4gdGhlIGNhY2hlIGZvciB0aGUgbGF0ZXN0IHJldmlzaW9uLCBpZiBub3QgcHJlc2VudCBhc2sgdGhlIFNDTS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfbGF0ZXN0X3JldmlzaW9uIik6CisgICAgICAgICAgICByYWlzZSBQYXJhbWV0ZXJFcnJvcigiVGhlIGZldGNoZXIgZm9yIHRoaXMgVVJMIGRvZXMgbm90IHN1cHBvcnQgX2xhdGVzdF9yZXZpc2lvbiIsIHVybCkKKworICAgICAgICByZXZzID0gYmIucGVyc2lzdF9kYXRhLnBlcnNpc3QoJ0JCX1VSSV9IRUFEUkVWUycsIGQpCisgICAgICAgIGtleSA9IHNlbGYuZ2VuZXJhdGVfcmV2aXNpb25fa2V5KHVkLCBkLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gcmV2c1trZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldnNba2V5XSA9IHJldiA9IHNlbGYuX2xhdGVzdF9yZXZpc2lvbih1ZCwgZCwgbmFtZSkKKyAgICAgICAgICAgIHJldHVybiByZXYKKworICAgIGRlZiBzb3J0YWJsZV9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgIGxhdGVzdF9yZXYgPSBzZWxmLl9idWlsZF9yZXZpc2lvbih1ZCwgZCwgbmFtZSkKKyAgICAgICAgcmV0dXJuIFRydWUsIHN0cihsYXRlc3RfcmV2KQorCisgICAgZGVmIGdlbmVyYXRlX3JldmlzaW9uX2tleShzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgIGtleSA9IHNlbGYuX3JldmlzaW9uX2tleSh1ZCwgZCwgbmFtZSkKKyAgICAgICAgcmV0dXJuICIlcy0lcyIgJSAoa2V5LCBkLmdldFZhcigiUE4iLCBUcnVlKSBvciAiIikKKworY2xhc3MgRmV0Y2gob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJscywgZCwgY2FjaGUgPSBUcnVlLCBsb2NhbG9ubHkgPSBGYWxzZSwgY29ubmVjdGlvbl9jYWNoZSA9IE5vbmUpOgorICAgICAgICBpZiBsb2NhbG9ubHkgYW5kIGNhY2hlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJiYi5mZXRjaDIuRmV0Y2guX19pbml0X186IGNhbm5vdCBzZXQgY2FjaGUgYW5kIGxvY2Fsb25seSBhdCBzYW1lIHRpbWUiKQorCisgICAgICAgIGlmIGxlbih1cmxzKSA9PSAwOgorICAgICAgICAgICAgdXJscyA9IGQuZ2V0VmFyKCJTUkNfVVJJIiwgVHJ1ZSkuc3BsaXQoKQorICAgICAgICBzZWxmLnVybHMgPSB1cmxzCisgICAgICAgIHNlbGYuZCA9IGQKKyAgICAgICAgc2VsZi51ZCA9IHt9CisgICAgICAgIHNlbGYuY29ubmVjdGlvbl9jYWNoZSA9IGNvbm5lY3Rpb25fY2FjaGUKKworICAgICAgICBmbiA9IGQuZ2V0VmFyKCdGSUxFJywgVHJ1ZSkKKyAgICAgICAgaWYgY2FjaGUgYW5kIGZuIGFuZCBmbiBpbiB1cmxkYXRhX2NhY2hlOgorICAgICAgICAgICAgc2VsZi51ZCA9IHVybGRhdGFfY2FjaGVbZm5dCisKKyAgICAgICAgZm9yIHVybCBpbiB1cmxzOgorICAgICAgICAgICAgaWYgdXJsIG5vdCBpbiBzZWxmLnVkOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51ZFt1cmxdID0gRmV0Y2hEYXRhKHVybCwgZCwgbG9jYWxvbmx5KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBOb25Mb2NhbE1ldGhvZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbG9jYWxvbmx5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51ZFt1cmxdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIGZuIGFuZCBjYWNoZToKKyAgICAgICAgICAgIHVybGRhdGFfY2FjaGVbZm5dID0gc2VsZi51ZAorCisgICAgZGVmIGxvY2FscGF0aChzZWxmLCB1cmwpOgorICAgICAgICBpZiB1cmwgbm90IGluIHNlbGYudXJsczoKKyAgICAgICAgICAgIHNlbGYudWRbdXJsXSA9IEZldGNoRGF0YSh1cmwsIHNlbGYuZCkKKworICAgICAgICBzZWxmLnVkW3VybF0uc2V0dXBfbG9jYWxwYXRoKHNlbGYuZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZC5leHBhbmQoc2VsZi51ZFt1cmxdLmxvY2FscGF0aCkKKworICAgIGRlZiBsb2NhbHBhdGhzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbG9jYWwgZmlsZW5hbWVzLCBhc3N1bWluZyBzdWNjZXNzZnVsIGZldGNoCisgICAgICAgICIiIgorICAgICAgICBsb2NhbCA9IFtdCisKKyAgICAgICAgZm9yIHUgaW4gc2VsZi51cmxzOgorICAgICAgICAgICAgdWQgPSBzZWxmLnVkW3VdCisgICAgICAgICAgICB1ZC5zZXR1cF9sb2NhbHBhdGgoc2VsZi5kKQorICAgICAgICAgICAgbG9jYWwuYXBwZW5kKHVkLmxvY2FscGF0aCkKKworICAgICAgICByZXR1cm4gbG9jYWwKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1cmxzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgRmV0Y2ggYWxsIHVybHMKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCB1cmxzOgorICAgICAgICAgICAgdXJscyA9IHNlbGYudXJscworCisgICAgICAgIG5ldHdvcmsgPSBzZWxmLmQuZ2V0VmFyKCJCQl9OT19ORVRXT1JLIiwgVHJ1ZSkKKyAgICAgICAgcHJlbWlycm9yb25seSA9IChzZWxmLmQuZ2V0VmFyKCJCQl9GRVRDSF9QUkVNSVJST1JPTkxZIiwgVHJ1ZSkgPT0gIjEiKQorCisgICAgICAgIGZvciB1IGluIHVybHM6CisgICAgICAgICAgICB1ZCA9IHNlbGYudWRbdV0KKyAgICAgICAgICAgIHVkLnNldHVwX2xvY2FscGF0aChzZWxmLmQpCisgICAgICAgICAgICBtID0gdWQubWV0aG9kCisgICAgICAgICAgICBsb2NhbHBhdGggPSAiIgorCisgICAgICAgICAgICBsZiA9IGJiLnV0aWxzLmxvY2tmaWxlKHVkLmxvY2tmaWxlKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiQkJfTk9fTkVUV09SSyIsIG5ldHdvcmspCisgCisgICAgICAgICAgICAgICAgaWYgdmVyaWZ5X2RvbmVzdGFtcCh1ZCwgc2VsZi5kKSBhbmQgbm90IG0ubmVlZF91cGRhdGUodWQsIHNlbGYuZCk6CisgICAgICAgICAgICAgICAgICAgIGxvY2FscGF0aCA9IHVkLmxvY2FscGF0aAorICAgICAgICAgICAgICAgIGVsaWYgbS50cnlfcHJlbWlycm9yKHVkLCBzZWxmLmQpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlRyeWluZyBQUkVNSVJST1JTIikKKyAgICAgICAgICAgICAgICAgICAgbWlycm9ycyA9IG1pcnJvcl9mcm9tX3N0cmluZyhzZWxmLmQuZ2V0VmFyKCdQUkVNSVJST1JTJywgVHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgIGxvY2FscGF0aCA9IHRyeV9taXJyb3JzKHNlbGYsIHNlbGYuZCwgdWQsIG1pcnJvcnMsIEZhbHNlKQorCisgICAgICAgICAgICAgICAgaWYgcHJlbWlycm9yb25seToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiQkJfTk9fTkVUV09SSyIsICIxIikKKworICAgICAgICAgICAgICAgIG9zLmNoZGlyKHNlbGYuZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpKQorCisgICAgICAgICAgICAgICAgZmlyc3RlcnIgPSBOb25lCisgICAgICAgICAgICAgICAgdmVyaWZpZWRfc3RhbXAgPSB2ZXJpZnlfZG9uZXN0YW1wKHVkLCBzZWxmLmQpCisgICAgICAgICAgICAgICAgaWYgbm90IGxvY2FscGF0aCBhbmQgKG5vdCB2ZXJpZmllZF9zdGFtcCBvciBtLm5lZWRfdXBkYXRlKHVkLCBzZWxmLmQpKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRydXN0ZWRfbmV0d29yayhzZWxmLmQsIHVkLnVybCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVW50cnVzdGVkVXJsKHVkLnVybCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVHJ5aW5nIFVwc3RyZWFtIikKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uZG93bmxvYWQodWQsIHNlbGYuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobSwgImJ1aWxkX21pcnJvcl9kYXRhIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5idWlsZF9taXJyb3JfZGF0YSh1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxwYXRoID0gdWQubG9jYWxwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAjIGVhcmx5IGNoZWNrc3VtIHZlcmlmeSwgc28gdGhhdCBpZiBjaGVja3N1bSBtaXNtYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIyBmZXRjaGVyIHN0aWxsIGhhdmUgY2hhbmNlIHRvIGZldGNoIGZyb20gbWlycm9yCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfc3RhbXAodWQsIHNlbGYuZCkKKworICAgICAgICAgICAgICAgICAgICBleGNlcHQgYmIuZmV0Y2gyLk5ldHdvcmtBY2Nlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBCQkZldGNoRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIENoZWNrc3VtRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDaGVja3N1bSBmYWlsdXJlIGVuY291bnRlcmVkIHdpdGggZG93bmxvYWQgb2YgJXMgLSB3aWxsIGF0dGVtcHQgb3RoZXIgc291cmNlcyBpZiBhdmFpbGFibGUiICUgdSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgc3RyKGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9iYWRfY2hlY2tzdW0odWQsIGUuY2hlY2tzdW0pCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgTm9DaGVja3N1bUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGZldGNoIFVSTCAlcywgYXR0ZW1wdGluZyBNSVJST1JTIGlmIGF2YWlsYWJsZScgJSB1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCBzdHIoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGVyciA9IGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIGFueSBpbmNvbXBsZXRlIGZldGNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgdmVyaWZpZWRfc3RhbXA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5jbGVhbih1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJUcnlpbmcgTUlSUk9SUyIpCisgICAgICAgICAgICAgICAgICAgICAgICBtaXJyb3JzID0gbWlycm9yX2Zyb21fc3RyaW5nKHNlbGYuZC5nZXRWYXIoJ01JUlJPUlMnLCBUcnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscGF0aCA9IHRyeV9taXJyb3JzKHNlbGYsIHNlbGYuZCwgdWQsIG1pcnJvcnMpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9jYWxwYXRoIG9yICgobm90IG9zLnBhdGguZXhpc3RzKGxvY2FscGF0aCkpIGFuZCBsb2NhbHBhdGguZmluZCgiKiIpID09IC0xKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RlcnI6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGZpcnN0ZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiVW5hYmxlIHRvIGZldGNoIFVSTCBmcm9tIGFueSBzb3VyY2UuIiwgdSkKKworICAgICAgICAgICAgICAgIHVwZGF0ZV9zdGFtcCh1ZCwgc2VsZi5kKQorCisgICAgICAgICAgICBleGNlcHQgQkJGZXRjaEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQ2hlY2tzdW1FcnJvcik6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2hlY2tzdW0gZmFpbHVyZSBmZXRjaGluZyAlcyIgJSB1KQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYmIudXRpbHMudW5sb2NrZmlsZShsZikKKworICAgIGRlZiBjaGVja3N0YXR1cyhzZWxmLCB1cmxzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgYWxsIHVybHMgZXhpc3QgdXBzdHJlYW0KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHVybHM6CisgICAgICAgICAgICB1cmxzID0gc2VsZi51cmxzCisKKyAgICAgICAgZm9yIHUgaW4gdXJsczoKKyAgICAgICAgICAgIHVkID0gc2VsZi51ZFt1XQorICAgICAgICAgICAgdWQuc2V0dXBfbG9jYWxwYXRoKHNlbGYuZCkKKyAgICAgICAgICAgIG0gPSB1ZC5tZXRob2QKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVGVzdGluZyBVUkwgJXMiLCB1KQorICAgICAgICAgICAgIyBGaXJzdCB0cnkgY2hlY2tpbmcgdXJpLCB1LCBmcm9tIFBSRU1JUlJPUlMKKyAgICAgICAgICAgIG1pcnJvcnMgPSBtaXJyb3JfZnJvbV9zdHJpbmcoc2VsZi5kLmdldFZhcignUFJFTUlSUk9SUycsIFRydWUpKQorICAgICAgICAgICAgcmV0ID0gdHJ5X21pcnJvcnMoc2VsZiwgc2VsZi5kLCB1ZCwgbWlycm9ycywgVHJ1ZSkKKyAgICAgICAgICAgIGlmIG5vdCByZXQ6CisgICAgICAgICAgICAgICAgIyBOZXh0IHRyeSBjaGVja2luZyBmcm9tIHRoZSBvcmlnaW5hbCB1cmksIHUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IG0uY2hlY2tzdGF0dXMoc2VsZiwgdWQsIHNlbGYuZCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICMgRmluYWxseSwgdHJ5IGNoZWNraW5nIHVyaSwgdSwgZnJvbSBNSVJST1JTCisgICAgICAgICAgICAgICAgICAgIG1pcnJvcnMgPSBtaXJyb3JfZnJvbV9zdHJpbmcoc2VsZi5kLmdldFZhcignTUlSUk9SUycsIFRydWUpKQorICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnlfbWlycm9ycyhzZWxmLCBzZWxmLmQsIHVkLCBtaXJyb3JzLCBUcnVlKQorCisgICAgICAgICAgICBpZiBub3QgcmV0OgorICAgICAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlVSTCAlcyBkb2Vzbid0IHdvcmsiICUgdSwgdSkKKworICAgIGRlZiB1bnBhY2soc2VsZiwgcm9vdCwgdXJscz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIGFsbCB1cmxzIGV4aXN0IHVwc3RyZWFtCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5vdCB1cmxzOgorICAgICAgICAgICAgdXJscyA9IHNlbGYudXJscworCisgICAgICAgIGZvciB1IGluIHVybHM6CisgICAgICAgICAgICB1ZCA9IHNlbGYudWRbdV0KKyAgICAgICAgICAgIHVkLnNldHVwX2xvY2FscGF0aChzZWxmLmQpCisKKyAgICAgICAgICAgIGlmIHNlbGYuZC5leHBhbmQoc2VsZi5sb2NhbHBhdGgpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgdWQubG9ja2ZpbGU6CisgICAgICAgICAgICAgICAgbGYgPSBiYi51dGlscy5sb2NrZmlsZSh1ZC5sb2NrZmlsZSkKKworICAgICAgICAgICAgdWQubWV0aG9kLnVucGFjayh1ZCwgcm9vdCwgc2VsZi5kKQorCisgICAgICAgICAgICBpZiB1ZC5sb2NrZmlsZToKKyAgICAgICAgICAgICAgICBiYi51dGlscy51bmxvY2tmaWxlKGxmKQorCisgICAgZGVmIGNsZWFuKHNlbGYsIHVybHM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDbGVhbiBmaWxlcyB0aGF0IHRoZSBmZXRjaGVyIGdldHMgb3IgcGxhY2VzCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5vdCB1cmxzOgorICAgICAgICAgICAgdXJscyA9IHNlbGYudXJscworCisgICAgICAgIGZvciB1cmwgaW4gdXJsczoKKyAgICAgICAgICAgIGlmIHVybCBub3QgaW4gc2VsZi51ZDoKKyAgICAgICAgICAgICAgICBzZWxmLnVkW3VybF0gPSBGZXRjaERhdGEodXJsLCBkKQorICAgICAgICAgICAgdWQgPSBzZWxmLnVkW3VybF0KKyAgICAgICAgICAgIHVkLnNldHVwX2xvY2FscGF0aChzZWxmLmQpCisKKyAgICAgICAgICAgIGlmIG5vdCB1ZC5sb2NhbGZpbGUgYW5kIHVkLmxvY2FscGF0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHVkLmxvY2tmaWxlOgorICAgICAgICAgICAgICAgIGxmID0gYmIudXRpbHMubG9ja2ZpbGUodWQubG9ja2ZpbGUpCisKKyAgICAgICAgICAgIHVkLm1ldGhvZC5jbGVhbih1ZCwgc2VsZi5kKQorICAgICAgICAgICAgaWYgdWQuZG9uZXN0YW1wOgorICAgICAgICAgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5kb25lc3RhbXApCisKKyAgICAgICAgICAgIGlmIHVkLmxvY2tmaWxlOgorICAgICAgICAgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUobGYpCisKK2NsYXNzIEZldGNoQ29ubmVjdGlvbkNhY2hlKG9iamVjdCk6CisgICAgIiIiCisgICAgICAgIEEgY2xhc3Mgd2hpY2ggcmVwcmVzZW50cyBhbiBjb250YWluZXIgZm9yIHNvY2tldCBjb25uZWN0aW9ucy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FjaGUgPSB7fQorCisgICAgZGVmIGdldF9jb25uZWN0aW9uX25hbWUoc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgIHJldHVybiBob3N0ICsgJzonICsgc3RyKHBvcnQpCisKKyAgICBkZWYgYWRkX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCwgcG9ydCwgY29ubmVjdGlvbik6CisgICAgICAgIGNuID0gc2VsZi5nZXRfY29ubmVjdGlvbl9uYW1lKGhvc3QsIHBvcnQpCisKKyAgICAgICAgaWYgY24gbm90IGluIHNlbGYuY2FjaGU6CisgICAgICAgICAgICBzZWxmLmNhY2hlW2NuXSA9IGNvbm5lY3Rpb24KKworICAgIGRlZiBnZXRfY29ubmVjdGlvbihzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgY29ubmVjdGlvbiA9IE5vbmUKKworICAgICAgICBjbiA9IHNlbGYuZ2V0X2Nvbm5lY3Rpb25fbmFtZShob3N0LCBwb3J0KQorICAgICAgICBpZiBjbiBpbiBzZWxmLmNhY2hlOgorICAgICAgICAgICAgY29ubmVjdGlvbiA9IHNlbGYuY2FjaGVbY25dCisKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24KKworICAgIGRlZiByZW1vdmVfY29ubmVjdGlvbihzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgY24gPSBzZWxmLmdldF9jb25uZWN0aW9uX25hbWUoaG9zdCwgcG9ydCkKKyAgICAgICAgaWYgY24gaW4gc2VsZi5jYWNoZToKKyAgICAgICAgICAgIHNlbGYuY2FjaGVbY25dLmNsb3NlKCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmNhY2hlW2NuXQorCisgICAgZGVmIGNsb3NlX2Nvbm5lY3Rpb25zKHNlbGYpOgorICAgICAgICBmb3IgY24gaW4gc2VsZi5jYWNoZS5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmNhY2hlW2NuXS5jbG9zZSgpCisgICAgICAgICAgICBkZWwgc2VsZi5jYWNoZVtjbl0KKworZnJvbSAuIGltcG9ydCBjdnMKK2Zyb20gLiBpbXBvcnQgZ2l0Citmcm9tIC4gaW1wb3J0IGdpdHNtCitmcm9tIC4gaW1wb3J0IGdpdGFubmV4Citmcm9tIC4gaW1wb3J0IGxvY2FsCitmcm9tIC4gaW1wb3J0IHN2bgorZnJvbSAuIGltcG9ydCB3Z2V0Citmcm9tIC4gaW1wb3J0IHNzaAorZnJvbSAuIGltcG9ydCBzZnRwCitmcm9tIC4gaW1wb3J0IHBlcmZvcmNlCitmcm9tIC4gaW1wb3J0IGJ6cgorZnJvbSAuIGltcG9ydCBoZworZnJvbSAuIGltcG9ydCBvc2MKK2Zyb20gLiBpbXBvcnQgcmVwbworZnJvbSAuIGltcG9ydCBjbGVhcmNhc2UKKworbWV0aG9kcy5hcHBlbmQobG9jYWwuTG9jYWwoKSkKK21ldGhvZHMuYXBwZW5kKHdnZXQuV2dldCgpKQorbWV0aG9kcy5hcHBlbmQoc3ZuLlN2bigpKQorbWV0aG9kcy5hcHBlbmQoZ2l0LkdpdCgpKQorbWV0aG9kcy5hcHBlbmQoZ2l0c20uR2l0U00oKSkKK21ldGhvZHMuYXBwZW5kKGdpdGFubmV4LkdpdEFOTkVYKCkpCittZXRob2RzLmFwcGVuZChjdnMuQ3ZzKCkpCittZXRob2RzLmFwcGVuZChzc2guU1NIKCkpCittZXRob2RzLmFwcGVuZChzZnRwLlNGVFAoKSkKK21ldGhvZHMuYXBwZW5kKHBlcmZvcmNlLlBlcmZvcmNlKCkpCittZXRob2RzLmFwcGVuZChienIuQnpyKCkpCittZXRob2RzLmFwcGVuZChoZy5IZygpKQorbWV0aG9kcy5hcHBlbmQob3NjLk9zYygpKQorbWV0aG9kcy5hcHBlbmQocmVwby5SZXBvKCkpCittZXRob2RzLmFwcGVuZChjbGVhcmNhc2UuQ2xlYXJDYXNlKCkpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvYnpyLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2J6ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2U5YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2J6ci5weQpAQCAtMCwwICsxLDE0MyBAQAorIiIiCitCaXRCYWtlICdGZXRjaCcgaW1wbGVtZW50YXRpb24gZm9yIGJ6ci4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJvc3MgQnVydG9uCisjIENvcHlyaWdodCAoQykgMjAwNyBSaWNoYXJkIFB1cmRpZQorIworIyAgIENsYXNzZXMgZm9yIG9idGFpbmluZyB1cHN0cmVhbSBzb3VyY2VzIGZvciB0aGUKKyMgICBCaXRCYWtlIGJ1aWxkIHRvb2xzLgorIyAgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2Zyb20gYmIgaW1wb3J0IGRhdGEKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorCitjbGFzcyBCenIoRmV0Y2hNZXRob2QpOgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnYnpyJ10KKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgaW5pdCBienIgc3BlY2lmaWMgdmFyaWFibGUgd2l0aGluIHVybCBkYXRhCisgICAgICAgICIiIgorICAgICAgICAjIENyZWF0ZSBwYXRocyB0byBienIgY2hlY2tvdXRzCisgICAgICAgIHJlbHBhdGggPSBzZWxmLl9zdHJpcF9sZWFkaW5nX3NsYXNoZXModWQucGF0aCkKKyAgICAgICAgdWQucGtnZGlyID0gb3MucGF0aC5qb2luKGRhdGEuZXhwYW5kKCcke0JaUkRJUn0nLCBkKSwgdWQuaG9zdCwgcmVscGF0aCkKKworICAgICAgICB1ZC5zZXR1cF9yZXZpc29ucyhkKQorCisgICAgICAgIGlmIG5vdCB1ZC5yZXZpc2lvbjoKKyAgICAgICAgICAgIHVkLnJldmlzaW9uID0gc2VsZi5sYXRlc3RfcmV2aXNpb24odWQsIGQpCisKKyAgICAgICAgdWQubG9jYWxmaWxlID0gZGF0YS5leHBhbmQoJ2J6cl8lc18lc18lcy50YXIuZ3onICUgKHVkLmhvc3QsIHVkLnBhdGgucmVwbGFjZSgnLycsICcuJyksIHVkLnJldmlzaW9uKSwgZCkKKworICAgIGRlZiBfYnVpbGRienJjb21tYW5kKHNlbGYsIHVkLCBkLCBjb21tYW5kKToKKyAgICAgICAgIiIiCisgICAgICAgIEJ1aWxkIHVwIGFuIGJ6ciBjb21tYW5kbGluZSBiYXNlZCBvbiB1ZAorICAgICAgICBjb21tYW5kIGlzICJmZXRjaCIsICJ1cGRhdGUiLCAicmV2bm8iCisgICAgICAgICIiIgorCisgICAgICAgIGJhc2VjbWQgPSBkYXRhLmV4cGFuZCgnJHtGRVRDSENNRF9ienJ9JywgZCkKKworICAgICAgICBwcm90byA9ICB1ZC5wYXJtLmdldCgncHJvdG9jb2wnLCAnaHR0cCcpCisKKyAgICAgICAgYnpycm9vdCA9IHVkLmhvc3QgKyB1ZC5wYXRoCisKKyAgICAgICAgb3B0aW9ucyA9IFtdCisKKyAgICAgICAgaWYgY29tbWFuZCA9PSAicmV2bm8iOgorICAgICAgICAgICAgYnpyY21kID0gIiVzIHJldm5vICVzICVzOi8vJXMiICUgKGJhc2VjbWQsICIgIi5qb2luKG9wdGlvbnMpLCBwcm90bywgYnpycm9vdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHVkLnJldmlzaW9uOgorICAgICAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItciAlcyIgJSB1ZC5yZXZpc2lvbikKKworICAgICAgICAgICAgaWYgY29tbWFuZCA9PSAiZmV0Y2giOgorICAgICAgICAgICAgICAgIGJ6cmNtZCA9ICIlcyBicmFuY2ggJXMgJXM6Ly8lcyIgJSAoYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucyksIHByb3RvLCBienJyb290KQorICAgICAgICAgICAgZWxpZiBjb21tYW5kID09ICJ1cGRhdGUiOgorICAgICAgICAgICAgICAgIGJ6cmNtZCA9ICIlcyBwdWxsICVzIC0tb3ZlcndyaXRlIiAlIChiYXNlY21kLCAiICIuam9pbihvcHRpb25zKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiSW52YWxpZCBienIgY29tbWFuZCAlcyIgJSBjb21tYW5kLCB1ZC51cmwpCisKKyAgICAgICAgcmV0dXJuIGJ6cmNtZAorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJsIiIiCisKKyAgICAgICAgaWYgb3MuYWNjZXNzKG9zLnBhdGguam9pbih1ZC5wa2dkaXIsIG9zLnBhdGguYmFzZW5hbWUodWQucGtnZGlyKSwgJy5ienInKSwgb3MuUl9PSyk6CisgICAgICAgICAgICBienJjbWQgPSBzZWxmLl9idWlsZGJ6cmNvbW1hbmQodWQsIGQsICJ1cGRhdGUiKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJCWlIgVXBkYXRlICVzIiwgdWQudXJsKQorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGJ6cmNtZCwgdWQudXJsKQorICAgICAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luICh1ZC5wa2dkaXIsIG9zLnBhdGguYmFzZW5hbWUodWQucGF0aCkpKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoYnpyY21kLCBkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmIudXRpbHMucmVtb3ZlKG9zLnBhdGguam9pbih1ZC5wa2dkaXIsIG9zLnBhdGguYmFzZW5hbWUodWQucGtnZGlyKSksIFRydWUpCisgICAgICAgICAgICBienJjbWQgPSBzZWxmLl9idWlsZGJ6cmNvbW1hbmQodWQsIGQsICJmZXRjaCIpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgYnpyY21kLCB1ZC51cmwpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIkJaUiBDaGVja291dCAlcyIsIHVkLnVybCkKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBienJjbWQpCisgICAgICAgICAgICBydW5mZXRjaGNtZChienJjbWQsIGQpCisKKyAgICAgICAgb3MuY2hkaXIodWQucGtnZGlyKQorCisgICAgICAgIHNjbWRhdGEgPSB1ZC5wYXJtLmdldCgic2NtZGF0YSIsICIiKQorICAgICAgICBpZiBzY21kYXRhID09ICJrZWVwIjoKKyAgICAgICAgICAgIHRhcl9mbGFncyA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJfZmxhZ3MgPSAiLS1leGNsdWRlICcuYnpyJyAtLWV4Y2x1ZGUgJy5ienJ0YWdzJyIKKworICAgICAgICAjIHRhciB0aGVtIHVwIHRvIGEgZGVmaW5lZCBmaWxlbmFtZQorICAgICAgICBydW5mZXRjaGNtZCgidGFyICVzIC1jemYgJXMgJXMiICUgKHRhcl9mbGFncywgdWQubG9jYWxwYXRoLCBvcy5wYXRoLmJhc2VuYW1lKHVkLnBrZ2RpcikpLCBkLCBjbGVhbnVwID0gW3VkLmxvY2FscGF0aF0pCisKKyAgICBkZWYgc3VwcG9ydHNfc3JjcmV2KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9yZXZpc2lvbl9rZXkoc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIHVybAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICJienI6IiArIHVkLnBrZ2RpcgorCisgICAgZGVmIF9sYXRlc3RfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBsYXRlc3QgdXBzdHJlYW0gcmV2aXNpb24gbnVtYmVyCisgICAgICAgICIiIgorICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkJaUiBmZXRjaGVyIGhpdHRpbmcgbmV0d29yayBmb3IgJXMiLCB1ZC51cmwpCisKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIHNlbGYuX2J1aWxkYnpyY29tbWFuZCh1ZCwgZCwgInJldm5vIiksIHVkLnVybCkKKworICAgICAgICBvdXRwdXQgPSBydW5mZXRjaGNtZChzZWxmLl9idWlsZGJ6cmNvbW1hbmQodWQsIGQsICJyZXZubyIpLCBkLCBUcnVlKQorCisgICAgICAgIHJldHVybiBvdXRwdXQuc3RyaXAoKQorCisgICAgZGVmIHNvcnRhYmxlX3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHNvcnRhYmxlIHJldmlzaW9uIG51bWJlciB3aGljaCBpbiBvdXIgY2FzZSBpcyB0aGUgcmV2aXNpb24gbnVtYmVyCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBGYWxzZSwgc2VsZi5fYnVpbGRfcmV2aXNpb24odWQsIGQpCisKKyAgICBkZWYgX2J1aWxkX3JldmlzaW9uKHNlbGYsIHVkLCBkKToKKyAgICAgICAgcmV0dXJuIHVkLnJldmlzaW9uCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvY2xlYXJjYXNlLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2NsZWFyY2FzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgzZTdjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2NsZWFyY2FzZS5weQpAQCAtMCwwICsxLDI2MyBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGNsZWFyY2FzZSBpbXBsZW1lbnRhdGlvbgorCitUaGUgY2xlYXJjYXNlIGZldGNoZXIgaXMgdXNlZCB0byByZXRyaWV2ZSBmaWxlcyBmcm9tIGEgQ2xlYXJDYXNlIHJlcG9zaXRvcnkuCisKK1VzYWdlIGluIHRoZSByZWNpcGU6CisKKyAgICBTUkNfVVJJID0gImNjcmM6Ly9jYy5leGFtcGxlLm9yZy9jY3JjO3ZvYj0vZXhhbXBsZV92b2I7bW9kdWxlPS9leGFtcGxlX21vZHVsZSIKKyAgICBTUkNSRVYgPSAiRVhBTVBMRV9DTEVBUkNBU0VfVEFHIgorICAgIFBWID0gIiR7QGQuZ2V0VmFyKCJTUkNSRVYiLCBGYWxzZSkucmVwbGFjZSgiLyIsICIrIil9IgorCitUaGUgZmV0Y2hlciB1c2VzIHRoZSByY2xlYXJ0b29sIG9yIGNsZWFydG9vbCByZW1vdGUgY2xpZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggb25lIGlzIGF2YWlsYWJsZS4KKworU3VwcG9ydGVkIFNSQ19VUkkgb3B0aW9ucyBhcmU6CisKKy0gdm9iCisgICAgKHJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgY2xlYXJjYXNlIFZPQiAod2l0aCBwcmVwZW5kaW5nICIvIikKKworLSBtb2R1bGUKKyAgICBUaGUgbW9kdWxlIGluIHRoZSBzZWxlY3RlZCBWT0IgKHdpdGggcHJlcGVuZGluZyAiLyIpCisKKyAgICBUaGUgbW9kdWxlIGFuZCB2b2IgcGFyYW1ldGVycyBhcmUgY29tYmluZWQgdG8gY3JlYXRlCisgICAgdGhlIGZvbGxvd2luZyBsb2FkIHJ1bGUgaW4gdGhlIHZpZXcgY29uZmlnIHNwZWM6CisgICAgICAgICAgICAgICAgbG9hZCA8dm9iPjxtb2R1bGU+CisKKy0gcHJvdG8KKyAgICBodHRwIG9yIGh0dHBzCisKK1JlbGF0ZWQgdmFyaWFibGVzOgorCisgICAgQ0NBU0VfQ1VTVE9NX0NPTkZJR19TUEVDCisgICAgICAgICAgICBXcml0ZSBhIGNvbmZpZyBzcGVjIHRvIHRoaXMgdmFyaWFibGUgaW4geW91ciByZWNpcGUgdG8gdXNlIGl0IGluc3RlYWQKKyAgICAgICAgICAgIG9mIHRoZSBkZWZhdWx0IGNvbmZpZyBzcGVjIGdlbmVyYXRlZCBieSB0aGlzIGZldGNoZXIuCisgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBTUkNSRVYgbG9zZXMgaXRzIGZ1bmN0aW9uYWxpdHkgaWYgeW91IHNwZWNpZnkKKyAgICAgICAgICAgIHRoaXMgdmFyaWFibGUuIFNSQ1JFViBpcyBzdGlsbCB1c2VkIHRvIGxhYmVsIHRoZSBhcmNoaXZlIGFmdGVyIGEgZmV0Y2gsCisgICAgICAgICAgICBidXQgaXQgZG9lc24ndCBkZWZpbmUgd2hhdCdzIGZldGNoZWQuCisKK1VzZXIgY3JlZGVudGlhbHM6CisgICAgY2xlYXJ0b29sOgorICAgICAgICAgICAgVGhlIGxvZ2luIG9mIGNsZWFydG9vbCBpcyBoYW5kbGVkIGJ5IHRoZSBzeXN0ZW0uIE5vIHNwZWNpYWwgc3RlcHMgbmVlZGVkLgorCisgICAgcmNsZWFydG9vbDoKKyAgICAgICAgICAgIEluIG9yZGVyIHRvIHVzZSByY2xlYXJ0b29sIHdpdGggYXV0aGVudGljYXRlZCB1c2VycyBhbiBgcmNsZWFydG9vbCBsb2dpbmAgaXMKKyAgICAgICAgICAgIG5lY2Vzc2FyeSBiZWZvcmUgdXNpbmcgdGhlIGZldGNoZXIuCisiIiIKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFNpZW1lbnMgQUcKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNodXRpbAoraW1wb3J0IGJiCitmcm9tICAgYmIgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaEVycm9yCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCitmcm9tICAgZGlzdHV0aWxzIGltcG9ydCBzcGF3bgorCitjbGFzcyBDbGVhckNhc2UoRmV0Y2hNZXRob2QpOgorICAgICIiIkNsYXNzIHRvIGZldGNoIHVybHMgdmlhICdjbGVhcmNhc2UnIiIiCisgICAgZGVmIGluaXQoc2VsZiwgZCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgY2FuIGJlIGZldGNoZWQgd2l0aCBDbGVhcmNhc2UuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ2NjcmMnXQorCisgICAgZGVmIGRlYnVnKHNlbGYsIG1zZyk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiQ2xlYXJDYXNlOiAlcyIsIG1zZykKKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgaW5pdCBDbGVhckNhc2Ugc3BlY2lmaWMgdmFyaWFibGUgd2l0aGluIHVybCBkYXRhCisgICAgICAgICIiIgorICAgICAgICB1ZC5wcm90byA9ICJodHRwcyIKKyAgICAgICAgaWYgJ3Byb3RvY29sJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgdWQucHJvdG8gPSB1ZC5wYXJtWydwcm90b2NvbCddCisgICAgICAgIGlmIG5vdCB1ZC5wcm90byBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKKyAgICAgICAgICAgIHJhaXNlIGZldGNoMi5QYXJhbWV0ZXJFcnJvcigiSW52YWxpZCBwcm90b2NvbCB0eXBlIiwgdWQudXJsKQorCisgICAgICAgIHVkLnZvYiA9ICcnCisgICAgICAgIGlmICd2b2InIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC52b2IgPSB1ZC5wYXJtWyd2b2InXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gdWQudXJsKyI6IHZvYiBtdXN0IGJlIGRlZmluZWQgc28gdGhlIGZldGNoZXIga25vd3Mgd2hhdCB0byBnZXQuIgorICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1BhcmFtZXRlckVycm9yKCd2b2InLCBtc2cpCisKKyAgICAgICAgaWYgJ21vZHVsZScgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLm1vZHVsZSA9IHVkLnBhcm1bJ21vZHVsZSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1ZC5tb2R1bGUgPSAiIgorCisgICAgICAgIHVkLmJhc2VjbWQgPSBkLmdldFZhcigiRkVUQ0hDTURfY2NyYyIsIFRydWUpIG9yIHNwYXduLmZpbmRfZXhlY3V0YWJsZSgiY2xlYXJ0b29sIikgb3Igc3Bhd24uZmluZF9leGVjdXRhYmxlKCJyY2xlYXJ0b29sIikKKworICAgICAgICBpZiBkYXRhLmdldFZhcigiU1JDUkVWIiwgZCwgVHJ1ZSkgPT0gIklOVkFMSUQiOgorICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIlNldCBhIHZhbGlkIFNSQ1JFViBmb3IgdGhlIGNsZWFyY2FzZSBmZXRjaGVyIGluIHlvdXIgcmVjaXBlLCBlLmcuIFNSQ1JFViA9IFwiL21haW4vTEFURVNUXCIgb3IgYW55IG90aGVyIGxhYmVsIG9mIHlvdXIgY2hvaWNlLiIpCisKKyAgICAgICAgdWQubGFiZWwgPSBkLmdldFZhcigiU1JDUkVWIiwgRmFsc2UpCisgICAgICAgIHVkLmN1c3RvbXNwZWMgPSBkLmdldFZhcigiQ0NBU0VfQ1VTVE9NX0NPTkZJR19TUEVDIiwgVHJ1ZSkKKworICAgICAgICB1ZC5zZXJ2ZXIgICAgID0gIiVzOi8vJXMlcyIgJSAodWQucHJvdG8sIHVkLmhvc3QsIHVkLnBhdGgpCisKKyAgICAgICAgdWQuaWRlbnRpZmllciA9ICJjbGVhcmNhc2UtJXMlcy0lcyIgJSAoIHVkLnZvYi5yZXBsYWNlKCIvIiwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQubW9kdWxlLnJlcGxhY2UoIi8iLCAiLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQubGFiZWwucmVwbGFjZSgiLyIsICIuIikpCisKKyAgICAgICAgdWQudmlld25hbWUgICAgICAgICA9ICIlcy12aWV3JXMiICUgKHVkLmlkZW50aWZpZXIsIGQuZ2V0VmFyKCJEQVRFVElNRSIsIGQsIFRydWUpKQorICAgICAgICB1ZC5jc25hbWUgICAgICAgICAgID0gIiVzLWNvbmZpZy1zcGVjIiAlICh1ZC5pZGVudGlmaWVyKQorICAgICAgICB1ZC5jY2FzZWRpciAgICAgICAgID0gb3MucGF0aC5qb2luKGRhdGEuZ2V0VmFyKCJETF9ESVIiLCBkLCBUcnVlKSwgdWQudHlwZSkKKyAgICAgICAgdWQudmlld2RpciAgICAgICAgICA9IG9zLnBhdGguam9pbih1ZC5jY2FzZWRpciwgdWQudmlld25hbWUpCisgICAgICAgIHVkLmNvbmZpZ3NwZWNmaWxlICAgPSBvcy5wYXRoLmpvaW4odWQuY2Nhc2VkaXIsIHVkLmNzbmFtZSkKKyAgICAgICAgdWQubG9jYWxmaWxlICAgICAgICA9ICIlcy50YXIuZ3oiICUgKHVkLmlkZW50aWZpZXIpCisKKyAgICAgICAgc2VsZi5kZWJ1ZygiaG9zdCAgICAgICAgICAgID0gJXMiICUgdWQuaG9zdCkKKyAgICAgICAgc2VsZi5kZWJ1ZygicGF0aCAgICAgICAgICAgID0gJXMiICUgdWQucGF0aCkKKyAgICAgICAgc2VsZi5kZWJ1Zygic2VydmVyICAgICAgICAgID0gJXMiICUgdWQuc2VydmVyKQorICAgICAgICBzZWxmLmRlYnVnKCJwcm90byAgICAgICAgICAgPSAlcyIgJSB1ZC5wcm90bykKKyAgICAgICAgc2VsZi5kZWJ1ZygidHlwZSAgICAgICAgICAgID0gJXMiICUgdWQudHlwZSkKKyAgICAgICAgc2VsZi5kZWJ1Zygidm9iICAgICAgICAgICAgID0gJXMiICUgdWQudm9iKQorICAgICAgICBzZWxmLmRlYnVnKCJtb2R1bGUgICAgICAgICAgPSAlcyIgJSB1ZC5tb2R1bGUpCisgICAgICAgIHNlbGYuZGVidWcoImJhc2VjbWQgICAgICAgICA9ICVzIiAlIHVkLmJhc2VjbWQpCisgICAgICAgIHNlbGYuZGVidWcoImxhYmVsICAgICAgICAgICA9ICVzIiAlIHVkLmxhYmVsKQorICAgICAgICBzZWxmLmRlYnVnKCJjY2FzZWRpciAgICAgICAgPSAlcyIgJSB1ZC5jY2FzZWRpcikKKyAgICAgICAgc2VsZi5kZWJ1Zygidmlld2RpciAgICAgICAgID0gJXMiICUgdWQudmlld2RpcikKKyAgICAgICAgc2VsZi5kZWJ1Zygidmlld25hbWUgICAgICAgID0gJXMiICUgdWQudmlld25hbWUpCisgICAgICAgIHNlbGYuZGVidWcoImNvbmZpZ3NwZWNmaWxlICA9ICVzIiAlIHVkLmNvbmZpZ3NwZWNmaWxlKQorICAgICAgICBzZWxmLmRlYnVnKCJsb2NhbGZpbGUgICAgICAgPSAlcyIgJSB1ZC5sb2NhbGZpbGUpCisKKyAgICAgICAgdWQubG9jYWxmaWxlID0gb3MucGF0aC5qb2luKGRhdGEuZ2V0VmFyKCJETF9ESVIiLCBkLCBUcnVlKSwgdWQubG9jYWxmaWxlKQorCisgICAgZGVmIF9idWlsZF9jY2FzZV9jb21tYW5kKHNlbGYsIHVkLCBjb21tYW5kKToKKyAgICAgICAgIiIiCisgICAgICAgIEJ1aWxkIHVwIGEgY29tbWFuZGxpbmUgYmFzZWQgb24gdWQKKyAgICAgICAgY29tbWFuZCBpczogbWt2aWV3LCBzZXRjcywgcm12aWV3CisgICAgICAgICIiIgorICAgICAgICBvcHRpb25zID0gW10KKworICAgICAgICBpZiAicmNsZWFydG9vbCIgaW4gdWQuYmFzZWNtZDoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItc2VydmVyICVzIiAlIHVkLnNlcnZlcikKKworICAgICAgICBiYXNlY21kID0gIiVzICVzIiAlICh1ZC5iYXNlY21kLCBjb21tYW5kKQorCisgICAgICAgIGlmIGNvbW1hbmQgaXMgJ21rdmlldyc6CisgICAgICAgICAgICBpZiBub3QgInJjbGVhcnRvb2wiIGluIHVkLmJhc2VjbWQ6CisgICAgICAgICAgICAgICAgIyBDbGVhcnRvb2wgbmVlZHMgYSAtc25hcHNob3QgdmlldworICAgICAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItc25hcHNob3QiKQorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi10YWcgJXMiICUgdWQudmlld25hbWUpCisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCh1ZC52aWV3ZGlyKQorCisgICAgICAgIGVsaWYgY29tbWFuZCBpcyAncm12aWV3JzoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItZm9yY2UiKQorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIiVzIiAlIHVkLnZpZXdkaXIpCisKKyAgICAgICAgZWxpZiBjb21tYW5kIGlzICdzZXRjcyc6CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLW92ZXJ3cml0ZSIpCisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCh1ZC5jb25maWdzcGVjZmlsZSkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiSW52YWxpZCBjY2FzZSBjb21tYW5kICVzIiAlIGNvbW1hbmQpCisKKyAgICAgICAgY2Nhc2VjbWQgPSAiJXMgJXMiICUgKGJhc2VjbWQsICIgIi5qb2luKG9wdGlvbnMpKQorICAgICAgICBzZWxmLmRlYnVnKCJjY2FzZWNtZCA9ICVzIiAlIGNjYXNlY21kKQorICAgICAgICByZXR1cm4gY2Nhc2VjbWQKKworICAgIGRlZiBfd3JpdGVfY29uZmlnc3BlYyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgY29uZmlnIHNwZWMgZmlsZSAodWQuY29uZmlnc3BlY2ZpbGUpIGZvciBjY2FzZSB2aWV3CisgICAgICAgICIiIgorICAgICAgICBjb25maWdfc3BlYyA9ICIiCisgICAgICAgIGN1c3RvbV9jb25maWdfc3BlYyA9IGQuZ2V0VmFyKCJDQ0FTRV9DVVNUT01fQ09ORklHX1NQRUMiLCBkKQorICAgICAgICBpZiBjdXN0b21fY29uZmlnX3NwZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBjdXN0b21fY29uZmlnX3NwZWMuc3BsaXQoIlxcbiIpOgorICAgICAgICAgICAgICAgIGNvbmZpZ19zcGVjICs9IGxpbmUrIlxuIgorICAgICAgICAgICAgYmIud2FybigiQSBjdXN0b20gY29uZmlnIHNwZWMgaGFzIGJlZW4gc2V0LCBTUkNSRVYgaXMgb25seSByZWxldmFudCBmb3IgdGhlIHRhcmJhbGwgbmFtZS4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29uZmlnX3NwZWMgKz0gImVsZW1lbnQgKiBDSEVDS0VET1VUXG4iCisgICAgICAgICAgICBjb25maWdfc3BlYyArPSAiZWxlbWVudCAqICVzXG4iICUgdWQubGFiZWwKKyAgICAgICAgICAgIGNvbmZpZ19zcGVjICs9ICJsb2FkICVzJXNcbiIgJSAodWQudm9iLCB1ZC5tb2R1bGUpCisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlVzaW5nIGNvbmZpZyBzcGVjOiBcbiVzIiAlIGNvbmZpZ19zcGVjKQorCisgICAgICAgIHdpdGggb3Blbih1ZC5jb25maWdzcGVjZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShjb25maWdfc3BlYykKKworICAgIGRlZiBfcmVtb3ZlX3ZpZXcoc2VsZiwgdWQsIGQpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh1ZC52aWV3ZGlyKToKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLmNjYXNlZGlyKQorICAgICAgICAgICAgY21kID0gc2VsZi5fYnVpbGRfY2Nhc2VfY29tbWFuZCh1ZCwgJ3JtdmlldycpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNsZWFuaW5nIHVwIFtWT0I9JXMgbGFiZWw9JXMgdmlldz0lc10iLCB1ZC52b2IsIHVkLmxhYmVsLCB1ZC52aWV3bmFtZSkKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBjbWQsIHVkLnVybCkKKyAgICAgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKGNtZCwgZCkKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJybXZpZXcgb3V0cHV0OiAlcyIsIG91dHB1dCkKKworICAgIGRlZiBuZWVkX3VwZGF0ZShzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmICgiTEFURVNUIiBpbiB1ZC5sYWJlbCkgb3IgKHVkLmN1c3RvbXNwZWMgYW5kICJMQVRFU1QiIGluIHVkLmN1c3RvbXNwZWMpOgorICAgICAgICAgICAgdWQuaWRlbnRpZmllciArPSAiLSVzIiAlIGQuZ2V0VmFyKCJEQVRFVElNRSIsZCwgVHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdXBwb3J0c19zcmNyZXYoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc29ydGFibGVfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICByZXR1cm4gRmFsc2UsIHVkLmlkZW50aWZpZXIKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIkZldGNoIHVybCIiIgorCisgICAgICAgICMgTWFrZSBhIGZyZXNoIHZpZXcKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHVkLmNjYXNlZGlyKQorICAgICAgICBzZWxmLl93cml0ZV9jb25maWdzcGVjKHVkLCBkKQorICAgICAgICBjbWQgPSBzZWxmLl9idWlsZF9jY2FzZV9jb21tYW5kKHVkLCAnbWt2aWV3JykKKyAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nIHZpZXcgW1ZPQj0lcyBsYWJlbD0lcyB2aWV3PSVzXSIsIHVkLnZvYiwgdWQubGFiZWwsIHVkLnZpZXduYW1lKQorICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY21kLCB1ZC51cmwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKGNtZCwgZCkKKyAgICAgICAgZXhjZXB0IEZldGNoRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmICJDUkNMSTIwMDhFIiBpbiBlLm1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCIlc1xuJXNcbiIgJSAoZS5tc2csICJDYWxsIGByY2xlYXJ0b29sIGxvZ2luYCBpbiB5b3VyIGNvbnNvbGUgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBjbGVhcmNhc2Ugc2VydmVyIGJlZm9yZSBydW5uaW5nIGJpdGJha2UuIikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIGUKKworICAgICAgICAjIFNldCBjb25maWdzcGVjOiBTZXR0aW5nIHRoZSBjb25maWdzcGVjIGVmZmVjdGl2ZWx5IGZldGNoZXMgdGhlIGZpbGVzIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3NwZWMKKyAgICAgICAgb3MuY2hkaXIodWQudmlld2RpcikKKyAgICAgICAgY21kID0gc2VsZi5fYnVpbGRfY2Nhc2VfY29tbWFuZCh1ZCwgJ3NldGNzJyk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJmZXRjaGluZyBkYXRhIFtWT0I9JXMgbGFiZWw9JXMgdmlldz0lc10iLCB1ZC52b2IsIHVkLmxhYmVsLCB1ZC52aWV3bmFtZSkKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGNtZCwgdWQudXJsKQorICAgICAgICBvdXRwdXQgPSBydW5mZXRjaGNtZChjbWQsIGQpCisgICAgICAgIGxvZ2dlci5pbmZvKCIlcyIsIG91dHB1dCkKKworICAgICAgICAjIENvcHkgdGhlIGNvbmZpZ3NwZWMgdG8gdGhlIHZpZXdkaXIgc28gd2UgaGF2ZSBpdCBpbiBvdXIgc291cmNlIHRhcmJhbGwgbGF0ZXIKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHVkLmNvbmZpZ3NwZWNmaWxlLCBvcy5wYXRoLmpvaW4odWQudmlld2RpciwgdWQuY3NuYW1lKSkKKworICAgICAgICAjIENsZWFuIGNsZWFyY2FzZSBtZXRhLWRhdGEgYmVmb3JlIHRhcgorCisgICAgICAgIHJ1bmZldGNoY21kKCd0YXIgLWN6ZiAiJXMiIC4nICUgKHVkLmxvY2FscGF0aCksIGQsIGNsZWFudXAgPSBbdWQubG9jYWxwYXRoXSkKKworICAgICAgICAjIENsZWFuIHVwIHNvIHdlIGNhbiBjcmVhdGUgYSBuZXcgdmlldyBuZXh0IHRpbWUKKyAgICAgICAgc2VsZi5jbGVhbih1ZCwgZCk7CisKKyAgICBkZWYgY2xlYW4oc2VsZiwgdWQsIGQpOgorICAgICAgICBzZWxmLl9yZW1vdmVfdmlldyh1ZCwgZCkKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmNvbmZpZ3NwZWNmaWxlKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2N2cy5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9jdnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3ZDk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9jdnMucHkKQEAgLTAsMCArMSwxNzEgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBpbXBsZW1lbnRhdGlvbnMKKworQ2xhc3NlcyBmb3Igb2J0YWluaW5nIHVwc3RyZWFtIHNvdXJjZXMgZm9yIHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworIworCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZCwgRmV0Y2hFcnJvciwgTWlzc2luZ1BhcmFtZXRlckVycm9yLCBsb2dnZXIKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorCitjbGFzcyBDdnMoRmV0Y2hNZXRob2QpOgorICAgICIiIgorICAgIENsYXNzIHRvIGZldGNoIGEgbW9kdWxlIG9yIG1vZHVsZXMgZnJvbSBjdnMgcmVwb3NpdG9yaWVzCisgICAgIiIiCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIGN2cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnY3ZzJ10KKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICBpZiBub3QgIm1vZHVsZSIgaW4gdWQucGFybToKKyAgICAgICAgICAgIHJhaXNlIE1pc3NpbmdQYXJhbWV0ZXJFcnJvcigibW9kdWxlIiwgdWQudXJsKQorICAgICAgICB1ZC5tb2R1bGUgPSB1ZC5wYXJtWyJtb2R1bGUiXQorCisgICAgICAgIHVkLnRhZyA9IHVkLnBhcm0uZ2V0KCd0YWcnLCAiIikKKworICAgICAgICAjIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGRhdGUgaW4gY2VydGFpbiBjYXNlcworICAgICAgICBpZiAnZGF0ZScgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLmRhdGUgPSB1ZC5wYXJtWydkYXRlJ10KKyAgICAgICAgZWxpZiB1ZC50YWc6CisgICAgICAgICAgICB1ZC5kYXRlID0gIiIKKworICAgICAgICBub3JlY3Vyc2UgPSAnJworICAgICAgICBpZiAnbm9yZWN1cnNlJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgbm9yZWN1cnNlID0gJ19ub3JlY3Vyc2UnCisKKyAgICAgICAgZnVsbHBhdGggPSAnJworICAgICAgICBpZiAnZnVsbHBhdGgnIGluIHVkLnBhcm06CisgICAgICAgICAgICBmdWxscGF0aCA9ICdfZnVsbHBhdGgnCisKKyAgICAgICAgdWQubG9jYWxmaWxlID0gYmIuZGF0YS5leHBhbmQoJyVzXyVzXyVzXyVzJXMlcy50YXIuZ3onICUgKHVkLm1vZHVsZS5yZXBsYWNlKCcvJywgJy4nKSwgdWQuaG9zdCwgdWQudGFnLCB1ZC5kYXRlLCBub3JlY3Vyc2UsIGZ1bGxwYXRoKSwgZCkKKworICAgIGRlZiBuZWVkX3VwZGF0ZShzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmICh1ZC5kYXRlID09ICJub3ciKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5sb2NhbHBhdGgpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorCisgICAgICAgIG1ldGhvZCA9IHVkLnBhcm0uZ2V0KCdtZXRob2QnLCAncHNlcnZlcicpCisgICAgICAgIGxvY2FsZGlyID0gdWQucGFybS5nZXQoJ2xvY2FsZGlyJywgdWQubW9kdWxlKQorICAgICAgICBjdnNfcG9ydCA9IHVkLnBhcm0uZ2V0KCdwb3J0JywgJycpCisKKyAgICAgICAgY3ZzX3JzaCA9IE5vbmUKKyAgICAgICAgaWYgbWV0aG9kID09ICJleHQiOgorICAgICAgICAgICAgaWYgInJzaCIgaW4gdWQucGFybToKKyAgICAgICAgICAgICAgICBjdnNfcnNoID0gdWQucGFybVsicnNoIl0KKworICAgICAgICBpZiBtZXRob2QgPT0gImRpciI6CisgICAgICAgICAgICBjdnNyb290ID0gdWQucGF0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3Zzcm9vdCA9ICI6IiArIG1ldGhvZAorICAgICAgICAgICAgY3ZzcHJveHlob3N0ID0gZC5nZXRWYXIoJ0NWU19QUk9YWV9IT1NUJywgVHJ1ZSkKKyAgICAgICAgICAgIGlmIGN2c3Byb3h5aG9zdDoKKyAgICAgICAgICAgICAgICBjdnNyb290ICs9ICI7cHJveHk9IiArIGN2c3Byb3h5aG9zdAorICAgICAgICAgICAgY3ZzcHJveHlwb3J0ID0gZC5nZXRWYXIoJ0NWU19QUk9YWV9QT1JUJywgVHJ1ZSkKKyAgICAgICAgICAgIGlmIGN2c3Byb3h5cG9ydDoKKyAgICAgICAgICAgICAgICBjdnNyb290ICs9ICI7cHJveHlwb3J0PSIgKyBjdnNwcm94eXBvcnQKKyAgICAgICAgICAgIGN2c3Jvb3QgKz0gIjoiICsgdWQudXNlcgorICAgICAgICAgICAgaWYgdWQucHN3ZDoKKyAgICAgICAgICAgICAgICBjdnNyb290ICs9ICI6IiArIHVkLnBzd2QKKyAgICAgICAgICAgIGN2c3Jvb3QgKz0gIkAiICsgdWQuaG9zdCArICI6IiArIGN2c19wb3J0ICsgdWQucGF0aAorCisgICAgICAgIG9wdGlvbnMgPSBbXQorICAgICAgICBpZiAnbm9yZWN1cnNlJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1sIikKKyAgICAgICAgaWYgdWQuZGF0ZToKKyAgICAgICAgICAgICMgdHJlYXQgWVlZWU1NRERISE1NIHNwZWNpYWxseSBmb3IgQ1ZTCisgICAgICAgICAgICBpZiBsZW4odWQuZGF0ZSkgPT0gMTI6CisgICAgICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1EIFwiJXMgJXM6JXMgVVRDXCIiICUgKHVkLmRhdGVbMDo4XSwgdWQuZGF0ZVs4OjEwXSwgdWQuZGF0ZVsxMDoxMl0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLUQgXCIlcyBVVENcIiIgJSB1ZC5kYXRlKQorICAgICAgICBpZiB1ZC50YWc6CisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZCgiLXIgJXMiICUgdWQudGFnKQorCisgICAgICAgIGN2c2Jhc2VjbWQgPSBkLmdldFZhcigiRkVUQ0hDTURfY3ZzIiwgVHJ1ZSkKKyAgICAgICAgY3ZzY21kID0gY3ZzYmFzZWNtZCArICIgJy1kIiArIGN2c3Jvb3QgKyAiJyBjbyAiICsgIiAiLmpvaW4ob3B0aW9ucykgKyAiICIgKyB1ZC5tb2R1bGUKKyAgICAgICAgY3ZzdXBkYXRlY21kID0gY3ZzYmFzZWNtZCArICIgJy1kIiArIGN2c3Jvb3QgKyAiJyB1cGRhdGUgLWQgLVAgIiArICIgIi5qb2luKG9wdGlvbnMpCisKKyAgICAgICAgaWYgY3ZzX3JzaDoKKyAgICAgICAgICAgIGN2c2NtZCA9ICJDVlNfUlNIPVwiJXNcIiAlcyIgJSAoY3ZzX3JzaCwgY3ZzY21kKQorICAgICAgICAgICAgY3ZzdXBkYXRlY21kID0gIkNWU19SU0g9XCIlc1wiICVzIiAlIChjdnNfcnNoLCBjdnN1cGRhdGVjbWQpCisKKyAgICAgICAgIyBjcmVhdGUgbW9kdWxlIGRpcmVjdG9yeQorICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkZldGNoOiBjaGVja2luZyBmb3IgbW9kdWxlIGRpcmVjdG9yeSIpCisgICAgICAgIHBrZyA9IGQuZ2V0VmFyKCdQTicsIFRydWUpCisgICAgICAgIHBrZ2RpciA9IG9zLnBhdGguam9pbihkLmdldFZhcignQ1ZTRElSJywgVHJ1ZSksIHBrZykKKyAgICAgICAgbW9kZGlyID0gb3MucGF0aC5qb2luKHBrZ2RpciwgbG9jYWxkaXIpCisgICAgICAgIGlmIG9zLmFjY2Vzcyhvcy5wYXRoLmpvaW4obW9kZGlyLCAnQ1ZTJyksIG9zLlJfT0spOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZSAiICsgdWQudXJsKQorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGN2c3VwZGF0ZWNtZCwgdWQudXJsKQorICAgICAgICAgICAgIyB1cGRhdGUgc291cmNlcyB0aGVyZQorICAgICAgICAgICAgb3MuY2hkaXIobW9kZGlyKQorICAgICAgICAgICAgY21kID0gY3ZzdXBkYXRlY21kCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiRmV0Y2ggIiArIHVkLnVybCkKKyAgICAgICAgICAgICMgY2hlY2sgb3V0IHNvdXJjZXMgdGhlcmUKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihwa2dkaXIpCisgICAgICAgICAgICBvcy5jaGRpcihwa2dkaXIpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBjdnNjbWQpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY3ZzY21kLCB1ZC51cmwpCisgICAgICAgICAgICBjbWQgPSBjdnNjbWQKKworICAgICAgICBydW5mZXRjaGNtZChjbWQsIGQsIGNsZWFudXAgPSBbbW9kZGlyXSkKKworICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKG1vZGRpciwgb3MuUl9PSyk6CisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJEaXJlY3RvcnkgJXMgd2FzIG5vdCByZWFkYWJsZSBkZXNwaXRlIHN1Y2Vzc2Z1bCBmZXRjaD8hIiAlIG1vZGRpciwgdWQudXJsKQorCisgICAgICAgIHNjbWRhdGEgPSB1ZC5wYXJtLmdldCgic2NtZGF0YSIsICIiKQorICAgICAgICBpZiBzY21kYXRhID09ICJrZWVwIjoKKyAgICAgICAgICAgIHRhcl9mbGFncyA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJfZmxhZ3MgPSAiLS1leGNsdWRlICdDVlMnIgorCisgICAgICAgICMgdGFyIHRoZW0gdXAgdG8gYSBkZWZpbmVkIGZpbGVuYW1lCisgICAgICAgIGlmICdmdWxscGF0aCcgaW4gdWQucGFybToKKyAgICAgICAgICAgIG9zLmNoZGlyKHBrZ2RpcikKKyAgICAgICAgICAgIGNtZCA9ICJ0YXIgJXMgLWN6ZiAlcyAlcyIgJSAodGFyX2ZsYWdzLCB1ZC5sb2NhbHBhdGgsIGxvY2FsZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuY2hkaXIobW9kZGlyKQorICAgICAgICAgICAgb3MuY2hkaXIoJy4uJykKKyAgICAgICAgICAgIGNtZCA9ICJ0YXIgJXMgLWN6ZiAlcyAlcyIgJSAodGFyX2ZsYWdzLCB1ZC5sb2NhbHBhdGgsIG9zLnBhdGguYmFzZW5hbWUobW9kZGlyKSkKKworICAgICAgICBydW5mZXRjaGNtZChjbWQsIGQsIGNsZWFudXAgPSBbdWQubG9jYWxwYXRoXSkKKworICAgIGRlZiBjbGVhbihzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIiBDbGVhbiBDVlMgRmlsZXMgYW5kIHRhcmJhbGxzICIiIgorCisgICAgICAgIHBrZyA9IGQuZ2V0VmFyKCdQTicsIFRydWUpCisgICAgICAgIHBrZ2RpciA9IG9zLnBhdGguam9pbihkLmdldFZhcigiQ1ZTRElSIiwgVHJ1ZSksIHBrZykKKworICAgICAgICBiYi51dGlscy5yZW1vdmUocGtnZGlyLCBUcnVlKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodWQubG9jYWxwYXRoKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0LnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2dpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY1OGZmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2dpdC5weQpAQCAtMCwwICsxLDQ0NyBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGdpdCBpbXBsZW1lbnRhdGlvbgorCitnaXQgZmV0Y2hlciBzdXBwb3J0IHRoZSBTUkNfVVJJIHdpdGggZm9ybWF0IG9mOgorU1JDX1VSSSA9ICJnaXQ6Ly9zb21lLmhvc3Qvc29tZXBhdGg7T3B0aW9uQT14eHg7T3B0aW9uQj14eHg7Li4uIgorCitTdXBwb3J0ZWQgU1JDX1VSSSBvcHRpb25zIGFyZToKKworLSBicmFuY2gKKyAgIFRoZSBnaXQgYnJhbmNoIHRvIHJldHJpZXZlIGZyb20uIFRoZSBkZWZhdWx0IGlzICJtYXN0ZXIiCisKKyAgIFRoaXMgb3B0aW9uIGFsc28gc3VwcG9ydHMgbXVsdGlwbGUgYnJhbmNoIGZldGNoaW5nLCB3aXRoIGJyYW5jaGVzCisgICBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSW4gbXVsdGlwbGUgYnJhbmNoZXMgY2FzZSwgdGhlIG5hbWUgb3B0aW9uCisgICBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG5hbWVzIHRvIG1hdGNoIHRoZSBicmFuY2hlcywgd2hpY2ggaXMKKyAgIHVzZWQgdG8gc3BlY2lmeSB0aGUgU1JDX1JFViBmb3IgdGhlIGJyYW5jaAorICAgZS5nOgorICAgU1JDX1VSST0iZ2l0Oi8vc29tZS5ob3N0L3NvbWVwYXRoO2JyYW5jaD1icmFuY2hYLGJyYW5jaFk7bmFtZT1uYW1lWCxuYW1lWSIKKyAgIFNSQ1JFVl9uYW1lWCA9ICJ4eHh4eHh4eHh4eHh4eHh4eHh4eCIKKyAgIFNSQ1JFVl9uYW1lWSA9ICJZWVlZWVlZWVlZWVlZWVlZWVlZWSIKKworLSB0YWcKKyAgICBUaGUgZ2l0IHRhZyB0byByZXRyaWV2ZS4gVGhlIGRlZmF1bHQgaXMgIm1hc3RlciIKKworLSBwcm90b2NvbAorICAgVGhlIG1ldGhvZCB0byB1c2UgdG8gYWNjZXNzIHRoZSByZXBvc2l0b3J5LiBDb21tb24gb3B0aW9ucyBhcmUgImdpdCIsCisgICAiaHR0cCIsICJodHRwcyIsICJmaWxlIiwgInNzaCIgYW5kICJyc3luYyIuIFRoZSBkZWZhdWx0IGlzICJnaXQiLgorCistIHJlYmFzZWFibGUKKyAgIHJlYmFzZWFibGUgaW5kaWNhdGVzIHRoYXQgdGhlIHVwc3RyZWFtIGdpdCByZXBvIG1heSByZWJhc2UgaW4gdGhlIGZ1dHVyZSwKKyAgIGFuZCBjdXJyZW50IHJldmlzaW9uIG1heSBkaXNhcHBlYXIgZnJvbSB1cHN0cmVhbSByZXBvLiBUaGlzIG9wdGlvbiB3aWxsCisgICByZW1pbmQgZmV0Y2hlciB0byBwcmVzZXJ2ZSBsb2NhbCBjYWNoZSBjYXJlZnVsbHkgZm9yIGZ1dHVyZSB1c2UuCisgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMCIsIHNldCByZWJhc2VhYmxlPTEgZm9yIHJlYmFzZWFibGUgZ2l0IHJlcG8uCisKKy0gbm9jaGVja291dAorICAgRG9uJ3QgY2hlY2tvdXQgc291cmNlIGNvZGUgd2hlbiB1bnBhY2tpbmcuIHNldCB0aGlzIG9wdGlvbiBmb3IgdGhlIHJlY2lwZQorICAgd2hvIGhhcyBpdHMgb3duIHJvdXRpbmUgdG8gY2hlY2tvdXQgY29kZS4KKyAgIFRoZSBkZWZhdWx0IGlzICIwIiwgc2V0IG5vY2hlY2tvdXQ9MSBpZiBuZWVkZWQuCisKKy0gYmFyZWNsb25lCisgICBDcmVhdGUgYSBiYXJlIGNsb25lIG9mIHRoZSBzb3VyY2UgY29kZSBhbmQgZG9uJ3QgY2hlY2tvdXQgdGhlIHNvdXJjZSBjb2RlCisgICB3aGVuIHVucGFja2luZy4gU2V0IHRoaXMgb3B0aW9uIGZvciB0aGUgcmVjaXBlIHdobyBoYXMgaXRzIG93biByb3V0aW5lIHRvCisgICBjaGVja291dCBjb2RlIGFuZCB0cmFja2luZyBicmFuY2ggcmVxdWlyZW1lbnRzLgorICAgVGhlIGRlZmF1bHQgaXMgIjAiLCBzZXQgYmFyZWNsb25lPTEgaWYgbmVlZGVkLgorCistIG5vYnJhbmNoCisgICBEb24ndCBjaGVjayB0aGUgU0hBIHZhbGlkYXRpb24gZm9yIGJyYW5jaC4gc2V0IHRoaXMgb3B0aW9uIGZvciB0aGUgcmVjaXBlCisgICByZWZlcnJpbmcgdG8gY29tbWl0IHdoaWNoIGlzIHZhbGlkIGluIHRhZyBpbnN0ZWFkIG9mIGJyYW5jaC4KKyAgIFRoZSBkZWZhdWx0IGlzICIwIiwgc2V0IG5vYnJhbmNoPTEgaWYgbmVlZGVkLgorCisiIiIKKworI0NvcHlyaWdodCAoQykgMjAwNSBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBiYgorZnJvbSAgIGJiICAgIGltcG9ydCBkYXRhCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorCitjbGFzcyBHaXQoRmV0Y2hNZXRob2QpOgorICAgICIiIkNsYXNzIHRvIGZldGNoIGEgbW9kdWxlIG9yIG1vZHVsZXMgZnJvbSBnaXQgcmVwb3NpdG9yaWVzIiIiCisgICAgZGVmIGluaXQoc2VsZiwgZCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgY2FuIGJlIGZldGNoZWQgd2l0aCBnaXQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ2dpdCddCisKKyAgICBkZWYgc3VwcG9ydHNfY2hlY2tzdW0oc2VsZiwgdXJsZGF0YSk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBpbml0IGdpdCBzcGVjaWZpYyB2YXJpYWJsZSB3aXRoaW4gdXJsIGRhdGEKKyAgICAgICAgc28gdGhhdCB0aGUgZ2l0IG1ldGhvZCBsaWtlIGxhdGVzdF9yZXZpc2lvbigpIGNhbiB3b3JrCisgICAgICAgICIiIgorICAgICAgICBpZiAncHJvdG9jb2wnIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC5wcm90byA9IHVkLnBhcm1bJ3Byb3RvY29sJ10KKyAgICAgICAgZWxpZiBub3QgdWQuaG9zdDoKKyAgICAgICAgICAgIHVkLnByb3RvID0gJ2ZpbGUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1ZC5wcm90byA9ICJnaXQiCisKKyAgICAgICAgaWYgbm90IHVkLnByb3RvIGluICgnZ2l0JywgJ2ZpbGUnLCAnc3NoJywgJ2h0dHAnLCAnaHR0cHMnLCAncnN5bmMnKToKKyAgICAgICAgICAgIHJhaXNlIGJiLmZldGNoMi5QYXJhbWV0ZXJFcnJvcigiSW52YWxpZCBwcm90b2NvbCB0eXBlIiwgdWQudXJsKQorCisgICAgICAgIHVkLm5vY2hlY2tvdXQgPSB1ZC5wYXJtLmdldCgibm9jaGVja291dCIsIjAiKSA9PSAiMSIKKworICAgICAgICB1ZC5yZWJhc2VhYmxlID0gdWQucGFybS5nZXQoInJlYmFzZWFibGUiLCIwIikgPT0gIjEiCisKKyAgICAgICAgdWQubm9icmFuY2ggPSB1ZC5wYXJtLmdldCgibm9icmFuY2giLCIwIikgPT0gIjEiCisKKyAgICAgICAgIyBiYXJlY2xvbmUgaW1wbGllcyBub2NoZWNrb3V0CisgICAgICAgIHVkLmJhcmVjbG9uZSA9IHVkLnBhcm0uZ2V0KCJiYXJlY2xvbmUiLCIwIikgPT0gIjEiCisgICAgICAgIGlmIHVkLmJhcmVjbG9uZToKKyAgICAgICAgICAgIHVkLm5vY2hlY2tvdXQgPSAxCisgIAorICAgICAgICB1ZC51bnJlc29sdmVkcmV2ID0ge30KKyAgICAgICAgYnJhbmNoZXMgPSB1ZC5wYXJtLmdldCgiYnJhbmNoIiwgIm1hc3RlciIpLnNwbGl0KCcsJykKKyAgICAgICAgaWYgbGVuKGJyYW5jaGVzKSAhPSBsZW4odWQubmFtZXMpOgorICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLlBhcmFtZXRlckVycm9yKCJUaGUgbnVtYmVyIG9mIG5hbWUgYW5kIGJyYW5jaCBwYXJhbWV0ZXJzIGlzIG5vdCBiYWxhbmNlZCIsIHVkLnVybCkKKyAgICAgICAgdWQuYnJhbmNoZXMgPSB7fQorICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgIGJyYW5jaCA9IGJyYW5jaGVzW3VkLm5hbWVzLmluZGV4KG5hbWUpXQorICAgICAgICAgICAgdWQuYnJhbmNoZXNbbmFtZV0gPSBicmFuY2gKKyAgICAgICAgICAgIHVkLnVucmVzb2x2ZWRyZXZbbmFtZV0gPSBicmFuY2gKKworICAgICAgICB1ZC5iYXNlY21kID0gZGF0YS5nZXRWYXIoIkZFVENIQ01EX2dpdCIsIGQsIFRydWUpIG9yICJnaXQgLWMgY29yZS5mc3luY29iamVjdGZpbGVzPTAiCisKKyAgICAgICAgdWQud3JpdGVfdGFyYmFsbHMgPSAoKGRhdGEuZ2V0VmFyKCJCQl9HRU5FUkFURV9NSVJST1JfVEFSQkFMTFMiLCBkLCBUcnVlKSBvciAiMCIpICE9ICIwIikgb3IgdWQucmViYXNlYWJsZQorCisgICAgICAgIHVkLnNldHVwX3Jldmlzb25zKGQpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gdWQubmFtZXM6CisgICAgICAgICAgICAjIEVuc3VyZSBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBsaWtlIGEgc2hhMjU2IGNoZWNrc3VtL3JldmlzaW9uIGlzIHRyYW5zbGF0ZWQgaW50byBvbmUKKyAgICAgICAgICAgIGlmIG5vdCB1ZC5yZXZpc2lvbnNbbmFtZV0gb3IgbGVuKHVkLnJldmlzaW9uc1tuYW1lXSkgIT0gNDAgIG9yIChGYWxzZSBpbiBbYyBpbiAiYWJjZGVmMDEyMzQ1Njc4OSIgZm9yIGMgaW4gdWQucmV2aXNpb25zW25hbWVdXSk6CisgICAgICAgICAgICAgICAgaWYgdWQucmV2aXNpb25zW25hbWVdOgorICAgICAgICAgICAgICAgICAgICB1ZC51bnJlc29sdmVkcmV2W25hbWVdID0gdWQucmV2aXNpb25zW25hbWVdCisgICAgICAgICAgICAgICAgdWQucmV2aXNpb25zW25hbWVdID0gc2VsZi5sYXRlc3RfcmV2aXNpb24odWQsIGQsIG5hbWUpCisKKyAgICAgICAgZ2l0c3JjbmFtZSA9ICclcyVzJyAlICh1ZC5ob3N0LnJlcGxhY2UoJzonLCAnLicpLCB1ZC5wYXRoLnJlcGxhY2UoJy8nLCAnLicpLnJlcGxhY2UoJyonLCAnLicpKQorICAgICAgICBpZiBnaXRzcmNuYW1lLnN0YXJ0c3dpdGgoJy4nKToKKyAgICAgICAgICAgIGdpdHNyY25hbWUgPSBnaXRzcmNuYW1lWzE6XQorCisgICAgICAgICMgZm9yIHJlYmFzZWFibGUgZ2l0IHJlcG8sIGl0IGlzIG5lY2Vzc2FyeSB0byBrZWVwIG1pcnJvciB0YXIgYmFsbAorICAgICAgICAjIHBlciByZXZpc2lvbiwgc28gdGhhdCBldmVuIHRoZSByZXZpc2lvbiBkaXNhcHBlYXJzIGZyb20gdGhlCisgICAgICAgICMgdXBzdHJlYW0gcmVwbyBpbiB0aGUgZnV0dXJlLCB0aGUgbWlycm9yIHdpbGwgcmVtYWluIGludGFjdCBhbmQgc3RpbGwKKyAgICAgICAgIyBjb250YWlucyB0aGUgcmV2aXNpb24KKyAgICAgICAgaWYgdWQucmViYXNlYWJsZToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHVkLm5hbWVzOgorICAgICAgICAgICAgICAgIGdpdHNyY25hbWUgPSBnaXRzcmNuYW1lICsgJ18nICsgdWQucmV2aXNpb25zW25hbWVdCisgICAgICAgIHVkLm1pcnJvcnRhcmJhbGwgPSAnZ2l0Ml8lcy50YXIuZ3onICUgKGdpdHNyY25hbWUpCisgICAgICAgIHVkLmZ1bGxtaXJyb3IgPSBvcy5wYXRoLmpvaW4oZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpLCB1ZC5taXJyb3J0YXJiYWxsKQorICAgICAgICBnaXRkaXIgPSBkLmdldFZhcigiR0lURElSIiwgVHJ1ZSkgb3IgKGQuZ2V0VmFyKCJETF9ESVIiLCBUcnVlKSArICIvZ2l0Mi8iKQorICAgICAgICB1ZC5jbG9uZWRpciA9IG9zLnBhdGguam9pbihnaXRkaXIsIGdpdHNyY25hbWUpCisKKyAgICAgICAgdWQubG9jYWxmaWxlID0gdWQuY2xvbmVkaXIKKworICAgIGRlZiBsb2NhbHBhdGgoc2VsZiwgdWQsIGQpOgorICAgICAgICByZXR1cm4gdWQuY2xvbmVkaXIKKworICAgIGRlZiBuZWVkX3VwZGF0ZShzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5jbG9uZWRpcik6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBvcy5jaGRpcih1ZC5jbG9uZWRpcikKKyAgICAgICAgZm9yIG5hbWUgaW4gdWQubmFtZXM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY29udGFpbnNfcmVmKHVkLCBkLCBuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiB1ZC53cml0ZV90YXJiYWxscyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVkLmZ1bGxtaXJyb3IpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgdHJ5X3ByZW1pcnJvcihzZWxmLCB1ZCwgZCk6CisgICAgICAgICMgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdXBkYXRpbmcgYW4gZXhpc3RpbmcgY2hlY2tvdXQgd2l0aCBvbmx5IHByZW1pcnJvcnMKKyAgICAgICAgIyBpcyBub3QgcG9zc2libGUKKyAgICAgICAgaWYgZC5nZXRWYXIoIkJCX0ZFVENIX1BSRU1JUlJPUk9OTFkiLCBUcnVlKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLmNsb25lZGlyKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJsIiIiCisKKyAgICAgICAgdWQucmVwb2NoYW5nZWQgPSBub3Qgb3MucGF0aC5leGlzdHModWQuZnVsbG1pcnJvcikKKworICAgICAgICAjIElmIHRoZSBjaGVja291dCBkb2Vzbid0IGV4aXN0IGFuZCB0aGUgbWlycm9yIHRhcmJhbGwgZG9lcywgZXh0cmFjdCBpdAorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModWQuY2xvbmVkaXIpIGFuZCBvcy5wYXRoLmV4aXN0cyh1ZC5mdWxsbWlycm9yKToKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcih1ZC5jbG9uZWRpcikKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLmNsb25lZGlyKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInRhciAteHpmICVzIiAlICh1ZC5mdWxsbWlycm9yKSwgZCkKKworICAgICAgICByZXBvdXJsID0gc2VsZi5fZ2V0X3JlcG9fdXJsKHVkKQorCisgICAgICAgICMgSWYgdGhlIHJlcG8gc3RpbGwgZG9lc24ndCBleGlzdCwgZmFsbGJhY2sgdG8gY2xvbmluZyBpdAorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModWQuY2xvbmVkaXIpOgorICAgICAgICAgICAgIyBXZSBkbyB0aGlzIHNpbmNlIGdpdCB3aWxsIHVzZSBhICItbCIgb3B0aW9uIGF1dG9tYXRpY2FsbHkgZm9yIGxvY2FsIHVybHMgd2hlcmUgcG9zc2libGUKKyAgICAgICAgICAgIGlmIHJlcG91cmwuc3RhcnRzd2l0aCgiZmlsZTovLyIpOgorICAgICAgICAgICAgICAgIHJlcG91cmwgPSByZXBvdXJsWzc6XQorICAgICAgICAgICAgY2xvbmVfY21kID0gIiVzIGNsb25lIC0tYmFyZSAtLW1pcnJvciAlcyAlcyIgJSAodWQuYmFzZWNtZCwgcmVwb3VybCwgdWQuY2xvbmVkaXIpCisgICAgICAgICAgICBpZiB1ZC5wcm90by5sb3dlcigpICE9ICdmaWxlJzoKKyAgICAgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY2xvbmVfY21kKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoY2xvbmVfY21kLCBkKQorCisgICAgICAgIG9zLmNoZGlyKHVkLmNsb25lZGlyKQorICAgICAgICAjIFVwZGF0ZSB0aGUgY2hlY2tvdXQgaWYgbmVlZGVkCisgICAgICAgIG5lZWR1cGRhdGUgPSBGYWxzZQorICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb250YWluc19yZWYodWQsIGQsIG5hbWUpOgorICAgICAgICAgICAgICAgIG5lZWR1cGRhdGUgPSBUcnVlCisgICAgICAgIGlmIG5lZWR1cGRhdGU6CisgICAgICAgICAgICB0cnk6IAorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyByZW1vdGUgcm0gb3JpZ2luIiAlIHVkLmJhc2VjbWQsIGQpIAorICAgICAgICAgICAgZXhjZXB0IGJiLmZldGNoMi5GZXRjaEVycm9yOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiTm8gT3JpZ2luIikKKworICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIHJlbW90ZSBhZGQgLS1taXJyb3I9ZmV0Y2ggb3JpZ2luICVzIiAlICh1ZC5iYXNlY21kLCByZXBvdXJsKSwgZCkKKyAgICAgICAgICAgIGZldGNoX2NtZCA9ICIlcyBmZXRjaCAtZiAtLXBydW5lICVzIHJlZnMvKjpyZWZzLyoiICUgKHVkLmJhc2VjbWQsIHJlcG91cmwpCisgICAgICAgICAgICBpZiB1ZC5wcm90by5sb3dlcigpICE9ICdmaWxlJzoKKyAgICAgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgZmV0Y2hfY21kLCB1ZC51cmwpCisgICAgICAgICAgICBydW5mZXRjaGNtZChmZXRjaF9jbWQsIGQpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgcHJ1bmUtcGFja2VkIiAlIHVkLmJhc2VjbWQsIGQpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgcGFjay1yZWR1bmRhbnQgLS1hbGwgfCB4YXJncyAtciBybSIgJSB1ZC5iYXNlY21kLCBkKQorICAgICAgICAgICAgdWQucmVwb2NoYW5nZWQgPSBUcnVlCisgICAgICAgIG9zLmNoZGlyKHVkLmNsb25lZGlyKQorICAgICAgICBmb3IgbmFtZSBpbiB1ZC5uYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb250YWluc19yZWYodWQsIGQsIG5hbWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIGJiLmZldGNoMi5GZXRjaEVycm9yKCJVbmFibGUgdG8gZmluZCByZXZpc2lvbiAlcyBpbiBicmFuY2ggJXMgZXZlbiBmcm9tIHVwc3RyZWFtIiAlICh1ZC5yZXZpc2lvbnNbbmFtZV0sIHVkLmJyYW5jaGVzW25hbWVdKSkKKworICAgIGRlZiBidWlsZF9taXJyb3JfZGF0YShzZWxmLCB1ZCwgZCk6CisgICAgICAgICMgR2VuZXJhdGUgYSBtaXJyb3IgdGFyYmFsbCBpZiBuZWVkZWQKKyAgICAgICAgaWYgdWQud3JpdGVfdGFyYmFsbHMgYW5kICh1ZC5yZXBvY2hhbmdlZCBvciBub3Qgb3MucGF0aC5leGlzdHModWQuZnVsbG1pcnJvcikpOgorICAgICAgICAgICAgIyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBzeW1saW5rIHBvaW50cyB0byByZWFkLW9ubHkgZmlsZXN5c3RlbSB3aXRoIFBSRU1JUlJPUgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsodWQuZnVsbG1pcnJvcik6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHVkLmZ1bGxtaXJyb3IpCisKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLmNsb25lZGlyKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNyZWF0aW5nIHRhcmJhbGwgb2YgZ2l0IHJlcG9zaXRvcnkiKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInRhciAtY3pmICVzICVzIiAlICh1ZC5mdWxsbWlycm9yLCBvcy5wYXRoLmpvaW4oIi4iKSApLCBkKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInRvdWNoICVzLmRvbmUiICUgKHVkLmZ1bGxtaXJyb3IpLCBkKQorCisgICAgZGVmIHVucGFjayhzZWxmLCB1ZCwgZGVzdGRpciwgZCk6CisgICAgICAgICIiIiB1bnBhY2sgdGhlIGRvd25sb2FkZWQgc3JjIHRvIGRlc3RkaXIiIiIKKworICAgICAgICBzdWJkaXIgPSB1ZC5wYXJtLmdldCgic3VicGF0aCIsICIiKQorICAgICAgICBpZiBzdWJkaXIgIT0gIiI6CisgICAgICAgICAgICByZWFkcGF0aHNwZWMgPSAiOiVzIiAlIChzdWJkaXIpCisgICAgICAgICAgICBkZWZfZGVzdHN1ZmZpeCA9ICIlcy8iICUgb3MucGF0aC5iYXNlbmFtZShzdWJkaXIucnN0cmlwKCcvJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFkcGF0aHNwZWMgPSAiIgorICAgICAgICAgICAgZGVmX2Rlc3RzdWZmaXggPSAiZ2l0LyIKKworICAgICAgICBkZXN0c3VmZml4ID0gdWQucGFybS5nZXQoImRlc3RzdWZmaXgiLCBkZWZfZGVzdHN1ZmZpeCkKKyAgICAgICAgZGVzdGRpciA9IHVkLmRlc3RkaXIgPSBvcy5wYXRoLmpvaW4oZGVzdGRpciwgZGVzdHN1ZmZpeCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGVzdGRpcik6CisgICAgICAgICAgICBiYi51dGlscy5wcnVuZWRpcihkZXN0ZGlyKQorCisgICAgICAgIGNsb25lZmxhZ3MgPSAiLXMgLW4iCisgICAgICAgIGlmIHVkLmJhcmVjbG9uZToKKyAgICAgICAgICAgIGNsb25lZmxhZ3MgKz0gIiAtLW1pcnJvciIKKworICAgICAgICAjIFZlcnNpb25zIG9mIGdpdCBwcmlvciB0byAxLjcuOS4yIGhhdmUgaXNzdWVzIHdoZXJlIGZvby5naXQgYW5kIGZvbyBnZXQgY29uZnVzZWQKKyAgICAgICAgIyBhbmQgeW91IGVuZCB1cCB3aXRoIHNvbWUgaG9ycmlibGUgdW5pb24gb2YgdGhlIHR3byB3aGVuIHlvdSBhdHRlbXB0IHRvIGNsb25lIGl0CisgICAgICAgICMgVGhlIGxlYXN0IGludmFzaXZlIHdvcmthcm91bmQgc2VlbXMgdG8gYmUgYSBzeW1saW5rIHRvIHRoZSByZWFsIGRpcmVjdG9yeSB0bworICAgICAgICAjIGZvb2wgZ2l0IGludG8gaWdub3JpbmcgYW55IC5naXQgdmVyc2lvbiB0aGF0IG1heSBhbHNvIGJlIHByZXNlbnQuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgaXNzdWUgaXMgZml4ZWQgaW4gbW9yZSByZWNlbnQgdmVyc2lvbnMgb2YgZ2l0IHNvIHdlIGNhbiBkcm9wIHRoaXMgaGFjayBpbiBmdXR1cmUKKyAgICAgICAgIyB3aGVuIHRoYXQgdmVyc2lvbiBiZWNvbWVzIGNvbW1vbiBlbm91Z2guCisgICAgICAgIGNsb25lZGlyID0gdWQuY2xvbmVkaXIKKyAgICAgICAgaWYgbm90IHVkLnBhdGguZW5kc3dpdGgoIi5naXQiKToKKyAgICAgICAgICAgIGluZGlyZWN0aW9uZGlyID0gZGVzdGRpcls6LTFdICsgIi5pbmRpcmVjdGlvbnN5bWxpbmsiCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbmRpcmVjdGlvbmRpcik6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGluZGlyZWN0aW9uZGlyKQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShpbmRpcmVjdGlvbmRpcikpCisgICAgICAgICAgICBvcy5zeW1saW5rKHVkLmNsb25lZGlyLCBpbmRpcmVjdGlvbmRpcikKKyAgICAgICAgICAgIGNsb25lZGlyID0gaW5kaXJlY3Rpb25kaXIKKworICAgICAgICBydW5mZXRjaGNtZCgiJXMgY2xvbmUgJXMgJXMvICVzIiAlICh1ZC5iYXNlY21kLCBjbG9uZWZsYWdzLCBjbG9uZWRpciwgZGVzdGRpciksIGQpCisgICAgICAgIG9zLmNoZGlyKGRlc3RkaXIpCisgICAgICAgIHJlcG91cmwgPSBzZWxmLl9nZXRfcmVwb191cmwodWQpCisgICAgICAgIHJ1bmZldGNoY21kKCIlcyByZW1vdGUgc2V0LXVybCBvcmlnaW4gJXMiICUgKHVkLmJhc2VjbWQsIHJlcG91cmwpLCBkKQorICAgICAgICBpZiBub3QgdWQubm9jaGVja291dDoKKyAgICAgICAgICAgIGlmIHN1YmRpciAhPSAiIjoKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgcmVhZC10cmVlICVzJXMiICUgKHVkLmJhc2VjbWQsIHVkLnJldmlzaW9uc1t1ZC5uYW1lc1swXV0sIHJlYWRwYXRoc3BlYyksIGQpCisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGNoZWNrb3V0LWluZGV4IC1xIC1mIC1hIiAlIHVkLmJhc2VjbWQsIGQpCisgICAgICAgICAgICBlbGlmIG5vdCB1ZC5ub2JyYW5jaDoKKyAgICAgICAgICAgICAgICBicmFuY2huYW1lID0gIHVkLmJyYW5jaGVzW3VkLm5hbWVzWzBdXQorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBjaGVja291dCAtQiAlcyAlcyIgJSAodWQuYmFzZWNtZCwgYnJhbmNobmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLnJldmlzaW9uc1t1ZC5uYW1lc1swXV0pLCBkKQorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBicmFuY2ggLS1zZXQtdXBzdHJlYW0gJXMgb3JpZ2luLyVzIiAlICh1ZC5iYXNlY21kLCBicmFuY2huYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNobmFtZSksIGQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBjaGVja291dCAlcyIgJSAodWQuYmFzZWNtZCwgdWQucmV2aXNpb25zW3VkLm5hbWVzWzBdXSksIGQpCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjbGVhbihzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIiBjbGVhbiB0aGUgZ2l0IGRpcmVjdG9yeSAiIiIKKworICAgICAgICBiYi51dGlscy5yZW1vdmUodWQubG9jYWxwYXRoLCBUcnVlKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodWQuZnVsbG1pcnJvcikKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmZ1bGxtaXJyb3IgKyAiLmRvbmUiKQorCisgICAgZGVmIHN1cHBvcnRzX3NyY3JldihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfY29udGFpbnNfcmVmKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgY21kID0gIiIKKyAgICAgICAgaWYgdWQubm9icmFuY2g6CisgICAgICAgICAgICBjbWQgPSAiJXMgbG9nIC0tcHJldHR5PW9uZWxpbmUgLW4gMSAlcyAtLSAyPiAvZGV2L251bGwgfCB3YyAtbCIgJSAoCisgICAgICAgICAgICAgICAgdWQuYmFzZWNtZCwgdWQucmV2aXNpb25zW25hbWVdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kID0gICIlcyBicmFuY2ggLS1jb250YWlucyAlcyAtLWxpc3QgJXMgMj4gL2Rldi9udWxsIHwgd2MgLWwiICUgKAorICAgICAgICAgICAgICAgIHVkLmJhc2VjbWQsIHVkLnJldmlzaW9uc1tuYW1lXSwgdWQuYnJhbmNoZXNbbmFtZV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKGNtZCwgZCwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgZXhjZXB0IGJiLmZldGNoMi5GZXRjaEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGxlbihvdXRwdXQuc3BsaXQoKSkgPiAxOgorICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLkZldGNoRXJyb3IoIlRoZSBjb21tYW5kICclcycgZ2F2ZSBvdXRwdXQgd2l0aCBtb3JlIHRoZW4gMSBsaW5lIHVuZXhwZWN0ZWRseSwgb3V0cHV0OiAnJXMnIiAlIChjbWQsIG91dHB1dCkpCisgICAgICAgIHJldHVybiBvdXRwdXQuc3BsaXQoKVswXSAhPSAiMCIKKworICAgIGRlZiBfZ2V0X3JlcG9fdXJsKHNlbGYsIHVkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgcmVwb3NpdG9yeSBVUkwKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHVkLnVzZXI6CisgICAgICAgICAgICB1c2VybmFtZSA9IHVkLnVzZXIgKyAnQCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVzZXJuYW1lID0gIiIKKyAgICAgICAgcmV0dXJuICIlczovLyVzJXMlcyIgJSAodWQucHJvdG8sIHVzZXJuYW1lLCB1ZC5ob3N0LCB1ZC5wYXRoKQorCisgICAgZGVmIF9yZXZpc2lvbl9rZXkoc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgdW5pcXVlIGtleSBmb3IgdGhlIHVybAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICJnaXQ6IiArIHVkLmhvc3QgKyB1ZC5wYXRoLnJlcGxhY2UoJy8nLCAnLicpICsgdWQudW5yZXNvbHZlZHJldltuYW1lXQorCisgICAgZGVmIF9sc3JlbW90ZShzZWxmLCB1ZCwgZCwgc2VhcmNoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biBnaXQgbHMtcmVtb3RlIHdpdGggdGhlIHNwZWNpZmllZCBzZWFyY2ggc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICByZXBvdXJsID0gc2VsZi5fZ2V0X3JlcG9fdXJsKHVkKQorICAgICAgICBjbWQgPSAiJXMgbHMtcmVtb3RlICVzICVzIiAlIFwKKyAgICAgICAgICAgICAgKHVkLmJhc2VjbWQsIHJlcG91cmwsIHNlYXJjaCkKKyAgICAgICAgaWYgdWQucHJvdG8ubG93ZXIoKSAhPSAnZmlsZSc6CisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgY21kKQorICAgICAgICBvdXRwdXQgPSBydW5mZXRjaGNtZChjbWQsIGQsIFRydWUpCisgICAgICAgIGlmIG5vdCBvdXRwdXQ6CisgICAgICAgICAgICByYWlzZSBiYi5mZXRjaDIuRmV0Y2hFcnJvcigiVGhlIGNvbW1hbmQgJXMgZ2F2ZSBlbXB0eSBvdXRwdXQgdW5leHBlY3RlZGx5IiAlIGNtZCwgdWQudXJsKQorICAgICAgICByZXR1cm4gb3V0cHV0CisKKyAgICBkZWYgX2xhdGVzdF9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBDb21wdXRlIHRoZSBIRUFEIHJldmlzaW9uIGZvciB0aGUgdXJsCisgICAgICAgICIiIgorICAgICAgICBvdXRwdXQgPSBzZWxmLl9sc3JlbW90ZSh1ZCwgZCwgIiIpCisgICAgICAgICMgVGFncyBvZiB0aGUgZm9ybSBee30gbWF5IG5vdCB3b3JrLCBuZWVkIHRvIGZhbGxiYWNrIHRvIG90aGVyIGZvcm0KKyAgICAgICAgaWYgdWQudW5yZXNvbHZlZHJldltuYW1lXVs6NV0gPT0gInJlZnMvIjoKKyAgICAgICAgICAgIGhlYWQgPSB1ZC51bnJlc29sdmVkcmV2W25hbWVdCisgICAgICAgICAgICB0YWcgPSB1ZC51bnJlc29sdmVkcmV2W25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkID0gInJlZnMvaGVhZHMvJXMiICUgdWQudW5yZXNvbHZlZHJldltuYW1lXQorICAgICAgICAgICAgdGFnID0gInJlZnMvdGFncy8lcyIgJSB1ZC51bnJlc29sdmVkcmV2W25hbWVdCisgICAgICAgIGZvciBzIGluIFtoZWFkLCB0YWcgKyAiXnt9IiwgdGFnXToKKyAgICAgICAgICAgIGZvciBsIGluIG91dHB1dC5zcGxpdCgnXG4nKToKKyAgICAgICAgICAgICAgICBpZiBzIGluIGw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLnNwbGl0KClbMF0KKyAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLkZldGNoRXJyb3IoIlVuYWJsZSB0byByZXNvbHZlICclcycgaW4gdXBzdHJlYW0gZ2l0IHJlcG9zaXRvcnkgaW4gZ2l0IGxzLXJlbW90ZSBvdXRwdXQgZm9yICVzIiAlIFwKKyAgICAgICAgICAgICh1ZC51bnJlc29sdmVkcmV2W25hbWVdLCB1ZC5ob3N0K3VkLnBhdGgpKQorCisgICAgZGVmIGxhdGVzdF92ZXJzaW9uc3RyaW5nKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbXB1dGUgdGhlIGxhdGVzdCByZWxlYXNlIG5hbWUgbGlrZSAieC55LngiIGluICJ4LnkueCtnaXRIQVNIIgorICAgICAgICBieSBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgdGFncyBvdXRwdXQgb2YgbHMtcmVtb3RlLCBjb21wYXJpbmcKKyAgICAgICAgdmVyc2lvbnMgYW5kIHJldHVybmluZyB0aGUgaGlnaGVzdCBtYXRjaC4KKyAgICAgICAgIiIiCisgICAgICAgIHB1cHZlciA9ICgnJywgJycpCisKKyAgICAgICAgdGFncmVnZXggPSByZS5jb21waWxlKGQuZ2V0VmFyKCdHSVRUQUdSRUdFWCcsIFRydWUpIG9yICIoP1A8cHZlcj4oWzAtOV1bXC58X10/KSspIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5fbHNyZW1vdGUodWQsIGQsICJyZWZzL3RhZ3MvKiIpCisgICAgICAgIGV4Y2VwdCBiYi5mZXRjaDIuRmV0Y2hFcnJvciBvciBiYi5mZXRjaDIuTmV0d29ya0FjY2VzczoKKyAgICAgICAgICAgIHJldHVybiBwdXB2ZXIKKworICAgICAgICB2ZXJzdHJpbmcgPSAiIgorICAgICAgICByZXZpc2lvbiA9ICIiCisgICAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHRhZ19oZWFkID0gbGluZS5zcGxpdCgiLyIpWy0xXQorICAgICAgICAgICAgIyBJZ25vcmUgbm9uLXJlbGVhc2VkIGJyYW5jaGVzCisgICAgICAgICAgICBtID0gcmUuc2VhcmNoKCIoYWxwaGF8YmV0YXxyY3xmaW5hbCkrIiwgdGFnX2hlYWQpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgc2VhcmNoIGZvciB2ZXJzaW9uIGluIHRoZSBsaW5lCisgICAgICAgICAgICB0YWcgPSB0YWdyZWdleC5zZWFyY2godGFnX2hlYWQpCisgICAgICAgICAgICBpZiB0YWcgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0YWcgPSB0YWcuZ3JvdXAoJ3B2ZXInKQorICAgICAgICAgICAgdGFnID0gdGFnLnJlcGxhY2UoIl8iLCAiLiIpCisKKyAgICAgICAgICAgIGlmIHZlcnN0cmluZyBhbmQgYmIudXRpbHMudmVyY21wKCgiMCIsIHRhZywgIiIpLCAoIjAiLCB2ZXJzdHJpbmcsICIiKSkgPCAwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHZlcnN0cmluZyA9IHRhZworICAgICAgICAgICAgcmV2aXNpb24gPSBsaW5lLnNwbGl0KClbMF0KKyAgICAgICAgICAgIHB1cHZlciA9ICh2ZXJzdHJpbmcsIHJldmlzaW9uKQorCisgICAgICAgIHJldHVybiBwdXB2ZXIKKworICAgIGRlZiBfYnVpbGRfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICByZXR1cm4gdWQucmV2aXNpb25zW25hbWVdCisKKyAgICBkZWYgZ2l0cGtndl9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBzb3J0YWJsZSByZXZpc2lvbiBudW1iZXIgYnkgY291bnRpbmcgY29tbWl0cyBpbiB0aGUgaGlzdG9yeQorICAgICAgICBCYXNlZCBvbiBnaXRwa2d2LmJibGFzcyBpbiBtZXRhLW9wZW5lbWJlZGRlZAorICAgICAgICAiIiIKKyAgICAgICAgcmV2ID0gc2VsZi5fYnVpbGRfcmV2aXNpb24odWQsIGQsIG5hbWUpCisgICAgICAgIGxvY2FscGF0aCA9IHVkLmxvY2FscGF0aAorICAgICAgICByZXZfZmlsZSA9IG9zLnBhdGguam9pbihsb2NhbHBhdGgsICJvZS1naXRwa2d2XyIgKyByZXYpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhsb2NhbHBhdGgpOgorICAgICAgICAgICAgY29tbWl0cyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXZfZmlsZSkgb3Igbm90IG9zLnBhdGguZ2V0c2l6ZShyZXZfZmlsZSk6CisgICAgICAgICAgICAgICAgZnJvbSBwaXBlcyBpbXBvcnQgcXVvdGUKKyAgICAgICAgICAgICAgICBjb21taXRzID0gYmIuZmV0Y2gyLnJ1bmZldGNoY21kKAorICAgICAgICAgICAgICAgICAgICAgICAgImdpdCByZXYtbGlzdCAlcyAtLSB8IHdjIC1sIiAlIChxdW90ZShyZXYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGQsIHF1aWV0PVRydWUpLnN0cmlwKCkubHN0cmlwKCcwJykKKyAgICAgICAgICAgICAgICBpZiBjb21taXRzOgorICAgICAgICAgICAgICAgICAgICBvcGVuKHJldl9maWxlLCAidyIpLndyaXRlKCIlZFxuIiAlIGludChjb21taXRzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWl0cyA9IG9wZW4ocmV2X2ZpbGUsICJyIikucmVhZGxpbmUoMTI4KS5zdHJpcCgpCisgICAgICAgIGlmIGNvbW1pdHM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsICIlcyslcyIgJSAoY29tbWl0cywgcmV2Wzo3XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlLCBzdHIocmV2KQorCisgICAgZGVmIGNoZWNrc3RhdHVzKHNlbGYsIGZldGNoLCB1ZCwgZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2xzcmVtb3RlKHVkLCBkLCAiIikKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCBGZXRjaEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0YW5uZXgucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0YW5uZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNzg5NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9naXRhbm5leC5weQpAQCAtMCwwICsxLDc2IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgZ2l0IGFubmV4IGltcGxlbWVudGF0aW9uCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMTQgT3RhdmlvIFNhbHZhZG9yCisjIENvcHlyaWdodCAoQykgMjAxNCBPLlMuIFN5c3RlbXMgU29mdHdhcmUgTFREQS4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IGJiCitmcm9tICAgYmIgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIuZ2l0IGltcG9ydCBHaXQKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBsb2dnZXIKKworY2xhc3MgR2l0QU5ORVgoR2l0KToKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggZ2l0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydnaXRhbm5leCddCisKKyAgICBkZWYgdXNlc19hbm5leChzZWxmLCB1ZCwgZCk6CisgICAgICAgIGZvciBuYW1lIGluIHVkLm5hbWVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyByZXYtbGlzdCBnaXQtYW5uZXgiICUgKHVkLmJhc2VjbWQpLCBkLCBxdWlldD1UcnVlKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBleGNlcHQgYmIuZmV0Y2guRmV0Y2hFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgdXBkYXRlX2FubmV4KHNlbGYsIHVkLCBkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGFubmV4IGdldCAtLWFsbCIgJSAodWQuYmFzZWNtZCksIGQsIHF1aWV0PVRydWUpCisgICAgICAgIGV4Y2VwdCBiYi5mZXRjaC5GZXRjaEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJ1bmZldGNoY21kKCJjaG1vZCB1K3cgLVIgJXMvYW5uZXgiICUgKHVkLmNsb25lZGlyKSwgZCwgcXVpZXQ9VHJ1ZSkKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgR2l0LmRvd25sb2FkKHNlbGYsIHVkLCBkKQorCisgICAgICAgIG9zLmNoZGlyKHVkLmNsb25lZGlyKQorICAgICAgICBhbm5leCA9IHNlbGYudXNlc19hbm5leCh1ZCwgZCkKKyAgICAgICAgaWYgYW5uZXg6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9hbm5leCh1ZCwgZCkKKworICAgIGRlZiB1bnBhY2soc2VsZiwgdWQsIGRlc3RkaXIsIGQpOgorICAgICAgICBHaXQudW5wYWNrKHNlbGYsIHVkLCBkZXN0ZGlyLCBkKQorCisgICAgICAgIG9zLmNoZGlyKHVkLmRlc3RkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCIlcyBhbm5leCBzeW5jIiAlICh1ZC5iYXNlY21kKSwgZCkKKyAgICAgICAgZXhjZXB0IGJiLmZldGNoLkZldGNoRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYW5uZXggPSBzZWxmLnVzZXNfYW5uZXgodWQsIGQpCisgICAgICAgIGlmIGFubmV4OgorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGFubmV4IGdldCIgJSAodWQuYmFzZWNtZCksIGQpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiY2htb2QgdSt3IC1SICVzLy5naXQvYW5uZXgiICUgKHVkLmRlc3RkaXIpLCBkLCBxdWlldD1UcnVlKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2dpdHNtLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2dpdHNtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTJlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvZ2l0c20ucHkKQEAgLTAsMCArMSwxMzcgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBnaXQgc3VibW9kdWxlcyBpbXBsZW1lbnRhdGlvbgorCitJbmhlcml0cyBmcm9tIGFuZCBleHRlbmRzIHRoZSBHaXQgZmV0Y2hlciB0byByZXRyaWV2ZSBzdWJtb2R1bGVzIG9mIGEgZ2l0IHJlcG9zaXRvcnkKK2FmdGVyIGNsb25pbmcuCisKK1NSQ19VUkkgPSAiZ2l0c206Ly88c2VlIEdpdCBmZXRjaGVyIGZvciBzeW50YXg+IgorCitTZWUgdGhlIEdpdCBmZXRjaGVyLCBnaXQ6Ly8sIGZvciB1c2FnZSBkb2N1bWVudGF0aW9uLgorCitOT1RFOiBTd2l0Y2hpbmcgYSBTUkNfVVJJIGZyb20gImdpdDovLyIgdG8gImdpdHNtOi8vIiByZXF1aXJlcyBhIGNsZWFuIG9mIHlvdXIgcmVjaXBlLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMTMgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IGJiCitmcm9tICAgYmIgICAgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIuZ2l0IGltcG9ydCBHaXQKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBsb2dnZXIKKworY2xhc3MgR2l0U00oR2l0KToKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggZ2l0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVkLnR5cGUgaW4gWydnaXRzbSddCisKKyAgICBkZWYgdXNlc19zdWJtb2R1bGVzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgZm9yIG5hbWUgaW4gdWQubmFtZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIHNob3cgJXM6LmdpdG1vZHVsZXMiICUgKHVkLmJhc2VjbWQsIHVkLnJldmlzaW9uc1tuYW1lXSksIGQsIHF1aWV0PVRydWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBiYi5mZXRjaC5GZXRjaEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX3NldF9yZWxhdGl2ZV9wYXRocyhzZWxmLCByZXBvcGF0aCk6CisgICAgICAgICIiIgorICAgICAgICBGaXggc3VibW9kdWxlIHBhdGhzIHRvIGJlIHJlbGF0aXZlIGluc3RlYWQgb2YgYWJzb2x1dGUsCisgICAgICAgIHNvIHRoYXQgd2hlbiB3ZSBtb3ZlIHRoZSByZXBvIGl0IGRvZXNuJ3QgYnJlYWsKKyAgICAgICAgKEluIEdpdCAxLjcuMTArIHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5KQorICAgICAgICAiIiIKKyAgICAgICAgc3VibW9kdWxlcyA9IFtdCisgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ocmVwb3BhdGgsICcuZ2l0bW9kdWxlcycpLCAncicpIGFzIGY6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnW3N1Ym1vZHVsZScpOgorICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGVzLmFwcGVuZChsaW5lLnNwbGl0KCciJylbMV0pCisKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBzdWJtb2R1bGVzOgorICAgICAgICAgICAgcmVwb19jb25mID0gb3MucGF0aC5qb2luKHJlcG9wYXRoLCBtb2R1bGUsICcuZ2l0JykKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlcG9fY29uZik6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHJlcG9fY29uZiwgJ3InKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgICAgICBuZXdwYXRoID0gJycKKyAgICAgICAgICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ2dpdGRpcjonKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZHBhdGggPSBsaW5lLnNwbGl0KCc6ICcpWy0xXS5yc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2xkcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3cGF0aCA9ICcuLi8nICogKG1vZHVsZS5jb3VudCgnLycpICsgMSkgKyAnLmdpdC9tb2R1bGVzLycgKyBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXSA9ICdnaXRkaXI6ICVzXG4nICUgbmV3cGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbmV3cGF0aDoKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHJlcG9fY29uZiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZShsaW5lKQorCisgICAgICAgICAgICByZXBvX2NvbmYyID0gb3MucGF0aC5qb2luKHJlcG9wYXRoLCAnLmdpdCcsICdtb2R1bGVzJywgbW9kdWxlLCAnY29uZmlnJykKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlcG9fY29uZjIpOgorICAgICAgICAgICAgICAgIHdpdGggb3BlbihyZXBvX2NvbmYyLCAncicpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIG5ld3BhdGggPSAnJworICAgICAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUubHN0cmlwKCkuc3RhcnRzd2l0aCgnd29ya3RyZWUgPSAnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZHBhdGggPSBsaW5lLnNwbGl0KCcgPSAnKVstMV0ucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9sZHBhdGguc3RhcnRzd2l0aCgnLycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3BhdGggPSAnLi4vJyAqIChtb2R1bGUuY291bnQoJy8nKSArIDMpICsgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV0gPSAnXHR3b3JrdHJlZSA9ICVzXG4nICUgbmV3cGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbmV3cGF0aDoKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHJlcG9fY29uZjIsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUobGluZSkKKworICAgIGRlZiB1cGRhdGVfc3VibW9kdWxlcyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICMgV2UgaGF2ZSB0byBjb252ZXJ0IGJhcmUgLT4gZnVsbCByZXBvLCBkbyB0aGUgc3VibW9kdWxlIGJpdCwgdGhlbiBjb252ZXJ0IGJhY2sKKyAgICAgICAgdG1wY2xvbmVkaXIgPSB1ZC5jbG9uZWRpciArICIudG1wIgorICAgICAgICBnaXRkaXIgPSB0bXBjbG9uZWRpciArIG9zLnNlcCArICIuZ2l0IgorICAgICAgICBiYi51dGlscy5yZW1vdmUodG1wY2xvbmVkaXIsIFRydWUpCisgICAgICAgIG9zLm1rZGlyKHRtcGNsb25lZGlyKQorICAgICAgICBvcy5yZW5hbWUodWQuY2xvbmVkaXIsIGdpdGRpcikKKyAgICAgICAgcnVuZmV0Y2hjbWQoInNlZCAiICsgZ2l0ZGlyICsgIi9jb25maWcgLWkgLWUgJ3MvYmFyZS4qPS4qdHJ1ZS9iYXJlID0gZmFsc2UvJyIsIGQpCisgICAgICAgIG9zLmNoZGlyKHRtcGNsb25lZGlyKQorICAgICAgICBydW5mZXRjaGNtZCh1ZC5iYXNlY21kICsgIiByZXNldCAtLWhhcmQiLCBkKQorICAgICAgICBydW5mZXRjaGNtZCh1ZC5iYXNlY21kICsgIiBjaGVja291dCAiICsgdWQucmV2aXNpb25zW3VkLm5hbWVzWzBdXSwgZCkKKyAgICAgICAgcnVuZmV0Y2hjbWQodWQuYmFzZWNtZCArICIgc3VibW9kdWxlIGluaXQiLCBkKQorICAgICAgICBydW5mZXRjaGNtZCh1ZC5iYXNlY21kICsgIiBzdWJtb2R1bGUgdXBkYXRlIiwgZCkKKyAgICAgICAgc2VsZi5fc2V0X3JlbGF0aXZlX3BhdGhzKHRtcGNsb25lZGlyKQorICAgICAgICBydW5mZXRjaGNtZCgic2VkICIgKyBnaXRkaXIgKyAiL2NvbmZpZyAtaSAtZSAncy9iYXJlLio9LipmYWxzZS9iYXJlID0gdHJ1ZS8nIiwgZCkKKyAgICAgICAgb3MucmVuYW1lKGdpdGRpciwgdWQuY2xvbmVkaXIsKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodG1wY2xvbmVkaXIsIFRydWUpCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICBHaXQuZG93bmxvYWQoc2VsZiwgdWQsIGQpCisKKyAgICAgICAgb3MuY2hkaXIodWQuY2xvbmVkaXIpCisgICAgICAgIHN1Ym1vZHVsZXMgPSBzZWxmLnVzZXNfc3VibW9kdWxlcyh1ZCwgZCkKKyAgICAgICAgaWYgc3VibW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlX3N1Ym1vZHVsZXModWQsIGQpCisKKyAgICBkZWYgdW5wYWNrKHNlbGYsIHVkLCBkZXN0ZGlyLCBkKToKKyAgICAgICAgR2l0LnVucGFjayhzZWxmLCB1ZCwgZGVzdGRpciwgZCkKKyAgICAgICAgCisgICAgICAgIG9zLmNoZGlyKHVkLmRlc3RkaXIpCisgICAgICAgIHN1Ym1vZHVsZXMgPSBzZWxmLnVzZXNfc3VibW9kdWxlcyh1ZCwgZCkKKyAgICAgICAgaWYgc3VibW9kdWxlczoKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCJjcCAtciAiICsgdWQuY2xvbmVkaXIgKyAiL21vZHVsZXMgIiArIHVkLmRlc3RkaXIgKyAiLy5naXQvIiwgZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKHVkLmJhc2VjbWQgKyAiIHN1Ym1vZHVsZSBpbml0IiwgZCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKHVkLmJhc2VjbWQgKyAiIHN1Ym1vZHVsZSB1cGRhdGUiLCBkKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvaGcucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvaGcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ODYzMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9oZy5weQpAQCAtMCwwICsxLDI3NSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGltcGxlbWVudGF0aW9uIGZvciBtZXJjdXJpYWwgRFJDUyAoaGcpLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDQgICAgICAgIE1hcmNpbiBKdXN6a2lld2ljegorIyBDb3B5cmlnaHQgKEMpIDIwMDcgICAgICAgIFJvYmVydCBTY2h1c3RlcgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2Zyb20gYmIgaW1wb3J0IGRhdGEKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZAorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBNaXNzaW5nUGFyYW1ldGVyRXJyb3IKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorCitjbGFzcyBIZyhGZXRjaE1ldGhvZCk6CisgICAgIiIiQ2xhc3MgdG8gZmV0Y2ggZnJvbSBtZXJjdXJpYWwgcmVwb3NpdG9yaWVzIiIiCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIG1lcmN1cmlhbC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnaGcnXQorCisgICAgZGVmIHN1cHBvcnRzX2NoZWNrc3VtKHNlbGYsIHVybGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgRG9uJ3QgcmVxdWlyZSBjaGVja3N1bXMgZm9yIGxvY2FsIGFyY2hpdmVzIGNyZWF0ZWQgZnJvbQorICAgICAgICByZXBvc2l0b3J5IGNoZWNrb3V0cy4KKyAgICAgICAgIiIiIAorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgaW5pdCBoZyBzcGVjaWZpYyB2YXJpYWJsZSB3aXRoaW4gdXJsIGRhdGEKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCAibW9kdWxlIiBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1BhcmFtZXRlckVycm9yKCdtb2R1bGUnLCB1ZC51cmwpCisKKyAgICAgICAgdWQubW9kdWxlID0gdWQucGFybVsibW9kdWxlIl0KKworICAgICAgICBpZiAncHJvdG9jb2wnIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC5wcm90byA9IHVkLnBhcm1bJ3Byb3RvY29sJ10KKyAgICAgICAgZWxpZiBub3QgdWQuaG9zdDoKKyAgICAgICAgICAgIHVkLnByb3RvID0gJ2ZpbGUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1ZC5wcm90byA9ICJoZyIKKworICAgICAgICB1ZC5zZXR1cF9yZXZpc29ucyhkKQorCisgICAgICAgIGlmICdyZXYnIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC5yZXZpc2lvbiA9IHVkLnBhcm1bJ3JldiddCisgICAgICAgIGVsaWYgbm90IHVkLnJldmlzaW9uOgorICAgICAgICAgICAgdWQucmV2aXNpb24gPSBzZWxmLmxhdGVzdF9yZXZpc2lvbih1ZCwgZCkKKworICAgICAgICAjIENyZWF0ZSBwYXRocyB0byBtZXJjdXJpYWwgY2hlY2tvdXRzCisgICAgICAgIGhnc3JjbmFtZSA9ICclc18lc18lcycgJSAodWQubW9kdWxlLnJlcGxhY2UoJy8nLCAnLicpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQuaG9zdCwgdWQucGF0aC5yZXBsYWNlKCcvJywgJy4nKSkKKyAgICAgICAgdWQubWlycm9ydGFyYmFsbCA9ICdoZ18lcy50YXIuZ3onICUgaGdzcmNuYW1lCisgICAgICAgIHVkLmZ1bGxtaXJyb3IgPSBvcy5wYXRoLmpvaW4oZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpLCB1ZC5taXJyb3J0YXJiYWxsKQorCisgICAgICAgIGhnZGlyID0gZC5nZXRWYXIoIkhHRElSIiwgVHJ1ZSkgb3IgKGQuZ2V0VmFyKCJETF9ESVIiLCBUcnVlKSArICIvaGcvIikKKyAgICAgICAgdWQucGtnZGlyID0gb3MucGF0aC5qb2luKGhnZGlyLCBoZ3NyY25hbWUpCisgICAgICAgIHVkLm1vZGRpciA9IG9zLnBhdGguam9pbih1ZC5wa2dkaXIsIHVkLm1vZHVsZSkKKyAgICAgICAgdWQubG9jYWxmaWxlID0gdWQubW9kZGlyCisgICAgICAgIHVkLmJhc2VjbWQgPSBkYXRhLmdldFZhcigiRkVUQ0hDTURfaGciLCBkLCBUcnVlKSBvciAiL3Vzci9iaW4vZW52IGhnIgorCisgICAgICAgIHVkLndyaXRlX3RhcmJhbGxzID0gZC5nZXRWYXIoIkJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUyIsIFRydWUpCisKKyAgICBkZWYgbmVlZF91cGRhdGUoc2VsZiwgdWQsIGQpOgorICAgICAgICByZXZUYWcgPSB1ZC5wYXJtLmdldCgncmV2JywgJ3RpcCcpCisgICAgICAgIGlmIHJldlRhZyA9PSAidGlwIjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh1ZC5sb2NhbHBhdGgpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgdHJ5X3ByZW1pcnJvcihzZWxmLCB1ZCwgZCk6CisgICAgICAgICMgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdXBkYXRpbmcgYW4gZXhpc3RpbmcgY2hlY2tvdXQgd2l0aCBvbmx5IHByZW1pcnJvcnMKKyAgICAgICAgIyBpcyBub3QgcG9zc2libGUKKyAgICAgICAgaWYgZC5nZXRWYXIoIkJCX0ZFVENIX1BSRU1JUlJPUk9OTFkiLCBUcnVlKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLm1vZGRpcik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfYnVpbGRoZ2NvbW1hbmQoc2VsZiwgdWQsIGQsIGNvbW1hbmQpOgorICAgICAgICAiIiIKKyAgICAgICAgQnVpbGQgdXAgYW4gaGcgY29tbWFuZGxpbmUgYmFzZWQgb24gdWQKKyAgICAgICAgY29tbWFuZCBpcyAiZmV0Y2giLCAidXBkYXRlIiwgImluZm8iCisgICAgICAgICIiIgorCisgICAgICAgIHByb3RvID0gdWQucGFybS5nZXQoJ3Byb3RvY29sJywgJ2h0dHAnKQorCisgICAgICAgIGhvc3QgPSB1ZC5ob3N0CisgICAgICAgIGlmIHByb3RvID09ICJmaWxlIjoKKyAgICAgICAgICAgIGhvc3QgPSAiLyIKKyAgICAgICAgICAgIHVkLmhvc3QgPSAibG9jYWxob3N0IgorCisgICAgICAgIGlmIG5vdCB1ZC51c2VyOgorICAgICAgICAgICAgaGdyb290ID0gaG9zdCArIHVkLnBhdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHVkLnBzd2Q6CisgICAgICAgICAgICAgICAgaGdyb290ID0gdWQudXNlciArICI6IiArIHVkLnBzd2QgKyAiQCIgKyBob3N0ICsgdWQucGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoZ3Jvb3QgPSB1ZC51c2VyICsgIkAiICsgaG9zdCArIHVkLnBhdGgKKworICAgICAgICBpZiBjb21tYW5kID09ICJpbmZvIjoKKyAgICAgICAgICAgIHJldHVybiAiJXMgaWRlbnRpZnkgLWkgJXM6Ly8lcy8lcyIgJSAodWQuYmFzZWNtZCwgcHJvdG8sIGhncm9vdCwgdWQubW9kdWxlKQorCisgICAgICAgIG9wdGlvbnMgPSBbXTsKKworICAgICAgICAjIERvbid0IHNwZWNpZnkgcmV2aXNpb24gZm9yIHRoZSBmZXRjaDsgY2xvbmUgdGhlIGVudGlyZSByZXBvLgorICAgICAgICAjIFRoaXMgYXZvaWRzIGFuIGlzc3VlIGlmIHRoZSBzcGVjaWZpZWQgcmV2aXNpb24gaXMgYSB0YWcsIGJlY2F1c2UKKyAgICAgICAgIyB0aGUgdGFnIGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgc3BlY2lmaWVkIHJldmlzaW9uICsgMSwgc28gaXQgd29uJ3QKKyAgICAgICAgIyBiZSBhdmFpbGFibGUgd2hlbiB1c2VkIGluIGFueSBzdWNjZXNzaXZlIGNvbW1hbmRzLgorICAgICAgICBpZiB1ZC5yZXZpc2lvbiBhbmQgY29tbWFuZCAhPSAiZmV0Y2giOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1yICVzIiAlIHVkLnJldmlzaW9uKQorCisgICAgICAgIGlmIGNvbW1hbmQgPT0gImZldGNoIjoKKyAgICAgICAgICAgIGlmIHVkLnVzZXIgYW5kIHVkLnBzd2Q6CisgICAgICAgICAgICAgICAgY21kID0gIiVzIC0tY29uZmlnIGF1dGguZGVmYXVsdC5wcmVmaXg9KiAtLWNvbmZpZyBhdXRoLmRlZmF1bHQudXNlcm5hbWU9JXMgLS1jb25maWcgYXV0aC5kZWZhdWx0LnBhc3N3b3JkPSVzIC0tY29uZmlnIFwiYXV0aC5kZWZhdWx0LnNjaGVtZXM9JXNcIiBjbG9uZSAlcyAlczovLyVzLyVzICVzIiAlICh1ZC5iYXNlY21kLCB1ZC51c2VyLCB1ZC5wc3dkLCBwcm90bywgIiAiLmpvaW4ob3B0aW9ucyksIHByb3RvLCBoZ3Jvb3QsIHVkLm1vZHVsZSwgdWQubW9kdWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgY2xvbmUgJXMgJXM6Ly8lcy8lcyAlcyIgJSAodWQuYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucyksIHByb3RvLCBoZ3Jvb3QsIHVkLm1vZHVsZSwgdWQubW9kdWxlKQorICAgICAgICBlbGlmIGNvbW1hbmQgPT0gInB1bGwiOgorICAgICAgICAgICAgIyBkbyBub3QgcGFzcyBvcHRpb25zIGxpc3Q7IGxpbWl0aW5nIHB1bGwgdG8gcmV2IGNhdXNlcyB0aGUgbG9jYWwKKyAgICAgICAgICAgICMgcmVwbyBub3QgdG8gY29udGFpbiBpdCBhbmQgaW1tZWRpYXRlbHkgZm9sbG93aW5nICJ1cGRhdGUiIGNvbW1hbmQKKyAgICAgICAgICAgICMgd2lsbCBjcmFzaAorICAgICAgICAgICAgaWYgdWQudXNlciBhbmQgdWQucHN3ZDoKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgLS1jb25maWcgYXV0aC5kZWZhdWx0LnByZWZpeD0qIC0tY29uZmlnIGF1dGguZGVmYXVsdC51c2VybmFtZT0lcyAtLWNvbmZpZyBhdXRoLmRlZmF1bHQucGFzc3dvcmQ9JXMgLS1jb25maWcgXCJhdXRoLmRlZmF1bHQuc2NoZW1lcz0lc1wiIHB1bGwiICUgKHVkLmJhc2VjbWQsIHVkLnVzZXIsIHVkLnBzd2QsIHByb3RvKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgcHVsbCIgJSAodWQuYmFzZWNtZCkKKyAgICAgICAgZWxpZiBjb21tYW5kID09ICJ1cGRhdGUiOgorICAgICAgICAgICAgaWYgdWQudXNlciBhbmQgdWQucHN3ZDoKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgLS1jb25maWcgYXV0aC5kZWZhdWx0LnByZWZpeD0qIC0tY29uZmlnIGF1dGguZGVmYXVsdC51c2VybmFtZT0lcyAtLWNvbmZpZyBhdXRoLmRlZmF1bHQucGFzc3dvcmQ9JXMgLS1jb25maWcgXCJhdXRoLmRlZmF1bHQuc2NoZW1lcz0lc1wiIHVwZGF0ZSAtQyAlcyIgJSAodWQuYmFzZWNtZCwgdWQudXNlciwgdWQucHN3ZCwgcHJvdG8sICIgIi5qb2luKG9wdGlvbnMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbWQgPSAiJXMgdXBkYXRlIC1DICVzIiAlICh1ZC5iYXNlY21kLCAiICIuam9pbihvcHRpb25zKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkludmFsaWQgaGcgY29tbWFuZCAlcyIgJSBjb21tYW5kLCB1ZC51cmwpCisKKyAgICAgICAgcmV0dXJuIGNtZAorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJsIiIiCisKKyAgICAgICAgdWQucmVwb2NoYW5nZWQgPSBub3Qgb3MucGF0aC5leGlzdHModWQuZnVsbG1pcnJvcikKKworICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkZldGNoOiBjaGVja2luZyBmb3IgbW9kdWxlIGRpcmVjdG9yeSAnIiArIHVkLm1vZGRpciArICInIikKKworICAgICAgICAjIElmIHRoZSBjaGVja291dCBkb2Vzbid0IGV4aXN0IGFuZCB0aGUgbWlycm9yIHRhcmJhbGwgZG9lcywgZXh0cmFjdCBpdAorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModWQucGtnZGlyKSBhbmQgb3MucGF0aC5leGlzdHModWQuZnVsbG1pcnJvcik6CisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIodWQucGtnZGlyKQorICAgICAgICAgICAgb3MuY2hkaXIodWQucGtnZGlyKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInRhciAteHpmICVzIiAlICh1ZC5mdWxsbWlycm9yKSwgZCkKKworICAgICAgICBpZiBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKHVkLm1vZGRpciwgJy5oZycpLCBvcy5SX09LKToKKyAgICAgICAgICAgICMgRm91bmQgdGhlIHNvdXJjZSwgY2hlY2sgd2hldGhlciBuZWVkIHB1bGwKKyAgICAgICAgICAgIHVwZGF0ZWNtZCA9IHNlbGYuX2J1aWxkaGdjb21tYW5kKHVkLCBkLCAidXBkYXRlIikKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLm1vZGRpcikKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIHVwZGF0ZWNtZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZCh1cGRhdGVjbWQsIGQpCisgICAgICAgICAgICBleGNlcHQgYmIuZmV0Y2gyLkZldGNoRXJyb3I6CisgICAgICAgICAgICAgICAgIyBSdW5ubmluZyBwdWxsIGluIHRoZSByZXBvCisgICAgICAgICAgICAgICAgcHVsbGNtZCA9IHNlbGYuX2J1aWxkaGdjb21tYW5kKHVkLCBkLCAicHVsbCIpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlB1bGxpbmcgIiArIHVkLnVybCkKKyAgICAgICAgICAgICAgICAjIHVwZGF0ZSBzb3VyY2VzIHRoZXJlCisgICAgICAgICAgICAgICAgb3MuY2hkaXIodWQubW9kZGlyKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIHB1bGxjbWQpCisgICAgICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIHB1bGxjbWQsIHVkLnVybCkKKyAgICAgICAgICAgICAgICBydW5mZXRjaGNtZChwdWxsY21kLCBkKQorICAgICAgICAgICAgICAgIHVkLnJlcG9jaGFuZ2VkID0gVHJ1ZQorCisgICAgICAgICMgTm8gc291cmNlIGZvdW5kLCBjbG9uZSBpdC4KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVkLm1vZGRpcik6CisgICAgICAgICAgICBmZXRjaGNtZCA9IHNlbGYuX2J1aWxkaGdjb21tYW5kKHVkLCBkLCAiZmV0Y2giKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZldGNoICIgKyB1ZC51cmwpCisgICAgICAgICAgICAjIGNoZWNrIG91dCBzb3VyY2VzIHRoZXJlCisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIodWQucGtnZGlyKQorICAgICAgICAgICAgb3MuY2hkaXIodWQucGtnZGlyKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzIiwgZmV0Y2hjbWQpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgZmV0Y2hjbWQsIHVkLnVybCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKGZldGNoY21kLCBkKQorCisgICAgICAgICMgRXZlbiB3aGVuIHdlIGNsb25lIChmZXRjaCksIHdlIHN0aWxsIG5lZWQgdG8gdXBkYXRlIGFzIGhnJ3MgY2xvbmUKKyAgICAgICAgIyB3b24ndCBjaGVja291dCB0aGUgc3BlY2lmaWVkIHJldmlzaW9uIGlmIGl0cyBvbiBhIGJyYW5jaAorICAgICAgICB1cGRhdGVjbWQgPSBzZWxmLl9idWlsZGhnY29tbWFuZCh1ZCwgZCwgInVwZGF0ZSIpCisgICAgICAgIG9zLmNoZGlyKHVkLm1vZGRpcikKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzIiwgdXBkYXRlY21kKQorICAgICAgICBydW5mZXRjaGNtZCh1cGRhdGVjbWQsIGQpCisKKyAgICBkZWYgY2xlYW4oc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIgQ2xlYW4gdGhlIGhnIGRpciAiIiIKKworICAgICAgICBiYi51dGlscy5yZW1vdmUodWQubG9jYWxwYXRoLCBUcnVlKQorICAgICAgICBiYi51dGlscy5yZW1vdmUodWQuZnVsbG1pcnJvcikKKyAgICAgICAgYmIudXRpbHMucmVtb3ZlKHVkLmZ1bGxtaXJyb3IgKyAiLmRvbmUiKQorCisgICAgZGVmIHN1cHBvcnRzX3NyY3JldihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfbGF0ZXN0X3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbXB1dGUgdGlwIHJldmlzaW9uIGZvciB0aGUgdXJsCisgICAgICAgICIiIgorICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgc2VsZi5fYnVpbGRoZ2NvbW1hbmQodWQsIGQsICJpbmZvIikpCisgICAgICAgIG91dHB1dCA9IHJ1bmZldGNoY21kKHNlbGYuX2J1aWxkaGdjb21tYW5kKHVkLCBkLCAiaW5mbyIpLCBkKQorICAgICAgICByZXR1cm4gb3V0cHV0LnN0cmlwKCkKKworICAgIGRlZiBfYnVpbGRfcmV2aXNpb24oc2VsZiwgdWQsIGQsIG5hbWUpOgorICAgICAgICByZXR1cm4gdWQucmV2aXNpb24KKworICAgIGRlZiBfcmV2aXNpb25fa2V5KHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHVuaXF1ZSBrZXkgZm9yIHRoZSB1cmwKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiaGc6IiArIHVkLm1vZGRpcgorCisgICAgZGVmIGJ1aWxkX21pcnJvcl9kYXRhKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIyBHZW5lcmF0ZSBhIG1pcnJvciB0YXJiYWxsIGlmIG5lZWRlZAorICAgICAgICBpZiB1ZC53cml0ZV90YXJiYWxscyA9PSAiMSIgYW5kICh1ZC5yZXBvY2hhbmdlZCBvciBub3Qgb3MucGF0aC5leGlzdHModWQuZnVsbG1pcnJvcikpOgorICAgICAgICAgICAgIyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBzeW1saW5rIHBvaW50cyB0byByZWFkLW9ubHkgZmlsZXN5c3RlbSB3aXRoIFBSRU1JUlJPUgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsodWQuZnVsbG1pcnJvcik6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHVkLmZ1bGxtaXJyb3IpCisKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDcmVhdGluZyB0YXJiYWxsIG9mIGhnIHJlcG9zaXRvcnkiKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInRhciAtY3pmICVzICVzIiAlICh1ZC5mdWxsbWlycm9yLCB1ZC5tb2R1bGUpLCBkKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoInRvdWNoICVzLmRvbmUiICUgKHVkLmZ1bGxtaXJyb3IpLCBkKQorCisgICAgZGVmIGxvY2FscGF0aChzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiB1ZC5wa2dkaXIKKworICAgIGRlZiB1bnBhY2soc2VsZiwgdWQsIGRlc3RkaXIsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFrZSBhIGxvY2FsIGNsb25lIG9yIGV4cG9ydCBmb3IgdGhlIHVybAorICAgICAgICAiIiIKKworICAgICAgICByZXZmbGFnID0gIi1yICVzIiAlIHVkLnJldmlzaW9uCisgICAgICAgIHN1YmRpciA9IHVkLnBhcm0uZ2V0KCJkZXN0c3VmZml4IiwgdWQubW9kdWxlKQorICAgICAgICBjb2RpciA9ICIlcy8lcyIgJSAoZGVzdGRpciwgc3ViZGlyKQorCisgICAgICAgIHNjbWRhdGEgPSB1ZC5wYXJtLmdldCgic2NtZGF0YSIsICIiKQorICAgICAgICBpZiBzY21kYXRhICE9ICJub2tlZXAiOgorICAgICAgICAgICAgaWYgbm90IG9zLmFjY2Vzcyhvcy5wYXRoLmpvaW4oY29kaXIsICcuaGcnKSwgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJVbnBhY2s6IGNyZWF0aW5nIG5ldyBoZyByZXBvc2l0b3J5IGluICciICsgY29kaXIgKyAiJyIpCisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIGluaXQgJXMiICUgKHVkLmJhc2VjbWQsIGNvZGlyKSwgZCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiVW5wYWNrOiB1cGRhdGluZyBzb3VyY2UgaW4gJyIgKyBjb2RpciArICInIikKKyAgICAgICAgICAgIG9zLmNoZGlyKGNvZGlyKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQoIiVzIHB1bGwgJXMiICUgKHVkLmJhc2VjbWQsIHVkLm1vZGRpciksIGQpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgdXAgLUMgJXMiICUgKHVkLmJhc2VjbWQsIHJldmZsYWcpLCBkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJVbnBhY2s6IGV4dHJhY3Rpbmcgc291cmNlIHRvICciICsgY29kaXIgKyAiJyIpCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5tb2RkaXIpCisgICAgICAgICAgICBydW5mZXRjaGNtZCgiJXMgYXJjaGl2ZSAtdCBmaWxlcyAlcyAlcyIgJSAodWQuYmFzZWNtZCwgcmV2ZmxhZywgY29kaXIpLCBkKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2xvY2FsLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL2xvY2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTIxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvbG9jYWwucHkKQEAgLTAsMCArMSwxMjggQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBpbXBsZW1lbnRhdGlvbnMKKworQ2xhc3NlcyBmb3Igb2J0YWluaW5nIHVwc3RyZWFtIHNvdXJjZXMgZm9yIHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworaW1wb3J0IG9zCitpbXBvcnQgdXJsbGliCitpbXBvcnQgYmIKK2ltcG9ydCBiYi51dGlscworZnJvbSAgIGJiIGltcG9ydCBkYXRhCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaE1ldGhvZCwgRmV0Y2hFcnJvcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgbG9nZ2VyCisKK2NsYXNzIExvY2FsKEZldGNoTWV0aG9kKToKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgcmVwcmVzZW50cyBhIGxvY2FsIGZldGNoLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHVybGRhdGEudHlwZSBpbiBbJ2ZpbGUnXQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgICMgV2UgZG9uJ3Qgc2V0IGxvY2FsZmlsZSBhcyBmb3IgdGhpcyBmZXRjaGVyIHRoZSBmaWxlIGlzIGFscmVhZHkgbG9jYWwhCisgICAgICAgIHVkLmRlY29kZWR1cmwgPSB1cmxsaWIudW5xdW90ZSh1ZC51cmwuc3BsaXQoIjovLyIpWzFdLnNwbGl0KCI7IilbMF0pCisgICAgICAgIHVkLmJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZSh1ZC5kZWNvZGVkdXJsKQorICAgICAgICB1ZC5iYXNlcGF0aCA9IHVkLmRlY29kZWR1cmwKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgbG9jYWxwYXRoKHNlbGYsIHVybGRhdGEsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBsb2NhbCBmaWxlbmFtZSBvZiBhIGdpdmVuIHVybCBhc3N1bWluZyBhIHN1Y2Nlc3NmdWwgZmV0Y2guCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5sb2NhbHBhdGhzKHVybGRhdGEsIGQpWy0xXQorCisgICAgZGVmIGxvY2FscGF0aHMoc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGxvY2FsIGZpbGVuYW1lIG9mIGEgZ2l2ZW4gdXJsIGFzc3VtaW5nIGEgc3VjY2Vzc2Z1bCBmZXRjaC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlYXJjaGVkID0gW10KKyAgICAgICAgcGF0aCA9IHVybGRhdGEuZGVjb2RlZHVybAorICAgICAgICBuZXdwYXRoID0gcGF0aAorICAgICAgICBpZiBwYXRoWzBdID09ICIvIjoKKyAgICAgICAgICAgIHJldHVybiBbcGF0aF0KKyAgICAgICAgZmlsZXNwYXRoID0gZGF0YS5nZXRWYXIoJ0ZJTEVTUEFUSCcsIGQsIFRydWUpCisgICAgICAgIGlmIGZpbGVzcGF0aDoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiU2VhcmNoaW5nIGZvciAlcyBpbiBwYXRoczpcbiAgICAlcyIgJSAocGF0aCwgIlxuICAgICIuam9pbihmaWxlc3BhdGguc3BsaXQoIjoiKSkpKQorICAgICAgICAgICAgbmV3cGF0aCwgaGlzdCA9IGJiLnV0aWxzLndoaWNoKGZpbGVzcGF0aCwgcGF0aCwgaGlzdG9yeT1UcnVlKQorICAgICAgICAgICAgc2VhcmNoZWQuZXh0ZW5kKGhpc3QpCisgICAgICAgIGlmIG5vdCBuZXdwYXRoOgorICAgICAgICAgICAgZmlsZXNkaXIgPSBkYXRhLmdldFZhcignRklMRVNESVInLCBkLCBUcnVlKQorICAgICAgICAgICAgaWYgZmlsZXNkaXI6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJTZWFyY2hpbmcgZm9yICVzIGluIHBhdGg6ICVzIiAlIChwYXRoLCBmaWxlc2RpcikpCisgICAgICAgICAgICAgICAgbmV3cGF0aCA9IG9zLnBhdGguam9pbihmaWxlc2RpciwgcGF0aCkKKyAgICAgICAgICAgICAgICBzZWFyY2hlZC5hcHBlbmQobmV3cGF0aCkKKyAgICAgICAgaWYgKG5vdCBuZXdwYXRoIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhuZXdwYXRoKSkgYW5kIHBhdGguZmluZCgiKiIpICE9IC0xOgorICAgICAgICAgICAgIyBGb3IgZXhwcmVzc2lvbnMgdXNpbmcgJyonLCBiZXN0IHdlIGNhbiBkbyBpcyB0YWtlIHRoZSBmaXJzdCBkaXJlY3RvcnkgaW4gRklMRVNQQVRIIHRoYXQgZXhpc3RzCisgICAgICAgICAgICBuZXdwYXRoLCBoaXN0ID0gYmIudXRpbHMud2hpY2goZmlsZXNwYXRoLCAiLiIsIGhpc3Rvcnk9VHJ1ZSkKKyAgICAgICAgICAgIHNlYXJjaGVkLmV4dGVuZChoaXN0KQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJTZWFyY2hpbmcgZm9yICVzIGluIHBhdGg6ICVzIiAlIChwYXRoLCBuZXdwYXRoKSkKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hlZAorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmV3cGF0aCk6CisgICAgICAgICAgICBkbGRpcmZpbGUgPSBvcy5wYXRoLmpvaW4oZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpLCBwYXRoKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJEZWZhdWx0aW5nIHRvICVzIGZvciAlcyIgJSAoZGxkaXJmaWxlLCBwYXRoKSkKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoZGxkaXJmaWxlKSkKKyAgICAgICAgICAgIHNlYXJjaGVkLmFwcGVuZChkbGRpcmZpbGUpCisgICAgICAgICAgICByZXR1cm4gc2VhcmNoZWQKKyAgICAgICAgcmV0dXJuIHNlYXJjaGVkCisKKyAgICBkZWYgbmVlZF91cGRhdGUoc2VsZiwgdWQsIGQpOgorICAgICAgICBpZiB1ZC51cmwuZmluZCgiKiIpICE9IC0xOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJscyAobm8tb3AgZm9yIExvY2FsIG1ldGhvZCkiIiIKKyAgICAgICAgIyBubyBuZWVkIHRvIGZldGNoIGxvY2FsIGZpbGVzLCB3ZSdsbCBkZWFsIHdpdGggdGhlbSBpbiBwbGFjZS4KKyAgICAgICAgaWYgc2VsZi5zdXBwb3J0c19jaGVja3N1bSh1cmxkYXRhKSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVybGRhdGEubG9jYWxwYXRoKToKKyAgICAgICAgICAgIGxvY2F0aW9ucyA9IFtdCisgICAgICAgICAgICBmaWxlc3BhdGggPSBkYXRhLmdldFZhcignRklMRVNQQVRIJywgZCwgVHJ1ZSkKKyAgICAgICAgICAgIGlmIGZpbGVzcGF0aDoKKyAgICAgICAgICAgICAgICBsb2NhdGlvbnMgPSBmaWxlc3BhdGguc3BsaXQoIjoiKQorICAgICAgICAgICAgZmlsZXNkaXIgPSBkYXRhLmdldFZhcignRklMRVNESVInLCBkLCBUcnVlKQorICAgICAgICAgICAgaWYgZmlsZXNkaXI6CisgICAgICAgICAgICAgICAgbG9jYXRpb25zLmFwcGVuZChmaWxlc2RpcikKKyAgICAgICAgICAgIGxvY2F0aW9ucy5hcHBlbmQoZC5nZXRWYXIoIkRMX0RJUiIsIFRydWUpKQorCisgICAgICAgICAgICBtc2cgPSAiVW5hYmxlIHRvIGZpbmQgZmlsZSAiICsgdXJsZGF0YS51cmwgKyAiIGFueXdoZXJlLiBUaGUgcGF0aHMgdGhhdCB3ZXJlIHNlYXJjaGVkIHdlcmU6XG4gICAgIiArICJcbiAgICAiLmpvaW4obG9jYXRpb25zKQorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcihtc2cpCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja3N0YXR1cyhzZWxmLCBmZXRjaCwgdXJsZGF0YSwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSB1cmwKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHVybGRhdGEubG9jYWxwYXRoLmZpbmQoIioiKSAhPSAtMToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVUkwgJXMgbG9va3MgbGlrZSBhIGdsb2IgYW5kIHdhcyB0aGVyZWZvcmUgbm90IGNoZWNrZWQuIiwgdXJsZGF0YS51cmwpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh1cmxkYXRhLmxvY2FscGF0aCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBjbGVhbihzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgcmV0dXJuCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9vc2MucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvb3NjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODc3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvb3NjLnB5CkBAIC0wLDAgKzEsMTM1IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRiYWtlICJGZXRjaCIgaW1wbGVtZW50YXRpb24gZm9yIG9zYyAoT3BlbnN1c2UgYnVpbGQgc2VydmljZSBjbGllbnQpLgorQmFzZWQgb24gdGhlIHN2biAiRmV0Y2giIGltcGxlbWVudGF0aW9uLgorCisiIiIKKworaW1wb3J0ICBvcworaW1wb3J0ICBzeXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgIGJiCitmcm9tICAgIGJiICAgICAgIGltcG9ydCBkYXRhCitmcm9tICAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaEVycm9yCitmcm9tICAgIGJiLmZldGNoMiBpbXBvcnQgTWlzc2luZ1BhcmFtZXRlckVycm9yCitmcm9tICAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKKworY2xhc3MgT3NjKEZldGNoTWV0aG9kKToKKyAgICAiIiJDbGFzcyB0byBmZXRjaCBhIG1vZHVsZSBvciBtb2R1bGVzIGZyb20gT3BlbnN1c2UgYnVpbGQgc2VydmVyCisgICAgICAgcmVwb3NpdG9yaWVzLiIiIgorCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIG9zYy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsnb3NjJ10KKworICAgIGRlZiB1cmxkYXRhX2luaXQoc2VsZiwgdWQsIGQpOgorICAgICAgICBpZiBub3QgIm1vZHVsZSIgaW4gdWQucGFybToKKyAgICAgICAgICAgIHJhaXNlIE1pc3NpbmdQYXJhbWV0ZXJFcnJvcignbW9kdWxlJywgdWQudXJsKQorCisgICAgICAgIHVkLm1vZHVsZSA9IHVkLnBhcm1bIm1vZHVsZSJdCisKKyAgICAgICAgIyBDcmVhdGUgcGF0aHMgdG8gb3NjIGNoZWNrb3V0cworICAgICAgICByZWxwYXRoID0gc2VsZi5fc3RyaXBfbGVhZGluZ19zbGFzaGVzKHVkLnBhdGgpCisgICAgICAgIHVkLnBrZ2RpciA9IG9zLnBhdGguam9pbihkYXRhLmV4cGFuZCgnJHtPU0NESVJ9JywgZCksIHVkLmhvc3QpCisgICAgICAgIHVkLm1vZGRpciA9IG9zLnBhdGguam9pbih1ZC5wa2dkaXIsIHJlbHBhdGgsIHVkLm1vZHVsZSkKKworICAgICAgICBpZiAncmV2JyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgdWQucmV2aXNpb24gPSB1ZC5wYXJtWydyZXYnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHYgPSBkYXRhLmdldFZhcigiUFYiLCBkLCAwKQorICAgICAgICAgICAgcmV2ID0gYmIuZmV0Y2gyLnNyY3Jldl9pbnRlcm5hbF9oZWxwZXIodWQsIGQpCisgICAgICAgICAgICBpZiByZXYgYW5kIHJldiAhPSBUcnVlOgorICAgICAgICAgICAgICAgIHVkLnJldmlzaW9uID0gcmV2CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVkLnJldmlzaW9uID0gIiIKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCgnJXNfJXNfJXMudGFyLmd6JyAlICh1ZC5tb2R1bGUucmVwbGFjZSgnLycsICcuJyksIHVkLnBhdGgucmVwbGFjZSgnLycsICcuJyksIHVkLnJldmlzaW9uKSwgZCkKKworICAgIGRlZiBfYnVpbGRvc2Njb21tYW5kKHNlbGYsIHVkLCBkLCBjb21tYW5kKToKKyAgICAgICAgIiIiCisgICAgICAgIEJ1aWxkIHVwIGFuIG9jcyBjb21tYW5kbGluZSBiYXNlZCBvbiB1ZAorICAgICAgICBjb21tYW5kIGlzICJmZXRjaCIsICJ1cGRhdGUiLCAiaW5mbyIKKyAgICAgICAgIiIiCisKKyAgICAgICAgYmFzZWNtZCA9IGRhdGEuZXhwYW5kKCcke0ZFVENIQ01EX29zY30nLCBkKQorCisgICAgICAgIHByb3RvID0gdWQucGFybS5nZXQoJ3Byb3RvY29sJywgJ29jcycpCisKKyAgICAgICAgb3B0aW9ucyA9IFtdCisKKyAgICAgICAgY29uZmlnID0gIi1jICVzIiAlIHNlbGYuZ2VuZXJhdGVfY29uZmlnKHVkLCBkKQorCisgICAgICAgIGlmIHVkLnJldmlzaW9uOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1yICVzIiAlIHVkLnJldmlzaW9uKQorCisgICAgICAgIGNvcm9vdCA9IHNlbGYuX3N0cmlwX2xlYWRpbmdfc2xhc2hlcyh1ZC5wYXRoKQorCisgICAgICAgIGlmIGNvbW1hbmQgPT0gImZldGNoIjoKKyAgICAgICAgICAgIG9zY2NtZCA9ICIlcyAlcyBjbyAlcy8lcyAlcyIgJSAoYmFzZWNtZCwgY29uZmlnLCBjb3Jvb3QsIHVkLm1vZHVsZSwgIiAiLmpvaW4ob3B0aW9ucykpCisgICAgICAgIGVsaWYgY29tbWFuZCA9PSAidXBkYXRlIjoKKyAgICAgICAgICAgIG9zY2NtZCA9ICIlcyAlcyB1cCAlcyIgJSAoYmFzZWNtZCwgY29uZmlnLCAiICIuam9pbihvcHRpb25zKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkludmFsaWQgb3NjIGNvbW1hbmQgJXMiICUgY29tbWFuZCwgdWQudXJsKQorCisgICAgICAgIHJldHVybiBvc2NjbWQKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBGZXRjaCB1cmwKKyAgICAgICAgIiIiCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJGZXRjaDogY2hlY2tpbmcgZm9yIG1vZHVsZSBkaXJlY3RvcnkgJyIgKyB1ZC5tb2RkaXIgKyAiJyIpCisKKyAgICAgICAgaWYgb3MuYWNjZXNzKG9zLnBhdGguam9pbihkYXRhLmV4cGFuZCgnJHtPU0NESVJ9JywgZCksIHVkLnBhdGgsIHVkLm1vZHVsZSksIG9zLlJfT0spOgorICAgICAgICAgICAgb3NjdXBkYXRlY21kID0gc2VsZi5fYnVpbGRvc2Njb21tYW5kKHVkLCBkLCAidXBkYXRlIikKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVcGRhdGUgIisgdWQudXJsKQorICAgICAgICAgICAgIyB1cGRhdGUgc291cmNlcyB0aGVyZQorICAgICAgICAgICAgb3MuY2hkaXIodWQubW9kZGlyKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzIiwgb3NjdXBkYXRlY21kKQorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIG9zY3VwZGF0ZWNtZCwgdWQudXJsKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQob3NjdXBkYXRlY21kLCBkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3NjZmV0Y2hjbWQgPSBzZWxmLl9idWlsZG9zY2NvbW1hbmQodWQsIGQsICJmZXRjaCIpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiRmV0Y2ggIiArIHVkLnVybCkKKyAgICAgICAgICAgICMgY2hlY2sgb3V0IHNvdXJjZXMgdGhlcmUKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBvcy5jaGRpcih1ZC5wa2dkaXIpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBvc2NmZXRjaGNtZCkKKyAgICAgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBvc2NmZXRjaGNtZCwgdWQudXJsKQorICAgICAgICAgICAgcnVuZmV0Y2hjbWQob3NjZmV0Y2hjbWQsIGQpCisKKyAgICAgICAgb3MuY2hkaXIob3MucGF0aC5qb2luKHVkLnBrZ2RpciArIHVkLnBhdGgpKQorICAgICAgICAjIHRhciB0aGVtIHVwIHRvIGEgZGVmaW5lZCBmaWxlbmFtZQorICAgICAgICBydW5mZXRjaGNtZCgidGFyIC1jemYgJXMgJXMiICUgKHVkLmxvY2FscGF0aCwgdWQubW9kdWxlKSwgZCwgY2xlYW51cCA9IFt1ZC5sb2NhbHBhdGhdKQorCisgICAgZGVmIHN1cHBvcnRzX3NyY3JldihzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZ2VuZXJhdGVfY29uZmlnKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRlIGEgLm9zY3JjIHRvIGJlIHVzZWQgZm9yIHRoaXMgcnVuLgorICAgICAgICAiIiIKKworICAgICAgICBjb25maWdfcGF0aCA9IG9zLnBhdGguam9pbihkYXRhLmV4cGFuZCgnJHtPU0NESVJ9JywgZCksICJvc2NyYyIpCisgICAgICAgIGlmIChvcy5wYXRoLmV4aXN0cyhjb25maWdfcGF0aCkpOgorICAgICAgICAgICAgb3MucmVtb3ZlKGNvbmZpZ19wYXRoKQorCisgICAgICAgIGYgPSBvcGVuKGNvbmZpZ19wYXRoLCAndycpCisgICAgICAgIGYud3JpdGUoIltnZW5lcmFsXVxuIikKKyAgICAgICAgZi53cml0ZSgiYXBpc3J2ID0gJXNcbiIgJSB1ZC5ob3N0KQorICAgICAgICBmLndyaXRlKCJzY2hlbWUgPSBodHRwXG4iKQorICAgICAgICBmLndyaXRlKCJzdS13cmFwcGVyID0gc3UgLWNcbiIpCisgICAgICAgIGYud3JpdGUoImJ1aWxkLXJvb3QgPSAlc1xuIiAlIGRhdGEuZXhwYW5kKCcke1dPUktESVJ9JywgZCkpCisgICAgICAgIGYud3JpdGUoInVybGxpc3QgPSBodHRwOi8vbW9ibGluLW9icy5qZi5pbnRlbC5jb206ODg4OC9idWlsZC8lKHByb2plY3Qpcy8lKHJlcG9zaXRvcnkpcy8lKGJ1aWxkYXJjaClzLzpmdWxsLyUobmFtZSlzLnJwbVxuIikKKyAgICAgICAgZi53cml0ZSgiZXh0cmEtcGtncyA9IGd6aXBcbiIpCisgICAgICAgIGYud3JpdGUoIlxuIikKKyAgICAgICAgZi53cml0ZSgiWyVzXVxuIiAlIHVkLmhvc3QpCisgICAgICAgIGYud3JpdGUoInVzZXIgPSAlc1xuIiAlIHVkLnBhcm1bInVzZXIiXSkKKyAgICAgICAgZi53cml0ZSgicGFzcyA9ICVzXG4iICUgdWQucGFybVsicHN3ZCJdKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICByZXR1cm4gY29uZmlnX3BhdGgKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9wZXJmb3JjZS5weSBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9wZXJmb3JjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEwYzdjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3BlcmZvcmNlLnB5CkBAIC0wLDAgKzEsMTg3IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdGZXRjaCcgaW1wbGVtZW50YXRpb25zCisKK0NsYXNzZXMgZm9yIG9idGFpbmluZyB1cHN0cmVhbSBzb3VyY2VzIGZvciB0aGUKK0JpdEJha2UgYnVpbGQgdG9vbHMuCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2Zyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCB6aXAKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2Zyb20gICBiYiBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKKworY2xhc3MgUGVyZm9yY2UoRmV0Y2hNZXRob2QpOgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsncDQnXQorCisgICAgZGVmIGRvcGFyc2UodXJsLCBkKToKKyAgICAgICAgcGFybSA9IHt9CisgICAgICAgIHBhdGggPSB1cmwuc3BsaXQoIjovLyIpWzFdCisgICAgICAgIGRlbGltID0gcGF0aC5maW5kKCJAIik7CisgICAgICAgIGlmIGRlbGltICE9IC0xOgorICAgICAgICAgICAgKHVzZXIsIHBzd2QsIGhvc3QsIHBvcnQpID0gcGF0aC5zcGxpdCgnQCcpWzBdLnNwbGl0KCI6IikKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KCdAJylbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIChob3N0LCBwb3J0KSA9IGQuZ2V0VmFyKCdQNFBPUlQnLCBGYWxzZSkuc3BsaXQoJzonKQorICAgICAgICAgICAgdXNlciA9ICIiCisgICAgICAgICAgICBwc3dkID0gIiIKKworICAgICAgICBpZiBwYXRoLmZpbmQoIjsiKSAhPSAtMToKKyAgICAgICAgICAgIGtleXM9W10KKyAgICAgICAgICAgIHZhbHVlcz1bXQorICAgICAgICAgICAgcGxpc3QgPSBwYXRoLnNwbGl0KCc7JykKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHBsaXN0OgorICAgICAgICAgICAgICAgIGlmIGl0ZW0uY291bnQoJz0nKToKKyAgICAgICAgICAgICAgICAgICAgKGtleSwgdmFsdWUpID0gaXRlbS5zcGxpdCgnPScpCisgICAgICAgICAgICAgICAgICAgIGtleXMuYXBwZW5kKGtleSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCh2YWx1ZSkKKworICAgICAgICAgICAgcGFybSA9IGRpY3QoemlwKGtleXMsIHZhbHVlcykpCisgICAgICAgIHBhdGggPSAiLy8iICsgcGF0aC5zcGxpdCgnOycpWzBdCisgICAgICAgIGhvc3QgKz0gIjolcyIgJSAocG9ydCkKKyAgICAgICAgcGFybVsiY3NldCJdID0gUGVyZm9yY2UuZ2V0Y3NldChkLCBwYXRoLCBob3N0LCB1c2VyLCBwc3dkLCBwYXJtKQorCisgICAgICAgIHJldHVybiBob3N0LCBwYXRoLCB1c2VyLCBwc3dkLCBwYXJtCisgICAgZG9wYXJzZSA9IHN0YXRpY21ldGhvZChkb3BhcnNlKQorCisgICAgZGVmIGdldGNzZXQoZCwgZGVwb3QsIGhvc3QsIHVzZXIsIHBzd2QsIHBhcm0pOgorICAgICAgICBwNG9wdCA9ICIiCisgICAgICAgIGlmICJjc2V0IiBpbiBwYXJtOgorICAgICAgICAgICAgcmV0dXJuIHBhcm1bImNzZXQiXTsKKyAgICAgICAgaWYgdXNlcjoKKyAgICAgICAgICAgIHA0b3B0ICs9ICIgLXUgJXMiICUgKHVzZXIpCisgICAgICAgIGlmIHBzd2Q6CisgICAgICAgICAgICBwNG9wdCArPSAiIC1QICVzIiAlIChwc3dkKQorICAgICAgICBpZiBob3N0OgorICAgICAgICAgICAgcDRvcHQgKz0gIiAtcCAlcyIgJSAoaG9zdCkKKworICAgICAgICBwNGRhdGUgPSBkLmdldFZhcigiUDREQVRFIiwgVHJ1ZSkKKyAgICAgICAgaWYgInJldmlzaW9uIiBpbiBwYXJtOgorICAgICAgICAgICAgZGVwb3QgKz0gIiMlcyIgJSAocGFybVsicmV2aXNpb24iXSkKKyAgICAgICAgZWxpZiAibGFiZWwiIGluIHBhcm06CisgICAgICAgICAgICBkZXBvdCArPSAiQCVzIiAlIChwYXJtWyJsYWJlbCJdKQorICAgICAgICBlbGlmIHA0ZGF0ZToKKyAgICAgICAgICAgIGRlcG90ICs9ICJAJXMiICUgKHA0ZGF0ZSkKKworICAgICAgICBwNGNtZCA9IGQuZ2V0VmFyKCdGRVRDSENNRF9wNCcsIFRydWUpIG9yICJwNCIKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSdW5uaW5nICVzJXMgY2hhbmdlcyAtbSAxICVzIiwgcDRjbWQsIHA0b3B0LCBkZXBvdCkKKyAgICAgICAgcDRmaWxlLCBlcnJvcnMgPSBiYi5wcm9jZXNzLnJ1bigiJXMlcyBjaGFuZ2VzIC1tIDEgJXMiICUgKHA0Y21kLCBwNG9wdCwgZGVwb3QpKQorICAgICAgICBjc2V0ID0gcDRmaWxlLnN0cmlwKCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSRUFEICVzIiwgY3NldCkKKyAgICAgICAgaWYgbm90IGNzZXQ6CisgICAgICAgICAgICByZXR1cm4gLTEKKworICAgICAgICByZXR1cm4gY3NldC5zcGxpdCgnICcpWzFdCisgICAgZ2V0Y3NldCA9IHN0YXRpY21ldGhvZChnZXRjc2V0KQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgIChob3N0LCBwYXRoLCB1c2VyLCBwc3dkLCBwYXJtKSA9IFBlcmZvcmNlLmRvcGFyc2UodWQudXJsLCBkKQorCisgICAgICAgIGJhc2VfcGF0aCA9IHBhdGgucmVwbGFjZSgnLy4uLicsICcnKQorICAgICAgICBiYXNlX3BhdGggPSBzZWxmLl9zdHJpcF9sZWFkaW5nX3NsYXNoZXMoYmFzZV9wYXRoKQorICAgICAgICAKKyAgICAgICAgaWYgImxhYmVsIiBpbiBwYXJtOgorICAgICAgICAgICAgdmVyc2lvbiA9IHBhcm1bImxhYmVsIl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZlcnNpb24gPSBQZXJmb3JjZS5nZXRjc2V0KGQsIHBhdGgsIGhvc3QsIHVzZXIsIHBzd2QsIHBhcm0pCisKKyAgICAgICAgdWQubG9jYWxmaWxlID0gZGF0YS5leHBhbmQoJyVzKyVzKyVzLnRhci5neicgJSAoaG9zdCwgYmFzZV9wYXRoLnJlcGxhY2UoJy8nLCAnLicpLCB2ZXJzaW9uKSwgZCkKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBGZXRjaCB1cmxzCisgICAgICAgICIiIgorCisgICAgICAgIChob3N0LCBkZXBvdCwgdXNlciwgcHN3ZCwgcGFybSkgPSBQZXJmb3JjZS5kb3BhcnNlKHVkLnVybCwgZCkKKworICAgICAgICBpZiBkZXBvdC5maW5kKCcvLi4uJykgIT0gLTE6CisgICAgICAgICAgICBwYXRoID0gZGVwb3RbOmRlcG90LmZpbmQoJy8uLi4nKV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBkZXBvdFs6ZGVwb3QucmZpbmQoJy8nKV0KKworICAgICAgICBtb2R1bGUgPSBwYXJtLmdldCgnbW9kdWxlJywgb3MucGF0aC5iYXNlbmFtZShwYXRoKSkKKworICAgICAgICAjIEdldCB0aGUgcDQgY29tbWFuZAorICAgICAgICBwNG9wdCA9ICIiCisgICAgICAgIGlmIHVzZXI6CisgICAgICAgICAgICBwNG9wdCArPSAiIC11ICVzIiAlICh1c2VyKQorCisgICAgICAgIGlmIHBzd2Q6CisgICAgICAgICAgICBwNG9wdCArPSAiIC1QICVzIiAlIChwc3dkKQorCisgICAgICAgIGlmIGhvc3Q6CisgICAgICAgICAgICBwNG9wdCArPSAiIC1wICVzIiAlIChob3N0KQorCisgICAgICAgIHA0Y21kID0gZC5nZXRWYXIoJ0ZFVENIQ01EX3A0JywgVHJ1ZSkgb3IgInA0IgorCisgICAgICAgICMgY3JlYXRlIHRlbXAgZGlyZWN0b3J5CisgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiRmV0Y2g6IGNyZWF0aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkiKQorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIoZC5leHBhbmQoJyR7V09SS0RJUn0nKSkKKyAgICAgICAgbWt0ZW1wID0gZC5nZXRWYXIoIkZFVENIQ01EX3A0bWt0ZW1wIiwgVHJ1ZSkgb3IgZC5leHBhbmQoIm1rdGVtcCAtZCAtcSAnJHtXT1JLRElSfS9vZXA0LlhYWFhYWCciKQorICAgICAgICB0bXBmaWxlLCBlcnJvcnMgPSBiYi5wcm9jZXNzLnJ1bihta3RlbXApCisgICAgICAgIHRtcGZpbGUgPSB0bXBmaWxlLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IHRtcGZpbGU6CisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJGZXRjaDogdW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5Li4gbWFrZSBzdXJlICdta3RlbXAnIGlzIGluIHRoZSBQQVRILiIsIHVkLnVybCkKKworICAgICAgICBpZiAibGFiZWwiIGluIHBhcm06CisgICAgICAgICAgICBkZXBvdCA9ICIlc0AlcyIgJSAoZGVwb3QsIHBhcm1bImxhYmVsIl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjc2V0ID0gUGVyZm9yY2UuZ2V0Y3NldChkLCBkZXBvdCwgaG9zdCwgdXNlciwgcHN3ZCwgcGFybSkKKyAgICAgICAgICAgIGRlcG90ID0gIiVzQCVzIiAlIChkZXBvdCwgY3NldCkKKworICAgICAgICBvcy5jaGRpcih0bXBmaWxlKQorICAgICAgICBsb2dnZXIuaW5mbygiRmV0Y2ggIiArIHVkLnVybCkKKyAgICAgICAgbG9nZ2VyLmluZm8oIiVzJXMgZmlsZXMgJXMiLCBwNGNtZCwgcDRvcHQsIGRlcG90KQorICAgICAgICBwNGZpbGUsIGVycm9ycyA9IGJiLnByb2Nlc3MucnVuKCIlcyVzIGZpbGVzICVzIiAlIChwNGNtZCwgcDRvcHQsIGRlcG90KSkKKyAgICAgICAgcDRmaWxlID0gW2YucnN0cmlwKCkgZm9yIGYgaW4gcDRmaWxlLnNwbGl0bGluZXMoKV0KKworICAgICAgICBpZiBub3QgcDRmaWxlOgorICAgICAgICAgICAgcmFpc2UgRmV0Y2hFcnJvcigiRmV0Y2g6IHVuYWJsZSB0byBnZXQgdGhlIFA0IGZpbGVzIGZyb20gJXMiICUgZGVwb3QsIHVkLnVybCkKKworICAgICAgICBjb3VudCA9IDAKKworICAgICAgICBmb3IgZmlsZSBpbiBwNGZpbGU6CisgICAgICAgICAgICBsaXN0ID0gZmlsZS5zcGxpdCgpCisKKyAgICAgICAgICAgIGlmIGxpc3RbMl0gPT0gImRlbGV0ZSI6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZGVzdCA9IGxpc3RbMF1bbGVuKHBhdGgpKzE6XQorICAgICAgICAgICAgd2hlcmUgPSBkZXN0LmZpbmQoIiMiKQorCisgICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoIiVzJXMgcHJpbnQgLW8gJXMvJXMgJXMiICUgKHA0Y21kLCBwNG9wdCwgbW9kdWxlLCBkZXN0Wzp3aGVyZV0sIGxpc3RbMF0pLCBzaGVsbD1UcnVlKQorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKworICAgICAgICBpZiBjb3VudCA9PSAwOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCkKKyAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkZldGNoOiBObyBmaWxlcyBnYXRoZXJlZCBmcm9tIHRoZSBQNCBmZXRjaCIsIHVkLnVybCkKKworICAgICAgICBydW5mZXRjaGNtZCgidGFyIC1jemYgJXMgJXMiICUgKHVkLmxvY2FscGF0aCwgbW9kdWxlKSwgZCwgY2xlYW51cCA9IFt1ZC5sb2NhbHBhdGhdKQorICAgICAgICAjIGNsZWFudXAKKyAgICAgICAgYmIudXRpbHMucHJ1bmVkaXIodG1wZmlsZSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL2ZldGNoMi9yZXBvLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3JlcG8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NzhlYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL2ZldGNoMi9yZXBvLnB5CkBAIC0wLDAgKzEsOTggQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgIkZldGNoIiByZXBvIChnaXQpIGltcGxlbWVudGF0aW9uCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwOSBUb20gUmluaSA8dHJpbmlAZW1iZWRkZWRhbGxleS5jb20+CisjCisjIEJhc2VkIG9uIGdpdC5weSB3aGljaCBpczoKKyNDb3B5cmlnaHQgKEMpIDIwMDUgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IGJiCitmcm9tICAgYmIgICAgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorCitjbGFzcyBSZXBvKEZldGNoTWV0aG9kKToKKyAgICAiIiJDbGFzcyB0byBmZXRjaCBhIG1vZHVsZSBvciBtb2R1bGVzIGZyb20gcmVwbyAoZ2l0KSByZXBvc2l0b3JpZXMiIiIKKyAgICBkZWYgc3VwcG9ydHMoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdG8gc2VlIGlmIGEgZ2l2ZW4gdXJsIGNhbiBiZSBmZXRjaGVkIHdpdGggcmVwby4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB1ZC50eXBlIGluIFsicmVwbyJdCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIFdlIGRvbiJ0IGNhcmUgYWJvdXQgdGhlIGdpdCByZXYgb2YgdGhlIG1hbmlmZXN0cyByZXBvc2l0b3J5LCBidXQKKyAgICAgICAgd2UgZG8gY2FyZSBhYm91dCB0aGUgbWFuaWZlc3QgdG8gdXNlLiAgVGhlIGRlZmF1bHQgaXMgImRlZmF1bHQiLgorICAgICAgICBXZSBhbHNvIGNhcmUgYWJvdXQgdGhlIGJyYW5jaCBvciB0YWcgdG8gYmUgdXNlZC4gIFRoZSBkZWZhdWx0IGlzCisgICAgICAgICJtYXN0ZXIiLgorICAgICAgICAiIiIKKworICAgICAgICB1ZC5wcm90byA9IHVkLnBhcm0uZ2V0KCdwcm90b2NvbCcsICdnaXQnKQorICAgICAgICB1ZC5icmFuY2ggPSB1ZC5wYXJtLmdldCgnYnJhbmNoJywgJ21hc3RlcicpCisgICAgICAgIHVkLm1hbmlmZXN0ID0gdWQucGFybS5nZXQoJ21hbmlmZXN0JywgJ2RlZmF1bHQueG1sJykKKyAgICAgICAgaWYgbm90IHVkLm1hbmlmZXN0LmVuZHN3aXRoKCcueG1sJyk6CisgICAgICAgICAgICB1ZC5tYW5pZmVzdCArPSAnLnhtbCcKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCgicmVwb18lcyVzXyVzXyVzLnRhci5neiIgJSAodWQuaG9zdCwgdWQucGF0aC5yZXBsYWNlKCIvIiwgIi4iKSwgdWQubWFuaWZlc3QsIHVkLmJyYW5jaCksIGQpCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmwiIiIKKworICAgICAgICBpZiBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKGRhdGEuZ2V0VmFyKCJETF9ESVIiLCBkLCBUcnVlKSwgdWQubG9jYWxmaWxlKSwgb3MuUl9PSyk6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIiVzIGFscmVhZHkgZXhpc3RzIChvciB3YXMgc3Rhc2hlZCkuIFNraXBwaW5nIHJlcG8gaW5pdCAvIHN5bmMuIiwgdWQubG9jYWxwYXRoKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZ2l0c3JjbmFtZSA9ICIlcyVzIiAlICh1ZC5ob3N0LCB1ZC5wYXRoLnJlcGxhY2UoIi8iLCAiLiIpKQorICAgICAgICByZXBvZGlyID0gZGF0YS5nZXRWYXIoIlJFUE9ESVIiLCBkLCBUcnVlKSBvciBvcy5wYXRoLmpvaW4oZGF0YS5nZXRWYXIoIkRMX0RJUiIsIGQsIFRydWUpLCAicmVwbyIpCisgICAgICAgIGNvZGlyID0gb3MucGF0aC5qb2luKHJlcG9kaXIsIGdpdHNyY25hbWUsIHVkLm1hbmlmZXN0KQorCisgICAgICAgIGlmIHVkLnVzZXI6CisgICAgICAgICAgICB1c2VybmFtZSA9IHVkLnVzZXIgKyAiQCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVzZXJuYW1lID0gIiIKKworICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5qb2luKGNvZGlyLCAicmVwbyIpKQorICAgICAgICBvcy5jaGRpcihvcy5wYXRoLmpvaW4oY29kaXIsICJyZXBvIikpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oY29kaXIsICJyZXBvIiwgIi5yZXBvIikpOgorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsICJyZXBvIGluaXQgLW0gJXMgLWIgJXMgLXUgJXM6Ly8lcyVzJXMiICUgKHVkLm1hbmlmZXN0LCB1ZC5icmFuY2gsIHVkLnByb3RvLCB1c2VybmFtZSwgdWQuaG9zdCwgdWQucGF0aCksIHVkLnVybCkKKyAgICAgICAgICAgIHJ1bmZldGNoY21kKCJyZXBvIGluaXQgLW0gJXMgLWIgJXMgLXUgJXM6Ly8lcyVzJXMiICUgKHVkLm1hbmlmZXN0LCB1ZC5icmFuY2gsIHVkLnByb3RvLCB1c2VybmFtZSwgdWQuaG9zdCwgdWQucGF0aCksIGQpCisKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsICJyZXBvIHN5bmMgJXMiICUgdWQudXJsLCB1ZC51cmwpCisgICAgICAgIHJ1bmZldGNoY21kKCJyZXBvIHN5bmMiLCBkKQorICAgICAgICBvcy5jaGRpcihjb2RpcikKKworICAgICAgICBzY21kYXRhID0gdWQucGFybS5nZXQoInNjbWRhdGEiLCAiIikKKyAgICAgICAgaWYgc2NtZGF0YSA9PSAia2VlcCI6CisgICAgICAgICAgICB0YXJfZmxhZ3MgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyX2ZsYWdzID0gIi0tZXhjbHVkZSAnLnJlcG8nIC0tZXhjbHVkZSAnLmdpdCciCisKKyAgICAgICAgIyBDcmVhdGUgYSBjYWNoZQorICAgICAgICBydW5mZXRjaGNtZCgidGFyICVzIC1jemYgJXMgJXMiICUgKHRhcl9mbGFncywgdWQubG9jYWxwYXRoLCBvcy5wYXRoLmpvaW4oIi4iLCAiKiIpICksIGQpCisKKyAgICBkZWYgc3VwcG9ydHNfc3JjcmV2KHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfYnVpbGRfcmV2aXNpb24oc2VsZiwgdWQsIGQpOgorICAgICAgICByZXR1cm4gdWQubWFuaWZlc3QKKworICAgIGRlZiBfd2FudF9zb3J0YWJsZV9yZXZpc2lvbihzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3NmdHAucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc2Z0cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjJmNzUzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3NmdHAucHkKQEAgLTAsMCArMSwxMjkgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgU0ZUUCBGZXRjaCBpbXBsZW1lbnRhdGlvbgorCitDbGFzcyBmb3IgZmV0Y2hpbmcgZmlsZXMgdmlhIFNGVFAuIEl0IHRyaWVzIHRvIGFkaGVyZSB0byB0aGUgKG5vdworZXhwaXJlZCkgSUVURiBJbnRlcm5ldCBEcmFmdCBmb3IgIlVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKQorU2NoZW1lIGZvciBTZWN1cmUgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCAoU0ZUUCkgYW5kIFNlY3VyZSBTaGVsbAorKFNTSCkiIChTRUNTSCBVUkkpLgorCitJdCB1c2VzIFNGVFAgKGFzIHRvIGFkaGVyZSB0byB0aGUgU0VDU0ggVVJJIHNwZWNpZmljYXRpb24pLiBJdCBvbmx5CitzdXBwb3J0cyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb24sIG5vdCBwYXNzd29yZC4gVGhpcyBjbGFzcywgdW5saWtlCit0aGUgU1NIIGZldGNoZXIsIGRvZXMgbm90IHN1cHBvcnQgZmV0Y2hpbmcgYSBkaXJlY3RvcnkgdHJlZSBmcm9tIHRoZQorcmVtb3RlLgorCisgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtc2Vjc2gtc2NwLXNmdHAtc3NoLXVyaS0wNAorICBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy91cmktc2NoZW1lcy9wcm92L3NmdHAKKyAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtc2Vjc2gtZmlsZXhmZXItMTMKKworUGxlYXNlIG5vdGUgdGhhdCAnLycgaXMgdXNlZCBhcyBob3N0IHBhdGggc2VwZXJhdG9yLCBhbmQgbm90ICI6IgorYXMgeW91IG1heSBiZSB1c2VkIHRvIGZyb20gdGhlIHNjcC9zZnRwIGNvbW1hbmRzLiBZb3UgY2FuIHVzZSBhCit+ICh0aWxkZSkgdG8gc3BlY2lmeSBhIHBhdGggcmVsYXRpdmUgdG8geW91ciBob21lIGRpcmVjdG9yeS4KKyhUaGUgL351c2VyLyBzeW50YXgsIGZvciBzcGVjeWZpbmcgYSBwYXRoIHJlbGF0aXZlIHRvIGFub3RoZXIKK3VzZXIncyBob21lIGRpcmVjdG9yeSBpcyBub3Qgc3VwcG9ydGVkLikgTm90ZSB0aGF0IHRoZSB0aWxkZSBtdXN0CitzdGlsbCBmb2xsb3cgdGhlIGhvc3QgcGF0aCBzZXBlcmF0b3IgKCIvIikuIFNlZSBleGFtcGVscyBiZWxvdy4KKworRXhhbXBsZSBTUkNfVVJJczoKKworU1JDX1VSSSA9ICJzZnRwOi8vaG9zdC5leGFtcGxlLmNvbS9kaXIvcGF0aC5maWxlLnR4dCIKKworQSBwYXRoIHJlbGF0aXZlIHRvIHlvdXIgaG9tZSBkaXJlY3RvcnkuCisKK1NSQ19VUkkgPSAic2Z0cDovL2hvc3QuZXhhbXBsZS5jb20vfi9kaXIvcGF0aC5maWxlLnR4dCIKKworWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB1c2VybmFtZSAoc3BlY3lmaW5nIHBhc3N3b3JkIGluIHRoZQorVVJJIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSBTU0gga2V5cyB0byBhdXRoZW50aWNhdGUpOgorCitTUkNfVVJJID0gInNmdHA6Ly91c2VyQGhvc3QuZXhhbXBsZS5jb20vZGlyL3BhdGguZmlsZS50eHQiCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAxMywgT2xvZiBKb2hhbnNzb24gPG9sb2Yuam9oYW5zc29uQGF4aXMuY29tPgorIworIyBCYXNlZCBpbiBwYXJ0IG9uIGJiLmZldGNoMi53Z2V0OgorIyAgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlLCBDb3B5cmlnaHQgMjAwMyBIb2xnZXIgU2NodXJpZworCitpbXBvcnQgb3MKK2ltcG9ydCBiYgoraW1wb3J0IHVybGxpYgoraW1wb3J0IGNvbW1hbmRzCitmcm9tIGJiIGltcG9ydCBkYXRhCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgVVJJCitmcm9tIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gYmIuZmV0Y2gyIGltcG9ydCBydW5mZXRjaGNtZAorCisKK2NsYXNzIFNGVFAoRmV0Y2hNZXRob2QpOgorICAgICIiIkNsYXNzIHRvIGZldGNoIHVybHMgdmlhICdzZnRwJyIiIgorCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIHNmdHAuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ3NmdHAnXQorCisgICAgZGVmIHJlY29tbWVuZHNfY2hlY2tzdW0oc2VsZiwgdXJsZGF0YSk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgaWYgJ3Byb3RvY29sJyBpbiB1ZC5wYXJtIGFuZCB1ZC5wYXJtWydwcm90b2NvbCddID09ICdnaXQnOgorICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLlBhcmFtZXRlckVycm9yKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHByb3RvY29sIC0gaWYgeW91IHdpc2ggdG8gZmV0Y2ggZnJvbSBhICIgKworICAgICAgICAgICAgICAgICJnaXQgcmVwb3NpdG9yeSB1c2luZyBzc2gsIHlvdSBuZWVkIHRvIHVzZSB0aGUgIiArCisgICAgICAgICAgICAgICAgImdpdDovLyBwcmVmaXggd2l0aCBwcm90b2NvbD1zc2giLCB1ZC51cmwpCisKKyAgICAgICAgaWYgJ2Rvd25sb2FkZmlsZW5hbWUnIGluIHVkLnBhcm06CisgICAgICAgICAgICB1ZC5iYXNlbmFtZSA9IHVkLnBhcm1bJ2Rvd25sb2FkZmlsZW5hbWUnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdWQuYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHVkLnBhdGgpCisKKyAgICAgICAgdWQubG9jYWxmaWxlID0gZGF0YS5leHBhbmQodXJsbGliLnVucXVvdGUodWQuYmFzZW5hbWUpLCBkKQorCisgICAgZGVmIGRvd25sb2FkKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiRmV0Y2ggdXJscyIiIgorCisgICAgICAgIHVybG8gPSBVUkkodWQudXJsKQorICAgICAgICBiYXNlY21kID0gJ3NmdHAgLW9CYXRjaE1vZGU9eWVzJworICAgICAgICBwb3J0ID0gJycKKyAgICAgICAgaWYgdXJsby5wb3J0OgorICAgICAgICAgICAgcG9ydCA9ICctUCAlZCcgJSB1cmxvLnBvcnQKKyAgICAgICAgICAgIHVybG8ucG9ydCA9IE5vbmUKKworICAgICAgICBkbGRpciA9IGRhdGEuZ2V0VmFyKCdETF9ESVInLCBkLCBUcnVlKQorICAgICAgICBscGF0aCA9IG9zLnBhdGguam9pbihkbGRpciwgdWQubG9jYWxmaWxlKQorCisgICAgICAgIHVzZXIgPSAnJworICAgICAgICBpZiB1cmxvLnVzZXJpbmZvOgorICAgICAgICAgICAgdXNlciA9IHVybG8udXNlcmluZm8gKyAnQCcKKworICAgICAgICBwYXRoID0gdXJsby5wYXRoCisKKyAgICAgICAgIyBTdXBvcHJ0IFVSSXMgcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSwgd2l0aAorICAgICAgICAjIHRoZSB0aWxkZSBzeW50YXguIChFLmcuIDxzZnRwOi8vZXhhbXBsZS5jb20vfi9mb28uZGlmZj4pLgorICAgICAgICBpZiBwYXRoWzozXSA9PSAnL34vJzoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzM6XQorCisgICAgICAgIHJlbW90ZSA9ICclcyVzOiVzJyAlICh1c2VyLCB1cmxvLmhvc3RuYW1lLCBwYXRoKQorCisgICAgICAgIGNtZCA9ICclcyAlcyAlcyAlcycgJSAoYmFzZWNtZCwgcG9ydCwgY29tbWFuZHMubWthcmcocmVtb3RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcy5ta2FyZyhscGF0aCkpCisKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGNtZCwgdWQudXJsKQorICAgICAgICBydW5mZXRjaGNtZChjbWQsIGQpCisgICAgICAgIHJldHVybiBUcnVlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc3NoLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3NzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU1NzhhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3NzaC5weQpAQCAtMCwwICsxLDEyOCBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKycnJworQml0QmFrZSAnRmV0Y2gnIGltcGxlbWVudGF0aW9ucworCitUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciBTZWN1cmUgU2hlbGwgKFNTSCksIGFuZCBhdHRlbXB0cyB0byBjb21wbHkgd2l0aCB0aGUKK0lFVEYgc2Vjc2ggaW50ZXJuZXQgZHJhZnQ6CisgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL3dnL3NlY3NoL2RyYWZ0LWlldGYtc2Vjc2gtc2NwLXNmdHAtc3NoLXVyaS8KKworICAgIEN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZnRwIHBhcmFtZXRlcnMsIGFzIHRoaXMgdXNlcyBzY3AKKyAgICBBbHNvIGRvZXMgbm90IHN1cHBvcnQgdGhlICdmaW5nZXJwcmludCcgY29ubmVjdGlvbiBwYXJhbWV0ZXIuCisKKyAgICBQbGVhc2Ugbm90ZSB0aGF0ICcvJyBpcyB1c2VkIGFzIGhvc3QsIHBhdGggc2VwYXJhdG9yIG5vdCAnOicgYXMgeW91IG1heSAKKyAgICBiZSB1c2VkIHRvLCBhbHNvICd+JyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHVzZXIgSE9NRSwgYnV0IGFnYWluIGFmdGVyICcvJworICAgIAorICAgIEV4YW1wbGUgU1JDX1VSSToKKyAgICBTUkNfVVJJID0gInNzaDovL3VzZXJAaG9zdC5leGFtcGxlLmNvbS9kaXIvcGF0aC9maWxlLnR4dCIKKyAgICBTUkNfVVJJID0gInNzaDovL3VzZXJAaG9zdC5leGFtcGxlLmNvbS9+L2ZpbGUudHh0IgorJycnCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICBPcGVuZWRIYW5kIEx0ZC4KKyMKKyMKKyMgQmFzZWQgaW4gcGFydCBvbiBzdmsucHk6CisjICAgIENvcHlyaWdodCAoQykgMjAwNiBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIyAgICBCYXNlZCBvbiBzdm4ucHk6CisjICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyAgICAgICAgQmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UgYmIgbW9kdWxlOgorIyAgICAgICAgICAgIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisjCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgcmUsIG9zCitmcm9tICAgYmIgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaEVycm9yCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBsb2dnZXIKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCisKKworX19wYXR0ZXJuX18gPSByZS5jb21waWxlKHInJycKKyBccyogICAgICAgICAgICAgICAgICMgU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UKKyBzc2g6Ly8gICAgICAgICAgICAgICMgc2NoZW1lCisgKCAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsIHVzZXJuYW1lL3Bhc3N3b3JkIGJsb2NrCisgICg/UDx1c2VyPlxTKykgICAgICAjIHVzZXJuYW1lCisgICg6KD9QPHBhc3M+XFMrKSk/ICAjIGNvbG9uIGZvbGxvd2VkIGJ5IHRoZSBwYXNzd29yZCAob3B0aW9uYWwpCisgKT8KKyAoP1A8Y3BhcmFtPig7W147XSspKik/ICAjIGNvbm5lY3Rpb24gcGFyYW1ldGVycyBibG9jayAob3B0aW9uYWwpCisgQAorICg/UDxob3N0PlxTKz8pICAgICAgICAgICMgbm9uLWdyZWVkeSBtYXRjaCBvZiB0aGUgaG9zdAorICg6KD9QPHBvcnQ+WzAtOV0rKSk/ICAgICMgY29sb24gZm9sbG93ZWQgYnkgdGhlIHBvcnQgKG9wdGlvbmFsKQorIC8KKyAoP1A8cGF0aD5bXjtdKykgICAgICAgICAjIHBhdGggb24gdGhlIHJlbW90ZSBzeXN0ZW0sIG1heSBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBtYXkgaW5jbHVkZSB0aGUgdXNlIG9mICd+JyB0byByZWZlcmVuY2UgdGhlIHJlbW90ZSBob21lCisgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKKyAoP1A8c3BhcmFtPig7W147XSspKik/ICAjIHBhcmFtZXRlcnMgYmxvY2sgKG9wdGlvbmFsKQorICQKKycnJywgcmUuVkVSQk9TRSkKKworY2xhc3MgU1NIKEZldGNoTWV0aG9kKToKKyAgICAnJydDbGFzcyB0byBmZXRjaCBhIG1vZHVsZSBvciBtb2R1bGVzIHZpYSBTZWN1cmUgU2hlbGwnJycKKworICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgcmV0dXJuIF9fcGF0dGVybl9fLm1hdGNoKHVybGRhdGEudXJsKSAhPSBOb25lCisKKyAgICBkZWYgc3VwcG9ydHNfY2hlY2tzdW0oc2VsZiwgdXJsZGF0YSk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1cmxkYXRhLCBkKToKKyAgICAgICAgaWYgJ3Byb3RvY29sJyBpbiB1cmxkYXRhLnBhcm0gYW5kIHVybGRhdGEucGFybVsncHJvdG9jb2wnXSA9PSAnZ2l0JzoKKyAgICAgICAgICAgIHJhaXNlIGJiLmZldGNoMi5QYXJhbWV0ZXJFcnJvcigKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBwcm90b2NvbCAtIGlmIHlvdSB3aXNoIHRvIGZldGNoIGZyb20gYSBnaXQgIiArCisgICAgICAgICAgICAgICAgInJlcG9zaXRvcnkgdXNpbmcgc3NoLCB5b3UgbmVlZCB0byB1c2UgIiArCisgICAgICAgICAgICAgICAgImdpdDovLyBwcmVmaXggd2l0aCBwcm90b2NvbD1zc2giLCB1cmxkYXRhLnVybCkKKyAgICAgICAgbSA9IF9fcGF0dGVybl9fLm1hdGNoKHVybGRhdGEudXJsKQorICAgICAgICBwYXRoID0gbS5ncm91cCgncGF0aCcpCisgICAgICAgIGhvc3QgPSBtLmdyb3VwKCdob3N0JykKKyAgICAgICAgdXJsZGF0YS5sb2NhbHBhdGggPSBvcy5wYXRoLmpvaW4oZC5nZXRWYXIoJ0RMX0RJUicsIFRydWUpLAorICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUob3MucGF0aC5ub3JtcGF0aChwYXRoKSkpCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdXJsZGF0YSwgZCk6CisgICAgICAgIGRsZGlyID0gZC5nZXRWYXIoJ0RMX0RJUicsIFRydWUpCisKKyAgICAgICAgbSA9IF9fcGF0dGVybl9fLm1hdGNoKHVybGRhdGEudXJsKQorICAgICAgICBwYXRoID0gbS5ncm91cCgncGF0aCcpCisgICAgICAgIGhvc3QgPSBtLmdyb3VwKCdob3N0JykKKyAgICAgICAgcG9ydCA9IG0uZ3JvdXAoJ3BvcnQnKQorICAgICAgICB1c2VyID0gbS5ncm91cCgndXNlcicpCisgICAgICAgIHBhc3N3b3JkID0gbS5ncm91cCgncGFzcycpCisKKyAgICAgICAgaWYgcG9ydDoKKyAgICAgICAgICAgIHBvcnRhcmcgPSAnLVAgJXMnICUgcG9ydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9ydGFyZyA9ICcnCisKKyAgICAgICAgaWYgdXNlcjoKKyAgICAgICAgICAgIGZyID0gdXNlcgorICAgICAgICAgICAgaWYgcGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgZnIgKz0gJzolcycgJSBwYXNzd29yZAorICAgICAgICAgICAgZnIgKz0gJ0AlcycgJSBob3N0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmciA9IGhvc3QKKyAgICAgICAgZnIgKz0gJzolcycgJSBwYXRoCisKKworICAgICAgICBpbXBvcnQgY29tbWFuZHMKKyAgICAgICAgY21kID0gJ3NjcCAtQiAtciAlcyAlcyAlcy8nICUgKAorICAgICAgICAgICAgcG9ydGFyZywKKyAgICAgICAgICAgIGNvbW1hbmRzLm1rYXJnKGZyKSwKKyAgICAgICAgICAgIGNvbW1hbmRzLm1rYXJnKGRsZGlyKQorICAgICAgICApCisKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIGNtZCwgdXJsZGF0YS51cmwpCisKKyAgICAgICAgcnVuZmV0Y2hjbWQoY21kLCBkKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvc3ZuLnB5IGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3N2bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMzYzJiCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3N2bi5weQpAQCAtMCwwICsxLDE5MiBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyIiIgorQml0QmFrZSAnRmV0Y2gnIGltcGxlbWVudGF0aW9uIGZvciBzdm4uCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwNCAgICAgICAgTWFyY2luIEp1c3praWV3aWN6CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgoraW1wb3J0IHJlCitmcm9tICAgYmIgaW1wb3J0IGRhdGEKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBGZXRjaEVycm9yCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBNaXNzaW5nUGFyYW1ldGVyRXJyb3IKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IHJ1bmZldGNoY21kCitmcm9tICAgYmIuZmV0Y2gyIGltcG9ydCBsb2dnZXIKKworY2xhc3MgU3ZuKEZldGNoTWV0aG9kKToKKyAgICAiIiJDbGFzcyB0byBmZXRjaCBhIG1vZHVsZSBvciBtb2R1bGVzIGZyb20gc3ZuIHJlcG9zaXRvcmllcyIiIgorICAgIGRlZiBzdXBwb3J0cyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiB1cmwgY2FuIGJlIGZldGNoZWQgd2l0aCBzdm4uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ3N2biddCisKKyAgICBkZWYgdXJsZGF0YV9pbml0KHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIGluaXQgc3ZuIHNwZWNpZmljIHZhcmlhYmxlIHdpdGhpbiB1cmwgZGF0YQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90ICJtb2R1bGUiIGluIHVkLnBhcm06CisgICAgICAgICAgICByYWlzZSBNaXNzaW5nUGFyYW1ldGVyRXJyb3IoJ21vZHVsZScsIHVkLnVybCkKKworICAgICAgICB1ZC5iYXNlY21kID0gZC5nZXRWYXIoJ0ZFVENIQ01EX3N2bicsIFRydWUpCisKKyAgICAgICAgdWQubW9kdWxlID0gdWQucGFybVsibW9kdWxlIl0KKworICAgICAgICAjIENyZWF0ZSBwYXRocyB0byBzdm4gY2hlY2tvdXRzCisgICAgICAgIHJlbHBhdGggPSBzZWxmLl9zdHJpcF9sZWFkaW5nX3NsYXNoZXModWQucGF0aCkKKyAgICAgICAgdWQucGtnZGlyID0gb3MucGF0aC5qb2luKGRhdGEuZXhwYW5kKCcke1NWTkRJUn0nLCBkKSwgdWQuaG9zdCwgcmVscGF0aCkKKyAgICAgICAgdWQubW9kZGlyID0gb3MucGF0aC5qb2luKHVkLnBrZ2RpciwgdWQubW9kdWxlKQorCisgICAgICAgIHVkLnNldHVwX3Jldmlzb25zKGQpCisKKyAgICAgICAgaWYgJ3JldicgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLnJldmlzaW9uID0gdWQucGFybVsncmV2J10KKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCgnJXNfJXNfJXNfJXNfLnRhci5neicgJSAodWQubW9kdWxlLnJlcGxhY2UoJy8nLCAnLicpLCB1ZC5ob3N0LCB1ZC5wYXRoLnJlcGxhY2UoJy8nLCAnLicpLCB1ZC5yZXZpc2lvbiksIGQpCisKKyAgICBkZWYgX2J1aWxkc3ZuY29tbWFuZChzZWxmLCB1ZCwgZCwgY29tbWFuZCk6CisgICAgICAgICIiIgorICAgICAgICBCdWlsZCB1cCBhbiBzdm4gY29tbWFuZGxpbmUgYmFzZWQgb24gdWQKKyAgICAgICAgY29tbWFuZCBpcyAiZmV0Y2giLCAidXBkYXRlIiwgImluZm8iCisgICAgICAgICIiIgorCisgICAgICAgIHByb3RvID0gdWQucGFybS5nZXQoJ3Byb3RvY29sJywgJ3N2bicpCisKKyAgICAgICAgc3ZuX3JzaCA9IE5vbmUKKyAgICAgICAgaWYgcHJvdG8gPT0gInN2bitzc2giIGFuZCAicnNoIiBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgc3ZuX3JzaCA9IHVkLnBhcm1bInJzaCJdCisKKyAgICAgICAgc3Zucm9vdCA9IHVkLmhvc3QgKyB1ZC5wYXRoCisKKyAgICAgICAgb3B0aW9ucyA9IFtdCisKKyAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi0tbm8tYXV0aC1jYWNoZSIpCisKKyAgICAgICAgaWYgdWQudXNlcjoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItLXVzZXJuYW1lICVzIiAlIHVkLnVzZXIpCisKKyAgICAgICAgaWYgdWQucHN3ZDoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItLXBhc3N3b3JkICVzIiAlIHVkLnBzd2QpCisKKyAgICAgICAgaWYgY29tbWFuZCA9PSAiaW5mbyI6CisgICAgICAgICAgICBzdm5jbWQgPSAiJXMgaW5mbyAlcyAlczovLyVzLyVzLyIgJSAodWQuYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucyksIHByb3RvLCBzdm5yb290LCB1ZC5tb2R1bGUpCisgICAgICAgIGVsaWYgY29tbWFuZCA9PSAibG9nMSI6CisgICAgICAgICAgICBzdm5jbWQgPSAiJXMgbG9nIC0tbGltaXQgMSAlcyAlczovLyVzLyVzLyIgJSAodWQuYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucyksIHByb3RvLCBzdm5yb290LCB1ZC5tb2R1bGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWZmaXggPSAiIgorICAgICAgICAgICAgaWYgdWQucmV2aXNpb246CisgICAgICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi1yICVzIiAlIHVkLnJldmlzaW9uKQorICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJAJXMiICUgKHVkLnJldmlzaW9uKQorCisgICAgICAgICAgICBpZiBjb21tYW5kID09ICJmZXRjaCI6CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0dXNlciA9IHVkLnBhcm0uZ2V0KCJ0cmFuc3BvcnR1c2VyIiwgIiIpCisgICAgICAgICAgICAgICAgc3ZuY21kID0gIiVzIGNvICVzICVzOi8vJXMlcy8lcyVzICVzIiAlICh1ZC5iYXNlY21kLCAiICIuam9pbihvcHRpb25zKSwgcHJvdG8sIHRyYW5zcG9ydHVzZXIsIHN2bnJvb3QsIHVkLm1vZHVsZSwgc3VmZml4LCB1ZC5tb2R1bGUpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgPT0gInVwZGF0ZSI6CisgICAgICAgICAgICAgICAgc3ZuY21kID0gIiVzIHVwZGF0ZSAlcyIgJSAodWQuYmFzZWNtZCwgIiAiLmpvaW4ob3B0aW9ucykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEZldGNoRXJyb3IoIkludmFsaWQgc3ZuIGNvbW1hbmQgJXMiICUgY29tbWFuZCwgdWQudXJsKQorCisgICAgICAgIGlmIHN2bl9yc2g6CisgICAgICAgICAgICBzdm5jbWQgPSAic3ZuX1JTSD1cIiVzXCIgJXMiICUgKHN2bl9yc2gsIHN2bmNtZCkKKworICAgICAgICByZXR1cm4gc3ZuY21kCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiJGZXRjaCB1cmwiIiIKKworICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkZldGNoOiBjaGVja2luZyBmb3IgbW9kdWxlIGRpcmVjdG9yeSAnIiArIHVkLm1vZGRpciArICInIikKKworICAgICAgICBpZiBvcy5hY2Nlc3Mob3MucGF0aC5qb2luKHVkLm1vZGRpciwgJy5zdm4nKSwgb3MuUl9PSyk6CisgICAgICAgICAgICBzdm51cGRhdGVjbWQgPSBzZWxmLl9idWlsZHN2bmNvbW1hbmQodWQsIGQsICJ1cGRhdGUiKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZSAiICsgdWQudXJsKQorICAgICAgICAgICAgIyB1cGRhdGUgc291cmNlcyB0aGVyZQorICAgICAgICAgICAgb3MuY2hkaXIodWQubW9kZGlyKQorICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGF0dGVtcHQgdG8gcnVuIHN2biB1cGdyYWRlIGZpcnN0IGluIGNhc2UgaXRzIGFuIG9sZGVyIHdvcmtpbmcgZm9ybWF0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcnVuZmV0Y2hjbWQodWQuYmFzZWNtZCArICIgdXBncmFkZSIsIGQpCisgICAgICAgICAgICBleGNlcHQgRmV0Y2hFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlJ1bm5pbmcgJXMiLCBzdm51cGRhdGVjbWQpCisgICAgICAgICAgICBiYi5mZXRjaDIuY2hlY2tfbmV0d29ya19hY2Nlc3MoZCwgc3ZudXBkYXRlY21kLCB1ZC51cmwpCisgICAgICAgICAgICBydW5mZXRjaGNtZChzdm51cGRhdGVjbWQsIGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdm5mZXRjaGNtZCA9IHNlbGYuX2J1aWxkc3ZuY29tbWFuZCh1ZCwgZCwgImZldGNoIikKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJGZXRjaCAiICsgdWQudXJsKQorICAgICAgICAgICAgIyBjaGVjayBvdXQgc291cmNlcyB0aGVyZQorICAgICAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIG9zLmNoZGlyKHVkLnBrZ2RpcikKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUnVubmluZyAlcyIsIHN2bmZldGNoY21kKQorICAgICAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIHN2bmZldGNoY21kLCB1ZC51cmwpCisgICAgICAgICAgICBydW5mZXRjaGNtZChzdm5mZXRjaGNtZCwgZCkKKworICAgICAgICBzY21kYXRhID0gdWQucGFybS5nZXQoInNjbWRhdGEiLCAiIikKKyAgICAgICAgaWYgc2NtZGF0YSA9PSAia2VlcCI6CisgICAgICAgICAgICB0YXJfZmxhZ3MgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyX2ZsYWdzID0gIi0tZXhjbHVkZSAnLnN2biciCisKKyAgICAgICAgb3MuY2hkaXIodWQucGtnZGlyKQorICAgICAgICAjIHRhciB0aGVtIHVwIHRvIGEgZGVmaW5lZCBmaWxlbmFtZQorICAgICAgICBydW5mZXRjaGNtZCgidGFyICVzIC1jemYgJXMgJXMiICUgKHRhcl9mbGFncywgdWQubG9jYWxwYXRoLCB1ZC5tb2R1bGUpLCBkLCBjbGVhbnVwID0gW3VkLmxvY2FscGF0aF0pCisKKyAgICBkZWYgY2xlYW4oc2VsZiwgdWQsIGQpOgorICAgICAgICAiIiIgQ2xlYW4gU1ZOIHNwZWNpZmljIGZpbGVzIGFuZCBkaXJzICIiIgorCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5sb2NhbHBhdGgpCisgICAgICAgIGJiLnV0aWxzLnJlbW92ZSh1ZC5tb2RkaXIsIFRydWUpCisgICAgICAgIAorCisgICAgZGVmIHN1cHBvcnRzX3NyY3JldihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfcmV2aXNpb25fa2V5KHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHVuaXF1ZSBrZXkgZm9yIHRoZSB1cmwKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAic3ZuOiIgKyB1ZC5tb2RkaXIKKworICAgIGRlZiBfbGF0ZXN0X3JldmlzaW9uKHNlbGYsIHVkLCBkLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbGF0ZXN0IHVwc3RyZWFtIHJldmlzaW9uIG51bWJlcgorICAgICAgICAiIiIKKyAgICAgICAgYmIuZmV0Y2gyLmNoZWNrX25ldHdvcmtfYWNjZXNzKGQsIHNlbGYuX2J1aWxkc3ZuY29tbWFuZCh1ZCwgZCwgImxvZzEiKSkKKworICAgICAgICBvdXRwdXQgPSBydW5mZXRjaGNtZCgiTEFORz1DIExDX0FMTD1DICIgKyBzZWxmLl9idWlsZHN2bmNvbW1hbmQodWQsIGQsICJsb2cxIiksIGQsIFRydWUpCisKKyAgICAgICAgIyBza2lwIHRoZSBmaXJzdCBsaW5lLCBhcyBwZXIgb3V0cHV0IG9mIHN2biBsb2cKKyAgICAgICAgIyB0aGVuIHdlIGV4cGVjdCB0aGUgcmV2aXNpb24gb24gdGhlIDJuZCBsaW5lCisgICAgICAgIHJldmlzaW9uID0gcmUuc2VhcmNoKCdecihbMC05XSopJywgb3V0cHV0LnNwbGl0bGluZXMoKVsxXSkuZ3JvdXAoMSkKKworICAgICAgICByZXR1cm4gcmV2aXNpb24KKworICAgIGRlZiBzb3J0YWJsZV9yZXZpc2lvbihzZWxmLCB1ZCwgZCwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBzb3J0YWJsZSByZXZpc2lvbiBudW1iZXIgd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhlIHJldmlzaW9uIG51bWJlcgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gRmFsc2UsIHNlbGYuX2J1aWxkX3JldmlzaW9uKHVkLCBkKQorCisgICAgZGVmIF9idWlsZF9yZXZpc2lvbihzZWxmLCB1ZCwgZCk6CisgICAgICAgIHJldHVybiB1ZC5yZXZpc2lvbgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3dnZXQucHkgYi9iaXRiYWtlL2xpYi9iYi9mZXRjaDIvd2dldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDJhODk3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvZmV0Y2gyL3dnZXQucHkKQEAgLTAsMCArMSw1NDEgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ0ZldGNoJyBpbXBsZW1lbnRhdGlvbnMKKworQ2xhc3NlcyBmb3Igb2J0YWluaW5nIHVwc3RyZWFtIHNvdXJjZXMgZm9yIHRoZQorQml0QmFrZSBidWlsZCB0b29scy4KKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworaW1wb3J0IHJlCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgYmIKK2ltcG9ydCB1cmxsaWIKK2Zyb20gICBiYiBpbXBvcnQgZGF0YQorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgRmV0Y2hNZXRob2QKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IEZldGNoRXJyb3IKK2Zyb20gICBiYi5mZXRjaDIgaW1wb3J0IGxvZ2dlcgorZnJvbSAgIGJiLmZldGNoMiBpbXBvcnQgcnVuZmV0Y2hjbWQKK2Zyb20gICBiczQgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKKworY2xhc3MgV2dldChGZXRjaE1ldGhvZCk6CisgICAgIiIiQ2xhc3MgdG8gZmV0Y2ggdXJscyB2aWEgJ3dnZXQnIiIiCisgICAgZGVmIHN1cHBvcnRzKHNlbGYsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRvIHNlZSBpZiBhIGdpdmVuIHVybCBjYW4gYmUgZmV0Y2hlZCB3aXRoIHdnZXQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdWQudHlwZSBpbiBbJ2h0dHAnLCAnaHR0cHMnLCAnZnRwJ10KKworICAgIGRlZiByZWNvbW1lbmRzX2NoZWNrc3VtKHNlbGYsIHVybGRhdGEpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHVybGRhdGFfaW5pdChzZWxmLCB1ZCwgZCk6CisgICAgICAgIGlmICdwcm90b2NvbCcgaW4gdWQucGFybToKKyAgICAgICAgICAgIGlmIHVkLnBhcm1bJ3Byb3RvY29sJ10gPT0gJ2dpdCc6CisgICAgICAgICAgICAgICAgcmFpc2UgYmIuZmV0Y2gyLlBhcmFtZXRlckVycm9yKCJJbnZhbGlkIHByb3RvY29sIC0gaWYgeW91IHdpc2ggdG8gZmV0Y2ggZnJvbSBhIGdpdCByZXBvc2l0b3J5IHVzaW5nIGh0dHAsIHlvdSBuZWVkIHRvIGluc3RlYWQgdXNlIHRoZSBnaXQ6Ly8gcHJlZml4IHdpdGggcHJvdG9jb2w9aHR0cCIsIHVkLnVybCkKKworICAgICAgICBpZiAnZG93bmxvYWRmaWxlbmFtZScgaW4gdWQucGFybToKKyAgICAgICAgICAgIHVkLmJhc2VuYW1lID0gdWQucGFybVsnZG93bmxvYWRmaWxlbmFtZSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1ZC5iYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUodWQucGF0aCkKKworICAgICAgICB1ZC5sb2NhbGZpbGUgPSBkYXRhLmV4cGFuZCh1cmxsaWIudW5xdW90ZSh1ZC5iYXNlbmFtZSksIGQpCisKKyAgICAgICAgc2VsZi5iYXNlY21kID0gZC5nZXRWYXIoIkZFVENIQ01EX3dnZXQiLCBUcnVlKSBvciAiL3Vzci9iaW4vZW52IHdnZXQgLXQgMiAtVCAzMCAtbnYgLS1wYXNzaXZlLWZ0cCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlIgorCisgICAgZGVmIF9ydW53Z2V0KHNlbGYsIHVkLCBkLCBjb21tYW5kLCBxdWlldCk6CisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJGZXRjaGluZyAlcyB1c2luZyBjb21tYW5kICclcyciICUgKHVkLnVybCwgY29tbWFuZCkpCisgICAgICAgIGJiLmZldGNoMi5jaGVja19uZXR3b3JrX2FjY2VzcyhkLCBjb21tYW5kKQorICAgICAgICBydW5mZXRjaGNtZChjb21tYW5kLCBkLCBxdWlldCkKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIkZldGNoIHVybHMiIiIKKworICAgICAgICBmZXRjaGNtZCA9IHNlbGYuYmFzZWNtZAorCisgICAgICAgIGlmICdkb3dubG9hZGZpbGVuYW1lJyBpbiB1ZC5wYXJtOgorICAgICAgICAgICAgZGxkaXIgPSBkLmdldFZhcigiRExfRElSIiwgVHJ1ZSkKKyAgICAgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoZGxkaXIgKyBvcy5zZXAgKyB1ZC5sb2NhbGZpbGUpKQorICAgICAgICAgICAgZmV0Y2hjbWQgKz0gIiAtTyAiICsgZGxkaXIgKyBvcy5zZXAgKyB1ZC5sb2NhbGZpbGUKKworICAgICAgICB1cmkgPSB1ZC51cmwuc3BsaXQoIjsiKVswXQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh1ZC5sb2NhbHBhdGgpOgorICAgICAgICAgICAgIyBmaWxlIGV4aXN0cywgYnV0IHdlIGRpZG50IGNvbXBsZXRlIGl0Li4gdHJ5aW5nIGFnYWluLi4KKyAgICAgICAgICAgIGZldGNoY21kICs9IGQuZXhwYW5kKCIgLWMgLVAgJHtETF9ESVJ9ICclcyciICUgdXJpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmV0Y2hjbWQgKz0gZC5leHBhbmQoIiAtUCAke0RMX0RJUn0gJyVzJyIgJSB1cmkpCisKKyAgICAgICAgc2VsZi5fcnVud2dldCh1ZCwgZCwgZmV0Y2hjbWQsIEZhbHNlKQorCisgICAgICAgICMgU2FuaXR5IGNoZWNrIHNpbmNlIHdnZXQgY2FuIHByZXRlbmQgaXQgc3VjY2VlZCB3aGVuIGl0IGRpZG4ndAorICAgICAgICAjIEFsc28sIHRoaXMgdXNlZCB0byBoYXBwZW4gaWYgc291cmNlZm9yZ2Ugc2VudCB1cyB0byB0aGUgbWlycm9yIHBhZ2UKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVkLmxvY2FscGF0aCk6CisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJUaGUgZmV0Y2ggY29tbWFuZCByZXR1cm5lZCBzdWNjZXNzIGZvciB1cmwgJXMgYnV0ICVzIGRvZXNuJ3QgZXhpc3Q/ISIgJSAodXJpLCB1ZC5sb2NhbHBhdGgpLCB1cmkpCisKKyAgICAgICAgaWYgb3MucGF0aC5nZXRzaXplKHVkLmxvY2FscGF0aCkgPT0gMDoKKyAgICAgICAgICAgIG9zLnJlbW92ZSh1ZC5sb2NhbHBhdGgpCisgICAgICAgICAgICByYWlzZSBGZXRjaEVycm9yKCJUaGUgZmV0Y2ggb2YgJXMgcmVzdWx0ZWQgaW4gYSB6ZXJvIHNpemUgZmlsZT8hIERlbGV0aW5nIGFuZCBmYWlsaW5nIHNpbmNlIHRoaXMgaXNuJ3QgcmlnaHQuIiAlICh1cmkpLCB1cmkpCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja3N0YXR1cyhzZWxmLCBmZXRjaCwgdWQsIGQpOgorICAgICAgICBpbXBvcnQgdXJsbGliMiwgc29ja2V0LCBodHRwbGliCisgICAgICAgIGZyb20gdXJsbGliIGltcG9ydCBhZGRpbmZvdXJsCisgICAgICAgIGZyb20gYmIuZmV0Y2gyIGltcG9ydCBGZXRjaENvbm5lY3Rpb25DYWNoZQorCisgICAgICAgIGNsYXNzIEhUVFBDb25uZWN0aW9uQ2FjaGUoaHR0cGxpYi5IVFRQQ29ubmVjdGlvbik6CisgICAgICAgICAgICBpZiBmZXRjaC5jb25uZWN0aW9uX2NhY2hlOgorICAgICAgICAgICAgICAgIGRlZiBjb25uZWN0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAiIiJDb25uZWN0IHRvIHRoZSBob3N0IGFuZCBwb3J0IHNwZWNpZmllZCBpbiBfX2luaXRfXy4iIiIKKworICAgICAgICAgICAgICAgICAgICBzb2NrID0gZmV0Y2guY29ubmVjdGlvbl9jYWNoZS5nZXRfY29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc29jazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2sKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lb3V0LCBzZWxmLnNvdXJjZV9hZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2guY29ubmVjdGlvbl9jYWNoZS5hZGRfY29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwgc2VsZi5zb2NrKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3R1bm5lbF9ob3N0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKKworICAgICAgICBjbGFzcyBDYWNoZUhUVFBIYW5kbGVyKHVybGxpYjIuSFRUUEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGh0dHBfb3BlbihzZWxmLCByZXEpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvX29wZW4oSFRUUENvbm5lY3Rpb25DYWNoZSwgcmVxKQorCisgICAgICAgICAgICBkZWYgZG9fb3BlbihzZWxmLCBodHRwX2NsYXNzLCByZXEpOgorICAgICAgICAgICAgICAgICIiIlJldHVybiBhbiBhZGRpbmZvdXJsIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QsIHVzaW5nIGh0dHBfY2xhc3MuCisKKyAgICAgICAgICAgICAgICBodHRwX2NsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBIVFRQQ29ubmVjdGlvbiBBUEkgZnJvbSBodHRwbGliLgorICAgICAgICAgICAgICAgIFRoZSBhZGRpbmZvdXJsIHJldHVybiB2YWx1ZSBpcyBhIGZpbGUtbGlrZSBvYmplY3QuICBJdCBhbHNvCisgICAgICAgICAgICAgICAgaGFzIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgaW5jbHVkaW5nOgorICAgICAgICAgICAgICAgICAgICAtIGluZm8oKTogcmV0dXJuIGEgbWltZXRvb2xzLk1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgaGVhZGVycworICAgICAgICAgICAgICAgICAgICAtIGdldHVybCgpOiByZXR1cm4gdGhlIG9yaWdpbmFsIHJlcXVlc3QgVVJMCisgICAgICAgICAgICAgICAgICAgIC0gY29kZTogSFRUUCBzdGF0dXMgY29kZQorICAgICAgICAgICAgICAgICIiIgorICAgICAgICAgICAgICAgIGhvc3QgPSByZXEuZ2V0X2hvc3QoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBob3N0OgorICAgICAgICAgICAgICAgICAgICByYWlzZSB1cmxsbGliMi5VUkxFcnJvcignbm8gaG9zdCBnaXZlbicpCisKKyAgICAgICAgICAgICAgICBoID0gaHR0cF9jbGFzcyhob3N0LCB0aW1lb3V0PXJlcS50aW1lb3V0KSAjIHdpbGwgcGFyc2UgaG9zdDpwb3J0CisgICAgICAgICAgICAgICAgaC5zZXRfZGVidWdsZXZlbChzZWxmLl9kZWJ1Z2xldmVsKQorCisgICAgICAgICAgICAgICAgaGVhZGVycyA9IGRpY3QocmVxLnVucmVkaXJlY3RlZF9oZHJzKQorICAgICAgICAgICAgICAgIGhlYWRlcnMudXBkYXRlKGRpY3QoKGssIHYpIGZvciBrLCB2IGluIHJlcS5oZWFkZXJzLml0ZW1zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIG5vdCBpbiBoZWFkZXJzKSkKKworICAgICAgICAgICAgICAgICMgV2Ugd2FudCB0byBtYWtlIGFuIEhUVFAvMS4xIHJlcXVlc3QsIGJ1dCB0aGUgYWRkaW5mb3VybAorICAgICAgICAgICAgICAgICMgY2xhc3MgaXNuJ3QgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgICMgSXQgd2lsbCB0cnkgdG8gcmVhZCBhbGwgcmVtYWluaW5nIGRhdGEgZnJvbSB0aGUgc29ja2V0LAorICAgICAgICAgICAgICAgICMgd2hpY2ggd2lsbCBibG9jayB3aGlsZSB0aGUgc2VydmVyIHdhaXRzIGZvciB0aGUgbmV4dCByZXF1ZXN0LgorICAgICAgICAgICAgICAgICMgU28gbWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIGdldHMgY2xvc2VkIGFmdGVyIHRoZSAob25seSkKKyAgICAgICAgICAgICAgICAjIHJlcXVlc3QuCisKKyAgICAgICAgICAgICAgICAjIERvbid0IGNsb3NlIGNvbm5lY3Rpb24gd2hlbiBjb25uZWN0aW9uX2NhY2hlIGlzIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgaWYgZmV0Y2guY29ubmVjdGlvbl9jYWNoZSBpcyBOb25lOiAKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1siQ29ubmVjdGlvbiJdID0gImNsb3NlIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbIkNvbm5lY3Rpb24iXSA9ICJLZWVwLUFsaXZlIiAjIFdvcmtzIGZvciBIVFRQLzEuMAorCisgICAgICAgICAgICAgICAgaGVhZGVycyA9IGRpY3QoCisgICAgICAgICAgICAgICAgICAgIChuYW1lLnRpdGxlKCksIHZhbCkgZm9yIG5hbWUsIHZhbCBpbiBoZWFkZXJzLml0ZW1zKCkpCisKKyAgICAgICAgICAgICAgICBpZiByZXEuX3R1bm5lbF9ob3N0OgorICAgICAgICAgICAgICAgICAgICB0dW5uZWxfaGVhZGVycyA9IHt9CisgICAgICAgICAgICAgICAgICAgIHByb3h5X2F1dGhfaGRyID0gIlByb3h5LUF1dGhvcml6YXRpb24iCisgICAgICAgICAgICAgICAgICAgIGlmIHByb3h5X2F1dGhfaGRyIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICB0dW5uZWxfaGVhZGVyc1twcm94eV9hdXRoX2hkcl0gPSBoZWFkZXJzW3Byb3h5X2F1dGhfaGRyXQorICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm94eS1BdXRob3JpemF0aW9uIHNob3VsZCBub3QgYmUgc2VudCB0byBvcmlnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2VydmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGhlYWRlcnNbcHJveHlfYXV0aF9oZHJdCisgICAgICAgICAgICAgICAgICAgIGguc2V0X3R1bm5lbChyZXEuX3R1bm5lbF9ob3N0LCBoZWFkZXJzPXR1bm5lbF9oZWFkZXJzKQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBoLnJlcXVlc3QocmVxLmdldF9tZXRob2QoKSwgcmVxLmdldF9zZWxlY3RvcigpLCByZXEuZGF0YSwgaGVhZGVycykKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6ICMgWFhYIHdoYXQgZXJyb3I/CisgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgY2xvc2UgY29ubmVjdGlvbiB3aGVuIGNhY2hlIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIGZldGNoLmNvbm5lY3Rpb25fY2FjaGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGguY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICByYWlzZSB1cmxsaWIyLlVSTEVycm9yKGVycikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaC5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBidWZmZXJpbmcga3cgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgciA9IGguZ2V0cmVzcG9uc2UoKQorCisgICAgICAgICAgICAgICAgIyBQaWNrIGFwYXJ0IHRoZSBIVFRQUmVzcG9uc2Ugb2JqZWN0IHRvIGdldCB0aGUgYWRkaW5mb3VybAorICAgICAgICAgICAgICAgICMgb2JqZWN0IGluaXRpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICAgICAgICAgIyBXcmFwIHRoZSBIVFRQUmVzcG9uc2Ugb2JqZWN0IGluIHNvY2tldCdzIGZpbGUgb2JqZWN0IGFkYXB0ZXIKKyAgICAgICAgICAgICAgICAjIGZvciBXaW5kb3dzLiAgVGhhdCBhZGFwdGVyIGNhbGxzIHJlY3YoKSwgc28gZGVsZWdhdGUgcmVjdigpCisgICAgICAgICAgICAgICAgIyB0byByZWFkKCkuICBUaGlzIHdlaXJkIHdyYXBwaW5nIGFsbG93cyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvCisgICAgICAgICAgICAgICAgIyBoYXZlIHJlYWRsaW5lKCkgYW5kIHJlYWRsaW5lcygpIG1ldGhvZHMuCisKKyAgICAgICAgICAgICAgICAjIFhYWCBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZXh0cmFjdCB0aGUgcmVhZCBidWZmZXJpbmcgY29kZQorICAgICAgICAgICAgICAgICMgb3V0IG9mIHNvY2tldC5fZmlsZW9iamVjdCgpIGFuZCBpbnRvIGEgYmFzZSBjbGFzcy4KKyAgICAgICAgICAgICAgICByLnJlY3YgPSByLnJlYWQKKworICAgICAgICAgICAgICAgICMgbm8gZGF0YSwganVzdCBoYXZlIHRvIHJlYWQKKyAgICAgICAgICAgICAgICByLnJlYWQoKQorICAgICAgICAgICAgICAgIGNsYXNzIGZwX2R1bW15KG9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICAgICAgICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICAgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICByZXNwID0gYWRkaW5mb3VybChmcF9kdW1teSgpLCByLm1zZywgcmVxLmdldF9mdWxsX3VybCgpKQorICAgICAgICAgICAgICAgIHJlc3AuY29kZSA9IHIuc3RhdHVzCisgICAgICAgICAgICAgICAgcmVzcC5tc2cgPSByLnJlYXNvbgorCisgICAgICAgICAgICAgICAgIyBDbG9zZSBjb25uZWN0aW9uIHdoZW4gc2VydmVyIHJlcXVlc3QgaXQuCisgICAgICAgICAgICAgICAgaWYgZmV0Y2guY29ubmVjdGlvbl9jYWNoZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgJ0Nvbm5lY3Rpb24nIGluIHIubXNnIGFuZCByLm1zZ1snQ29ubmVjdGlvbiddID09ICdjbG9zZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaC5jb25uZWN0aW9uX2NhY2hlLnJlbW92ZV9jb25uZWN0aW9uKGguaG9zdCwgaC5wb3J0KQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3AKKworICAgICAgICBkZWYgZXhwb3J0X3Byb3hpZXMoZCk6CisgICAgICAgICAgICB2YXJpYWJsZXMgPSBbJ2h0dHBfcHJveHknLCAnSFRUUF9QUk9YWScsICdodHRwc19wcm94eScsICdIVFRQU19QUk9YWScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z0cF9wcm94eScsICdGVFBfUFJPWFknLCAnbm9fcHJveHknLCAnTk9fUFJPWFknXQorICAgICAgICAgICAgZXhwb3J0ZWQgPSBGYWxzZQorCisgICAgICAgICAgICBmb3IgdiBpbiB2YXJpYWJsZXM6CisgICAgICAgICAgICAgICAgaWYgdiBpbiBvcy5lbnZpcm9uLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdl9wcm94eSA9IGQuZ2V0VmFyKHYsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGlmIHZfcHJveHkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uW3ZdID0gdl9wcm94eQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWQgPSBUcnVlCisKKyAgICAgICAgICAgIHJldHVybiBleHBvcnRlZAorCisgICAgICAgIGRlZiBoZWFkX21ldGhvZChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAiSEVBRCIKKworICAgICAgICBleHBvcnRlZF9wcm94aWVzID0gZXhwb3J0X3Byb3hpZXMoZCkKKworICAgICAgICAjIFhYWDogU2luY2UgUHl0aG9uIDIuNy45IHNzbCBjZXJ0IHZhbGlkYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0CisgICAgICAgICMgc2VlIFBFUC0wNDc2LCB0aGlzIGNhdXNlcyB2ZXJpZmljYXRpb24gZXJyb3JzIG9uIHNvbWUgaHR0cHMgc2VydmVycworICAgICAgICAjIHNvIGRpc2FibGUgYnkgZGVmYXVsdC4KKyAgICAgICAgaW1wb3J0IHNzbAorICAgICAgICBzc2xfY29udGV4dCA9IE5vbmUKKyAgICAgICAgaWYgaGFzYXR0cihzc2wsICdfY3JlYXRlX3VudmVyaWZpZWRfY29udGV4dCcpOgorICAgICAgICAgICAgc3NsX2NvbnRleHQgPSBzc2wuX2NyZWF0ZV91bnZlcmlmaWVkX2NvbnRleHQoKQorCisgICAgICAgIGlmIGV4cG9ydGVkX3Byb3hpZXMgPT0gVHJ1ZSBhbmQgc3NsX2NvbnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLlByb3h5SGFuZGxlciwgQ2FjaGVIVFRQSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgdXJsbGliMi5IVFRQU0hhbmRsZXIoY29udGV4dD1zc2xfY29udGV4dCkpCisgICAgICAgIGVsaWYgZXhwb3J0ZWRfcHJveGllcyA9PSBGYWxzZSBhbmQgc3NsX2NvbnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihDYWNoZUhUVFBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLkhUVFBTSGFuZGxlcihjb250ZXh0PXNzbF9jb250ZXh0KSkKKyAgICAgICAgZWxpZiBleHBvcnRlZF9wcm94aWVzID09IFRydWUgYW5kIHNzbF9jb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcih1cmxsaWIyLlByb3h5SGFuZGxlciwgQ2FjaGVIVFRQSGFuZGxlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKENhY2hlSFRUUEhhbmRsZXIpCisKKyAgICAgICAgdXJsbGliMi5SZXF1ZXN0LmdldF9tZXRob2QgPSBoZWFkX21ldGhvZAorICAgICAgICB1cmxsaWIyLmluc3RhbGxfb3BlbmVyKG9wZW5lcikKKworICAgICAgICB1cmkgPSB1ZC51cmwuc3BsaXQoIjsiKVswXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVybGxpYjIudXJsb3Blbih1cmkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9wYXJzZV9wYXRoKHNlbGYsIHJlZ2V4LCBzKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgYW5kIGdyb3VwIG5hbWUsIHZlcnNpb24gYW5kIGFyY2hpdmUgdHlwZSBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHMKKyAgICAgICAgIiIiCisKKyAgICAgICAgbSA9IHJlZ2V4LnNlYXJjaChzKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgcG5hbWUgPSAnJworICAgICAgICAgICAgcHZlciA9ICcnCisgICAgICAgICAgICBwdHlwZSA9ICcnCisKKyAgICAgICAgICAgIG1kaWN0ID0gbS5ncm91cGRpY3QoKQorICAgICAgICAgICAgaWYgJ25hbWUnIGluIG1kaWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICBwbmFtZSA9IG1kaWN0WyduYW1lJ10KKyAgICAgICAgICAgIGlmICdwdmVyJyBpbiBtZGljdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgcHZlciA9IG1kaWN0WydwdmVyJ10KKyAgICAgICAgICAgIGlmICd0eXBlJyBpbiBtZGljdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgcHR5cGUgPSBtZGljdFsndHlwZSddCisKKyAgICAgICAgICAgIGJiLmRlYnVnKDMsICJfcGFyc2VfcGF0aDogJXMsICVzLCAlcyIgJSAocG5hbWUsIHB2ZXIsIHB0eXBlKSkKKworICAgICAgICAgICAgcmV0dXJuIChwbmFtZSwgcHZlciwgcHR5cGUpCisKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfbW9kZWxhdGVfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgaWYgdmVyc2lvblswXSBpbiBbJy4nLCAnLSddOgorICAgICAgICAgICAgaWYgdmVyc2lvblsxXS5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bMV0gKyB2ZXJzaW9uWzBdICsgdmVyc2lvblsyOmxlbih2ZXJzaW9uKV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bMTpsZW4odmVyc2lvbildCisKKyAgICAgICAgdmVyc2lvbiA9IHJlLnN1YignLScsICcuJywgdmVyc2lvbikKKyAgICAgICAgdmVyc2lvbiA9IHJlLnN1YignXycsICcuJywgdmVyc2lvbikKKyAgICAgICAgdmVyc2lvbiA9IHJlLnN1YignKHJjKSsnLCAnLjEwMDAuJywgdmVyc2lvbikKKyAgICAgICAgdmVyc2lvbiA9IHJlLnN1YignKGJldGEpKycsICcuMTAwLicsIHZlcnNpb24pCisgICAgICAgIHZlcnNpb24gPSByZS5zdWIoJyhhbHBoYSkrJywgJy4xMC4nLCB2ZXJzaW9uKQorICAgICAgICBpZiB2ZXJzaW9uWzBdID09ICd2JzoKKyAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzE6bGVuKHZlcnNpb24pXQorICAgICAgICByZXR1cm4gdmVyc2lvbgorCisgICAgZGVmIF92ZXJjbXAoc2VsZiwgb2xkLCBuZXcpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgd2hldGhlciAnbmV3JyBpcyBuZXdlciB0aGFuICdvbGQnIHZlcnNpb24uIFdlIHVzZSBleGlzdGluZyB2ZXJjbXAoKSBmb3IgdGhlCisgICAgICAgIHB1cnBvc2UuIFBFIGlzIGNsZWFyZWQgaW4gY29tcGFyaXNvbiBhcyBpdCdzIG5vdCBmb3IgYnVpbGQsIGFuZCBQUiBpcyBjbGVhcmVkIHRvbworICAgICAgICBmb3Igc2ltcGxpY2l0eSBhcyBpdCdzIHNvbWVob3cgZGlmZmljdWx0IHRvIGdldCBmcm9tIHZhcmlvdXMgdXBzdHJlYW0gZm9ybWF0CisgICAgICAgICIiIgorCisgICAgICAgIChvbGRwbiwgb2xkcHYsIG9sZHN1ZmZpeCkgPSBvbGQKKyAgICAgICAgKG5ld3BuLCBuZXdwdiwgbmV3c3VmZml4KSA9IG5ldworCisgICAgICAgICIiIgorICAgICAgICBDaGVjayBmb3IgYSBuZXcgc3VmZml4IHR5cGUgdGhhdCB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIGJlZm9yZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgKG5ld3N1ZmZpeCk6CisgICAgICAgICAgICBtID0gc2VsZi5zdWZmaXhfcmVnZXhfY29tcC5zZWFyY2gobmV3c3VmZml4KQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgYmIud2FybigiJXMgaGFzIGEgcG9zc2libGUgdW5rbm93biBzdWZmaXg6ICVzIiAlIChuZXdwbiwgbmV3c3VmZml4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAiIiIKKyAgICAgICAgTm90IG91ciBwYWNrYWdlIHNvIGlnbm9yZSBpdAorICAgICAgICAiIiIKKyAgICAgICAgaWYgb2xkcG4gIT0gbmV3cG46CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBvbGRwdiA9IHNlbGYuX21vZGVsYXRlX3ZlcnNpb24ob2xkcHYpCisgICAgICAgIG5ld3B2ID0gc2VsZi5fbW9kZWxhdGVfdmVyc2lvbihuZXdwdikKKworICAgICAgICByZXR1cm4gYmIudXRpbHMudmVyY21wKCgiMCIsIG9sZHB2LCAiIiksICgiMCIsIG5ld3B2LCAiIikpCisKKyAgICBkZWYgX2ZldGNoX2luZGV4KHNlbGYsIHVyaSwgdWQsIGQpOgorICAgICAgICAiIiIKKyAgICAgICAgUnVuIGZldGNoIGNoZWNrc3RhdHVzIHRvIGdldCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIGYgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorCisgICAgICAgIGFnZW50ID0gIk1vemlsbGEvNS4wIChYMTE7IFU7IExpbnV4IGk2ODY7IGVuLVVTOyBydjoxLjkuMi4xMikgR2Vja28vMjAxMDEwMjcgVWJ1bnR1LzkuMTAgKGthcm1pYykgRmlyZWZveC8zLjYuMTIiCisgICAgICAgIGZldGNoY21kID0gc2VsZi5iYXNlY21kCisgICAgICAgIGZldGNoY21kICs9ICIgLU8gIiArIGYubmFtZSArICIgLS11c2VyLWFnZW50PSciICsgYWdlbnQgKyAiJyAnIiArIHVyaSArICInIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9ydW53Z2V0KHVkLCBkLCBmZXRjaGNtZCwgVHJ1ZSkKKyAgICAgICAgICAgIGZldGNocmVzdWx0ID0gZi5yZWFkKCkKKyAgICAgICAgZXhjZXB0IGJiLmZldGNoMi5CQkZldGNoRXhjZXB0aW9uOgorICAgICAgICAgICAgZmV0Y2hyZXN1bHQgPSAiIgorCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gZmV0Y2hyZXN1bHQKKworICAgIGRlZiBfY2hlY2tfbGF0ZXN0X3ZlcnNpb24oc2VsZiwgdXJsLCBwYWNrYWdlLCBwYWNrYWdlX3JlZ2V4LCBjdXJyZW50X3ZlcnNpb24sIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBwYWNrYWdlIGluc2lkZSBhIGdpdmVuIGRpcmVjdG9yeSBwYXRoCisgICAgICAgIElmIGVycm9yIG9yIG5vIHZlcnNpb24sIHJldHVybiAiIgorICAgICAgICAiIiIKKyAgICAgICAgdmFsaWQgPSAwCisgICAgICAgIHZlcnNpb24gPSBbJycsICcnLCAnJ10KKworICAgICAgICBiYi5kZWJ1ZygzLCAiVmVyc2lvblVSTDogJXMiICUgKHVybCkpCisgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTb3VwKHNlbGYuX2ZldGNoX2luZGV4KHVybCwgdWQsIGQpKQorICAgICAgICBpZiBub3Qgc291cDoKKyAgICAgICAgICAgIGJiLmRlYnVnKDMsICIqKiogJXMgTk8gU09VUCIgJSAodXJsKSkKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgICAgIGZvciBsaW5lIGluIHNvdXAuZmluZF9hbGwoJ2EnLCBocmVmPVRydWUpOgorICAgICAgICAgICAgYmIuZGVidWcoMywgImxpbmVbJ2hyZWYnXSA9ICclcyciICUgKGxpbmVbJ2hyZWYnXSkpCisgICAgICAgICAgICBiYi5kZWJ1ZygzLCAibGluZSA9ICclcyciICUgKHN0cihsaW5lKSkpCisKKyAgICAgICAgICAgIG5ld3ZlciA9IHNlbGYuX3BhcnNlX3BhdGgocGFja2FnZV9yZWdleCwgbGluZVsnaHJlZiddKQorICAgICAgICAgICAgaWYgbm90IG5ld3ZlcjoKKyAgICAgICAgICAgICAgICBuZXd2ZXIgPSBzZWxmLl9wYXJzZV9wYXRoKHBhY2thZ2VfcmVnZXgsIHN0cihsaW5lKSkKKworICAgICAgICAgICAgaWYgbmV3dmVyOgorICAgICAgICAgICAgICAgIGJiLmRlYnVnKDMsICJVcHN0cmVhbSB2ZXJzaW9uIGZvdW5kOiAlcyIgJSBuZXd2ZXJbMV0pCisgICAgICAgICAgICAgICAgaWYgdmFsaWQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IG5ld3ZlcgorICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX3ZlcmNtcCh2ZXJzaW9uLCBuZXd2ZXIpIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IG5ld3ZlcgorICAgICAgICAgICAgICAgIAorICAgICAgICBwdXB2ZXIgPSByZS5zdWIoJ18nLCAnLicsIHZlcnNpb25bMV0pCisKKyAgICAgICAgYmIuZGVidWcoMywgIioqKiAlcyAtPiBVcHN0cmVhbVZlcnNpb24gPSAlcyAoQ3VycmVudFZlcnNpb24gPSAlcykiICUKKyAgICAgICAgICAgICAgICAocGFja2FnZSwgcHVwdmVyIG9yICJOL0EiLCBjdXJyZW50X3ZlcnNpb25bMV0pKQorCisgICAgICAgIGlmIHZhbGlkOgorICAgICAgICAgICAgcmV0dXJuIHB1cHZlcgorCisgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIF9jaGVja19sYXRlc3RfdmVyc2lvbl9ieV9kaXIoc2VsZiwgZGlydmVyLCBwYWNrYWdlLCBwYWNrYWdlX3JlZ2V4LAorICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICAgICAgU2NhbiBldmVyeSBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gZ2V0IHVwc3RyZWFtIHZlcnNpb24uCisgICAgICAgICIiIgorICAgICAgICB2ZXJzaW9uX2RpciA9IFsnJywgJycsICcnXQorICAgICAgICB2ZXJzaW9uID0gWycnLCAnJywgJyddCisKKyAgICAgICAgZGlydmVyX3JlZ2V4ID0gcmUuY29tcGlsZSgiKFxEKikoKFxkK1tcLlwtX10pKyhcZCspKSIpCisgICAgICAgIHMgPSBkaXJ2ZXJfcmVnZXguc2VhcmNoKGRpcnZlcikKKyAgICAgICAgaWYgczoKKyAgICAgICAgICAgIHZlcnNpb25fZGlyWzFdID0gcy5ncm91cCgyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmVyc2lvbl9kaXJbMV0gPSBkaXJ2ZXIKKworICAgICAgICBkaXJzX3VyaSA9IGJiLmZldGNoLmVuY29kZXVybChbdWQudHlwZSwgdWQuaG9zdCwKKyAgICAgICAgICAgICAgICB1ZC5wYXRoLnNwbGl0KGRpcnZlcilbMF0sIHVkLnVzZXIsIHVkLnBzd2QsIHt9XSkKKyAgICAgICAgYmIuZGVidWcoMywgIkRpclVSTDogJXMsICVzIiAlIChkaXJzX3VyaSwgcGFja2FnZSkpCisKKyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAoc2VsZi5fZmV0Y2hfaW5kZXgoZGlyc191cmksIHVkLCBkKSkKKyAgICAgICAgaWYgbm90IHNvdXA6CisgICAgICAgICAgICByZXR1cm4gdmVyc2lvblsxXQorCisgICAgICAgIGZvciBsaW5lIGluIHNvdXAuZmluZF9hbGwoJ2EnLCBocmVmPVRydWUpOgorICAgICAgICAgICAgcyA9IGRpcnZlcl9yZWdleC5zZWFyY2gobGluZVsnaHJlZiddLnN0cmlwKCIvIikpCisgICAgICAgICAgICBpZiBzOgorICAgICAgICAgICAgICAgIHZlcnNpb25fZGlyX25ldyA9IFsnJywgcy5ncm91cCgyKSwgJyddCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdmVyY21wKHZlcnNpb25fZGlyLCB2ZXJzaW9uX2Rpcl9uZXcpIDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGRpcnZlcl9uZXcgPSBzLmdyb3VwKDEpICsgcy5ncm91cCgyKQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gdWQucGF0aC5yZXBsYWNlKGRpcnZlciwgZGlydmVyX25ldywgVHJ1ZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KHBhY2thZ2UpWzBdCisgICAgICAgICAgICAgICAgICAgIHVyaSA9IGJiLmZldGNoLmVuY29kZXVybChbdWQudHlwZSwgdWQuaG9zdCwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkLnVzZXIsIHVkLnBzd2QsIHt9XSkKKworICAgICAgICAgICAgICAgICAgICBwdXB2ZXIgPSBzZWxmLl9jaGVja19sYXRlc3RfdmVyc2lvbih1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSwgcGFja2FnZV9yZWdleCwgY3VycmVudF92ZXJzaW9uLCB1ZCwgZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcHVwdmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvblsxXSA9IHB1cHZlcgorCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fZGlyID0gdmVyc2lvbl9kaXJfbmV3CisKKyAgICAgICAgcmV0dXJuIHZlcnNpb25bMV0KKworICAgIGRlZiBfaW5pdF9yZWdleGVzKHNlbGYsIHBhY2thZ2UsIHVkLCBkKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hdGNoIGFzIG1hbnkgcGF0dGVybnMgYXMgcG9zc2libGUgc3VjaCBhczoKKyAgICAgICAgICAgICAgICBnbm9tZS1jb21tb24tMi4yMC4wLnRhci5neiAobW9zdCBjb21tb24gZm9ybWF0KQorICAgICAgICAgICAgICAgIGd0aystMi45MC4xLnRhci5negorICAgICAgICAgICAgICAgIHhmODYtaW5wdXQtc3luYXB0aWNzLTEyLjYuOS50YXIuZ3oKKyAgICAgICAgICAgICAgICBkcmkycHJvdG8tMi4zLnRhci5negorICAgICAgICAgICAgICAgIGJsa3Rvb2xfNC5vcmlnLnRhci5negorICAgICAgICAgICAgICAgIGxpYmlkM3RhZy0wLjE1LjFiLnRhci5negorICAgICAgICAgICAgICAgIHVuemlwNTUyLnRhci5negorICAgICAgICAgICAgICAgIGljdTRjLTNfNi1zcmMudGd6CisgICAgICAgICAgICAgICAgZ2VuZXh0MmZzXzEuMy5vcmlnLnRhci5negorICAgICAgICAgICAgICAgIGdzdC1mbHVlbmRvLW1wMworICAgICAgICAiIiIKKyAgICAgICAgIyBtYXRjaCBtb3N0IHBhdHRlcm5zIHdoaWNoIHVzZXMgIi0iIGFzIHNlcGFyYXRvciB0byB2ZXJzaW9uIGRpZ2l0cworICAgICAgICBwbl9wcmVmaXgxID0gIlthLXpBLVpdW2EtekEtWjAtOV0qKFstX11bYS16QS1aXVx3KykqXCs/Wy1fXSIKKyAgICAgICAgIyBhIGxvb3NlIHBhdHRlcm4gc3VjaCBhcyBmb3IgdW56aXA1NTIudGFyLmd6CisgICAgICAgIHBuX3ByZWZpeDIgPSAiW2EtekEtWl0rIgorICAgICAgICAjIGEgbG9vc2UgcGF0dGVybiBzdWNoIGFzIGZvciA4MDMyNS1xdWlja3ktMC40LnRhci5negorICAgICAgICBwbl9wcmVmaXgzID0gIlswLTldK1stXT9bYS16QS1aXSsiCisgICAgICAgICMgU2F2ZSB0aGUgUGFja2FnZSBOYW1lIChwbikgUmVnZXggZm9yIHVzZSBsYXRlcgorICAgICAgICBwbl9yZWdleCA9ICIoJXN8JXN8JXMpIiAlIChwbl9wcmVmaXgxLCBwbl9wcmVmaXgyLCBwbl9wcmVmaXgzKQorCisgICAgICAgICMgbWF0Y2ggdmVyc2lvbgorICAgICAgICBwdmVyX3JlZ2V4ID0gIigoW0EtWl0qXGQrW2EtekEtWl0qW1wuXC1fXSopKykiCisKKyAgICAgICAgIyBtYXRjaCBhcmNoCisgICAgICAgIHBhcmNoX3JlZ2V4ID0gIi1zb3VyY2V8X2FsbF8iCisKKyAgICAgICAgIyBzcmMucnBtIGV4dGVuc2lvbiB3YXMgYWRkZWQgb25seSBmb3IgcnBtIHBhY2thZ2UuIENhbiBiZSByZW1vdmVkIGlmIHRoZSBycG0KKyAgICAgICAgIyBwYWNrYWdlZCB3aWxsIGFsd2F5cyBiZSBjb25zaWRlcmVkIGFzIGhhdmluZyB0byBiZSBtYW51YWxseSB1cGdyYWRlZAorICAgICAgICBwc3VmZml4X3JlZ2V4ID0gIih0YXJcLmd6fHRnenx0YXJcLmJ6Mnx6aXB8eHp8cnBtfGJ6MnxvcmlnXC50YXJcLmd6fHRhclwueHp8c3JjXC50YXJcLmd6fHNyY1wudGd6fHN2bnJcZCtcLnRhclwuYnoyfHN0YWJsZVwudGFyXC5nenxzcmNcLnJwbSkiCisKKyAgICAgICAgIyBtYXRjaCBuYW1lLCB2ZXJzaW9uIGFuZCBhcmNoaXZlIHR5cGUgb2YgYSBwYWNrYWdlCisgICAgICAgIHBhY2thZ2VfcmVnZXhfY29tcCA9IHJlLmNvbXBpbGUoIig/UDxuYW1lPiVzP1wuP3Y/KSg/UDxwdmVyPiVzKSg/UDxhcmNoPiVzKT9bXC4tXSg/UDx0eXBlPiVzJCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocG5fcmVnZXgsIHB2ZXJfcmVnZXgsIHBhcmNoX3JlZ2V4LCBwc3VmZml4X3JlZ2V4KSkKKyAgICAgICAgc2VsZi5zdWZmaXhfcmVnZXhfY29tcCA9IHJlLmNvbXBpbGUocHN1ZmZpeF9yZWdleCkKKworICAgICAgICAjIGNvbXBpbGUgcmVnZXgsIGNhbiBiZSBzcGVjaWZpYyBieSBwYWNrYWdlIG9yIGdlbmVyaWMgcmVnZXgKKyAgICAgICAgcG5fcmVnZXggPSBkLmdldFZhcignUkVHRVgnLCBUcnVlKQorICAgICAgICBpZiBwbl9yZWdleDoKKyAgICAgICAgICAgIHBhY2thZ2VfY3VzdG9tX3JlZ2V4X2NvbXAgPSByZS5jb21waWxlKHBuX3JlZ2V4KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYuX3BhcnNlX3BhdGgocGFja2FnZV9yZWdleF9jb21wLCBwYWNrYWdlKQorICAgICAgICAgICAgaWYgdmVyc2lvbjoKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2N1c3RvbV9yZWdleF9jb21wID0gcmUuY29tcGlsZSgKKyAgICAgICAgICAgICAgICAgICAgIig/UDxuYW1lPiVzKSg/UDxwdmVyPiVzKSg/UDxhcmNoPiVzKT9bXC4tXSg/UDx0eXBlPiVzKSIgJQorICAgICAgICAgICAgICAgICAgICAocmUuZXNjYXBlKHZlcnNpb25bMF0pLCBwdmVyX3JlZ2V4LCBwYXJjaF9yZWdleCwgcHN1ZmZpeF9yZWdleCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhY2thZ2VfY3VzdG9tX3JlZ2V4X2NvbXAgPSBOb25lCisKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VfY3VzdG9tX3JlZ2V4X2NvbXAKKworICAgIGRlZiBsYXRlc3RfdmVyc2lvbnN0cmluZyhzZWxmLCB1ZCwgZCk6CisgICAgICAgICIiIgorICAgICAgICBNYW5pcHVsYXRlIHRoZSBVUkwgYW5kIHRyeSB0byBvYnRhaW4gdGhlIGxhdGVzdCBwYWNrYWdlIHZlcnNpb24KKworICAgICAgICBzYW5pdHkgY2hlY2sgdG8gZW5zdXJlIHNhbWUgbmFtZSBhbmQgdHlwZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhY2thZ2UgPSB1ZC5wYXRoLnNwbGl0KCIvIilbLTFdCisgICAgICAgIGN1cnJlbnRfdmVyc2lvbiA9IFsnJywgZC5nZXRWYXIoJ1BWJywgVHJ1ZSksICcnXQorCisgICAgICAgICIiInBvc3NpYmxlIHRvIGhhdmUgbm8gdmVyc2lvbiBpbiBwa2cgbmFtZSwgc3VjaCBhcyBzcGVjdHJ1bS1mdyIiIgorICAgICAgICBpZiBub3QgcmUuc2VhcmNoKCJcZCsiLCBwYWNrYWdlKToKKyAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvblsxXSA9IHJlLnN1YignXycsICcuJywgY3VycmVudF92ZXJzaW9uWzFdKQorICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uWzFdID0gcmUuc3ViKCctJywgJy4nLCBjdXJyZW50X3ZlcnNpb25bMV0pCisgICAgICAgICAgICByZXR1cm4gKGN1cnJlbnRfdmVyc2lvblsxXSwgJycpCisKKyAgICAgICAgcGFja2FnZV9yZWdleCA9IHNlbGYuX2luaXRfcmVnZXhlcyhwYWNrYWdlLCB1ZCwgZCkKKyAgICAgICAgaWYgcGFja2FnZV9yZWdleCBpcyBOb25lOgorICAgICAgICAgICAgYmIud2FybigibGF0ZXN0X3ZlcnNpb25zdHJpbmc6IHBhY2thZ2UgJXMgZG9uJ3QgbWF0Y2ggcGF0dGVybiIgJSAocGFja2FnZSkpCisgICAgICAgICAgICByZXR1cm4gKCcnLCAnJykKKyAgICAgICAgYmIuZGVidWcoMywgImxhdGVzdF92ZXJzaW9uc3RyaW5nLCByZWdleDogJXMiICUgKHBhY2thZ2VfcmVnZXgucGF0dGVybikpCisKKyAgICAgICAgdXJpID0gIiIKKyAgICAgICAgcmVnZXhfdXJpID0gZC5nZXRWYXIoIlJFR0VYX1VSSSIsIFRydWUpCisgICAgICAgIGlmIG5vdCByZWdleF91cmk6CisgICAgICAgICAgICBwYXRoID0gdWQucGF0aC5zcGxpdChwYWNrYWdlKVswXQorCisgICAgICAgICAgICAjIHNlYXJjaCBmb3IgdmVyc2lvbiBtYXRjaGVzIG9uIGZvbGRlcnMgaW5zaWRlIHRoZSBwYXRoLCBsaWtlOgorICAgICAgICAgICAgIyAiNS43IiBpbiBodHRwOi8vZG93bmxvYWQuZ25vbWUub3JnL3NvdXJjZXMvJHtQTn0vNS43LyR7UE59LSR7UFZ9LnRhci5negorICAgICAgICAgICAgZGlydmVyX3JlZ2V4ID0gcmUuY29tcGlsZSgiKD9QPGRpcnZlcj5bXi9dKihcZCtcLikqXGQrKFstX11yXGQrKSopLyIpCisgICAgICAgICAgICBtID0gZGlydmVyX3JlZ2V4LnNlYXJjaChwYXRoKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBwbiA9IGQuZ2V0VmFyKCdQTicsIFRydWUpCisgICAgICAgICAgICAgICAgZGlydmVyID0gbS5ncm91cCgnZGlydmVyJykKKworICAgICAgICAgICAgICAgIGRpcnZlcl9wbl9yZWdleCA9IHJlLmNvbXBpbGUoIiVzXGQ/IiAlIChyZS5lc2NhcGUocG4pKSkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGlydmVyX3BuX3JlZ2V4LnNlYXJjaChkaXJ2ZXIpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuX2NoZWNrX2xhdGVzdF92ZXJzaW9uX2J5X2RpcihkaXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLCBwYWNrYWdlX3JlZ2V4LCBjdXJyZW50X3ZlcnNpb24sIHVkLCBkKSwgJycpCisKKyAgICAgICAgICAgIHVyaSA9IGJiLmZldGNoLmVuY29kZXVybChbdWQudHlwZSwgdWQuaG9zdCwgcGF0aCwgdWQudXNlciwgdWQucHN3ZCwge31dKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJpID0gcmVnZXhfdXJpCisKKyAgICAgICAgcmV0dXJuIChzZWxmLl9jaGVja19sYXRlc3RfdmVyc2lvbih1cmksIHBhY2thZ2UsIHBhY2thZ2VfcmVnZXgsCisgICAgICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uLCB1ZCwgZCksICcnKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvbWFpbi5weSBiL2JpdGJha2UvbGliL2JiL21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODc2MmY3MgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL21haW4ucHkKQEAgLTAsMCArMSw0MjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgUk9BRCBHbWJICisjIENvcHlyaWdodCAoQykgMjAwNiAgICAgICAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IHdhcm5pbmdzCisKK2ltcG9ydCBiYgorZnJvbSBiYiBpbXBvcnQgZXZlbnQKK2ltcG9ydCBiYi5tc2cKK2Zyb20gYmIgaW1wb3J0IGNvb2tlcgorZnJvbSBiYiBpbXBvcnQgdWkKK2Zyb20gYmIgaW1wb3J0IHNlcnZlcgorZnJvbSBiYiBpbXBvcnQgY29va2VyZGF0YQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCisKK2NsYXNzIEJCTWFpbkV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIHByZXNlbnRfb3B0aW9ucyhvcHRpb25saXN0KToKKyAgICBpZiBsZW4ob3B0aW9ubGlzdCkgPiAxOgorICAgICAgICByZXR1cm4gJyBvciAnLmpvaW4oWycsICcuam9pbihvcHRpb25saXN0WzotMV0pLCBvcHRpb25saXN0Wy0xXV0pCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG9wdGlvbmxpc3RbMF0KKworY2xhc3MgQml0YmFrZUhlbHBGb3JtYXR0ZXIob3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyKToKKyAgICBkZWYgZm9ybWF0X29wdGlvbihzZWxmLCBvcHRpb24pOgorICAgICAgICAjIFdlIG5lZWQgdG8gZG8gdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSB0ZXh0IHdlIHN1cHBseSB0bworICAgICAgICAjIGFkZF9vcHRpb24oKSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBsaXN0X2V4dGVuc2lvbl9tb2R1bGVzKCkKKyAgICAgICAgIyBvbiBldmVyeSBleGVjdXRpb24gKHNpbmNlIGl0IGltcG9ydHMgYWxsIG9mIHRoZSBtb2R1bGVzKQorICAgICAgICAjIE5vdGUgYWxzbyB0aGF0IHdlIG1vZGlmeSBvcHRpb24uaGVscCByYXRoZXIgdGhhbiB0aGUgcmV0dXJuZWQgdGV4dAorICAgICAgICAjIC0gdGhpcyBpcyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmUtZm9ybWF0IHRoZSB0ZXh0IG91cnNlbHZlcworICAgICAgICBpZiBvcHRpb24uZGVzdCA9PSAndWknOgorICAgICAgICAgICAgdmFsaWRfdWlzID0gbGlzdF9leHRlbnNpb25fbW9kdWxlcyhiYi51aSwgJ21haW4nKQorICAgICAgICAgICAgb3B0aW9uLmhlbHAgPSBvcHRpb24uaGVscC5yZXBsYWNlKCdAQ0hPSUNFU0AnLCBwcmVzZW50X29wdGlvbnModmFsaWRfdWlzKSkKKyAgICAgICAgZWxpZiBvcHRpb24uZGVzdCA9PSAnc2VydmVydHlwZSc6CisgICAgICAgICAgICB2YWxpZF9zZXJ2ZXJfdHlwZXMgPSBsaXN0X2V4dGVuc2lvbl9tb2R1bGVzKGJiLnNlcnZlciwgJ0JpdEJha2VTZXJ2ZXInKQorICAgICAgICAgICAgb3B0aW9uLmhlbHAgPSBvcHRpb24uaGVscC5yZXBsYWNlKCdAQ0hPSUNFU0AnLCBwcmVzZW50X29wdGlvbnModmFsaWRfc2VydmVyX3R5cGVzKSkKKworICAgICAgICByZXR1cm4gb3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyLmZvcm1hdF9vcHRpb24oc2VsZiwgb3B0aW9uKQorCitkZWYgbGlzdF9leHRlbnNpb25fbW9kdWxlcyhwa2csIGNoZWNrYXR0cik6CisgICAgIiIiCisgICAgTGlzdHMgZXh0ZW5zaW9uIG1vZHVsZXMgaW4gYSBzcGVjaWZpYyBQeXRob24gcGFja2FnZQorICAgIChlLmcuIFVJcywgc2VydmVycykuIE5PVEU6IENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGltcG9ydCBhbGwgb2YgdGhlCisgICAgc3VibW9kdWxlcyBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBpbiBvcmRlciB0byBjaGVjayBmb3IgdGhlIHNwZWNpZmllZAorICAgIGF0dHJpYnV0ZTsgdGhpcyBjYW4gaGF2ZSB1bnVzdWFsIHNpZGUtZWZmZWN0cy4gQXMgYSByZXN1bHQsIHRoaXMgc2hvdWxkCisgICAgb25seSBiZSBjYWxsZWQgd2hlbiBkaXNwbGF5aW5nIGhlbHAgdGV4dCBvciBlcnJvciBtZXNzYWdlcy4KKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICBwa2c6IHByZXZpb3VzbHkgaW1wb3J0ZWQgUHl0aG9uIHBhY2thZ2UgdG8gbGlzdAorICAgICAgICBjaGVja2F0dHI6IGF0dHJpYnV0ZSB0byBsb29rIGZvciBpbiBtb2R1bGUgdG8gZGV0ZXJtaW5lIGlmIGl0J3MgdmFsaWQKKyAgICAgICAgICAgIGFzIHRoZSB0eXBlIG9mIGV4dGVuc2lvbiB5b3UgYXJlIGxvb2tpbmcgZm9yCisgICAgIiIiCisgICAgaW1wb3J0IHBrZ3V0aWwKKyAgICBwa2dkaXIgPSBvcy5wYXRoLmRpcm5hbWUocGtnLl9fZmlsZV9fKQorCisgICAgbW9kdWxlcyA9IFtdCisgICAgZm9yIF8sIG1vZHVsZW5hbWUsIF8gaW4gcGtndXRpbC5pdGVyX21vZHVsZXMoW3BrZ2Rpcl0pOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwa2dkaXIsIG1vZHVsZW5hbWUpKToKKyAgICAgICAgICAgICMgaWdub3JlIGRpcmVjdG9yaWVzCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHBrZy5fX25hbWVfXywgZnJvbWxpc3Q9W21vZHVsZW5hbWVdKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIElmIHdlIGNhbid0IGltcG9ydCBpdCwgaXQncyBub3QgdmFsaWQKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG1vZHVsZV9pZiA9IGdldGF0dHIobW9kdWxlLCBtb2R1bGVuYW1lKQorICAgICAgICBpZiBnZXRhdHRyKG1vZHVsZV9pZiwgJ2hpZGRlbl9leHRlbnNpb24nLCBGYWxzZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBub3QgY2hlY2thdHRyIG9yIGhhc2F0dHIobW9kdWxlX2lmLCBjaGVja2F0dHIpOgorICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQobW9kdWxlbmFtZSkKKyAgICByZXR1cm4gbW9kdWxlcworCitkZWYgaW1wb3J0X2V4dGVuc2lvbl9tb2R1bGUocGtnLCBtb2R1bGVuYW1lLCBjaGVja2F0dHIpOgorICAgIHRyeToKKyAgICAgICAgIyBEeW5hbWljYWxseSBsb2FkIHRoZSBVSSBiYXNlZCBvbiB0aGUgdWkgbmFtZS4gQWx0aG91Z2ggd2UKKyAgICAgICAgIyBzdWdnZXN0IGEgZml4ZWQgc2V0IHRoaXMgYWxsb3dzIHlvdSB0byBoYXZlIGZsZXhpYmlsaXR5IGluIHdoaWNoCisgICAgICAgICMgb25lcyBhcmUgYXZhaWxhYmxlLgorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHBrZy5fX25hbWVfXywgZnJvbWxpc3QgPSBbbW9kdWxlbmFtZV0pCisgICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgbW9kdWxlbmFtZSkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbignRkFUQUw6IFVuYWJsZSB0byBpbXBvcnQgZXh0ZW5zaW9uIG1vZHVsZSAiJXMiIGZyb20gJXMuIFZhbGlkIGV4dGVuc2lvbiBtb2R1bGVzOiAlcycgJSAobW9kdWxlbmFtZSwgcGtnLl9fbmFtZV9fLCBwcmVzZW50X29wdGlvbnMobGlzdF9leHRlbnNpb25fbW9kdWxlcyhwa2csIGNoZWNrYXR0cikpKSkKKworCisjIERpc3BsYXkgYml0YmFrZS9PRSB3YXJuaW5ncyB2aWEgdGhlIEJpdEJha2UuV2FybmluZ3MgbG9nZ2VyLCBpZ25vcmluZyBvdGhlcnMiIiIKK3dhcm5sb2cgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5XYXJuaW5ncyIpCitfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSB3YXJuaW5ncy5zaG93d2FybmluZworZGVmIF9zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgorICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSkKKyAgICBlbHNlOgorICAgICAgICBzID0gd2FybmluZ3MuZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgd2FybmxvZy53YXJuKHMpCisKK3dhcm5pbmdzLnNob3d3YXJuaW5nID0gX3Nob3d3YXJuaW5nCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIikKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJkZWZhdWx0IiwgbW9kdWxlPSIoPHN0cmluZz4kfChvZXxiYilcLikiKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9SW1wb3J0V2FybmluZykKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT0iPHN0cmluZz4kIikKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBtZXNzYWdlPSJXaXRoLXN0YXRlbWVudHMgbm93IGRpcmVjdGx5IHN1cHBvcnQgbXVsdGlwbGUgY29udGV4dCBtYW5hZ2VycyIpCisKK2NsYXNzIEJpdEJha2VDb25maWdQYXJhbWV0ZXJzKGNvb2tlcmRhdGEuQ29uZmlnUGFyYW1ldGVycyk6CisKKyAgICBkZWYgcGFyc2VDb21tYW5kTGluZShzZWxmLCBhcmd2PXN5cy5hcmd2KToKKyAgICAgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKAorICAgICAgICAgICAgZm9ybWF0dGVyID0gQml0YmFrZUhlbHBGb3JtYXR0ZXIoKSwKKyAgICAgICAgICAgIHZlcnNpb24gPSAiQml0QmFrZSBCdWlsZCBUb29sIENvcmUgdmVyc2lvbiAlcyIgJSBiYi5fX3ZlcnNpb25fXywKKyAgICAgICAgICAgIHVzYWdlID0gIiIiJXByb2cgW29wdGlvbnNdIFtyZWNpcGVuYW1lL3RhcmdldCByZWNpcGU6ZG9fdGFzayAuLi5dCisKKyAgICBFeGVjdXRlcyB0aGUgc3BlY2lmaWVkIHRhc2sgKGRlZmF1bHQgaXMgJ2J1aWxkJykgZm9yIGEgZ2l2ZW4gc2V0IG9mIHRhcmdldCByZWNpcGVzICguYmIgZmlsZXMpLgorICAgIEl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgYSBjb25mL2JibGF5ZXJzLmNvbmYgYXZhaWxhYmxlIGluIGN3ZCBvciBpbiBCQlBBVEggd2hpY2gKKyAgICB3aWxsIHByb3ZpZGUgdGhlIGxheWVyLCBCQkZJTEVTIGFuZCBvdGhlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiIiIikKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWIiLCAiLS1idWlsZGZpbGUiLCBoZWxwID0gIkV4ZWN1dGUgdGFza3MgZnJvbSBhIHNwZWNpZmljIC5iYiByZWNpcGUgZGlyZWN0bHkuIFdBUk5JTkc6IERvZXMgbm90IGhhbmRsZSBhbnkgZGVwZW5kZW5jaWVzIGZyb20gb3RoZXIgcmVjaXBlcy4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAiYnVpbGRmaWxlIiwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1rIiwgIi0tY29udGludWUiLCBoZWxwID0gIkNvbnRpbnVlIGFzIG11Y2ggYXMgcG9zc2libGUgYWZ0ZXIgYW4gZXJyb3IuIFdoaWxlIHRoZSB0YXJnZXQgdGhhdCBmYWlsZWQgYW5kIGFueXRoaW5nIGRlcGVuZGluZyBvbiBpdCBjYW5ub3QgYmUgYnVpbHQsIGFzIG11Y2ggYXMgcG9zc2libGUgd2lsbCBiZSBidWlsdCBiZWZvcmUgc3RvcHBpbmcuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfZmFsc2UiLCBkZXN0ID0gImFib3J0IiwgZGVmYXVsdCA9IFRydWUpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgIi0tdHJ5YWx0Y29uZmlncyIsIGhlbHAgPSAiQ29udGludWUgd2l0aCBidWlsZHMgYnkgdHJ5aW5nIHRvIHVzZSBhbHRlcm5hdGl2ZSBwcm92aWRlcnMgd2hlcmUgcG9zc2libGUuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAidHJ5YWx0Y29uZmlncyIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1mb3JjZSIsIGhlbHAgPSAiRm9yY2UgdGhlIHNwZWNpZmllZCB0YXJnZXRzL3Rhc2sgdG8gcnVuIChpbnZhbGlkYXRpbmcgYW55IGV4aXN0aW5nIHN0YW1wIGZpbGUpLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gImZvcmNlIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYyIsICItLWNtZCIsIGhlbHAgPSAiU3BlY2lmeSB0aGUgdGFzayB0byBleGVjdXRlLiBUaGUgZXhhY3Qgb3B0aW9ucyBhdmFpbGFibGUgZGVwZW5kIG9uIHRoZSBtZXRhZGF0YS4gU29tZSBleGFtcGxlcyBtaWdodCBiZSAnY29tcGlsZScgb3IgJ3BvcHVsYXRlX3N5c3Jvb3QnIG9yICdsaXN0dGFza3MnIG1heSBnaXZlIGEgbGlzdCBvZiB0aGUgdGFza3MgYXZhaWxhYmxlLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJjbWQiKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItQyIsICItLWNsZWFyLXN0YW1wIiwgaGVscCA9ICJJbnZhbGlkYXRlIHRoZSBzdGFtcCBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHN1Y2ggYXMgJ2NvbXBpbGUnIGFuZCB0aGVuIHJ1biB0aGUgZGVmYXVsdCB0YXNrIGZvciB0aGUgc3BlY2lmaWVkIHRhcmdldChzKS4iLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmUiLCBkZXN0ID0gImludmFsaWRhdGVfc3RhbXAiKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItciIsICItLXJlYWQiLCBoZWxwID0gIlJlYWQgdGhlIHNwZWNpZmllZCBmaWxlIGJlZm9yZSBiaXRiYWtlLmNvbmYuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAiYXBwZW5kIiwgZGVzdCA9ICJwcmVmaWxlIiwgZGVmYXVsdCA9IFtdKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItUiIsICItLXBvc3RyZWFkIiwgaGVscCA9ICJSZWFkIHRoZSBzcGVjaWZpZWQgZmlsZSBhZnRlciBiaXRiYWtlLmNvbmYuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gImFwcGVuZCIsIGRlc3QgPSAicG9zdGZpbGUiLCBkZWZhdWx0ID0gW10pCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGhlbHAgPSAiT3V0cHV0IG1vcmUgbG9nIG1lc3NhZ2UgZGF0YSB0byB0aGUgdGVybWluYWwuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAidmVyYm9zZSIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLUQiLCAiLS1kZWJ1ZyIsIGhlbHAgPSAiSW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsLiBZb3UgY2FuIHNwZWNpZnkgdGhpcyBtb3JlIHRoYW4gb25jZS4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJjb3VudCIsIGRlc3Q9ImRlYnVnIiwgZGVmYXVsdCA9IDApCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1uIiwgIi0tZHJ5LXJ1biIsIGhlbHAgPSAiRG9uJ3QgZXhlY3V0ZSwganVzdCBnbyB0aHJvdWdoIHRoZSBtb3Rpb25zLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gImRyeV9ydW4iLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1TIiwgIi0tZHVtcC1zaWduYXR1cmVzIiwgaGVscCA9ICJEdW1wIG91dCB0aGUgc2lnbmF0dXJlIGNvbnN0cnVjdGlvbiBpbmZvcm1hdGlvbiwgd2l0aCBubyB0YXNrIGV4ZWN1dGlvbi4gVGhlIFNJR05BVFVSRV9IQU5ETEVSIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIuIFR3byBjb21tb24gdmFsdWVzIGFyZSBub25lIGFuZCBwcmludGRpZmYgYnV0IHRoZSBoYW5kbGVyIG1heSBkZWZpbmUgbW9yZS9sZXNzLiBub25lIG1lYW5zIG9ubHkgZHVtcCB0aGUgc2lnbmF0dXJlLCBwcmludGRpZmYgbWVhbnMgY29tcGFyZSB0aGUgZHVtcGVkIHNpZ25hdHVyZSB3aXRoIHRoZSBjYWNoZWQgb25lLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gImFwcGVuZCIsIGRlc3QgPSAiZHVtcF9zaWduYXR1cmVzIiwgZGVmYXVsdCA9IFtdLCBtZXRhdmFyPSJTSUdOQVRVUkVfSEFORExFUiIpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcGFyc2Utb25seSIsIGhlbHAgPSAiUXVpdCBhZnRlciBwYXJzaW5nIHRoZSBCQiByZWNpcGVzLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlX3RydWUiLCBkZXN0ID0gInBhcnNlX29ubHkiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgIi0tc2hvdy12ZXJzaW9ucyIsIGhlbHAgPSAiU2hvdyBjdXJyZW50IGFuZCBwcmVmZXJyZWQgdmVyc2lvbnMgb2YgYWxsIHJlY2lwZXMuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAic2hvd192ZXJzaW9ucyIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWUiLCAiLS1lbnZpcm9ubWVudCIsIGhlbHAgPSAiU2hvdyB0aGUgZ2xvYmFsIG9yIHBlci1yZWNpcGUgZW52aXJvbm1lbnQgY29tcGxldGUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB2YXJpYWJsZXMgd2VyZSBzZXQvY2hhbmdlZC4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJzaG93X2Vudmlyb25tZW50IiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZyIsICItLWdyYXBodml6IiwgaGVscCA9ICJTYXZlIGRlcGVuZGVuY3kgdHJlZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXRzIGluIHRoZSBkb3Qgc3ludGF4LiIsCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJkb3RfZ3JhcGgiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1JIiwgIi0taWdub3JlLWRlcHMiLCBoZWxwID0gIiIiQXNzdW1lIHRoZXNlIGRlcGVuZGVuY2llcyBkb24ndCBleGlzdCBhbmQgYXJlIGFscmVhZHkgcHJvdmlkZWQgKGVxdWl2YWxlbnQgdG8gQVNTVU1FX1BST1ZJREVEKS4gVXNlZnVsIHRvIG1ha2UgZGVwZW5kZW5jeSBncmFwaHMgbW9yZSBhcHBlYWxpbmciIiIsCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJhcHBlbmQiLCBkZXN0ID0gImV4dHJhX2Fzc3VtZV9wcm92aWRlZCIsIGRlZmF1bHQgPSBbXSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWwiLCAiLS1sb2ctZG9tYWlucyIsIGhlbHAgPSAiIiJTaG93IGRlYnVnIGxvZ2dpbmcgZm9yIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyBkb21haW5zIiIiLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAiYXBwZW5kIiwgZGVzdCA9ICJkZWJ1Z19kb21haW5zIiwgZGVmYXVsdCA9IFtdKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItUCIsICItLXByb2ZpbGUiLCBoZWxwID0gIlByb2ZpbGUgdGhlIGNvbW1hbmQgYW5kIHNhdmUgcmVwb3J0cy4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJwcm9maWxlIiwgZGVmYXVsdCA9IEZhbHNlKQorCisgICAgICAgIGVudl91aSA9IG9zLmVudmlyb24uZ2V0KCdCSVRCQUtFX1VJJywgTm9uZSkKKyAgICAgICAgZGVmYXVsdF91aSA9IGVudl91aSBvciAna25vdHR5JworICAgICAgICAjIEBDSE9JQ0VTQCBpcyBzdWJzdGl0dXRlZCBvdXQgYnkgQml0YmFrZUhlbHBGb3JtYXR0ZXIgYWJvdmUKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi11IiwgIi0tdWkiLCBoZWxwID0gIlRoZSB1c2VyIGludGVyZmFjZSB0byB1c2UgKEBDSE9JQ0VTQCAtIGRlZmF1bHQgJWRlZmF1bHQpLiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsIGRlc3Q9InVpIiwgZGVmYXVsdD1kZWZhdWx0X3VpKQorCisgICAgICAgICMgQENIT0lDRVNAIGlzIHN1YnN0aXR1dGVkIG91dCBieSBCaXRiYWtlSGVscEZvcm1hdHRlciBhYm92ZQorICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXQiLCAiLS1zZXJ2ZXJ0eXBlIiwgaGVscCA9ICJDaG9vc2Ugd2hpY2ggc2VydmVyIHR5cGUgdG8gdXNlIChAQ0hPSUNFU0AgLSBkZWZhdWx0ICVkZWZhdWx0KS4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAic2VydmVydHlwZSIsIGRlZmF1bHQgPSAicHJvY2VzcyIpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXRva2VuIiwgaGVscCA9ICJTcGVjaWZ5IHRoZSBjb25uZWN0aW9uIHRva2VuIHRvIGJlIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgcmVtb3RlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAieG1scnBjdG9rZW4iKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1yZXZpc2lvbnMtY2hhbmdlZCIsIGhlbHAgPSAiU2V0IHRoZSBleGl0IGNvZGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdXBzdHJlYW0gZmxvYXRpbmcgcmV2aXNpb25zIGhhdmUgY2hhbmdlZCBvciBub3QuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAicmV2aXNpb25zX2NoYW5nZWQiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXNlcnZlci1vbmx5IiwgaGVscCA9ICJSdW4gYml0YmFrZSB3aXRob3V0IGEgVUksIG9ubHkgc3RhcnRpbmcgYSBzZXJ2ZXIgKGNvb2tlcikgcHJvY2Vzcy4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJzZXJ2ZXJfb25seSIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLUIiLCAiLS1iaW5kIiwgaGVscCA9ICJUaGUgbmFtZS9hZGRyZXNzIGZvciB0aGUgYml0YmFrZSBzZXJ2ZXIgdG8gYmluZCB0by4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAiYmluZCIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tbm8tc2V0c2NlbmUiLCBoZWxwID0gIkRvIG5vdCBydW4gYW55IHNldHNjZW5lIHRhc2tzLiBzc3RhdGUgd2lsbCBiZSBpZ25vcmVkIGFuZCBldmVyeXRoaW5nIG5lZWRlZCwgYnVpbHQuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAibm9zZXRzY2VuZSIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tcmVtb3RlLXNlcnZlciIsIGhlbHAgPSAiQ29ubmVjdCB0byB0aGUgc3BlY2lmaWVkIHNlcnZlci4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAicmVtb3RlX3NlcnZlciIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLW0iLCAiLS1raWxsLXNlcnZlciIsIGhlbHAgPSAiVGVybWluYXRlIHRoZSByZW1vdGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJraWxsX3NlcnZlciIsIGRlZmF1bHQgPSBGYWxzZSkKKworICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tb2JzZXJ2ZS1vbmx5IiwgaGVscCA9ICJDb25uZWN0IHRvIGEgc2VydmVyIGFzIGFuIG9ic2VydmluZy1vbmx5IGNsaWVudC4iLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZV90cnVlIiwgZGVzdCA9ICJvYnNlcnZlX29ubHkiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXN0YXR1cy1vbmx5IiwgaGVscCA9ICJDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSByZW1vdGUgYml0YmFrZSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSAic3RvcmVfdHJ1ZSIsIGRlc3QgPSAic3RhdHVzX29ubHkiLCBkZWZhdWx0ID0gRmFsc2UpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi13IiwgIi0td3JpdGUtbG9nIiwgaGVscCA9ICJXcml0ZXMgdGhlIGV2ZW50IGxvZyBvZiB0aGUgYnVpbGQgdG8gYSBiaXRiYWtlIGV2ZW50IGpzb24gZmlsZS4gVXNlICcnIChlbXB0eSBzdHJpbmcpIHRvIGFzc2lnbiB0aGUgbmFtZSBhdXRvbWF0aWNhbGx5LiIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJ3cml0ZWV2ZW50bG9nIikKKworICAgICAgICBvcHRpb25zLCB0YXJnZXRzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgICAgICAjIHNvbWUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMgc2V0IGFsc28gY29uZmlndXJhdGlvbiBvcHRpb25zCisgICAgICAgIGlmICJCQlNFUlZFUiIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIG9wdGlvbnMuc2VydmVydHlwZSA9ICJ4bWxycGMiCisgICAgICAgICAgICBvcHRpb25zLnJlbW90ZV9zZXJ2ZXIgPSBvcy5lbnZpcm9uWyJCQlNFUlZFUiJdCisKKyAgICAgICAgaWYgIkJCVE9LRU4iIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBvcHRpb25zLnhtbHJwY3Rva2VuID0gb3MuZW52aXJvblsiQkJUT0tFTiJdCisKKyAgICAgICAgaWYgIkJCRVZFTlRMT0ciIGlzIG9zLmVudmlyb246CisgICAgICAgICAgICBvcHRpb25zLndyaXRlZXZlbnRsb2cgPSBvcy5lbnZpcm9uWyJCQkVWRU5UTE9HIl0KKworICAgICAgICAjIGZpbGwgaW4gcHJvcGVyIGxvZyBuYW1lIGlmIG5vdCBzdXBwbGllZAorICAgICAgICBpZiBvcHRpb25zLndyaXRlZXZlbnRsb2cgaXMgbm90IE5vbmUgYW5kIGxlbihvcHRpb25zLndyaXRlZXZlbnRsb2cpID09IDA6CisgICAgICAgICAgICBpbXBvcnQgZGF0ZXRpbWUKKyAgICAgICAgICAgIG9wdGlvbnMud3JpdGVldmVudGxvZyA9ICJiaXRiYWtlX2V2ZW50bG9nXyVzLmpzb24iICUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoIiVZJW0lZCVIJU0lUyIpCisKKyAgICAgICAgIyBpZiBCQlNFUlZFUiBzYXlzIHRvIGF1dG9kZXRlY3QsIGxldCdzIGRvIHRoYXQKKyAgICAgICAgaWYgb3B0aW9ucy5yZW1vdGVfc2VydmVyOgorICAgICAgICAgICAgW2hvc3QsIHBvcnRdID0gb3B0aW9ucy5yZW1vdGVfc2VydmVyLnNwbGl0KCI6IiwgMikKKyAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgICAgICMgdXNlIGF1dG9tYXRpYyBwb3J0IGlmIHBvcnQgc2V0IHRvIC0xLCBtZWFucyByZWFkIGl0IGZyb20KKyAgICAgICAgICAgICMgdGhlIGJpdGJha2UubG9jayBmaWxlOyB0aGlzIGlzIGEgYml0IHRyaWNreSwgYnV0IHdlIGFsd2F5cyBleHBlY3QKKyAgICAgICAgICAgICMgdG8gYmUgaW4gdGhlIGJhc2Ugb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpZiB3ZSBuZWVkIHRvIGhhdmUgYQorICAgICAgICAgICAgIyBjaGFuY2UgdG8gc3RhcnQgdGhlIHNlcnZlciBsYXRlciwgYW55d2F5CisgICAgICAgICAgICBpZiBwb3J0ID09IC0xOgorICAgICAgICAgICAgICAgIGxvY2tfbG9jYXRpb24gPSAiLi9iaXRiYWtlLmxvY2siCisgICAgICAgICAgICAgICAgIyB3ZSB0cnkgdG8gcmVhZCB0aGUgYWRkcmVzcyBhdCBhbGwgdGltZXM7IGlmIHRoZSBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgIyB3ZSdsbCB0cnkgdG8gc3RhcnQgaXQgYWZ0ZXIgdGhlIGZpcnN0IGNvbm5lY3QgZmFpbHMsIGJlbG93CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBsZiA9IG9wZW4obG9ja19sb2NhdGlvbiwgJ3InKQorICAgICAgICAgICAgICAgICAgICByZW1vdGVkZWYgPSBsZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIFtob3N0LCBwb3J0XSA9IHJlbW90ZWRlZi5zcGxpdCgiOiIpCisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgICAgICAgICAgICAgbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJlbW90ZV9zZXJ2ZXIgPSByZW1vdGVkZWYKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYWQgYml0YmFrZS5sb2NrICglcyksIGludmFsaWQgcG9ydCIgJSBzdHIoZSkpCisKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMsIHRhcmdldHNbMTpdCisKKworZGVmIHN0YXJ0X3NlcnZlcihzZXJ2ZXJtb2R1bGUsIGNvbmZpZ1BhcmFtcywgY29uZmlndXJhdGlvbiwgZmVhdHVyZXMpOgorICAgIHNlcnZlciA9IHNlcnZlcm1vZHVsZS5CaXRCYWtlU2VydmVyKCkKKyAgICBpZiBjb25maWdQYXJhbXMuYmluZDoKKyAgICAgICAgKGhvc3QsIHBvcnQpID0gY29uZmlnUGFyYW1zLmJpbmQuc3BsaXQoJzonKQorICAgICAgICBzZXJ2ZXIuaW5pdFNlcnZlcigoaG9zdCwgaW50KHBvcnQpKSkKKyAgICAgICAgY29uZmlndXJhdGlvbi5pbnRlcmZhY2UgPSBbIHNlcnZlci5zZXJ2ZXJJbXBsLmhvc3QsIHNlcnZlci5zZXJ2ZXJJbXBsLnBvcnQgXQorICAgIGVsc2U6CisgICAgICAgIHNlcnZlci5pbml0U2VydmVyKCkKKyAgICAgICAgY29uZmlndXJhdGlvbi5pbnRlcmZhY2UgPSBbXQorCisgICAgdHJ5OgorICAgICAgICBjb25maWd1cmF0aW9uLnNldFNlcnZlclJlZ0lkbGVDYWxsYmFjayhzZXJ2ZXIuZ2V0U2VydmVySWRsZUNCKCkpCisKKyAgICAgICAgY29va2VyID0gYmIuY29va2VyLkJCQ29va2VyKGNvbmZpZ3VyYXRpb24sIGZlYXR1cmVzKQorCisgICAgICAgIHNlcnZlci5hZGRjb29rZXIoY29va2VyKQorICAgICAgICBzZXJ2ZXIuc2F2ZUNvbm5lY3Rpb25EZXRhaWxzKCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgd2hpbGUgaGFzYXR0cihzZXJ2ZXIsICJldmVudF9xdWV1ZSIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBxdWV1ZQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGltcG9ydCBRdWV1ZSBhcyBxdWV1ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV2ZW50ID0gc2VydmVyLmV2ZW50X3F1ZXVlLmdldChibG9jaz1GYWxzZSkKKyAgICAgICAgICAgIGV4Y2VwdCAocXVldWUuRW1wdHksIElPRXJyb3IpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBsb2dnaW5nLkxvZ1JlY29yZCk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZShldmVudCkKKyAgICAgICAgcmFpc2UgZXhjX2luZm9bMV0sIE5vbmUsIGV4Y19pbmZvWzJdCisgICAgc2VydmVyLmRldGFjaCgpCisgICAgY29va2VyLmxvY2suY2xvc2UoKQorICAgIHJldHVybiBzZXJ2ZXIKKworCitkZWYgYml0YmFrZV9tYWluKGNvbmZpZ1BhcmFtcywgY29uZmlndXJhdGlvbik6CisKKyAgICAjIFB5dGhvbiBtdWx0aXByb2Nlc3NpbmcgcmVxdWlyZXMgL2Rldi9zaG0gb24gTGludXgKKyAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbGludXgnKSBhbmQgbm90IG9zLmFjY2VzcygnL2Rldi9zaG0nLCBvcy5XX09LIHwgb3MuWF9PSyk6CisgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRkFUQUw6IC9kZXYvc2htIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCB3cml0YWJsZSIpCisKKyAgICAjIFVuYnVmZmVyIHN0ZG91dCB0byBhdm9pZCBsb2cgdHJ1bmNhdGlvbiBpbiB0aGUgZXZlbnQKKyAgICAjIG9mIGFuIHVub3JkZXJseSBleGl0IGFzIHdlbGwgYXMgdG8gcHJvdmlkZSB0aW1lbHkKKyAgICAjIHVwZGF0ZXMgdG8gbG9nIGZpbGVzIGZvciB1c2Ugd2l0aCB0YWlsCisgICAgdHJ5OgorICAgICAgICBpZiBzeXMuc3Rkb3V0Lm5hbWUgPT0gJzxzdGRvdXQ+JzoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvcy5mZG9wZW4oc3lzLnN0ZG91dC5maWxlbm8oKSwgJ3cnLCAwKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworCisKKyAgICBjb25maWd1cmF0aW9uLnNldENvbmZpZ1BhcmFtZXRlcnMoY29uZmlnUGFyYW1zKQorCisgICAgdWlfbW9kdWxlID0gaW1wb3J0X2V4dGVuc2lvbl9tb2R1bGUoYmIudWksIGNvbmZpZ1BhcmFtcy51aSwgJ21haW4nKQorICAgIHNlcnZlcm1vZHVsZSA9IGltcG9ydF9leHRlbnNpb25fbW9kdWxlKGJiLnNlcnZlciwgY29uZmlnUGFyYW1zLnNlcnZlcnR5cGUsICdCaXRCYWtlU2VydmVyJykKKworICAgIGlmIGNvbmZpZ1BhcmFtcy5zZXJ2ZXJfb25seToKKyAgICAgICAgaWYgY29uZmlnUGFyYW1zLnNlcnZlcnR5cGUgIT0gInhtbHJwYyI6CisgICAgICAgICAgICByYWlzZSBCQk1haW5FeGNlcHRpb24oIkZBVEFMOiBJZiAnLS1zZXJ2ZXItb25seScgaXMgZGVmaW5lZCwgd2UgbXVzdCBzZXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVydHlwZSBhcyAneG1scnBjJy5cbiIpCisgICAgICAgIGlmIG5vdCBjb25maWdQYXJhbXMuYmluZDoKKyAgICAgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRkFUQUw6IFRoZSAnLS1zZXJ2ZXItb25seScgb3B0aW9uIHJlcXVpcmVzIGEgbmFtZS9hZGRyZXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYmluZCB0byB3aXRoIHRoZSAtQiBvcHRpb24uXG4iKQorICAgICAgICBpZiBjb25maWdQYXJhbXMucmVtb3RlX3NlcnZlcjoKKyAgICAgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRkFUQUw6IFRoZSAnLS1zZXJ2ZXItb25seScgb3B0aW9uIGNvbmZsaWN0cyB3aXRoICVzLlxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ0aGUgQkJTRVJWRVIgZW52aXJvbm1lbnQgdmFyaWFibGUiIGlmICJCQlNFUlZFUiIgaW4gb3MuZW52aXJvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgInRoZSAnLS1yZW1vdGUtc2VydmVyJyBvcHRpb24iICkpCisKKyAgICBpZiBjb25maWdQYXJhbXMuYmluZCBhbmQgY29uZmlnUGFyYW1zLnNlcnZlcnR5cGUgIT0gInhtbHJwYyI6CisgICAgICAgIHJhaXNlIEJCTWFpbkV4Y2VwdGlvbigiRkFUQUw6IElmICctQicgb3IgJy0tYmluZCcgaXMgZGVmaW5lZCwgd2UgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRoZSBzZXJ2ZXJ0eXBlIGFzICd4bWxycGMnLlxuIikKKworICAgIGlmIGNvbmZpZ1BhcmFtcy5yZW1vdGVfc2VydmVyIGFuZCBjb25maWdQYXJhbXMuc2VydmVydHlwZSAhPSAieG1scnBjIjoKKyAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGQVRBTDogSWYgJy0tcmVtb3RlLXNlcnZlcicgaXMgZGVmaW5lZCwgd2UgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IHRoZSBzZXJ2ZXJ0eXBlIGFzICd4bWxycGMnLlxuIikKKworICAgIGlmIGNvbmZpZ1BhcmFtcy5vYnNlcnZlX29ubHkgYW5kIChub3QgY29uZmlnUGFyYW1zLnJlbW90ZV9zZXJ2ZXIgb3IgY29uZmlnUGFyYW1zLmJpbmQpOgorICAgICAgICByYWlzZSBCQk1haW5FeGNlcHRpb24oIkZBVEFMOiAnLS1vYnNlcnZlLW9ubHknIGNhbiBvbmx5IGJlIHVzZWQgYnkgVUkgY2xpZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGluZyB0byBhIHNlcnZlci5cbiIpCisKKyAgICBpZiBjb25maWdQYXJhbXMua2lsbF9zZXJ2ZXIgYW5kIG5vdCBjb25maWdQYXJhbXMucmVtb3RlX3NlcnZlcjoKKyAgICAgICAgcmFpc2UgQkJNYWluRXhjZXB0aW9uKCJGQVRBTDogJy0ta2lsbC1zZXJ2ZXInIGNhbiBvbmx5IGJlIHVzZWQgdG8gdGVybWluYXRlIGEgcmVtb3RlIHNlcnZlciIpCisKKyAgICBpZiAiQkJERUJVRyIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgbGV2ZWwgPSBpbnQob3MuZW52aXJvblsiQkJERUJVRyJdKQorICAgICAgICBpZiBsZXZlbCA+IGNvbmZpZ3VyYXRpb24uZGVidWc6CisgICAgICAgICAgICBjb25maWd1cmF0aW9uLmRlYnVnID0gbGV2ZWwKKworICAgIGJiLm1zZy5pbml0X21zZ2NvbmZpZyhjb25maWdQYXJhbXMudmVyYm9zZSwgY29uZmlndXJhdGlvbi5kZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmRlYnVnX2RvbWFpbnMpCisKKyAgICAjIEVuc3VyZSBsb2dnaW5nIG1lc3NhZ2VzIGdldCBzZW50IHRvIHRoZSBVSSBhcyBldmVudHMKKyAgICBoYW5kbGVyID0gYmIuZXZlbnQuTG9nSGFuZGxlcigpCisgICAgaWYgbm90IGNvbmZpZ1BhcmFtcy5zdGF0dXNfb25seToKKyAgICAgICAgIyBJbiBzdGF0dXMgb25seSBtb2RlIHRoZXJlIGFyZSBubyBsb2dzIGFuZCBubyBVSQorICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQorCisgICAgIyBDbGVhciBhd2F5IGFueSBzcHVyaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hpbGUgd2Ugc3Rva2UgdXAgdGhlIGNvb2tlcgorICAgIGNsZWFuZWR2YXJzID0gYmIudXRpbHMuY2xlYW5fZW52aXJvbm1lbnQoKQorCisgICAgZmVhdHVyZXNldCA9IFtdCisgICAgaWYgbm90IGNvbmZpZ1BhcmFtcy5zZXJ2ZXJfb25seToKKyAgICAgICAgIyBDb2xsZWN0IHRoZSBmZWF0dXJlIHNldCBmb3IgdGhlIFVJCisgICAgICAgIGZlYXR1cmVzZXQgPSBnZXRhdHRyKHVpX21vZHVsZSwgImZlYXR1cmVTZXQiLCBbXSkKKworICAgIGlmIG5vdCBjb25maWdQYXJhbXMucmVtb3RlX3NlcnZlcjoKKyAgICAgICAgIyB3ZSBzdGFydCBhIHNlcnZlciB3aXRoIGEgZ2l2ZW4gY29uZmlndXJhdGlvbgorICAgICAgICBzZXJ2ZXIgPSBzdGFydF9zZXJ2ZXIoc2VydmVybW9kdWxlLCBjb25maWdQYXJhbXMsIGNvbmZpZ3VyYXRpb24sIGZlYXR1cmVzZXQpCisgICAgICAgIGJiLmV2ZW50LnVpX3F1ZXVlID0gW10KKyAgICBlbHNlOgorICAgICAgICAjIHdlIHN0YXJ0IGEgc3R1YiBzZXJ2ZXIgdGhhdCBpcyBhY3R1YWxseSBhIFhNTFJQQ2xpZW50IHRoYXQgY29ubmVjdHMgdG8gYSByZWFsIHNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSBzZXJ2ZXJtb2R1bGUuQml0QmFrZVhNTFJQQ0NsaWVudChjb25maWdQYXJhbXMub2JzZXJ2ZV9vbmx5LCBjb25maWdQYXJhbXMueG1scnBjdG9rZW4pCisgICAgICAgIHNlcnZlci5zYXZlQ29ubmVjdGlvbkRldGFpbHMoY29uZmlnUGFyYW1zLnJlbW90ZV9zZXJ2ZXIpCisKKworICAgIGlmIG5vdCBjb25maWdQYXJhbXMuc2VydmVyX29ubHk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlcl9jb25uZWN0aW9uID0gc2VydmVyLmVzdGFibGlzaENvbm5lY3Rpb24oZmVhdHVyZXNldCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgYmIuZmF0YWwoIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciAlczogJXMiICUgKGNvbmZpZ1BhcmFtcy5yZW1vdGVfc2VydmVyLCBzdHIoZSkpKQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgZW52aXJvbm1lbnQgaW4gY2FzZSB0aGUgVUkgbmVlZHMgaXQKKyAgICAgICAgZm9yIGsgaW4gY2xlYW5lZHZhcnM6CisgICAgICAgICAgICBvcy5lbnZpcm9uW2tdID0gY2xlYW5lZHZhcnNba10KKworICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKQorCisKKyAgICAgICAgaWYgY29uZmlnUGFyYW1zLnN0YXR1c19vbmx5OgorICAgICAgICAgICAgc2VydmVyX2Nvbm5lY3Rpb24udGVybWluYXRlKCkKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgaWYgY29uZmlnUGFyYW1zLmtpbGxfc2VydmVyOgorICAgICAgICAgICAgc2VydmVyX2Nvbm5lY3Rpb24uY29ubmVjdGlvbi50ZXJtaW5hdGVTZXJ2ZXIoKQorICAgICAgICAgICAgYmIuZXZlbnQudWlfcXVldWUgPSBbXQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdWlfbW9kdWxlLm1haW4oc2VydmVyX2Nvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2VydmVyX2Nvbm5lY3Rpb24uZXZlbnRzLCBjb25maWdQYXJhbXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBiYi5ldmVudC51aV9xdWV1ZSA9IFtdCisgICAgICAgICAgICBzZXJ2ZXJfY29ubmVjdGlvbi50ZXJtaW5hdGUoKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCJCaXRiYWtlIHNlcnZlciBhZGRyZXNzOiAlcywgc2VydmVyIHBvcnQ6ICVzIiAlIChzZXJ2ZXIuc2VydmVySW1wbC5ob3N0LCBzZXJ2ZXIuc2VydmVySW1wbC5wb3J0KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgIHJldHVybiAxCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9tZXRob2Rwb29sLnB5IGIvYml0YmFrZS9saWIvYmIvbWV0aG9kcG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJlOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvbWV0aG9kcG9vbC5weQpAQCAtMCwwICsxLDI5IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIworIyBDb3B5cmlnaHQgKEMpICAgICAgIDIwMDYgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gYmIudXRpbHMgaW1wb3J0IGJldHRlcl9jb21waWxlLCBiZXR0ZXJfZXhlYworCitkZWYgaW5zZXJ0X21ldGhvZChtb2R1bGVuYW1lLCBjb2RlLCBmbik6CisgICAgIiIiCisgICAgQWRkIGNvZGUgb2YgYSBtb2R1bGUgc2hvdWxkIGJlIGFkZGVkLiBUaGUgbWV0aG9kcworICAgIHdpbGwgYmUgc2ltcGx5IGFkZGVkLCBubyBjaGVja2luZyB3aWxsIGJlIGRvbmUKKyAgICAiIiIKKyAgICBjb21wID0gYmV0dGVyX2NvbXBpbGUoY29kZSwgbW9kdWxlbmFtZSwgZm4gKQorICAgIGJldHRlcl9leGVjKGNvbXAsIE5vbmUsIGNvZGUsIGZuKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9tb25pdG9yZGlzay5weSBiL2JpdGJha2UvbGliL2JiL21vbml0b3JkaXNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjUyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9tb25pdG9yZGlzay5weQpAQCAtMCwwICsxLDI2MyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iZXJ0IFlhbmcKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBvcywgbG9nZ2luZywgcmUsIHN5cworaW1wb3J0IGJiCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5Nb25pdG9yIikKKworZGVmIHByaW50RXJyKGluZm8pOgorICAgIGxvZ2dlci5lcnJvcigiJXNcbiAgICAgICBEaXNrIHNwYWNlIG1vbml0b3Igd2lsbCBOT1QgYmUgZW5hYmxlZCIgJSBpbmZvKQorCitkZWYgY29udmVydEdNSyh1bml0KToKKworICAgICIiIiBDb252ZXJ0IHRoZSBzcGFjZSB1bml0IEcsIE0sIEssIHRoZSB1bml0IGlzIGNhc2UtaW5zZW5zaXRpdmUgIiIiCisKKyAgICB1bml0RyA9IHJlLm1hdGNoKCcoWzEtOV1bMC05XSopW2dHXVxzPyQnLCB1bml0KQorICAgIGlmIHVuaXRHOgorICAgICAgICByZXR1cm4gaW50KHVuaXRHLmdyb3VwKDEpKSAqICgxMDI0ICoqIDMpCisgICAgdW5pdE0gPSByZS5tYXRjaCgnKFsxLTldWzAtOV0qKVttTV1ccz8kJywgdW5pdCkKKyAgICBpZiB1bml0TToKKyAgICAgICAgcmV0dXJuIGludCh1bml0TS5ncm91cCgxKSkgKiAoMTAyNCAqKiAyKQorICAgIHVuaXRLID0gcmUubWF0Y2goJyhbMS05XVswLTldKilba0tdXHM/JCcsIHVuaXQpCisgICAgaWYgdW5pdEs6CisgICAgICAgIHJldHVybiBpbnQodW5pdEsuZ3JvdXAoMSkpICogMTAyNAorICAgIHVuaXROID0gcmUubWF0Y2goJyhbMS05XVswLTldKilccz8kJywgdW5pdCkKKyAgICBpZiB1bml0TjoKKyAgICAgICAgcmV0dXJuIGludCh1bml0Ti5ncm91cCgxKSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgZ2V0TW91bnRlZERldihwYXRoKToKKworICAgICIiIiBHZXQgdGhlIGRldmljZSBtb3VudGVkIGF0IHRoZSBwYXRoLCB1c2VzIC9wcm9jL21vdW50cyAiIiIKKworICAgICMgR2V0IHRoZSBtb3VudCBwb2ludCBvZiB0aGUgZmlsZXN5c3RlbSBjb250YWluaW5nIHBhdGgKKyAgICAjIHN0X2RldiBpcyB0aGUgSUQgb2YgZGV2aWNlIGNvbnRhaW5pbmcgZmlsZQorICAgIHBhcmVudERldiA9IG9zLnN0YXQocGF0aCkuc3RfZGV2CisgICAgY3VycmVudERldiA9IHBhcmVudERldgorICAgICMgV2hlbiB0aGUgY3VycmVudCBkaXJlY3RvcnkncyBkZXZpY2UgaXMgZGlmZmVyZW50IGZyb20gdGhlCisgICAgIyBwYXJlbnQncywgdGhlbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgYSBtb3VudCBwb2ludAorICAgIHdoaWxlIHBhcmVudERldiA9PSBjdXJyZW50RGV2OgorICAgICAgICBtb3VudFBvaW50ID0gcGF0aAorICAgICAgICAjIFVzZSBkaXJuYW1lIHRvIGdldCB0aGUgcGFyZW50J3MgZGlyZWN0b3J5CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKKyAgICAgICAgIyBSZWFjaCB0aGUgIi8iCisgICAgICAgIGlmIHBhdGggPT0gbW91bnRQb2ludDoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHBhcmVudERldj0gb3Muc3RhdChwYXRoKS5zdF9kZXYKKworICAgIHRyeToKKyAgICAgICAgd2l0aCBvcGVuKCIvcHJvYy9tb3VudHMiLCAiciIpIGFzIGlmcDoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGlmcDoKKyAgICAgICAgICAgICAgICBwcm9jTGluZXMgPSBsaW5lLnJzdHJpcCgnXG4nKS5zcGxpdCgpCisgICAgICAgICAgICAgICAgaWYgcHJvY0xpbmVzWzFdID09IG1vdW50UG9pbnQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jTGluZXNbMF0KKyAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiBOb25lCisKK2RlZiBnZXREaXNrRGF0YShCQkRpcnMsIGNvbmZpZ3VyYXRpb24pOgorCisgICAgIiIiUHJlcGFyZSBkaXNrIGRhdGEgZm9yIGRpc2sgc3BhY2UgbW9uaXRvciIiIgorCisgICAgIyBTYXZlIHRoZSBkZXZpY2UgSURzLCBuZWVkIHRoZSBJRCB0byBiZSB1bmlxdWUgKHRoZSBkaWN0aW9uYXJ5J3Mga2V5IGlzCisgICAgIyB1bmlxdWUpLCBzbyB0aGF0IHdoZW4gbW9yZSB0aGFuIG9uZSBkaXJlY3RvcnkgaXMgbG9jYXRlZCBvbiB0aGUgc2FtZQorICAgICMgZGV2aWNlLCB3ZSBqdXN0IG1vbml0b3IgaXQgb25jZQorICAgIGRldkRpY3QgPSB7fQorICAgIGZvciBwYXRoU3BhY2VJbm9kZSBpbiBCQkRpcnMuc3BsaXQoKToKKyAgICAgICAgIyBUaGUgaW5wdXQgZm9ybWF0IGlzOiAiZGlyLHNwYWNlLGlub2RlIiwgZGlyIGlzIGEgbXVzdCwgc3BhY2UKKyAgICAgICAgIyBhbmQgaW5vZGUgYXJlIG9wdGlvbmFsCisgICAgICAgIHBhdGhTcGFjZUlub2RlUmUgPSByZS5tYXRjaCgnKFteLF0qKSwoW14sXSopLChbXixdKiksPyguKiknLCBwYXRoU3BhY2VJbm9kZSkKKyAgICAgICAgaWYgbm90IHBhdGhTcGFjZUlub2RlUmU6CisgICAgICAgICAgICBwcmludEVycigiSW52YWxpZCB2YWx1ZSBpbiBCQl9ESVNLTU9OX0RJUlM6ICVzIiAlIHBhdGhTcGFjZUlub2RlKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBhY3Rpb24gPSBwYXRoU3BhY2VJbm9kZVJlLmdyb3VwKDEpCisgICAgICAgIGlmIGFjdGlvbiBub3QgaW4gKCJBQk9SVCIsICJTVE9QVEFTS1MiLCAiV0FSTiIpOgorICAgICAgICAgICAgcHJpbnRFcnIoIlVua25vd24gZGlzayBzcGFjZSBtb25pdG9yIGFjdGlvbjogJXMiICUgYWN0aW9uKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoU3BhY2VJbm9kZVJlLmdyb3VwKDIpKQorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIHBhdGggdmFsdWUgaW4gQkJfRElTS01PTl9ESVJTOiAlcyIgJSBwYXRoU3BhY2VJbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBUaGUgZGlzayBzcGFjZSBvciBpbm9kZSBpcyBvcHRpb25hbCwgYnV0IGl0IHNob3VsZCBoYXZlIGEgY29ycmVjdAorICAgICAgICAjIHZhbHVlIG9uY2UgaXQgaXMgc3BlY2lmaWVkCisgICAgICAgIG1pblNwYWNlID0gcGF0aFNwYWNlSW5vZGVSZS5ncm91cCgzKQorICAgICAgICBpZiBtaW5TcGFjZToKKyAgICAgICAgICAgIG1pblNwYWNlID0gY29udmVydEdNSyhtaW5TcGFjZSkKKyAgICAgICAgICAgIGlmIG5vdCBtaW5TcGFjZToKKyAgICAgICAgICAgICAgICBwcmludEVycigiSW52YWxpZCBkaXNrIHNwYWNlIHZhbHVlIGluIEJCX0RJU0tNT05fRElSUzogJXMiICUgcGF0aFNwYWNlSW5vZGVSZS5ncm91cCgzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb25lIG1lYW5zIHRoYXQgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAgICAgICAgbWluU3BhY2UgPSBOb25lCisKKyAgICAgICAgbWluSW5vZGUgPSBwYXRoU3BhY2VJbm9kZVJlLmdyb3VwKDQpCisgICAgICAgIGlmIG1pbklub2RlOgorICAgICAgICAgICAgbWluSW5vZGUgPSBjb252ZXJ0R01LKG1pbklub2RlKQorICAgICAgICAgICAgaWYgbm90IG1pbklub2RlOgorICAgICAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIGlub2RlIHZhbHVlIGluIEJCX0RJU0tNT05fRElSUzogJXMiICUgcGF0aFNwYWNlSW5vZGVSZS5ncm91cCg0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb25lIG1lYW5zIHRoYXQgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAgICAgICAgbWluSW5vZGUgPSBOb25lCisKKyAgICAgICAgaWYgbWluU3BhY2UgaXMgTm9uZSBhbmQgbWluSW5vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50RXJyKCJObyBkaXNrIHNwYWNlIG9yIGlub2RlIHZhbHVlIGluIGZvdW5kIEJCX0RJU0tNT05fRElSUzogJXMiICUgcGF0aFNwYWNlSW5vZGUpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIG1rZGlyIGZvciB0aGUgZGlyZWN0b3J5IHNpbmNlIGl0IG1heSBub3QgZXhpc3QsIGZvciBleGFtcGxlIHRoZQorICAgICAgICAjIERMX0RJUiBtYXkgbm90IGV4aXN0IGF0IHRoZSB2ZXJ5IGJlZ2lubmluZworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIocGF0aCkKKyAgICAgICAgZGV2ID0gZ2V0TW91bnRlZERldihwYXRoKQorICAgICAgICAjIFVzZSBwYXRoL2FjdGlvbiBhcyB0aGUga2V5CisgICAgICAgIGRldkRpY3Rbb3MucGF0aC5qb2luKHBhdGgsIGFjdGlvbildID0gW2RldiwgbWluU3BhY2UsIG1pbklub2RlXQorCisgICAgcmV0dXJuIGRldkRpY3QKKworZGVmIGdldEludGVydmFsKGNvbmZpZ3VyYXRpb24pOgorCisgICAgIiIiIEdldCB0aGUgZGlzayBzcGFjZSBpbnRlcnZhbCAiIiIKKworICAgICMgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNTBNIGFuZCA1Sy4KKyAgICBzcGFjZURlZmF1bHQgPSA1MCAqIDEwMjQgKiAxMDI0CisgICAgaW5vZGVEZWZhdWx0ID0gNSAqIDEwMjQKKworICAgIGludGVydmFsID0gY29uZmlndXJhdGlvbi5nZXRWYXIoIkJCX0RJU0tNT05fV0FSTklOVEVSVkFMIiwgVHJ1ZSkKKyAgICBpZiBub3QgaW50ZXJ2YWw6CisgICAgICAgIHJldHVybiBzcGFjZURlZmF1bHQsIGlub2RlRGVmYXVsdAorICAgIGVsc2U6CisgICAgICAgICMgVGhlIGRpc2sgc3BhY2Ugb3IgaW5vZGUgaW50ZXJ2YWwgaXMgb3B0aW9uYWwsIGJ1dCBpdCBzaG91bGQKKyAgICAgICAgIyBoYXZlIGEgY29ycmVjdCB2YWx1ZSBvbmNlIGl0IGlzIHNwZWNpZmllZAorICAgICAgICBpbnRlcnZhbFJlID0gcmUubWF0Y2goJyhbXixdKiksP1xzKiguKiknLCBpbnRlcnZhbCkKKyAgICAgICAgaWYgaW50ZXJ2YWxSZToKKyAgICAgICAgICAgIGludGVydmFsU3BhY2UgPSBpbnRlcnZhbFJlLmdyb3VwKDEpCisgICAgICAgICAgICBpZiBpbnRlcnZhbFNwYWNlOgorICAgICAgICAgICAgICAgIGludGVydmFsU3BhY2UgPSBjb252ZXJ0R01LKGludGVydmFsU3BhY2UpCisgICAgICAgICAgICAgICAgaWYgbm90IGludGVydmFsU3BhY2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIGRpc2sgc3BhY2UgaW50ZXJ2YWwgdmFsdWUgaW4gQkJfRElTS01PTl9XQVJOSU5URVJWQUw6ICVzIiAlIGludGVydmFsUmUuZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGludGVydmFsU3BhY2UgPSBzcGFjZURlZmF1bHQKKyAgICAgICAgICAgIGludGVydmFsSW5vZGUgPSBpbnRlcnZhbFJlLmdyb3VwKDIpCisgICAgICAgICAgICBpZiBpbnRlcnZhbElub2RlOgorICAgICAgICAgICAgICAgIGludGVydmFsSW5vZGUgPSBjb252ZXJ0R01LKGludGVydmFsSW5vZGUpCisgICAgICAgICAgICAgICAgaWYgbm90IGludGVydmFsSW5vZGU6CisgICAgICAgICAgICAgICAgICAgIHByaW50RXJyKCJJbnZhbGlkIGRpc2sgaW5vZGUgaW50ZXJ2YWwgdmFsdWUgaW4gQkJfRElTS01PTl9XQVJOSU5URVJWQUw6ICVzIiAlIGludGVydmFsUmUuZ3JvdXAoMikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGludGVydmFsSW5vZGUgPSBpbm9kZURlZmF1bHQKKyAgICAgICAgICAgIHJldHVybiBpbnRlcnZhbFNwYWNlLCBpbnRlcnZhbElub2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludEVycigiSW52YWxpZCBpbnRlcnZhbCB2YWx1ZSBpbiBCQl9ESVNLTU9OX1dBUk5JTlRFUlZBTDogJXMiICUgaW50ZXJ2YWwpCisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCitjbGFzcyBkaXNrTW9uaXRvcjoKKworICAgICIiIlByZXBhcmUgdGhlIGRpc2sgc3BhY2UgbW9uaXRvciBkYXRhIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlndXJhdGlvbik6CisKKyAgICAgICAgc2VsZi5lbmFibGVNb25pdG9yID0gRmFsc2UKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgorCisgICAgICAgIEJCRGlycyA9IGNvbmZpZ3VyYXRpb24uZ2V0VmFyKCJCQl9ESVNLTU9OX0RJUlMiLCBUcnVlKSBvciBOb25lCisgICAgICAgIGlmIEJCRGlyczoKKyAgICAgICAgICAgIHNlbGYuZGV2RGljdCA9IGdldERpc2tEYXRhKEJCRGlycywgY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIGlmIHNlbGYuZGV2RGljdDoKKyAgICAgICAgICAgICAgICBzZWxmLnNwYWNlSW50ZXJ2YWwsIHNlbGYuaW5vZGVJbnRlcnZhbCA9IGdldEludGVydmFsKGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zcGFjZUludGVydmFsIGFuZCBzZWxmLmlub2RlSW50ZXJ2YWw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5hYmxlTW9uaXRvciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgIyBUaGVzZSBhcmUgZm9yIHNhdmluZyB0aGUgcHJldmlvdXMgZGlzayBmcmVlIHNwYWNlIGFuZCBpbm9kZSwgd2UKKyAgICAgICAgICAgICAgICAgICAgIyB1c2UgdGhlbSB0byBhdm9pZCBwcmludGluZyB0b28gbWFueSB3YXJuaW5nIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlRnJlZVMgPSB7fQorICAgICAgICAgICAgICAgICAgICBzZWxmLnByZUZyZWVJID0ge30KKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGZvciBTVE9QVEFTS1MgYW5kIEFCT1JULCB0byBhdm9pZCBwcmludGluZyB0aGUgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAjIHJlcGVhdGVkbHkgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHRhc2tzIHRvIGZpbmlzaAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZWQgPSB7fQorICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBzZWxmLmRldkRpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZUZyZWVTW2tdID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVGcmVlSVtrXSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlZFtrXSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc3BhY2VJbnRlcnZhbCBpcyBOb25lIGFuZCBzZWxmLmlub2RlSW50ZXJ2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5hYmxlTW9uaXRvciA9IEZhbHNlCisKKyAgICBkZWYgY2hlY2soc2VsZiwgcnEpOgorCisgICAgICAgICIiIiBUYWtlIGFjdGlvbiBmb3IgdGhlIG1vbml0b3IgIiIiCisKKyAgICAgICAgaWYgc2VsZi5lbmFibGVNb25pdG9yOgorICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5kZXZEaWN0OgorICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUoaykKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBvcy5wYXRoLmJhc2VuYW1lKGspCisgICAgICAgICAgICAgICAgZGV2ID0gc2VsZi5kZXZEaWN0W2tdWzBdCisgICAgICAgICAgICAgICAgbWluU3BhY2UgPSBzZWxmLmRldkRpY3Rba11bMV0KKyAgICAgICAgICAgICAgICBtaW5Jbm9kZSA9IHNlbGYuZGV2RGljdFtrXVsyXQorCisgICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0dmZzKHBhdGgpCisKKyAgICAgICAgICAgICAgICAjIFRoZSBmcmVlIHNwYWNlLCBmbG9hdCBwb2ludCBudW1iZXIKKyAgICAgICAgICAgICAgICBmcmVlU3BhY2UgPSBzdC5mX2JhdmFpbCAqIHN0LmZfZnJzaXplCisKKyAgICAgICAgICAgICAgICBpZiBtaW5TcGFjZSBhbmQgZnJlZVNwYWNlIDwgbWluU3BhY2U6CisgICAgICAgICAgICAgICAgICAgICMgQWx3YXlzIHNob3cgd2FybmluZywgdGhlIHNlbGYuY2hlY2tlZCB3b3VsZCBhbHdheXMgYmUgRmFsc2UgaWYgdGhlIGFjdGlvbiBpcyBXQVJOCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucHJlRnJlZVNba10gPT0gMCBvciBzZWxmLnByZUZyZWVTW2tdIC0gZnJlZVNwYWNlID4gc2VsZi5zcGFjZUludGVydmFsIGFuZCBub3Qgc2VsZi5jaGVja2VkW2tdOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlRoZSBmcmVlIHNwYWNlIG9mICVzICglcykgaXMgcnVubmluZyBsb3cgKCUuM2ZHQiBsZWZ0KSIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRoLCBkZXYsIGZyZWVTcGFjZSAvIDEwMjQgLyAxMDI0IC8gMTAyNC4wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlRnJlZVNba10gPSBmcmVlU3BhY2UKKworICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb24gPT0gIlNUT1BUQVNLUyIgYW5kIG5vdCBzZWxmLmNoZWNrZWRba106CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIk5vIG5ldyB0YXNrcyBjYW4gYmUgZXhlY3V0ZWQgc2luY2UgdGhlIGRpc2sgc3BhY2UgbW9uaXRvciBhY3Rpb24gaXMgXCJTVE9QVEFTS1NcIiEiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VkW2tdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5EaXNrRnVsbChkZXYsICdkaXNrJywgZnJlZVNwYWNlLCBwYXRoKSwgc2VsZi5jb25maWd1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGFjdGlvbiA9PSAiQUJPUlQiIGFuZCBub3Qgc2VsZi5jaGVja2VkW2tdOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJJbW1lZGlhdGVseSBhYm9ydCBzaW5jZSB0aGUgZGlzayBzcGFjZSBtb25pdG9yIGFjdGlvbiBpcyBcIkFCT1JUXCIhIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlZFtrXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJxLmZpbmlzaF9ydW5xdWV1ZShUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5EaXNrRnVsbChkZXYsICdkaXNrJywgZnJlZVNwYWNlLCBwYXRoKSwgc2VsZi5jb25maWd1cmF0aW9uKQorCisgICAgICAgICAgICAgICAgIyBUaGUgZnJlZSBpbm9kZXMsIGZsb2F0IHBvaW50IG51bWJlcgorICAgICAgICAgICAgICAgIGZyZWVJbm9kZSA9IHN0LmZfZmF2YWlsCisKKyAgICAgICAgICAgICAgICBpZiBtaW5Jbm9kZSBhbmQgZnJlZUlub2RlIDwgbWluSW5vZGU6CisgICAgICAgICAgICAgICAgICAgICMgU29tZSBmaWxlc3lzdGVtcyB1c2UgZHluYW1pYyBpbm9kZXMgc28gY2FuJ3QgcnVuIG91dAorICAgICAgICAgICAgICAgICAgICAjIChlLmcuIGJ0cmZzKS4gVGhpcyBpcyByZXBvcnRlZCBieSB0aGUgaW5vZGUgY291bnQgYmVpbmcgMC4KKyAgICAgICAgICAgICAgICAgICAgaWYgc3QuZl9maWxlcyA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXZEaWN0W2tdWzJdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgIyBBbHdheXMgc2hvdyB3YXJuaW5nLCB0aGUgc2VsZi5jaGVja2VkIHdvdWxkIGFsd2F5cyBiZSBGYWxzZSBpZiB0aGUgYWN0aW9uIGlzIFdBUk4KKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wcmVGcmVlSVtrXSA9PSAwIG9yIHNlbGYucHJlRnJlZUlba10gLSBmcmVlSW5vZGUgPiBzZWxmLmlub2RlSW50ZXJ2YWwgYW5kIG5vdCBzZWxmLmNoZWNrZWRba106CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVGhlIGZyZWUgaW5vZGUgb2YgJXMgKCVzKSBpcyBydW5uaW5nIGxvdyAoJS4zZksgbGVmdCkiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0aCwgZGV2LCBmcmVlSW5vZGUgLyAxMDI0LjApKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVGcmVlSVtrXSA9IGZyZWVJbm9kZQorCisgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvbiAgPT0gIlNUT1BUQVNLUyIgYW5kIG5vdCBzZWxmLmNoZWNrZWRba106CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIk5vIG5ldyB0YXNrcyBjYW4gYmUgZXhlY3V0ZWQgc2luY2UgdGhlIGRpc2sgc3BhY2UgbW9uaXRvciBhY3Rpb24gaXMgXCJTVE9QVEFTS1NcIiEiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VkW2tdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5EaXNrRnVsbChkZXYsICdpbm9kZScsIGZyZWVJbm9kZSwgcGF0aCksIHNlbGYuY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBhY3Rpb24gID09ICJBQk9SVCIgYW5kIG5vdCBzZWxmLmNoZWNrZWRba106CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkltbWVkaWF0ZWx5IGFib3J0IHNpbmNlIHRoZSBkaXNrIHNwYWNlIG1vbml0b3IgYWN0aW9uIGlzIFwiQUJPUlRcIiEiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VkW2tdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcnEuZmluaXNoX3J1bnF1ZXVlKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkRpc2tGdWxsKGRldiwgJ2lub2RlJywgZnJlZUlub2RlLCBwYXRoKSwgc2VsZi5jb25maWd1cmF0aW9uKQorICAgICAgICByZXR1cm4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL21zZy5weSBiL2JpdGJha2UvbGliL2JiL21zZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZiNWFlCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvbXNnLnB5CkBAIC0wLDAgKzEsMTk5IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdtc2cnIGltcGxlbWVudGF0aW9uCisKK01lc3NhZ2UgaGFuZGxpbmcgaW5mcmFzdHJ1Y3R1cmUgZm9yIGJpdGJha2UKKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2ICAgICAgICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IHN5cworaW1wb3J0IGNvcHkKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgY29sbGVjdGlvbnMKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBncm91cGJ5CitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBiYgoraW1wb3J0IGJiLmV2ZW50CisKK2NsYXNzIEJCTG9nRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKKyAgICAiIiJGb3JtYXR0ZXIgd2hpY2ggZW5zdXJlcyB0aGF0IG91ciAncGxhaW4nIG1lc3NhZ2VzIChsb2dnaW5nLklORk8gKyAxKSBhcmUgdXNlZCBhcyBpcyIiIgorCisgICAgREVCVUczID0gbG9nZ2luZy5ERUJVRyAtIDIKKyAgICBERUJVRzIgPSBsb2dnaW5nLkRFQlVHIC0gMQorICAgIERFQlVHID0gbG9nZ2luZy5ERUJVRworICAgIFZFUkJPU0UgPSBsb2dnaW5nLklORk8gLSAxCisgICAgTk9URSA9IGxvZ2dpbmcuSU5GTworICAgIFBMQUlOID0gbG9nZ2luZy5JTkZPICsgMQorICAgIEVSUk9SID0gbG9nZ2luZy5FUlJPUgorICAgIFdBUk5JTkcgPSBsb2dnaW5nLldBUk5JTkcKKyAgICBDUklUSUNBTCA9IGxvZ2dpbmcuQ1JJVElDQUwKKworICAgIGxldmVsbmFtZXMgPSB7CisgICAgICAgIERFQlVHMyAgIDogJ0RFQlVHJywKKyAgICAgICAgREVCVUcyICAgOiAnREVCVUcnLAorICAgICAgICBERUJVRyAgIDogJ0RFQlVHJywKKyAgICAgICAgVkVSQk9TRTogJ05PVEUnLAorICAgICAgICBOT1RFICAgIDogJ05PVEUnLAorICAgICAgICBQTEFJTiAgOiAnJywKKyAgICAgICAgV0FSTklORyA6ICdXQVJOSU5HJywKKyAgICAgICAgRVJST1IgICA6ICdFUlJPUicsCisgICAgICAgIENSSVRJQ0FMOiAnRVJST1InLAorICAgIH0KKworICAgIGNvbG9yX2VuYWJsZWQgPSBGYWxzZQorICAgIEJBU0VDT0xPUiwgQkxBQ0ssIFJFRCwgR1JFRU4sIFlFTExPVywgQkxVRSwgTUFHRU5UQSwgQ1lBTiwgV0hJVEUgPSByYW5nZSgyOSwzOCkKKworICAgIENPTE9SUyA9IHsKKyAgICAgICAgREVCVUczICA6IENZQU4sCisgICAgICAgIERFQlVHMiAgOiBDWUFOLAorICAgICAgICBERUJVRyAgIDogQ1lBTiwKKyAgICAgICAgVkVSQk9TRSA6IEJBU0VDT0xPUiwKKyAgICAgICAgTk9URSAgICA6IEJBU0VDT0xPUiwKKyAgICAgICAgUExBSU4gICA6IEJBU0VDT0xPUiwKKyAgICAgICAgV0FSTklORyA6IFlFTExPVywKKyAgICAgICAgRVJST1IgICA6IFJFRCwKKyAgICAgICAgQ1JJVElDQUw6IFJFRCwKKyAgICB9CisKKyAgICBCTEQgPSAnXDAzM1sxOyVkbScKKyAgICBTVEQgPSAnXDAzM1slZG0nCisgICAgUlNUID0gJ1wwMzNbMG0nCisKKyAgICBkZWYgZ2V0TGV2ZWxOYW1lKHNlbGYsIGxldmVsbm8pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sZXZlbG5hbWVzW2xldmVsbm9dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYubGV2ZWxuYW1lc1tsZXZlbG5vXSA9IHZhbHVlID0gJ0xldmVsICVkJyAlIGxldmVsbm8KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmQpOgorICAgICAgICByZWNvcmQubGV2ZWxuYW1lID0gc2VsZi5nZXRMZXZlbE5hbWUocmVjb3JkLmxldmVsbm8pCisgICAgICAgIGlmIHJlY29yZC5sZXZlbG5vID09IHNlbGYuUExBSU46CisgICAgICAgICAgICBtc2cgPSByZWNvcmQuZ2V0TWVzc2FnZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmNvbG9yX2VuYWJsZWQ6CisgICAgICAgICAgICAgICAgcmVjb3JkID0gc2VsZi5jb2xvcml6ZShyZWNvcmQpCisgICAgICAgICAgICBtc2cgPSBsb2dnaW5nLkZvcm1hdHRlci5mb3JtYXQoc2VsZiwgcmVjb3JkKQorCisgICAgICAgIGlmIGhhc2F0dHIocmVjb3JkLCAnYmJfZXhjX2luZm8nKToKKyAgICAgICAgICAgIGV0eXBlLCB2YWx1ZSwgdGIgPSByZWNvcmQuYmJfZXhjX2luZm8KKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IGJiLmV4Y2VwdGlvbnMuZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdD01KQorICAgICAgICAgICAgbXNnICs9ICdcbicgKyAnJy5qb2luKGZvcm1hdHRlZCkKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGNvbG9yaXplKHNlbGYsIHJlY29yZCk6CisgICAgICAgIGNvbG9yID0gc2VsZi5DT0xPUlNbcmVjb3JkLmxldmVsbm9dCisgICAgICAgIGlmIHNlbGYuY29sb3JfZW5hYmxlZCBhbmQgY29sb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZWNvcmQgPSBjb3B5LmNvcHkocmVjb3JkKQorICAgICAgICAgICAgcmVjb3JkLmxldmVsbmFtZSA9ICIiLmpvaW4oW3NlbGYuQkxEICUgY29sb3IsIHJlY29yZC5sZXZlbG5hbWUsIHNlbGYuUlNUXSkKKyAgICAgICAgICAgIHJlY29yZC5tc2cgPSAiIi5qb2luKFtzZWxmLlNURCAlIGNvbG9yLCByZWNvcmQubXNnLCBzZWxmLlJTVF0pCisgICAgICAgIHJldHVybiByZWNvcmQKKworICAgIGRlZiBlbmFibGVfY29sb3Ioc2VsZik6CisgICAgICAgIHNlbGYuY29sb3JfZW5hYmxlZCA9IFRydWUKKworY2xhc3MgQkJMb2dGaWx0ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlciwgbGV2ZWwsIGRlYnVnX2RvbWFpbnMpOgorICAgICAgICBzZWxmLnN0ZGxldmVsID0gbGV2ZWwKKyAgICAgICAgc2VsZi5kZWJ1Z19kb21haW5zID0gZGVidWdfZG9tYWlucworICAgICAgICBsb2dsZXZlbCA9IGxldmVsCisgICAgICAgIGZvciBkb21haW4gaW4gZGVidWdfZG9tYWluczoKKyAgICAgICAgICAgIGlmIGRlYnVnX2RvbWFpbnNbZG9tYWluXSA8IGxvZ2xldmVsOgorICAgICAgICAgICAgICAgIGxvZ2xldmVsID0gZGVidWdfZG9tYWluc1tkb21haW5dCisgICAgICAgIGhhbmRsZXIuc2V0TGV2ZWwobG9nbGV2ZWwpCisgICAgICAgIGhhbmRsZXIuYWRkRmlsdGVyKHNlbGYpCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgIGlmIHJlY29yZC5sZXZlbG5vID49IHNlbGYuc3RkbGV2ZWw6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiByZWNvcmQubmFtZSBpbiBzZWxmLmRlYnVnX2RvbWFpbnMgYW5kIHJlY29yZC5sZXZlbG5vID49IHNlbGYuZGVidWdfZG9tYWluc1tyZWNvcmQubmFtZV06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgQkJMb2dGaWx0ZXJTdGRFcnIoQkJMb2dGaWx0ZXIpOgorICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgaWYgbm90IEJCTG9nRmlsdGVyLmZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHJlY29yZC5sZXZlbG5vID49IGxvZ2dpbmcuRVJST1I6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgQkJMb2dGaWx0ZXJTdGRPdXQoQkJMb2dGaWx0ZXIpOgorICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgaWYgbm90IEJCTG9nRmlsdGVyLmZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHJlY29yZC5sZXZlbG5vIDwgbG9nZ2luZy5FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisjIE1lc3NhZ2UgY29udHJvbCBmdW5jdGlvbnMKKyMKKworbG9nZ2VyRGVmYXVsdERlYnVnTGV2ZWwgPSAwCitsb2dnZXJEZWZhdWx0VmVyYm9zZSA9IEZhbHNlCitsb2dnZXJWZXJib3NlTG9ncyA9IEZhbHNlCitsb2dnZXJEZWZhdWx0RG9tYWlucyA9IFtdCisKK2RlZiBpbml0X21zZ2NvbmZpZyh2ZXJib3NlLCBkZWJ1ZywgZGVidWdfZG9tYWlucz1Ob25lKToKKyAgICAiIiIKKyAgICBTZXQgZGVmYXVsdCB2ZXJib3NpdHkgYW5kIGRlYnVnIGxldmVscyBjb25maWcgdGhlIGxvZ2dlcgorICAgICIiIgorICAgIGJiLm1zZy5sb2dnZXJEZWZhdWx0RGVidWdMZXZlbCA9IGRlYnVnCisgICAgYmIubXNnLmxvZ2dlckRlZmF1bHRWZXJib3NlID0gdmVyYm9zZQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGJiLm1zZy5sb2dnZXJWZXJib3NlTG9ncyA9IFRydWUKKyAgICBpZiBkZWJ1Z19kb21haW5zOgorICAgICAgICBiYi5tc2cubG9nZ2VyRGVmYXVsdERvbWFpbnMgPSBkZWJ1Z19kb21haW5zCisgICAgZWxzZToKKyAgICAgICAgYmIubXNnLmxvZ2dlckRlZmF1bHREb21haW5zID0gW10KKworZGVmIGNvbnN0cnVjdExvZ09wdGlvbnMoKToKKyAgICBkZWJ1ZyA9IGxvZ2dlckRlZmF1bHREZWJ1Z0xldmVsCisgICAgdmVyYm9zZSA9IGxvZ2dlckRlZmF1bHRWZXJib3NlCisgICAgZG9tYWlucyA9IGxvZ2dlckRlZmF1bHREb21haW5zCisKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgbGV2ZWwgPSBCQkxvZ0Zvcm1hdHRlci5ERUJVRyAtIGRlYnVnICsgMQorICAgIGVsaWYgdmVyYm9zZToKKyAgICAgICAgbGV2ZWwgPSBCQkxvZ0Zvcm1hdHRlci5WRVJCT1NFCisgICAgZWxzZToKKyAgICAgICAgbGV2ZWwgPSBCQkxvZ0Zvcm1hdHRlci5OT1RFCisKKyAgICBkZWJ1Z19kb21haW5zID0ge30KKyAgICBmb3IgKGRvbWFpbmFyZywgaXRlcmF0b3IpIGluIGdyb3VwYnkoZG9tYWlucyk6CisgICAgICAgIGRsZXZlbCA9IGxlbih0dXBsZShpdGVyYXRvcikpCisgICAgICAgIGRlYnVnX2RvbWFpbnNbIkJpdEJha2UuJXMiICUgZG9tYWluYXJnXSA9IGxvZ2dpbmcuREVCVUcgLSBkbGV2ZWwgKyAxCisgICAgcmV0dXJuIGxldmVsLCBkZWJ1Z19kb21haW5zCisKK2RlZiBhZGREZWZhdWx0bG9nRmlsdGVyKGhhbmRsZXIsIGNscyA9IEJCTG9nRmlsdGVyKToKKyAgICBsZXZlbCwgZGVidWdfZG9tYWlucyA9IGNvbnN0cnVjdExvZ09wdGlvbnMoKQorCisgICAgY2xzKGhhbmRsZXIsIGxldmVsLCBkZWJ1Z19kb21haW5zKQorCisjCisjIE1lc3NhZ2UgaGFuZGxpbmcgZnVuY3Rpb25zCisjCisKK2RlZiBmYXRhbChtc2dkb21haW4sIG1zZyk6CisgICAgaWYgbXNnZG9tYWluOgorICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS4lcyIgJSBtc2dkb21haW4pCisgICAgZWxzZToKKyAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorICAgIGxvZ2dlci5jcml0aWNhbChtc2cpCisgICAgc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL25hbWVkdHVwbGVfd2l0aF9hYmMucHkgYi9iaXRiYWtlL2xpYi9iYi9uYW1lZHR1cGxlX3dpdGhfYWJjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjJmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9uYW1lZHR1cGxlX3dpdGhfYWJjLnB5CkBAIC0wLDAgKzEsMjU1IEBACisjIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzU3NzYyOS1uYW1lZHR1cGxlYWJjLWFic3RyYWN0LWJhc2UtY2xhc3MtbWl4LWluLWZvci1uYW1lZC8KKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKGMpIDIwMTEgSmFuIEthbGlzemV3c2tpICh6dW8pLiBBdmFpbGFibGUgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgorCisiIiIKK25hbWVkdHVwbGVfd2l0aF9hYmMucHk6CisqIG5hbWVkIHR1cGxlIG1peC1pbiArIEFCQyAoYWJzdHJhY3QgYmFzZSBjbGFzcykgcmVjaXBlLAorKiB3b3JrcyB1bmRlciBQeXRob24gMi42LCAyLjcgYXMgd2VsbCBhcyAzLnguCisKK0ltcG9ydCB0aGlzIG1vZHVsZSB0byBwYXRjaCBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkgZmFjdG9yeSBmdW5jdGlvbgorLS0gZW5yaWNoaW5nIGl0IHdpdGggdGhlICdhYmMnIGF0dHJpYnV0ZSAoYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyArIG1peC1pbgorZm9yIG5hbWVkIHR1cGxlcykgYW5kIGRlY29yYXRpbmcgaXQgd2l0aCBhIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgZWFjaAorbmV3bHkgY3JlYXRlZCBuYW1lZCB0dXBsZSBhcyBhIHN1YmNsYXNzIG9mIG5hbWVkdHVwbGUuYWJjLgorCitIb3cgdG8gaW1wb3J0OgorICAgIGltcG9ydCBjb2xsZWN0aW9ucywgbmFtZWR0dXBsZV93aXRoX2FiYworb3I6CisgICAgaW1wb3J0IG5hbWVkdHVwbGVfd2l0aF9hYmMKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisgICAgIyBeIGluIHRoaXMgdmFyaWFudCB5b3UgbXVzdCBpbXBvcnQgbmFtZWR0dXBsZSBmdW5jdGlvbgorICAgICMgICAqYWZ0ZXIqIGltcG9ydGluZyBuYW1lZHR1cGxlX3dpdGhfYWJjIG1vZHVsZQorb3Igc2ltcGx5OgorICAgIGZyb20gbmFtZWR0dXBsZV93aXRoX2FiYyBpbXBvcnQgbmFtZWR0dXBsZQorCitTaW1wbGUgdXNhZ2UgZXhhbXBsZToKKyAgICBjbGFzcyBDcmVkZW50aWFscyhuYW1lZHR1cGxlLmFiYyk6CisgICAgICAgIF9maWVsZHMgPSAndXNlcm5hbWUgcGFzc3dvcmQnCisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICgnezAuX19jbGFzc19fLl9fbmFtZV9ffScKKyAgICAgICAgICAgICAgICAgICAgJyh1c2VybmFtZT17MC51c2VybmFtZX0sIHBhc3N3b3JkPS4uLiknLmZvcm1hdChzZWxmKSkKKyAgICBwcmludChDcmVkZW50aWFscygiYWxpY2UiLCAiQWxpY2UncyBwYXNzd29yZCIpKQorCitGb3IgbW9yZSBhZHZhbmNlZCBleGFtcGxlcyAtLSBzZWUgYmVsb3cgdGhlICJpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOiIuCisiIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCitmcm9tIGFiYyBpbXBvcnQgQUJDTWV0YSwgYWJzdHJhY3Rwcm9wZXJ0eQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCitmcm9tIHN5cyBpbXBvcnQgdmVyc2lvbl9pbmZvCisKK19fYWxsX18gPSAoJ25hbWVkdHVwbGUnLCkKK19uYW1lZHR1cGxlID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZQorCisKK2NsYXNzIF9OYW1lZFR1cGxlQUJDTWV0YShBQkNNZXRhKToKKyAgICAnJydUaGUgbWV0YWNsYXNzIGZvciB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyArIG1peC1pbiBmb3IgbmFtZWQgdHVwbGVzLicnJworICAgIGRlZiBfX25ld19fKG1jbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpOgorICAgICAgICBmaWVsZHMgPSBuYW1lc3BhY2UuZ2V0KCdfZmllbGRzJykKKyAgICAgICAgZm9yIGJhc2UgaW4gYmFzZXM6CisgICAgICAgICAgICBpZiBmaWVsZHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZpZWxkcyA9IGdldGF0dHIoYmFzZSwgJ19maWVsZHMnLCBOb25lKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmaWVsZHMsIGFic3RyYWN0cHJvcGVydHkpOgorICAgICAgICAgICAgYmFzZXR1cGxlID0gX25hbWVkdHVwbGUobmFtZSwgZmllbGRzKQorICAgICAgICAgICAgYmFzZXMgPSAoYmFzZXR1cGxlLCkgKyBiYXNlcworICAgICAgICAgICAgbmFtZXNwYWNlLnBvcCgnX2ZpZWxkcycsIE5vbmUpCisgICAgICAgICAgICBuYW1lc3BhY2Uuc2V0ZGVmYXVsdCgnX19kb2NfXycsIGJhc2V0dXBsZS5fX2RvY19fKQorICAgICAgICAgICAgbmFtZXNwYWNlLnNldGRlZmF1bHQoJ19fc2xvdHNfXycsICgpKQorICAgICAgICByZXR1cm4gQUJDTWV0YS5fX25ld19fKG1jbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpCisKKworZXhlYygKKyAgICAjIFB5dGhvbiAyLnggbWV0YWNsYXNzIGRlY2xhcmF0aW9uIHN5bnRheAorICAgICIiImNsYXNzIF9OYW1lZFR1cGxlQUJDKG9iamVjdCk6CisgICAgICAgICcnJ1RoZSBhYnN0cmFjdCBiYXNlIGNsYXNzICsgbWl4LWluIGZvciBuYW1lZCB0dXBsZXMuJycnCisgICAgICAgIF9fbWV0YWNsYXNzX18gPSBfTmFtZWRUdXBsZUFCQ01ldGEKKyAgICAgICAgX2ZpZWxkcyA9IGFic3RyYWN0cHJvcGVydHkoKSIiIiBpZiB2ZXJzaW9uX2luZm9bMF0gPCAzIGVsc2UKKyAgICAjIFB5dGhvbiAzLnggbWV0YWNsYXNzIGRlY2xhcmF0aW9uIHN5bnRheAorICAgICIiImNsYXNzIF9OYW1lZFR1cGxlQUJDKG1ldGFjbGFzcz1fTmFtZWRUdXBsZUFCQ01ldGEpOgorICAgICAgICAnJydUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyArIG1peC1pbiBmb3IgbmFtZWQgdHVwbGVzLicnJworICAgICAgICBfZmllbGRzID0gYWJzdHJhY3Rwcm9wZXJ0eSgpIiIiCispCisKKworX25hbWVkdHVwbGUuYWJjID0gX05hbWVkVHVwbGVBQkMKKyNfTmFtZWRUdXBsZUFCQy5yZWdpc3Rlcih0eXBlKHZlcnNpb25faW5mbykpICAjIChhbmQgc2ltaWxhciwgaW4gdGhlIGZ1dHVyZS4uLikKKworQHdyYXBzKF9uYW1lZHR1cGxlKQorZGVmIG5hbWVkdHVwbGUoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAnJydOYW1lZCB0dXBsZSBmYWN0b3J5IHdpdGggbmFtZWR0dXBsZS5hYmMgc3ViY2xhc3MgcmVnaXN0cmF0aW9uLicnJworICAgIGNscyA9IF9uYW1lZHR1cGxlKCphcmdzLCAqKmt3YXJncykKKyAgICBfTmFtZWRUdXBsZUFCQy5yZWdpc3RlcihjbHMpCisgICAgcmV0dXJuIGNscworCitjb2xsZWN0aW9ucy5uYW1lZHR1cGxlID0gbmFtZWR0dXBsZQorCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCisgICAgJycnRXhhbXBsZXMgYW5kIGV4cGxhbmF0aW9ucycnJworCisgICAgIyBTaW1wbGUgdXNhZ2UKKworICAgIGNsYXNzIE15UmVjb3JkKG5hbWVkdHVwbGUuYWJjKToKKyAgICAgICAgX2ZpZWxkcyA9ICd4IHkgeicgICMgc3VjaCBmb3JtIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byAoJ3gnLCAneScsICd6JykKKyAgICAgICAgZGVmIF9teV9jdXN0b21fbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fYXNkaWN0KCkuaXRlbXMoKSkKKyAgICAjICh0aGUgJ19maWVsZHMnIGF0dHJpYnV0ZSBiZWxvbmdzIHRvIHRoZSBuYW1lZCB0dXBsZSBwdWJsaWMgQVBJIGFueXdheSkKKworICAgIHJlYyA9IE15UmVjb3JkKDEsIDIsIDMpCisgICAgcHJpbnQocmVjKQorICAgIHByaW50KHJlYy5fbXlfY3VzdG9tX21ldGhvZCgpKQorICAgIHByaW50KHJlYy5fcmVwbGFjZSh5PTIyMikpCisgICAgcHJpbnQocmVjLl9yZXBsYWNlKHk9MjIyKS5fbXlfY3VzdG9tX21ldGhvZCgpKQorCisgICAgIyBDdXN0b20gYWJzdHJhY3QgY2xhc3Nlcy4uLgorCisgICAgY2xhc3MgTXlBYnN0cmFjdFJlY29yZChuYW1lZHR1cGxlLmFiYyk6CisgICAgICAgIGRlZiBfbXlfY3VzdG9tX21ldGhvZChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2FzZGljdCgpLml0ZW1zKCkpCisKKyAgICB0cnk6CisgICAgICAgIE15QWJzdHJhY3RSZWNvcmQoKSAgIyAoYWJzdHJhY3QgY2xhc3NlcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkKQorICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZXhjOgorICAgICAgICBwcmludChleGMpCisKKyAgICBjbGFzcyBBbm90aGVyQWJzdHJhY3RSZWNvcmQoTXlBYnN0cmFjdFJlY29yZCk6CisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICc8PDx7MH0+Pj4nLmZvcm1hdChzdXBlcihBbm90aGVyQWJzdHJhY3RSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpLl9fc3RyX18oKSkKKworICAgICMgLi4uYW5kIHRoZWlyIG5vbi1hYnN0cmFjdCBzdWJjbGFzc2VzCisKKyAgICBjbGFzcyBNeVJlY29yZDIoTXlBYnN0cmFjdFJlY29yZCk6CisgICAgICAgIF9maWVsZHMgPSAnYSwgYicKKworICAgIGNsYXNzIE15UmVjb3JkMyhBbm90aGVyQWJzdHJhY3RSZWNvcmQpOgorICAgICAgICBfZmllbGRzID0gJ3AnLCAncScsICdyJworCisgICAgcmVjMiA9IE15UmVjb3JkMignZm9vJywgJ2JhcicpCisgICAgcHJpbnQocmVjMikKKyAgICBwcmludChyZWMyLl9teV9jdXN0b21fbWV0aG9kKCkpCisgICAgcHJpbnQocmVjMi5fcmVwbGFjZShiPTIyMikpCisgICAgcHJpbnQocmVjMi5fcmVwbGFjZShiPTIyMikuX215X2N1c3RvbV9tZXRob2QoKSkKKworICAgIHJlYzMgPSBNeVJlY29yZDMoJ2ZvbycsICdiYXInLCAnYmF6JykKKyAgICBwcmludChyZWMzKQorICAgIHByaW50KHJlYzMuX215X2N1c3RvbV9tZXRob2QoKSkKKyAgICBwcmludChyZWMzLl9yZXBsYWNlKHE9MjIyKSkKKyAgICBwcmludChyZWMzLl9yZXBsYWNlKHE9MjIyKS5fbXlfY3VzdG9tX21ldGhvZCgpKQorCisgICAjIFlvdSBjYW4gYWxzbyBzdWJjbGFzcyBub24tYWJzdHJhY3Qgb25lcy4uLgorCisgICAgY2xhc3MgTXlSZWNvcmQzMyhNeVJlY29yZDMpOgorICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAnPCB7MCFyfSwgLi4uLCB7MCFyfSA+Jy5mb3JtYXQoc2VsZi5wLCBzZWxmLnIpCisKKyAgICByZWMzMyA9IE15UmVjb3JkMzMoJ2ZvbycsICdiYXInLCAnYmF6JykKKyAgICBwcmludChyZWMzMykKKyAgICBwcmludChyZWMzMy5fbXlfY3VzdG9tX21ldGhvZCgpKQorICAgIHByaW50KHJlYzMzLl9yZXBsYWNlKHE9MjIyKSkKKyAgICBwcmludChyZWMzMy5fcmVwbGFjZShxPTIyMikuX215X2N1c3RvbV9tZXRob2QoKSkKKworICAgICMgLi4uYW5kIGV2ZW4gb3ZlcnJpZGUgdGhlIG1hZ2ljICdfZmllbGRzJyBhdHRyaWJ1dGUgYWdhaW4KKworICAgIGNsYXNzIE15UmVjb3JkMzQ1KE15UmVjb3JkMyk6CisgICAgICAgIF9maWVsZHMgPSAnZSBmIGcgaCBpIGogaycKKworICAgIHJlYzM0NSA9IE15UmVjb3JkMzQ1KDEsIDIsIDMsIDQsIDMsIDIsIDEpCisgICAgcHJpbnQocmVjMzQ1KQorICAgIHByaW50KHJlYzM0NS5fbXlfY3VzdG9tX21ldGhvZCgpKQorICAgIHByaW50KHJlYzM0NS5fcmVwbGFjZShmPTIyMikpCisgICAgcHJpbnQocmVjMzQ1Ll9yZXBsYWNlKGY9MjIyKS5fbXlfY3VzdG9tX21ldGhvZCgpKQorCisgICAgIyBNaXhpbmctaW4gc29tZSBvdGhlciBjbGFzc2VzIGlzIGFsc28gcG9zc2libGU6CisKKyAgICBjbGFzcyBNeU1peEluKG9iamVjdCk6CisgICAgICAgIGRlZiBtZXRob2Qoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIk15TWl4SW4ubWV0aG9kKCkgY2FsbGVkIgorICAgICAgICBkZWYgX215X2N1c3RvbV9tZXRob2Qoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIk15TWl4SW4uX215X2N1c3RvbV9tZXRob2QoKSBjYWxsZWQiCisgICAgICAgIGRlZiBjb3VudChzZWxmLCBpdGVtKToKKyAgICAgICAgICAgIHJldHVybiAiTXlNaXhJbi5jb3VudCh7MH0pIGNhbGxlZCIuZm9ybWF0KGl0ZW0pCisgICAgICAgIGRlZiBfYXNkaWN0KHNlbGYpOiAgIyAoY2Fubm90IG92ZXJyaWRlIGEgbmFtZWR0dXBsZSBtZXRob2QsIHNlZSBiZWxvdykKKyAgICAgICAgICAgIHJldHVybiAiTXlNaXhJbi5fYXNkaWN0KCkgY2FsbGVkIgorCisgICAgY2xhc3MgTXlSZWNvcmQ0KE15UmVjb3JkMzMsIE15TWl4SW4pOiAgIyBtaXgtaW4gb24gdGhlIHJpZ2h0CisgICAgICAgIF9maWVsZHMgPSAnaiBrIGwgeCcKKworICAgIGNsYXNzIE15UmVjb3JkNShNeU1peEluLCBNeVJlY29yZDMzKTogICMgbWl4LWluIG9uIHRoZSBsZWZ0CisgICAgICAgIF9maWVsZHMgPSAnaiBrIGwgeCB5JworCisgICAgcmVjNCA9IE15UmVjb3JkNCgxLCAyLCAzLCAyKQorICAgIHByaW50KHJlYzQpCisgICAgcHJpbnQocmVjNC5tZXRob2QoKSkKKyAgICBwcmludChyZWM0Ll9teV9jdXN0b21fbWV0aG9kKCkpICAjIE15UmVjb3JkMzMncworICAgIHByaW50KHJlYzQuY291bnQoMikpICAjIHR1cGxlJ3MKKyAgICBwcmludChyZWM0Ll9yZXBsYWNlKGs9MjIyKSkKKyAgICBwcmludChyZWM0Ll9yZXBsYWNlKGs9MjIyKS5tZXRob2QoKSkKKyAgICBwcmludChyZWM0Ll9yZXBsYWNlKGs9MjIyKS5fbXlfY3VzdG9tX21ldGhvZCgpKSAgIyBNeVJlY29yZDMzJ3MKKyAgICBwcmludChyZWM0Ll9yZXBsYWNlKGs9MjIyKS5jb3VudCg4KSkgICMgdHVwbGUncworCisgICAgcmVjNSA9IE15UmVjb3JkNSgxLCAyLCAzLCAyLCAxKQorICAgIHByaW50KHJlYzUpCisgICAgcHJpbnQocmVjNS5tZXRob2QoKSkKKyAgICBwcmludChyZWM1Ll9teV9jdXN0b21fbWV0aG9kKCkpICAjIE15TWl4SW4ncworICAgIHByaW50KHJlYzUuY291bnQoMikpICAjIE15TWl4SW4ncworICAgIHByaW50KHJlYzUuX3JlcGxhY2Uoaz0yMjIpKQorICAgIHByaW50KHJlYzUuX3JlcGxhY2Uoaz0yMjIpLm1ldGhvZCgpKQorICAgIHByaW50KHJlYzUuX3JlcGxhY2Uoaz0yMjIpLl9teV9jdXN0b21fbWV0aG9kKCkpICAjIE15TWl4SW4ncworICAgIHByaW50KHJlYzUuX3JlcGxhY2Uoaz0yMjIpLmNvdW50KDIpKSAgIyBNeU1peEluJ3MKKworICAgICMgTm90ZSB0aGF0IGJlaGF2aW9yOiB0aGUgc3RhbmRhcmQgbmFtZWR0dXBsZSBtZXRob2RzIGNhbm5vdCBiZQorICAgICMgb3ZlcnJpZGRlbiBieSBhIGZvcmVpZ24gbWl4LWluIC0tIGV2ZW4gaWYgdGhlIG1peC1pbiBpcyBkZWNsYXJlZAorICAgICMgYXMgdGhlIGxlZnRtb3N0IGJhc2UgY2xhc3MgKGJ1dCwgb2J2aW91c2x5LCB5b3UgY2FuIG92ZXJyaWRlIHRoZW0KKyAgICAjIGluIHRoZSBkZWZpbmVkIGNsYXNzIG9yIGl0cyBzdWJjbGFzc2VzKToKKworICAgIHByaW50KHJlYzQuX2FzZGljdCgpKSAgIyAocmV0dXJucyBhIGRpY3QsIG5vdCAiTXlNaXhJbi5fYXNkaWN0KCkgY2FsbGVkIikKKyAgICBwcmludChyZWM1Ll9hc2RpY3QoKSkgICMgKHJldHVybnMgYSBkaWN0LCBub3QgIk15TWl4SW4uX2FzZGljdCgpIGNhbGxlZCIpCisKKyAgICBjbGFzcyBNeVJlY29yZDYoTXlSZWNvcmQzMyk6CisgICAgICAgIF9maWVsZHMgPSAnaiBrIGwgeCB5IHonCisgICAgICAgIGRlZiBfYXNkaWN0KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICJNeVJlY29yZDYuX2FzZGljdCgpIGNhbGxlZCIKKyAgICByZWM2ID0gTXlSZWNvcmQ2KDEsIDIsIDMsIDEsIDIsIDMpCisgICAgcHJpbnQocmVjNi5fYXNkaWN0KCkpICAjICh0aGlzIHJldHVybnMgIk15UmVjb3JkNi5fYXNkaWN0KCkgY2FsbGVkIikKKworICAgICMgQWxsIHRoYXQgcmVjb3JkIGNsYXNzZXMgYXJlIHJlYWwgc3ViY2xhc3NlcyBvZiBuYW1lZHR1cGxlLmFiYzoKKworICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkLCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeUFic3RyYWN0UmVjb3JkLCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhBbm90aGVyQWJzdHJhY3RSZWNvcmQsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkMiwgbmFtZWR0dXBsZS5hYmMpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQzLCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDMzLCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDM0NSwgbmFtZWR0dXBsZS5hYmMpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQ0LCBuYW1lZHR1cGxlLmFiYykKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDUsIG5hbWVkdHVwbGUuYWJjKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkNiwgbmFtZWR0dXBsZS5hYmMpCisKKyAgICAjIC4uLmJ1dCBhYnN0cmFjdCBvbmVzIGFyZSBub3Qgc3ViY2xhc3NlcyBvZiB0dXBsZQorICAgICMgKGFuZCB0aGlzIGlzIHdoYXQgeW91IHByb2JhYmx5IHdhbnQpOgorCisgICAgYXNzZXJ0IG5vdCBpc3N1YmNsYXNzKE15QWJzdHJhY3RSZWNvcmQsIHR1cGxlKQorICAgIGFzc2VydCBub3QgaXNzdWJjbGFzcyhBbm90aGVyQWJzdHJhY3RSZWNvcmQsIHR1cGxlKQorCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQsIHR1cGxlKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkMiwgdHVwbGUpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQzLCB0dXBsZSkKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDMzLCB0dXBsZSkKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDM0NSwgdHVwbGUpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlSZWNvcmQ0LCB0dXBsZSkKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhNeVJlY29yZDUsIHR1cGxlKQorICAgIGFzc2VydCBpc3N1YmNsYXNzKE15UmVjb3JkNiwgdHVwbGUpCisKKyAgICAjIE5hbWVkIHR1cGxlIGNsYXNzZXMgY3JlYXRlZCB3aXRoIG5hbWVkdHVwbGUoKSBmYWN0b3J5IGZ1bmN0aW9uCisgICAgIyAoaW4gdGhlICJ0cmFkaXRpb25hbCIgd2F5KSBhcmUgcmVnaXN0ZXJlZCBhcyAidmlydHVhbCIgc3ViY2xhc3NlcworICAgICMgb2YgbmFtZWR0dXBsZS5hYmM6CisKKyAgICBNeVR1cGxlID0gbmFtZWR0dXBsZSgnTXlUdXBsZScsICdhIGIgYycpCisgICAgbXQgPSBNeVR1cGxlKDEsIDIsIDMpCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoTXlUdXBsZSwgbmFtZWR0dXBsZS5hYmMpCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UobXQsIG5hbWVkdHVwbGUuYWJjKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcGFyc2UvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi9wYXJzZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VjNzFmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcGFyc2UvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNzAgQEAKKyIiIgorQml0QmFrZSBQYXJzZXJzCisKK0ZpbGUgcGFyc2VycyBmb3IgdGhlIEJpdEJha2UgYnVpbGQgdG9vbHMuCisKKyIiIgorCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBCYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgYmFzZSBiYiBtb2R1bGUsIENvcHlyaWdodCAyMDAzIEhvbGdlciBTY2h1cmlnCisKK2hhbmRsZXJzID0gW10KKworaW1wb3J0IGVycm5vCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc3RhdAoraW1wb3J0IGJiCitpbXBvcnQgYmIudXRpbHMKK2ltcG9ydCBiYi5zaWdnZW4KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUGFyc2luZyIpCisKK2NsYXNzIFBhcnNlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gcGFyc2luZyBmYWlscyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIGZpbGVuYW1lLCBsaW5lbm89MCk6CisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnLCBmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubGluZW5vOgorICAgICAgICAgICAgcmV0dXJuICJQYXJzZUVycm9yIGF0ICVzOiVkOiAlcyIgJSAoc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8sIHNlbGYubXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJQYXJzZUVycm9yIGluICVzOiAlcyIgJSAoc2VsZi5maWxlbmFtZSwgc2VsZi5tc2cpCisKK2NsYXNzIFNraXBSZWNpcGUoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHRvIHNraXAgdGhpcyByZWNpcGUiIiIKKworY2xhc3MgU2tpcFBhY2thZ2UoU2tpcFJlY2lwZSk6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB0byBza2lwIHRoaXMgcmVjaXBlICh1c2UgU2tpcFJlY2lwZSBpbiBuZXcgY29kZSkiIiIKKworX19tdGltZV9jYWNoZSA9IHt9CitkZWYgY2FjaGVkX210aW1lKGYpOgorICAgIGlmIGYgbm90IGluIF9fbXRpbWVfY2FjaGU6CisgICAgICAgIF9fbXRpbWVfY2FjaGVbZl0gPSBvcy5zdGF0KGYpW3N0YXQuU1RfTVRJTUVdCisgICAgcmV0dXJuIF9fbXRpbWVfY2FjaGVbZl0KKworZGVmIGNhY2hlZF9tdGltZV9ub2Vycm9yKGYpOgorICAgIGlmIGYgbm90IGluIF9fbXRpbWVfY2FjaGU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9fbXRpbWVfY2FjaGVbZl0gPSBvcy5zdGF0KGYpW3N0YXQuU1RfTVRJTUVdCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICByZXR1cm4gX19tdGltZV9jYWNoZVtmXQorCitkZWYgdXBkYXRlX210aW1lKGYpOgorICAgIHRyeToKKyAgICAgICAgX19tdGltZV9jYWNoZVtmXSA9IG9zLnN0YXQoZilbc3RhdC5TVF9NVElNRV0KKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgaWYgZiBpbiBfX210aW1lX2NhY2hlOgorICAgICAgICAgICAgZGVsIF9fbXRpbWVfY2FjaGVbZl0KKyAgICAgICAgcmV0dXJuIDAKKyAgICByZXR1cm4gX19tdGltZV9jYWNoZVtmXQorCitkZWYgdXBkYXRlX2NhY2hlKGYpOgorICAgIGlmIGYgaW4gX19tdGltZV9jYWNoZToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJVcGRhdGluZyBtdGltZSBjYWNoZSBmb3IgJXMiICUgZikKKyAgICAgICAgdXBkYXRlX210aW1lKGYpCisKK2RlZiBtYXJrX2RlcGVuZGVuY3koZCwgZik6CisgICAgaWYgZi5zdGFydHN3aXRoKCcuLycpOgorICAgICAgICBmID0gIiVzLyVzIiAlIChvcy5nZXRjd2QoKSwgZlsyOl0pCisgICAgZGVwcyA9IChkLmdldFZhcignX19kZXBlbmRzJywgRmFsc2UpIG9yIFtdKQorICAgIHMgPSAoZiwgY2FjaGVkX210aW1lX25vZXJyb3IoZikpCisgICAgaWYgcyBub3QgaW4gZGVwczoKKyAgICAgICAgZGVwcy5hcHBlbmQocykKKyAgICAgICAgZC5zZXRWYXIoJ19fZGVwZW5kcycsIGRlcHMpCisKK2RlZiBjaGVja19kZXBlbmRlbmN5KGQsIGYpOgorICAgIHMgPSAoZiwgY2FjaGVkX210aW1lX25vZXJyb3IoZikpCisgICAgZGVwcyA9IChkLmdldFZhcignX19kZXBlbmRzJywgRmFsc2UpIG9yIFtdKQorICAgIHJldHVybiBzIGluIGRlcHMKKyAgIAorZGVmIHN1cHBvcnRzKGZuLCBkYXRhKToKKyAgICAiIiJSZXR1cm5zIHRydWUgaWYgd2UgaGF2ZSBhIGhhbmRsZXIgZm9yIHRoaXMgZmlsZSwgZmFsc2Ugb3RoZXJ3aXNlIiIiCisgICAgZm9yIGggaW4gaGFuZGxlcnM6CisgICAgICAgIGlmIGhbJ3N1cHBvcnRzJ10oZm4sIGRhdGEpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICByZXR1cm4gMAorCitkZWYgaGFuZGxlKGZuLCBkYXRhLCBpbmNsdWRlID0gMCk6CisgICAgIiIiQ2FsbCB0aGUgaGFuZGxlciB0aGF0IGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGZpbGUiIiIKKyAgICBmb3IgaCBpbiBoYW5kbGVyczoKKyAgICAgICAgaWYgaFsnc3VwcG9ydHMnXShmbiwgZGF0YSk6CisgICAgICAgICAgICB3aXRoIGRhdGEuaW5jaGlzdG9yeS5pbmNsdWRlKGZuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaFsnaGFuZGxlJ10oZm4sIGRhdGEsIGluY2x1ZGUpCisgICAgcmFpc2UgUGFyc2VFcnJvcigibm90IGEgQml0QmFrZSBmaWxlIiwgZm4pCisKK2RlZiBpbml0KGZuLCBkYXRhKToKKyAgICBmb3IgaCBpbiBoYW5kbGVyczoKKyAgICAgICAgaWYgaFsnc3VwcG9ydHMnXShmbik6CisgICAgICAgICAgICByZXR1cm4gaFsnaW5pdCddKGRhdGEpCisKK2RlZiBpbml0X3BhcnNlcihkKToKKyAgICBiYi5wYXJzZS5zaWdnZW4gPSBiYi5zaWdnZW4uaW5pdChkKQorCitkZWYgcmVzb2x2ZV9maWxlKGZuLCBkKToKKyAgICBpZiBub3Qgb3MucGF0aC5pc2Ficyhmbik6CisgICAgICAgIGJicGF0aCA9IGQuZ2V0VmFyKCJCQlBBVEgiLCBUcnVlKQorICAgICAgICBuZXdmbiwgYXR0ZW1wdHMgPSBiYi51dGlscy53aGljaChiYnBhdGgsIGZuLCBoaXN0b3J5PVRydWUpCisgICAgICAgIGZvciBhZiBpbiBhdHRlbXB0czoKKyAgICAgICAgICAgIG1hcmtfZGVwZW5kZW5jeShkLCBhZikKKyAgICAgICAgaWYgbm90IG5ld2ZuOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihlcnJuby5FTk9FTlQsICJmaWxlICVzIG5vdCBmb3VuZCBpbiAlcyIgJSAoZm4sIGJicGF0aCkpCisgICAgICAgIGZuID0gbmV3Zm4KKworICAgIG1hcmtfZGVwZW5kZW5jeShkLCBmbikKKyAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICByYWlzZSBJT0Vycm9yKGVycm5vLkVOT0VOVCwgImZpbGUgJXMgbm90IGZvdW5kIiAlIGZuKQorCisgICAgcmV0dXJuIGZuCisKKyMgVXNlZCBieSBPcGVuRW1iZWRkZWQgbWV0YWRhdGEKK19fcGtnc3BsaXRfY2FjaGVfXz17fQorZGVmIHZhcnNfZnJvbV9maWxlKG15cGtnLCBkKToKKyAgICBpZiBub3QgbXlwa2cgb3Igbm90IG15cGtnLmVuZHN3aXRoKCgiLmJiIiwgIi5iYmFwcGVuZCIpKToKKyAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lKQorICAgIGlmIG15cGtnIGluIF9fcGtnc3BsaXRfY2FjaGVfXzoKKyAgICAgICAgcmV0dXJuIF9fcGtnc3BsaXRfY2FjaGVfX1tteXBrZ10KKworICAgIG15ZmlsZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShteXBrZykpCisgICAgcGFydHMgPSBteWZpbGVbMF0uc3BsaXQoJ18nKQorICAgIF9fcGtnc3BsaXRfY2FjaGVfX1tteXBrZ10gPSBwYXJ0cworICAgIGlmIGxlbihwYXJ0cykgPiAzOgorICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJVbmFibGUgdG8gZ2VuZXJhdGUgZGVmYXVsdCB2YXJpYWJsZXMgZnJvbSBmaWxlbmFtZSAodG9vIG1hbnkgdW5kZXJzY29yZXMpIiwgbXlwa2cpCisgICAgZXhwID0gMyAtIGxlbihwYXJ0cykKKyAgICB0bXBsaXN0ID0gW10KKyAgICB3aGlsZSBleHAgIT0gMDoKKyAgICAgICAgZXhwIC09IDEKKyAgICAgICAgdG1wbGlzdC5hcHBlbmQoTm9uZSkKKyAgICBwYXJ0cy5leHRlbmQodG1wbGlzdCkKKyAgICByZXR1cm4gcGFydHMKKworZGVmIGdldF9maWxlX2RlcGVuZHMoZCk6CisgICAgJycnUmV0dXJuIHRoZSBkZXBlbmRlbnQgZmlsZXMnJycKKyAgICBkZXBfZmlsZXMgPSBbXQorICAgIGRlcGVuZHMgPSBkLmdldFZhcignX19iYXNlX2RlcGVuZHMnLCBUcnVlKSBvciBbXQorICAgIGRlcGVuZHMgPSBkZXBlbmRzICsgKGQuZ2V0VmFyKCdfX2RlcGVuZHMnLCBUcnVlKSBvciBbXSkKKyAgICBmb3IgKGZuLCBfKSBpbiBkZXBlbmRzOgorICAgICAgICBkZXBfZmlsZXMuYXBwZW5kKG9zLnBhdGguYWJzcGF0aChmbikpCisgICAgcmV0dXJuICIgIi5qb2luKGRlcF9maWxlcykKKworZnJvbSBiYi5wYXJzZS5wYXJzZV9weSBpbXBvcnQgX192ZXJzaW9uX18sIENvbmZIYW5kbGVyLCBCQkhhbmRsZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3BhcnNlL2FzdC5weSBiL2JpdGJha2UvbGliL2JiL3BhcnNlL2FzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRiMTgwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcGFyc2UvYXN0LnB5CkBAIC0wLDAgKzEsNDgxIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCisgQWJzdHJhY3RTeW50YXhUcmVlIGNsYXNzZXMgZm9yIHRoZSBCaXRiYWtlIGxhbmd1YWdlCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBQaGlsIEJsdW5kZWxsCisjIENvcHlyaWdodCAoQykgMjAwOSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IGZpbHRlcgoraW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCitpbXBvcnQgaXRlcnRvb2xzCitmcm9tIGJiIGltcG9ydCBtZXRob2Rwb29sCitmcm9tIGJiLnBhcnNlIGltcG9ydCBsb2dnZXIKKworX2JidmVyc2lvbnNfcmUgPSByZS5jb21waWxlKHIiXFsoP1A8ZnJvbT5bMC05XSspLSg/UDx0bz5bMC05XSspXF0iKQorCitjbGFzcyBTdGF0ZW1lbnRHcm91cChsaXN0KToKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKyAgICAgICAgZm9yIHN0YXRlbWVudCBpbiBzZWxmOgorICAgICAgICAgICAgc3RhdGVtZW50LmV2YWwoZGF0YSkKKworY2xhc3MgQXN0Tm9kZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKK2NsYXNzIEluY2x1ZGVOb2RlKEFzdE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCB3aGF0X2ZpbGUsIGZvcmNlKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLndoYXRfZmlsZSA9IHdoYXRfZmlsZQorICAgICAgICBzZWxmLmZvcmNlID0gZm9yY2UKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5jbHVkZSB0aGUgZmlsZSBhbmQgZXZhbHVhdGUgdGhlIHN0YXRlbWVudHMKKyAgICAgICAgIiIiCisgICAgICAgIHMgPSBkYXRhLmV4cGFuZChzZWxmLndoYXRfZmlsZSkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICJDT05GICVzOiVzOiBpbmNsdWRpbmcgJXMiLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgcykKKworICAgICAgICAjIFRPRE86IENhY2hlIHRob3NlIGluY2x1ZGVzLi4uIG1heWJlIG5vdCBoZXJlIHRob3VnaAorICAgICAgICBpZiBzZWxmLmZvcmNlOgorICAgICAgICAgICAgYmIucGFyc2UuQ29uZkhhbmRsZXIuaW5jbHVkZShzZWxmLmZpbGVuYW1lLCBzLCBzZWxmLmxpbmVubywgZGF0YSwgImluY2x1ZGUgcmVxdWlyZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmIucGFyc2UuQ29uZkhhbmRsZXIuaW5jbHVkZShzZWxmLmZpbGVuYW1lLCBzLCBzZWxmLmxpbmVubywgZGF0YSwgRmFsc2UpCisKK2NsYXNzIEV4cG9ydE5vZGUoQXN0Tm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIHZhcik6CisgICAgICAgIEFzdE5vZGUuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi52YXIgPSB2YXIKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICBkYXRhLnNldFZhckZsYWcoc2VsZi52YXIsICJleHBvcnQiLCAxLCBvcCA9ICdleHBvcnRlZCcpCisKK2NsYXNzIERhdGFOb2RlKEFzdE5vZGUpOgorICAgICIiIgorICAgIFZhcmlvdXMgZGF0YSByZWxhdGVkIHVwZGF0ZXMuIEZvciB0aGUgc2FrZSBvZiBzYW5pdHkKKyAgICB3ZSBoYXZlIG9uZSBjbGFzcyBkb2luZyBhbGwgdGhpcy4gVGhpcyBtZWFucyB0aGF0IGFsbAorICAgIHRoaXMgbmVlZCB0byBiZSByZS1ldmFsdWF0ZWQuLi4gd2UgbWlnaHQgYmUgYWJsZSB0byBkbworICAgIHRoYXQgZmFzdGVyIHdpdGggbXVsdGlwbGUgY2xhc3Nlcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgZ3JvdXBkKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLmdyb3VwZCA9IGdyb3VwZAorCisgICAgZGVmIGdldEZ1bmMoc2VsZiwga2V5LCBkYXRhKToKKyAgICAgICAgaWYgJ2ZsYWcnIGluIHNlbGYuZ3JvdXBkIGFuZCBzZWxmLmdyb3VwZFsnZmxhZyddICE9IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZGF0YS5nZXRWYXJGbGFnKGtleSwgc2VsZi5ncm91cGRbJ2ZsYWcnXSwgbm93ZWFrZGVmYXVsdD1UcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGRhdGEuZ2V0VmFyKGtleSwgRmFsc2UsIG5vd2Vha2RlZmF1bHQ9VHJ1ZSwgcGFyc2luZz1UcnVlKQorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGdyb3VwZCA9IHNlbGYuZ3JvdXBkCisgICAgICAgIGtleSA9IGdyb3VwZFsidmFyIl0KKyAgICAgICAgbG9naW5mbyA9IHsKKyAgICAgICAgICAgICd2YXJpYWJsZSc6IGtleSwKKyAgICAgICAgICAgICdmaWxlJzogc2VsZi5maWxlbmFtZSwKKyAgICAgICAgICAgICdsaW5lJzogc2VsZi5saW5lbm8sCisgICAgICAgIH0KKyAgICAgICAgaWYgImV4cCIgaW4gZ3JvdXBkIGFuZCBncm91cGRbImV4cCJdICE9IE5vbmU6CisgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoa2V5LCAiZXhwb3J0IiwgMSwgb3AgPSAnZXhwb3J0ZWQnLCAqKmxvZ2luZm8pCisKKyAgICAgICAgb3AgPSAic2V0IgorICAgICAgICBpZiAicXVlcyIgaW4gZ3JvdXBkIGFuZCBncm91cGRbInF1ZXMiXSAhPSBOb25lOgorICAgICAgICAgICAgdmFsID0gc2VsZi5nZXRGdW5jKGtleSwgZGF0YSkKKyAgICAgICAgICAgIG9wID0gInNldD8iCisgICAgICAgICAgICBpZiB2YWwgPT0gTm9uZToKKyAgICAgICAgICAgICAgICB2YWwgPSBncm91cGRbInZhbHVlIl0KKyAgICAgICAgZWxpZiAiY29sb24iIGluIGdyb3VwZCBhbmQgZ3JvdXBkWyJjb2xvbiJdICE9IE5vbmU6CisgICAgICAgICAgICBlID0gZGF0YS5jcmVhdGVDb3B5KCkKKyAgICAgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoZSkKKyAgICAgICAgICAgIG9wID0gImltbWVkaWF0ZSIKKyAgICAgICAgICAgIHZhbCA9IGUuZXhwYW5kKGdyb3VwZFsidmFsdWUiXSwga2V5ICsgIls6PV0iKQorICAgICAgICBlbGlmICJhcHBlbmQiIGluIGdyb3VwZCBhbmQgZ3JvdXBkWyJhcHBlbmQiXSAhPSBOb25lOgorICAgICAgICAgICAgb3AgPSAiYXBwZW5kIgorICAgICAgICAgICAgdmFsID0gIiVzICVzIiAlICgoc2VsZi5nZXRGdW5jKGtleSwgZGF0YSkgb3IgIiIpLCBncm91cGRbInZhbHVlIl0pCisgICAgICAgIGVsaWYgInByZXBlbmQiIGluIGdyb3VwZCBhbmQgZ3JvdXBkWyJwcmVwZW5kIl0gIT0gTm9uZToKKyAgICAgICAgICAgIG9wID0gInByZXBlbmQiCisgICAgICAgICAgICB2YWwgPSAiJXMgJXMiICUgKGdyb3VwZFsidmFsdWUiXSwgKHNlbGYuZ2V0RnVuYyhrZXksIGRhdGEpIG9yICIiKSkKKyAgICAgICAgZWxpZiAicG9zdGRvdCIgaW4gZ3JvdXBkIGFuZCBncm91cGRbInBvc3Rkb3QiXSAhPSBOb25lOgorICAgICAgICAgICAgb3AgPSAicG9zdGRvdCIKKyAgICAgICAgICAgIHZhbCA9ICIlcyVzIiAlICgoc2VsZi5nZXRGdW5jKGtleSwgZGF0YSkgb3IgIiIpLCBncm91cGRbInZhbHVlIl0pCisgICAgICAgIGVsaWYgInByZWRvdCIgaW4gZ3JvdXBkIGFuZCBncm91cGRbInByZWRvdCJdICE9IE5vbmU6CisgICAgICAgICAgICBvcCA9ICJwcmVkb3QiCisgICAgICAgICAgICB2YWwgPSAiJXMlcyIgJSAoZ3JvdXBkWyJ2YWx1ZSJdLCAoc2VsZi5nZXRGdW5jKGtleSwgZGF0YSkgb3IgIiIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsID0gZ3JvdXBkWyJ2YWx1ZSJdCisKKyAgICAgICAgZmxhZyA9IE5vbmUKKyAgICAgICAgaWYgJ2ZsYWcnIGluIGdyb3VwZCBhbmQgZ3JvdXBkWydmbGFnJ10gIT0gTm9uZToKKyAgICAgICAgICAgIGZsYWcgPSBncm91cGRbJ2ZsYWcnXQorICAgICAgICBlbGlmIGdyb3VwZFsibGF6eXF1ZXMiXToKKyAgICAgICAgICAgIGZsYWcgPSAiX2RlZmF1bHR2YWwiCisKKyAgICAgICAgbG9naW5mb1snb3AnXSA9IG9wCisgICAgICAgIGxvZ2luZm9bJ2RldGFpbCddID0gZ3JvdXBkWyJ2YWx1ZSJdCisKKyAgICAgICAgaWYgZmxhZzoKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhrZXksIGZsYWcsIHZhbCwgKipsb2dpbmZvKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YS5zZXRWYXIoa2V5LCB2YWwsIHBhcnNpbmc9VHJ1ZSwgKipsb2dpbmZvKQorCitjbGFzcyBNZXRob2ROb2RlKEFzdE5vZGUpOgorICAgIHRyX3RibCA9IHN0cmluZy5tYWtldHJhbnMoJy8uKy1AJSYnLCAnX19fX19fXycpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgZnVuY19uYW1lLCBib2R5KToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLmZ1bmNfbmFtZSA9IGZ1bmNfbmFtZQorICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKyAgICAgICAgdGV4dCA9ICdcbicuam9pbihzZWxmLmJvZHkpCisgICAgICAgIGlmIHNlbGYuZnVuY19uYW1lID09ICJfX2Fub255bW91cyI6CisgICAgICAgICAgICBmdW5jbmFtZSA9ICgiX19hbm9uXyVzXyVzIiAlIChzZWxmLmxpbmVubywgc2VsZi5maWxlbmFtZS50cmFuc2xhdGUoTWV0aG9kTm9kZS50cl90YmwpKSkKKyAgICAgICAgICAgIHRleHQgPSAiZGVmICVzKGQpOlxuIiAlIChmdW5jbmFtZSkgKyB0ZXh0CisgICAgICAgICAgICBiYi5tZXRob2Rwb29sLmluc2VydF9tZXRob2QoZnVuY25hbWUsIHRleHQsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgICAgICBhbm9uZnVuY3MgPSBkYXRhLmdldFZhcignX19CQkFOT05GVU5DUycsIEZhbHNlKSBvciBbXQorICAgICAgICAgICAgYW5vbmZ1bmNzLmFwcGVuZChmdW5jbmFtZSkKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCdfX0JCQU5PTkZVTkNTJywgYW5vbmZ1bmNzKQorICAgICAgICAgICAgZGF0YS5zZXRWYXIoZnVuY25hbWUsIHRleHQsIHBhcnNpbmc9VHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhzZWxmLmZ1bmNfbmFtZSwgImZ1bmMiLCAxKQorICAgICAgICAgICAgZGF0YS5zZXRWYXIoc2VsZi5mdW5jX25hbWUsIHRleHQsIHBhcnNpbmc9VHJ1ZSkKKworY2xhc3MgUHl0aG9uTWV0aG9kTm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgZnVuY3Rpb24sIG1vZHVsZW5hbWUsIGJvZHkpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuZnVuY3Rpb24gPSBmdW5jdGlvbgorICAgICAgICBzZWxmLm1vZHVsZW5hbWUgPSBtb2R1bGVuYW1lCisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICAjIE5vdGUgd2Ugd2lsbCBhZGQgcm9vdCB0byBwYXJzZWRtZXRob2RzIGFmdGVyIGhhdmluZyBwYXJzZQorICAgICAgICAjICd0aGlzJyBmaWxlLiBUaGlzIG1lYW5zIHdlIHdpbGwgbm90IHBhcnNlIG1ldGhvZHMgZnJvbQorICAgICAgICAjIGJiIGNsYXNzZXMgdHdpY2UKKyAgICAgICAgdGV4dCA9ICdcbicuam9pbihzZWxmLmJvZHkpCisgICAgICAgIGJiLm1ldGhvZHBvb2wuaW5zZXJ0X21ldGhvZChzZWxmLm1vZHVsZW5hbWUsIHRleHQsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhzZWxmLmZ1bmN0aW9uLCAiZnVuYyIsIDEpCisgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhzZWxmLmZ1bmN0aW9uLCAicHl0aG9uIiwgMSkKKyAgICAgICAgZGF0YS5zZXRWYXIoc2VsZi5mdW5jdGlvbiwgdGV4dCwgcGFyc2luZz1UcnVlKQorCitjbGFzcyBNZXRob2RGbGFnc05vZGUoQXN0Tm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIGtleSwgbSk6CisgICAgICAgIEFzdE5vZGUuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi5rZXkgPSBrZXkKKyAgICAgICAgc2VsZi5tID0gbQorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIGRhdGEuZ2V0VmFyKHNlbGYua2V5LCBGYWxzZSk6CisgICAgICAgICAgICAjIGNsZWFuIHVwIG9sZCB2ZXJzaW9uIG9mIHRoaXMgcGllY2Ugb2YgbWV0YWRhdGEsIGFzIGl0cworICAgICAgICAgICAgIyBmbGFncyBjb3VsZCBjYXVzZSBwcm9ibGVtcworICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYua2V5LCAncHl0aG9uJywgTm9uZSkKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhzZWxmLmtleSwgJ2Zha2Vyb290JywgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5tLmdyb3VwKCJweSIpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYua2V5LCAicHl0aG9uIiwgIjEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YS5kZWxWYXJGbGFnKHNlbGYua2V5LCAicHl0aG9uIikKKyAgICAgICAgaWYgc2VsZi5tLmdyb3VwKCJmciIpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKHNlbGYua2V5LCAiZmFrZXJvb3QiLCAiMSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLmRlbFZhckZsYWcoc2VsZi5rZXksICJmYWtlcm9vdCIpCisKK2NsYXNzIEV4cG9ydEZ1bmNzTm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgZm5zLCBjbGFzc25hbWUpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYubiA9IGZucy5zcGxpdCgpCisgICAgICAgIHNlbGYuY2xhc3NuYW1lID0gY2xhc3NuYW1lCisKKyAgICBkZWYgZXZhbChzZWxmLCBkYXRhKToKKworICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLm46CisgICAgICAgICAgICBjYWxsZWRmdW5jID0gc2VsZi5jbGFzc25hbWUgKyAiXyIgKyBmdW5jCisKKyAgICAgICAgICAgIGlmIGRhdGEuZ2V0VmFyKGZ1bmMsIEZhbHNlKSBhbmQgbm90IGRhdGEuZ2V0VmFyRmxhZyhmdW5jLCAnZXhwb3J0X2Z1bmMnKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBkYXRhLmdldFZhcihmdW5jLCBGYWxzZSk6CisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKGZ1bmMsICdweXRob24nLCBOb25lKQorICAgICAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhmdW5jLCAnZnVuYycsIE5vbmUpCisKKyAgICAgICAgICAgIGZvciBmbGFnIGluIFsgImZ1bmMiLCAicHl0aG9uIiBdOgorICAgICAgICAgICAgICAgIGlmIGRhdGEuZ2V0VmFyRmxhZyhjYWxsZWRmdW5jLCBmbGFnKToKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXJGbGFnKGZ1bmMsIGZsYWcsIGRhdGEuZ2V0VmFyRmxhZyhjYWxsZWRmdW5jLCBmbGFnKSkKKyAgICAgICAgICAgIGZvciBmbGFnIGluIFsgImRpcnMiIF06CisgICAgICAgICAgICAgICAgaWYgZGF0YS5nZXRWYXJGbGFnKGZ1bmMsIGZsYWcpOgorICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFZhckZsYWcoY2FsbGVkZnVuYywgZmxhZywgZGF0YS5nZXRWYXJGbGFnKGZ1bmMsIGZsYWcpKQorCisgICAgICAgICAgICBpZiBkYXRhLmdldFZhckZsYWcoY2FsbGVkZnVuYywgInB5dGhvbiIpOgorICAgICAgICAgICAgICAgIGRhdGEuc2V0VmFyKGZ1bmMsICIgICAgYmIuYnVpbGQuZXhlY19mdW5jKCciICsgY2FsbGVkZnVuYyArICInLCBkKVxuIiwgcGFyc2luZz1UcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiAiLSIgaW4gc2VsZi5jbGFzc25hbWU6CisgICAgICAgICAgICAgICAgICAgYmIuZmF0YWwoIlRoZSBjbGFzc25hbWUgJXMgY29udGFpbnMgYSBkYXNoIGNoYXJhY3RlciBhbmQgaXMgY2FsbGluZyBhbiBzaCBmdW5jdGlvbiAlcyB1c2luZyBFWFBPUlRfRlVOQ1RJT05TLiBTaW5jZSBhIGRhc2ggaXMgaWxsZWdhbCBpbiBzaCBmdW5jdGlvbiBuYW1lcywgdGhpcyBjYW5ub3Qgd29yaywgcGxlYXNlIHJlbmFtZSB0aGUgY2xhc3Mgb3IgZG9uJ3QgdXNlIEVYUE9SVF9GVU5DVElPTlMuIiAlIChzZWxmLmNsYXNzbmFtZSwgY2FsbGVkZnVuYykpCisgICAgICAgICAgICAgICAgZGF0YS5zZXRWYXIoZnVuYywgIiAgICAiICsgY2FsbGVkZnVuYyArICJcbiIsIHBhcnNpbmc9VHJ1ZSkKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhmdW5jLCAnZXhwb3J0X2Z1bmMnLCAnMScpCisKK2NsYXNzIEFkZFRhc2tOb2RlKEFzdE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBmdW5jLCBiZWZvcmUsIGFmdGVyKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCisgICAgICAgIHNlbGYuYmVmb3JlID0gYmVmb3JlCisgICAgICAgIHNlbGYuYWZ0ZXIgPSBhZnRlcgorCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGJiLmJ1aWxkLmFkZHRhc2soc2VsZi5mdW5jLCBzZWxmLmJlZm9yZSwgc2VsZi5hZnRlciwgZGF0YSkKKworY2xhc3MgRGVsVGFza05vZGUoQXN0Tm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmMpOgorICAgICAgICBBc3ROb2RlLl9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICBiYi5idWlsZC5kZWx0YXNrKHNlbGYuZnVuYywgZGF0YSkKKworY2xhc3MgQkJIYW5kbGVyTm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgZm5zKToKKyAgICAgICAgQXN0Tm9kZS5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLmhzID0gZm5zLnNwbGl0KCkKKworICAgIGRlZiBldmFsKHNlbGYsIGRhdGEpOgorICAgICAgICBiYmhhbmRzID0gZGF0YS5nZXRWYXIoJ19fQkJIQU5ETEVSUycsIEZhbHNlKSBvciBbXQorICAgICAgICBmb3IgaCBpbiBzZWxmLmhzOgorICAgICAgICAgICAgYmJoYW5kcy5hcHBlbmQoaCkKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyRmxhZyhoLCAiaGFuZGxlciIsIDEpCisgICAgICAgIGRhdGEuc2V0VmFyKCdfX0JCSEFORExFUlMnLCBiYmhhbmRzKQorCitjbGFzcyBJbmhlcml0Tm9kZShBc3ROb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgY2xhc3Nlcyk6CisgICAgICAgIEFzdE5vZGUuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgc2VsZi5jbGFzc2VzID0gY2xhc3NlcworCisgICAgZGVmIGV2YWwoc2VsZiwgZGF0YSk6CisgICAgICAgIGJiLnBhcnNlLkJCSGFuZGxlci5pbmhlcml0KHNlbGYuY2xhc3Nlcywgc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8sIGRhdGEpCisKK2RlZiBoYW5kbGVJbmNsdWRlKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIG0sIGZvcmNlKToKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChJbmNsdWRlTm9kZShmaWxlbmFtZSwgbGluZW5vLCBtLmdyb3VwKDEpLCBmb3JjZSkpCisKK2RlZiBoYW5kbGVFeHBvcnQoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgbSk6CisgICAgc3RhdGVtZW50cy5hcHBlbmQoRXhwb3J0Tm9kZShmaWxlbmFtZSwgbGluZW5vLCBtLmdyb3VwKDEpKSkKKworZGVmIGhhbmRsZURhdGEoc3RhdGVtZW50cywgZmlsZW5hbWUsIGxpbmVubywgZ3JvdXBkKToKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChEYXRhTm9kZShmaWxlbmFtZSwgbGluZW5vLCBncm91cGQpKQorCitkZWYgaGFuZGxlTWV0aG9kKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNfbmFtZSwgYm9keSk6CisgICAgc3RhdGVtZW50cy5hcHBlbmQoTWV0aG9kTm9kZShmaWxlbmFtZSwgbGluZW5vLCBmdW5jX25hbWUsIGJvZHkpKQorCitkZWYgaGFuZGxlUHl0aG9uTWV0aG9kKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lLCBtb2R1bGVuYW1lLCBib2R5KToKKyAgICBzdGF0ZW1lbnRzLmFwcGVuZChQeXRob25NZXRob2ROb2RlKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lLCBtb2R1bGVuYW1lLCBib2R5KSkKKworZGVmIGhhbmRsZU1ldGhvZEZsYWdzKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIGtleSwgbSk6CisgICAgc3RhdGVtZW50cy5hcHBlbmQoTWV0aG9kRmxhZ3NOb2RlKGZpbGVuYW1lLCBsaW5lbm8sIGtleSwgbSkpCisKK2RlZiBoYW5kbGVFeHBvcnRGdW5jcyhzdGF0ZW1lbnRzLCBmaWxlbmFtZSwgbGluZW5vLCBtLCBjbGFzc25hbWUpOgorICAgIHN0YXRlbWVudHMuYXBwZW5kKEV4cG9ydEZ1bmNzTm9kZShmaWxlbmFtZSwgbGluZW5vLCBtLmdyb3VwKDEpLCBjbGFzc25hbWUpKQorCitkZWYgaGFuZGxlQWRkVGFzayhzdGF0ZW1lbnRzLCBmaWxlbmFtZSwgbGluZW5vLCBtKToKKyAgICBmdW5jID0gbS5ncm91cCgiZnVuYyIpCisgICAgYmVmb3JlID0gbS5ncm91cCgiYmVmb3JlIikKKyAgICBhZnRlciA9IG0uZ3JvdXAoImFmdGVyIikKKyAgICBpZiBmdW5jIGlzIE5vbmU6CisgICAgICAgIHJldHVybgorCisgICAgc3RhdGVtZW50cy5hcHBlbmQoQWRkVGFza05vZGUoZmlsZW5hbWUsIGxpbmVubywgZnVuYywgYmVmb3JlLCBhZnRlcikpCisKK2RlZiBoYW5kbGVEZWxUYXNrKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIG0pOgorICAgIGZ1bmMgPSBtLmdyb3VwKCJmdW5jIikKKyAgICBpZiBmdW5jIGlzIE5vbmU6CisgICAgICAgIHJldHVybgorCisgICAgc3RhdGVtZW50cy5hcHBlbmQoRGVsVGFza05vZGUoZmlsZW5hbWUsIGxpbmVubywgZnVuYykpCisKK2RlZiBoYW5kbGVCQkhhbmRsZXJzKHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIG0pOgorICAgIHN0YXRlbWVudHMuYXBwZW5kKEJCSGFuZGxlck5vZGUoZmlsZW5hbWUsIGxpbmVubywgbS5ncm91cCgxKSkpCisKK2RlZiBoYW5kbGVJbmhlcml0KHN0YXRlbWVudHMsIGZpbGVuYW1lLCBsaW5lbm8sIG0pOgorICAgIGNsYXNzZXMgPSBtLmdyb3VwKDEpCisgICAgc3RhdGVtZW50cy5hcHBlbmQoSW5oZXJpdE5vZGUoZmlsZW5hbWUsIGxpbmVubywgY2xhc3NlcykpCisKK2RlZiBmaW5hbGl6ZShmbiwgZCwgdmFyaWFudCA9IE5vbmUpOgorICAgIGFsbF9oYW5kbGVycyA9IHt9CisgICAgZm9yIHZhciBpbiBkLmdldFZhcignX19CQkhBTkRMRVJTJywgRmFsc2UpIG9yIFtdOgorICAgICAgICAjIHRyeSB0byBhZGQgdGhlIGhhbmRsZXIKKyAgICAgICAgYmIuZXZlbnQucmVnaXN0ZXIodmFyLCBkLmdldFZhcih2YXIsIEZhbHNlKSwgKGQuZ2V0VmFyRmxhZyh2YXIsICJldmVudG1hc2siLCBUcnVlKSBvciAiIikuc3BsaXQoKSkKKworICAgIGJiLmV2ZW50LmZpcmUoYmIuZXZlbnQuUmVjaXBlUHJlRmluYWxpc2UoZm4pLCBkKQorCisgICAgYmIuZGF0YS5leHBhbmRLZXlzKGQpCisgICAgYmIuZGF0YS51cGRhdGVfZGF0YShkKQorICAgIGNvZGUgPSBbXQorICAgIGZvciBmdW5jbmFtZSBpbiBkLmdldFZhcigiX19CQkFOT05GVU5DUyIsIEZhbHNlKSBvciBbXToKKyAgICAgICAgY29kZS5hcHBlbmQoIiVzKGQpIiAlIGZ1bmNuYW1lKQorICAgIGJiLnV0aWxzLmJldHRlcl9leGVjKCJcbiIuam9pbihjb2RlKSwgeyJkIjogZH0pCisgICAgYmIuZGF0YS51cGRhdGVfZGF0YShkKQorCisgICAgdGFza2xpc3QgPSBkLmdldFZhcignX19CQlRBU0tTJywgRmFsc2UpIG9yIFtdCisgICAgYmIuYnVpbGQuYWRkX3Rhc2tzKHRhc2tsaXN0LCBkKQorCisgICAgYmIucGFyc2Uuc2lnZ2VuLmZpbmFsaXNlKGZuLCBkLCB2YXJpYW50KQorCisgICAgZC5zZXRWYXIoJ0JCSU5DTFVERUQnLCBiYi5wYXJzZS5nZXRfZmlsZV9kZXBlbmRzKGQpKQorCisgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5SZWNpcGVQYXJzZWQoZm4pLCBkKQorCitkZWYgX2NyZWF0ZV92YXJpYW50cyhkYXRhc3RvcmVzLCBuYW1lcywgZnVuY3Rpb24sIG9ubHlmaW5hbGlzZSk6CisgICAgZGVmIGNyZWF0ZV92YXJpYW50KG5hbWUsIG9yaWdfZCwgYXJnID0gTm9uZSk6CisgICAgICAgIGlmIG9ubHlmaW5hbGlzZSBhbmQgbmFtZSBub3QgaW4gb25seWZpbmFsaXNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5ld19kID0gYmIuZGF0YS5jcmVhdGVDb3B5KG9yaWdfZCkKKyAgICAgICAgZnVuY3Rpb24oYXJnIG9yIG5hbWUsIG5ld19kKQorICAgICAgICBkYXRhc3RvcmVzW25hbWVdID0gbmV3X2QKKworICAgIGZvciB2YXJpYW50LCB2YXJpYW50X2QgaW4gZGF0YXN0b3Jlcy5pdGVtcygpOgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCB2YXJpYW50OgorICAgICAgICAgICAgICAgICMgQmFzZWQgb24gbWFpbiByZWNpcGUKKyAgICAgICAgICAgICAgICBjcmVhdGVfdmFyaWFudChuYW1lLCB2YXJpYW50X2QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNyZWF0ZV92YXJpYW50KCIlcy0lcyIgJSAodmFyaWFudCwgbmFtZSksIHZhcmlhbnRfZCwgbmFtZSkKKworZGVmIF9leHBhbmRfdmVyc2lvbnModmVyc2lvbnMpOgorICAgIGRlZiBleHBhbmRfb25lKHZlcnNpb24sIHN0YXJ0LCBlbmQpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc3RhcnQsIGVuZCArIDEpOgorICAgICAgICAgICAgdmVyID0gX2JidmVyc2lvbnNfcmUuc3ViKHN0cihpKSwgdmVyc2lvbiwgMSkKKyAgICAgICAgICAgIHlpZWxkIHZlcgorCisgICAgdmVyc2lvbnMgPSBpdGVyKHZlcnNpb25zKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZlcnNpb24gPSBuZXh0KHZlcnNpb25zKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgcmFuZ2VfdmVyID0gX2JidmVyc2lvbnNfcmUuc2VhcmNoKHZlcnNpb24pCisgICAgICAgIGlmIG5vdCByYW5nZV92ZXI6CisgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXd2ZXJzaW9ucyA9IGV4cGFuZF9vbmUodmVyc2lvbiwgaW50KHJhbmdlX3Zlci5ncm91cCgiZnJvbSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQocmFuZ2VfdmVyLmdyb3VwKCJ0byIpKSkKKyAgICAgICAgICAgIHZlcnNpb25zID0gaXRlcnRvb2xzLmNoYWluKG5ld3ZlcnNpb25zLCB2ZXJzaW9ucykKKworZGVmIG11bHRpX2ZpbmFsaXplKGZuLCBkKToKKyAgICBhcHBlbmRzID0gKGQuZ2V0VmFyKCJfX0JCQVBQRU5EIiwgVHJ1ZSkgb3IgIiIpLnNwbGl0KCkKKyAgICBmb3IgYXBwZW5kIGluIGFwcGVuZHM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiQXBwZW5kaW5nIC5iYmFwcGVuZCBmaWxlICVzIHRvICVzIiwgYXBwZW5kLCBmbikKKyAgICAgICAgYmIucGFyc2UuQkJIYW5kbGVyLmhhbmRsZShhcHBlbmQsIGQsIFRydWUpCisKKyAgICBvbmx5ZmluYWxpc2UgPSBkLmdldFZhcigiX19PTkxZRklOQUxJU0UiLCBGYWxzZSkKKworICAgIHNhZmVfZCA9IGQKKyAgICBkID0gYmIuZGF0YS5jcmVhdGVDb3B5KHNhZmVfZCkKKyAgICB0cnk6CisgICAgICAgIGZpbmFsaXplKGZuLCBkKQorICAgIGV4Y2VwdCBiYi5wYXJzZS5Ta2lwUmVjaXBlIGFzIGU6CisgICAgICAgIGQuc2V0VmFyKCJfX1NLSVBQRUQiLCBlLmFyZ3NbMF0pCisgICAgZGF0YXN0b3JlcyA9IHsiIjogc2FmZV9kfQorCisgICAgdmVyc2lvbnMgPSAoZC5nZXRWYXIoIkJCVkVSU0lPTlMiLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgIGlmIHZlcnNpb25zOgorICAgICAgICBwdiA9IG9yaWdfcHYgPSBkLmdldFZhcigiUFYiLCBUcnVlKQorICAgICAgICBiYXNldmVyc2lvbnMgPSB7fQorCisgICAgICAgIGRlZiB2ZXJmdW5jKHZlciwgZCwgcHZfZCA9IE5vbmUpOgorICAgICAgICAgICAgaWYgcHZfZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHB2X2QgPSBkCisKKyAgICAgICAgICAgIG92ZXJyaWRlcyA9IGQuZ2V0VmFyKCJPVkVSUklERVMiLCBUcnVlKS5zcGxpdCgiOiIpCisgICAgICAgICAgICBwdl9kLnNldFZhcigiUFYiLCB2ZXIpCisgICAgICAgICAgICBvdmVycmlkZXMuYXBwZW5kKHZlcikKKyAgICAgICAgICAgIGJwdiA9IGJhc2V2ZXJzaW9ucy5nZXQodmVyKSBvciBvcmlnX3B2CisgICAgICAgICAgICBwdl9kLnNldFZhcigiQlBWIiwgYnB2KQorICAgICAgICAgICAgb3ZlcnJpZGVzLmFwcGVuZChicHYpCisgICAgICAgICAgICBkLnNldFZhcigiT1ZFUlJJREVTIiwgIjoiLmpvaW4ob3ZlcnJpZGVzKSkKKworICAgICAgICB2ZXJzaW9ucyA9IGxpc3QoX2V4cGFuZF92ZXJzaW9ucyh2ZXJzaW9ucykpCisgICAgICAgIGZvciBwb3MsIHZlcnNpb24gaW4gZW51bWVyYXRlKGxpc3QodmVyc2lvbnMpKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwdiwgYnB2ID0gdmVyc2lvbi5zcGxpdCgiOiIsIDIpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZlcnNpb25zW3Bvc10gPSBwdgorICAgICAgICAgICAgICAgIGJhc2V2ZXJzaW9uc1twdl0gPSBicHYKKworICAgICAgICBpZiBwdiBpbiB2ZXJzaW9ucyBhbmQgbm90IGJhc2V2ZXJzaW9ucy5nZXQocHYpOgorICAgICAgICAgICAgdmVyc2lvbnMucmVtb3ZlKHB2KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHYgPSB2ZXJzaW9ucy5wb3AoKQorCisgICAgICAgICAgICAjIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3VyIGV4aXN0aW5nIG1haW4gZGF0YXN0b3JlCisgICAgICAgICAgICAjIGhhcyBhbHJlYWR5IGJlZW4gZmluYWxpemVkIHdpdGggdGhlIG9sZCBQViwgd2UgbmVlZCBvbmUKKyAgICAgICAgICAgICMgdGhhdCdzIGJlZW4gZmluYWxpemVkIHdpdGggdGhlIG5ldyBQVi4KKyAgICAgICAgICAgIGQgPSBiYi5kYXRhLmNyZWF0ZUNvcHkoc2FmZV9kKQorICAgICAgICAgICAgdmVyZnVuYyhwdiwgZCwgc2FmZV9kKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbmFsaXplKGZuLCBkKQorICAgICAgICAgICAgZXhjZXB0IGJiLnBhcnNlLlNraXBSZWNpcGUgYXMgZToKKyAgICAgICAgICAgICAgICBkLnNldFZhcigiX19TS0lQUEVEIiwgZS5hcmdzWzBdKQorCisgICAgICAgIF9jcmVhdGVfdmFyaWFudHMoZGF0YXN0b3JlcywgdmVyc2lvbnMsIHZlcmZ1bmMsIG9ubHlmaW5hbGlzZSkKKworICAgIGV4dGVuZGVkID0gZC5nZXRWYXIoIkJCQ0xBU1NFWFRFTkQiLCBUcnVlKSBvciAiIgorICAgIGlmIGV4dGVuZGVkOgorICAgICAgICAjIHRoZSBmb2xsb3dpbmcgaXMgdG8gc3VwcG9ydCBiYmV4dGVuZHMgd2l0aCBhcmd1bWVudHMsIGZvciBlLmcuIG11bHRpbGliCisgICAgICAgICMgYW4gZXhhbXBsZSBpcyBhcyBmb2xsb3dzOgorICAgICAgICAjICAgQkJDTEFTU0VYVEVORCA9ICJtdWx0aWxpYjpsaWIzMiIKKyAgICAgICAgIyBpdCB3aWxsIGNyZWF0ZSBmb28tbGliMzIsIGluaGVyaXRpbmcgbXVsdGlsaWIuYmJjbGFzcyBhbmQgc2V0CisgICAgICAgICMgQkJFWFRFTkRDVVJSIHRvICJtdWx0aWxpYiIgYW5kIEJCRVhURU5EVkFSSUFOVCB0byAibGliMzIiCisgICAgICAgIGV4dGVuZGVkbWFwID0ge30KKyAgICAgICAgdmFyaWFudG1hcCA9IHt9CisKKyAgICAgICAgZm9yIGV4dCBpbiBleHRlbmRlZC5zcGxpdCgpOgorICAgICAgICAgICAgZWV4dCA9IGV4dC5zcGxpdCgnOicsIDIpCisgICAgICAgICAgICBpZiBsZW4oZWV4dCkgPiAxOgorICAgICAgICAgICAgICAgIGV4dGVuZGVkbWFwW2V4dF0gPSBlZXh0WzBdCisgICAgICAgICAgICAgICAgdmFyaWFudG1hcFtleHRdID0gZWV4dFsxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHRlbmRlZG1hcFtleHRdID0gZXh0CisKKyAgICAgICAgcG4gPSBkLmdldFZhcigiUE4iLCBUcnVlKQorICAgICAgICBkZWYgZXh0ZW5kZnVuYyhuYW1lLCBkKToKKyAgICAgICAgICAgIGlmIG5hbWUgIT0gZXh0ZW5kZWRtYXBbbmFtZV06CisgICAgICAgICAgICAgICAgZC5zZXRWYXIoIkJCRVhURU5EQ1VSUiIsIGV4dGVuZGVkbWFwW25hbWVdKQorICAgICAgICAgICAgICAgIGQuc2V0VmFyKCJCQkVYVEVORFZBUklBTlQiLCB2YXJpYW50bWFwW25hbWVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkLnNldFZhcigiUE4iLCAiJXMtJXMiICUgKHBuLCBuYW1lKSkKKyAgICAgICAgICAgIGJiLnBhcnNlLkJCSGFuZGxlci5pbmhlcml0KGV4dGVuZGVkbWFwW25hbWVdLCBmbiwgMCwgZCkKKworICAgICAgICBzYWZlX2Quc2V0VmFyKCJCQkNMQVNTRVhURU5EIiwgZXh0ZW5kZWQpCisgICAgICAgIF9jcmVhdGVfdmFyaWFudHMoZGF0YXN0b3JlcywgZXh0ZW5kZWRtYXAua2V5cygpLCBleHRlbmRmdW5jLCBvbmx5ZmluYWxpc2UpCisKKyAgICBmb3IgdmFyaWFudCwgdmFyaWFudF9kIGluIGRhdGFzdG9yZXMuaXRlcml0ZW1zKCk6CisgICAgICAgIGlmIHZhcmlhbnQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbm90IG9ubHlmaW5hbGlzZSBvciB2YXJpYW50IGluIG9ubHlmaW5hbGlzZToKKyAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoZm4sIHZhcmlhbnRfZCwgdmFyaWFudCkKKyAgICAgICAgICAgIGV4Y2VwdCBiYi5wYXJzZS5Ta2lwUmVjaXBlIGFzIGU6CisgICAgICAgICAgICAgICAgdmFyaWFudF9kLnNldFZhcigiX19TS0lQUEVEIiwgZS5hcmdzWzBdKQorCisgICAgaWYgbGVuKGRhdGFzdG9yZXMpID4gMToKKyAgICAgICAgdmFyaWFudHMgPSBmaWx0ZXIoTm9uZSwgZGF0YXN0b3Jlcy5pdGVya2V5cygpKQorICAgICAgICBzYWZlX2Quc2V0VmFyKCJfX1ZBUklBTlRTIiwgIiAiLmpvaW4odmFyaWFudHMpKQorCisgICAgZGF0YXN0b3Jlc1siIl0gPSBkCisgICAgcmV0dXJuIGRhdGFzdG9yZXMKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0JCSGFuZGxlci5weSBiL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0JCSGFuZGxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzA5N2JhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcGFyc2UvcGFyc2VfcHkvQkJIYW5kbGVyLnB5CkBAIC0wLDAgKzEsMjY1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKKyAgIGNsYXNzIGZvciBoYW5kbGluZyAuYmIgZmlsZXMKKworICAgUmVhZHMgYSAuYmIgZmlsZSBhbmQgb2J0YWlucyBpdHMgbWV0YWRhdGEKKworIiIiCisKKworIyAgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUGhpbCBCbHVuZGVsbAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2ltcG9ydCByZSwgYmIsIG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiLmJ1aWxkLCBiYi51dGlscworZnJvbSBiYiBpbXBvcnQgZGF0YQorCitmcm9tIC4gaW1wb3J0IENvbmZIYW5kbGVyCitmcm9tIC4uIGltcG9ydCByZXNvbHZlX2ZpbGUsIGFzdCwgbG9nZ2VyLCBQYXJzZUVycm9yCitmcm9tIC5Db25mSGFuZGxlciBpbXBvcnQgaW5jbHVkZSwgaW5pdAorCisjIEZvciBjb21wYXRpYmlsaXR5CitiYi5kZXByZWNhdGVfaW1wb3J0KF9fbmFtZV9fLCAiYmIucGFyc2UiLCBbInZhcnNfZnJvbV9maWxlIl0pCisKK19fZnVuY19zdGFydF9yZWdleHBfXyAgICA9IHJlLmNvbXBpbGUoIHIiKCgoP1A8cHk+cHl0aG9uKXwoP1A8ZnI+ZmFrZXJvb3QpKVxzKikqKD9QPGZ1bmM+W1x3XC5cLVwrXHtcfVwkXSspP1xzKlwoXHMqXClccyp7JCIgKQorX19pbmhlcml0X3JlZ2V4cF9fICAgICAgID0gcmUuY29tcGlsZSggciJpbmhlcml0XHMrKC4rKSIgKQorX19leHBvcnRfZnVuY19yZWdleHBfXyAgID0gcmUuY29tcGlsZSggciJFWFBPUlRfRlVOQ1RJT05TXHMrKC4rKSIgKQorX19hZGR0YXNrX3JlZ2V4cF9fICAgICAgID0gcmUuY29tcGlsZSgiYWRkdGFza1xzKyg/UDxmdW5jPlx3KylccyooKGJlZm9yZVxzKig/UDxiZWZvcmU+KCguKig/PWFmdGVyKSl8KC4qKSkpKXwoYWZ0ZXJccyooP1A8YWZ0ZXI+KCguKig/PWJlZm9yZSkpfCguKikpKSkpKiIpCitfX2RlbHRhc2tfcmVnZXhwX18gICAgICAgPSByZS5jb21waWxlKCJkZWx0YXNrXHMrKD9QPGZ1bmM+XHcrKSIpCitfX2FkZGhhbmRsZXJfcmVnZXhwX18gICAgPSByZS5jb21waWxlKCByImFkZGhhbmRsZXJccysoLispIiApCitfX2RlZl9yZWdleHBfXyAgICAgICAgICAgPSByZS5jb21waWxlKCByImRlZlxzKyhcdyspLio6IiApCitfX3B5dGhvbl9mdW5jX3JlZ2V4cF9fICAgPSByZS5jb21waWxlKCByIihccysuKil8KF4kKSIgKQorCisKK19faW5mdW5jX18gPSBbXQorX19pbnB5dGhvbl9fID0gRmFsc2UKK19fYm9keV9fICAgPSBbXQorX19jbGFzc25hbWVfXyA9ICIiCisKK2NhY2hlZF9zdGF0ZW1lbnRzID0ge30KKworIyBXZSBuZWVkIHRvIGluZGljYXRlIEVPRiB0byB0aGUgZmVlZGVyLiBUaGlzIGNvZGUgaXMgc28gbWVzc3kgdGhhdAorIyBmYWN0b3JpbmcgaXQgb3V0IHRvIGEgY2xvc2VfcGFyc2VfZmlsZSBtZXRob2QgaXMgb3V0IG9mIHF1ZXN0aW9uLgorIyBXZSB3aWxsIHVzZSB0aGUgSU5fUFlUSE9OX0VPRiBhcyBhbiBpbmRpY2F0b3IgdG8ganVzdCBjbG9zZSB0aGUgbWV0aG9kCisjCisjIFRoZSB0d28gcGFydHMgdXNpbmcgaXQgYXJlIHRpZ2h0bHkgaW50ZWdyYXRlZCBhbnl3YXkKK0lOX1BZVEhPTl9FT0YgPSAtOTk5OTk5OTk5OTk5OQorCisKKworZGVmIHN1cHBvcnRzKGZuLCBkKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBmbiBoYXMgYSBzdXBwb3J0ZWQgZXh0ZW5zaW9uIiIiCisgICAgcmV0dXJuIG9zLnBhdGguc3BsaXRleHQoZm4pWy0xXSBpbiBbIi5iYiIsICIuYmJjbGFzcyIsICIuaW5jIl0KKworZGVmIGluaGVyaXQoZmlsZXMsIGZuLCBsaW5lbm8sIGQpOgorICAgIF9faW5oZXJpdF9jYWNoZSA9IGQuZ2V0VmFyKCdfX2luaGVyaXRfY2FjaGUnLCBGYWxzZSkgb3IgW10KKyAgICBmaWxlcyA9IGQuZXhwYW5kKGZpbGVzKS5zcGxpdCgpCisgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGZpbGUpIGFuZCBub3QgZmlsZS5lbmRzd2l0aCgiLmJiY2xhc3MiKToKKyAgICAgICAgICAgIGZpbGUgPSBvcy5wYXRoLmpvaW4oJ2NsYXNzZXMnLCAnJXMuYmJjbGFzcycgJSBmaWxlKQorCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGZpbGUpOgorICAgICAgICAgICAgYmJwYXRoID0gZC5nZXRWYXIoIkJCUEFUSCIsIFRydWUpCisgICAgICAgICAgICBhYnNfZm4sIGF0dGVtcHRzID0gYmIudXRpbHMud2hpY2goYmJwYXRoLCBmaWxlLCBoaXN0b3J5PVRydWUpCisgICAgICAgICAgICBmb3IgYWYgaW4gYXR0ZW1wdHM6CisgICAgICAgICAgICAgICAgaWYgYWYgIT0gYWJzX2ZuOgorICAgICAgICAgICAgICAgICAgICBiYi5wYXJzZS5tYXJrX2RlcGVuZGVuY3koZCwgYWYpCisgICAgICAgICAgICBpZiBhYnNfZm46CisgICAgICAgICAgICAgICAgZmlsZSA9IGFic19mbgorCisgICAgICAgIGlmIG5vdCBmaWxlIGluIF9faW5oZXJpdF9jYWNoZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiSW5oZXJpdGluZyAlcyAoZnJvbSAlczolZCkiICUgKGZpbGUsIGZuLCBsaW5lbm8pKQorICAgICAgICAgICAgX19pbmhlcml0X2NhY2hlLmFwcGVuZCggZmlsZSApCisgICAgICAgICAgICBkLnNldFZhcignX19pbmhlcml0X2NhY2hlJywgX19pbmhlcml0X2NhY2hlKQorICAgICAgICAgICAgaW5jbHVkZShmbiwgZmlsZSwgbGluZW5vLCBkLCAiaW5oZXJpdCIpCisgICAgICAgICAgICBfX2luaGVyaXRfY2FjaGUgPSBkLmdldFZhcignX19pbmhlcml0X2NhY2hlJywgRmFsc2UpIG9yIFtdCisKK2RlZiBnZXRfc3RhdGVtZW50cyhmaWxlbmFtZSwgYWJzb2x1dGVfZmlsZW5hbWUsIGJhc2VfbmFtZSk6CisgICAgZ2xvYmFsIGNhY2hlZF9zdGF0ZW1lbnRzCisKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjYWNoZWRfc3RhdGVtZW50c1thYnNvbHV0ZV9maWxlbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGZpbGUgPSBvcGVuKGFic29sdXRlX2ZpbGVuYW1lLCAncicpCisgICAgICAgIHN0YXRlbWVudHMgPSBhc3QuU3RhdGVtZW50R3JvdXAoKQorCisgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgIHMgPSBmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBzOiBicmVhaworICAgICAgICAgICAgcyA9IHMucnN0cmlwKCkKKyAgICAgICAgICAgIGZlZWRlcihsaW5lbm8sIHMsIGZpbGVuYW1lLCBiYXNlX25hbWUsIHN0YXRlbWVudHMpCisgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICBpZiBfX2lucHl0aG9uX186CisgICAgICAgICAgICAjIGFkZCBhIGJsYW5rIGxpbmUgdG8gY2xvc2Ugb3V0IGFueSBweXRob24gZGVmaW5pdGlvbgorICAgICAgICAgICAgZmVlZGVyKElOX1BZVEhPTl9FT0YsICIiLCBmaWxlbmFtZSwgYmFzZV9uYW1lLCBzdGF0ZW1lbnRzKQorCisgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIuYmJjbGFzcyIpIG9yIGZpbGVuYW1lLmVuZHN3aXRoKCIuaW5jIik6CisgICAgICAgICAgICBjYWNoZWRfc3RhdGVtZW50c1thYnNvbHV0ZV9maWxlbmFtZV0gPSBzdGF0ZW1lbnRzCisgICAgICAgIHJldHVybiBzdGF0ZW1lbnRzCisKK2RlZiBoYW5kbGUoZm4sIGQsIGluY2x1ZGUpOgorICAgIGdsb2JhbCBfX2Z1bmNfc3RhcnRfcmVnZXhwX18sIF9faW5oZXJpdF9yZWdleHBfXywgX19leHBvcnRfZnVuY19yZWdleHBfXywgX19hZGR0YXNrX3JlZ2V4cF9fLCBfX2FkZGhhbmRsZXJfcmVnZXhwX18sIF9faW5mdW5jX18sIF9fYm9keV9fLCBfX3Jlc2lkdWVfXywgX19jbGFzc25hbWVfXworICAgIF9fYm9keV9fID0gW10KKyAgICBfX2luZnVuY19fID0gW10KKyAgICBfX2NsYXNzbmFtZV9fID0gIiIKKyAgICBfX3Jlc2lkdWVfXyA9IFtdCisKKyAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZuKQorICAgIChyb290LCBleHQpID0gb3MucGF0aC5zcGxpdGV4dChiYXNlX25hbWUpCisgICAgaW5pdChkKQorCisgICAgaWYgZXh0ID09ICIuYmJjbGFzcyI6CisgICAgICAgIF9fY2xhc3NuYW1lX18gPSByb290CisgICAgICAgIF9faW5oZXJpdF9jYWNoZSA9IGQuZ2V0VmFyKCdfX2luaGVyaXRfY2FjaGUnLCBGYWxzZSkgb3IgW10KKyAgICAgICAgaWYgbm90IGZuIGluIF9faW5oZXJpdF9jYWNoZToKKyAgICAgICAgICAgIF9faW5oZXJpdF9jYWNoZS5hcHBlbmQoZm4pCisgICAgICAgICAgICBkLnNldFZhcignX19pbmhlcml0X2NhY2hlJywgX19pbmhlcml0X2NhY2hlKQorCisgICAgaWYgaW5jbHVkZSAhPSAwOgorICAgICAgICBvbGRmaWxlID0gZC5nZXRWYXIoJ0ZJTEUnLCBGYWxzZSkKKyAgICBlbHNlOgorICAgICAgICBvbGRmaWxlID0gTm9uZQorCisgICAgYWJzX2ZuID0gcmVzb2x2ZV9maWxlKGZuLCBkKQorCisgICAgaWYgaW5jbHVkZToKKyAgICAgICAgYmIucGFyc2UubWFya19kZXBlbmRlbmN5KGQsIGFic19mbikKKworICAgICMgYWN0dWFsIGxvYWRpbmcKKyAgICBzdGF0ZW1lbnRzID0gZ2V0X3N0YXRlbWVudHMoZm4sIGFic19mbiwgYmFzZV9uYW1lKQorCisgICAgIyBET05FIFdJVEggUEFSU0lORy4uLiB0aW1lIHRvIGV2YWx1YXRlCisgICAgaWYgZXh0ICE9ICIuYmJjbGFzcyIgYW5kIGFic19mbiAhPSBvbGRmaWxlOgorICAgICAgICBkLnNldFZhcignRklMRScsIGFic19mbikKKworICAgIHRyeToKKyAgICAgICAgc3RhdGVtZW50cy5ldmFsKGQpCisgICAgZXhjZXB0IGJiLnBhcnNlLlNraXBSZWNpcGU6CisgICAgICAgIGJiLmRhdGEuc2V0VmFyKCJfX1NLSVBQRUQiLCBUcnVlLCBkKQorICAgICAgICBpZiBpbmNsdWRlID09IDA6CisgICAgICAgICAgICByZXR1cm4geyAiIiA6IGQgfQorCisgICAgaWYgX19pbmZ1bmNfXzoKKyAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigiU2hlbGwgZnVuY3Rpb24gJXMgaXMgbmV2ZXIgY2xvc2VkIiAlIF9faW5mdW5jX19bMF0sIF9faW5mdW5jX19bMV0sIF9faW5mdW5jX19bMl0pCisgICAgaWYgX19yZXNpZHVlX186CisgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoIkxlZnRvdmVyIHVucGFyc2VkIChpbmNvbXBsZXRlPykgZGF0YSAlcyBmcm9tICVzIiAlIF9fcmVzaWR1ZV9fLCBmbikKKworICAgIGlmIGV4dCAhPSAiLmJiY2xhc3MiIGFuZCBpbmNsdWRlID09IDA6CisgICAgICAgIHJldHVybiBhc3QubXVsdGlfZmluYWxpemUoZm4sIGQpCisKKyAgICBpZiBleHQgIT0gIi5iYmNsYXNzIiBhbmQgb2xkZmlsZSBhbmQgYWJzX2ZuICE9IG9sZGZpbGU6CisgICAgICAgIGQuc2V0VmFyKCJGSUxFIiwgb2xkZmlsZSkKKworICAgIHJldHVybiBkCisKK2RlZiBmZWVkZXIobGluZW5vLCBzLCBmbiwgcm9vdCwgc3RhdGVtZW50cyk6CisgICAgZ2xvYmFsIF9fZnVuY19zdGFydF9yZWdleHBfXywgX19pbmhlcml0X3JlZ2V4cF9fLCBfX2V4cG9ydF9mdW5jX3JlZ2V4cF9fLCBfX2FkZHRhc2tfcmVnZXhwX18sIF9fYWRkaGFuZGxlcl9yZWdleHBfXywgX19kZWZfcmVnZXhwX18sIF9fcHl0aG9uX2Z1bmNfcmVnZXhwX18sIF9faW5weXRob25fXywgX19pbmZ1bmNfXywgX19ib2R5X18sIGJiLCBfX3Jlc2lkdWVfXywgX19jbGFzc25hbWVfXworICAgIGlmIF9faW5mdW5jX186CisgICAgICAgIGlmIHMgPT0gJ30nOgorICAgICAgICAgICAgX19ib2R5X18uYXBwZW5kKCcnKQorICAgICAgICAgICAgYXN0LmhhbmRsZU1ldGhvZChzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBfX2luZnVuY19fWzBdLCBfX2JvZHlfXykKKyAgICAgICAgICAgIF9faW5mdW5jX18gPSBbXQorICAgICAgICAgICAgX19ib2R5X18gPSBbXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgX19ib2R5X18uYXBwZW5kKHMpCisgICAgICAgIHJldHVybgorCisgICAgaWYgX19pbnB5dGhvbl9fOgorICAgICAgICBtID0gX19weXRob25fZnVuY19yZWdleHBfXy5tYXRjaChzKQorICAgICAgICBpZiBtIGFuZCBsaW5lbm8gIT0gSU5fUFlUSE9OX0VPRjoKKyAgICAgICAgICAgIF9fYm9keV9fLmFwcGVuZChzKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3QuaGFuZGxlUHl0aG9uTWV0aG9kKHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIF9faW5weXRob25fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCwgX19ib2R5X18pCisgICAgICAgICAgICBfX2JvZHlfXyA9IFtdCisgICAgICAgICAgICBfX2lucHl0aG9uX18gPSBGYWxzZQorCisgICAgICAgICAgICBpZiBsaW5lbm8gPT0gSU5fUFlUSE9OX0VPRjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgIGlmIHMgYW5kIHNbMF0gPT0gJyMnOgorICAgICAgICBpZiBsZW4oX19yZXNpZHVlX18pICE9IDAgYW5kIF9fcmVzaWR1ZV9fWzBdWzBdICE9ICIjIjoKKyAgICAgICAgICAgIGJiLmZhdGFsKCJUaGVyZSBpcyBhIGNvbW1lbnQgb24gbGluZSAlcyBvZiBmaWxlICVzICglcykgd2hpY2ggaXMgaW4gdGhlIG1pZGRsZSBvZiBhIG11bHRpbGluZSBleHByZXNzaW9uLlxuQml0YmFrZSB1c2VkIHRvIGlnbm9yZSB0aGVzZSBidXQgbm8gbG9uZ2VyIGRvZXMgc28sIHBsZWFzZSBmaXggeW91ciBtZXRhZGF0YSBhcyBlcnJvcnMgYXJlIGxpa2VseSBhcyBhIHJlc3VsdCBvZiB0aGlzIGNoYW5nZS4iICUgKGxpbmVubywgZm4sIHMpKQorCisgICAgaWYgbGVuKF9fcmVzaWR1ZV9fKSAhPSAwIGFuZCBfX3Jlc2lkdWVfX1swXVswXSA9PSAiIyIgYW5kIChub3QgcyBvciBzWzBdICE9ICIjIik6CisgICAgICAgIGJiLmZhdGFsKCJUaGVyZSBpcyBhIGNvbmZ1c2luZyBtdWx0aWxpbmUsIHBhcnRpYWxseSBjb21tZW50ZWQgZXhwcmVzc2lvbiBvbiBsaW5lICVzIG9mIGZpbGUgJXMgKCVzKS5cblBsZWFzZSBjbGFyaWZ5IHdoZXRoZXIgdGhpcyBpcyBhbGwgYSBjb21tZW50IG9yIHNob3VsZCBiZSBwYXJzZWQuIiAlIChsaW5lbm8sIGZuLCBzKSkKKworICAgIGlmIHMgYW5kIHNbLTFdID09ICdcXCc6CisgICAgICAgIF9fcmVzaWR1ZV9fLmFwcGVuZChzWzotMV0pCisgICAgICAgIHJldHVybgorCisgICAgcyA9ICIiLmpvaW4oX19yZXNpZHVlX18pICsgcworICAgIF9fcmVzaWR1ZV9fID0gW10KKworICAgICMgU2tpcCBlbXB0eSBsaW5lcworICAgIGlmIHMgPT0gJyc6CisgICAgICAgIHJldHVybiAgIAorCisgICAgIyBTa2lwIGNvbW1lbnRzCisgICAgaWYgc1swXSA9PSAnIyc6CisgICAgICAgIHJldHVybgorCisgICAgbSA9IF9fZnVuY19zdGFydF9yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIF9faW5mdW5jX18gPSBbbS5ncm91cCgiZnVuYyIpIG9yICJfX2Fub255bW91cyIsIGZuLCBsaW5lbm9dCisgICAgICAgIGFzdC5oYW5kbGVNZXRob2RGbGFncyhzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBfX2luZnVuY19fWzBdLCBtKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2RlZl9yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIF9fYm9keV9fLmFwcGVuZChzKQorICAgICAgICBfX2lucHl0aG9uX18gPSBtLmdyb3VwKDEpCisKKyAgICAgICAgcmV0dXJuCisKKyAgICBtID0gX19leHBvcnRfZnVuY19yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGFzdC5oYW5kbGVFeHBvcnRGdW5jcyhzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtLCBfX2NsYXNzbmFtZV9fKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2FkZHRhc2tfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlQWRkVGFzayhzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2RlbHRhc2tfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlRGVsVGFzayhzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2FkZGhhbmRsZXJfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlQkJIYW5kbGVycyhzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2luaGVyaXRfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlSW5oZXJpdChzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtKQorICAgICAgICByZXR1cm4KKworICAgIHJldHVybiBDb25mSGFuZGxlci5mZWVkZXIobGluZW5vLCBzLCBmbiwgc3RhdGVtZW50cykKKworIyBBZGQgdXMgdG8gdGhlIGhhbmRsZXJzIGxpc3QKK2Zyb20gLi4gaW1wb3J0IGhhbmRsZXJzCitoYW5kbGVycy5hcHBlbmQoeydzdXBwb3J0cyc6IHN1cHBvcnRzLCAnaGFuZGxlJzogaGFuZGxlLCAnaW5pdCc6IGluaXR9KQorZGVsIGhhbmRsZXJzCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9Db25mSGFuZGxlci5weSBiL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L0NvbmZIYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDc1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9Db25mSGFuZGxlci5weQpAQCAtMCwwICsxLDE5MyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCisgICBjbGFzcyBmb3IgaGFuZGxpbmcgY29uZmlndXJhdGlvbiBkYXRhIGZpbGVzCisKKyAgIFJlYWRzIGEgLmNvbmYgZmlsZSBhbmQgb2J0YWlucyBpdHMgbWV0YWRhdGEKKworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZXJybm8KK2ltcG9ydCByZQoraW1wb3J0IG9zCitpbXBvcnQgYmIudXRpbHMKK2Zyb20gYmIucGFyc2UgaW1wb3J0IFBhcnNlRXJyb3IsIHJlc29sdmVfZmlsZSwgYXN0LCBsb2dnZXIsIGhhbmRsZQorCitfX2NvbmZpZ19yZWdleHBfXyAgPSByZS5jb21waWxlKCByIiIiCisgICAgXgorICAgICg/UDxleHA+ZXhwb3J0XHMqKT8KKyAgICAoP1A8dmFyPlthLXpBLVowLTlcLX5fKy4ke30vXSs/KQorICAgIChcWyg/UDxmbGFnPlthLXpBLVowLTlcLV8rLl0rKVxdKT8KKworICAgIFxzKiAoCisgICAgICAgICg/UDxjb2xvbj46PSkgfAorICAgICAgICAoP1A8bGF6eXF1ZXM+XD9cPz0pIHwKKyAgICAgICAgKD9QPHF1ZXM+XD89KSB8CisgICAgICAgICg/UDxhcHBlbmQ+XCs9KSB8CisgICAgICAgICg/UDxwcmVwZW5kPj1cKykgfAorICAgICAgICAoP1A8cHJlZG90Pj1cLikgfAorICAgICAgICAoP1A8cG9zdGRvdD5cLj0pIHwKKyAgICAgICAgPQorICAgICkgXHMqCisKKyAgICAoPyEnW14nXSonW14nXSonJCkKKyAgICAoPyFcIlteXCJdKlwiW15cIl0qXCIkKQorICAgICg/UDxhcG8+WydcIl0pCisgICAgKD9QPHZhbHVlPi4qKQorICAgICg/UD1hcG8pCisgICAgJAorICAgICIiIiwgcmUuWCkKK19faW5jbHVkZV9yZWdleHBfXyA9IHJlLmNvbXBpbGUoIHIiaW5jbHVkZVxzKyguKykiICkKK19fcmVxdWlyZV9yZWdleHBfXyA9IHJlLmNvbXBpbGUoIHIicmVxdWlyZVxzKyguKykiICkKK19fZXhwb3J0X3JlZ2V4cF9fID0gcmUuY29tcGlsZSggciJleHBvcnRccysoW2EtekEtWjAtOVwtXysuJHt9L10rKSQiICkKKworZGVmIGluaXQoZGF0YSk6CisgICAgdG9wZGlyID0gZGF0YS5nZXRWYXIoJ1RPUERJUicsIEZhbHNlKQorICAgIGlmIG5vdCB0b3BkaXI6CisgICAgICAgIGRhdGEuc2V0VmFyKCdUT1BESVInLCBvcy5nZXRjd2QoKSkKKworCitkZWYgc3VwcG9ydHMoZm4sIGQpOgorICAgIHJldHVybiBmblstNTpdID09ICIuY29uZiIKKworZGVmIGluY2x1ZGUocGFyZW50Zm4sIGZuLCBsaW5lbm8sIGRhdGEsIGVycm9yX291dCk6CisgICAgIiIiCisgICAgZXJyb3Jfb3V0OiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB2ZXJiIChlLmcuICJpbmNsdWRlIiwgImluaGVyaXQiKSB0byBiZQorICAgIHVzZWQgaW4gYSBQYXJzZUVycm9yIHRoYXQgd2lsbCBiZSByYWlzZWQgaWYgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgY291bGQKKyAgICBub3QgYmUgaW5jbHVkZWQuIFNwZWNpZnkgRmFsc2UgdG8gYXZvaWQgcmFpc2luZyBhbiBlcnJvciBpbiB0aGlzIGNhc2UuCisgICAgIiIiCisgICAgaWYgcGFyZW50Zm4gPT0gZm46ICMgcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGZuID0gZGF0YS5leHBhbmQoZm4pCisgICAgcGFyZW50Zm4gPSBkYXRhLmV4cGFuZChwYXJlbnRmbikKKworICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGZuKToKKyAgICAgICAgZG5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGFyZW50Zm4pCisgICAgICAgIGJicGF0aCA9ICIlczolcyIgJSAoZG5hbWUsIGRhdGEuZ2V0VmFyKCJCQlBBVEgiLCBUcnVlKSkKKyAgICAgICAgYWJzX2ZuLCBhdHRlbXB0cyA9IGJiLnV0aWxzLndoaWNoKGJicGF0aCwgZm4sIGhpc3Rvcnk9VHJ1ZSkKKyAgICAgICAgaWYgYWJzX2ZuIGFuZCBiYi5wYXJzZS5jaGVja19kZXBlbmRlbmN5KGRhdGEsIGFic19mbik6CisgICAgICAgICAgICBsb2dnZXIud2FybigiRHVwbGljYXRlIGluY2x1c2lvbiBmb3IgJXMgaW4gJXMiICUgKGFic19mbiwgZGF0YS5nZXRWYXIoJ0ZJTEUnLCBUcnVlKSkpCisgICAgICAgIGZvciBhZiBpbiBhdHRlbXB0czoKKyAgICAgICAgICAgIGJiLnBhcnNlLm1hcmtfZGVwZW5kZW5jeShkYXRhLCBhZikKKyAgICAgICAgaWYgYWJzX2ZuOgorICAgICAgICAgICAgZm4gPSBhYnNfZm4KKyAgICBlbGlmIGJiLnBhcnNlLmNoZWNrX2RlcGVuZGVuY3koZGF0YSwgZm4pOgorICAgICAgICBsb2dnZXIud2FybigiRHVwbGljYXRlIGluY2x1c2lvbiBmb3IgJXMgaW4gJXMiICUgKGZuLCBkYXRhLmdldFZhcignRklMRScsIFRydWUpKSkKKworICAgIHRyeToKKyAgICAgICAgYmIucGFyc2UuaGFuZGxlKGZuLCBkYXRhLCBUcnVlKQorICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcikgYXMgZXhjOgorICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgaWYgZXJyb3Jfb3V0OgorICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoIkNvdWxkIG5vdCAlcyBmaWxlICVzIiAlIChlcnJvcl9vdXQsIGZuKSwgcGFyZW50Zm4sIGxpbmVubykKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQ09ORiBmaWxlICclcycgbm90IGZvdW5kIiwgZm4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBlcnJvcl9vdXQ6CisgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigiQ291bGQgbm90ICVzIGZpbGUgJXM6ICVzIiAlIChlcnJvcl9vdXQsIGZuLCBleGMuc3RyZXJyb3IpLCBwYXJlbnRmbiwgbGluZW5vKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJFcnJvciBwYXJzaW5nICVzOiAlcyIgJSAoZm4sIGV4Yy5zdHJlcnJvciksIHBhcmVudGZuLCBsaW5lbm8pCisKKyMgV2UgaGF2ZSBhbiBpc3N1ZSB3aGVyZSBhIFVJIG1pZ2h0IHdhbnQgdG8gZW5mb3JjZSBwYXJ0aWN1bGFyIHNldHRpbmdzIHN1Y2ggYXMKKyMgYW4gZW1wdHkgRElTVFJPIHZhcmlhYmxlLiBJZiBjb25maWd1cmF0aW9uIGZpbGVzIGRvIHNvbWV0aGluZyBsaWtlIGFzc2lnbmluZworIyBhIHdlYWsgZGVmYXVsdCwgaXQgdHVybnMgb3V0IHRvIGJlIHZlcnkgZGlmZmljdWx0IHRvIGZpbHRlciBvdXQgdGhlc2UgY2hhbmdlcywKKyMgcGFydGljdWxhcmx5IHdoZW4gdGhlIHdlYWsgZGVmYXVsdCBtaWdodCBhcHBlYXIgaGFsZiB3YXkgdGhvdWdoIHBhcnNpbmcgYSBjaGFpbiAKKyMgb2YgY29uZmlndXJhdGlvbiBmaWxlcy4gV2UgdGhlcmVmb3JlIGxldCB0aGUgVUlzIGhvb2sgaW50byBjb25maWd1cmF0aW9uIGZpbGUKKyMgcGFyc2luZy4gVGhpcyB0dXJucyBvdXQgdG8gYmUgYSBoYXJkIHByb2JsZW0gdG8gc29sdmUgYW55IG90aGVyIHdheS4KK2NvbmZGaWx0ZXJzID0gW10KKworZGVmIGhhbmRsZShmbiwgZGF0YSwgaW5jbHVkZSk6CisgICAgaW5pdChkYXRhKQorCisgICAgaWYgaW5jbHVkZSA9PSAwOgorICAgICAgICBvbGRmaWxlID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIG9sZGZpbGUgPSBkYXRhLmdldFZhcignRklMRScsIEZhbHNlKQorCisgICAgYWJzX2ZuID0gcmVzb2x2ZV9maWxlKGZuLCBkYXRhKQorICAgIGYgPSBvcGVuKGFic19mbiwgJ3InKQorCisgICAgaWYgaW5jbHVkZToKKyAgICAgICAgYmIucGFyc2UubWFya19kZXBlbmRlbmN5KGRhdGEsIGFic19mbikKKworICAgIHN0YXRlbWVudHMgPSBhc3QuU3RhdGVtZW50R3JvdXAoKQorICAgIGxpbmVubyA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCisgICAgICAgIHMgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICBicmVhaworICAgICAgICB3ID0gcy5zdHJpcCgpCisgICAgICAgICMgc2tpcCBlbXB0eSBsaW5lcworICAgICAgICBpZiBub3QgdzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHMgPSBzLnJzdHJpcCgpCisgICAgICAgIHdoaWxlIHNbLTFdID09ICdcXCc6CisgICAgICAgICAgICBzMiA9IGYucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCisgICAgICAgICAgICBpZiAobm90IHMyIG9yIHMyIGFuZCBzMlswXSAhPSAiIyIpIGFuZCBzWzBdID09ICIjIiA6CisgICAgICAgICAgICAgICAgYmIuZmF0YWwoIlRoZXJlIGlzIGEgY29uZnVzaW5nIG11bHRpbGluZSwgcGFydGlhbGx5IGNvbW1lbnRlZCBleHByZXNzaW9uIG9uIGxpbmUgJXMgb2YgZmlsZSAlcyAoJXMpLlxuUGxlYXNlIGNsYXJpZnkgd2hldGhlciB0aGlzIGlzIGFsbCBhIGNvbW1lbnQgb3Igc2hvdWxkIGJlIHBhcnNlZC4iICUgKGxpbmVubywgZm4sIHMpKQorICAgICAgICAgICAgcyA9IHNbOi0xXSArIHMyCisgICAgICAgICMgc2tpcCBjb21tZW50cworICAgICAgICBpZiBzWzBdID09ICcjJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZlZWRlcihsaW5lbm8sIHMsIGFic19mbiwgc3RhdGVtZW50cykKKworICAgICMgRE9ORSBXSVRIIFBBUlNJTkcuLi4gdGltZSB0byBldmFsdWF0ZQorICAgIGRhdGEuc2V0VmFyKCdGSUxFJywgYWJzX2ZuKQorICAgIHN0YXRlbWVudHMuZXZhbChkYXRhKQorICAgIGlmIG9sZGZpbGU6CisgICAgICAgIGRhdGEuc2V0VmFyKCdGSUxFJywgb2xkZmlsZSkKKworICAgIGYuY2xvc2UoKQorCisgICAgZm9yIGYgaW4gY29uZkZpbHRlcnM6CisgICAgICAgIGYoZm4sIGRhdGEpCisKKyAgICByZXR1cm4gZGF0YQorCitkZWYgZmVlZGVyKGxpbmVubywgcywgZm4sIHN0YXRlbWVudHMpOgorICAgIG0gPSBfX2NvbmZpZ19yZWdleHBfXy5tYXRjaChzKQorICAgIGlmIG06CisgICAgICAgIGdyb3VwZCA9IG0uZ3JvdXBkaWN0KCkKKyAgICAgICAgYXN0LmhhbmRsZURhdGEoc3RhdGVtZW50cywgZm4sIGxpbmVubywgZ3JvdXBkKQorICAgICAgICByZXR1cm4KKworICAgIG0gPSBfX2luY2x1ZGVfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlSW5jbHVkZShzdGF0ZW1lbnRzLCBmbiwgbGluZW5vLCBtLCBGYWxzZSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBtID0gX19yZXF1aXJlX3JlZ2V4cF9fLm1hdGNoKHMpCisgICAgaWYgbToKKyAgICAgICAgYXN0LmhhbmRsZUluY2x1ZGUoc3RhdGVtZW50cywgZm4sIGxpbmVubywgbSwgVHJ1ZSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBtID0gX19leHBvcnRfcmVnZXhwX18ubWF0Y2gocykKKyAgICBpZiBtOgorICAgICAgICBhc3QuaGFuZGxlRXhwb3J0KHN0YXRlbWVudHMsIGZuLCBsaW5lbm8sIG0pCisgICAgICAgIHJldHVybgorCisgICAgcmFpc2UgUGFyc2VFcnJvcigidW5wYXJzZWQgbGluZTogJyVzJyIgJSBzLCBmbiwgbGluZW5vKTsKKworIyBBZGQgdXMgdG8gdGhlIGhhbmRsZXJzIGxpc3QKK2Zyb20gYmIucGFyc2UgaW1wb3J0IGhhbmRsZXJzCitoYW5kbGVycy5hcHBlbmQoeydzdXBwb3J0cyc6IHN1cHBvcnRzLCAnaGFuZGxlJzogaGFuZGxlLCAnaW5pdCc6IGluaXR9KQorZGVsIGhhbmRsZXJzCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL2JiL3BhcnNlL3BhcnNlX3B5L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjU4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wYXJzZS9wYXJzZV9weS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgUGFyc2VycworCitGaWxlIHBhcnNlcnMgZm9yIHRoZSBCaXRCYWtlIGJ1aWxkIHRvb2xzLgorCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgIFBoaWwgQmx1bmRlbGwKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIEJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBiYXNlIGJiIG1vZHVsZSwgQ29weXJpZ2h0IDIwMDMgSG9sZ2VyIFNjaHVyaWcKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gLiBpbXBvcnQgQ29uZkhhbmRsZXIKK2Zyb20gLiBpbXBvcnQgQkJIYW5kbGVyCisKK19fdmVyc2lvbl9fID0gJzEuMCcKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3BlcnNpc3RfZGF0YS5weSBiL2JpdGJha2UvbGliL2JiL3BlcnNpc3RfZGF0YS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzk1YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcGVyc2lzdF9kYXRhLnB5CkBAIC0wLDAgKzEsMjE3IEBACisiIiJCaXRCYWtlIFBlcnNpc3RlbnQgRGF0YSBTdG9yZQorCitVc2VkIHRvIHN0b3JlIGRhdGEgaW4gYSBjZW50cmFsIGxvY2F0aW9uIHN1Y2ggdGhhdCBvdGhlciB0aHJlYWRzL3Rhc2tzIGNhbgorYWNjZXNzIHRoZW0gYXQgc29tZSBmdXR1cmUgZGF0ZS4gIEFjdHMgYXMgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCBzcWxpdGUsCitjdXJyZW50bHksIHByb3ZpZGluZyBhIGtleS92YWx1ZSBzdG9yZSBhY2Nlc3NlZCBieSAnZG9tYWluJy4KKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwNyAgICAgICAgUmljaGFyZCBQdXJkaWUKKyMgQ29weXJpZ2h0IChDKSAyMDEwICAgICAgICBDaHJpcyBMYXJzb24gPGNocmlzX2xhcnNvbkBtZW50b3IuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBiYi5jb21wYXQgaW1wb3J0IHRvdGFsX29yZGVyaW5nCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nCisKK3RyeToKKyAgICBpbXBvcnQgc3FsaXRlMworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworCitzcWx2ZXJzaW9uID0gc3FsaXRlMy5zcWxpdGVfdmVyc2lvbl9pbmZvCitpZiBzcWx2ZXJzaW9uWzBdIDwgMyBvciAoc3FsdmVyc2lvblswXSA9PSAzIGFuZCBzcWx2ZXJzaW9uWzFdIDwgMyk6CisgICAgcmFpc2UgRXhjZXB0aW9uKCJzcWxpdGUzIHZlcnNpb24gMy4zLjAgb3IgbGF0ZXIgaXMgcmVxdWlyZWQuIikKKworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5QZXJzaXN0RGF0YSIpCitpZiBoYXNhdHRyKHNxbGl0ZTMsICdlbmFibGVfc2hhcmVkX2NhY2hlJyk6CisgICAgdHJ5OgorICAgICAgICBzcWxpdGUzLmVuYWJsZV9zaGFyZWRfY2FjaGUoVHJ1ZSkKKyAgICBleGNlcHQgc3FsaXRlMy5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICBwYXNzCisKKworQHRvdGFsX29yZGVyaW5nCitjbGFzcyBTUUxUYWJsZShjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZyk6CisgICAgIiIiT2JqZWN0IHJlcHJlc2VudGluZyBhIHRhYmxlL2RvbWFpbiBpbiB0aGUgZGF0YWJhc2UiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGVmaWxlLCB0YWJsZSk6CisgICAgICAgIHNlbGYuY2FjaGVmaWxlID0gY2FjaGVmaWxlCisgICAgICAgIHNlbGYudGFibGUgPSB0YWJsZQorICAgICAgICBzZWxmLmN1cnNvciA9IGNvbm5lY3Qoc2VsZi5jYWNoZWZpbGUpCisKKyAgICAgICAgc2VsZi5fZXhlY3V0ZSgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJXMoa2V5IFRFWFQsIHZhbHVlIFRFWFQpOyIKKyAgICAgICAgICAgICAgICAgICAgICAlIHRhYmxlKQorCisgICAgZGVmIF9leGVjdXRlKHNlbGYsICpxdWVyeSk6CisgICAgICAgICIiIkV4ZWN1dGUgYSBxdWVyeSwgd2FpdGluZyB0byBhY3F1aXJlIGEgbG9jayBpZiBuZWNlc3NhcnkiIiIKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3Vyc29yLmV4ZWN1dGUoKnF1ZXJ5KQorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZTMuT3BlcmF0aW9uYWxFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgaWYgJ2RhdGFiYXNlIGlzIGxvY2tlZCcgaW4gc3RyKGV4YykgYW5kIGNvdW50IDwgNTAwOgorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnNvci5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3Vyc29yID0gY29ubmVjdChzZWxmLmNhY2hlZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jdXJzb3IuX19lbnRlcl9fKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjaW5mbyk6CisgICAgICAgIHNlbGYuY3Vyc29yLl9fZXhpdF9fKCpleGNpbmZvKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGRhdGEgPSBzZWxmLl9leGVjdXRlKCJTRUxFQ1QgKiBmcm9tICVzIHdoZXJlIGtleT0/OyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLCBba2V5XSkKKyAgICAgICAgZm9yIHJvdyBpbiBkYXRhOgorICAgICAgICAgICAgcmV0dXJuIHJvd1sxXQorICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQorICAgICAgICBzZWxmLl9leGVjdXRlKCJERUxFVEUgZnJvbSAlcyB3aGVyZSBrZXk9PzsiICUgc2VsZi50YWJsZSwgW2tleV0pCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ09ubHkgc3RyaW5nIGtleXMgYXJlIHN1cHBvcnRlZCcpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdPbmx5IHN0cmluZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZCcpCisKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCAqIGZyb20gJXMgd2hlcmUga2V5PT87IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGUsIFtrZXldKQorICAgICAgICBleGlzdHMgPSBsZW4obGlzdChkYXRhKSkKKyAgICAgICAgaWYgZXhpc3RzOgorICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZSgiVVBEQVRFICVzIFNFVCB2YWx1ZT0/IFdIRVJFIGtleT0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWUsIGtleV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9leGVjdXRlKCJJTlNFUlQgaW50byAlcyhrZXksIHZhbHVlKSB2YWx1ZXMgKD8sID8pOyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLCBba2V5LCB2YWx1ZV0pCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgaW4gc2V0KHNlbGYpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCBDT1VOVChrZXkpIEZST00gJXM7IiAlIHNlbGYudGFibGUpCisgICAgICAgIGZvciByb3cgaW4gZGF0YToKKyAgICAgICAgICAgIHJldHVybiByb3dbMF0KKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCBrZXkgRlJPTSAlczsiICUgc2VsZi50YWJsZSkKKyAgICAgICAgcmV0dXJuIChyb3dbMF0gZm9yIHJvdyBpbiBkYXRhKQorCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmKSA8IGxlbihvdGhlcikKKworICAgIGRlZiBnZXRfYnlfcGF0dGVybihzZWxmLCBwYXR0ZXJuKToKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUga2V5IExJS0UgPzsiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YWJsZSwgW3BhdHRlcm5dKQorICAgICAgICByZXR1cm4gW3Jvd1sxXSBmb3Igcm93IGluIGRhdGFdCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkKKworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gJXM7IiAlIHNlbGYudGFibGUpCisgICAgICAgIHJldHVybiAocm93WzBdIGZvciByb3cgaW4gZGF0YSkKKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKKworICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9leGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzOyIgJSBzZWxmLnRhYmxlKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLl9leGVjdXRlKCJERUxFVEUgRlJPTSAlczsiICUgc2VsZi50YWJsZSkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZgorCisKK2NsYXNzIFBlcnNpc3REYXRhKG9iamVjdCk6CisgICAgIiIiRGVwcmVjYXRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYml0YmFrZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZCk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBvZiBQZXJzaXN0RGF0YSBpcyBkZXByZWNhdGVkLiAgUGxlYXNlIHVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgInBlcnNpc3QoZG9tYWluLCBkKSBpbnN0ZWFkLiIsCisgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKworICAgICAgICBzZWxmLmRhdGEgPSBwZXJzaXN0KGQpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVXNpbmcgJyVzJyBhcyB0aGUgcGVyc2lzdGVudCBkYXRhIGNhY2hlIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5maWxlbmFtZSkKKworICAgIGRlZiBhZGREb21haW4oc2VsZiwgZG9tYWluKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCBhIGRvbWFpbiAocGVuZGluZyBkZXByZWNhdGlvbikKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbZG9tYWluXQorCisgICAgZGVmIGRlbERvbWFpbihzZWxmLCBkb21haW4pOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlcyBhIGRvbWFpbiBhbmQgYWxsIHRoZSBkYXRhIGl0IGNvbnRhaW5zCisgICAgICAgICIiIgorICAgICAgICBkZWwgc2VsZi5kYXRhW2RvbWFpbl0KKworICAgIGRlZiBnZXRLZXlWYWx1ZXMoc2VsZiwgZG9tYWluKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2Yga2V5ICsgdmFsdWUgcGFpcnMgZm9yIGEgZG9tYWluCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2RvbWFpbl0uaXRlbXMoKQorCisgICAgZGVmIGdldFZhbHVlKHNlbGYsIGRvbWFpbiwga2V5KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgdmFsdWUgb2YgYSBrZXkgZm9yIGEgZG9tYWluCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2RvbWFpbl1ba2V5XQorCisgICAgZGVmIHNldFZhbHVlKHNlbGYsIGRvbWFpbiwga2V5LCB2YWx1ZSk6CisgICAgICAgICIiIgorICAgICAgICBTZXRzIHRoZSB2YWx1ZSBvZiBhIGtleSBmb3IgYSBkb21haW4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGF0YVtkb21haW5dW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGRlbFZhbHVlKHNlbGYsIGRvbWFpbiwga2V5KToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGV0ZXMgYSBrZXkvdmFsdWUgcGFpcgorICAgICAgICAiIiIKKyAgICAgICAgZGVsIHNlbGYuZGF0YVtkb21haW5dW2tleV0KKworZGVmIGNvbm5lY3QoZGF0YWJhc2UpOgorICAgIGNvbm5lY3Rpb24gPSBzcWxpdGUzLmNvbm5lY3QoZGF0YWJhc2UsIHRpbWVvdXQ9NSwgaXNvbGF0aW9uX2xldmVsPU5vbmUpCisgICAgY29ubmVjdGlvbi5leGVjdXRlKCJwcmFnbWEgc3luY2hyb25vdXMgPSBvZmY7IikKKyAgICByZXR1cm4gY29ubmVjdGlvbgorCitkZWYgcGVyc2lzdChkb21haW4sIGQpOgorICAgICIiIkNvbnZlbmllbmNlIGZhY3RvcnkgZm9yIFNRTFRhYmxlIG9iamVjdHMgYmFzZWQgdXBvbiBtZXRhZGF0YSIiIgorICAgIGltcG9ydCBiYi51dGlscworICAgIGNhY2hlZGlyID0gKGQuZ2V0VmFyKCJQRVJTSVNURU5UX0RJUiIsIFRydWUpIG9yCisgICAgICAgICAgICAgICAgZC5nZXRWYXIoIkNBQ0hFIiwgVHJ1ZSkpCisgICAgaWYgbm90IGNhY2hlZGlyOgorICAgICAgICBsb2dnZXIuY3JpdGljYWwoIlBsZWFzZSBzZXQgdGhlICdQRVJTSVNURU5UX0RJUicgb3IgJ0NBQ0hFJyB2YXJpYWJsZSIpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBiYi51dGlscy5ta2RpcmhpZXIoY2FjaGVkaXIpCisgICAgY2FjaGVmaWxlID0gb3MucGF0aC5qb2luKGNhY2hlZGlyLCAiYmJfcGVyc2lzdF9kYXRhLnNxbGl0ZTMiKQorICAgIHJldHVybiBTUUxUYWJsZShjYWNoZWZpbGUsIGRvbWFpbikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Byb2Nlc3MucHkgYi9iaXRiYWtlL2xpYi9iYi9wcm9jZXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDdmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9wcm9jZXNzLnB5CkBAIC0wLDAgKzEsMTU2IEBACitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHNlbGVjdAorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5Qcm9jZXNzJykKKworZGVmIHN1YnByb2Nlc3Nfc2V0dXAoKToKKyAgICAjIFB5dGhvbiBpbnN0YWxscyBhIFNJR1BJUEUgaGFuZGxlciBieSBkZWZhdWx0LiBUaGlzIGlzIHVzdWFsbHkgbm90IHdoYXQKKyAgICAjIG5vbi1QeXRob24gc3VicHJvY2Vzc2VzIGV4cGVjdC4KKyAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdQSVBFLCBzaWduYWwuU0lHX0RGTCkKKworY2xhc3MgQ21kRXJyb3IoUnVudGltZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZCwgbXNnPU5vbmUpOgorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjb21tYW5kCisgICAgICAgIHNlbGYubXNnID0gbXNnCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5jb21tYW5kLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGNtZCA9IHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKHNlbGYuY29tbWFuZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZCA9IHNlbGYuY29tbWFuZAorCisgICAgICAgIG1zZyA9ICJFeGVjdXRpb24gb2YgJyVzJyBmYWlsZWQiICUgY21kCisgICAgICAgIGlmIHNlbGYubXNnOgorICAgICAgICAgICAgbXNnICs9ICc6ICVzJyAlIHNlbGYubXNnCisgICAgICAgIHJldHVybiBtc2cKKworY2xhc3MgTm90Rm91bmRFcnJvcihDbWRFcnJvcik6CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBDbWRFcnJvci5fX3N0cl9fKHNlbGYpICsgIjogY29tbWFuZCBub3QgZm91bmQiCisKK2NsYXNzIEV4ZWN1dGlvbkVycm9yKENtZEVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZCwgZXhpdGNvZGUsIHN0ZG91dCA9IE5vbmUsIHN0ZGVyciA9IE5vbmUpOgorICAgICAgICBDbWRFcnJvci5fX2luaXRfXyhzZWxmLCBjb21tYW5kKQorICAgICAgICBzZWxmLmV4aXRjb2RlID0gZXhpdGNvZGUKKyAgICAgICAgc2VsZi5zdGRvdXQgPSBzdGRvdXQKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzdGRlcnIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBtZXNzYWdlID0gIiIKKyAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICBtZXNzYWdlICs9IHNlbGYuc3RkZXJyCisgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgbWVzc2FnZSArPSBzZWxmLnN0ZG91dAorICAgICAgICBpZiBtZXNzYWdlOgorICAgICAgICAgICAgbWVzc2FnZSA9ICI6XG4iICsgbWVzc2FnZQorICAgICAgICByZXR1cm4gKENtZEVycm9yLl9fc3RyX18oc2VsZikgKworICAgICAgICAgICAgICAgICIgd2l0aCBleGl0IGNvZGUgJXMiICUgc2VsZi5leGl0Y29kZSArIG1lc3NhZ2UpCisKK2NsYXNzIFBvcGVuKHN1YnByb2Nlc3MuUG9wZW4pOgorICAgIGRlZmF1bHRzID0geworICAgICAgICAiY2xvc2VfZmRzIjogVHJ1ZSwKKyAgICAgICAgInByZWV4ZWNfZm4iOiBzdWJwcm9jZXNzX3NldHVwLAorICAgICAgICAic3Rkb3V0Ijogc3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAic3RkZXJyIjogc3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICJzdGRpbiI6IHN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgInNoZWxsIjogRmFsc2UsCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIG9wdGlvbnMgPSBkaWN0KHNlbGYuZGVmYXVsdHMpCisgICAgICAgIG9wdGlvbnMudXBkYXRlKGt3YXJncykKKyAgICAgICAgc3VicHJvY2Vzcy5Qb3Blbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKipvcHRpb25zKQorCitkZWYgX2xvZ2dlZF9jb21tdW5pY2F0ZShwaXBlLCBsb2csIGlucHV0LCBleHRyYWZpbGVzKToKKyAgICBpZiBwaXBlLnN0ZGluOgorICAgICAgICBpZiBpbnB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBpcGUuc3RkaW4ud3JpdGUoaW5wdXQpCisgICAgICAgIHBpcGUuc3RkaW4uY2xvc2UoKQorCisgICAgb3V0ZGF0YSwgZXJyZGF0YSA9IFtdLCBbXQorICAgIHJpbiA9IFtdCisKKyAgICBpZiBwaXBlLnN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgYmIudXRpbHMubm9uYmxvY2tpbmdmZChwaXBlLnN0ZG91dC5maWxlbm8oKSkKKyAgICAgICAgcmluLmFwcGVuZChwaXBlLnN0ZG91dCkKKyAgICBpZiBwaXBlLnN0ZGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgYmIudXRpbHMubm9uYmxvY2tpbmdmZChwaXBlLnN0ZGVyci5maWxlbm8oKSkKKyAgICAgICAgcmluLmFwcGVuZChwaXBlLnN0ZGVycikKKyAgICBmb3IgZm9iaiwgXyBpbiBleHRyYWZpbGVzOgorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKGZvYmouZmlsZW5vKCkpCisgICAgICAgIHJpbi5hcHBlbmQoZm9iaikKKworICAgIGRlZiByZWFkZXh0cmFzKHNlbGVjdGVkKToKKyAgICAgICAgZm9yIGZvYmosIGZ1bmMgaW4gZXh0cmFmaWxlczoKKyAgICAgICAgICAgIGlmIGZvYmogaW4gc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgIGlmIGVyci5lcnJubyA9PSBlcnJuby5FQUdBSU4gb3IgZXJyLmVycm5vID09IGVycm5vLkVXT1VMREJMT0NLOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBmdW5jKGRhdGEpCisKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIHBpcGUucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICBybGlzdCA9IHJpbgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIsdyxlID0gc2VsZWN0LnNlbGVjdCAocmxpc3QsIFtdLCBbXSwgMSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgaWYgcGlwZS5zdGRvdXQgaW4gcjoKKyAgICAgICAgICAgICAgICBkYXRhID0gcGlwZS5zdGRvdXQucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YS5hcHBlbmQoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgIGlmIHBpcGUuc3RkZXJyIGluIHI6CisgICAgICAgICAgICAgICAgZGF0YSA9IHBpcGUuc3RkZXJyLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGVycmRhdGEuYXBwZW5kKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGxvZy53cml0ZShkYXRhKQorCisgICAgICAgICAgICByZWFkZXh0cmFzKHIpCisKKyAgICBmaW5hbGx5OiAgICAKKyAgICAgICAgbG9nLmZsdXNoKCkKKworICAgIHJlYWRleHRyYXMoW2ZvYmogZm9yIGZvYmosIF8gaW4gZXh0cmFmaWxlc10pCisKKyAgICBpZiBwaXBlLnN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgcGlwZS5zdGRvdXQuY2xvc2UoKQorICAgIGlmIHBpcGUuc3RkZXJyIGlzIG5vdCBOb25lOgorICAgICAgICBwaXBlLnN0ZGVyci5jbG9zZSgpCisgICAgcmV0dXJuICcnLmpvaW4ob3V0ZGF0YSksICcnLmpvaW4oZXJyZGF0YSkKKworZGVmIHJ1bihjbWQsIGlucHV0PU5vbmUsIGxvZz1Ob25lLCBleHRyYWZpbGVzPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcnVuIGEgY29tbWFuZCBhbmQgcmV0dXJuIGl0cyBvdXRwdXQsIHJhaXNpbmcgYW4KKyAgICBleGNlcHRpb24gd2hlbiB0aGUgY29tbWFuZCBmYWlscyIiIgorCisgICAgaWYgbm90IGV4dHJhZmlsZXM6CisgICAgICAgIGV4dHJhZmlsZXMgPSBbXQorCisgICAgaWYgaXNpbnN0YW5jZShjbWQsIGJhc2VzdHJpbmcpIGFuZCBub3QgInNoZWxsIiBpbiBvcHRpb25zOgorICAgICAgICBvcHRpb25zWyJzaGVsbCJdID0gVHJ1ZQorCisgICAgdHJ5OgorICAgICAgICBwaXBlID0gUG9wZW4oY21kLCAqKm9wdGlvbnMpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgorICAgICAgICBpZiBleGMuZXJybm8gPT0gMjoKKyAgICAgICAgICAgIHJhaXNlIE5vdEZvdW5kRXJyb3IoY21kKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQ21kRXJyb3IoY21kLCBleGMpCisKKyAgICBpZiBsb2c6CisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gX2xvZ2dlZF9jb21tdW5pY2F0ZShwaXBlLCBsb2csIGlucHV0LCBleHRyYWZpbGVzKQorICAgIGVsc2U6CisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcGlwZS5jb21tdW5pY2F0ZShpbnB1dCkKKworICAgIGlmIHBpcGUucmV0dXJuY29kZSAhPSAwOgorICAgICAgICByYWlzZSBFeGVjdXRpb25FcnJvcihjbWQsIHBpcGUucmV0dXJuY29kZSwgc3Rkb3V0LCBzdGRlcnIpCisgICAgcmV0dXJuIHN0ZG91dCwgc3RkZXJyCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9wcm92aWRlcnMucHkgYi9iaXRiYWtlL2xpYi9iYi9wcm92aWRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM3ZTFmYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Byb3ZpZGVycy5weQpAQCAtMCwwICsxLDM4MSBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBDaHJpcyBMYXJzb24KKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0ICBQaGlsIEJsdW5kZWxsCisjIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDUgICAgICAgIEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisjIENvcHlyaWdodCAoQykgMjAwNSAgICAgICAgUk9BRCBHbWJICisjIENvcHlyaWdodCAoQykgMjAwNiAgICAgICAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCByZQoraW1wb3J0IGxvZ2dpbmcKK2Zyb20gYmIgaW1wb3J0IGRhdGEsIHV0aWxzCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAoraW1wb3J0IGJiCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlByb3ZpZGVyIikKKworY2xhc3MgTm9Qcm92aWRlcihiYi5CQkhhbmRsZWRFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBubyBwcm92aWRlciBvZiBhIGJ1aWxkIGRlcGVuZGVuY3kgY2FuIGJlIGZvdW5kIiIiCisKK2NsYXNzIE5vUlByb3ZpZGVyKGJiLkJCSGFuZGxlZEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIG5vIHByb3ZpZGVyIG9mIGEgcnVudGltZSBkZXBlbmRlbmN5IGNhbiBiZSBmb3VuZCIiIgorCitjbGFzcyBNdWx0aXBsZVJQcm92aWRlcihiYi5CQkhhbmRsZWRFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBtdWx0aXBsZSBwcm92aWRlcnMgb2YgYSBydW50aW1lIGRlcGVuZGVuY3kgY2FuIGJlIGZvdW5kIiIiCisKK2RlZiBmaW5kUHJvdmlkZXJzKGNmZ0RhdGEsIGRhdGFDYWNoZSwgcGtnX3BuID0gTm9uZSk6CisgICAgIiIiCisgICAgQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZ2V0IGxhdGVzdCBhbmQgcHJlZmVycmVkIHByb3ZpZGVycyBpbiBwa2dfcG4KKyAgICAiIiIKKworICAgIGlmIG5vdCBwa2dfcG46CisgICAgICAgIHBrZ19wbiA9IGRhdGFDYWNoZS5wa2dfcG4KKworICAgICMgTmVlZCB0byBlbnN1cmUgZGF0YSBzdG9yZSBpcyBleHBhbmRlZAorICAgIGxvY2FsZGF0YSA9IGRhdGEuY3JlYXRlQ29weShjZmdEYXRhKQorICAgIGJiLmRhdGEudXBkYXRlX2RhdGEobG9jYWxkYXRhKQorICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhsb2NhbGRhdGEpCisKKyAgICBwcmVmZXJyZWRfdmVyc2lvbnMgPSB7fQorICAgIGxhdGVzdF92ZXJzaW9ucyA9IHt9CisKKyAgICBmb3IgcG4gaW4gcGtnX3BuOgorICAgICAgICAobGFzdF92ZXIsIGxhc3RfZmlsZSwgcHJlZl92ZXIsIHByZWZfZmlsZSkgPSBmaW5kQmVzdFByb3ZpZGVyKHBuLCBsb2NhbGRhdGEsIGRhdGFDYWNoZSwgcGtnX3BuKQorICAgICAgICBwcmVmZXJyZWRfdmVyc2lvbnNbcG5dID0gKHByZWZfdmVyLCBwcmVmX2ZpbGUpCisgICAgICAgIGxhdGVzdF92ZXJzaW9uc1twbl0gPSAobGFzdF92ZXIsIGxhc3RfZmlsZSkKKworICAgIHJldHVybiAobGF0ZXN0X3ZlcnNpb25zLCBwcmVmZXJyZWRfdmVyc2lvbnMpCisKKworZGVmIGFsbFByb3ZpZGVycyhkYXRhQ2FjaGUpOgorICAgICIiIgorICAgIEZpbmQgYWxsIHByb3ZpZGVycyBmb3IgZWFjaCBwbgorICAgICIiIgorICAgIGFsbF9wcm92aWRlcnMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgIGZvciAoZm4sIHBuKSBpbiBkYXRhQ2FjaGUucGtnX2ZuLml0ZW1zKCk6CisgICAgICAgIHZlciA9IGRhdGFDYWNoZS5wa2dfcGVwdnByW2ZuXQorICAgICAgICBhbGxfcHJvdmlkZXJzW3BuXS5hcHBlbmQoKHZlciwgZm4pKQorICAgIHJldHVybiBhbGxfcHJvdmlkZXJzCisKKworZGVmIHNvcnRQcmlvcml0aWVzKHBuLCBkYXRhQ2FjaGUsIHBrZ19wbiA9IE5vbmUpOgorICAgICIiIgorICAgIFJlb3JkZXIgcGtnX3BuIGJ5IGZpbGUgcHJpb3JpdHkgYW5kIGRlZmF1bHQgcHJlZmVyZW5jZQorICAgICIiIgorCisgICAgaWYgbm90IHBrZ19wbjoKKyAgICAgICAgcGtnX3BuID0gZGF0YUNhY2hlLnBrZ19wbgorCisgICAgZmlsZXMgPSBwa2dfcG5bcG5dCisgICAgcHJpb3JpdGllcyA9IHt9CisgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgIHByaW9yaXR5ID0gZGF0YUNhY2hlLmJiZmlsZV9wcmlvcml0eVtmXQorICAgICAgICBwcmVmZXJlbmNlID0gZGF0YUNhY2hlLnBrZ19kcFtmXQorICAgICAgICBpZiBwcmlvcml0eSBub3QgaW4gcHJpb3JpdGllczoKKyAgICAgICAgICAgIHByaW9yaXRpZXNbcHJpb3JpdHldID0ge30KKyAgICAgICAgaWYgcHJlZmVyZW5jZSBub3QgaW4gcHJpb3JpdGllc1twcmlvcml0eV06CisgICAgICAgICAgICBwcmlvcml0aWVzW3ByaW9yaXR5XVtwcmVmZXJlbmNlXSA9IFtdCisgICAgICAgIHByaW9yaXRpZXNbcHJpb3JpdHldW3ByZWZlcmVuY2VdLmFwcGVuZChmKQorICAgIHRtcF9wbiA9IFtdCisgICAgZm9yIHByaSBpbiBzb3J0ZWQocHJpb3JpdGllcyk6CisgICAgICAgIHRtcF9wcmVmID0gW10KKyAgICAgICAgZm9yIHByZWYgaW4gc29ydGVkKHByaW9yaXRpZXNbcHJpXSk6CisgICAgICAgICAgICB0bXBfcHJlZi5leHRlbmQocHJpb3JpdGllc1twcmldW3ByZWZdKQorICAgICAgICB0bXBfcG4gPSBbdG1wX3ByZWZdICsgdG1wX3BuCisKKyAgICByZXR1cm4gdG1wX3BuCisKK2RlZiBwcmVmZXJyZWRWZXJzaW9uTWF0Y2gocGUsIHB2LCBwciwgcHJlZmVycmVkX2UsIHByZWZlcnJlZF92LCBwcmVmZXJyZWRfcik6CisgICAgIiIiCisgICAgQ2hlY2sgaWYgdGhlIHZlcnNpb24gcGUscHYscHIgaXMgdGhlIHByZWZlcnJlZCBvbmUuCisgICAgSWYgdGhlcmUgaXMgcHJlZmVycmVkIHZlcnNpb24gZGVmaW5lZCBhbmQgZW5kcyB3aXRoICclJywgdGhlbiBwdiBoYXMgdG8gc3RhcnQgd2l0aCB0aGF0IHZlcnNpb24gYWZ0ZXIgcmVtb3ZpbmcgdGhlICclJworICAgICIiIgorICAgIGlmIChwciA9PSBwcmVmZXJyZWRfciBvciBwcmVmZXJyZWRfciA9PSBOb25lKToKKyAgICAgICAgaWYgKHBlID09IHByZWZlcnJlZF9lIG9yIHByZWZlcnJlZF9lID09IE5vbmUpOgorICAgICAgICAgICAgaWYgcHJlZmVycmVkX3YgPT0gcHY6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGlmIHByZWZlcnJlZF92ICE9IE5vbmUgYW5kIHByZWZlcnJlZF92LmVuZHN3aXRoKCclJykgYW5kIHB2LnN0YXJ0c3dpdGgocHJlZmVycmVkX3ZbOmxlbihwcmVmZXJyZWRfdiktMV0pOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBmaW5kUHJlZmVycmVkUHJvdmlkZXIocG4sIGNmZ0RhdGEsIGRhdGFDYWNoZSwgcGtnX3BuID0gTm9uZSwgaXRlbSA9IE5vbmUpOgorICAgICIiIgorICAgIEZpbmQgdGhlIGZpcnN0IHByb3ZpZGVyIGluIHBrZ19wbiB3aXRoIGEgUFJFRkVSUkVEX1ZFUlNJT04gc2V0LgorICAgICIiIgorCisgICAgcHJlZmVycmVkX2ZpbGUgPSBOb25lCisgICAgcHJlZmVycmVkX3ZlciA9IE5vbmUKKworICAgIGxvY2FsZGF0YSA9IGRhdGEuY3JlYXRlQ29weShjZmdEYXRhKQorICAgIGxvY2FsZGF0YS5zZXRWYXIoJ09WRVJSSURFUycsICIlczpwbi0lczolcyIgJSAoZGF0YS5nZXRWYXIoJ09WRVJSSURFUycsIGxvY2FsZGF0YSksIHBuLCBwbikpCisgICAgYmIuZGF0YS51cGRhdGVfZGF0YShsb2NhbGRhdGEpCisKKyAgICBwcmVmZXJyZWRfdiA9IGxvY2FsZGF0YS5nZXRWYXIoJ1BSRUZFUlJFRF9WRVJTSU9OJywgVHJ1ZSkKKyAgICBpZiBwcmVmZXJyZWRfdjoKKyAgICAgICAgbSA9IHJlLm1hdGNoKCcoXGQrOikqKC4qKShfLiopKicsIHByZWZlcnJlZF92KQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgaWYgbS5ncm91cCgxKToKKyAgICAgICAgICAgICAgICBwcmVmZXJyZWRfZSA9IG0uZ3JvdXAoMSlbOi0xXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmVmZXJyZWRfZSA9IE5vbmUKKyAgICAgICAgICAgIHByZWZlcnJlZF92ID0gbS5ncm91cCgyKQorICAgICAgICAgICAgaWYgbS5ncm91cCgzKToKKyAgICAgICAgICAgICAgICBwcmVmZXJyZWRfciA9IG0uZ3JvdXAoMylbMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZWZlcnJlZF9yID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJlZmVycmVkX2UgPSBOb25lCisgICAgICAgICAgICBwcmVmZXJyZWRfciA9IE5vbmUKKworICAgICAgICBmb3IgZmlsZV9zZXQgaW4gcGtnX3BuOgorICAgICAgICAgICAgZm9yIGYgaW4gZmlsZV9zZXQ6CisgICAgICAgICAgICAgICAgcGUsIHB2LCBwciA9IGRhdGFDYWNoZS5wa2dfcGVwdnByW2ZdCisgICAgICAgICAgICAgICAgaWYgcHJlZmVycmVkVmVyc2lvbk1hdGNoKHBlLCBwdiwgcHIsIHByZWZlcnJlZF9lLCBwcmVmZXJyZWRfdiwgcHJlZmVycmVkX3IpOgorICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRfZmlsZSA9IGYKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkX3ZlciA9IChwZSwgcHYsIHByKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgcHJlZmVycmVkX2ZpbGU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIHByZWZlcnJlZF9yOgorICAgICAgICAgICAgcHZfc3RyID0gJyVzLSVzJyAlIChwcmVmZXJyZWRfdiwgcHJlZmVycmVkX3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwdl9zdHIgPSBwcmVmZXJyZWRfdgorICAgICAgICBpZiBub3QgKHByZWZlcnJlZF9lIGlzIE5vbmUpOgorICAgICAgICAgICAgcHZfc3RyID0gJyVzOiVzJyAlIChwcmVmZXJyZWRfZSwgcHZfc3RyKQorICAgICAgICBpdGVtc3RyID0gIiIKKyAgICAgICAgaWYgaXRlbToKKyAgICAgICAgICAgIGl0ZW1zdHIgPSAiIChmb3IgaXRlbSAlcykiICUgaXRlbQorICAgICAgICBpZiBwcmVmZXJyZWRfZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oInByZWZlcnJlZCB2ZXJzaW9uICVzIG9mICVzIG5vdCBhdmFpbGFibGUlcyIsIHB2X3N0ciwgcG4sIGl0ZW1zdHIpCisgICAgICAgICAgICBhdmFpbGFibGVfdmVycyA9IFtdCisgICAgICAgICAgICBmb3IgZmlsZV9zZXQgaW4gcGtnX3BuOgorICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbGVfc2V0OgorICAgICAgICAgICAgICAgICAgICBwZSwgcHYsIHByID0gZGF0YUNhY2hlLnBrZ19wZXB2cHJbZl0KKyAgICAgICAgICAgICAgICAgICAgdmVyX3N0ciA9IHB2CisgICAgICAgICAgICAgICAgICAgIGlmIHBlOgorICAgICAgICAgICAgICAgICAgICAgICAgdmVyX3N0ciA9ICIlczolcyIgJSAocGUsIHZlcl9zdHIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB2ZXJfc3RyIGluIGF2YWlsYWJsZV92ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3ZlcnMuYXBwZW5kKHZlcl9zdHIpCisgICAgICAgICAgICBpZiBhdmFpbGFibGVfdmVyczoKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfdmVycy5zb3J0KCkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygidmVyc2lvbnMgb2YgJXMgYXZhaWxhYmxlOiAlcyIsIHBuLCAnICcuam9pbihhdmFpbGFibGVfdmVycykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgInNlbGVjdGluZyAlcyBhcyBQUkVGRVJSRURfVkVSU0lPTiAlcyBvZiBwYWNrYWdlICVzJXMiLCBwcmVmZXJyZWRfZmlsZSwgcHZfc3RyLCBwbiwgaXRlbXN0cikKKworICAgIHJldHVybiAocHJlZmVycmVkX3ZlciwgcHJlZmVycmVkX2ZpbGUpCisKKworZGVmIGZpbmRMYXRlc3RQcm92aWRlcihwbiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBmaWxlX3NldCk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBoaWdoZXN0IHZlcnNpb24gb2YgdGhlIHByb3ZpZGVycyBpbiBmaWxlX3NldC4KKyAgICBUYWtlIGRlZmF1bHQgcHJlZmVyZW5jZXMgaW50byBhY2NvdW50LgorICAgICIiIgorICAgIGxhdGVzdCA9IE5vbmUKKyAgICBsYXRlc3RfcCA9IDAKKyAgICBsYXRlc3RfZiA9IE5vbmUKKyAgICBmb3IgZmlsZV9uYW1lIGluIGZpbGVfc2V0OgorICAgICAgICBwZSwgcHYsIHByID0gZGF0YUNhY2hlLnBrZ19wZXB2cHJbZmlsZV9uYW1lXQorICAgICAgICBkcCA9IGRhdGFDYWNoZS5wa2dfZHBbZmlsZV9uYW1lXQorCisgICAgICAgIGlmIChsYXRlc3QgaXMgTm9uZSkgb3IgKChsYXRlc3RfcCA9PSBkcCkgYW5kICh1dGlscy52ZXJjbXAobGF0ZXN0LCAocGUsIHB2LCBwcikpIDwgMCkpIG9yIChkcCA+IGxhdGVzdF9wKToKKyAgICAgICAgICAgIGxhdGVzdCA9IChwZSwgcHYsIHByKQorICAgICAgICAgICAgbGF0ZXN0X2YgPSBmaWxlX25hbWUKKyAgICAgICAgICAgIGxhdGVzdF9wID0gZHAKKworICAgIHJldHVybiAobGF0ZXN0LCBsYXRlc3RfZikKKworCitkZWYgZmluZEJlc3RQcm92aWRlcihwbiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBwa2dfcG4gPSBOb25lLCBpdGVtID0gTm9uZSk6CisgICAgIiIiCisgICAgSWYgdGhlcmUgaXMgYSBQUkVGRVJSRURfVkVSU0lPTiwgZmluZCB0aGUgaGlnaGVzdC1wcmlvcml0eSBiYmZpbGUKKyAgICBwcm92aWRpbmcgdGhhdCB2ZXJzaW9uLiAgSWYgbm90LCBmaW5kIHRoZSBsYXRlc3QgdmVyc2lvbiBwcm92aWRlZCBieQorICAgIGFuIGJiZmlsZSBpbiB0aGUgaGlnaGVzdC1wcmlvcml0eSBzZXQuCisgICAgIiIiCisKKyAgICBzb3J0cGtnX3BuID0gc29ydFByaW9yaXRpZXMocG4sIGRhdGFDYWNoZSwgcGtnX3BuKQorICAgICMgRmluZCB0aGUgaGlnaGVzdCBwcmlvcml0eSBwcm92aWRlciB3aXRoIGEgUFJFRkVSUkVEX1ZFUlNJT04gc2V0CisgICAgKHByZWZlcnJlZF92ZXIsIHByZWZlcnJlZF9maWxlKSA9IGZpbmRQcmVmZXJyZWRQcm92aWRlcihwbiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBzb3J0cGtnX3BuLCBpdGVtKQorICAgICMgRmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcHJvdmlkZXIKKyAgICAobGF0ZXN0LCBsYXRlc3RfZikgPSBmaW5kTGF0ZXN0UHJvdmlkZXIocG4sIGNmZ0RhdGEsIGRhdGFDYWNoZSwgc29ydHBrZ19wblswXSkKKworICAgIGlmIHByZWZlcnJlZF9maWxlIGlzIE5vbmU6CisgICAgICAgIHByZWZlcnJlZF9maWxlID0gbGF0ZXN0X2YKKyAgICAgICAgcHJlZmVycmVkX3ZlciA9IGxhdGVzdAorCisgICAgcmV0dXJuIChsYXRlc3QsIGxhdGVzdF9mLCBwcmVmZXJyZWRfdmVyLCBwcmVmZXJyZWRfZmlsZSkKKworCitkZWYgX2ZpbHRlclByb3ZpZGVycyhwcm92aWRlcnMsIGl0ZW0sIGNmZ0RhdGEsIGRhdGFDYWNoZSk6CisgICAgIiIiCisgICAgVGFrZSBhIGxpc3Qgb2YgcHJvdmlkZXJzIGFuZCBmaWx0ZXIvcmVvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBwcmV2aW91cyBidWlsZCByZXN1bHRzCisgICAgIiIiCisgICAgZWxpZ2libGUgPSBbXQorICAgIHByZWZlcnJlZF92ZXJzaW9ucyA9IHt9CisgICAgc29ydHBrZ19wbiA9IHt9CisKKyAgICAjIFRoZSBvcmRlciBvZiBwcm92aWRlcnMgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIGZpbGVzIG9uIHRoZSBkaXNrCisgICAgIyB1cCB0byBoZXJlLiBTb3J0IHBrZ19wbiB0byBtYWtlIGRlcGVuZGVuY3kgaXNzdWVzIHJlcHJvZHVjaWJsZSByYXRoZXIKKyAgICAjIHRoYW4gZWZmZWN0aXZlbHkgcmFuZG9tLgorICAgIHByb3ZpZGVycy5zb3J0KCkKKworICAgICMgQ29sbGF0ZSBwcm92aWRlcnMgYnkgUE4KKyAgICBwa2dfcG4gPSB7fQorICAgIGZvciBwIGluIHByb3ZpZGVyczoKKyAgICAgICAgcG4gPSBkYXRhQ2FjaGUucGtnX2ZuW3BdCisgICAgICAgIGlmIHBuIG5vdCBpbiBwa2dfcG46CisgICAgICAgICAgICBwa2dfcG5bcG5dID0gW10KKyAgICAgICAgcGtnX3BuW3BuXS5hcHBlbmQocCkKKworICAgIGxvZ2dlci5kZWJ1ZygxLCAicHJvdmlkZXJzIGZvciAlcyBhcmU6ICVzIiwgaXRlbSwgcGtnX3BuLmtleXMoKSkKKworICAgICMgRmlyc3QgYWRkIFBSRUZFUlJFRF9WRVJTSU9OUworICAgIGZvciBwbiBpbiBwa2dfcG46CisgICAgICAgIHNvcnRwa2dfcG5bcG5dID0gc29ydFByaW9yaXRpZXMocG4sIGRhdGFDYWNoZSwgcGtnX3BuKQorICAgICAgICBwcmVmZXJyZWRfdmVyc2lvbnNbcG5dID0gZmluZFByZWZlcnJlZFByb3ZpZGVyKHBuLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIHNvcnRwa2dfcG5bcG5dLCBpdGVtKQorICAgICAgICBpZiBwcmVmZXJyZWRfdmVyc2lvbnNbcG5dWzFdOgorICAgICAgICAgICAgZWxpZ2libGUuYXBwZW5kKHByZWZlcnJlZF92ZXJzaW9uc1twbl1bMV0pCisKKyAgICAjIE5vdyBhZGQgbGF0ZXN0IHZlcnNpb25zCisgICAgZm9yIHBuIGluIHNvcnRwa2dfcG46CisgICAgICAgIGlmIHBuIGluIHByZWZlcnJlZF92ZXJzaW9ucyBhbmQgcHJlZmVycmVkX3ZlcnNpb25zW3BuXVsxXToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHByZWZlcnJlZF92ZXJzaW9uc1twbl0gPSBmaW5kTGF0ZXN0UHJvdmlkZXIocG4sIGNmZ0RhdGEsIGRhdGFDYWNoZSwgc29ydHBrZ19wbltwbl1bMF0pCisgICAgICAgIGVsaWdpYmxlLmFwcGVuZChwcmVmZXJyZWRfdmVyc2lvbnNbcG5dWzFdKQorCisgICAgaWYgbGVuKGVsaWdpYmxlKSA9PSAwOgorICAgICAgICBsb2dnZXIuZXJyb3IoIm5vIGVsaWdpYmxlIHByb3ZpZGVycyBmb3IgJXMiLCBpdGVtKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBJZiBwbiA9PSBpdGVtLCBnaXZlIGl0IGEgc2xpZ2h0IGRlZmF1bHQgcHJlZmVyZW5jZQorICAgICMgVGhpcyBtZWFucyBQUkVGRVJSRURfUFJPVklERVJfZm9vYmFyIGRlZmF1bHRzIHRvIGZvb2JhciBpZiBhdmFpbGFibGUKKyAgICBmb3IgcCBpbiBwcm92aWRlcnM6CisgICAgICAgIHBuID0gZGF0YUNhY2hlLnBrZ19mbltwXQorICAgICAgICBpZiBwbiAhPSBpdGVtOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgKG5ld3ZlcnMsIGZuKSA9IHByZWZlcnJlZF92ZXJzaW9uc1twbl0KKyAgICAgICAgaWYgbm90IGZuIGluIGVsaWdpYmxlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxpZ2libGUucmVtb3ZlKGZuKQorICAgICAgICBlbGlnaWJsZSA9IFtmbl0gKyBlbGlnaWJsZQorCisgICAgcmV0dXJuIGVsaWdpYmxlCisKKworZGVmIGZpbHRlclByb3ZpZGVycyhwcm92aWRlcnMsIGl0ZW0sIGNmZ0RhdGEsIGRhdGFDYWNoZSk6CisgICAgIiIiCisgICAgVGFrZSBhIGxpc3Qgb2YgcHJvdmlkZXJzIGFuZCBmaWx0ZXIvcmVvcmRlciBhY2NvcmRpbmcgdG8gdGhlCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBwcmV2aW91cyBidWlsZCByZXN1bHRzCisgICAgVGFrZXMgYSAibm9ybWFsIiB0YXJnZXQgaXRlbQorICAgICIiIgorCisgICAgZWxpZ2libGUgPSBfZmlsdGVyUHJvdmlkZXJzKHByb3ZpZGVycywgaXRlbSwgY2ZnRGF0YSwgZGF0YUNhY2hlKQorCisgICAgcHJlZmVydmFyID0gY2ZnRGF0YS5nZXRWYXIoJ1BSRUZFUlJFRF9QUk9WSURFUl8lcycgJSBpdGVtLCBUcnVlKQorICAgIGlmIHByZWZlcnZhcjoKKyAgICAgICAgZGF0YUNhY2hlLnByZWZlcnJlZFtpdGVtXSA9IHByZWZlcnZhcgorCisgICAgZm91bmRVbmlxdWUgPSBGYWxzZQorICAgIGlmIGl0ZW0gaW4gZGF0YUNhY2hlLnByZWZlcnJlZDoKKyAgICAgICAgZm9yIHAgaW4gZWxpZ2libGU6CisgICAgICAgICAgICBwbiA9IGRhdGFDYWNoZS5wa2dfZm5bcF0KKyAgICAgICAgICAgIGlmIGRhdGFDYWNoZS5wcmVmZXJyZWRbaXRlbV0gPT0gcG46CisgICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoInNlbGVjdGluZyAlcyB0byBzYXRpc2Z5ICVzIGR1ZSB0byBQUkVGRVJSRURfUFJPVklERVJTIiwgcG4sIGl0ZW0pCisgICAgICAgICAgICAgICAgZWxpZ2libGUucmVtb3ZlKHApCisgICAgICAgICAgICAgICAgZWxpZ2libGUgPSBbcF0gKyBlbGlnaWJsZQorICAgICAgICAgICAgICAgIGZvdW5kVW5pcXVlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBsb2dnZXIuZGVidWcoMSwgInNvcnRlZCBwcm92aWRlcnMgZm9yICVzIGFyZTogJXMiLCBpdGVtLCBlbGlnaWJsZSkKKworICAgIHJldHVybiBlbGlnaWJsZSwgZm91bmRVbmlxdWUKKworZGVmIGZpbHRlclByb3ZpZGVyc1J1blRpbWUocHJvdmlkZXJzLCBpdGVtLCBjZmdEYXRhLCBkYXRhQ2FjaGUpOgorICAgICIiIgorICAgIFRha2UgYSBsaXN0IG9mIHByb3ZpZGVycyBhbmQgZmlsdGVyL3Jlb3JkZXIgYWNjb3JkaW5nIHRvIHRoZQorICAgIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgcHJldmlvdXMgYnVpbGQgcmVzdWx0cworICAgIFRha2VzIGEgInJ1bnRpbWUiIHRhcmdldCBpdGVtCisgICAgIiIiCisKKyAgICBlbGlnaWJsZSA9IF9maWx0ZXJQcm92aWRlcnMocHJvdmlkZXJzLCBpdGVtLCBjZmdEYXRhLCBkYXRhQ2FjaGUpCisKKyAgICAjIFNob3VsZCB1c2UgZGF0YUNhY2hlLnByZWZlcnJlZCBoZXJlPworICAgIHByZWZlcnJlZCA9IFtdCisgICAgcHJlZmVycmVkX3ZhcnMgPSBbXQorICAgIHBucyA9IHt9CisgICAgZm9yIHAgaW4gZWxpZ2libGU6CisgICAgICAgIHBuc1tkYXRhQ2FjaGUucGtnX2ZuW3BdXSA9IHAKKyAgICBmb3IgcCBpbiBlbGlnaWJsZToKKyAgICAgICAgcG4gPSBkYXRhQ2FjaGUucGtnX2ZuW3BdCisgICAgICAgIHByb3ZpZGVzID0gZGF0YUNhY2hlLnBuX3Byb3ZpZGVzW3BuXQorICAgICAgICBmb3IgcHJvdmlkZSBpbiBwcm92aWRlczoKKyAgICAgICAgICAgIHByZWZlcnZhciA9IGNmZ0RhdGEuZ2V0VmFyKCdQUkVGRVJSRURfUFJPVklERVJfJXMnICUgcHJvdmlkZSwgVHJ1ZSkKKyAgICAgICAgICAgICNsb2dnZXIuZGVidWcoMSwgImNoZWNraW5nIFBSRUZFUlJFRF9QUk9WSURFUl8lcyAodmFsdWUgJXMpIGFnYWluc3QgJXMiLCBwcm92aWRlLCBwcmVmZXJ2YXIsIHBucy5rZXlzKCkpCisgICAgICAgICAgICBpZiBwcmVmZXJ2YXIgaW4gcG5zIGFuZCBwbnNbcHJlZmVydmFyXSBub3QgaW4gcHJlZmVycmVkOgorICAgICAgICAgICAgICAgIHZhciA9ICJQUkVGRVJSRURfUFJPVklERVJfJXMgPSAlcyIgJSAocHJvdmlkZSwgcHJlZmVydmFyKQorICAgICAgICAgICAgICAgIGxvZ2dlci52ZXJib3NlKCJzZWxlY3RpbmcgJXMgdG8gc2F0aXNmeSBydW50aW1lICVzIGR1ZSB0byAlcyIsIHByZWZlcnZhciwgaXRlbSwgdmFyKQorICAgICAgICAgICAgICAgIHByZWZlcnJlZF92YXJzLmFwcGVuZCh2YXIpCisgICAgICAgICAgICAgICAgcHJlZiA9IHBuc1twcmVmZXJ2YXJdCisgICAgICAgICAgICAgICAgZWxpZ2libGUucmVtb3ZlKHByZWYpCisgICAgICAgICAgICAgICAgZWxpZ2libGUgPSBbcHJlZl0gKyBlbGlnaWJsZQorICAgICAgICAgICAgICAgIHByZWZlcnJlZC5hcHBlbmQocHJlZikKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgbnVtYmVyUHJlZmVycmVkID0gbGVuKHByZWZlcnJlZCkKKworICAgIGlmIG51bWJlclByZWZlcnJlZCA+IDE6CisgICAgICAgIGxvZ2dlci5lcnJvcigiVHJ5aW5nIHRvIHJlc29sdmUgcnVudGltZSBkZXBlbmRlbmN5ICVzIHJlc3VsdGVkIGluIGNvbmZsaWN0aW5nIFBSRUZFUlJFRF9QUk9WSURFUiBlbnRyaWVzIGJlaW5nIGZvdW5kLlxuVGhlIHByb3ZpZGVycyBmb3VuZCB3ZXJlOiAlc1xuVGhlIFBSRUZFUlJFRF9QUk9WSURFUiBlbnRyaWVzIHJlc3VsdGluZyBpbiB0aGlzIGNvbmZsaWN0IHdlcmU6ICVzIiwgaXRlbSwgcHJlZmVycmVkLCBwcmVmZXJyZWRfdmFycykKKworICAgIGxvZ2dlci5kZWJ1ZygxLCAic29ydGVkIHJ1bnRpbWUgcHJvdmlkZXJzIGZvciAlcyBhcmU6ICVzIiwgaXRlbSwgZWxpZ2libGUpCisKKyAgICByZXR1cm4gZWxpZ2libGUsIG51bWJlclByZWZlcnJlZAorCityZWdleHBfY2FjaGUgPSB7fQorCitkZWYgZ2V0UnVudGltZVByb3ZpZGVycyhkYXRhQ2FjaGUsIHJkZXBlbmQpOgorICAgICIiIgorICAgIFJldHVybiBhbnkgcHJvdmlkZXJzIG9mIHJ1bnRpbWUgZGVwZW5kZW5jeQorICAgICIiIgorICAgIHJwcm92aWRlcnMgPSBbXQorCisgICAgaWYgcmRlcGVuZCBpbiBkYXRhQ2FjaGUucnByb3ZpZGVyczoKKyAgICAgICAgcnByb3ZpZGVycyArPSBkYXRhQ2FjaGUucnByb3ZpZGVyc1tyZGVwZW5kXQorCisgICAgaWYgcmRlcGVuZCBpbiBkYXRhQ2FjaGUucGFja2FnZXM6CisgICAgICAgIHJwcm92aWRlcnMgKz0gZGF0YUNhY2hlLnBhY2thZ2VzW3JkZXBlbmRdCisKKyAgICBpZiBycHJvdmlkZXJzOgorICAgICAgICByZXR1cm4gcnByb3ZpZGVycworCisgICAgIyBPbmx5IHNlYXJjaCBkeW5hbWljIHBhY2thZ2VzIGlmIHdlIGNhbid0IGZpbmQgYW55dGhpbmcgaW4gb3RoZXIgdmFyaWFibGVzCisgICAgZm9yIHBhdHRlcm4gaW4gZGF0YUNhY2hlLnBhY2thZ2VzX2R5bmFtaWM6CisgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoJysnLCAiXCsiKQorICAgICAgICBpZiBwYXR0ZXJuIGluIHJlZ2V4cF9jYWNoZToKKyAgICAgICAgICAgIHJlZ2V4cCA9IHJlZ2V4cF9jYWNoZVtwYXR0ZXJuXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlZ2V4cCA9IHJlLmNvbXBpbGUocGF0dGVybikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkVycm9yIHBhcnNpbmcgcmVndWxhciBleHByZXNzaW9uICclcyciLCBwYXR0ZXJuKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZWdleHBfY2FjaGVbcGF0dGVybl0gPSByZWdleHAKKyAgICAgICAgaWYgcmVnZXhwLm1hdGNoKHJkZXBlbmQpOgorICAgICAgICAgICAgcnByb3ZpZGVycyArPSBkYXRhQ2FjaGUucGFja2FnZXNfZHluYW1pY1twYXR0ZXJuXQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJBc3N1bWluZyAlcyBpcyBhIGR5bmFtaWMgcGFja2FnZSwgYnV0IGl0IG1heSBub3QgZXhpc3QiICUgcmRlcGVuZCkKKworICAgIHJldHVybiBycHJvdmlkZXJzCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9weXNoL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvcHlzaC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcHlzaC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcHlzaC9idWlsdGluLnB5IGIvYml0YmFrZS9saWIvYmIvcHlzaC9idWlsdGluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDhlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL2J1aWx0aW4ucHkKQEAgLTAsMCArMSw3MTAgQEAKKyMgYnVpbHRpbi5weSAtIGJ1aWx0aW5zIGFuZCB1dGlsaXRpZXMgZGVmaW5pdGlvbnMgZm9yIHB5c2guCisjCisjIENvcHlyaWdodCAyMDA3IFBhdHJpY2sgTWV6YXJkCisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworIiIiQnVpbHRpbiBhbmQgaW50ZXJuYWwgdXRpbGl0aWVzIGltcGxlbWVudGF0aW9ucy4KKworLSBCZXdhcmUgbm90IHRvIHVzZSBweXRob24gaW50ZXJwcmV0ZXIgZW52aXJvbm1lbnQgYXMgaWYgaXQgd2VyZSB0aGUgc2hlbGwKK2Vudmlyb25tZW50LiBGb3IgaW5zdGFuY2UsIGNvbW1hbmRzIHdvcmtpbmcgZGlyZWN0b3J5IG11c3QgYmUgZXhwbGljaXRlbHkgaGFuZGxlZAordGhyb3VnaCBlbnZbJ1BXRCddIGluc3RlYWQgb2YgcmVseWluZyBvbiBweXRob24gd29ya2luZyBkaXJlY3RvcnkuCisiIiIKK2ltcG9ydCBlcnJubworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2RlZiBoYXNfc3VicHJvY2Vzc19idWcoKToKKyAgICByZXR1cm4gZ2V0YXR0cihzdWJwcm9jZXNzLCAnbGlzdDJjbWRsaW5lJykgYW5kIFwKKyAgICAgICAoICAgIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnJ10pID09ICcnIG9yIFwKKyAgICAgICAgICAgIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnZm9vfGJhciddKSA9PSAnZm9vfGJhcicpCisgICAgICAgICAgICAKKyMgRGV0ZWN0IHB5dGhvbiBidWcgMTYzNDM0MzogInN1YnByb2Nlc3Mgc3dhbGxvd3MgZW1wdHkgYXJndW1lbnRzIHVuZGVyIHdpbjMyIgorIyA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyL2luZGV4LnBocD9mdW5jPWRldGFpbCZhaWQ9MTYzNDM0MyZncm91cF9pZD01NDcwJmF0aWQ9MTA1NDcwPgorIyBBbHNvIGRldGVjdDogIlsgMTcxMDgwMiBdIHN1YnByb2Nlc3MgbXVzdCBlc2NhcGUgcmVkaXJlY3Rpb24gY2hhcmFjdGVycyB1bmRlciB3aW4zMiIKKyMgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTE3MTA4MDImZ3JvdXBfaWQ9NTQ3MCZhdGlkPTEwNTQ3MD4KK2lmIGhhc19zdWJwcm9jZXNzX2J1ZygpOgorICAgIGltcG9ydCBzdWJwcm9jZXNzX2ZpeAorICAgIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lID0gc3VicHJvY2Vzc19maXgubGlzdDJjbWRsaW5lCisKK2Zyb20gc2hlcnJvcnMgaW1wb3J0ICoKKworY2xhc3MgTm9uRXhpdGluZ1BhcnNlcihvcHRwYXJzZS5PcHRpb25QYXJzZXIpOgorICAgICIiIk9wdGlvblBhcnNlciBkZWZhdWx0IGJlaGF2aW91ciB1cG9uIGVycm9yIGlzIHRvIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGFuZAorICAgIGV4aXQuIFJhaXNlIGEgdXRpbGl0eSBlcnJvciBpbnN0ZWFkLgorICAgICIiIgorICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgorICAgICAgICByYWlzZSBVdGlsaXR5RXJyb3IobXNnKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHNldCBzcGVjaWFsIGJ1aWx0aW4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK09QVF9TRVQgPSBOb25FeGl0aW5nUGFyc2VyKHVzYWdlPSJzZXQgLSBzZXQgb3IgdW5zZXQgb3B0aW9ucyBhbmQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIikKK09QVF9TRVQuYWRkX29wdGlvbiggJy1mJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0naGFzX2YnLCBkZWZhdWx0PUZhbHNlLAorICAgIGhlbHA9J1RoZSBzaGVsbCBzaGFsbCBkaXNhYmxlIHBhdGhuYW1lIGV4cGFuc2lvbi4nKQorT1BUX1NFVC5hZGRfb3B0aW9uKCctZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2hhc19lJywgZGVmYXVsdD1GYWxzZSwKKyAgICBoZWxwPSIiIldoZW4gdGhpcyBvcHRpb24gaXMgb24sIGlmIGEgc2ltcGxlIGNvbW1hbmQgZmFpbHMgZm9yIGFueSBvZiB0aGUgXAorICAgIHJlYXNvbnMgbGlzdGVkIGluIENvbnNlcXVlbmNlcyBvZiBTaGVsbCBFcnJvcnMgb3IgcmV0dXJucyBhbiBleGl0IHN0YXR1cyBcCisgICAgdmFsdWUgPjAsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgY29tcG91bmQgbGlzdCBmb2xsb3dpbmcgYSB3aGlsZSwgdW50aWwsIFwKKyAgICBvciBpZiBrZXl3b3JkLCBhbmQgaXMgbm90IGEgcGFydCBvZiBhbiBBTkQgb3IgT1IgbGlzdCwgYW5kIGlzIG5vdCBhIFwKKyAgICBwaXBlbGluZSBwcmVjZWRlZCBieSB0aGUgISByZXNlcnZlZCB3b3JkLCB0aGVuIHRoZSBzaGVsbCBzaGFsbCBpbW1lZGlhdGVseSBcCisgICAgZXhpdC4iIiIpCitPUFRfU0VULmFkZF9vcHRpb24oJy14JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0naGFzX3gnLCBkZWZhdWx0PUZhbHNlLAorICAgIGhlbHA9IiIiVGhlIHNoZWxsIHNoYWxsIHdyaXRlIHRvIHN0YW5kYXJkIGVycm9yIGEgdHJhY2UgZm9yIGVhY2ggY29tbWFuZCBcCisgICAgYWZ0ZXIgaXQgZXhwYW5kcyB0aGUgY29tbWFuZCBhbmQgYmVmb3JlIGl0IGV4ZWN1dGVzIGl0LiBJdCBpcyB1bnNwZWNpZmllZCBcCisgICAgd2hldGhlciB0aGUgY29tbWFuZCB0aGF0IHR1cm5zIHRyYWNpbmcgb2ZmIGlzIHRyYWNlZC4iIiIpCisKK2RlZiBidWlsdGluX3NldChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorCisgICAgb3B0aW9uLCBhcmdzID0gT1BUX1NFVC5wYXJzZV9hcmdzKGFyZ3MpCisgICAgZW52ID0gaW50ZXJwLmdldF9lbnYoKQorICAgIAorICAgIGlmIG9wdGlvbi5oYXNfZjoKKyAgICAgICAgZW52LnNldF9vcHQoJy1mJykKKyAgICBpZiBvcHRpb24uaGFzX2U6CisgICAgICAgIGVudi5zZXRfb3B0KCctZScpCisgICAgaWYgb3B0aW9uLmhhc194OgorICAgICAgICBlbnYuc2V0X29wdCgnLXgnKQorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHNoaWZ0IHNwZWNpYWwgYnVpbHRpbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorZGVmIGJ1aWx0aW5fc2hpZnQobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgcGFyYW1zID0gaW50ZXJwLmdldF9lbnYoKS5nZXRfcG9zaXRpb25hbF9hcmdzKCkKKyAgICBpZiBhcmdzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuID0gaW50KGFyZ3NbMF0pCisgICAgICAgICAgICBpZiBuID4gbGVuKHBhcmFtcyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOgorICAgICAgICBuID0gMQorICAgICAgICAKKyAgICBwYXJhbXNbOm5dID0gW10KKyAgICBpbnRlcnAuZ2V0X2VudigpLnNldF9wb3NpdGlvbmFsX2FyZ3MocGFyYW1zKQorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGV4cG9ydCBzcGVjaWFsIGJ1aWx0aW4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK09QVF9FWFBPUlQgPSBOb25FeGl0aW5nUGFyc2VyKHVzYWdlPSJzZXQgLSBzZXQgb3IgdW5zZXQgb3B0aW9ucyBhbmQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIikKK09QVF9FWFBPUlQuYWRkX29wdGlvbignLXAnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfcCcsIGRlZmF1bHQ9RmFsc2UpCisKK2RlZiBidWlsdGluX2V4cG9ydChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICBvcHRpb24sIGFyZ3MgPSBPUFRfRVhQT1JULnBhcnNlX2FyZ3MoYXJncykKKyAgICBpZiBvcHRpb24uaGFzX3A6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgIAorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBhcmcuc3BsaXQoJz0nLCAxKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gYXJnLCBOb25lCisgICAgICAgIGVudiA9IGludGVycC5nZXRfZW52KCkuZXhwb3J0KG5hbWUsIHZhbHVlKQorICAgIAorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHJldHVybiBzcGVjaWFsIGJ1aWx0aW4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK2RlZiBidWlsdGluX3JldHVybihuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgIHJlcyA9IDAKKyAgICBpZiBhcmdzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXMgPSBpbnQoYXJnc1swXSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXMgPSAwCisgICAgICAgIGlmIG5vdCAwPD1yZXM8PTI1NToKKyAgICAgICAgICAgIHJlcyA9IDAKKyAgICAgICAgICAgIAorICAgICMgQlVHOiBzaG91bGQgYmUgbGFzdCBleGVjdXRlZCBjb21tYW5kIGV4aXQgY29kZSAgICAgICAgCisgICAgcmFpc2UgUmV0dXJuU2lnbmFsKHJlcykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyB0cmFwIHNwZWNpYWwgYnVpbHRpbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorZGVmIGJ1aWx0aW5fdHJhcChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgIGlmIGxlbihhcmdzKSA8IDI6CisgICAgICAgIHN0ZGVyci53cml0ZSgndHJhcDogdXNhZ2U6IHRyYXAgW1thcmddIHNpZ25hbF9zcGVjIC4uLl1cbicpCisgICAgICAgIHJldHVybiAyCisKKyAgICBhY3Rpb24gPSBhcmdzWzBdCisgICAgZm9yIHNpZyBpbiBhcmdzWzE6XToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW52LnRyYXBzW3NpZ10gPSBhY3Rpb24KKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgc3RkZXJyLndyaXRlKCd0cmFwOiAlc1xuJyAlIHN0cihlKSkKKyAgICByZXR1cm4gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHVuc2V0IHNwZWNpYWwgYnVpbHRpbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK09QVF9VTlNFVCA9IE5vbkV4aXRpbmdQYXJzZXIoInVuc2V0IC0gdW5zZXQgdmFsdWVzIGFuZCBhdHRyaWJ1dGVzIG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIikKK09QVF9VTlNFVC5hZGRfb3B0aW9uKCAnLWYnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfZicsIGRlZmF1bHQ9RmFsc2UpCitPUFRfVU5TRVQuYWRkX29wdGlvbiggJy12JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0naGFzX3YnLCBkZWZhdWx0PUZhbHNlKQorCitkZWYgYnVpbHRpbl91bnNldChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICBvcHRpb24sIGFyZ3MgPSBPUFRfVU5TRVQucGFyc2VfYXJncyhhcmdzKQorICAgIAorICAgIHN0YXR1cyA9IDAKKyAgICBlbnYgPSBpbnRlcnAuZ2V0X2VudigpCisgICAgZm9yIGFyZyBpbiBhcmdzOiAgICAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgb3B0aW9uLmhhc19mOgorICAgICAgICAgICAgICAgIGVudi5yZW1vdmVfZnVuY3Rpb24oYXJnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWwgZW52W2FyZ10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVmFyQXNzaWdubWVudEVycm9yOgorICAgICAgICAgICAgc3RhdHVzID0gMQorICAgICAgICAgICAgCisgICAgcmV0dXJuIHN0YXR1cworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHdhaXQgc3BlY2lhbCBidWlsdGluCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitkZWYgYnVpbHRpbl93YWl0KG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisKKyAgICByZXR1cm4gaW50ZXJwLndhaXQoW2ludChhcmcpIGZvciBhcmcgaW4gYXJnc10pCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgY2F0IHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgdXRpbGl0eV9jYXQobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKworICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBhcmdzID0gWyctJ10KKworICAgIHN0YXR1cyA9IDAKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmIGFyZyA9PSAnLSc6CisgICAgICAgICAgICBkYXRhID0gc3RkaW4ucmVhZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGVudlsnUFdEJ10sIGFyZykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gZmlsZShwYXRoLCAncmInKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBzdGRvdXQud3JpdGUoZGF0YSkKKyAgICAgICAgc3Rkb3V0LmZsdXNoKCkKKyAgICByZXR1cm4gc3RhdHVzCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGNkIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK09QVF9DRCA9IE5vbkV4aXRpbmdQYXJzZXIoImNkIC0gY2hhbmdlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIpCisKK2RlZiB1dGlsaXR5X2NkKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisKKyAgICBvcHRpb24sIGFyZ3MgPSBPUFRfQ0QucGFyc2VfYXJncyhhcmdzKQorICAgIGVudiA9IGludGVycC5nZXRfZW52KCkKKyAgICAKKyAgICBkaXJlY3RvcnkgPSBOb25lCisgICAgcHJpbnRkaXIgPSBGYWxzZQorICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBob21lID0gZW52LmdldCgnSE9NRScpCisgICAgICAgIGlmIGhvbWU6CisgICAgICAgICAgICAjIFVuc3BlY2lmaWVkLCBkbyBub3RoaW5nCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlyZWN0b3J5ID0gaG9tZQorICAgIGVsaWYgbGVuKGFyZ3MpPT0xOgorICAgICAgICBkaXJlY3RvcnkgPSBhcmdzWzBdCisgICAgICAgIGlmIGRpcmVjdG9yeT09Jy0nOgorICAgICAgICAgICAgaWYgJ09MRFBXRCcgbm90IGluIGVudjoKKyAgICAgICAgICAgICAgICByYWlzZSBVdGlsaXR5RXJyb3IoIk9MRFBXRCBub3Qgc2V0IikKKyAgICAgICAgICAgIHByaW50ZGlyID0gVHJ1ZQorICAgICAgICAgICAgZGlyZWN0b3J5ID0gZW52WydPTERQV0QnXQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFV0aWxpdHlFcnJvcigidG9vIG1hbnkgYXJndW1lbnRzIikKKyAgICAgICAgICAgIAorICAgIGN1cnBhdGggPSBOb25lCisgICAgIyBBYnNvbHV0ZSBkaXJlY3RvcmllcyB3aWxsIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBvcy5wYXRoLmpvaW4gY2FsbC4KKyAgICBpZiBub3QgZGlyZWN0b3J5LnN0YXJ0c3dpdGgoJy4nKSBhbmQgbm90IGRpcmVjdG9yeS5zdGFydHN3aXRoKCcuLicpOgorICAgICAgICBjZHBhdGhzID0gZW52LmdldCgnQ0RQQVRIJywgJy4nKS5zcGxpdCgnOycpCisgICAgICAgIGZvciBjZHBhdGggaW4gY2RwYXRoczoKKyAgICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4oY2RwYXRoLCBkaXJlY3RvcnkpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHApOgorICAgICAgICAgICAgICAgIGN1cnBhdGggPSBwCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAKKyAgICBpZiBjdXJwYXRoIGlzIE5vbmU6CisgICAgICAgIGN1cnBhdGggPSBkaXJlY3RvcnkKKyAgICBjdXJwYXRoID0gb3MucGF0aC5qb2luKGVudlsnUFdEJ10sIGRpcmVjdG9yeSkKKworICAgIGVudlsnT0xEUFdEJ10gPSBlbnZbJ1BXRCddCisgICAgZW52WydQV0QnXSA9IGN1cnBhdGgKKyAgICBpZiBwcmludGRpcjoKKyAgICAgICAgc3Rkb3V0LndyaXRlKCclc1xuJyAlIGN1cnBhdGgpCisgICAgcmV0dXJuIDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBjb2xvbiB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCitkZWYgdXRpbGl0eV9jb2xvbihuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGVjaG8gdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorZGVmIHV0aWxpdHlfZWNobyhuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICAjIEVjaG8gb25seSB0YWtlcyBhcmd1bWVudHMsIG5vIG9wdGlvbnMuIFVzZSBwcmludGYgaWYgeW91IG5lZWQgZmFuY3kgc3R1ZmYuCisgICAgb3V0cHV0ID0gJyAnLmpvaW4oYXJncykgKyAnXG4nCisgICAgc3Rkb3V0LndyaXRlKG91dHB1dCkKKyAgICBzdGRvdXQuZmx1c2goKQorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGVncmVwIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGVncmVwIGlzIHVzdWFsbHkgYSBzaGVsbCBzY3JpcHQuCisjIFVuZm9ydHVuYXRlbHksIHB5c2ggZG9lcyBub3Qgc3VwcG9ydCBzaGVsbCBzY3JpcHRzICp3aXRoIGFyZ3VtZW50cyogcmlnaHQgbm93LAorIyBzbyB0aGUgcmVkaXJlY3Rpb24gaXMgaW1wbGVtZW50ZWQgaGVyZSwgYXNzdW1pbmcgZ3JlcCBpcyBhdmFpbGFibGUuCitkZWYgdXRpbGl0eV9lZ3JlcChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICByZXR1cm4gcnVuX2NvbW1hbmQoJ2dyZXAnLCBbJy1FJ10gKyBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgCisgICAgICAgIHN0ZGVyciwgZGVidWdmbGFncykKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgZW52IHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK2RlZiB1dGlsaXR5X2VudihuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgIAorICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF09PSctaSc6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ2VudjogLWkgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCcpCisgICAgCisgICAgaSA9IDAKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmICc9JyBub3QgaW4gYXJnOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIyBVcGRhdGUgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBhcmcuc3BsaXQoJz0nLCAxKQorICAgICAgICBlbnZbbmFtZV0gPSB2YWx1ZQorICAgICAgICBpICs9IDEKKyAgICAgICAgCisgICAgaWYgYXJnc1tpOl06CisgICAgICAgICMgRmluZCB0aGVuIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBpbnRlcnByZXRlcgorICAgICAgICB1dGlsaXR5ID0gZW52LmZpbmRfaW5fcGF0aChhcmdzW2ldKQorICAgICAgICBpZiBub3QgdXRpbGl0eToKKyAgICAgICAgICAgIHJldHVybiAxMjcKKyAgICAgICAgYXJnc1tpOmkrMV0gPSB1dGlsaXR5CisgICAgICAgIG5hbWUgPSBhcmdzW2ldCisgICAgICAgIGFyZ3MgPSBhcmdzW2krMTpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBydW5fY29tbWFuZChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCAKKyAgICAgICAgICAgICAgICBkZWJ1Z2ZsYWdzKQorICAgICAgICBleGNlcHQgVXRpbGl0eUVycm9yOgorICAgICAgICAgICAgc3RkZXJyLndyaXRlKCdlbnY6IGZhaWxlZCB0byBleGVjdXRlICVzJyAlICcgJy5qb2luKFtuYW1lXSthcmdzKSkKKyAgICAgICAgICAgIHJldHVybiAxMjYgICAgICAgICAgICAKKyAgICBlbHNlOgorICAgICAgICBmb3IgcGFpciBpbiBlbnYuZ2V0X3ZhcmlhYmxlcygpLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc3Rkb3V0LndyaXRlKCclcz0lc1xuJyAlIHBhaXIpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgZXhpdCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIHV0aWxpdHlfZXhpdChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICByZXMgPSBOb25lCisgICAgaWYgYXJnczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gaW50KGFyZ3NbMF0pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmVzID0gTm9uZQorICAgICAgICBpZiBub3QgMDw9cmVzPD0yNTU6CisgICAgICAgICAgICByZXMgPSBOb25lCisgICAgICAgICAgICAKKyAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgIyBCVUc6IHNob3VsZCBiZSBsYXN0IGV4ZWN1dGVkIGNvbW1hbmQgZXhpdCBjb2RlCisgICAgICAgIHJlcyA9IDAKKyAgICAgICAgCisgICAgcmFpc2UgRXhpdFNpZ25hbChyZXMpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgZmdyZXAgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2VlIGVncmVwCitkZWYgdXRpbGl0eV9mZ3JlcChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICBpZiAnZGVidWctdXRpbGl0eScgaW4gZGVidWdmbGFnczoKKyAgICAgICAgcHJpbnQgaW50ZXJwLmxvZygnICcuam9pbihbbmFtZSwgc3RyKGFyZ3MpLCBpbnRlcnBbJ1BXRCddXSkgKyAnXG4nKQorICAgICAgICAKKyAgICByZXR1cm4gcnVuX2NvbW1hbmQoJ2dyZXAnLCBbJy1GJ10gKyBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgCisgICAgICAgIHN0ZGVyciwgZGVidWdmbGFncykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBndW56aXAgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2VlIGVncmVwCitkZWYgdXRpbGl0eV9ndW56aXAobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgcmV0dXJuIHJ1bl9jb21tYW5kKCdnemlwJywgWyctZCddICsgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIAorICAgICAgICBzdGRlcnIsIGRlYnVnZmxhZ3MpCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIGtpbGwgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiB1dGlsaXR5X2tpbGwobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICBwaWQgPSBpbnQoYXJnKQorICAgICAgICBzdGF0dXMgPSBzdWJwcm9jZXNzLmNhbGwoWydwc2tpbGwnLCAnL1QnLCBzdHIocGlkKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICMgcHNraWxsIGlzIGFzeW5jaHJvbm91cywgaGVuY2UgdGhlIHN0dXBpZCBwb2xsaW5nIGxvb3AKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsncHNsaXN0Jywgc3RyKHBpZCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgICAgICBvdXRwdXQgPSBwLmNvbW11bmljYXRlKClbMF0KKyAgICAgICAgICAgIGlmICgncHJvY2VzcyAlZCB3YXMgbm90JyAlIHBpZCkgaW4gb3V0cHV0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgcmV0dXJuIHN0YXR1cworICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBta2RpciB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorT1BUX01LRElSID0gTm9uRXhpdGluZ1BhcnNlcigibWtkaXIgLSBtYWtlIGRpcmVjdG9yaWVzLiIpCitPUFRfTUtESVIuYWRkX29wdGlvbignLXAnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdoYXNfcCcsIGRlZmF1bHQ9RmFsc2UpCisKK2RlZiB1dGlsaXR5X21rZGlyKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgICMgVE9ETzogaW1wbGVtZW50IHVtYXNrCisgICAgIyBUT0RPOiBpbXBsZW1lbnQgcHJvcGVyIHV0aWxpdHkgZXJyb3IgcmVwb3J0CisgICAgb3B0aW9uLCBhcmdzID0gT1BUX01LRElSLnBhcnNlX2FyZ3MoYXJncykKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZW52WydQV0QnXSwgYXJnKQorICAgICAgICBpZiBvcHRpb24uaGFzX3A6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgCisgICAgICAgICAgICBvcy5ta2RpcihwYXRoKQorICAgIHJldHVybiAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgbmV0c3RhdCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIHV0aWxpdHlfbmV0c3RhdChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBkZWJ1Z2ZsYWdzKToKKyAgICAjIERvIHlvdSByZWFsbHkgZXhwZWN0IG1lIHRvIGltcGxlbWVudCBuZXRzdGF0ID8KKyAgICAjIFRoaXMgZW1wdHkgZm9ybSBpcyBlbm91Z2ggZm9yIE1lcmN1cmlhbCB0ZXN0cyBzaW5jZSBpdCdzCisgICAgIyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBub3RoaW5nIHVwb24gc3VjY2Vzcy4gRmFraW5nIHRoaXMgdGVzdAorICAgICMgaXMgbm90IGEgYmlnIGRlYWwgZWl0aGVyLgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgcHdkIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK09QVF9QV0QgPSBOb25FeGl0aW5nUGFyc2VyKCJwd2QgLSByZXR1cm4gd29ya2luZyBkaXJlY3RvcnkgbmFtZSIpCitPUFRfUFdELmFkZF9vcHRpb24oJy1MJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0naGFzX0wnLCBkZWZhdWx0PVRydWUsCisgICAgaGVscD0iIiJJZiB0aGUgUFdEIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5zIGFuIGFic29sdXRlIHBhdGhuYW1lIG9mIFwKKyAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSBmaWxlbmFtZXMgZG90IG9yIGRvdC1kb3QsIFwKKyAgICBwd2Qgc2hhbGwgd3JpdGUgdGhpcyBwYXRobmFtZSB0byBzdGFuZGFyZCBvdXRwdXQuIE90aGVyd2lzZSwgdGhlIC1MIG9wdGlvbiBcCisgICAgc2hhbGwgYmVoYXZlIGFzIHRoZSAtUCBvcHRpb24uIiIiKQorT1BUX1BXRC5hZGRfb3B0aW9uKCctUCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2hhc19MJywgZGVmYXVsdD1GYWxzZSwKKyAgICBoZWxwPSIiIlRoZSBhYnNvbHV0ZSBwYXRobmFtZSB3cml0dGVuIHNoYWxsIG5vdCBjb250YWluIGZpbGVuYW1lcyB0aGF0LCBpbiBcCisgICAgdGhlIGNvbnRleHQgb2YgdGhlIHBhdGhuYW1lLCByZWZlciB0byBmaWxlcyBvZiB0eXBlIHN5bWJvbGljIGxpbmsuIiIiKQorCitkZWYgdXRpbGl0eV9wd2QobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKworICAgIG9wdGlvbiwgYXJncyA9IE9QVF9QV0QucGFyc2VfYXJncyhhcmdzKSAgICAgICAgCisgICAgc3Rkb3V0LndyaXRlKCclc1xuJyAlIGVudlsnUFdEJ10pCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyMgcHJpbnRmIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRV9VTkVTQ0FQRSA9IHJlLmNvbXBpbGUocicoXFx4W2EtekEtWjAtOV17Mn18XFxbMC03XXsxLDN9fFxcLiknKQorCitkZWYgdXRpbGl0eV9wcmludGYobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICAgICAgCisgICAgZGVmIHJlcGxhY2UobSk6CisgICAgICAgIGFzc2VydCBtLmdyb3VwKCkKKyAgICAgICAgZyA9IG0uZ3JvdXAoKVsxOl0KKyAgICAgICAgaWYgZy5zdGFydHN3aXRoKCd4Jyk6CisgICAgICAgICAgICByZXR1cm4gY2hyKGludChnWzE6XSwgMTYpKQorICAgICAgICBpZiBsZW4oZykgPD0gMyBhbmQgbGVuKFtjIGZvciBjIGluIGcgaWYgYyBpbiAnMDEyMzQ1NjcnXSkgPT0gbGVuKGcpOgorICAgICAgICAgICAgIyBZYXksIGFuIG9jdGFsIG51bWJlcgorICAgICAgICAgICAgcmV0dXJuIGNocihpbnQoZywgOCkpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnYSc6ICdcYScsCisgICAgICAgICAgICAnYic6ICdcYicsCisgICAgICAgICAgICAnZic6ICdcZicsCisgICAgICAgICAgICAnbic6ICdcbicsCisgICAgICAgICAgICAncic6ICdccicsCisgICAgICAgICAgICAndCc6ICdcdCcsCisgICAgICAgICAgICAndic6ICdcdicsCisgICAgICAgICAgICAnXFwnOiAnXFwnLAorICAgICAgICB9LmdldChnKQorICAgICAgICAKKyAgICAjIENvbnZlcnQgZXNjYXBlIHNlcXVlbmNlcworICAgIGZvcm1hdCA9IHJlLnN1YihSRV9VTkVTQ0FQRSwgcmVwbGFjZSwgYXJnc1swXSkKKyAgICBzdGRvdXQud3JpdGUoZm9ybWF0ICUgdHVwbGUoYXJnc1sxOl0pKQorICAgIHJldHVybiAwCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHRydWUgdXRpbGl0eQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiB1dGlsaXR5X3RydWUobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICByZXR1cm4gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisjIHNlZCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUkVfU0VEID0gcmUuY29tcGlsZShyJ15zKC4pLipcMVthLXpBLVpdKiQnKQorCisjIGN5Z3dpbiBzZWQgZmFpbHMgd2l0aCBzb21lIGV4cHJlc3Npb25zIHdoZW4gdGhleSBkbyBub3QgZW5kIHdpdGggYSBzaW5nbGUgc3BhY2UuCisjIHNlZSB1bml0IHRlc3RzIGZvciBkZXRhaWxzLiBJbnRlcmVzdGluZ2x5LCB0aGUgc2FtZSBleHByZXNzaW9ucyB3b3JrcyBwZXJmZWN0bHkKKyMgaW4gY3lnd2luIHNoZWxsLgorZGVmIHV0aWxpdHlfc2VkKG5hbWUsIGFyZ3MsIGludGVycCwgZW52LCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgICMgU2NhbiBwYXR0ZXJuIGFyZ3VtZW50cyBhbmQgYXBwZW5kIGEgc3BhY2UgaWYgbmVjZXNzYXJ5CisgICAgZm9yIGkgaW4geHJhbmdlKGxlbihhcmdzKSk6CisgICAgICAgIGlmIG5vdCBSRV9TRUQuc2VhcmNoKGFyZ3NbaV0pOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYXJnc1tpXSA9IGFyZ3NbaV0gKyAnICcKKworICAgIHJldHVybiBydW5fY29tbWFuZChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwgCisgICAgICAgIHN0ZGVyciwgZGVidWdmbGFncykKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBzbGVlcCB1dGlsaXR5CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIHV0aWxpdHlfc2xlZXAobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisgICAgaWYgJ2RlYnVnLXV0aWxpdHknIGluIGRlYnVnZmxhZ3M6CisgICAgICAgIHByaW50IGludGVycC5sb2coJyAnLmpvaW4oW25hbWUsIHN0cihhcmdzKSwgaW50ZXJwWydQV0QnXV0pICsgJ1xuJykKKyAgICB0aW1lLnNsZWVwKGludChhcmdzWzBdKSkKKyAgICByZXR1cm4gMAorICAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAorIyBzb3J0IHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitPUFRfU09SVCA9IE5vbkV4aXRpbmdQYXJzZXIoInNvcnQgLSBzb3J0LCBtZXJnZSwgb3Igc2VxdWVuY2UgY2hlY2sgdGV4dCBmaWxlcyIpCisKK2RlZiB1dGlsaXR5X3NvcnQobmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgZGVidWdmbGFncyk6CisKKyAgICBkZWYgc29ydChwYXRoKToKKyAgICAgICAgaWYgcGF0aCA9PSAnLSc6CisgICAgICAgICAgICBsaW5lcyA9IHN0ZGluLnJlYWRsaW5lcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IGZpbGUocGF0aCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBzdGRlcnIud3JpdGUoc3RyKGUpICsgJ1xuJykKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAKKyAgICAgICAgaWYgbGluZXMgYW5kIGxpbmVzWy0xXVstMV0hPSdcbic6CisgICAgICAgICAgICBsaW5lc1stMV0gPSBsaW5lc1stMV0gKyAnXG4nCisgICAgICAgIHJldHVybiBsaW5lcworICAgIAorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisgICAgICAgIAorICAgIG9wdGlvbiwgYXJncyA9IE9QVF9TT1JULnBhcnNlX2FyZ3MoYXJncykKKyAgICBhbGxsaW5lcyA9IFtdCisgICAgCisgICAgaWYgbGVuKGFyZ3MpPD0wOgorICAgICAgICBhcmdzICs9IFsnLSddCisgICAgICAgIAorICAgICMgTG9hZCBhbGwgZmlsZXMgbGluZXMKKyAgICBjdXJkaXIgPSBvcy5nZXRjd2QoKQorICAgIHRyeToKKyAgICAgICAgb3MuY2hkaXIoZW52WydQV0QnXSkKKyAgICAgICAgZm9yIHBhdGggaW4gYXJnczoKKyAgICAgICAgICAgIGFsbGxpbmVzICs9IHNvcnQocGF0aCkKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihjdXJkaXIpCisgICAgICAgICAgICAKKyAgICBhbGxsaW5lcy5zb3J0KCkKKyAgICBmb3IgbGluZSBpbiBhbGxsaW5lczoKKyAgICAgICAgc3Rkb3V0LndyaXRlKGxpbmUpCisgICAgcmV0dXJuIDAKKyAgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGhnIHV0aWxpdHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2hnY29tbWFuZHMgPSBbCisgICAgJ2FkZCcsCisgICAgJ2FkZHJlbW92ZScsCisgICAgJ2NvbW1pdCcsICdjaScsCisgICAgJ2RlYnVncmVuYW1lJywKKyAgICAnZGVidWd3YWxrJywKKyAgICAnZmFsYWJhbGEnLCAjIER1bW15IGNvbW1hbmQgdXNlZCBpbiBhIG1lcmN1cmlhbCB0ZXN0CisgICAgJ2luY29taW5nJywKKyAgICAnbG9jYXRlJywKKyAgICAncHVsbCcsCisgICAgJ3B1c2gnLAorICAgICdxaW5pdCcsCisgICAgJ3JlbW92ZScsICdybScsCisgICAgJ3JlbmFtZScsICdtdicsCisgICAgJ3JldmVydCcsICAgIAorICAgICdzaG93Y29uZmlnJywKKyAgICAnc3RhdHVzJywgJ3N0JywKKyAgICAnc3RyaXAnLAorICAgIF0KKworZGVmIHJld3JpdGVzbGFzaGVzKG5hbWUsIGFyZ3MpOgorICAgICMgU2V2ZXJhbCBoZyBjb21tYW5kcyBvdXRwdXQgZmlsZSBwYXRocywgcmV3cml0ZSB0aGUgc2VwYXJhdG9ycworICAgIGlmIGxlbihhcmdzKSA+IDEgYW5kIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgncHl0aG9uJykgXAorICAgICAgIGFuZCBhcmdzWzBdLmVuZHN3aXRoKCdoZycpOgorICAgICAgICBmb3IgY21kIGluIGhnY29tbWFuZHM6CisgICAgICAgICAgICBpZiBjbWQgaW4gYXJnc1sxOl06CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIAorICAgICMgc3ZuIG91dHB1dCBjb250YWlucyBtYW55IHBhdGhzIHdpdGggT1Mgc3BlY2lmaWMgc2VwYXJhdG9ycy4KKyAgICAjIE5vcm1hbGl6ZSB0aGVzZSB0byB1bml4IHBhdGhzLgorICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKG5hbWUpCisgICAgaWYgYmFzZS5zdGFydHN3aXRoKCdzdm4nKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICAKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIHJld3JpdGVoZyhvdXRwdXQpOgorICAgIGlmIG5vdCBvdXRwdXQ6CisgICAgICAgIHJldHVybiBvdXRwdXQKKyAgICAjIFJld3JpdGUgb3Mgc3BlY2lmaWMgbWVzc2FnZXMKKyAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgnOiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBmaWxlIHNwZWNpZmllZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpCisgICAgb3V0cHV0ID0gcmUuc3ViKCc6IEFjY2VzcyBpcyBkZW5pZWQuKiQnLCAnOiBQZXJtaXNzaW9uIGRlbmllZCcsIG91dHB1dCkKKyAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgnOiBObyBjb25uZWN0aW9uIGNvdWxkIGJlIG1hZGUgYmVjYXVzZSB0aGUgdGFyZ2V0IG1hY2hpbmUgYWN0aXZlbHkgcmVmdXNlZCBpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzogQ29ubmVjdGlvbiByZWZ1c2VkJykKKyAgICByZXR1cm4gb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK2RlZiBydW5fY29tbWFuZChuYW1lLCBhcmdzLCBpbnRlcnAsIGVudiwgc3RkaW4sIHN0ZG91dCwKKyAgICAgICAgICAgICAgICBzdGRlcnIsIGRlYnVnZmxhZ3MpOgorICAgICMgRXhlY3V0ZSB0aGUgY29tbWFuZAorICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBkZWJ1Z2ZsYWdzOgorICAgICAgICBwcmludCBpbnRlcnAubG9nKCcgJy5qb2luKFtuYW1lLCBzdHIoYXJncyksIGludGVycFsnUFdEJ11dKSArICdcbicpCisKKyAgICBoZ2JpbiA9IGludGVycC5vcHRpb25zKCkuaGdiaW5hcnkKKyAgICBpc2hnID0gaGdiaW4gYW5kICgnaGcnIGluIG5hbWUgb3IgYXJncyBhbmQgJ2hnJyBpbiBhcmdzWzBdKQorICAgIHVuaXhvdXRwdXQgPSAnY3lnd2luJyBpbiBuYW1lIG9yIGlzaGcKKyAgICAKKyAgICBleGVjX2VudiA9IGVudi5nZXRfdmFyaWFibGVzKCkgICAgICAgIAorICAgIHRyeToKKyAgICAgICAgIyBCVUc6IGNvbXBhcmluZyBmaWxlIGRlc2NyaXB0b3IgaXMgY2xlYXJseSBub3QgYSByZWxpYWJsZSB3YXkgdG8gdGVsbAorICAgICAgICAjIHdoZXRoZXIgdGhleSBwb2ludCBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIG9iamVjdC4gQnV0IGluIHB5c2ggbGltaXRlZAorICAgICAgICAjIHNjb3BlIHRoaXMgaXMgdXN1YWxseSByaWdodCwgd2UgZG8gbm90IGV4cGVjdCBjb21wbGljYXRlZCByZWRpcmVjdGlvbnMKKyAgICAgICAgIyBiZXNpZGVzIHVzdWFsIDI+JjEuCisgICAgICAgICMgU3RpbGwgdGhlcmUgaXMgb25lIGNhc2Ugd2UgaGF2ZSBidXQgY2Fubm90IGRlYWwgd2l0aCBpcyB3aGVuIHN0ZG91dAorICAgICAgICAjIGFuZCBzdGRlcnIgYXJlIHJlZGlyZWN0ZWQgKmJ5IHB5c2ggY2FsbGVyKi4gVGhpcyB0aGUgcmVhc29uIGZvciB0aGUKKyAgICAgICAgIyAtLXJlZGlyZWN0IHB5c2goKSBvcHRpb24uCisgICAgICAgICMgTm93LCB3ZSB3YW50IHRvIGtub3cgdGhleSBhcmUgdGhlIHNhbWUgYmVjYXVzZSB3ZSBzb21ldGltZXMgbmVlZCB0byAKKyAgICAgICAgIyB0cmFuc2Zvcm0gdGhlIGNvbW1hbmQgb3V0cHV0LCBtb3N0bHkgcmVtb3ZlIENSLUxGIHRvIGVuc3VyZSB0aGF0CisgICAgICAgICMgY29tbWFuZCBvdXRwdXQgaXMgdW5peC1saWtlLiBDeWd3aW4gdXRpbGllcyBhcmUgYSBzcGVjaWFsIGNhc2UgYmVjYXVzZQorICAgICAgICAjIHRoZXkgZXhwbGljaXRlbHkgc2V0IHRoZWlyIG91dHB1dCBzdHJlYW1zIHRvIGJpbmFyeSBtb2RlLCBzbyB3ZSBoYXZlCisgICAgICAgICMgbm90aGluZyB0byBkby4gRm9yIGFsbCBvdGhlcnMgY29tbWFuZHMsIHdlIGhhdmUgdG8gZ3Vlc3Mgd2hldGhlciB0aGV5CisgICAgICAgICMgYXJlIHNlbmRpbmcgdGV4dCBkYXRhLCBpbiB3aGljaCBjYXNlIHRoZSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGJlIGRvbmUuCisgICAgICAgICMgQWdhaW4sIHRoZSBOVUwgY2hhcmFjdGVyIHRlc3QgaXMgdW5yZWxpYWJsZSBidXQgc2hvdWxkIGJlIGVub3VnaCBmb3IKKyAgICAgICAgIyBoZyB0ZXN0cy4KKyAgICAgICAgcmVkaXJlY3RlZCA9IHN0ZG91dC5maWxlbm8oKT09c3RkZXJyLmZpbGVubygpCisgICAgICAgIGlmIG5vdCByZWRpcmVjdGVkOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW25hbWVdICsgYXJncywgY3dkPWVudlsnUFdEJ10sIGVudj1leGVjX2VudiwgCisgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN0ZGluLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW25hbWVdICsgYXJncywgY3dkPWVudlsnUFdEJ10sIGVudj1leGVjX2VudiwgCisgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN0ZGluLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgIG91dCwgZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgZXhjZXB0IFdpbmRvd3NFcnJvciBhcyBlOgorICAgICAgICByYWlzZSBVdGlsaXR5RXJyb3Ioc3RyKGUpKQorCisgICAgaWYgbm90IHVuaXhvdXRwdXQ6CisgICAgICAgIGRlZiBlbmNvZGUocyk6CisgICAgICAgICAgICBpZiAnXDAnIGluIHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKQorICAgIGVsc2U6CisgICAgICAgIGVuY29kZSA9IGxhbWJkYSBzOiBzCisKKyAgICBpZiByZXdyaXRlc2xhc2hlcyhuYW1lLCBhcmdzKToKKyAgICAgICAgZW5jb2RlMV8gPSBlbmNvZGUKKyAgICAgICAgZGVmIGVuY29kZShzKToKKyAgICAgICAgICAgIHMgPSBlbmNvZGUxXyhzKQorICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnXFxcXCcsICdcXCcpCisgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCdcXCcsICcvJykKKyAgICAgICAgICAgIHJldHVybiBzCisKKyAgICBpZiBpc2hnOgorICAgICAgICBlbmNvZGUyXyA9IGVuY29kZQorICAgICAgICBkZWYgZW5jb2RlKHMpOgorICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVoZyhlbmNvZGUyXyhzKSkKKyAgICAKKyAgICBzdGRvdXQud3JpdGUoZW5jb2RlKG91dCkpCisgICAgaWYgbm90IHJlZGlyZWN0ZWQ6CisgICAgICAgIHN0ZGVyci53cml0ZShlbmNvZGUoZXJyKSkKKyAgICByZXR1cm4gcC5yZXR1cm5jb2RlCisgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvaW50ZXJwLnB5IGIvYml0YmFrZS9saWIvYmIvcHlzaC9pbnRlcnAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkOGM5MgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3B5c2gvaW50ZXJwLnB5CkBAIC0wLDAgKzEsMTM2NyBAQAorIyBpbnRlcnAucHkgLSBzaGVsbCBpbnRlcnByZXRlciBmb3IgcHlzaC4KKyMKKyMgQ29weXJpZ2h0IDIwMDcgUGF0cmljayBNZXphcmQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisiIiJJbXBsZW1lbnQgdGhlIHNoZWxsIGludGVycHJldGVyLgorCitNb3N0IHJlZmVyZW5jZXMgYXJlIG1hZGUgdG8gIlRoZSBPcGVuIEdyb3VwIEJhc2UgU3BlY2lmaWNhdGlvbnMgSXNzdWUgNiIuCis8aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWw+CisiIiIKKyMgVE9ETzogZG9jdW1lbnQgdGhlIGZhY3QgaW5wdXQgc3RyZWFtcyBtdXN0IGltcGxlbWVudCBmaWxlbm8oKSBzbyBQb3BlbiB3aWxsIHdvcmsgY29ycmVjdGx5LgorIyBpdCByZXF1aXJlcyBub24tc3RkaW4gc3RyZWFtIHRvIGJlIGltcGxlbWVudGVkIGFzIGZpbGVzLiBTdGlsbCB0byBiZSB0ZXN0ZWQuLi4KKyMgRE9DOiBwYXRoc2VwIGlzIHVzZWQgaW4gUEFUSCBpbnN0ZWFkIG9mICc6Jy4gQ2xlYXJseSwgdGhlcmUgYXJlIHBhdGggc3ludGF4IGlzc3VlcyBoZXJlLgorIyBUT0RPOiBzdG9wIGNvbW1hbmQgZXhlY3V0aW9uIHVwb24gZXJyb3IuCisjIFRPRE86IHNvcnQgb3V0IHRoZSBmaWxlbmFtZS9pb19udW1iZXIgbWVzcy4gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBmaWxlbmFtZXMgb25seS4KKyMgVE9ETzogcmV2aWV3IHN1YnNoZWxsIGltcGxlbWVudGF0aW9uCisjIFRPRE86IHRlc3QgZW52aXJvbm1lbnQgY2xvbmluZyBmb3Igbm9uLXNwZWNpYWwgYnVpbHRpbnMKKyMgVE9ETzogc2V0IC14IHNob3VsZCBub3QgcmVidWlsZCBjb21tYW5kcyBmcm9tIHRva2VucywgYXNzaWdubWVudHMvcmVkaXJlY3Rpb25zIGFyZSBsb3N0CisjIFRPRE86IHVuaXQgdGVzdCBmb3IgdmFyaWFibGUgYXNzaWdubWVudAorIyBUT0RPOiB0ZXN0IGVycm9yIG1hbmFnZW1lbnQgd3J0IGVycm9yIHR5cGUvdXRpbGl0eSB0eXBlCisjIFRPRE86IHRlc3QgZm9yIGJpbmFyeSBvdXRwdXQgZXZlcnl3aGVyZQorIyBCVUc6IGRlYnVnLXBhcnNpbmcgZG9lcyBub3QgcGFzcyBsb2cgZmlsZSB0byBQTFkuIE1heWJlIGEgUExZIHVwZ3JhZGUgaXMgbmVjZXNzYXJ5LgoraW1wb3J0IGJhc2U2NAoraW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitpbXBvcnQgZXJybm8KK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorCit0cnk6CisgICAgcyA9IHNldCgpCisgICAgZGVsIHMKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZnJvbSBTZXQgaW1wb3J0IFNldCBhcyBzZXQKKworaW1wb3J0IGJ1aWx0aW4KK2Zyb20gc2hlcnJvcnMgaW1wb3J0ICoKK2ltcG9ydCBweXNobGV4CitpbXBvcnQgcHlzaHlhY2MKKworZGVmIG1hcHBlbmQoZnVuYywgKmFyZ3MsICoqa2FyZ3MpOgorICAgICIiIkxpa2UgbWFwIGJ1dCBhc3N1bWUgZnVuYyByZXR1cm5zIGEgbGlzdC4gUmV0dXJuZWQgbGlzdHMgYXJlIG1lcmdlZCBpbnRvCisgICAgYSBzaW5nbGUgb25lLgorICAgICIiIgorICAgIHJldHVybiByZWR1Y2UobGFtYmRhIGEsYjogYStiLCBtYXAoZnVuYywgKmFyZ3MsICoqa2FyZ3MpLCBbXSkKKworY2xhc3MgRmlsZVdyYXBwZXI6CisgICAgIiIiRmlsZSBvYmplY3Qgd3JhcHBlciB0byBlYXNlIGRlYnVnZ2luZy4KKyAgICAKKyAgICBBbGxvdyBtb2RlIGNoZWNraW5nIGFuZCBpbXBsZW1lbnQgZmlsZSBkdXBsaWNhdGlvbiB0aHJvdWdoIGEgc2ltcGxlIAorICAgIHJlZmVyZW5jZSBjb3VudGluZyBzY2hlbWUuIE5vdCBzdXJlIHRoZSBsYXR0ZXIgaXMgcmVhbGx5IHVzZWZ1bCBzaW5jZQorICAgIG9ubHkgcmVhbCBmaWxlIGRlc2NyaXB0b3JzIGNhbiBiZSB1c2VkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlLCBmaWxlLCBjbG9zZT1UcnVlKToKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3cnLCAnYScpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignaW52YWxpZCBtb2RlOiAlcycgJSBtb2RlKQorICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQorICAgICAgICBzZWxmLl9jbG9zZSA9IGNsb3NlCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZSwgRmlsZVdyYXBwZXIpOgorICAgICAgICAgICAgaWYgZmlsZS5fcmVmY291bnRbMF0gPD0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKDAsICdFcnJvcicpCisgICAgICAgICAgICBzZWxmLl9yZWZjb3VudCA9IGZpbGUuX3JlZmNvdW50CisgICAgICAgICAgICBzZWxmLl9yZWZjb3VudFswXSArPSAxCisgICAgICAgICAgICBzZWxmLl9maWxlID0gZmlsZS5fZmlsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcmVmY291bnQgPSBbMV0KKyAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCisgICAgICAgIAorICAgIGRlZiBkdXAoc2VsZik6CisgICAgICAgIHJldHVybiBGaWxlV3JhcHBlcihzZWxmLl9tb2RlLCBzZWxmLCBzZWxmLl9jbG9zZSkKKyAgICAgICAgCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgIiIiZmlsZW5vKCkgc2hvdWxkIGJlIG9ubHkgbmVjZXNzYXJ5IGZvciBpbnB1dCBzdHJlYW1zLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5maWxlbm8oKQorICAgICAgICAKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2VsZi5fbW9kZSE9J3InOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigwLCAnRXJyb3InKQorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkKHNpemUpCisgICAgICAgIAorICAgIGRlZiByZWFkbGluZXMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUucmVhZGxpbmVzKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBpZiBzZWxmLl9tb2RlIG5vdCBpbiAoJ3cnLCAnYScpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigwLCAnRXJyb3InKQorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS53cml0ZShzKQorICAgICAgICAKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQorICAgICAgICAKKyAgICBkZWYgY2xvc2Uoc2VsZik6ICAgICAgICAKKyAgICAgICAgaWYgbm90IHNlbGYuX3JlZmNvdW50OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFzc2VydCAgc2VsZi5fcmVmY291bnRbMF0gPiAwCisgICAgICAgIAorICAgICAgICBzZWxmLl9yZWZjb3VudFswXSAtPSAxICAgIAorICAgICAgICBpZiBzZWxmLl9yZWZjb3VudFswXSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fbW9kZSA9ICdjJworICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuX3JlZmNvdW50ID0gTm9uZQorICAgICAgICAgICAgICAgIAorICAgIGRlZiBtb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbW9kZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lID09ICduYW1lJzoKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IGdldGF0dHIoc2VsZi5fZmlsZSwgbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorZGVmIHdpbjMyX29wZW5fZGV2bnVsbChtb2RlKToKKyAgICByZXR1cm4gb3BlbignTlVMJywgbW9kZSkKKyAgICAKKyAgICAgICAgCitjbGFzcyBSZWRpcmVjdGlvbnM6CisgICAgIiIiU3RvcmVzIG9wZW4gZmlsZXMgYW5kIHRoZWlyIG1hcHBpbmcgdG8gcHNldWRvLXNoIGZpbGUgZGVzY3JpcHRvci4KKyAgICAiIiIKKyAgICAjIEJVRzogcmVkaXJlY3Rpb25zIGFyZSBub3QgaGFuZGxlZCBjb3JyZWN0bHk6IDE+JjMgMj4mMyAzPiY0IGRvZXMgCisgICAgIyBub3QgbWFrZSAxIHRvIHJlZGlyZWN0IHRvIDQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lKToKKyAgICAgICAgc2VsZi5fZGVzY3JpcHRvcnMgPSB7fQorICAgICAgICBpZiBzdGRpbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2FkZF9kZXNjcmlwdG9yKDAsIHN0ZGluKQorICAgICAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9hZGRfZGVzY3JpcHRvcigxLCBzdGRvdXQpCisgICAgICAgIGlmIHN0ZGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2FkZF9kZXNjcmlwdG9yKDIsIHN0ZGVycikKKyAgICAgICAgICAgIAorICAgIGRlZiBhZGRfaGVyZV9kb2N1bWVudChzZWxmLCBpbnRlcnAsIG5hbWUsIGNvbnRlbnQsIGlvX251bWJlcj1Ob25lKToKKyAgICAgICAgaWYgaW9fbnVtYmVyIGlzIE5vbmU6CisgICAgICAgICAgICBpb19udW1iZXIgPSAwCisgICAgICAgICAgICAKKyAgICAgICAgaWYgbmFtZT09cHlzaGxleC51bnF1b3RlX3dvcmR0cmVlKG5hbWUpOgorICAgICAgICAgICAgY29udGVudCA9IGludGVycC5leHBhbmRfaGVyZV9kb2N1bWVudCgoJ1RPS0VOJywgY29udGVudCkpCisgICAgCisgICAgICAgICMgV3JpdGUgZG9jdW1lbnQgY29udGVudCBpbiBhIHRlbXBvcmFyeSBmaWxlCisgICAgICAgIHRtcCA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0bXAud3JpdGUoY29udGVudCkKKyAgICAgICAgICAgIHRtcC5mbHVzaCgpCisgICAgICAgICAgICB0bXAuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5fYWRkX2Rlc2NyaXB0b3IoaW9fbnVtYmVyLCBGaWxlV3JhcHBlcigncicsIHRtcCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRtcC5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgZGVmIGFkZChzZWxmLCBpbnRlcnAsIG9wLCBmaWxlbmFtZSwgaW9fbnVtYmVyPU5vbmUpOgorICAgICAgICBpZiBvcCBub3QgaW4gKCc8JywgJz4nLCAnPnwnLCAnPj4nLCAnPiYnKToKKyAgICAgICAgICAgICMgVE9ETzogYWRkIGRlc2NyaXB0b3IgZHVwbGljYXRpb24gYW5kIGhlcmVfZG9jdW1lbnRzICAgICAgCisgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKCdVbnN1cHBvcnRlZCByZWRpcmVjdGlvbiBvcGVyYXRvciAiJXMiJyAlIG9wKQorICAgICAgICAgICAgCisgICAgICAgIGlmIGlvX251bWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlvX251bWJlciA9IGludChpb19udW1iZXIpCisgICAgICAgICAgICAKKyAgICAgICAgaWYgKG9wID09ICc+JicgYW5kIGZpbGVuYW1lLmlzZGlnaXQoKSkgb3IgZmlsZW5hbWU9PSctJzoKKyAgICAgICAgICAgICMgTm8gZXhwYW5zaW9uIGZvciBmaWxlIGRlc2NyaXB0b3JzLCBxdW90ZSB0aGVtIGlmIHlvdSB3YW50IGEgZmlsZW5hbWUKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgICAgICAgICAjIFRPRE86IHdpbjMyIGtsdWRnZQorICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lPT0nL2Rldi9udWxsJzoKKyAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSAnTlVMJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVE9ETzogaGFuZGxlIGFic29sdXRlIHBhdGhuYW1lcywgdGhleSBhcmUgdW5saWtlbHkgdG8gZXhpc3Qgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICMgY3VycmVudCBwbGF0Zm9ybSAod2luMzIgZm9yIGluc3RhbmNlKS4KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gaW50ZXJwLmV4cGFuZF9yZWRpcmVjdGlvbigoJ1RPS0VOJywgZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIGlmIG5vdCBmdWxsbmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVkaXJlY3Rpb25FcnJvcignJXM6IGFtYmlndW91cyByZWRpcmVjdCcgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAjIEJ1aWxkIGFic29sdXRlIHBhdGggYmFzZWQgb24gUFdECisgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oaW50ZXJwLmdldF9lbnYoKVsnUFdEJ10sIGZ1bGxuYW1lKQorICAgICAgICAgICAgCisgICAgICAgIGlmIG9wPT0nPCc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX2lucHV0X3JlZGlyZWN0aW9uKGludGVycCwgZnVsbG5hbWUsIGlvX251bWJlcikKKyAgICAgICAgZWxpZiBvcCBpbiAoJz4nLCAnPnwnKToKKyAgICAgICAgICAgIGNsb2JiZXIgPSAoJz58Jz09b3ApCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX291dHB1dF9yZWRpcmVjdGlvbihpbnRlcnAsIGZ1bGxuYW1lLCBpb19udW1iZXIsIGNsb2JiZXIpCisgICAgICAgIGVsaWYgb3A9PSc+Pic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX291dHB1dF9hcHBlbmRpbmcoaW50ZXJwLCBmdWxsbmFtZSwgaW9fbnVtYmVyKQorICAgICAgICBlbGlmIG9wPT0nPiYnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2R1cF9vdXRwdXRfZGVzY3JpcHRvcihmdWxsbmFtZSwgaW9fbnVtYmVyKQorICAgICAgICAKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2Rlc2NyaXB0b3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGRlc2MgaW4gc2VsZi5fZGVzY3JpcHRvcnMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgIGRlc2MuZmx1c2goKQorICAgICAgICAgICAgICAgIGRlc2MuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5fZGVzY3JpcHRvcnMgPSBOb25lCisgICAgICAgICAgICAKKyAgICBkZWYgc3RkaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZXNjcmlwdG9yc1swXQorICAgICAgICAgIAorICAgIGRlZiBzdGRvdXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZXNjcmlwdG9yc1sxXSAKKyAgICAgICAgCisgICAgZGVmIHN0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0b3JzWzJdIAorICAgICAgICAgICAgCisgICAgZGVmIGNsb25lKHNlbGYpOgorICAgICAgICBjbG9uZSA9IFJlZGlyZWN0aW9ucygpCisgICAgICAgIGZvciBkZXNjLCBmaWxlb2JqIGluIHNlbGYuX2Rlc2NyaXB0b3JzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgY2xvbmUuX2Rlc2NyaXB0b3JzW2Rlc2NdID0gZmlsZW9iai5kdXAoKQorICAgICAgICByZXR1cm4gY2xvbmUKKyAgICAgICAgICAgCisgICAgZGVmIF9hZGRfb3V0cHV0X3JlZGlyZWN0aW9uKHNlbGYsIGludGVycCwgZmlsZW5hbWUsIGlvX251bWJlciwgY2xvYmJlcik6ICAgIAorICAgICAgICBpZiBpb19udW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgICMgaW9fbnVtYmVyIGRlZmF1bHQgdG8gc3RhbmRhcmQgb3V0cHV0CisgICAgICAgICAgICBpb19udW1iZXIgPSAxCisgICAgICAgIAorICAgICAgICBpZiBub3QgY2xvYmJlciBhbmQgaW50ZXJwLmdldF9lbnYoKS5oYXNfb3B0KCctQycpIGFuZCBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CisgICAgICAgICAgICAjIEZpbGUgYWxyZWFkeSBleGlzdCBpbiBuby1jbG9iYmVyIG1vZGUsIGJhaWwgb3V0CisgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKCdGaWxlICIlcyIgYWxyZWFkeSBleGlzdHMnICUgZmlsZW5hbWUpCisgICAgICAgICAgICAKKyAgICAgICAgIyBPcGVuIGFuZCByZWdpc3RlcgorICAgICAgICBzZWxmLl9hZGRfZmlsZV9kZXNjcmlwdG9yKGlvX251bWJlciwgZmlsZW5hbWUsICd3JykKKyAgICAgICAgCisgICAgZGVmIF9hZGRfb3V0cHV0X2FwcGVuZGluZyhzZWxmLCBpbnRlcnAsIGZpbGVuYW1lLCBpb19udW1iZXIpOiAgICAKKyAgICAgICAgaWYgaW9fbnVtYmVyIGlzIE5vbmU6CisgICAgICAgICAgICBpb19udW1iZXIgPSAxCisgICAgICAgIHNlbGYuX2FkZF9maWxlX2Rlc2NyaXB0b3IoaW9fbnVtYmVyLCBmaWxlbmFtZSwgJ2EnKQorICAgICAgICAgICAgCisgICAgZGVmIF9hZGRfaW5wdXRfcmVkaXJlY3Rpb24oc2VsZiwgaW50ZXJwLCBmaWxlbmFtZSwgaW9fbnVtYmVyKToKKyAgICAgICAgaWYgaW9fbnVtYmVyIGlzIE5vbmU6CisgICAgICAgICAgICBpb19udW1iZXIgPSAwCisgICAgICAgIHNlbGYuX2FkZF9maWxlX2Rlc2NyaXB0b3IoaW9fbnVtYmVyLCBmaWxlbmFtZSwgJ3InKQorICAgICAgICAKKyAgICBkZWYgX2FkZF9maWxlX2Rlc2NyaXB0b3Ioc2VsZiwgaW9fbnVtYmVyLCBmaWxlbmFtZSwgbW9kZSk6ICAgIAorICAgICAgICB0cnk6ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBmaWxlbmFtZS5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWU9PScvZGV2L251bGwnOgorICAgICAgICAgICAgICAgICAgICBmID0gd2luMzJfb3Blbl9kZXZudWxsKG1vZGUrJ2InKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVE9ETzogaGFuZGxlIGFic29sdXRlIHBhdGhuYW1lcywgdGhleSBhcmUgdW5saWtlbHkgdG8gZXhpc3Qgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICMgY3VycmVudCBwbGF0Zm9ybSAod2luMzIgZm9yIGluc3RhbmNlKS4KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignY2Fubm90IG9wZW4gYWJzb2x1dGUgcGF0aCAlcycgJSByZXByKGZpbGVuYW1lKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZiA9IGZpbGUoZmlsZW5hbWUsIG1vZGUrJ2InKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgUmVkaXJlY3Rpb25FcnJvcihzdHIoZSkpCisgICAgICAgICAgICAKKyAgICAgICAgd3JhcHBlciA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JhcHBlciA9IEZpbGVXcmFwcGVyKG1vZGUsIGYpCisgICAgICAgICAgICBmID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fYWRkX2Rlc2NyaXB0b3IoaW9fbnVtYmVyLCB3cmFwcGVyKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBmOiBmLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHdyYXBwZXI6IHdyYXBwZXIuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIAorICAgIGRlZiBfZHVwX291dHB1dF9kZXNjcmlwdG9yKHNlbGYsIHNvdXJjZV9mZCwgZGVzdF9mZCk6CisgICAgICAgIGlmIHNvdXJjZV9mZCBpcyBOb25lOgorICAgICAgICAgICAgc291cmNlX2ZkID0gMQorICAgICAgICBzZWxmLl9kdXBfZmlsZV9kZXNjcmlwdG9yKHNvdXJjZV9mZCwgZGVzdF9mZCwgJ3cnKQorICAgICAgICAgICAgCisgICAgZGVmIF9kdXBfZmlsZV9kZXNjcmlwdG9yKHNlbGYsIHNvdXJjZV9mZCwgZGVzdF9mZCwgbW9kZSk6CisgICAgICAgIHNvdXJjZV9mZCA9IGludChzb3VyY2VfZmQpCisgICAgICAgIGlmIHNvdXJjZV9mZCBub3QgaW4gc2VsZi5fZGVzY3JpcHRvcnM6CisgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKCciJXMiIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvcicgJSBzdHIoc291cmNlX2ZkKSkKKyAgICAgICAgc291cmNlID0gc2VsZi5fZGVzY3JpcHRvcnNbc291cmNlX2ZkXQorICAgICAgICAKKyAgICAgICAgaWYgc291cmNlLm1vZGUoKSE9bW9kZToKKyAgICAgICAgICAgIHJhaXNlIFJlZGlyZWN0aW9uRXJyb3IoJ0Rlc2NyaXB0b3IgJXMgY2Fubm90IGJlIGR1cGxpY2F0ZWQgaW4gbW9kZSAiJXMiJyAlIChzdHIoc291cmNlKSwgbW9kZSkpCisgICAgICAgIAorICAgICAgICBpZiBkZXN0X2ZkPT0nLSc6CisgICAgICAgICAgICAjIENsb3NlIHRoZSBzb3VyY2UgZGVzY3JpcHRvcgorICAgICAgICAgICAgZGVsIHNlbGYuX2Rlc2NyaXB0b3JzW3NvdXJjZV9mZF0KKyAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXN0X2ZkID0gaW50KGRlc3RfZmQpCisgICAgICAgICAgICBpZiBkZXN0X2ZkIG5vdCBpbiBzZWxmLl9kZXNjcmlwdG9yczoKKyAgICAgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKCdDYW5ub3QgcmVwbGFjZSBmaWxlIGRlc2NyaXB0b3IgJXMnICUgc3RyKGRlc3RfZmQpKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZGVzdCA9IHNlbGYuX2Rlc2NyaXB0b3JzW2Rlc3RfZmRdCisgICAgICAgICAgICBpZiBkZXN0Lm1vZGUoKSE9bW9kZToKKyAgICAgICAgICAgICAgICByYWlzZSBSZWRpcmVjdGlvbkVycm9yKCdEZXNjcmlwdG9yICVzIGNhbm5vdCBiZSBjYW5ub3QgYmUgcmVkaXJlY3RlZCBpbiBtb2RlICIlcyInICUgKHN0cihkZXN0KSwgbW9kZSkpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlbGYuX2Rlc2NyaXB0b3JzW2Rlc3RfZmRdID0gc291cmNlLmR1cCgpCisgICAgICAgICAgICBkZXN0LmNsb3NlKCkgICAgICAgIAorICAgICAgICAgICAgCisgICAgZGVmIF9hZGRfZGVzY3JpcHRvcihzZWxmLCBpb19udW1iZXIsIGZpbGUpOgorICAgICAgICBpb19udW1iZXIgPSBpbnQoaW9fbnVtYmVyKQorICAgICAgICAKKyAgICAgICAgaWYgaW9fbnVtYmVyIGluIHNlbGYuX2Rlc2NyaXB0b3JzOgorICAgICAgICAgICAgIyBDbG9zZSB0aGUgY3VycmVudCBkZXNjcmlwdG9yCisgICAgICAgICAgICBkID0gc2VsZi5fZGVzY3JpcHRvcnNbaW9fbnVtYmVyXQorICAgICAgICAgICAgZGVsIHNlbGYuX2Rlc2NyaXB0b3JzW2lvX251bWJlcl0KKyAgICAgICAgICAgIGQuY2xvc2UoKQorICAgICAgICAgICAgCisgICAgICAgIHNlbGYuX2Rlc2NyaXB0b3JzW2lvX251bWJlcl0gPSBmaWxlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgbmFtZXMgPSBbKCclZD0lcicgJSAoaywgZ2V0YXR0cih2LCAnbmFtZScsIE5vbmUpKSkgZm9yIGssdgorICAgICAgICAgICAgICAgICBpbiBzZWxmLl9kZXNjcmlwdG9ycy5pdGVyaXRlbXMoKV0KKyAgICAgICAgbmFtZXMgPSAnLCcuam9pbihuYW1lcykKKyAgICAgICAgcmV0dXJuICdSZWRpcmVjdGlvbnMoJXMpJyAlIG5hbWVzCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgCitkZWYgY3lnd2luX3RvX3dpbmRvd3NfcGF0aChwYXRoKToKKyAgICAiIiJUdXJuIC9jeWdkcml2ZS9jL2ZvbyBpbnRvIGM6L2Zvbywgb3IgcmV0dXJuIHBhdGggaWYgaXQKKyAgICBpcyBub3QgYSBjeWd3aW4gcGF0aC4KKyAgICAiIiIKKyAgICBpZiBub3QgcGF0aC5zdGFydHN3aXRoKCcvY3lnZHJpdmUvJyk6CisgICAgICAgIHJldHVybiBwYXRoCisgICAgcGF0aCA9IHBhdGhbbGVuKCcvY3lnZHJpdmUvJyk6XQorICAgIHBhdGggPSBwYXRoWzoxXSArICc6JyArIHBhdGhbMTpdCisgICAgcmV0dXJuIHBhdGgKKyAgICAKK2RlZiB3aW4zMl90b191bml4X3BhdGgocGF0aCk6CisgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpCisgICAgcmV0dXJuIHBhdGggICAgCisgICAgCitfUkVfU0hFQkFORyA9IHJlLmNvbXBpbGUocideXCMhXHM/KFteXHNdKykoPzpccyhbXlxzXSspKT8nKQorX1NIRUJBTkdfQ01EUyA9IHsKKyAgICAnL3Vzci9iaW4vZW52JzogJ2VudicsCisgICAgJy9iaW4vc2gnOiAncHlzaCcsCisgICAgJ3B5dGhvbic6ICdweXRob24nLAorfQorICAgIAorZGVmIHJlc29sdmVfc2hlYmFuZyhwYXRoLCBpZ25vcmVzaGVsbD1GYWxzZSk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhcmd1bWVudHMgYXMgc2hlYmFuZyBpbnRlcnByZXRlciBjYWxsIG9yIGFuIGVtcHR5IGxpc3QKKyAgICBpZiBwYXRoIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4ZWN1dGFibGUgc2NyaXB0LgorICAgIFNlZSA8aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL2F1c3Rpbi9kb2NzL2F1c3Rpbl81MXIyLnR4dD4uCisgICAgCisgICAgaWdub3Jlc2hlbGwgLSBzZXQgdG8gVHJ1ZSB0byBpZ25vcmUgc2ggc2hlYmFuZ3MuIFJldHVybiBhbiBlbXB0eSBsaXN0IGluc3RlYWQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBmID0gZmlsZShwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEF0IG1vc3QgODAgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgbGluZQorICAgICAgICAgICAgaGVhZGVyID0gZi5yZWFkKDgwKS5zcGxpdGxpbmVzKClbMF0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgCisgICAgICAgIG0gPSBfUkVfU0hFQkFORy5zZWFyY2goaGVhZGVyKQorICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBjbWQsIGFyZyA9IG0uZ3JvdXAoMSwyKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQpOgorICAgICAgICAgICAgIyBLZWVwIHRoaXMgb25lLCB0aGUgaGcgc2NyaXB0IGZvciBpbnN0YW5jZSBjb250YWlucyBhIHdlaXJkIHdpbmRvd3MKKyAgICAgICAgICAgICMgc2hlYmFuZyByZWZlcmVuY2luZyB0aGUgY3VycmVudCBweXRob24gaW5zdGFsbC4KKyAgICAgICAgICAgIGNtZGZpbGUgPSBvcy5wYXRoLmJhc2VuYW1lKGNtZCkubG93ZXIoKQorICAgICAgICAgICAgaWYgY21kZmlsZSA9PSAncHl0aG9uLmV4ZSc6CisgICAgICAgICAgICAgICAgY21kID0gJ3B5dGhvbicKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBjbWQgbm90IGluIF9TSEVCQU5HX0NNRFM6CisgICAgICAgICAgICByYWlzZSBDb21tYW5kTm90Rm91bmQoJ1Vua25vd24gaW50ZXJwcmV0ZXIgIiVzIiByZWZlcmVuY2VkIGluICdcCisgICAgICAgICAgICAgICAgJ3NoZWJhbmcnICUgaGVhZGVyKQorICAgICAgICBjbWQgPSBfU0hFQkFOR19DTURTLmdldChjbWQpCisgICAgICAgIGlmIGNtZCBpcyBOb25lIG9yIChpZ25vcmVzaGVsbCBhbmQgY21kID09ICdweXNoJyk6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaWYgYXJnIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gW2NtZCwgd2luMzJfdG9fdW5peF9wYXRoKHBhdGgpXQorICAgICAgICByZXR1cm4gW2NtZCwgYXJnLCB3aW4zMl90b191bml4X3BhdGgocGF0aCldCisgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgaWYgIGUuZXJybm8hPWVycm5vLkVOT0VOVCBhbmQgXAorICAgICAgICAgICAgKGUuZXJybm8hPWVycm5vLkVQRVJNIGFuZCBub3Qgb3MucGF0aC5pc2RpcihwYXRoKSk6ICMgT3BlbmluZyBhIGRpcmVjdG9yeSByYWlzZXMgRVBFUk0KKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBbXQorICAgICAgICAKK2RlZiB3aW4zMl9maW5kX2luX3BhdGgobmFtZSwgcGF0aCk6CisgICAgaWYgaXNpbnN0YW5jZShwYXRoLCBzdHIpOgorICAgICAgICBwYXRoID0gcGF0aC5zcGxpdChvcy5wYXRoc2VwKQorICAgICAgICAKKyAgICBleHRzID0gb3MuZW52aXJvbi5nZXQoJ1BBVEhFWFQnLCAnJykubG93ZXIoKS5zcGxpdChvcy5wYXRoc2VwKQorICAgIGZvciBwIGluIHBhdGg6CisgICAgICAgIHBfbmFtZSA9IG9zLnBhdGguam9pbihwLCBuYW1lKQorICAgICAgICAKKyAgICAgICAgcHJlZml4ID0gcmVzb2x2ZV9zaGViYW5nKHBfbmFtZSkKKyAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgcmV0dXJuIHByZWZpeAorICAgICAgICAgICAgCisgICAgICAgIGZvciBleHQgaW4gZXh0czogICAgCisgICAgICAgICAgICBwX25hbWVfZXh0ID0gcF9uYW1lICsgZXh0CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwX25hbWVfZXh0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gW3dpbjMyX3RvX3VuaXhfcGF0aChwX25hbWVfZXh0KV0KKyAgICByZXR1cm4gW10KKworY2xhc3MgVHJhcHMoZGljdCk6CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBrZXkgbm90IGluICgnRVhJVCcsKToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgICAgICBzdXBlcihUcmFwcywgc2VsZikuX19zZXRpdGVtX18oa2V5LCB2YWx1ZSkKKworIyBJRlMgd2hpdGUgc3BhY2VzIGNoYXJhY3RlciBjbGFzcworX0lGU19XSElURVNQQUNFUyA9ICgnICcsICdcdCcsICdcbicpCisKK2NsYXNzIEVudmlyb25tZW50OgorICAgICIiIkVudmlyb25tZW50IGhvbGRzIGVudmlyb25tZW50IHZhcmlhYmxlcywgZXhwb3J0IHRhYmxlLCBmdW5jdGlvbiAKKyAgICBkZWZpbml0aW9ucyBhbmQgd2hhdGV2ZXIgaXMgZGVmaW5lZCBpbiAyLjEyICJTaGVsbCBFeGVjdXRpb24gRW52aXJvbm1lbnQiLAorICAgIHJlZGlyZWN0aW9uIGV4Y2VwdGVkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwd2QpOgorICAgICAgICBzZWxmLl9vcHQgPSBzZXQoKSAgICAgICAjU2hlbGwgb3B0aW9ucworICAgICAgICAKKyAgICAgICAgc2VsZi5fZnVuY3Rpb25zID0ge30gICAgICAgIAorICAgICAgICBzZWxmLl9lbnYgPSB7Jz8nOiAnMCcsICcjJzogJzAnfQorICAgICAgICBzZWxmLl9leHBvcnRlZCA9IHNldChbCisgICAgICAgICAgICAnSE9NRScsICdJRlMnLCAnUEFUSCcKKyAgICAgICAgXSkKKyAgICAgICAgCisgICAgICAgICMgU2V0IGVudmlyb25tZW50IHZhcnMgd2l0aCBzaWRlLWVmZmVjdHMKKyAgICAgICAgc2VsZi5faWZzX3dzID0gTm9uZSAgICAgIyBTZXQgb2YgSUZTIHdoaXRlc3BhY2UgY2hhcmFjdGVycworICAgICAgICBzZWxmLl9pZnNfcmUgPSBOb25lICAgICAjIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHNwbGl0IGJldHdlZW4gd29yZHMgdXNpbmcgSUZTIGNsYXNzZXMKKyAgICAgICAgc2VsZlsnSUZTJ10gPSAnJy5qb2luKF9JRlNfV0hJVEVTUEFDRVMpICNEZWZhdWx0IGVudmlyb25tZW50IHZhbHVlcworICAgICAgICBzZWxmWydQV0QnXSA9IHB3ZAorICAgICAgICBzZWxmLnRyYXBzID0gVHJhcHMoKQorICAgICAgICAKKyAgICBkZWYgY2xvbmUoc2VsZiwgc3Vic2hlbGw9RmFsc2UpOgorICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmWydQV0QnXSkKKyAgICAgICAgZW52Ll9vcHQgPSBzZXQoc2VsZi5fb3B0KQorICAgICAgICBmb3Igayx2IGluIHNlbGYuZ2V0X3ZhcmlhYmxlcygpLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgayBpbiBzZWxmLl9leHBvcnRlZDoKKyAgICAgICAgICAgICAgICBlbnYuZXhwb3J0KGssdikKKyAgICAgICAgICAgIGVsaWYgc3Vic2hlbGw6CisgICAgICAgICAgICAgICAgZW52W2tdID0gdgorICAgICAgICAgICAgICAgIAorICAgICAgICBpZiBzdWJzaGVsbDoKKyAgICAgICAgICAgIGVudi5fZnVuY3Rpb25zID0gZGljdChzZWxmLl9mdW5jdGlvbnMpCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVudiAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgaW4gKCdAJywgJyonLCAnLScsICckJyk6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCclcyBpcyBub3QgaW1wbGVtZW50ZWQnICUgcmVwcihrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5fZW52W2tleV0KKyAgICAgICAgCisgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZnZhbD1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmdmFsCisgICAgICAgIAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYga2V5PT0nSUZTJzoKKyAgICAgICAgICAgICMgVXBkYXRlIHRoZSB3aGl0ZXNwYWNlL25vbi13aGl0ZXNwYWNlIGNsYXNzZXMKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9pZnModmFsdWUpCisgICAgICAgIGVsaWYga2V5PT0nUFdEJzoKKyAgICAgICAgICAgIHB3ZCA9IG9zLnBhdGguYWJzcGF0aCh2YWx1ZSkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHB3ZCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFyQXNzaWdubWVudEVycm9yKCdJbnZhbGlkIGRpcmVjdG9yeSAlcycgJSB2YWx1ZSkKKyAgICAgICAgICAgIHZhbHVlID0gcHdkCisgICAgICAgIGVsaWYga2V5IGluICgnPycsICchJyk6CisgICAgICAgICAgICB2YWx1ZSA9IHN0cihpbnQodmFsdWUpKQorICAgICAgICBzZWxmLl9lbnZba2V5XSA9IHZhbHVlCisgICAgICAgIAorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgaW4gKCdJRlMnLCAnUFdEJywgJz8nKToKKyAgICAgICAgICAgIHJhaXNlIFZhckFzc2lnbm1lbnRFcnJvcignJXMgY2Fubm90IGJlIHVuc2V0JyAlIGtleSkKKyAgICAgICAgZGVsIHNlbGYuX2VudltrZXldCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9lbnYKKyAgICAgICAgCisgICAgZGVmIHNldF9wb3NpdGlvbmFsX2FyZ3Moc2VsZiwgYXJncyk6CisgICAgICAgICIiIlNldCB0aGUgY29udGVudCBvZiAnYXJncycgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBmcm9tIDEgdG8gbGVuKGFyZ3MpLgorICAgICAgICBSZXR1cm4gcHJldmlvdXMgYXJndW1lbnQgYXMgYSBsaXN0IG9mIHN0cmluZ3MuCisgICAgICAgICIiIgorICAgICAgICAjIFNhdmUgYW5kIHJlbW92ZSBwcmV2aW91cyBhcmd1bWVudHMKKyAgICAgICAgcHJldmFyZ3MgPSBbXSAgICAgICAgCisgICAgICAgIGZvciBpIGluIHhyYW5nZShpbnQoc2VsZi5fZW52WycjJ10pKToKKyAgICAgICAgICAgIGkgPSBzdHIoaSsxKQorICAgICAgICAgICAgcHJldmFyZ3MuYXBwZW5kKHNlbGYuX2VudltpXSkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9lbnZbaV0KKyAgICAgICAgc2VsZi5fZW52WycjJ10gPSAnMCcKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgI1NldCBuZXcgb25lcworICAgICAgICBmb3IgaSxhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgorICAgICAgICAgICAgc2VsZi5fZW52W3N0cihpKzEpXSA9IHN0cihhcmcpCisgICAgICAgIHNlbGYuX2VudlsnIyddID0gc3RyKGxlbihhcmdzKSkKKyAgICAgICAgCisgICAgICAgIHJldHVybiBwcmV2YXJncworICAgICAgICAKKyAgICBkZWYgZ2V0X3Bvc2l0aW9uYWxfYXJncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtzZWxmLl9lbnZbc3RyKGkrMSldIGZvciBpIGluIHhyYW5nZShpbnQoc2VsZi5fZW52WycjJ10pKV0KKyAgICAgICAgCisgICAgZGVmIGdldF92YXJpYWJsZXMoc2VsZik6CisgICAgICAgIHJldHVybiBkaWN0KHNlbGYuX2VudikKKyAgICAgICAgCisgICAgZGVmIGV4cG9ydChzZWxmLCBrZXksIHZhbHVlPU5vbmUpOgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCisgICAgICAgIHNlbGYuX2V4cG9ydGVkLmFkZChrZXkpCisgICAgICAgIAorICAgIGRlZiBnZXRfZXhwb3J0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBbKGssc2VsZi5fZW52LmdldChrKSkgZm9yIGsgaW4gc2VsZi5fZXhwb3J0ZWRdCisgICAgICAgICAgICAKKyAgICBkZWYgc3BsaXRfZmllbGRzKHNlbGYsIHdvcmQpOgorICAgICAgICBpZiBub3Qgc2VsZi5faWZzX3dzIG9yIG5vdCB3b3JkOgorICAgICAgICAgICAgcmV0dXJuIFt3b3JkXQorICAgICAgICByZXR1cm4gcmUuc3BsaXQoc2VsZi5faWZzX3JlLCB3b3JkKQorICAgCisgICAgZGVmIF91cGRhdGVfaWZzKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiVXBkYXRlIHRoZSBzcGxpdF9maWVsZHMgcmVsYXRlZCB2YXJpYWJsZXMgd2hlbiBJRlMgY2hhcmFjdGVyIHNldCBpcworICAgICAgICBjaGFuZ2VkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBoYW5kbGUgTlVMTCBJRlMKKyAgICAgICAgCisgICAgICAgICMgU2VwYXJhdGUgY2hhcmFjdGVycyBpbiB3aGl0ZXNwYWNlIGFuZCBub24td2hpdGVzcGFjZQorICAgICAgICBjaGFycyA9IHNldCh2YWx1ZSkKKyAgICAgICAgd3MgPSBbYyBmb3IgYyBpbiBjaGFycyBpZiBjIGluIF9JRlNfV0hJVEVTUEFDRVNdCisgICAgICAgIG53cyA9IFtjIGZvciBjIGluIGNoYXJzIGlmIGMgbm90IGluIF9JRlNfV0hJVEVTUEFDRVNdCisgICAgICAgIAorICAgICAgICAjIEtlZXAgd2hpdGVzcGFjZXMgaW4gYSBzdHJpbmcgZm9yIGxlZnQgYW5kIHJpZ2h0IHN0cmlwcGluZworICAgICAgICBzZWxmLl9pZnNfd3MgPSAnJy5qb2luKHdzKQorICAgICAgICAKKyAgICAgICAgIyBCdWlsZCBhIHJlZ2V4cCB0byBzcGxpdCBmaWVsZHMKKyAgICAgICAgdHJhaWxpbmcgPSAnWycgKyAnJy5qb2luKFtyZS5lc2NhcGUoYykgZm9yIGMgaW4gd3NdKSArICddJworICAgICAgICBpZiBud3M6CisgICAgICAgICAgICAjIEZpcnN0LCB0aGUgc2luZ2xlIG5vbi13aGl0ZXNwYWNlIG9jY3VyZW5jZS4KKyAgICAgICAgICAgIG53cyA9ICdbJyArICcnLmpvaW4oW3JlLmVzY2FwZShjKSBmb3IgYyBpbiBud3NdKSArICddJworICAgICAgICAgICAgbndzID0gJyg/OicgKyB0cmFpbGluZyArICcqJyArIG53cyArIHRyYWlsaW5nICsgJyonICsgJ3wnICsgdHJhaWxpbmcgKyAnKyknCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZW4gbWl4IGFsbCBwYXJ0cyB3aXRoIHF1YW50aWZpZXJzCisgICAgICAgICAgICBud3MgPSB0cmFpbGluZyArICcrJworICAgICAgICBzZWxmLl9pZnNfcmUgPSByZS5jb21waWxlKG53cykKKyAgICAgICAKKyAgICBkZWYgaGFzX29wdChzZWxmLCBvcHQsIHZhbD1Ob25lKToKKyAgICAgICAgcmV0dXJuIChvcHQsIHZhbCkgaW4gc2VsZi5fb3B0CisgICAgICAgIAorICAgIGRlZiBzZXRfb3B0KHNlbGYsIG9wdCwgdmFsPU5vbmUpOgorICAgICAgICBzZWxmLl9vcHQuYWRkKChvcHQsIHZhbCkpCisgICAgICAgIAorICAgIGRlZiBmaW5kX2luX3BhdGgoc2VsZiwgbmFtZSwgcHdkPUZhbHNlKToKKyAgICAgICAgcGF0aCA9IHNlbGYuX2Vudi5nZXQoJ1BBVEgnLCAnJykuc3BsaXQob3MucGF0aHNlcCkKKyAgICAgICAgaWYgcHdkOgorICAgICAgICAgICAgcGF0aFs6MF0gPSBbc2VsZlsnUFdEJ11dCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIHJldHVybiB3aW4zMl9maW5kX2luX3BhdGgobmFtZSwgc2VsZi5fZW52LmdldCgnUEFUSCcsICcnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgICAgICAgICAgCisgICAgZGVmIGRlZmluZV9mdW5jdGlvbihzZWxmLCBuYW1lLCBib2R5KToKKyAgICAgICAgaWYgbm90IGlzX25hbWUobmFtZSk6CisgICAgICAgICAgICByYWlzZSBTaGVsbFN5bnRheEVycm9yKCclcyBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbiBuYW1lJyAlIHJlcHIobmFtZSkpCisgICAgICAgIHNlbGYuX2Z1bmN0aW9uc1tuYW1lXSA9IGJvZHkKKyAgICAgICAgCisgICAgZGVmIHJlbW92ZV9mdW5jdGlvbihzZWxmLCBuYW1lKToKKyAgICAgICAgZGVsIHNlbGYuX2Z1bmN0aW9uc1tuYW1lXQorICAgICAgICAKKyAgICBkZWYgaXNfZnVuY3Rpb24oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX2Z1bmN0aW9ucworICAgICAgICAKKyAgICBkZWYgZ2V0X2Z1bmN0aW9uKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZnVuY3Rpb25zLmdldChuYW1lKQorICAgICAgICAKKyAgICAgICAKK25hbWVfY2hhcnNldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV8nCituYW1lX2NoYXJzZXQgPSBkaWN0KHppcChuYW1lX2NoYXJzZXQsbmFtZV9jaGFyc2V0KSkKKyAgICAgICAgICAgCitkZWYgbWF0Y2hfbmFtZShzKToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBsb25nZXN0IHByZWZpeCBtYWRlIG9mIG5hbWUKKyAgICBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gcy4KKyAgICAiIiIKKyAgICBmb3IgaSxjIGluIGVudW1lcmF0ZShzKToKKyAgICAgICAgaWYgYyBub3QgaW4gbmFtZV9jaGFyc2V0OgorICAgICAgICAgICAgcmV0dXJuIHNbOmldCisgICAgcmV0dXJuIHMKKyAgICAKK2RlZiBpc19uYW1lKHMpOgorICAgIHJldHVybiBsZW4oW2MgZm9yIGMgaW4gcyBpZiBjIG5vdCBpbiBuYW1lX2NoYXJzZXRdKTw9MAorICAgIAorZGVmIGlzX3NwZWNpYWxfcGFyYW0oYyk6CisgICAgcmV0dXJuIGxlbihjKT09MSBhbmQgYyBpbiAoJ0AnLCcqJywnIycsJz8nLCctJywnJCcsJyEnLCcwJykKKyAgICAKK2RlZiB1dGlsaXR5X25vdF9pbXBsZW1lbnRlZChuYW1lLCAqYXJncywgKiprd2FyZ3MpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJyVzIHV0aWxpdHkgaXMgbm90IGltcGxlbWVudGVkJyAlIG5hbWUpCisgICAgCisKK2NsYXNzIFV0aWxpdHk6CisgICAgIiIiRGVmaW5lIHV0aWxpdGllcyBwcm9wZXJ0aWVzOgorICAgIGZ1bmMgLS0gdXRpbGl0eSBjYWxsYWJsZS4gU2VlIGJ1aWx0aW4gbW9kdWxlIGZvciB1dGlsaXR5IHNhbXBsZXMuCisgICAgaXNfc3BlY2lhbCAtLSBzZWUgWENVIDIuOC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYywgaXNfc3BlY2lhbD0wKToKKyAgICAgICAgc2VsZi5mdW5jID0gZnVuYworICAgICAgICBzZWxmLmlzX3NwZWNpYWwgPSBib29sKGlzX3NwZWNpYWwpCisKKworZGVmIGVuY29kZWFyZ3MoYXJncyk6CisgICAgZGVmIGVuY29kZWFyZyhzKToKKyAgICAgICAgbGluZXMgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHMpCisgICAgICAgIGxpbmVzID0gW2wuc3BsaXRsaW5lcygpWzBdIGZvciBsIGluIGxpbmVzXQorICAgICAgICByZXR1cm4gJycuam9pbihsaW5lcykKKworICAgIHMgPSBwaWNrbGUuZHVtcHMoYXJncykKKyAgICByZXR1cm4gZW5jb2RlYXJnKHMpCisKK2RlZiBkZWNvZGVhcmdzKHMpOgorICAgIHMgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKHMpCisgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhzKQorICAgIAorCitjbGFzcyBHbG9iRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIE9wdGlvbnM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIFRydWUgaWYgTWVyY3VyaWFsIG9wZXJhdGVzIHdpdGggYmluYXJ5IHN0cmVhbXMKKyAgICAgICAgc2VsZi5oZ2JpbmFyeSA9IFRydWUKKworY2xhc3MgSW50ZXJwcmV0ZXI6CisgICAgIyBJbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljOiB0aGUgZXhlY3V0ZSgpIG1ldGhvZCBqdXN0IG1ha2VzIGEgREZTIG9uIHRoZQorICAgICMgQVNUIGFuZCBleGVjdXRlIG5vZGVzIG9uZSBieSBvbmUuIE5vZGVzIGFyZSB0dXBsZSAobmFtZSxvYmopIHdoZXJlIG5hbWUKKyAgICAjIGlzIGEgc3RyaW5nIGlkZW50aWZpZXIgYW5kIG9iaiB0aGUgQVNUIGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlIHBhcnNlci4KKyAgICAjCisgICAgIyBIYW5kbGVyIGFyZSBuYW1lZCBhZnRlciB0aGUgbm9kZSBpZGVudGlmaWVycy4KKyAgICAjIFRPRE86IGNoZWNrIG5vZGUgbmFtZXMgYW5kIHJlbW92ZSB0aGUgc3dpdGNoIGluIGV4ZWN1dGUgd2l0aCBzb21lCisgICAgIyBkeW5hbWljIGdldGF0dHIoKSBjYWxsIHRvIGZpbmQgbm9kZSBoYW5kbGVycy4KKyAgICAiIiJTaGVsbCBpbnRlcnByZXRlci4KKyAgICAKKyAgICBUaGUgZm9sbG93aW5nIGRlYnVnZ2luZyBmbGFncyBjYW4gYmUgcGFzc2VkOgorICAgIGRlYnVnLXBhcnNpbmcgLSBlbmFibGUgUExZIGRlYnVnZ2luZy4KKyAgICBkZWJ1Zy10cmVlIC0gcHJpbnQgdGhlIGdlbmVyYXRlZCBBU1QuCisgICAgZGVidWctY21kIC0gdHJhY2UgY29tbWFuZCBleGVjdXRpb24gYmVmb3JlIHdvcmQgZXhwYW5zaW9uLCBwbHVzIGV4aXQgc3RhdHVzLgorICAgIGRlYnVnLXV0aWxpdHkgLSB0cmFjZSB1dGlsaXR5IGV4ZWN1dGlvbi4KKyAgICAiIiIKKyAgICAKKyAgICAjIExpc3Qgc3VwcG9ydGVkIGNvbW1hbmRzLgorICAgIENPTU1BTkRTID0geworICAgICAgICAnY2F0JzogICAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfY2F0LCksCisgICAgICAgICdjZCc6ICAgICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2NkLCksCisgICAgICAgICc6JzogICAgICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2NvbG9uLCksCisgICAgICAgICdlY2hvJzogICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2VjaG8pLAorICAgICAgICAnZW52JzogICAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9lbnYpLAorICAgICAgICAnZXhpdCc6ICAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9leGl0KSwKKyAgICAgICAgJ2V4cG9ydCc6ICAgVXRpbGl0eShidWlsdGluLmJ1aWx0aW5fZXhwb3J0LCAgICAgaXNfc3BlY2lhbD0xKSwKKyAgICAgICAgJ2VncmVwJzogICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfZWdyZXApLAorICAgICAgICAnZmdyZXAnOiAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9mZ3JlcCksCisgICAgICAgICdndW56aXAnOiAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2d1bnppcCksCisgICAgICAgICdraWxsJzogICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X2tpbGwpLAorICAgICAgICAnbWtkaXInOiAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9ta2RpciksCisgICAgICAgICduZXRzdGF0JzogIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X25ldHN0YXQpLAorICAgICAgICAncHJpbnRmJzogICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9wcmludGYpLAorICAgICAgICAncHdkJzogICAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9wd2QpLAorICAgICAgICAncmV0dXJuJzogICBVdGlsaXR5KGJ1aWx0aW4uYnVpbHRpbl9yZXR1cm4sICAgICBpc19zcGVjaWFsPTEpLAorICAgICAgICAnc2VkJzogICAgICBVdGlsaXR5KGJ1aWx0aW4udXRpbGl0eV9zZWQsKSwKKyAgICAgICAgJ3NldCc6ICAgICAgVXRpbGl0eShidWlsdGluLmJ1aWx0aW5fc2V0LCksCisgICAgICAgICdzaGlmdCc6ICAgIFV0aWxpdHkoYnVpbHRpbi5idWlsdGluX3NoaWZ0LCksCisgICAgICAgICdzbGVlcCc6ICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X3NsZWVwLCksCisgICAgICAgICdzb3J0JzogICAgIFV0aWxpdHkoYnVpbHRpbi51dGlsaXR5X3NvcnQsKSwKKyAgICAgICAgJ3RyYXAnOiAgICAgVXRpbGl0eShidWlsdGluLmJ1aWx0aW5fdHJhcCwgICAgICAgaXNfc3BlY2lhbD0xKSwKKyAgICAgICAgJ3RydWUnOiAgICAgVXRpbGl0eShidWlsdGluLnV0aWxpdHlfdHJ1ZSksCisgICAgICAgICd1bnNldCc6ICAgIFV0aWxpdHkoYnVpbHRpbi5idWlsdGluX3Vuc2V0LCAgICAgIGlzX3NwZWNpYWw9MSksCisgICAgICAgICd3YWl0JzogICAgIFV0aWxpdHkoYnVpbHRpbi5idWlsdGluX3dhaXQsICAgICAgIGlzX3NwZWNpYWw9MSksCisgICAgfQorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwd2QsIGRlYnVnZmxhZ3MgPSBbXSwgZW52PU5vbmUsIHJlZGlycz1Ob25lLCBzdGRpbj1Ob25lLAorICAgICAgICAgICAgICAgICBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIG9wdHM9T3B0aW9ucygpKToKKyAgICAgICAgc2VsZi5fZW52ID0gZW52CisgICAgICAgIGlmIHNlbGYuX2VudiBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fZW52ID0gRW52aXJvbm1lbnQocHdkKQorICAgICAgICBzZWxmLl9jaGlsZHJlbiA9IHt9CisgICAgICAgICAgICAKKyAgICAgICAgc2VsZi5fcmVkaXJzID0gcmVkaXJzCisgICAgICAgIHNlbGYuX2Nsb3NlX3JlZGlycyA9IEZhbHNlCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLl9yZWRpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHN0ZGluIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgICAgIGlmIHN0ZG91dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIGlmIHN0ZGVyciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHN0ZGluID0gRmlsZVdyYXBwZXIoJ3InLCBzdGRpbiwgRmFsc2UpCisgICAgICAgICAgICBzdGRvdXQgPSBGaWxlV3JhcHBlcigndycsIHN0ZG91dCwgRmFsc2UpCisgICAgICAgICAgICBzdGRlcnIgPSBGaWxlV3JhcHBlcigndycsIHN0ZGVyciwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLl9yZWRpcnMgPSBSZWRpcmVjdGlvbnMoc3RkaW4sIHN0ZG91dCwgc3RkZXJyKQorICAgICAgICAgICAgc2VsZi5fY2xvc2VfcmVkaXJzID0gVHJ1ZQorICAgICAgICAgICAgCisgICAgICAgIHNlbGYuX2RlYnVnZmxhZ3MgPSBsaXN0KGRlYnVnZmxhZ3MpCisgICAgICAgIHNlbGYuX2xvZ2ZpbGUgPSBzeXMuc3RkZXJyCisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRzCisgICAgICAgIAorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuIiIiCisgICAgICAgIHNjcmlwdCA9IHNlbGYuX2Vudi50cmFwcy5nZXQoJ0VYSVQnKQorICAgICAgICBpZiBzY3JpcHQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlX3NjcmlwdChzY3JpcHQ9c2NyaXB0KQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBzZWxmLl9yZWRpcnMgaXMgbm90IE5vbmUgYW5kIHNlbGYuX2Nsb3NlX3JlZGlyczoKKyAgICAgICAgICAgIHNlbGYuX3JlZGlycy5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9yZWRpcnMgPSBOb25lCisgICAgICAgICAgICAKKyAgICBkZWYgbG9nKHNlbGYsIHMpOgorICAgICAgICBzZWxmLl9sb2dmaWxlLndyaXRlKHMpCisgICAgICAgIHNlbGYuX2xvZ2ZpbGUuZmx1c2goKQorICAgICAgICAgICAgCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLl9lbnZba2V5XQorICAgICAgICAKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX2VudltrZXldID0gdmFsdWUKKworICAgIGRlZiBvcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucworCisgICAgZGVmIHJlZGlyZWN0KHNlbGYsIHJlZGlycywgaW9zKToKKyAgICAgICAgZGVmIGFkZF9yZWRpcihpbyk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlvLCBweXNoeWFjYy5JT1JlZGlyZWN0KToKKyAgICAgICAgICAgICAgICByZWRpcnMuYWRkKHNlbGYsIGlvLm9wLCBpby5maWxlbmFtZSwgaW8uaW9fbnVtYmVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWRpcnMuYWRkX2hlcmVfZG9jdW1lbnQoc2VsZiwgaW8ubmFtZSwgaW8uY29udGVudCwgaW8uaW9fbnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbWFwKGFkZF9yZWRpciwgaW9zKQorICAgICAgICByZXR1cm4gcmVkaXJzCisgICAgICAgICAgICAKKyAgICBkZWYgZXhlY3V0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0PU5vbmUsIGFzdD1Ob25lLCBzb3VyY2VkPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRwYXRoPU5vbmUpOgorICAgICAgICAiIiJJZiBzY3JpcHQgaXMgbm90IE5vbmUsIHBhcnNlIHRoZSBpbnB1dC4gT3RoZXJ3aXNlIHRha2VzIHRoZSBzdXBwbGllZAorICAgICAgICBBU1QuIFRoZW4gZXhlY3V0ZSB0aGUgQVNULgorICAgICAgICBSZXR1cm4gdGhlIHNjcmlwdCBleGl0IHN0YXR1cy4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNjcmlwdHBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fZW52WycwJ10gPSBvcy5wYXRoLmFic3BhdGgoc2NyaXB0cGF0aCkKKworICAgICAgICAgICAgaWYgc2NyaXB0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlYnVnX3BhcnNpbmcgPSAoJ2RlYnVnLXBhcnNpbmcnIGluIHNlbGYuX2RlYnVnZmxhZ3MpICAgIAorICAgICAgICAgICAgICAgIGNtZHMsIHNjcmlwdCA9IHB5c2h5YWNjLnBhcnNlKHNjcmlwdCwgVHJ1ZSwgZGVidWdfcGFyc2luZykKKyAgICAgICAgICAgICAgICBpZiAnZGVidWctdHJlZScgaW4gc2VsZi5fZGVidWdmbGFnczoKKyAgICAgICAgICAgICAgICAgICAgcHlzaHlhY2MucHJpbnRfY29tbWFuZHMoY21kcywgc2VsZi5fbG9nZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nZmlsZS5mbHVzaCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNtZHMsIHNjcmlwdCA9IGFzdCwgJycgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdGF0dXMgPSAwCisgICAgICAgICAgICBmb3IgY21kIGluIGNtZHM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLmV4ZWN1dGUoY21kKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGl0U2lnbmFsIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIHNvdXJjZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBpbnQoZS5hcmdzWzBdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzCisgICAgICAgICAgICAgICAgZXhjZXB0IFNoZWxsRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VudlsnPyddID0gMQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGlmICdkZWJ1Zy11dGlsaXR5JyBpbiBzZWxmLl9kZWJ1Z2ZsYWdzIG9yICdkZWJ1Zy1jbWQnIGluIHNlbGYuX2RlYnVnZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nKCdyZXR1cm5jb2RlICcgKyBzdHIoc3RhdHVzKSsgJ1xuJykKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICAgICAgZXhjZXB0IENvbW1hbmROb3RGb3VuZCBhcyBlOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLl9yZWRpcnMuc3RkZXJyLCBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYuX3JlZGlycy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgIyBDb21tYW5kIG5vdCBmb3VuZCBieSBub24taW50ZXJhY3RpdmUgc2hlbGwKKyAgICAgICAgICAgICMgcmV0dXJuIDEyNworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IFJlZGlyZWN0aW9uRXJyb3IgYXMgZToKKyAgICAgICAgICAgICMgVE9ETzogc2hvdWxkIGJlIGhhbmRsZWQgZGVwZW5kaW5nIG9uIHRoZSB1dGlsaXR5IHN0YXR1cworICAgICAgICAgICAgcHJpbnQgPj5zZWxmLl9yZWRpcnMuc3RkZXJyLCBzdHIoZSkKKyAgICAgICAgICAgIHNlbGYuX3JlZGlycy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgIyBDb21tYW5kIG5vdCBmb3VuZCBieSBub24taW50ZXJhY3RpdmUgc2hlbGwKKyAgICAgICAgICAgICMgcmV0dXJuIDEyNworICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBkb3Rjb21tYW5kKHNlbGYsIGVudiwgYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgICAgICAgICByYWlzZSBTaGVsbEVycm9yKCcuIGV4cGVjdHMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50JykKKyAgICAgICAgcGF0aCA9IGFyZ3NbMF0KKyAgICAgICAgaWYgJy8nIG5vdCBpbiBwYXRoOgorICAgICAgICAgICAgZm91bmQgPSBlbnYuZmluZF9pbl9wYXRoKGFyZ3NbMF0sIFRydWUpCisgICAgICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICAgICBwYXRoID0gZm91bmRbMF0KKyAgICAgICAgc2NyaXB0ID0gZmlsZShwYXRoKS5yZWFkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhlY3V0ZV9zY3JpcHQoc2NyaXB0PXNjcmlwdCwgc291cmNlZD1UcnVlKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgdG9rZW4sIHJlZGlycz1Ob25lKToKKyAgICAgICAgIiIiRXhlY3V0ZSBhbmQgQVNUIHN1YnRyZWUgd2l0aCBzdXBwbGllZCByZWRpcmVjdGlvbnMgb3ZlcnJpZGluZyBkZWZhdWx0CisgICAgICAgIGludGVycHJldGVyIG9uZXMuCisgICAgICAgIFJldHVybiB0aGUgZXhpdCBzdGF0dXMuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgdG9rZW46CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgCisgICAgICAgIGlmIHJlZGlycyBpcyBOb25lOgorICAgICAgICAgICAgcmVkaXJzID0gc2VsZi5fcmVkaXJzCisgICAgICAgICAgICAKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tlbiwgbGlzdCk6CisgICAgICAgICAgICAjIENvbW1hbmRzIHNlcXVlbmNlCisgICAgICAgICAgICByZXMgPSAwCisgICAgICAgICAgICBmb3IgdCBpbiB0b2tlbjoKKyAgICAgICAgICAgICAgICByZXMgPSBzZWxmLmV4ZWN1dGUodCwgcmVkaXJzKQorICAgICAgICAgICAgcmV0dXJuIHJlcworCisgICAgICAgIHR5cGUsIHZhbHVlID0gdG9rZW4KKyAgICAgICAgc3RhdHVzID0gMAorICAgICAgICBpZiB0eXBlPT0nc2ltcGxlX2NvbW1hbmQnOgorICAgICAgICAgICAgcmVkaXJzX2NvcHkgPSByZWRpcnMuY2xvbmUoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVE9ETzogZGVmaW5lIGFuZCBoYW5kbGUgY29tbWFuZCByZXR1cm4gdmFsdWVzCisgICAgICAgICAgICAgICAgIyBUT0RPOiBpbXBsZW1lbnQgc2V0IC1lCisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV9zaW1wbGVfY29tbWFuZCh2YWx1ZSwgcmVkaXJzX2NvcHkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlZGlyc19jb3B5LmNsb3NlKCkKKyAgICAgICAgZWxpZiB0eXBlPT0ncGlwZWxpbmUnOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV9waXBlbGluZSh2YWx1ZSwgcmVkaXJzKQorICAgICAgICBlbGlmIHR5cGU9PSdhbmRfb3InOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV9hbmRfb3IodmFsdWUsIHJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0nZm9yX2NsYXVzZSc6CisgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLl9leGVjdXRlX2Zvcl9jbGF1c2UodmFsdWUsIHJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0nd2hpbGVfY2xhdXNlJzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuX2V4ZWN1dGVfd2hpbGVfY2xhdXNlKHZhbHVlLCByZWRpcnMpCisgICAgICAgIGVsaWYgdHlwZT09J2Z1bmN0aW9uX2RlZmluaXRpb24nOgorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fZXhlY3V0ZV9mdW5jdGlvbl9kZWZpbml0aW9uKHZhbHVlLCByZWRpcnMpCisgICAgICAgIGVsaWYgdHlwZT09J2JyYWNlX2dyb3VwJzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuX2V4ZWN1dGVfYnJhY2VfZ3JvdXAodmFsdWUsIHJlZGlycykKKyAgICAgICAgZWxpZiB0eXBlPT0naWZfY2xhdXNlJzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuX2V4ZWN1dGVfaWZfY2xhdXNlKHZhbHVlLCByZWRpcnMpCisgICAgICAgIGVsaWYgdHlwZT09J3N1YnNoZWxsJzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuc3Vic2hlbGwoYXN0PXZhbHVlLmNtZHMsIHJlZGlycz1yZWRpcnMpCisgICAgICAgIGVsaWYgdHlwZT09J2FzeW5jJzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuX2FzeW5jbGlzdCh2YWx1ZSkKKyAgICAgICAgZWxpZiB0eXBlPT0ncmVkaXJlY3RfbGlzdCc6CisgICAgICAgICAgICByZWRpcnNfY29weSA9IHNlbGYucmVkaXJlY3QocmVkaXJzLmNsb25lKCksIHZhbHVlLnJlZGlycykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLmV4ZWN1dGUodmFsdWUuY21kLCByZWRpcnNfY29weSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVkaXJzX2NvcHkuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignVW5zdXBwb3J0ZWQgdG9rZW4gdHlwZSAnICsgdHlwZSkKKworICAgICAgICBpZiBzdGF0dXMgPCAwOgorICAgICAgICAgICAgc3RhdHVzID0gMjU1CisgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICAgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV9pZl9jbGF1c2Uoc2VsZiwgaWZfY2xhdXNlLCByZWRpcnMpOgorICAgICAgICBjb25kX3N0YXR1cyA9IHNlbGYuZXhlY3V0ZShpZl9jbGF1c2UuY29uZCwgcmVkaXJzKQorICAgICAgICBpZiBjb25kX3N0YXR1cz09MDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4ZWN1dGUoaWZfY2xhdXNlLmlmX2NtZHMsIHJlZGlycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4ZWN1dGUoaWZfY2xhdXNlLmVsc2VfY21kcywgcmVkaXJzKQorICAgICAgCisgICAgZGVmIF9leGVjdXRlX2JyYWNlX2dyb3VwKHNlbGYsIGdyb3VwLCByZWRpcnMpOgorICAgICAgICBzdGF0dXMgPSAwCisgICAgICAgIGZvciBjbWQgaW4gZ3JvdXAuY21kczoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhlY3V0ZShjbWQsIHJlZGlycykKKyAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICAgICAgCisgICAgZGVmIF9leGVjdXRlX2Z1bmN0aW9uX2RlZmluaXRpb24oc2VsZiwgZnVuZGVmLCByZWRpcnMpOgorICAgICAgICBzZWxmLl9lbnYuZGVmaW5lX2Z1bmN0aW9uKGZ1bmRlZi5uYW1lLCBmdW5kZWYuYm9keSkKKyAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV93aGlsZV9jbGF1c2Uoc2VsZiwgd2hpbGVfY2xhdXNlLCByZWRpcnMpOgorICAgICAgICBzdGF0dXMgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBjb25kX3N0YXR1cyA9IDAKKyAgICAgICAgICAgIGZvciBjb25kIGluIHdoaWxlX2NsYXVzZS5jb25kaXRpb246CisgICAgICAgICAgICAgICAgY29uZF9zdGF0dXMgPSBzZWxmLmV4ZWN1dGUoY29uZCwgcmVkaXJzKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgY29uZF9zdGF0dXM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciBjbWQgaW4gd2hpbGVfY2xhdXNlLmNtZHM6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5leGVjdXRlKGNtZCwgcmVkaXJzKQorICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gc3RhdHVzCisgICAgICAgICAgICAKKyAgICBkZWYgX2V4ZWN1dGVfZm9yX2NsYXVzZShzZWxmLCBmb3JfY2xhdXNlLCByZWRpcnMpOgorICAgICAgICBpZiBub3QgaXNfbmFtZShmb3JfY2xhdXNlLm5hbWUpOgorICAgICAgICAgICAgcmFpc2UgU2hlbGxTeW50YXhFcnJvcignJXMgaXMgbm90IGEgdmFsaWQgbmFtZScgJSByZXByKGZvcl9jbGF1c2UubmFtZSkpCisgICAgICAgIGl0ZW1zID0gbWFwcGVuZChzZWxmLmV4cGFuZF90b2tlbiwgZm9yX2NsYXVzZS5pdGVtcykKKyAgICAgICAgCisgICAgICAgIHN0YXR1cyA9IDAgICAgCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgc2VsZi5fZW52W2Zvcl9jbGF1c2UubmFtZV0gPSBpdGVtCisgICAgICAgICAgICBmb3IgY21kIGluIGZvcl9jbGF1c2UuY21kczoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLmV4ZWN1dGUoY21kLCByZWRpcnMpCisgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICAgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV9hbmRfb3Ioc2VsZiwgb3JfYW5kLCByZWRpcnMpOgorICAgICAgICByZXMgPSBzZWxmLmV4ZWN1dGUob3JfYW5kLmxlZnQsIHJlZGlycykgICAgICAgIAorICAgICAgICBpZiAob3JfYW5kLm9wPT0nJiYnIGFuZCByZXM9PTApIG9yIChvcl9hbmQub3AhPScmJicgYW5kIHJlcyE9MCk6CisgICAgICAgICAgICByZXMgPSBzZWxmLmV4ZWN1dGUob3JfYW5kLnJpZ2h0LCByZWRpcnMpCisgICAgICAgIHJldHVybiByZXMKKyAgICAgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV9waXBlbGluZShzZWxmLCBwaXBlbGluZSwgcmVkaXJzKTogICAgICAgICAgICAKKyAgICAgICAgaWYgbGVuKHBpcGVsaW5lLmNvbW1hbmRzKT09MToKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhlY3V0ZShwaXBlbGluZS5jb21tYW5kc1swXSwgcmVkaXJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBFeGVjdXRlIGFsbCBjb21tYW5kcyBvbmUgYWZ0ZXIgdGhlIG90aGVyCisgICAgICAgICAgICBzdGF0dXMgPSAwCisgICAgICAgICAgICBpbnBhdGgsIG91dHBhdGggPSBOb25lLCBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBDb21tYW5kcyBpbnB1dHMgYW5kIG91dHB1dHMgY2Fubm90IHJlYWxseSBiZSBwbHVnZ2VkIGFzIGRvbmUKKyAgICAgICAgICAgICAgICAjIGJ5IGEgcmVhbCBzaGVsbC4gUnVuIGNvbW1hbmRzIHNlcXVlbnRpYWxseSBhbmQgY2hhaW4gdGhlaXIKKyAgICAgICAgICAgICAgICAjIGlucHV0L291dHB1dCB0aHJvdWdodCB0ZW1wb3JhcnkgZmlsZXMuCisgICAgICAgICAgICAgICAgdG1wZmQsIGlucGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKHRtcGZkKQorICAgICAgICAgICAgICAgIHRtcGZkLCBvdXRwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICAgICAgb3MuY2xvc2UodG1wZmQpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW5wYXRoID0gd2luMzJfdG9fdW5peF9wYXRoKGlucGF0aCkKKyAgICAgICAgICAgICAgICBvdXRwYXRoID0gd2luMzJfdG9fdW5peF9wYXRoKG91dHBhdGgpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yIGksIGNtZCBpbiBlbnVtZXJhdGUocGlwZWxpbmUuY29tbWFuZHMpOgorICAgICAgICAgICAgICAgICAgICBjYWxsX3JlZGlycyA9IHJlZGlycy5jbG9uZSgpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGkhPTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9yZWRpcnMuYWRkKHNlbGYsICc8JywgaW5wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaSE9bGVuKHBpcGVsaW5lLmNvbW1hbmRzKS0xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfcmVkaXJzLmFkZChzZWxmLCAnPicsIG91dHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhlY3V0ZShjbWQsIGNhbGxfcmVkaXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAjIENoYWluIGlucHV0cy9vdXRwdXRzCisgICAgICAgICAgICAgICAgICAgICAgICBpbnBhdGgsIG91dHBhdGggPSBvdXRwYXRoLCBpbnBhdGgKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfcmVkaXJzLmNsb3NlKCkgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgaW5wYXRoOiBvcy5yZW1vdmUoaW5wYXRoKQorICAgICAgICAgICAgICAgIGlmIG91dHBhdGg6IG9zLnJlbW92ZShvdXRwYXRoKQorICAgICAgICAKKyAgICAgICAgaWYgcGlwZWxpbmUucmV2ZXJzZV9zdGF0dXM6CisgICAgICAgICAgICBzdGF0dXMgPSBpbnQobm90IHN0YXR1cykKKyAgICAgICAgc2VsZi5fZW52Wyc/J10gPSBzdGF0dXMKKyAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICAKKyAgICBkZWYgX2V4ZWN1dGVfZnVuY3Rpb24oc2VsZiwgbmFtZSwgYXJncywgaW50ZXJwLCBlbnYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgKm90aGVycyk6CisgICAgICAgIGFzc2VydCBpbnRlcnAgaXMgc2VsZgorICAgICAgICAKKyAgICAgICAgZnVuYyA9IGVudi5nZXRfZnVuY3Rpb24obmFtZSkKKyAgICAgICAgI1NldCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgcHJldmFyZ3MgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByZXZhcmdzID0gZW52LnNldF9wb3NpdGlvbmFsX2FyZ3MoYXJncykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWRpcnMgPSBSZWRpcmVjdGlvbnMoc3RkaW4uZHVwKCksIHN0ZG91dC5kdXAoKSwgc3RkZXJyLmR1cCgpKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5leGVjdXRlKGZ1bmMsIHJlZGlycykKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICByZWRpcnMuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IFJldHVyblNpZ25hbCBhcyBlOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IGludChlLmFyZ3NbMF0pCisgICAgICAgICAgICAgICAgZW52Wyc/J10gPSBzdGF0dXMKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICNSZXNldCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmIHByZXZhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVudi5zZXRfcG9zaXRpb25hbF9hcmdzKHByZXZhcmdzKQorICAgICAgICAgICAgICAgIAorICAgIGRlZiBfZXhlY3V0ZV9zaW1wbGVfY29tbWFuZChzZWxmLCB0b2tlbiwgcmVkaXJzKToKKyAgICAgICAgIiIiQ2FuIHJhaXNlIFJldHVyblNpZ25hbCB3aGVuIHJldHVybiBidWlsdGluIGlzIGNhbGxlZCwgRXhpdFNpZ25hbCB3aGVuCisgICAgICAgIGV4aXQgaXMgY2FsbGVkLCBhbmQgb3RoZXIgc2hlbGwgZXhjZXB0aW9ucyB1cG9uIGJ1aWx0aW4gZmFpbHVyZXMuCisgICAgICAgICIiIgorICAgICAgICBkZWJ1Z19jb21tYW5kID0gJ2RlYnVnLWNtZCcgaW4gc2VsZi5fZGVidWdmbGFncworICAgICAgICBpZiBkZWJ1Z19jb21tYW5kOgorICAgICAgICAgICAgc2VsZi5sb2coJ3dvcmQnICsgcmVwcih0b2tlbi53b3JkcykgKyAnXG4nKQorICAgICAgICAgICAgc2VsZi5sb2coJ2Fzc2lnbnMnICsgcmVwcih0b2tlbi5hc3NpZ25zKSArICdcbicpCisgICAgICAgICAgICBzZWxmLmxvZygncmVkaXJzJyArIHJlcHIodG9rZW4ucmVkaXJzKSArICdcbicpCisgICAgICAgIAorICAgICAgICBpc19zcGVjaWFsID0gTm9uZQorICAgICAgICBlbnYgPSBzZWxmLl9lbnYKKyAgICAgICAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV29yZCBleHBhbnNpb24KKyAgICAgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICAgICAgZm9yIHdvcmQgaW4gdG9rZW4ud29yZHM6ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFyZ3MgKz0gc2VsZi5leHBhbmRfdG9rZW4od29yZCkKKyAgICAgICAgICAgICAgICBpZiBpc19zcGVjaWFsIGlzIE5vbmUgYW5kIGFyZ3M6CisgICAgICAgICAgICAgICAgICAgIGlzX3NwZWNpYWwgPSBlbnYuaXNfZnVuY3Rpb24oYXJnc1swXSkgb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3NbMF0gaW4gc2VsZi5DT01NQU5EUyBhbmQgc2VsZi5DT01NQU5EU1thcmdzWzBdXS5pc19zcGVjaWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBkZWJ1Z19jb21tYW5kOgorICAgICAgICAgICAgICAgIHNlbGYubG9nKCdfZXhlY3V0ZV9zaW1wbGVfY29tbWFuZCcgKyBzdHIoYXJncykgKyAnXG4nKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICAgICAgIyBSZWRpcmVjdGlvbnMgaGFwcGVuIGlzIGEgc3Vic2hlbGwKKyAgICAgICAgICAgICAgICByZWRpcnMgPSByZWRpcnMuY2xvbmUoKQorICAgICAgICAgICAgZWxpZiBub3QgaXNfc3BlY2lhbDoKKyAgICAgICAgICAgICAgICBlbnYgPSBzZWxmLl9lbnYuY2xvbmUoKQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIFJlZGlyZWN0aW9ucworICAgICAgICAgICAgc2VsZi5yZWRpcmVjdChyZWRpcnMsIHRva2VuLnJlZGlycykKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICMgVmFyaWFibGVzIGFzc2lnbm1lbnRzCisgICAgICAgICAgICByZXMgPSAwCisgICAgICAgICAgICBmb3IgdHlwZSwoayx2KSBpbiB0b2tlbi5hc3NpZ25zOgorICAgICAgICAgICAgICAgIHN0YXR1cywgZXhwYW5kZWQgPSBzZWxmLmV4cGFuZF92YXJpYWJsZSgoayx2KSkKKyAgICAgICAgICAgICAgICBpZiBzdGF0dXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0YXR1cworICAgICAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgICAgIGVudi5leHBvcnQoaywgZXhwYW5kZWQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZW52W2tdID0gZXhwYW5kZWQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0gaW4gKCcuJywgJ3NvdXJjZScpOgorICAgICAgICAgICAgICAgIHJlcyA9IHNlbGYuZG90Y29tbWFuZChlbnYsIGFyZ3NbMTpdKQorICAgICAgICAgICAgZWxpZiBhcmdzOgorICAgICAgICAgICAgICAgIGlmIGFyZ3NbMF0gaW4gc2VsZi5DT01NQU5EUzoKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHNlbGYuQ09NTUFORFNbYXJnc1swXV0KKyAgICAgICAgICAgICAgICBlbGlmIGVudi5pc19mdW5jdGlvbihhcmdzWzBdKToKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IFV0aWxpdHkoc2VsZi5fZXhlY3V0ZV9mdW5jdGlvbiwgaXNfc3BlY2lhbD1UcnVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAnLycgaW4gYXJnc1swXS5yZXBsYWNlKCdcXCcsICcvJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSBlbnYuZmluZF9pbl9wYXRoKGFyZ3NbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY21kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVE9ETzogdGVzdCBlcnJvciBjb2RlIG9uIHVua25vd24gY29tbWFuZCA9PiAxMjcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21tYW5kTm90Rm91bmQoJ1Vua25vd24gY29tbWFuZDogIiVzIicgJSBhcmdzWzBdKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgY29tbWFuZHMgbGlrZSAnL2N5Z2RyaXZlL2MvZm9vLmJhdCcKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IGN5Z3dpbl90b193aW5kb3dzX3BhdGgoYXJnc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjbWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmROb3RGb3VuZCgnJXM6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknICUgYXJnc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWJhbmcgPSByZXNvbHZlX3NoZWJhbmcoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2hlYmFuZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSBzaGViYW5nCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9IFtjbWRdCisgICAgICAgICAgICAgICAgICAgIGFyZ3NbMDoxXSA9IGNtZAorICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gVXRpbGl0eShidWlsdGluLnJ1bl9jb21tYW5kKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgQ29tbWFuZCBleGVjdXRpb24KKyAgICAgICAgICAgICAgICBpZiAnZGVidWctY21kJyBpbiBzZWxmLl9kZWJ1Z2ZsYWdzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZygncmVkaXJlY3Rpb25zICcgKyBzdHIocmVkaXJzKSArICdcbicpCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJlcyA9IGNvbW1hbmQuZnVuYyhhcmdzWzBdLCBhcmdzWzE6XSwgc2VsZiwgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcnMuc3RkaW4oKSwgcmVkaXJzLnN0ZG91dCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJzLnN0ZGVycigpLCBzZWxmLl9kZWJ1Z2ZsYWdzKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBzZWxmLl9lbnYuaGFzX29wdCgnLXgnKToKKyAgICAgICAgICAgICAgICAjIFRyYWNlIGNvbW1hbmQgZXhlY3V0aW9uIGluIHNoZWxsIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgIyBCVUc6IHdvdWxkIGJlIGhhcmQgdG8gcmVwcm9kdWNlIGEgcmVhbCBzaGVsbCBiZWhhdmlvdXIgc2luY2UKKyAgICAgICAgICAgICAgICAjIHRoZSBBU1QgaXMgbm90IGFubm90YXRlZCB3aXRoIHNvdXJjZSBsaW5lcy90b2tlbnMuCisgICAgICAgICAgICAgICAgc2VsZi5fcmVkaXJzLnN0ZG91dCgpLndyaXRlKCcgJy5qb2luKGFyZ3MpKQorICAgICAgICAgICAgICAgIAorICAgICAgICBleGNlcHQgUmV0dXJuU2lnbmFsOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IFNoZWxsRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIGlzX3NwZWNpYWwgb3IgaXNpbnN0YW5jZShlLCAoRXhpdFNpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxTeW50YXhFcnJvciwgRXhwYW5zaW9uRXJyb3IpKToKKyAgICAgICAgICAgICAgICByYWlzZSBlCisgICAgICAgICAgICBzZWxmLl9yZWRpcnMuc3RkZXJyKCkud3JpdGUoc3RyKGUpKydcbicpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiBleHBhbmRfdG9rZW4oc2VsZiwgd29yZCk6CisgICAgICAgICIiIkV4cGFuZCBhIHdvcmQgYXMgc3BlY2lmaWVkIGluIFsyLjYgV29yZCBFeHBhbnNpb25zXS4gUmV0dXJuIHRoZSBsaXN0CisgICAgICAgIG9mIGV4cGFuZGVkIHdvcmRzLgorICAgICAgICAiIiIKKyAgICAgICAgc3RhdHVzLCB3dHJlZXMgPSBzZWxmLl9leHBhbmRfd29yZCh3b3JkKQorICAgICAgICByZXR1cm4gbWFwKHB5c2hsZXgud29yZHRyZWVfYXNfc3RyaW5nLCB3dHJlZXMpCisgICAgICAgIAorICAgIGRlZiBleHBhbmRfdmFyaWFibGUoc2VsZiwgd29yZCk6CisgICAgICAgICIiIlJldHVybiBhIHN0YXR1cyBjb2RlIChvciBOb25lIGlmIG5vIGNvbW1hbmQgZXhwYW5zaW9uIG9jY3VycmVkKQorICAgICAgICBhbmQgYSBzaW5nbGUgd29yZC4KKyAgICAgICAgIiIiCisgICAgICAgIHN0YXR1cywgd3RyZWVzID0gc2VsZi5fZXhwYW5kX3dvcmQod29yZCwgcGF0aG5hbWU9RmFsc2UsIHNwbGl0PUZhbHNlKQorICAgICAgICB3b3JkcyA9IG1hcChweXNobGV4LndvcmR0cmVlX2FzX3N0cmluZywgd3RyZWVzKQorICAgICAgICBhc3NlcnQgbGVuKHdvcmRzKT09MQorICAgICAgICByZXR1cm4gc3RhdHVzLCB3b3Jkc1swXQorICAgICAgICAKKyAgICBkZWYgZXhwYW5kX2hlcmVfZG9jdW1lbnQoc2VsZiwgd29yZCk6CisgICAgICAgICIiIlJldHVybiB0aGUgZXhwYW5kZWQgZG9jdW1lbnQgYXMgYSBzaW5nbGUgd29yZC4gVGhlIGhlcmUgZG9jdW1lbnQgaXMgCisgICAgICAgIGFzc3VtZWQgdG8gYmUgdW5xdW90ZWQuCisgICAgICAgICIiIgorICAgICAgICBzdGF0dXMsIHd0cmVlcyA9IHNlbGYuX2V4cGFuZF93b3JkKHdvcmQsIHBhdGhuYW1lPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0PUZhbHNlLCBoZXJlX2RvY3VtZW50PVRydWUpCisgICAgICAgIHdvcmRzID0gbWFwKHB5c2hsZXgud29yZHRyZWVfYXNfc3RyaW5nLCB3dHJlZXMpCisgICAgICAgIGFzc2VydCBsZW4od29yZHMpPT0xCisgICAgICAgIHJldHVybiB3b3Jkc1swXQorICAgICAgICAKKyAgICBkZWYgZXhwYW5kX3JlZGlyZWN0aW9uKHNlbGYsIHdvcmQpOgorICAgICAgICAiIiJSZXR1cm4gYSBzaW5nbGUgd29yZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwYW5kX3ZhcmlhYmxlKHdvcmQpWzFdCisgICAgICAgIAorICAgIGRlZiBnZXRfZW52KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW52CisgICAgICAgIAorICAgIGRlZiBfZXhwYW5kX3dvcmQoc2VsZiwgdG9rZW4sIHBhdGhuYW1lPVRydWUsIHNwbGl0PVRydWUsIGhlcmVfZG9jdW1lbnQ9RmFsc2UpOgorICAgICAgICB3dHJlZSA9IHB5c2hsZXgubWFrZV93b3JkdHJlZSh0b2tlblsxXSwgaGVyZV9kb2N1bWVudD1oZXJlX2RvY3VtZW50KQorICAgICAgICAKKyAgICAgICAgIyBUT0RPOiBpbXBsZW1lbnQgdGlsZGUgZXhwYW5zaW9uCisgICAgICAgIGRlZiBleHBhbmQod3RyZWUpOgorICAgICAgICAgICAgIiIiUmV0dXJuIGEgcHNldWRvIHdvcmR0cmVlOiB0aGUgdHJlZSBvciBpdHMgc3ViZWxlbWVudHMgY2FuIGJlIGVtcHR5CisgICAgICAgICAgICBsaXN0cyB3aGVuIG5vIHZhbHVlIHJlc3VsdCBmcm9tIHRoZSBleHBhbnNpb24uCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHN0YXR1cyA9IE5vbmUKKyAgICAgICAgICAgIGZvciBwYXJ0IGluIHd0cmVlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhcnQsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHBhcnRbMF1pbiAoIiciLCAnXFwnKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIHBhcnRbMF0gaW4gKCdgJywgJyQoJyk6CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcmVzdWx0ID0gc2VsZi5fZXhwYW5kX2NvbW1hbmQocGFydCkKKyAgICAgICAgICAgICAgICAgICAgcGFydFs6XSA9IHJlc3VsdAorICAgICAgICAgICAgICAgIGVsaWYgcGFydFswXSBpbiAoJyQnLCAnJHsnKToKKyAgICAgICAgICAgICAgICAgICAgcGFydFs6XSA9IHNlbGYuX2V4cGFuZF9wYXJhbWV0ZXIocGFydCwgd3RyZWVbMF09PSciJywgc3BsaXQpCisgICAgICAgICAgICAgICAgZWxpZiBwYXJ0WzBdIGluICgnJywgJyInKToKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCByZXN1bHQgPSBleHBhbmQocGFydCkKKyAgICAgICAgICAgICAgICAgICAgcGFydFs6XSA9IHJlc3VsdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJyVzIGV4cGFuc2lvbiBpcyBub3QgaW1wbGVtZW50ZWQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBwYXJ0WzBdKQorICAgICAgICAgICAgIyBbXSBpcyByZXR1cm5lZCB3aGVuIGFuIGV4cGFuc2lvbiByZXN1bHQgaW4gbm8tZmllbGQsCisgICAgICAgICAgICAjIGxpa2UgYW4gZW1wdHkgJEAKKyAgICAgICAgICAgIHd0cmVlID0gW3AgZm9yIHAgaW4gd3RyZWUgaWYgcCAhPSBbXV0KKyAgICAgICAgICAgIGlmIGxlbih3dHJlZSkgPCAzOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMsIFtdCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzLCB3dHJlZQorICAgICAgICAKKyAgICAgICAgc3RhdHVzLCB3dHJlZSA9IGV4cGFuZCh3dHJlZSkKKyAgICAgICAgaWYgbGVuKHd0cmVlKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIHN0YXR1cywgd3RyZWUKKyAgICAgICAgd3RyZWUgPSBweXNobGV4Lm5vcm1hbGl6ZV93b3JkdHJlZSh3dHJlZSkKKyAgICAgICAgCisgICAgICAgIGlmIHNwbGl0OgorICAgICAgICAgICAgd3RyZWVzID0gc2VsZi5fc3BsaXRfZmllbGRzKHd0cmVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3RyZWVzID0gW3d0cmVlXQorICAgICAgICAKKyAgICAgICAgaWYgcGF0aG5hbWU6CisgICAgICAgICAgICB3dHJlZXMgPSBtYXBwZW5kKHNlbGYuX2V4cGFuZF9wYXRobmFtZSwgd3RyZWVzKQorICAgICAgICAKKyAgICAgICAgd3RyZWVzID0gbWFwKHNlbGYuX3JlbW92ZV9xdW90ZXMsIHd0cmVlcykKKyAgICAgICAgcmV0dXJuIHN0YXR1cywgd3RyZWVzCisgICAgICAgIAorICAgIGRlZiBfZXhwYW5kX2NvbW1hbmQoc2VsZiwgd3RyZWUpOgorICAgICAgICAjIEJVRzogdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIHdpdGggYmFja3NsYXNoZXMgYW5kIHF1b3RlZAorICAgICAgICAjIGNoYXJhY3RlcnMgaGVyZQorICAgICAgICBjb21tYW5kID0gcHlzaGxleC53b3JkdHJlZV9hc19zdHJpbmcod3RyZWVbMTotMV0pCisgICAgICAgIHN0YXR1cywgb3V0cHV0ID0gc2VsZi5zdWJzaGVsbF9vdXRwdXQoY29tbWFuZCkKKyAgICAgICAgcmV0dXJuIHN0YXR1cywgWycnLCBvdXRwdXQsICcnXQorICAgICAgICAKKyAgICBkZWYgX2V4cGFuZF9wYXJhbWV0ZXIoc2VsZiwgd3RyZWUsIHF1b3RlZD1GYWxzZSwgc3BsaXQ9RmFsc2UpOgorICAgICAgICAiIiJSZXR1cm4gYSB2YWxpZCB3dHJlZSBvciBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gcGFyYW1ldGVyIHJlc3VsdHMuIiIiCisgICAgICAgICMgR2V0IHRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAgICAjIFRPRE86IGltcGxlbWVudCB3ZWlyZCBleHBhbnNpb24gcnVsZXMgd2l0aCAnOicKKyAgICAgICAgbmFtZSA9IHB5c2hsZXgud29yZHRyZWVfYXNfc3RyaW5nKHd0cmVlWzE6LTFdKQorICAgICAgICBpZiBub3QgaXNfbmFtZShuYW1lKSBhbmQgbm90IGlzX3NwZWNpYWxfcGFyYW0obmFtZSk6CisgICAgICAgICAgICByYWlzZSBFeHBhbnNpb25FcnJvcignQmFkIHN1YnN0aXR1dGlvbiAiJXMiJyAlIG5hbWUpCisgICAgICAgICMgVE9ETzogaW1wbGVtZW50IHNwZWNpYWwgcGFyYW1ldGVycworICAgICAgICBpZiBuYW1lIGluICgnQCcsICcqJyk6CisgICAgICAgICAgICBhcmdzID0gc2VsZi5fZW52LmdldF9wb3NpdGlvbmFsX2FyZ3MoKQorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgICAgICBpZiBsZW4oYXJncyk8MjoKKyAgICAgICAgICAgICAgICByZXR1cm4gWycnLCAnJy5qb2luKGFyZ3MpLCAnJ10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlcCA9IHNlbGYuX2Vudi5nZXQoJ0lGUycsICcnKVs6MV0KKyAgICAgICAgICAgIGlmIHNwbGl0IGFuZCBxdW90ZWQgYW5kIG5hbWU9PSdAJzoKKyAgICAgICAgICAgICAgICAjIEludHJvZHVjZSBhIG5ldyB0b2tlbiB0byB0ZWxsIHRoZSBjYWxsZXIgdGhhdCB0aGVzZSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgIyBjYXVzZSBhIHNwbGl0IGFzIHNwZWNpZmllZCBpbiAyLjUuMgorICAgICAgICAgICAgICAgIHJldHVybiBbJ0AnXSArIGFyZ3MgKyBbJyddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBbJycsIHNlcC5qb2luKGFyZ3MpLCAnJ10gICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICByZXR1cm4gWycnLCBzZWxmLl9lbnYuZ2V0KG5hbWUsICcnKSwgJyddCisgICAgICAgIAorICAgIGRlZiBfc3BsaXRfZmllbGRzKHNlbGYsIHd0cmVlKToKKyAgICAgICAgZGVmIGlzX2VtcHR5KHNwbGl0KToKKyAgICAgICAgICAgIHJldHVybiBzcGxpdD09WycnLCAnJywgJyddCisgICAgICAgICAgICAKKyAgICAgICAgZGVmIHNwbGl0X3Bvc2l0aW9uYWwocXVvdGVkKToKKyAgICAgICAgICAgICMgUmV0dXJuIGEgbGlzdCBvZiB3dHJlZSBzcGxpdCBhY2NvcmRpbmcgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHJ1bGVzLgorICAgICAgICAgICAgIyBBbGwgcmVtYWluaW5nICdAJyBncm91cHMgYXJlIHJlbW92ZWQuCisgICAgICAgICAgICBhc3NlcnQgcXVvdGVkWzBdPT0nIicKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3BsaXRzID0gW1tdXQorICAgICAgICAgICAgZm9yIHBhcnQgaW4gcXVvdGVkOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhcnQsIGxpc3QpIG9yIHBhcnRbMF0hPSdAJzoKKyAgICAgICAgICAgICAgICAgICAgc3BsaXRzWy0xXS5hcHBlbmQocGFydCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IG9yIHNpbmdsZSBhcmd1bWVudCBsaXN0IHdlcmUgZGVhbHQgd2l0aCBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBsZW4ocGFydCk+MworICAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGFyZ3VtZW50IG11c3Qgam9pbiB3aXRoIHRoZSBiZWdpbm5pbmcgcGFydCBvZiB0aGUgb3JpZ2luYWwgd29yZAorICAgICAgICAgICAgICAgICAgICBzcGxpdHNbLTFdLmFwcGVuZChwYXJ0WzFdKQorICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBkb3VibGUtcXVvdGVzIGV4cHJlc3Npb25zIGZvciBldmVyeSBhcmd1bWVudCBhZnRlciB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBwYXJ0WzI6LTFdOgorICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRzWy0xXS5hcHBlbmQoJyInKQorICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRzLmFwcGVuZChbJyInLCBhcmddKQorICAgICAgICAgICAgcmV0dXJuIHNwbGl0cworICAgICAgICAKKyAgICAgICAgIyBBdCB0aGlzIHBvaW50LCBhbGwgZXhwYW5zaW9ucyBidXQgcGF0aG5hbWVzIGhhdmUgb2NjdXJlZC4gT25seSBxdW90ZWQKKyAgICAgICAgIyBhbmQgcG9zaXRpb25hbCBzZXF1ZW5jZXMgcmVtYWluLiBUaHVzLCBhbGwgY2FuZGlkYXRlcyBmb3IgZmllbGQgc3BsaXR0aW5nIAorICAgICAgICAjIGFyZSBpbiB0aGUgdHJlZSByb290LCBvciBhcmUgcG9zaXRpb25hbCBzcGxpdHMgKCdAJykgYW5kIGxpZSBpbiByb290CisgICAgICAgICMgY2hpbGRyZW4uCisgICAgICAgIGlmIG5vdCB3dHJlZSBvciB3dHJlZVswXSBub3QgaW4gKCcnLCAnIicpOgorICAgICAgICAgICAgIyBUaGUgd2hvbGUgdG9rZW4gaXMgcXVvdGVkIG9yIGVtcHR5LCBub3RoaW5nIHRvIHNwbGl0CisgICAgICAgICAgICByZXR1cm4gW3d0cmVlXQorICAgICAgICAgICAgCisgICAgICAgIGlmIHd0cmVlWzBdPT0nIic6CisgICAgICAgICAgICB3dHJlZSA9IFsnJywgd3RyZWUsICcnXQorICAgICAgICAKKyAgICAgICAgcmVzdWx0ID0gW1snJywgJyddXQorICAgICAgICBmb3IgcGFydCBpbiB3dHJlZVsxOi0xXToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFydCwgbGlzdCk6CisgICAgICAgICAgICAgICAgaWYgcGFydFswXT09JyInOgorICAgICAgICAgICAgICAgICAgICBzcGxpdHMgPSBzcGxpdF9wb3NpdGlvbmFsKHBhcnQpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihzcGxpdHMpPD0xOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wy0xXSArPSBbcGFydCwgJyddCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBzcGxpdAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wy0xXSArPSBbc3BsaXRzWzBdLCAnJ10KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzcGxpdHNbMTotMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IHNwbGl0CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gW1snJywgc3BsaXRzWy0xXSwgJyddXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFstMV0gKz0gW3BhcnQsICcnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzcGxpdHMgPSBzZWxmLl9lbnYuc3BsaXRfZmllbGRzKHBhcnQpCisgICAgICAgICAgICAgICAgaWYgbGVuKHNwbGl0cyk8PTE6CisgICAgICAgICAgICAgICAgICAgICMgTm8gc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wy0xXVstMV0gKz0gcGFydAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVGVybWluYXRlIHRoZSBjdXJyZW50IHJlc3VsdGluZyBwYXJ0IGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFstMV1bLTFdICs9IHNwbGl0c1swXQorICAgICAgICAgICAgICAgICAgICByZXN1bHRbLTFdLmFwcGVuZCgnJykKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFtbJycsIHIsICcnXSBmb3IgciBpbiBzcGxpdHNbMTotMV1dCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBbWycnLCBzcGxpdHNbLTFdXV0KKyAgICAgICAgcmVzdWx0Wy0xXS5hcHBlbmQoJycpCisgICAgICAgIAorICAgICAgICAjIExlYWRpbmcgYW5kIHRyYWlsaW5nIGVtcHR5IGdyb3VwcyBjb21lIGZyb20gbGVhZGluZy90cmFpbGluZyBibGFua3MKKyAgICAgICAgaWYgcmVzdWx0IGFuZCBpc19lbXB0eShyZXN1bHRbLTFdKToKKyAgICAgICAgICAgIHJlc3VsdFstMTpdID0gW10KKyAgICAgICAgaWYgcmVzdWx0IGFuZCBpc19lbXB0eShyZXN1bHRbMF0pOgorICAgICAgICAgICAgcmVzdWx0WzoxXSA9IFtdCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgCisgICAgZGVmIF9leHBhbmRfcGF0aG5hbWUoc2VsZiwgd3RyZWUpOgorICAgICAgICAiIiJTZWUgWzIuNi42IFBhdGhuYW1lIEV4cGFuc2lvbl0uIiIiCisgICAgICAgIGlmIHNlbGYuX2Vudi5oYXNfb3B0KCctZicpOgorICAgICAgICAgICAgcmV0dXJuIFt3dHJlZV0KKyAgICAgICAgCisgICAgICAgICMgQWxsIGV4cGFuc2lvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZCwgb25seSBxdW90ZWQgc2VxdWVuY2VzIHNob3VsZCByZW1haW4KKyAgICAgICAgIyBpbiB0aGUgdHJlZS4gR2VuZXJhdGUgdGhlIHBhdHRlcm4gYnkgZm9sZGluZyB0aGUgdHJlZSwgZXNjYXBpbmcgc3BlY2lhbAorICAgICAgICAjIGNoYXJhY3RlcnMgd2hlbiBhcHBlYXIgcXVvdGVkCisgICAgICAgIHNwZWNpYWxfY2hhcnMgPSAnKj9bXScKKyAgICAgICAgCisgICAgICAgIGRlZiBtYWtlX3BhdHRlcm4od3RyZWUpOgorICAgICAgICAgICAgc3VicGF0dGVybiA9IFtdCisgICAgICAgICAgICBmb3IgcGFydCBpbiB3dHJlZVsxOi0xXToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnQsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbWFrZV9wYXR0ZXJuKHBhcnQpCisgICAgICAgICAgICAgICAgZWxpZiB3dHJlZVswXSE9Jyc6CisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHBhcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE1ldGEtY2hhcmFjdGVycyBjYW5ub3QgYmUgcXVvdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjIGluIHNwZWNpYWxfY2hhcnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgR2xvYkVycm9yKCkKKyAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuLmFwcGVuZChwYXJ0KQorICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc3VicGF0dGVybikKKyAgICAgICAgICAgIAorICAgICAgICBkZWYgcHdkX2dsb2IocGF0dGVybik6CisgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5fZW52WydQV0QnXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYi5nbG9iKHBhdHRlcm4pIAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihjd2QpICAgIAorICAgICAgICAgICAgCisgICAgICAgICNUT0RPOiBjaGVjayB3b3JraW5nIGRpcmVjdG9yeSBpc3N1ZXMgaGVyZSB3cnQgcmVsYXRpdmUgcGF0dGVybnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0dGVybiA9IG1ha2VfcGF0dGVybih3dHJlZSkKKyAgICAgICAgICAgIHBhdGhzID0gcHdkX2dsb2IocGF0dGVybikKKyAgICAgICAgZXhjZXB0IEdsb2JFcnJvcjoKKyAgICAgICAgICAgICMgQlVHOiBNZXRhLWNoYXJhY3RlcnMgd2VyZSBmb3VuZCBpbiBxdW90ZWQgc2VxdWVuY2VzLiBUaGUgc2hvdWxkIAorICAgICAgICAgICAgIyBoYXZlIGJlZW4gdXNlZCBsaXRlcmFsbHkgYnV0IHRoaXMgaXMgdW5zdXBwb3J0ZWQgaW4gY3VycmVudCBnbG9iIG1vZHVsZS4KKyAgICAgICAgICAgICMgSW5zdGVhZCB3ZSBjb25zaWRlciB0aGUgd2hvbGUgdHJlZSBtdXN0IGJlIHVzZWQgbGl0ZXJhbGx5IGFuZAorICAgICAgICAgICAgIyB0aGVyZWZvcmUgdGhlcmUgaXMgbm8gcG9pbnQgaW4gZ2xvYmJpbmcuIFRoaXMgaXMgd3Jvbmcgd2hlbiBtZXRhCisgICAgICAgICAgICAjIGNoYXJhY3RlcnMgYXJlIG1peGVkIHdpdGggcXVvdGVkIG1ldGEgaW4gdGhlIHNhbWUgcGF0dGVybiBsaWtlOgorICAgICAgICAgICAgIyA8IGZvbyoicHkqIiA+CisgICAgICAgICAgICBwYXRocyA9IFtdCisgICAgICAgICAgICAKKyAgICAgICAgaWYgbm90IHBhdGhzOgorICAgICAgICAgICAgcmV0dXJuIFt3dHJlZV0KKyAgICAgICAgcmV0dXJuIFtbJycsIHBhdGgsICcnXSBmb3IgcGF0aCBpbiBwYXRoc10KKyAgICAgICAgCisgICAgZGVmIF9yZW1vdmVfcXVvdGVzKHNlbGYsIHd0cmVlKToKKyAgICAgICAgIiIiU2VlIFsyLjYuNyBRdW90ZSBSZW1vdmFsXS4iIiIKKyAgICAgICAgCisgICAgICAgIGRlZiB1bnF1b3RlKHd0cmVlKToKKyAgICAgICAgICAgIHVucXVvdGVkID0gW10KKyAgICAgICAgICAgIGZvciBwYXJ0IGluIHd0cmVlWzE6LTFdOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFydCwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIHBhcnQgPSB1bnF1b3RlKHBhcnQpCisgICAgICAgICAgICAgICAgdW5xdW90ZWQuYXBwZW5kKHBhcnQpCisgICAgICAgICAgICByZXR1cm4gJycuam9pbih1bnF1b3RlZCkKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gWycnLCB1bnF1b3RlKHd0cmVlKSwgJyddCisgICAgICAgIAorICAgIGRlZiBzdWJzaGVsbChzZWxmLCBzY3JpcHQ9Tm9uZSwgYXN0PU5vbmUsIHJlZGlycz1Ob25lKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgc2NyaXB0IG9yIEFTVCBpbiBhIHN1YnNoZWxsLCB3aXRoIGluaGVyaXRlZCByZWRpcmVjdGlvbnMKKyAgICAgICAgaWYgcmVkaXJzIGlzIG5vdCBOb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcmVkaXJzOgorICAgICAgICAgICAgc3ViX3JlZGlycyA9IHJlZGlycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ViX3JlZGlycyA9IHJlZGlycy5jbG9uZSgpCisgICAgICAgIAorICAgICAgICBzdWJzaGVsbCA9IE5vbmUgICAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1YnNoZWxsID0gSW50ZXJwcmV0ZXIoTm9uZSwgc2VsZi5fZGVidWdmbGFncywgc2VsZi5fZW52LmNsb25lKFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfcmVkaXJzLCBvcHRzPXNlbGYuX29wdGlvbnMpCisgICAgICAgICAgICByZXR1cm4gc3Vic2hlbGwuZXhlY3V0ZV9zY3JpcHQoc2NyaXB0LCBhc3QpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgcmVkaXJzOiBzdWJfcmVkaXJzLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHN1YnNoZWxsOiBzdWJzaGVsbC5jbG9zZSgpCisgICAgICAgIAorICAgIGRlZiBzdWJzaGVsbF9vdXRwdXQoc2VsZiwgc2NyaXB0KToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgc2NyaXB0IGluIGEgc3Vic2hlbGwgYW5kIHJldHVybiB0aGUgY2FwdHVyZWQgb3V0cHV0LiIiIiAgICAgICAgCisgICAgICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBmaWxlIHRvIGNhcHR1cmUgc3Vic2hlbGwgb3V0cHV0CisgICAgICAgIHRtcGZkLCB0bXBwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRtcGZpbGUgPSBvcy5mZG9wZW4odG1wZmQsICd3YicpCisgICAgICAgICAgICBzdGRvdXQgPSBGaWxlV3JhcHBlcigndycsIHRtcGZpbGUpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlZGlycyA9IFJlZGlyZWN0aW9ucyhzZWxmLl9yZWRpcnMuc3RkaW4oKS5kdXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVkaXJzLnN0ZGVycigpLmR1cCgpKSAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuc3Vic2hlbGwoc2NyaXB0PXNjcmlwdCwgcmVkaXJzPXJlZGlycykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVkaXJzLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByZWRpcnMgPSBOb25lCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgRXh0cmFjdCBzdWJzaGVsbCBzdGFuZGFyZCBvdXRwdXQKKyAgICAgICAgICAgIHRtcGZpbGUgPSBvcGVuKHRtcHBhdGgsICdyYicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gdG1wZmlsZS5yZWFkKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLCBvdXRwdXQucnN0cmlwKCdcbicpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRtcGZpbGUuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHRtcHBhdGgpCisKKyAgICBkZWYgX2FzeW5jbGlzdChzZWxmLCBjbWQpOgorICAgICAgICBhcmdzID0gKHNlbGYuX2Vudi5nZXRfdmFyaWFibGVzKCksIGNtZCkKKyAgICAgICAgYXJnID0gZW5jb2RlYXJncyhhcmdzKQorICAgICAgICBhc3NlcnQgbGVuKGFyZ3MpIDwgMzAqMTAyNAorICAgICAgICBjbWQgPSBbJ3B5c2guYmF0JywgJy0tYXN0JywgJy1jJywgYXJnXQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIGN3ZD1zZWxmLl9lbnZbJ1BXRCddKQorICAgICAgICBzZWxmLl9jaGlsZHJlbltwLnBpZF0gPSBwCisgICAgICAgIHNlbGYuX2VudlsnISddID0gcC5waWQKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiB3YWl0KHNlbGYsIHBpZHM9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBwaWRzOgorICAgICAgICAgICAgcGlkcyA9IHNlbGYuX2NoaWxkcmVuLmtleXMoKQorCisgICAgICAgIHN0YXR1cyA9IDEyNworICAgICAgICBmb3IgcGlkIGluIHBpZHM6CisgICAgICAgICAgICBpZiBwaWQgbm90IGluIHNlbGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBwID0gc2VsZi5fY2hpbGRyZW4ucG9wKHBpZCkKKyAgICAgICAgICAgIHN0YXR1cyA9IHAud2FpdCgpCisKKyAgICAgICAgcmV0dXJuIHN0YXR1cworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9weXNoL2xzcHJvZi5weSBiL2JpdGJha2UvbGliL2JiL3B5c2gvbHNwcm9mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxODMxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL2xzcHJvZi5weQpAQCAtMCwwICsxLDExNiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgc3lzCitmcm9tIF9sc3Byb2YgaW1wb3J0IFByb2ZpbGVyLCBwcm9maWxlcl9lbnRyeQorCitfX2FsbF9fID0gWydwcm9maWxlJywgJ1N0YXRzJ10KKworZGVmIHByb2ZpbGUoZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgIiIiWFhYIGRvY3N0cmluZyIiIgorICAgIHAgPSBQcm9maWxlcigpCisgICAgcC5lbmFibGUoc3ViY2FsbHM9VHJ1ZSwgYnVpbHRpbnM9VHJ1ZSkKKyAgICB0cnk6CisgICAgICAgIGYoKmFyZ3MsICoqa3dkcykKKyAgICBmaW5hbGx5OgorICAgICAgICBwLmRpc2FibGUoKQorICAgIHJldHVybiBTdGF0cyhwLmdldHN0YXRzKCkpCisKKworY2xhc3MgU3RhdHMob2JqZWN0KToKKyAgICAiIiJYWFggZG9jc3RyaW5nIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKworICAgIGRlZiBzb3J0KHNlbGYsIGNyaXQ9ImlubGluZXRpbWUiKToKKyAgICAgICAgIiIiWFhYIGRvY3N0cmluZyIiIgorICAgICAgICBpZiBjcml0IG5vdCBpbiBwcm9maWxlcl9lbnRyeS5fX2RpY3RfXzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbid0IHNvcnQgYnkgJXMiICUgY3JpdCkKKyAgICAgICAgc2VsZi5kYXRhLnNvcnQobGFtYmRhIGIsIGE6IGNtcChnZXRhdHRyKGEsIGNyaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoYiwgY3JpdCkpKQorICAgICAgICBmb3IgZSBpbiBzZWxmLmRhdGE6CisgICAgICAgICAgICBpZiBlLmNhbGxzOgorICAgICAgICAgICAgICAgIGUuY2FsbHMuc29ydChsYW1iZGEgYiwgYTogY21wKGdldGF0dHIoYSwgY3JpdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihiLCBjcml0KSkpCisKKyAgICBkZWYgcHByaW50KHNlbGYsIHRvcD1Ob25lLCBmaWxlPU5vbmUsIGxpbWl0PU5vbmUsIGNsaW1pdD1Ob25lKToKKyAgICAgICAgIiIiWFhYIGRvY3N0cmluZyIiIgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlID0gc3lzLnN0ZG91dAorICAgICAgICBkID0gc2VsZi5kYXRhCisgICAgICAgIGlmIHRvcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGQgPSBkWzp0b3BdCisgICAgICAgIGNvbHMgPSAiJSAxMnMgJTEycyAlMTEuNGYgJTExLjRmICAgJXNcbiIKKyAgICAgICAgaGNvbHMgPSAiJSAxMnMgJTEycyAlMTJzICUxMnMgJXNcbiIKKyAgICAgICAgY29sczIgPSAiKyUxMnMgJTEycyAlMTEuNGYgJTExLjRmICsgICVzXG4iCisgICAgICAgIGZpbGUud3JpdGUoaGNvbHMgJSAoIkNhbGxDb3VudCIsICJSZWN1cnNpdmUiLCAiVG90YWwobXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5saW5lKG1zKSIsICJtb2R1bGU6bGluZW5vKGZ1bmN0aW9uKSIpKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIGUgaW4gZDoKKyAgICAgICAgICAgIGZpbGUud3JpdGUoY29scyAlIChlLmNhbGxjb3VudCwgZS5yZWNjYWxsY291bnQsIGUudG90YWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaW5saW5ldGltZSwgbGFiZWwoZS5jb2RlKSkpCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBpZiBsaW1pdCBpcyBub3QgTm9uZSBhbmQgY291bnQgPT0gbGltaXQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBjY291bnQgPSAwCisgICAgICAgICAgICBpZiBlLmNhbGxzOgorICAgICAgICAgICAgICAgIGZvciBzZSBpbiBlLmNhbGxzOgorICAgICAgICAgICAgICAgICAgICBmaWxlLndyaXRlKGNvbHMgJSAoIislcyIgJSBzZS5jYWxsY291bnQsIHNlLnJlY2NhbGxjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlLnRvdGFsdGltZSwgc2UuaW5saW5ldGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIrJXMiICUgbGFiZWwoc2UuY29kZSkpKQorICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGNjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbWl0IGlzIG5vdCBOb25lIGFuZCBjb3VudCA9PSBsaW1pdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBpZiBjbGltaXQgaXMgbm90IE5vbmUgYW5kIGNjb3VudCA9PSBjbGltaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGZyZWV6ZShzZWxmKToKKyAgICAgICAgIiIiUmVwbGFjZSBhbGwgcmVmZXJlbmNlcyB0byBjb2RlIG9iamVjdHMgd2l0aCBzdHJpbmcKKyAgICAgICAgZGVzY3JpcHRpb25zOyB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHBpY2tsZSB0aGUgaW5zdGFuY2UuIiIiCisKKyAgICAgICAgIyB0aGlzIGNvZGUgaXMgcHJvYmFibHkgcmF0aGVyIGlja2llciB0aGFuIGl0IG5lZWRzIHRvIGJlIQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5kYXRhKSk6CisgICAgICAgICAgICBlID0gc2VsZi5kYXRhW2ldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlLmNvZGUsIHN0cik6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhW2ldID0gdHlwZShlKSgobGFiZWwoZS5jb2RlKSwpICsgZVsxOl0pCisgICAgICAgICAgICBpZiBlLmNhbGxzOgorICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihlLmNhbGxzKSk6CisgICAgICAgICAgICAgICAgICAgIHNlID0gZS5jYWxsc1tqXQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZS5jb2RlLCBzdHIpOgorICAgICAgICAgICAgICAgICAgICAgICAgZS5jYWxsc1tqXSA9IHR5cGUoc2UpKChsYWJlbChzZS5jb2RlKSwpICsgc2VbMTpdKQorCitfZm4ybW9kID0ge30KKworZGVmIGxhYmVsKGNvZGUpOgorICAgIGlmIGlzaW5zdGFuY2UoY29kZSwgc3RyKToKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICB0cnk6CisgICAgICAgIG1uYW1lID0gX2ZuMm1vZFtjb2RlLmNvX2ZpbGVuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgZm9yIGssIHYgaW4gc3lzLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIodiwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHYuX19maWxlX18sIHN0cik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHYuX19maWxlX18uc3RhcnRzd2l0aChjb2RlLmNvX2ZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBtbmFtZSA9IF9mbjJtb2RbY29kZS5jb19maWxlbmFtZV0gPSBrCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1uYW1lID0gX2ZuMm1vZFtjb2RlLmNvX2ZpbGVuYW1lXSA9ICc8JXM+JyVjb2RlLmNvX2ZpbGVuYW1lCisKKyAgICByZXR1cm4gJyVzOiVkKCVzKScgJSAobW5hbWUsIGNvZGUuY29fZmlyc3RsaW5lbm8sIGNvZGUuY29fbmFtZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBvcworICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbMTpdCisgICAgaWYgbm90IHN5cy5hcmd2OgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAidXNhZ2U6IGxzcHJvZi5weSA8c2NyaXB0PiA8YXJndW1lbnRzLi4uPiIKKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpKQorICAgIHN0YXRzID0gcHJvZmlsZShleGVjZmlsZSwgc3lzLmFyZ3ZbMF0sIGdsb2JhbHMoKSwgbG9jYWxzKCkpCisgICAgc3RhdHMuc29ydCgpCisgICAgc3RhdHMucHByaW50KCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvcHlzaC5weSBiL2JpdGJha2UvbGliL2JiL3B5c2gvcHlzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGU2MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcHlzaC9weXNoLnB5CkBAIC0wLDAgKzEsMTY3IEBACisjIHB5c2gucHkgLSBjb21tYW5kIHByb2Nlc3NpbmcgZm9yIHB5c2guCisjCisjIENvcHlyaWdodCAyMDA3IFBhdHJpY2sgTWV6YXJkCisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IGludGVycAorCitTSF9PUFQgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIocHJvZz0ncHlzaCcsIHVzYWdlPSIlcHJvZyBbT1BUSU9OU10iLCB2ZXJzaW9uPScwLjEnKQorU0hfT1BULmFkZF9vcHRpb24oJy1jJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nY29tbWFuZF9zdHJpbmcnLCBkZWZhdWx0PU5vbmUsIAorICAgIGhlbHA9J0Egc3RyaW5nIHRoYXQgc2hhbGwgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIHNoZWxsIGFzIG9uZSBvciBtb3JlIGNvbW1hbmRzJykKK1NIX09QVC5hZGRfb3B0aW9uKCctLXJlZGlyZWN0LXRvJywgZGVzdD0ncmVkaXJlY3RfdG8nLCBkZWZhdWx0PU5vbmUsIAorICAgIGhlbHA9J1JlZGlyZWN0IHNjcmlwdCBjb21tYW5kcyBzdGRvdXQgYW5kIHN0ZGVyciB0byB0aGUgc3BlY2lmaWVkIGZpbGUnKQorIyBTZWUgdXRpbGl0eV9jb21tYW5kIGluIGJ1aWx0aW4ucHkgYWJvdXQgdGhlIHJlYXNvbiBmb3IgdGhpcyBmbGFnLgorU0hfT1BULmFkZF9vcHRpb24oJy0tcmVkaXJlY3RlZCcsIGRlc3Q9J3JlZGlyZWN0ZWQnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCAKKyAgICBoZWxwPSdUZWxsIHRoZSBpbnRlcnByZXRlciB0aGF0IHN0ZG91dCBhbmQgc3RkZXJyIGFyZSBhY3R1YWxseSB0aGUgc2FtZSBvYmplY3RzLCB3aGljaCBpcyByZWFsbHkgc3Rkb3V0JykKK1NIX09QVC5hZGRfb3B0aW9uKCctLWRlYnVnLXBhcnNpbmcnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdkZWJ1Z19wYXJzaW5nJywgZGVmYXVsdD1GYWxzZSwgCisgICAgaGVscD0nVHJhY2UgUExZIGV4ZWN1dGlvbicpCitTSF9PUFQuYWRkX29wdGlvbignLS1kZWJ1Zy10cmVlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nZGVidWdfdHJlZScsIGRlZmF1bHQ9RmFsc2UsIAorICAgIGhlbHA9J0Rpc3BsYXkgdGhlIGdlbmVyYXRlZCBzeW50YXggdHJlZS4nKQorU0hfT1BULmFkZF9vcHRpb24oJy0tZGVidWctY21kJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nZGVidWdfY21kJywgZGVmYXVsdD1GYWxzZSwgCisgICAgaGVscD0nVHJhY2UgY29tbWFuZCBleGVjdXRpb24gYmVmb3JlIHBhcmFtZXRlcnMgZXhwYW5zaW9uIGFuZCBleGl0IHN0YXR1cy4nKQorU0hfT1BULmFkZF9vcHRpb24oJy0tZGVidWctdXRpbGl0eScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2RlYnVnX3V0aWxpdHknLCBkZWZhdWx0PUZhbHNlLCAKKyAgICBoZWxwPSdUcmFjZSB1dGlsaXR5IGNhbGxzLCBhZnRlciBwYXJhbWV0ZXJzIGV4cGFuc2lvbnMnKQorU0hfT1BULmFkZF9vcHRpb24oJy0tYXN0JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nYXN0JywgZGVmYXVsdD1GYWxzZSwKKyAgICBoZWxwPSdFbmNvZGVkIGNvbW1hbmRzIHRvIGV4ZWN1dGUgaW4gYSBzdWJwcm9jZXNzJykKK1NIX09QVC5hZGRfb3B0aW9uKCctLXByb2ZpbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLAorICAgIGhlbHA9J1Byb2ZpbGUgcHlzaCBydW4nKQorICAgIAorICAgIAorZGVmIHNwbGl0X2FyZ3MoYXJncyk6CisgICAgIyBTZXBhcmF0ZSBzaGVsbCBhcmd1bWVudHMgZnJvbSBjb21tYW5kIG9uZXMKKyAgICAjIEp1c3Qgc3RvcCBhdCB0aGUgZmlyc3QgYXJndW1lbnQgbm90IHN0YXJ0aW5nIHdpdGggYSBkYXNoLiBJIGtub3csIHRoaXMgaXMgY29tcGxldGVseSBicm9rZW4sCisgICAgIyBpdCBpZ25vcmVzIGZpbGVzIHN0YXJ0aW5nIHdpdGggYSBkYXNoIG9yIG1heSB0YWtlIG9wdGlvbiB2YWx1ZXMgZm9yIGNvbW1hbmQgZmlsZS4gVGhpcyBpcyBub3QKKyAgICAjIHN1cHBvc2VkIHRvIGhhcHBlbiBmb3Igbm93CisgICAgY29tbWFuZF9pbmRleCA9IGxlbihhcmdzKQorICAgIGZvciBpLGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CisgICAgICAgIGlmIG5vdCBhcmcuc3RhcnRzd2l0aCgnLScpOgorICAgICAgICAgICAgY29tbWFuZF9pbmRleCA9IGkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAKKyAgICByZXR1cm4gYXJnc1s6Y29tbWFuZF9pbmRleF0sIGFyZ3NbY29tbWFuZF9pbmRleDpdCisKKworZGVmIGZpeGVudihlbnYpOgorICAgIHBhdGggPSBlbnYuZ2V0KCdQQVRIJykKKyAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICBwYXJ0cyA9IHBhdGguc3BsaXQob3MucGF0aHNlcCkKKyAgICAgICAgIyBSZW1vdmUgV2luZG93cyB1dGlsaXRpZXMgZnJvbSBQQVRILCB0aGV5IGFyZSB1c2VsZXNzIGF0IGJlc3QgYW5kCisgICAgICAgICMgc29tZSBvZiB0aGVtIChmaW5kKSBtYXkgYmUgY29uZnVzZWQgd2l0aCBvdGhlciB1dGlsaXRpZXMuCisgICAgICAgIHBhcnRzID0gW3AgZm9yIHAgaW4gcGFydHMgaWYgJ3N5c3RlbTMyJyBub3QgaW4gcC5sb3dlcigpXQorICAgICAgICBlbnZbJ1BBVEgnXSA9IG9zLnBhdGhzZXAuam9pbihwYXJ0cykKKyAgICBpZiBlbnYuZ2V0KCdIT01FJykgaXMgTm9uZToKKyAgICAgICAgIyBTZXZlcmFsIHV0aWxpdGllcywgaW5jbHVkaW5nIGN2c3BzLCBjYW5ub3Qgd29yayB3aXRob3V0CisgICAgICAgICMgYSBkZWZpbmVkIEhPTUUgZGlyZWN0b3J5LgorICAgICAgICBlbnZbJ0hPTUUnXSA9IG9zLnBhdGguZXhwYW5kdXNlcignficpCisgICAgcmV0dXJuIGVudgorCitkZWYgX3NoKGN3ZCwgc2hhcmdzLCBjbWRhcmdzLCBvcHRpb25zLCBkZWJ1Z2ZsYWdzPU5vbmUsIGVudj1Ob25lKToKKyAgICBpZiBvcy5lbnZpcm9uLmdldCgnUFlTSF9URVhUJykgIT0gJzEnOgorICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgICAgIGZvciBmcCBpbiAoc3lzLnN0ZGluLCBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyKToKKyAgICAgICAgICAgIG1zdmNydC5zZXRtb2RlKGZwLmZpbGVubygpLCBvcy5PX0JJTkFSWSkKKworICAgIGhnYmluID0gb3MuZW52aXJvbi5nZXQoJ1BZU0hfSEdURVhUJykgIT0gJzEnCisgICAgCisgICAgaWYgZGVidWdmbGFncyBpcyBOb25lOgorICAgICAgICBkZWJ1Z2ZsYWdzID0gW10KKyAgICAgICAgaWYgb3B0aW9ucy5kZWJ1Z19wYXJzaW5nOiAgICBkZWJ1Z2ZsYWdzLmFwcGVuZCgnZGVidWctcGFyc2luZycpCisgICAgICAgIGlmIG9wdGlvbnMuZGVidWdfdXRpbGl0eTogICAgZGVidWdmbGFncy5hcHBlbmQoJ2RlYnVnLXV0aWxpdHknKQorICAgICAgICBpZiBvcHRpb25zLmRlYnVnX2NtZDogICAgICAgIGRlYnVnZmxhZ3MuYXBwZW5kKCdkZWJ1Zy1jbWQnKQorICAgICAgICBpZiBvcHRpb25zLmRlYnVnX3RyZWU6ICAgICAgIGRlYnVnZmxhZ3MuYXBwZW5kKCdkZWJ1Zy10cmVlJykKKyAgICAKKyAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgZW52ID0gZml4ZW52KGRpY3Qob3MuZW52aXJvbikpCisgICAgaWYgY3dkIGlzIE5vbmU6CisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisKKyAgICBpZiBub3QgY21kYXJnczoKKyAgICAgICAgIyBOb3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiAwCisKKyAgICBhc3QgPSBOb25lCisgICAgY29tbWFuZF9maWxlID0gTm9uZQorICAgIGlmIG9wdGlvbnMuY29tbWFuZF9zdHJpbmc6CisgICAgICAgIGlucHV0ID0gY21kYXJnc1swXQorICAgICAgICBpZiBub3Qgb3B0aW9ucy5hc3Q6CisgICAgICAgICAgICBpbnB1dCArPSAnXG4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzLCBpbnB1dCA9IGludGVycC5kZWNvZGVhcmdzKGlucHV0KSwgTm9uZQorICAgICAgICAgICAgZW52LCBhc3QgPSBhcmdzCisgICAgICAgICAgICBjd2QgPSBlbnYuZ2V0KCdQV0QnLCBjd2QpCisgICAgZWxzZToKKyAgICAgICAgY29tbWFuZF9maWxlID0gY21kYXJnc1swXQorICAgICAgICBhcmd1bWVudHMgPSBjbWRhcmdzWzE6XQorCisgICAgICAgIHByZWZpeCA9IGludGVycC5yZXNvbHZlX3NoZWJhbmcoY29tbWFuZF9maWxlLCBpZ25vcmVzaGVsbD1UcnVlKQorICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICBpbnB1dCA9ICcgJy5qb2luKHByZWZpeCArIFtjb21tYW5kX2ZpbGVdICsgYXJndW1lbnRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZWFkIGNvbW1hbmRzIGZyb20gZmlsZQorICAgICAgICAgICAgZiA9IGZpbGUoY29tbWFuZF9maWxlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVHJhaWxpbmcgbmV3bGluZSB0byBoZWxwIHRoZSBwYXJzZXIKKyAgICAgICAgICAgICAgICBpbnB1dCA9IGYucmVhZCgpICsgJ1xuJworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAKKyAgICByZWRpcmVjdCA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGlmIG9wdGlvbnMucmVkaXJlY3RlZDoKKyAgICAgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHN0ZGVyciA9IHN0ZG91dAorICAgICAgICBlbGlmIG9wdGlvbnMucmVkaXJlY3RfdG86CisgICAgICAgICAgICByZWRpcmVjdCA9IG9wZW4ob3B0aW9ucy5yZWRpcmVjdF90bywgJ3diJykKKyAgICAgICAgICAgIHN0ZG91dCA9IHJlZGlyZWN0CisgICAgICAgICAgICBzdGRlcnIgPSByZWRpcmVjdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgCisgICAgICAgICMgVE9ETzogc2V0IGFyZ3VtZW50cyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgb3B0cyA9IGludGVycC5PcHRpb25zKCkKKyAgICAgICAgb3B0cy5oZ2JpbmFyeSA9IGhnYmluCisgICAgICAgIGlwID0gaW50ZXJwLkludGVycHJldGVyKGN3ZCwgZGVidWdmbGFncywgc3Rkb3V0PXN0ZG91dCwgc3RkZXJyPXN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cz1vcHRzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEV4cG9ydCBnaXZlbiBlbnZpcm9ubWVudCBpbiBzaGVsbCBvYmplY3QKKyAgICAgICAgICAgIGZvciBrLHYgaW4gZW52Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGlwLmdldF9lbnYoKS5leHBvcnQoayx2KQorICAgICAgICAgICAgcmV0dXJuIGlwLmV4ZWN1dGVfc2NyaXB0KGlucHV0LCBhc3QsIHNjcmlwdHBhdGg9Y29tbWFuZF9maWxlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaXAuY2xvc2UoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHJlZGlyZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVkaXJlY3QuY2xvc2UoKQorCitkZWYgc2goY3dkPU5vbmUsIGFyZ3M9Tm9uZSwgZGVidWdmbGFncz1Ob25lLCBlbnY9Tm9uZSk6CisgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgc2hhcmdzLCBjbWRhcmdzID0gc3BsaXRfYXJncyhhcmdzKQorICAgIG9wdGlvbnMsIHNoYXJncyA9IFNIX09QVC5wYXJzZV9hcmdzKHNoYXJncykKKworICAgIGlmIG9wdGlvbnMucHJvZmlsZToKKyAgICAgICAgaW1wb3J0IGxzcHJvZgorICAgICAgICBwID0gbHNwcm9mLlByb2ZpbGVyKCkKKyAgICAgICAgcC5lbmFibGUoc3ViY2FsbHM9VHJ1ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIF9zaChjd2QsIHNoYXJncywgY21kYXJncywgb3B0aW9ucywgZGVidWdmbGFncywgZW52KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcC5kaXNhYmxlKCkKKyAgICAgICAgICAgIHN0YXRzID0gbHNwcm9mLlN0YXRzKHAuZ2V0c3RhdHMoKSkKKyAgICAgICAgICAgIHN0YXRzLnNvcnQoKQorICAgICAgICAgICAgc3RhdHMucHByaW50KHRvcD0xMCwgZmlsZT1zeXMuc3RkZXJyLCBjbGltaXQ9NSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gX3NoKGN3ZCwgc2hhcmdzLCBjbWRhcmdzLCBvcHRpb25zLCBkZWJ1Z2ZsYWdzLCBlbnYpCisgICAgICAgICAgICAKK2RlZiBtYWluKCk6CisgICAgc3lzLmV4aXQoc2goKSkKKworaWYgX19uYW1lX189PSdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9weXNoL3B5c2hsZXgucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3B5c2hsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3B5c2gvcHlzaGxleC5weQpAQCAtMCwwICsxLDg4OCBAQAorIyBweXNobGV4LnB5IC0gUExZIGNvbXBhdGlibGUgbGV4ZXIgZm9yIHB5c2guCisjCisjIENvcHlyaWdodCAyMDA3IFBhdHJpY2sgTWV6YXJkCisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworIyBUT0RPOgorIyAtIHJldmlldyBhbGwgImNoYXIgaW4gJ2FiYyciIHNuaXBwZXRzOiB0aGUgZW1wdHkgc3RyaW5nIGNhbiBiZSBtYXRjaGVkCisjIC0gdGVzdCBsaW5lIGNvbnRpbnVhdGlvbnMgd2l0aGluIHF1b3RlZC9leHBhbnNpb24gc3RyaW5ncworIyAtIGVvZiBpcyBidWdneSB3cnQgc3VibGV4ZXJzCisjIC0gdGhlIGxleGVyIGNhbm5vdCByZWFsbHkgd29yayBpbiBwdWxsIG1vZGUgYXMgaXQgd291bGQgYmUgcmVxdWlyZWQgdG8gcnVuCisjIFBMWSBpbiBwdWxsIG1vZGUuIEl0IHdhcyBkZXNpZ25lZCB0byB3b3JrIGluY3JlbWVudGFsbHkgYW5kIGl0IHdvdWxkIG5vdCBiZQorIyB0aGF0IGhhcmQgdG8gZW5hYmxlIHB1bGwgbW9kZS4KK2ltcG9ydCByZQordHJ5OgorICAgIHMgPSBzZXQoKQorICAgIGRlbCBzCitleGNlcHQgTmFtZUVycm9yOgorICAgIGZyb20gU2V0IGltcG9ydCBTZXQgYXMgc2V0CisKK2Zyb20gcGx5IGltcG9ydCBsZXgKK2Zyb20gc2hlcnJvcnMgaW1wb3J0ICoKKworY2xhc3MgTmVlZE1vcmUoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2RlZiBpc19ibGFuayhjKToKKyAgICByZXR1cm4gYyBpbiAoJyAnLCAnXHQnKQorICAgIAorX1JFX0RJR0lUUyA9IHJlLmNvbXBpbGUocideXGQrJCcpCisKK2RlZiBhcmVfZGlnaXRzKHMpOgorICAgIHJldHVybiBfUkVfRElHSVRTLnNlYXJjaChzKSBpcyBub3QgTm9uZQorCitfT1BFUkFUT1JTID0gZGljdChbCisgICAgKCcmJicsICdBTkRfSUYnKSwKKyAgICAoJ3x8JywgJ09SX0lGJyksCisgICAgKCc7OycsICdEU0VNSScpLAorICAgICgnPDwnLCAnRExFU1MnKSwKKyAgICAoJz4+JywgJ0RHUkVBVCcpLAorICAgICgnPCYnLCAnTEVTU0FORCcpLAorICAgICgnPiYnLCAnR1JFQVRBTkQnKSwKKyAgICAoJzw+JywgJ0xFU1NHUkVBVCcpLAorICAgICgnPDwtJywgJ0RMRVNTREFTSCcpLAorICAgICgnPnwnLCAnQ0xPQkJFUicpLAorICAgICgnJicsICdBTVAnKSwKKyAgICAoJzsnLCAnQ09NTUEnKSwKKyAgICAoJzwnLCAnTEVTUycpLAorICAgICgnPicsICdHUkVBVEVSJyksCisgICAgKCcoJywgJ0xQQVJFTlMnKSwKKyAgICAoJyknLCAnUlBBUkVOUycpLAorXSkKKworI01ha2UgYSBmdW5jdGlvbiB0byBzaWxlbmNlIHB5Y2hlY2tlciAiTG9jYWwgdmFyaWFibGUgc2hhZG93cyBnbG9iYWwiCitkZWYgbWFrZV9wYXJ0aWFsX29wcygpOgorICAgIHBhcnRpYWxzID0ge30KKyAgICBmb3IgayBpbiBfT1BFUkFUT1JTOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oaykrMSk6CisgICAgICAgICAgICBwYXJ0aWFsc1trWzppXV0gPSBOb25lCisgICAgcmV0dXJuIHBhcnRpYWxzICAKKworX1BBUlRJQUxfT1BFUkFUT1JTID0gbWFrZV9wYXJ0aWFsX29wcygpICAgIAorICAgICAgICAKK2RlZiBpc19wYXJ0aWFsX29wKHMpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHMgbWF0Y2hlcyBhIG5vbi1lbXB0eSBzdWJwYXJ0IG9mIGFuIG9wZXJhdG9yIHN0YXJ0aW5nCisgICAgYXQgaXRzIGZpcnN0IGNoYXJhY3Rlci4KKyAgICAiIiIKKyAgICByZXR1cm4gcyBpbiBfUEFSVElBTF9PUEVSQVRPUlMKKyAgICAKK2RlZiBpc19vcChzKToKKyAgICAiIiJJZiBzIG1hdGNoZXMgYW4gb3BlcmF0b3IsIHJldHVybnMgdGhlIG9wZXJhdG9yIGlkZW50aWZpZXIuIFJldHVybiBOb25lCisgICAgb3RoZXJ3aXNlLgorICAgICIiIgorICAgIHJldHVybiBfT1BFUkFUT1JTLmdldChzKQorCitfUkVTRVJWRURTID0gZGljdChbCisgICAgKCdpZicsICdJZicpLAorICAgICgndGhlbicsICdUaGVuJyksCisgICAgKCdlbHNlJywgJ0Vsc2UnKSwKKyAgICAoJ2VsaWYnLCAnRWxpZicpLAorICAgICgnZmknLCAnRmknKSwKKyAgICAoJ2RvJywgJ0RvJyksCisgICAgKCdkb25lJywgJ0RvbmUnKSwKKyAgICAoJ2Nhc2UnLCAnQ2FzZScpLAorICAgICgnZXNhYycsICdFc2FjJyksCisgICAgKCd3aGlsZScsICdXaGlsZScpLAorICAgICgndW50aWwnLCAnVW50aWwnKSwKKyAgICAoJ2ZvcicsICdGb3InKSwKKyAgICAoJ3snLCAnTGJyYWNlJyksCisgICAgKCd9JywgJ1JicmFjZScpLAorICAgICgnIScsICdCYW5nJyksCisgICAgKCdpbicsICdJbicpLAorICAgICgnfCcsICdQSVBFJyksCitdKQorICAgIAorZGVmIGdldF9yZXNlcnZlZChzKToKKyAgICByZXR1cm4gX1JFU0VSVkVEUy5nZXQocykKKyAgICAKK19SRV9OQU1FID0gcmUuY29tcGlsZShyJ15bMC05YS16QS1aX10rJCcpCisKK2RlZiBpc19uYW1lKHMpOgorICAgIHJldHVybiBfUkVfTkFNRS5zZWFyY2gocykgaXMgbm90IE5vbmUKKworZGVmIGZpbmRfY2hhcnMoc2VxLCBjaGFycyk6CisgICAgZm9yIGksdiBpbiBlbnVtZXJhdGUoc2VxKToKKyAgICAgICAgaWYgdiBpbiBjaGFyczoKKyAgICAgICAgICAgIHJldHVybiBpLHYKKyAgICByZXR1cm4gLTEsIE5vbmUKKworY2xhc3MgV29yZExleGVyOgorICAgICIiIldvcmRMZXhlciBwYXJzZSBxdW90ZWQgb3IgZXhwYW5zaW9uIGV4cHJlc3Npb25zIGFuZCByZXR1cm4gYW4gZXhwcmVzc2lvbgorICAgIHRyZWUuIFRoZSBpbnB1dCBzdHJpbmcgY2FuIGJlIGFueSB3ZWxsIGZvcm1lZCBzZXF1ZW5jZSBiZWdpbm5pbmcgd2l0aCBxdW90aW5nCisgICAgb3IgZXhwYW5zaW9uIGNoYXJhY3Rlci4gRW1iZWRkZWQgZXhwcmVzc2lvbnMgYXJlIGhhbmRsZWQgcmVjdXJzaXZlbHkuIFRoZQorICAgIHJlc3VsdGluZyB0cmVlIGlzIG1hZGUgb2YgbGlzdHMgYW5kIHN0cmluZ3MuIExpc3RzIHJlcHJlc2VudCBxdW90ZWQgb3IKKyAgICBleHBhbnNpb24gZXhwcmVzc2lvbnMuIEVhY2ggbGlzdCBmaXJzdCBlbGVtZW50IGlzIHRoZSBvcGVuaW5nIHNlcGFyYXRvciwKKyAgICB0aGUgbGFzdCBvbmUgdGhlIGNsb3Npbmcgc2VwYXJhdG9yLiBJbi1iZXR3ZWVuIGNhbiBiZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MKKyAgICBvciBsaXN0cyBmb3Igc3ViLWV4cHJlc3Npb25zLiBOb24gcXVvdGVkL2V4cGFuc2lvbiBleHByZXNzaW9uIGNhbiB3cml0dGVuIGFzCisgICAgc3RyaW5ncyBvciBhcyBsaXN0cyB3aXRoIGVtcHR5IHN0cmluZ3MgYXMgc3RhcnRpbmcgYW5kIGVuZGluZyBkZWxpbWl0ZXJzLgorICAgICIiIgorCisgICAgTkFNRV9DSEFSU0VUID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XycKKyAgICBOQU1FX0NIQVJTRVQgPSBkaWN0KHppcChOQU1FX0NIQVJTRVQsIE5BTUVfQ0hBUlNFVCkpCisgICAgCisgICAgU1BFQ0lBTF9DSEFSU0VUID0gJ0AqIz8tJCEwJworICAgIAorICAgICNDaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSBlc2NhcGVkIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgZGVsaW1pdGVycworICAgIEVTQ0FQQUJMRSA9IHsKKyAgICAgICAgJ2AnOiBzZXQoWyckJywgJ1xcJywgJ2AnXSksCisgICAgICAgICciJzogc2V0KFsnJCcsICdcXCcsICdgJywgJyInXSksCisgICAgICAgICInIjogc2V0KCksCisgICAgfQorICAgICAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVyZWRvYyA9IEZhbHNlKToKKyAgICAgICAgIyBfYnVmZmVyIGlzIHRoZSB1bnByb2Nlc3NlZCBpbnB1dCBjaGFyYWN0ZXJzIGJ1ZmZlcgorICAgICAgICBzZWxmLl9idWZmZXIgPSBbXQorICAgICAgICAjIF9zdGFjayBpcyBlbXB0eSBvciBjb250YWlucyBhIHF1b3RlZCBsaXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAgICAjICh0aGlzIGlzIHRoZSBERlMgcGF0aCB0byB0aGUgcXVvdGVkIGV4cHJlc3Npb24gYmVpbmcgZXZhbHVhdGVkKS4KKyAgICAgICAgc2VsZi5fc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9lc2NhcGFibGUgPSBOb25lCisgICAgICAgICMgVHJ1ZSB3aGVuIHBhcnNpbmcgdW5xdW90ZWQgaGVyZSBkb2N1bWVudHMKKyAgICAgICAgc2VsZi5faGVyZWRvYyA9IGhlcmVkb2MKKyAgICAgICAgCisgICAgZGVmIGFkZChzZWxmLCBkYXRhLCBlb2Y9RmFsc2UpOgorICAgICAgICAiIiJGZWVkIHRoZSBsZXhlciB3aXRoIG1vcmUgZGF0YS4gSWYgdGhlIHF1b3RlZCBleHByZXNzaW9uIGNhbiBiZQorICAgICAgICBkZWxpbWl0ZWQsIHJldHVybiBhIHR1cGxlIChleHByLCByZW1haW5pbmcpIGNvbnRhaW5pbmcgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgdHJlZSBhbmQgdGhlIHVuY29uc3VtZWQgZGF0YS4KKyAgICAgICAgT3RoZXJ3aXNlLCByYWlzZSBOZWVkTW9yZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2J1ZmZlciArPSBsaXN0KGRhdGEpCisgICAgICAgIHNlbGYuX3BhcnNlKGVvZikKKyAgICAgICAgCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX3N0YWNrWzBdCisgICAgICAgIHJlbWFpbmluZyA9ICcnLmpvaW4oc2VsZi5fYnVmZmVyKQorICAgICAgICBzZWxmLl9zdGFjayA9IFtdCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHJldHVybiByZXN1bHQsIHJlbWFpbmluZworICAgICAgICAKKyAgICBkZWYgX2lzX2VzY2FwYWJsZShzZWxmLCBjLCBkZWxpbT1Ob25lKToKKyAgICAgICAgaWYgZGVsaW0gaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuX2hlcmVkb2M6CisgICAgICAgICAgICAgICAgIyBCYWNrc2xhc2hlcyB3b3JrcyBhcyBpZiB0aGV5IHdlcmUgZG91YmxlIHF1b3RlZCBpbiB1bnF1b3RlZAorICAgICAgICAgICAgICAgICMgaGVyZS1kb2N1bWVudHMKKyAgICAgICAgICAgICAgICBkZWxpbSA9ICciJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5fc3RhY2spPD0xOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgIGRlbGltID0gc2VsZi5fc3RhY2tbLTJdWzBdCisgICAgICAgICAgICAKKyAgICAgICAgZXNjYXBhYmxlcyA9IHNlbGYuRVNDQVBBQkxFLmdldChkZWxpbSwgTm9uZSkKKyAgICAgICAgcmV0dXJuIGVzY2FwYWJsZXMgaXMgTm9uZSBvciBjIGluIGVzY2FwYWJsZXMKKyAgICAgICAgCisgICAgZGVmIF9wYXJzZV9zcXVvdGUoc2VsZiwgYnVmLCByZXN1bHQsIGVvZik6CisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBvcyA9IGJ1Zi5pbmRleCgiJyIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICByZXN1bHRbLTFdICs9ICcnLmpvaW4oYnVmWzpwb3NdKQorICAgICAgICByZXN1bHQgKz0gWyInIl0KKyAgICAgICAgcmV0dXJuIHBvcysxLCBUcnVlCisgICAgICAgIAorICAgIGRlZiBfcGFyc2VfYnF1b3RlKHNlbGYsIGJ1ZiwgcmVzdWx0LCBlb2YpOgorICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgCisgICAgICAgIGlmIGJ1ZlswXT09J1xuJzoKKyAgICAgICAgICAgICNSZW1vdmUgbGluZSBjb250aW51YXRpb25zCisgICAgICAgICAgICByZXN1bHRbOl0gPSBbJycsICcnLCAnJ10KKyAgICAgICAgZWxpZiBzZWxmLl9pc19lc2NhcGFibGUoYnVmWzBdKToKKyAgICAgICAgICAgIHJlc3VsdFstMV0gKz0gYnVmWzBdCisgICAgICAgICAgICByZXN1bHQgKz0gWycnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI0tlZXAgYXMgc3VjaAorICAgICAgICAgICAgcmVzdWx0WzpdID0gWycnLCAnXFwnK2J1ZlswXSwgJyddCisgICAgICAgIAorICAgICAgICByZXR1cm4gMSwgVHJ1ZQorICAgICAgICAKKyAgICBkZWYgX3BhcnNlX2RxdW90ZShzZWxmLCBidWYsIHJlc3VsdCwgZW9mKToKKyAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgcG9zLCBzZXAgPSBmaW5kX2NoYXJzKGJ1ZiwgJyRcXGAiJykKKyAgICAgICAgaWYgcG9zPT0tMToKKyAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgIAorICAgICAgICByZXN1bHRbLTFdICs9ICcnLmpvaW4oYnVmWzpwb3NdKQorICAgICAgICBpZiBzZXA9PSciJzoKKyAgICAgICAgICAgIHJlc3VsdCArPSBbJyInXQorICAgICAgICAgICAgcmV0dXJuIHBvcysxLCBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjS2VlcCBldmVyeXRoaW5nIHVudGlsIHRoZSBzZXBhcmF0b3IgYW5kIGRlZmVyIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHJldHVybiBwb3MsIEZhbHNlCisgICAgICAgICAgICAKKyAgICBkZWYgX3BhcnNlX2NvbW1hbmQoc2VsZiwgYnVmLCByZXN1bHQsIGVvZik6CisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisKKyAgICAgICAgY2hhcnMgPSAnJFxcYCJcJycKKyAgICAgICAgaWYgcmVzdWx0WzBdID09ICckKCc6CisgICAgICAgICAgICBjaGFycyArPSAnKScKKyAgICAgICAgcG9zLCBzZXAgPSBmaW5kX2NoYXJzKGJ1ZiwgY2hhcnMpCisgICAgICAgIGlmIHBvcyA9PSAtMToKKyAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgIAorICAgICAgICByZXN1bHRbLTFdICs9ICcnLmpvaW4oYnVmWzpwb3NdKQorICAgICAgICBpZiAocmVzdWx0WzBdPT0nJCgnIGFuZCBzZXA9PScpJykgb3IgKHJlc3VsdFswXT09J2AnIGFuZCBzZXA9PSdgJyk6CisgICAgICAgICAgICByZXN1bHQgKz0gW3NlcF0KKyAgICAgICAgICAgIHJldHVybiBwb3MrMSwgVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBvcywgRmFsc2UKKyAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2VfcGFyYW1ldGVyKHNlbGYsIGJ1ZiwgcmVzdWx0LCBlb2YpOgorICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgCisgICAgICAgIHBvcywgc2VwID0gZmluZF9jaGFycyhidWYsICckXFxgIlwnfScpCisgICAgICAgIGlmIHBvcz09LTE6CisgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAKKyAgICAgICAgcmVzdWx0Wy0xXSArPSAnJy5qb2luKGJ1Zls6cG9zXSkKKyAgICAgICAgaWYgc2VwPT0nfSc6CisgICAgICAgICAgICByZXN1bHQgKz0gW3NlcF0KKyAgICAgICAgICAgIHJldHVybiBwb3MrMSwgVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBvcywgRmFsc2UKKyAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2VfZG9sbGFyKHNlbGYsIGJ1ZiwgcmVzdWx0LCBlb2YpOgorICAgICAgICBzZXAgPSByZXN1bHRbMF0KKyAgICAgICAgaWYgc2VwPT0nJCc6ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgICNUT0RPOiBoYW5kbGUgZW1wdHkgJAorICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgIGlmIGJ1ZlswXT09JygnOgorICAgICAgICAgICAgICAgIGlmIGxlbihidWYpPT0xOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIGJ1ZlsxXT09JygnOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSAnJCgoJworICAgICAgICAgICAgICAgICAgICBidWZbOjJdID0gW10KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSAnJCgnCisgICAgICAgICAgICAgICAgICAgIGJ1Zls6MV0gPSBbXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZWxpZiBidWZbMF09PSd7JzoKKyAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSAnJHsnCisgICAgICAgICAgICAgICAgYnVmWzoxXSA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGJ1ZlswXSBpbiBzZWxmLlNQRUNJQUxfQ0hBUlNFVDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wy0xXSA9IGJ1ZlswXQorICAgICAgICAgICAgICAgICAgICByZWFkID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciByZWFkLGMgaW4gZW51bWVyYXRlKGJ1Zik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjIG5vdCBpbiBzZWxmLk5BTUVfQ0hBUlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVvZjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXN1bHRbLTFdICs9ICcnLmpvaW4oYnVmWzA6cmVhZF0pCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIG5vdCByZXN1bHRbLTFdOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRbOl0gPSBbJycsIHJlc3VsdFswXSwgJyddCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFsnJ10gCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQsVHJ1ZQorICAgICAgICAKKyAgICAgICAgc2VwID0gcmVzdWx0WzBdICAgIAorICAgICAgICBpZiBzZXA9PSckKCc6CisgICAgICAgICAgICBwYXJzZWZ1bmMgPSBzZWxmLl9wYXJzZV9jb21tYW5kCisgICAgICAgIGVsaWYgc2VwPT0nJHsnOgorICAgICAgICAgICAgcGFyc2VmdW5jID0gc2VsZi5fcGFyc2VfcGFyYW1ldGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKHNlcCkKKyAgICAgICAgICAgIAorICAgICAgICBwb3MsIGNsb3NlZCA9IHBhcnNlZnVuYyhidWYsIHJlc3VsdCwgZW9mKQorICAgICAgICByZXR1cm4gcG9zLCBjbG9zZWQKKworICAgIGRlZiBfcGFyc2Uoc2VsZiwgZW9mKToKKyAgICAgICAgYnVmID0gc2VsZi5fYnVmZmVyCisgICAgICAgIHN0YWNrID0gc2VsZi5fc3RhY2sKKyAgICAgICAgcmVjdXJzZSA9IEZhbHNlCisgICAgCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiBub3Qgc3RhY2sgb3IgcmVjdXJzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAgICAgaWYgYnVmWzBdIG5vdCBpbiAoJyJcXGAkXCcnKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2hlbGxTeW50YXhFcnJvcignSW52YWxpZCBxdW90ZWQgc3RyaW5nIHNlcXVlbmNlJykKKyAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoW2J1ZlswXSwgJyddKQorICAgICAgICAgICAgICAgIGJ1Zls6MV0gPSBbXQorICAgICAgICAgICAgICAgIHJlY3Vyc2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmVzdWx0ID0gc3RhY2tbLTFdCisgICAgICAgICAgICBpZiByZXN1bHRbMF09PSInIjoKKyAgICAgICAgICAgICAgICBwYXJzZWZ1bmMgPSBzZWxmLl9wYXJzZV9zcXVvdGUKKyAgICAgICAgICAgIGVsaWYgcmVzdWx0WzBdPT0nXFwnOgorICAgICAgICAgICAgICAgIHBhcnNlZnVuYyA9IHNlbGYuX3BhcnNlX2JxdW90ZQorICAgICAgICAgICAgZWxpZiByZXN1bHRbMF09PSciJzoKKyAgICAgICAgICAgICAgICBwYXJzZWZ1bmMgPSBzZWxmLl9wYXJzZV9kcXVvdGUKKyAgICAgICAgICAgIGVsaWYgcmVzdWx0WzBdPT0nYCc6CisgICAgICAgICAgICAgICAgcGFyc2VmdW5jID0gc2VsZi5fcGFyc2VfY29tbWFuZAorICAgICAgICAgICAgZWxpZiByZXN1bHRbMF1bMF09PSckJzoKKyAgICAgICAgICAgICAgICBwYXJzZWZ1bmMgPSBzZWxmLl9wYXJzZV9kb2xsYXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZWFkLCBjbG9zZWQgPSBwYXJzZWZ1bmMoYnVmLCByZXN1bHQsIGVvZikKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJ1Zls6cmVhZF0gPSBbXQorICAgICAgICAgICAgaWYgY2xvc2VkOgorICAgICAgICAgICAgICAgIGlmIGxlbihzdGFjayk+MToKKyAgICAgICAgICAgICAgICAgICAgI01lcmdlIGluIHBhcmVudCBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YWNrWy0xXSArPSBbcGFyc2VkXQorICAgICAgICAgICAgICAgICAgICBzdGFja1stMV0gKz0gWycnXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlY3Vyc2UgPSBUcnVlCisKK2RlZiBub3JtYWxpemVfd29yZHRyZWUod3RyZWUpOgorICAgICIiIkZvbGQgYmFjayBldmVyeSBsaXRlcmFsIHNlcXVlbmNlIChkZWxpbWl0ZWQgd2l0aCBlbXB0eSBzdHJpbmdzKSBpbnRvCisgICAgcGFyZW50IHNlcXVlbmNlLgorICAgICIiIgorICAgIGRlZiBub3JtYWxpemUod3RyZWUpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgcGFydCBpbiB3dHJlZVsxOi0xXToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFydCwgbGlzdCk6CisgICAgICAgICAgICAgICAgcGFydCA9IG5vcm1hbGl6ZShwYXJ0KQorICAgICAgICAgICAgICAgIGlmIHBhcnRbMF09PScnOgorICAgICAgICAgICAgICAgICAgICAjTW92ZSB0aGUgcGFydCBjb250ZW50IGJhY2sgYXQgY3VycmVudCBsZXZlbAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gcGFydFsxOi0xXQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBub3QgcGFydDoKKyAgICAgICAgICAgICAgICAjUmVtb3ZlIGVtcHR5IHN0cmluZ3MKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwYXJ0KQorICAgICAgICBpZiBub3QgcmVzdWx0OgorICAgICAgICAgICAgcmVzdWx0ID0gWycnXSAgICAKKyAgICAgICAgcmV0dXJuIFt3dHJlZVswXV0gKyByZXN1bHQgKyBbd3RyZWVbLTFdXQorICAgICAgICAgICAgICAgIAorICAgIHJldHVybiBub3JtYWxpemUod3RyZWUpCisgICAgCisgICAgICAgICAgICAgICAgCitkZWYgbWFrZV93b3JkdHJlZSh0b2tlbiwgaGVyZV9kb2N1bWVudD1GYWxzZSk6CisgICAgIiIiUGFyc2UgYSBkZWxpbWl0ZWQgdG9rZW4gYW5kIHJldHVybiBhIHRyZWUgc2ltaWxhciB0byB0aGUgb25lcyByZXR1cm5lZCBieQorICAgIFdvcmRMZXhlci4gdG9rZW4gbWF5IGNvbnRhaW4gYW55IGNvbWJpbmF0aW9ucyBvZiBleHBhbnNpb24vcXVvdGVkIGZpZWxkcyBhbmQKKyAgICBub24tb25lcy4KKyAgICAiIiIgICAgCisgICAgdHJlZSA9IFsnJ10KKyAgICByZW1haW5pbmcgPSB0b2tlbgorICAgIGRlbGltaXRlcnMgPSAnXFwkYCcKKyAgICBpZiBub3QgaGVyZV9kb2N1bWVudDoKKyAgICAgICAgZGVsaW1pdGVycyArPSAnXCciJworICAgIAorICAgIHdoaWxlIDE6CisgICAgICAgIHBvcywgc2VwID0gZmluZF9jaGFycyhyZW1haW5pbmcsIGRlbGltaXRlcnMpCisgICAgICAgIGlmIHBvcz09LTE6CisgICAgICAgICAgICB0cmVlICs9IFtyZW1haW5pbmcsICcnXQorICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZV93b3JkdHJlZSh0cmVlKQorICAgICAgICB0cmVlLmFwcGVuZChyZW1haW5pbmdbOnBvc10pCisgICAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZ1twb3M6XQorICAgICAgICAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0LCByZW1haW5pbmcgPSBXb3JkTGV4ZXIoaGVyZWRvYyA9IGhlcmVfZG9jdW1lbnQpLmFkZChyZW1haW5pbmcsIFRydWUpCisgICAgICAgIGV4Y2VwdCBOZWVkTW9yZToKKyAgICAgICAgICAgIHJhaXNlIFNoZWxsU3ludGF4RXJyb3IoJ0ludmFsaWQgdG9rZW4gIiVzIicpCisgICAgICAgIHRyZWUuYXBwZW5kKHJlc3VsdCkKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCitkZWYgd29yZHRyZWVfYXNfc3RyaW5nKHd0cmVlKToKKyAgICAiIiJSZXdyaXRlIGFuIGV4cHJlc3Npb24gdHJlZSBnZW5lcmF0ZWQgYnkgbWFrZV93b3JkdHJlZSBhcyBzdHJpbmcuIiIiCisgICAgZGVmIHZpc2l0KG5vZGUsIG91dHB1dCk6CisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgbGlzdCk6CisgICAgICAgICAgICAgICAgdmlzaXQoY2hpbGQsIG91dHB1dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChjaGlsZCkKKyAgICAKKyAgICBvdXRwdXQgPSBbXQorICAgIHZpc2l0KHd0cmVlLCBvdXRwdXQpCisgICAgcmV0dXJuICcnLmpvaW4ob3V0cHV0KQorICAgIAorICAgIAorZGVmIHVucXVvdGVfd29yZHRyZWUod3RyZWUpOgorICAgICIiIkZvbGQgdGhlIHdvcmQgdHJlZSB3aGlsZSByZW1vdmluZyBxdW90ZXMgZXZlcnl3aGVyZS4gT3RoZXIgZXhwYW5zaW9uCisgICAgc2VxdWVuY2VzIGFyZSBqb2luZWQgYXMgc3VjaC4KKyAgICAiIiIKKyAgICBkZWYgdW5xdW90ZSh3dHJlZSk6CisgICAgICAgIHVucXVvdGVkID0gW10KKyAgICAgICAgaWYgd3RyZWVbMF0gaW4gKCcnLCAiJyIsICciJywgJ1xcJyk6CisgICAgICAgICAgICB3dHJlZSA9IHd0cmVlWzE6LTFdCisgICAgICAgICAgICAKKyAgICAgICAgZm9yIHBhcnQgaW4gd3RyZWU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnQsIGxpc3QpOgorICAgICAgICAgICAgICAgIHBhcnQgPSB1bnF1b3RlKHBhcnQpCisgICAgICAgICAgICB1bnF1b3RlZC5hcHBlbmQocGFydCkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odW5xdW90ZWQpCisgICAgICAgICAgICAKKyAgICByZXR1cm4gdW5xdW90ZSh3dHJlZSkKKyAgICAKKyAgICAKK2NsYXNzIEhlcmVEb2NMZXhlcjoKKyAgICAiIiJIZXJlRG9jTGV4ZXIgZGVsaW1pdHMgd2hhdGV2ZXIgY29tZXMgZnJvbSB0aGUgaGVyZS1kb2N1bWVudCBzdGFydGluZyBuZXdsaW5lCisgICAgbm90IGluY2x1ZGVkIHRvIHRoZSBjbG9zaW5nIGRlbGltaXRlciBsaW5lIGluY2x1ZGVkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcCwgZGVsaW0pOgorICAgICAgICBhc3NlcnQgb3AgaW4gKCc8PCcsICc8PC0nKQorICAgICAgICBpZiBub3QgZGVsaW06CisgICAgICAgICAgICByYWlzZSBTaGVsbFN5bnRheEVycm9yKCdpbnZhbGlkIGhlcmUgZG9jdW1lbnQgZGVsaW1pdGVyICVzJyAlIHN0cihkZWxpbSkpCisgICAgICAgICAgICAKKyAgICAgICAgc2VsZi5fb3AgPSBvcAorICAgICAgICBzZWxmLl9kZWxpbSA9IGRlbGltCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHNlbGYuX3Rva2VuID0gW10KKyAgICAgICAgCisgICAgZGVmIGFkZChzZWxmLCBkYXRhLCBlb2YpOgorICAgICAgICAiIiJJZiB0aGUgaGVyZS1kb2N1bWVudCB3YXMgZGVsaW1pdGVkLCByZXR1cm4gYSB0dXBsZSAoY29udGVudCwgcmVtYWluaW5nKS4KKyAgICAgICAgUmFpc2UgTmVlZE1vcmUoKSBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9idWZmZXIgKz0gbGlzdChkYXRhKQorICAgICAgICBzZWxmLl9wYXJzZShlb2YpCisgICAgICAgIHRva2VuID0gJycuam9pbihzZWxmLl90b2tlbikKKyAgICAgICAgcmVtYWluaW5nID0gJycuam9pbihzZWxmLl9idWZmZXIpCisgICAgICAgIHNlbGYuX3Rva2VuLCBzZWxmLl9yZW1haW5pbmcgPSBbXSwgW10KKyAgICAgICAgcmV0dXJuIHRva2VuLCByZW1haW5pbmcKKyAgICAKKyAgICBkZWYgX3BhcnNlKHNlbGYsIGVvZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjTG9vayBmb3IgZmlyc3QgdW5lc2NhcGVkIG5ld2xpbmUuIFF1b3RlcyBtYXkgYmUgaWdub3JlZAorICAgICAgICAgICAgZXNjYXBlZCA9IEZhbHNlCisgICAgICAgICAgICBmb3IgaSxjIGluIGVudW1lcmF0ZShzZWxmLl9idWZmZXIpOgorICAgICAgICAgICAgICAgIGlmIGVzY2FwZWQ6CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsaWYgYz09J1xcJzoKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIGM9PSdcbic6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgPSAtMQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIGk9PS0xIG9yIHNlbGYuX2J1ZmZlcltpXSE9J1xuJzoKKyAgICAgICAgICAgICAgICBpZiBub3QgZW9mOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAgICAgI05vIG1vcmUgZGF0YSwgbWF5YmUgdGhlIGxhc3QgbGluZSBpcyBjbG9zaW5nIGRlbGltaXRlcgorICAgICAgICAgICAgICAgIGxpbmUgPSAnJy5qb2luKHNlbGYuX2J1ZmZlcikKKyAgICAgICAgICAgICAgICBlb2wgPSAnJworICAgICAgICAgICAgICAgIHNlbGYuX2J1ZmZlcls6XSA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmUgPSAnJy5qb2luKHNlbGYuX2J1ZmZlcls6aV0pCisgICAgICAgICAgICAgICAgZW9sID0gc2VsZi5fYnVmZmVyW2ldCisgICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyWzppKzFdID0gW10KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgc2VsZi5fb3A9PSc8PC0nOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmxzdHJpcCgnXHQnKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgbGluZT09c2VsZi5fZGVsaW06CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlbGYuX3Rva2VuICs9IFtsaW5lLCBlb2xdCisgICAgICAgICAgICBpZiBpPT0tMToKKyAgICAgICAgICAgICAgICBicmVhaworICAgIAorY2xhc3MgVG9rZW46CisgICAgI1RPRE86IGNoZWNrIHRoaXMgaXMgc3RpbGwgaW4gdXNlCisgICAgT1BFUkFUT1IgPSAnT1BFUkFUT1InCisgICAgV09SRCA9ICdXT1JEJworICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZSA9ICcnCisgICAgICAgIHNlbGYudHlwZSA9IE5vbmUKKyAgICAgICAgCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICNCZWhhdmUgbGlrZSBhIHR3byBlbGVtZW50cyB0dXBsZQorICAgICAgICBpZiBrZXk9PTA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50eXBlCisgICAgICAgIGlmIGtleT09MToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisgICAgICAgIHJhaXNlIEluZGV4RXJyb3Ioa2V5KQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAKK2NsYXNzIEhlcmVEb2M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wLCBuYW1lPU5vbmUpOgorICAgICAgICBzZWxmLm9wID0gb3AKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnBlbmRpbmdzID0gW10KKyAgICAgICAgICAgICAgIAorVEtfQ09NTUEgICAgICAgID0gJ0NPTU1BJworVEtfQU1QRVJTQU5EICAgID0gJ0FNUCcKK1RLX09QICAgICAgICAgICA9ICdPUCcKK1RLX1RPS0VOICAgICAgICA9ICdUT0tFTicKK1RLX0NPTU1FTlQgICAgICA9ICdDT01NRU5UJworVEtfTkVXTElORSAgICAgID0gJ05FV0xJTkUnIAorVEtfSU9OVU1CRVIgICAgID0gJ0lPX05VTUJFUicKK1RLX0FTU0lHTk1FTlQgICA9ICdBU1NJR05NRU5UX1dPUkQnCitUS19IRVJFTkFNRSAgICAgPSAnSEVSRU5BTUUnCisKK2NsYXNzIExleGVyOgorICAgICIiIk1haW4gbGV4ZXIuCisgICAgCisgICAgQ2FsbCBhZGQoKSB1bnRpbCB0aGUgc2NyaXB0IEFTVCBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICAjIEhlcmUtZG9jdW1lbnQgaGFuZGxpbmcgbWFrZXMgdGhlIHdob2xlIHRoaW5nIG1vcmUgY29tcGxleCBiZWNhdXNlIHRoZXkgYmFzaWNhbGx5CisgICAgIyBmb3JjZSB0b2tlbnMgdG8gYmUgcmVvcmRlcmVkOiBoZXJlLWNvbnRlbnQgbXVzdCBjb21lIHJpZ2h0IGFmdGVyIHRoZSBvcGVyYXRvcgorICAgICMgYW5kIHRoZSBoZXJlLWRvY3VtZW50IG5hbWUsIHdoaWxlIHNvbWUgb3RoZXIgdG9rZW5zIG1pZ2h0IGJlIGZvbGxvd2luZyB0aGUKKyAgICAjIGhlcmUtZG9jdW1lbnQgZXhwcmVzc2lvbiBvbiB0aGUgc2FtZSBsaW5lLgorICAgICMKKyAgICAjIFNvLCBoZXJlLWRvYyBzdGF0ZXMgYXJlIGJhc2ljYWxseToKKyAgICAjICAgKnNlbGYuX3N0YXRlPT1TVF9OT1JNQUwKKyAgICAjICAgICAgIC0gc2VsZi5faGVyZWRvYy5vcCBpcyBOb25lOiBubyBoZXJlLWRvY3VtZW50CisgICAgIyAgICAgICAtIHNlbGYuX2hlcmVkb2Mub3AgaXMgbm90IE5vbmUgYnV0IG5hbWUgaXM6IGhlcmUtZG9jdW1lbnQgb3BlcmF0b3IgbWF0Y2hlZCwKKyAgICAjICAgICAgICAgICB3YWl0aW5nIGZvciB0aGUgZG9jdW1lbnQgbmFtZS9kZWxpbWl0ZXIKKyAgICAjICAgICAgIC0gc2VsZi5faGVyZWRvYy5vcCBhbmQgbmFtZSBhcmUgbm90IE5vbmU6IGhlcmUtZG9jdW1lbnQgaXMgcmVhZHksIGZvbGxvd2luZworICAgICMgICAgICAgICAgIHRva2VucyBhcmUgYmVpbmcgc3RvcmVkIGFuZCB3aWxsIGJlIHB1c2hlZCBhZ2FpbiB3aGVuIHRoZSBkb2N1bWVudCBpcworICAgICMgICAgICAgICAgIGNvbXBsZXRlbHkgcGFyc2VkLgorICAgICMgICAqc2VsZi5fc3RhdGU9PVNUX0hFUkVET0MKKyAgICAjICAgICAgIC0gVGhlIGhlcmUtZG9jdW1lbnQgaXMgYmVpbmcgZGVsaW1pdGVkIGJ5IHNlbGYuX2hlcmVsZXhlci4gT25jZSBpdCBpcyBkb25lCisgICAgIyAgICAgICAgICAgdGhlIGNvbnRlbnQgaXMgcHVzaGVkIGluIGZyb250IG9mIHRoZSBwZW5kaW5nIHRva2VuIGxpc3QgdGhlbiBhbGwgdGhlc2UKKyAgICAjICAgICAgICAgICB0b2tlbnMgYXJlIHB1c2hlZCBvbmNlIGFnYWluLgorICAgIFNUX05PUk1BTCAgICAgICA9ICdTVF9OT1JNQUwnCisgICAgU1RfT1AgICAgICAgICAgID0gJ1NUX09QJworICAgIFNUX0JBQ0tTTEFTSCAgICA9ICdTVF9CQUNLU0xBU0gnCisgICAgU1RfUVVPVEVEICAgICAgID0gJ1NUX1FVT1RFRCcKKyAgICBTVF9DT01NRU5UICAgICAgPSAnU1RfQ09NTUVOVCcKKyAgICBTVF9IRVJFRE9DICAgICAgPSAnU1RfSEVSRURPQycKKyAgICAKKyAgICAjTWF0Y2ggZW5kIG9mIGJhY2txdW90ZSBzdHJpbmdzCisgICAgUkVfQkFDS1FVT1RFX0VORCA9IHJlLmNvbXBpbGUocicoPzwhXFwpKGApJykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnRfc3RhdGUgPSBOb25lKToKKyAgICAgICAgc2VsZi5faW5wdXQgPSBbXQorICAgICAgICBzZWxmLl9wb3MgPSAwCisgICAgICAgIAorICAgICAgICBzZWxmLl90b2tlbiA9ICcnCisgICAgICAgIHNlbGYuX3R5cGUgPSBUS19UT0tFTgorICAgICAgICAKKyAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX05PUk1BTAorICAgICAgICBzZWxmLl9wYXJlbnRfc3RhdGUgPSBwYXJlbnRfc3RhdGUKKyAgICAgICAgc2VsZi5fd29yZGxleGVyID0gTm9uZQorICAgICAgICAKKyAgICAgICAgc2VsZi5faGVyZWRvYyA9IEhlcmVEb2MoTm9uZSkKKyAgICAgICAgc2VsZi5faGVyZWxleGVyID0gTm9uZQorICAgICAgICAKKyAgICAgICAgIyMjIEZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBub3QgdXNlZCBmb3IgZGVsaW1pdGluZyB0b2tlbiBhbmQgY2FuIHNhZmVseQorICAgICAgICAjIyMgYmUgY2hhbmdlZCBhZnRlciBoZXJlLWRvY3VtZW50IGRldGVjdGlvbiAoc2VlIF9wdXNoX3Rva2UpCisgICAgICAgIAorICAgICAgICAjIENvdW50IHRoZSBudW1iZXIgb2YgdG9rZW5zIGZvbGxvd2luZyBhICdGb3InIHJlc2VydmVkIHdvcmQuIE5lZWRlZCB0bworICAgICAgICAjIHJldHVybiBhbiAnSW4nIHJlc2VydmVkIHdvcmQgaWYgaXQgY29tZXMgaW4gdGhpcmQgcGxhY2UuCisgICAgICAgIHNlbGYuX2Zvcl9jb3VudCA9IE5vbmUKKyAgICAgICAgCisgICAgZGVmIGFkZChzZWxmLCBkYXRhLCBlb2Y9RmFsc2UpOgorICAgICAgICAiIiJGZWVkIHRoZSBsZXhlciB3aXRoIGRhdGEuCisgICAgICAgIAorICAgICAgICBXaGVuIGVvZiBpcyBzZXQgdG8gVHJ1ZSwgcmV0dXJucyB1bmNvbnN1bWVkIGRhdGEgb3IgcmFpc2UgaWYgdGhlIGxleGVyCisgICAgICAgIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBkZWxpbWl0aW5nIG9wZXJhdGlvbi4KKyAgICAgICAgUmFpc2UgTmVlZE1vcmUgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5faW5wdXQgKz0gbGlzdChkYXRhKQorICAgICAgICBzZWxmLl9wYXJzZShlb2YpCisgICAgICAgIHNlbGYuX2lucHV0WzpzZWxmLl9wb3NdID0gW10KKyAgICAgICAgcmV0dXJuICcnLmpvaW4oc2VsZi5faW5wdXQpCisgICAgICAgIAorICAgIGRlZiBfcGFyc2Uoc2VsZiwgZW9mKTogICAgICAgICAgICAKKyAgICAgICAgd2hpbGUgc2VsZi5fc3RhdGU6CisgICAgICAgICAgICBpZiBzZWxmLl9wb3M+PWxlbihzZWxmLl9pbnB1dCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGVvZjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmVlZE1vcmUoKQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5fc3RhdGUgbm90IGluIChzZWxmLlNUX09QLCBzZWxmLlNUX1FVT1RFRCwgc2VsZi5TVF9IRVJFRE9DKToKKyAgICAgICAgICAgICAgICAgICAgI0RlbGltaXQgdGhlIGN1cnJlbnQgdG9rZW4gYW5kIGxlYXZlIGNsZWFubHkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHVzaF90b2tlbignJykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjTGV0IHRoZSBzdWJsZXhlciBoYW5kbGUgdGhlIGVvZiB0aGVtc2VsdmVzCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIHNlbGYuX3N0YXRlPT1zZWxmLlNUX05PUk1BTDoKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZV9ub3JtYWwoKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zdGF0ZT09c2VsZi5TVF9DT01NRU5UOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX2NvbW1lbnQoKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zdGF0ZT09c2VsZi5TVF9PUDoKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZV9vcChlb2YpCisgICAgICAgICAgICBlbGlmIHNlbGYuX3N0YXRlPT1zZWxmLlNUX1FVT1RFRDoKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZV9xdW90ZWQoZW9mKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zdGF0ZT09c2VsZi5TVF9IRVJFRE9DOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX2hlcmVkb2MoZW9mKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJVbmtub3duIHN0YXRlICIgKyBzdHIoc2VsZi5fc3RhdGUpCisgICAgICAgICAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX2hlcmVkb2Mub3AgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBTaGVsbFN5bnRheEVycm9yKCdtaXNzaW5nIGhlcmUtZG9jdW1lbnQgZGVsaW1pdGVyJykKKyAgICAgICAgICAgICAgICAKKyAgICBkZWYgX3BhcnNlX25vcm1hbChzZWxmKToKKyAgICAgICAgYyA9IHNlbGYuX2lucHV0W3NlbGYuX3Bvc10KKyAgICAgICAgaWYgYz09J1xuJzoKKyAgICAgICAgICAgIHNlbGYuX3B1c2hfdG9rZW4oYykKKyAgICAgICAgICAgIHNlbGYuX3Rva2VuID0gYworICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX05FV0xJTkUKKyAgICAgICAgICAgIHNlbGYuX3B1c2hfdG9rZW4oJycpCisgICAgICAgICAgICBzZWxmLl9wb3MgKz0gMQorICAgICAgICBlbGlmIGMgaW4gKCdcXCcsICdcJycsICciJywgJ2AnLCAnJCcpOgorICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBzZWxmLlNUX1FVT1RFRAorICAgICAgICBlbGlmIGlzX3BhcnRpYWxfb3AoYyk6CisgICAgICAgICAgICBzZWxmLl9wdXNoX3Rva2VuKGMpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19PUAorICAgICAgICAgICAgc2VsZi5fdG9rZW4gKz0gYworICAgICAgICAgICAgc2VsZi5fcG9zICs9IDEKKyAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9PUAorICAgICAgICBlbGlmIGlzX2JsYW5rKGMpOgorICAgICAgICAgICAgc2VsZi5fcHVzaF90b2tlbihjKQorICAgICAgICAgICAgCisgICAgICAgICAgICAjRGlzY2FyZCBibGFua3MKKyAgICAgICAgICAgIHNlbGYuX3BvcyArPSAxCisgICAgICAgIGVsaWYgc2VsZi5fdG9rZW46CisgICAgICAgICAgICBzZWxmLl90b2tlbiArPSBjCisgICAgICAgICAgICBzZWxmLl9wb3MgKz0gMQorICAgICAgICBlbGlmIGM9PScjJzoKKyAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9DT01NRU5UCisgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfQ09NTUVOVAorICAgICAgICAgICAgc2VsZi5fcG9zICs9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3BvcyArPSAxCisgICAgICAgICAgICBzZWxmLl90b2tlbiArPSBjICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2Vfb3Aoc2VsZiwgZW9mKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3Rva2VuCisgICAgICAgIAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgc2VsZi5fcG9zPj1sZW4oc2VsZi5faW5wdXQpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBlb2Y6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5lZWRNb3JlKCkKKyAgICAgICAgICAgICAgICBjID0gJycKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGMgPSBzZWxmLl9pbnB1dFtzZWxmLl9wb3NdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBvcCA9IHNlbGYuX3Rva2VuICsgYworICAgICAgICAgICAgaWYgYyBhbmQgaXNfcGFydGlhbF9vcChvcCk6CisgICAgICAgICAgICAgICAgI1N0aWxsIHBhcnNpbmcgYW4gb3BlcmF0b3IKKyAgICAgICAgICAgICAgICBzZWxmLl90b2tlbiA9IG9wCisgICAgICAgICAgICAgICAgc2VsZi5fcG9zICs9IDEKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgI0VuZCBvZiBvcGVyYXRvcgorICAgICAgICAgICAgICAgIHNlbGYuX3B1c2hfdG9rZW4oYykgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9OT1JNQUwKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIAorICAgIGRlZiBfcGFyc2VfY29tbWVudChzZWxmKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGlmIHNlbGYuX3Bvcz49bGVuKHNlbGYuX2lucHV0KToKKyAgICAgICAgICAgICAgICByYWlzZSBOZWVkTW9yZSgpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjID0gc2VsZi5faW5wdXRbc2VsZi5fcG9zXQorICAgICAgICAgICAgaWYgYz09J1xuJzoKKyAgICAgICAgICAgICAgICAjRW5kIG9mIGNvbW1lbnQsIGRvIG5vdCBjb25zdW1lIHRoZSBlbmQgb2YgbGluZQorICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9OT1JNQUwKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl90b2tlbiArPSBjCisgICAgICAgICAgICAgICAgc2VsZi5fcG9zICs9IDEKKyAgICAgICAgICAgICAgICAKKyAgICBkZWYgX3BhcnNlX3F1b3RlZChzZWxmLCBlb2YpOgorICAgICAgICAiIiJQcmVjb25kaXRpb246IHRoZSBzdGFydGluZyBiYWNrcXVvdGUvZG9sbGFyIGlzIHN0aWxsIGluIHRoZSBpbnB1dCBxdWV1ZS4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX3dvcmRsZXhlcjoKKyAgICAgICAgICAgIHNlbGYuX3dvcmRsZXhlciA9IFdvcmRMZXhlcigpCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLl9wb3M8bGVuKHNlbGYuX2lucHV0KToKKyAgICAgICAgICAgICAjVHJhbnNmZXIgaW5wdXQgcXVldWUgY2hhcmFjdGVyIGludG8gdGhlIHN1YnBhcnNlcgorICAgICAgICAgICAgaW5wdXQgPSBzZWxmLl9pbnB1dFtzZWxmLl9wb3M6XQorICAgICAgICAgICAgc2VsZi5fcG9zICs9IGxlbihpbnB1dCkKKyAgICAgICAgICAgIAorICAgICAgICB3dHJlZSwgcmVtYWluaW5nID0gc2VsZi5fd29yZGxleGVyLmFkZChpbnB1dCwgZW9mKQorICAgICAgICBzZWxmLl93b3JkbGV4ZXIgPSBOb25lCisgICAgICAgIHNlbGYuX3Rva2VuICs9IHdvcmR0cmVlX2FzX3N0cmluZyh3dHJlZSkKKyAgICAgICAgCisgICAgICAgICNQdXQgdW5wYXJzZWQgY2hhcmFjdGVyIGJhY2sgaW4gdGhlIGlucHV0IHF1ZXVlCisgICAgICAgIGlmIHJlbWFpbmluZzoKKyAgICAgICAgICAgIHNlbGYuX2lucHV0W3NlbGYuX3BvczpzZWxmLl9wb3NdID0gbGlzdChyZW1haW5pbmcpICAgICAgICAgIAorICAgICAgICBzZWxmLl9zdGF0ZSA9IHNlbGYuU1RfTk9STUFMCisgICAgICAgIAorICAgIGRlZiBfcGFyc2VfaGVyZWRvYyhzZWxmLCBlb2YpOgorICAgICAgICBhc3NlcnQgbm90IHNlbGYuX3Rva2VuCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLl9oZXJlbGV4ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2hlcmVsZXhlciA9IEhlcmVEb2NMZXhlcihzZWxmLl9oZXJlZG9jLm9wLCBzZWxmLl9oZXJlZG9jLm5hbWUpCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLl9wb3M8bGVuKHNlbGYuX2lucHV0KToKKyAgICAgICAgICAgICAjVHJhbnNmZXIgaW5wdXQgcXVldWUgY2hhcmFjdGVyIGludG8gdGhlIHN1YnBhcnNlcgorICAgICAgICAgICAgaW5wdXQgPSBzZWxmLl9pbnB1dFtzZWxmLl9wb3M6XQorICAgICAgICAgICAgc2VsZi5fcG9zICs9IGxlbihpbnB1dCkKKyAgICAgICAgCisgICAgICAgIHNlbGYuX3Rva2VuLCByZW1haW5pbmcgPSBzZWxmLl9oZXJlbGV4ZXIuYWRkKGlucHV0LCBlb2YpCisgICAgICAgIAorICAgICAgICAjUmVzZXQgaGVyZS1kb2N1bWVudCBzdGF0ZQorICAgICAgICBzZWxmLl9oZXJlbGV4ZXIgPSBOb25lCisgICAgICAgIGhlcmVkb2MsIHNlbGYuX2hlcmVkb2MgPSBzZWxmLl9oZXJlZG9jLCBIZXJlRG9jKE5vbmUpCisgICAgICAgIGlmIHJlbWFpbmluZzoKKyAgICAgICAgICAgIHNlbGYuX2lucHV0W3NlbGYuX3BvczpzZWxmLl9wb3NdID0gbGlzdChyZW1haW5pbmcpCisgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9OT1JNQUwKKyAgICAgICAgCisgICAgICAgICNQdXNoIHBlbmRpbmcgdG9rZW5zCisgICAgICAgIGhlcmVkb2MucGVuZGluZ3NbOjBdID0gWyhzZWxmLl90b2tlbiwgc2VsZi5fdHlwZSwgaGVyZWRvYy5uYW1lKV0KKyAgICAgICAgZm9yIHRva2VuLCB0eXBlLCBkZWxpbSBpbiBoZXJlZG9jLnBlbmRpbmdzOgorICAgICAgICAgICAgc2VsZi5fdG9rZW4gPSB0b2tlbgorICAgICAgICAgICAgc2VsZi5fdHlwZSA9IHR5cGUKKyAgICAgICAgICAgIHNlbGYuX3B1c2hfdG9rZW4oZGVsaW0pCisgICAgICAgICAgICAgICAgICAgICAKKyAgICBkZWYgX3B1c2hfdG9rZW4oc2VsZiwgZGVsaW0pOgorICAgICAgICBpZiBub3Qgc2VsZi5fdG9rZW46CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgCisgICAgICAgIGlmIHNlbGYuX2hlcmVkb2Mub3AgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLl9oZXJlZG9jLm5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjSGVyZS1kb2N1bWVudCBuYW1lCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdHlwZSE9VEtfVE9LRU46CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNoZWxsU3ludGF4RXJyb3IoImV4cGVjdGluZyBoZXJlLWRvY3VtZW50IG5hbWUsIGdvdCAnJXMnIiAlIHNlbGYuX3Rva2VuKQorICAgICAgICAgICAgICAgIHNlbGYuX2hlcmVkb2MubmFtZSA9IHVucXVvdGVfd29yZHRyZWUobWFrZV93b3JkdHJlZShzZWxmLl90b2tlbikpCisgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX0hFUkVOQU1FCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNDYXB0dXJlIGFsbCB0b2tlbnMgdW50aWwgdGhlIG5ld2xpbmUgc3RhcnRpbmcgdGhlIGhlcmUtZG9jdW1lbnQKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl90eXBlPT1US19ORVdMSU5FOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGU9PXNlbGYuU1RfTk9STUFMCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gc2VsZi5TVF9IRVJFRE9DICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYuX2hlcmVkb2MucGVuZGluZ3MuYXBwZW5kKChzZWxmLl90b2tlbiwgc2VsZi5fdHlwZSwgZGVsaW0pKSAgICAKKyAgICAgICAgICAgICAgICBzZWxmLl90b2tlbiA9ICcnCisgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX1RPS0VOCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgIyBCRVdBUkU6IGRvIG5vdCBjaGFuZ2UgcGFyc2VyIHN0YXRlIGZyb20gaGVyZSB0byB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbjoKKyAgICAgICAgIyB3aGVuIHBhcnNpbmcgYmV0d2VlbiBhbiBoZXJlLWRvY3VtZW50IG9wZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUKKyAgICAgICAgIyB0b2tlbnMgYXJlIHN0b3JlZCBpbiBzZWxmLl9oZXJlZG9jLnBlbmRpbmdzLiBUaGVyZWZvcmUsIHRoZXkgd2lsbCBub3QKKyAgICAgICAgIyByZWFjaCB0aGUgc2VjdGlvbiBiZWxvdy4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICNDaGVjayBvcGVyYXRvcnMKKyAgICAgICAgaWYgc2VsZi5fdHlwZT09VEtfT1A6CisgICAgICAgICAgICAjRmFsc2UgcG9zaXRpdmUgYmVjYXVzZSBvZiBwYXJ0aWFsIG9wIG1hdGNoaW5nCisgICAgICAgICAgICBvcCA9IGlzX29wKHNlbGYuX3Rva2VuKQorICAgICAgICAgICAgaWYgbm90IG9wOgorICAgICAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19UT0tFTgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjTWFwIHRvIHRoZSBzcGVjaWZpYyBvcGVyYXRvcgorICAgICAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBvcAorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Rva2VuIGluICgnPDwnLCAnPDwtJyk6CisgICAgICAgICAgICAgICAgICAgICNEb25lIGhlcmUgcmF0aGVyIHRoYW4gaW4gX3BhcnNlX29wIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZAorICAgICAgICAgICAgICAgICAgICAjdG8gY2hhbmdlIHRoZSBwYXJzZXIgc3RhdGUgc2luY2Ugd2UgYXJlIHN0aWxsIHdhaXRpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgICN0aGUgaGVyZS1kb2N1bWVudCBuYW1lCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hlcmVkb2Mub3AgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTaGVsbFN5bnRheEVycm9yKCJzeW50YXggZXJyb3IgbmVhciB0b2tlbiAnJXMnIiAlIHNlbGYuX3Rva2VuKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5faGVyZWRvYy5vcCBpcyBOb25lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlcmVkb2Mub3AgPSBzZWxmLl90b2tlbgorICAgICAgICAgICAgICAgIAorICAgICAgICBpZiBzZWxmLl90eXBlPT1US19UT0tFTjogICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICc9JyBpbiBzZWxmLl90b2tlbiBhbmQgbm90IGRlbGltOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Rva2VuLnN0YXJ0c3dpdGgoJz0nKToKKyAgICAgICAgICAgICAgICAgICAgI1Rva2VuIGlzIGEgV09SRC4uLiBhIFRPS0VOIHRoYXQgaXMuCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmV2ID0gc2VsZi5fdG9rZW5bOnNlbGYuX3Rva2VuLmZpbmQoJz0nKV0KKyAgICAgICAgICAgICAgICAgICAgaWYgaXNfbmFtZShwcmV2KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19BU1NJR05NRU5UCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjSnVzdCBhIHRva2VuICh1bnNwZWNpZmllZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgPSBnZXRfcmVzZXJ2ZWQoc2VsZi5fdG9rZW4pCisgICAgICAgICAgICAgICAgaWYgcmVzZXJ2ZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlc2VydmVkPT0nSW4nIGFuZCBzZWxmLl9mb3JfY291bnQhPTI6CisgICAgICAgICAgICAgICAgICAgICAgICAjU29ycnksIG5vdCBhIHJlc2VydmVkIHdvcmQgYWZ0ZXIgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90eXBlID0gcmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlc2VydmVkIGluICgnRm9yJywgJ0Nhc2UnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mb3JfY291bnQgPSAwICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlbGlmIGFyZV9kaWdpdHMoc2VsZi5fdG9rZW4pIGFuZCBkZWxpbSBpbiAoJzwnLCAnPicpOgorICAgICAgICAgICAgICAgICAgICAjRGV0ZWN0IElPX05VTUJFUgorICAgICAgICAgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfSU9OVU1CRVIKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX3Rva2VuPT0nOyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3R5cGUgPSBUS19DT01NQQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5fdG9rZW49PScmJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHlwZSA9IFRLX0FNUEVSU0FORAorICAgICAgICBlbGlmIHNlbGYuX3R5cGU9PVRLX0NPTU1FTlQ6CisgICAgICAgICAgICAjQ29tbWVudHMgYXJlIG5vdCBwYXJ0IG9mIHNoIGdyYW1tYXIsIGlnbm9yZSB0aGVtCisgICAgICAgICAgICBzZWxmLl90b2tlbiA9ICcnCisgICAgICAgICAgICBzZWxmLl90eXBlID0gVEtfVE9LRU4KKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLl9mb3JfY291bnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjVHJhY2sgdG9rZW4gY291bnQgaW4gJ0ZvcicgZXhwcmVzc2lvbiB0byBkZXRlY3QgJ0luJyByZXNlcnZlZCB3b3Jkcy4KKyAgICAgICAgICAgICNDYW4gb25seSBiZSBpbiB0aGlyZCBwb3NpdGlvbiwgbm8gbmVlZCB0byBnbyBiZXlvbmQKKyAgICAgICAgICAgIHNlbGYuX2Zvcl9jb3VudCArPSAxCisgICAgICAgICAgICBpZiBzZWxmLl9mb3JfY291bnQ9PTM6CisgICAgICAgICAgICAgICAgc2VsZi5fZm9yX2NvdW50ID0gTm9uZQorICAgICAgICAgICAgICAgIAorICAgICAgICBzZWxmLm9uX3Rva2VuKChzZWxmLl90b2tlbiwgc2VsZi5fdHlwZSkpCisgICAgICAgIHNlbGYuX3Rva2VuID0gJycKKyAgICAgICAgc2VsZi5fdHlwZSA9IFRLX1RPS0VOCisgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBkZWYgb25fdG9rZW4oc2VsZiwgdG9rZW4pOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgICAgICAgICAgIAorCit0b2tlbnMgPSBbCisgICAgVEtfVE9LRU4sCisjIFRvIHNpbGVuY2UgeWFjYyB1bnVzZWQgdG9rZW4gd2FybmluZ3MKKyMgICAgVEtfQ09NTUVOVCwKKyAgICBUS19ORVdMSU5FLAorICAgIFRLX0lPTlVNQkVSLAorICAgIFRLX0FTU0lHTk1FTlQsCisgICAgVEtfSEVSRU5BTUUsCitdICAgICAgICAgICAgCisKKyNBZGQgc3BlY2lmaWMgb3BlcmF0b3JzCit0b2tlbnMgKz0gX09QRVJBVE9SUy52YWx1ZXMoKQorI0FkZCByZXNlcnZlZCB3b3JkcwordG9rZW5zICs9IF9SRVNFUlZFRFMudmFsdWVzKCkKKyAgICAgICAgICAgIAorY2xhc3MgUExZTGV4ZXIoTGV4ZXIpOgorICAgICIiIkJyaWRnZSBMZXhlciBhbmQgUExZIGxleGVyIGludGVyZmFjZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIExleGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3Rva2VucyA9IFtdCisgICAgICAgIHNlbGYuX2N1cnJlbnQgPSAwCisgICAgICAgIHNlbGYubGluZW5vID0gMAorCisgICAgZGVmIG9uX3Rva2VuKHNlbGYsIHRva2VuKToKKyAgICAgICAgdmFsdWUsIHR5cGUgPSB0b2tlbgorCisgICAgICAgIHNlbGYubGluZW5vID0gMAorICAgICAgICB0ID0gbGV4LkxleFRva2VuKCkKKyAgICAgICAgdC52YWx1ZSA9IHZhbHVlCisgICAgICAgIHQudHlwZSA9IHR5cGUKKyAgICAgICAgdC5sZXhlciA9IHNlbGYKKyAgICAgICAgdC5sZXhwb3MgPSAwCisgICAgICAgIHQubGluZW5vID0gMAorICAgICAgICAKKyAgICAgICAgc2VsZi5fdG9rZW5zLmFwcGVuZCh0KQorICAgICAgICAKKyAgICBkZWYgaXNfZW1wdHkoc2VsZik6CisgICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl90b2tlbnMpCisgICAgICAgIAorICAgICNQTFkgY29tcGxpYW50IGludGVyZmFjZQorICAgIGRlZiB0b2tlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY3VycmVudD49bGVuKHNlbGYuX3Rva2Vucyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0ID0gc2VsZi5fdG9rZW5zW3NlbGYuX2N1cnJlbnRdCisgICAgICAgIHNlbGYuX2N1cnJlbnQgKz0gMQorICAgICAgICByZXR1cm4gdCAgICAgIAorICAgICAgICAKKyAgICAgICAgCitkZWYgZ2V0X3Rva2VucyhzKToKKyAgICAiIiJQYXJzZSB0aGUgaW5wdXQgc3RyaW5nIGFuZCByZXR1cm4gYSB0dXBsZSAodG9rZW5zLCB1bnByb2Nlc3NlZCkgd2hlcmUKKyAgICB0b2tlbnMgaXMgYSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMgYW5kIHVucHJvY2Vzc2VkIGlzIHRoZSBwYXJ0IG9mIHRoZSBpbnB1dAorICAgIHN0cmluZyBsZWZ0IHVudG91Y2hlZCBieSB0aGUgbGV4ZXIuCisgICAgIiIiCisgICAgbGV4ZXIgPSBQTFlMZXhlcigpCisgICAgdW50b3VjaGVkID0gbGV4ZXIuYWRkKHMsIFRydWUpIAorICAgIHRva2VucyA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgdG9rZW4gPSBsZXhlci50b2tlbigpCisgICAgICAgIGlmIHRva2VuIGlzIE5vbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICB0b2tlbnMuYXBwZW5kKHRva2VuKQorICAgICAgICAKKyAgICB0b2tlbnMgPSBbKHQudmFsdWUsIHQudHlwZSkgZm9yIHQgaW4gdG9rZW5zXQorICAgIHJldHVybiB0b2tlbnMsIHVudG91Y2hlZCAgICAgICAgCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9weXNoL3B5c2h5YWNjLnB5IGIvYml0YmFrZS9saWIvYmIvcHlzaC9weXNoeWFjYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGU4MGFhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcHlzaC9weXNoeWFjYy5weQpAQCAtMCwwICsxLDc3OSBAQAorIyBweXNoeWFjYy5weSAtIFBMWSBncmFtbWFyIGRlZmluaXRpb24gZm9yIHB5c2gKKyMKKyMgQ29weXJpZ2h0IDIwMDcgUGF0cmljayBNZXphcmQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisiIiJQTFkgZ3JhbW1hciBmaWxlLgorIiIiCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworCitpbXBvcnQgcHlzaGxleAordG9rZW5zID0gcHlzaGxleC50b2tlbnMKKworZnJvbSBwbHkgaW1wb3J0IHlhY2MKK2ltcG9ydCBzaGVycm9ycworICAgIAorY2xhc3MgSU9SZWRpcmVjdDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3AsIGZpbGVuYW1lLCBpb19udW1iZXI9Tm9uZSk6CisgICAgICAgIHNlbGYub3AgPSBvcAorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5pb19udW1iZXIgPSBpb19udW1iZXIKKyAgICAgICAgCitjbGFzcyBIZXJlRG9jdW1lbnQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wLCBuYW1lLCBjb250ZW50LCBpb19udW1iZXI9Tm9uZSk6CisgICAgICAgIHNlbGYub3AgPSBvcAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKKyAgICAgICAgc2VsZi5pb19udW1iZXIgPSBpb19udW1iZXIKKworZGVmIG1ha2VfaW9fcmVkaXJlY3QocCk6CisgICAgIiIiTWFrZSBhbiBJT1JlZGlyZWN0IGluc3RhbmNlIGZyb20gdGhlIGlucHV0ICdpb19yZWRpcmVjdCcgcHJvZHVjdGlvbi4iIiIKKyAgICBuYW1lLCBpb19udW1iZXIsIGlvX3RhcmdldCA9IHAKKyAgICBhc3NlcnQgbmFtZT09J2lvX3JlZGlyZWN0JworICAgIAorICAgIGlmIGlvX3RhcmdldFswXT09J2lvX2ZpbGUnOgorICAgICAgICBpb190eXBlLCBpb19vcCwgaW9fZmlsZSA9IGlvX3RhcmdldAorICAgICAgICByZXR1cm4gSU9SZWRpcmVjdChpb19vcCwgaW9fZmlsZSwgaW9fbnVtYmVyKQorICAgIGVsaWYgaW9fdGFyZ2V0WzBdPT0naW9faGVyZSc6CisgICAgICAgIGlvX3R5cGUsIGlvX29wLCBpb19uYW1lLCBpb19jb250ZW50ID0gaW9fdGFyZ2V0CisgICAgICAgIHJldHVybiBIZXJlRG9jdW1lbnQoaW9fb3AsIGlvX25hbWUsIGlvX2NvbnRlbnQsIGlvX251bWJlcikKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgRmFsc2UsICJJbnZhbGlkIElPIHJlZGlyZWN0aW9uIHRva2VuICVzIiAlIHJlcHIoaW9fdHlwZSkKKyAgICAgICAgCitjbGFzcyBTaW1wbGVDb21tYW5kOgorICAgICIiIgorICAgIGFzc2lnbnMgY29udGFpbnMgKG5hbWUsIHZhbHVlKSBwYWlycy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd29yZHMsIHJlZGlycywgYXNzaWducyk6CisgICAgICAgIHNlbGYud29yZHMgPSBsaXN0KHdvcmRzKQorICAgICAgICBzZWxmLnJlZGlycyA9IGxpc3QocmVkaXJzKQorICAgICAgICBzZWxmLmFzc2lnbnMgPSBsaXN0KGFzc2lnbnMpCisKK2NsYXNzIFBpcGVsaW5lOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kcywgcmV2ZXJzZV9zdGF0dXM9RmFsc2UpOgorICAgICAgICBzZWxmLmNvbW1hbmRzID0gbGlzdChjb21tYW5kcykKKyAgICAgICAgYXNzZXJ0IHNlbGYuY29tbWFuZHMgICAgI0dyYW1tYXIgZm9yYmlkcyB0aGlzCisgICAgICAgIHNlbGYucmV2ZXJzZV9zdGF0dXMgPSByZXZlcnNlX3N0YXR1cworICAgICAgICAKK2NsYXNzIEFuZE9yOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcCwgbGVmdCwgcmlnaHQpOgorICAgICAgICBzZWxmLm9wID0gc3RyKG9wKQorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0CisgICAgICAgIHNlbGYucmlnaHQgPSByaWdodAorICAgICAgICAKK2NsYXNzIEZvckxvb3A6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGl0ZW1zLCBjbWRzKToKKyAgICAgICAgc2VsZi5uYW1lID0gc3RyKG5hbWUpCisgICAgICAgIHNlbGYuaXRlbXMgPSBsaXN0KGl0ZW1zKQorICAgICAgICBzZWxmLmNtZHMgPSBsaXN0KGNtZHMpCisgICAgICAgIAorY2xhc3MgV2hpbGVMb29wOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25kaXRpb24sIGNtZHMpOgorICAgICAgICBzZWxmLmNvbmRpdGlvbiA9IGxpc3QoY29uZGl0aW9uKQorICAgICAgICBzZWxmLmNtZHMgPSBsaXN0KGNtZHMpCisgICAgICAgIAorY2xhc3MgVW50aWxMb29wOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25kaXRpb24sIGNtZHMpOgorICAgICAgICBzZWxmLmNvbmRpdGlvbiA9IGxpc3QoY29uZGl0aW9uKQorICAgICAgICBzZWxmLmNtZHMgPSBsaXN0KGNtZHMpCisKK2NsYXNzIEZ1bkRlZjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYm9keSk6CisgICAgICAgIHNlbGYubmFtZSA9IHN0cihuYW1lKQorICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisgICAgICAgIAorY2xhc3MgQnJhY2VHcm91cDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY21kcyk6CisgICAgICAgIHNlbGYuY21kcyA9IGxpc3QoY21kcykKKyAgICAgICAgCitjbGFzcyBJZkNvbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmQsIGlmX2NtZHMsIGVsc2VfY21kcyk6CisgICAgICAgIHNlbGYuY29uZCA9IGxpc3QoY29uZCkKKyAgICAgICAgc2VsZi5pZl9jbWRzID0gaWZfY21kcworICAgICAgICBzZWxmLmVsc2VfY21kcyA9IGVsc2VfY21kcworCitjbGFzcyBDYXNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBpdGVtcyk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5pdGVtcyA9IGl0ZW1zCisgICAgICAgIAorY2xhc3MgU3ViU2hlbGw6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNtZHMpOgorICAgICAgICBzZWxmLmNtZHMgPSBjbWRzCisKK2NsYXNzIFJlZGlyZWN0TGlzdDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY21kLCByZWRpcnMpOgorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgICAgICBzZWxmLnJlZGlycyA9IGxpc3QocmVkaXJzKQorICAgICAgICAKK2RlZiBnZXRfcHJvZHVjdGlvbihwcm9kdWN0aW9ucywgcHR5cGUpOgorICAgICIiInByb2R1Y3Rpb25zIG11c3QgYmUgYSBsaXN0IG9mIHByb2R1Y3Rpb24gdHVwbGVzIGxpa2UgKG5hbWUsIG9iaikgd2hlcmUKKyAgICBuYW1lIGlzIHRoZSBwcm9kdWN0aW9uIHN0cmluZyBpZGVudGlmaWVyLgorICAgIFJldHVybiB0aGUgZmlyc3QgcHJvZHVjdGlvbiBuYW1lZCAncHR5cGUnLiBSYWlzZSBLZXlFcnJvciBpZiBOb25lIGNhbiBiZQorICAgIGZvdW5kLgorICAgICIiIgorICAgIGZvciBwcm9kdWN0aW9uIGluIHByb2R1Y3Rpb25zOgorICAgICAgICBpZiBwcm9kdWN0aW9uIGlzIG5vdCBOb25lIGFuZCBwcm9kdWN0aW9uWzBdPT1wdHlwZToKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWN0aW9uCisgICAgcmFpc2UgS2V5RXJyb3IocHR5cGUpCisgICAgCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQTFkgZ3JhbW1hciBkZWZpbml0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgcF9tdWx0aXBsZV9jb21tYW5kcyhwKToKKyAgICAiIiJtdWx0aXBsZV9jb21tYW5kcyA6IG5ld2xpbmVfc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbXBsZXRlX2NvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IG11bHRpcGxlX2NvbW1hbmRzIGNvbXBsZXRlX2NvbW1hbmQiIiIKKyAgICBpZiBsZW4ocCk9PTI6CisgICAgICAgIGlmIHBbMV0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwWzBdID0gW3BbMV1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwWzBdID0gW10KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gcFsxXSArIFtwWzJdXQorCitkZWYgcF9jb21wbGV0ZV9jb21tYW5kKHApOgorICAgICIiImNvbXBsZXRlX2NvbW1hbmQgOiBsaXN0IHNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgfCBsaXN0IiIiCisgICAgaWYgbGVuKHApPT0zIGFuZCBwWzJdIGFuZCBwWzJdWzFdID09ICcmJzoKKyAgICAgICAgcFswXSA9ICgnYXN5bmMnLCBwWzFdKQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBwWzFdCisgICAgICAgICAgICAgICAgIAorZGVmIHBfbGlzdChwKToKKyAgICAiIiJsaXN0IDogbGlzdCBzZXBhcmF0b3Jfb3AgYW5kX29yCisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIGFuZF9vciIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgcFswXSA9IFtwWzFdXQorICAgIGVsc2U6CisgICAgICAgICNpZiBwWzJdIT0nOyc6CisgICAgICAgICMgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignQU5ELU9SIGxpc3QgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbiBpcyBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICBwWzBdID0gcFsxXSArIFtwWzNdXQorICAgICAgIAorZGVmIHBfYW5kX29yKHApOgorICAgICIiImFuZF9vciA6IHBpcGVsaW5lCisgICAgICAgICAgICAgIHwgYW5kX29yIEFORF9JRiBsaW5lYnJlYWsgcGlwZWxpbmUKKyAgICAgICAgICAgICAgfCBhbmRfb3IgT1JfSUYgIGxpbmVicmVhayBwaXBlbGluZSIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgcFswXSA9IHBbMV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gKCdhbmRfb3InLCBBbmRPcihwWzJdLCBwWzFdLCBwWzRdKSkKKyAgICAgICAgCitkZWYgcF9tYXliZV9iYW5nX3dvcmQocCk6CisgICAgIiIibWF5YmVfYmFuZ193b3JkIDogQmFuZyIiIgorICAgIHBbMF0gPSAoJ21heWJlX2Jhbmdfd29yZCcsIHBbMV0pCisgICAgICAgICAgICAKK2RlZiBwX3BpcGVsaW5lKHApOgorICAgICIiInBpcGVsaW5lIDogcGlwZV9zZXF1ZW5jZQorICAgICAgICAgICAgICAgIHwgYmFuZ193b3JkIHBpcGVfc2VxdWVuY2UiIiIKKyAgICBpZiBsZW4ocCk9PTM6CisgICAgICAgIHBbMF0gPSAoJ3BpcGVsaW5lJywgUGlwZWxpbmUocFsyXVsxOl0sIFRydWUpKQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSAoJ3BpcGVsaW5lJywgUGlwZWxpbmUocFsxXVsxOl0pKQorCitkZWYgcF9waXBlX3NlcXVlbmNlKHApOgorICAgICIiInBpcGVfc2VxdWVuY2UgOiBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICB8IHBpcGVfc2VxdWVuY2UgUElQRSBsaW5lYnJlYWsgY29tbWFuZCIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgcFswXSA9IFsncGlwZV9zZXF1ZW5jZScsIHBbMV1dCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0gKyBbcFs0XV0KKworZGVmIHBfY29tbWFuZChwKToKKyAgICAiIiJjb21tYW5kIDogc2ltcGxlX2NvbW1hbmQKKyAgICAgICAgICAgICAgIHwgY29tcG91bmRfY29tbWFuZAorICAgICAgICAgICAgICAgfCBjb21wb3VuZF9jb21tYW5kIHJlZGlyZWN0X2xpc3QKKyAgICAgICAgICAgICAgIHwgZnVuY3Rpb25fZGVmaW5pdGlvbiIiIgorICAgICAgICAKKyAgICBpZiBwWzFdWzBdIGluICggJ3NpbXBsZV9jb21tYW5kJywgCisgICAgICAgICAgICAgICAgICAgICdmb3JfY2xhdXNlJywKKyAgICAgICAgICAgICAgICAgICAgJ3doaWxlX2NsYXVzZScsCisgICAgICAgICAgICAgICAgICAgICd1bnRpbF9jbGF1c2UnLAorICAgICAgICAgICAgICAgICAgICAnY2FzZV9jbGF1c2UnLAorICAgICAgICAgICAgICAgICAgICAnaWZfY2xhdXNlJywKKyAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uX2RlZmluaXRpb24nLAorICAgICAgICAgICAgICAgICAgICAnc3Vic2hlbGwnLAorICAgICAgICAgICAgICAgICAgICAnYnJhY2VfZ3JvdXAnLCk6CisgICAgICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICAgICAgcFswXSA9IHBbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBbMF0gPSAoJ3JlZGlyZWN0X2xpc3QnLCBSZWRpcmVjdExpc3QocFsxXSwgcFsyXVsxOl0pKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJyVzIGNvbW1hbmQgaXMgbm90IGltcGxlbWVudGVkJyAlIHJlcHIocFsxXVswXSkpCisKK2RlZiBwX2NvbXBvdW5kX2NvbW1hbmQocCk6CisgICAgIiIiY29tcG91bmRfY29tbWFuZCA6IGJyYWNlX2dyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICB8IHN1YnNoZWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8IGZvcl9jbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgY2FzZV9jbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgaWZfY2xhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX2NsYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgfCB1bnRpbF9jbGF1c2UiIiIKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9zdWJzaGVsbChwKToKKyAgICAiIiJzdWJzaGVsbCA6IExQQVJFTlMgY29tcG91bmRfbGlzdCBSUEFSRU5TIiIiCisgICAgcFswXSA9ICgnc3Vic2hlbGwnLCBTdWJTaGVsbChwWzJdWzE6XSkpCisKK2RlZiBwX2NvbXBvdW5kX2xpc3QocCk6CisgICAgIiIiY29tcG91bmRfbGlzdCA6IHRlcm0KKyAgICAgICAgICAgICAgICAgICAgIHwgbmV3bGluZV9saXN0IHRlcm0KKyAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHRlcm0gc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICB8IG5ld2xpbmVfbGlzdCB0ZXJtIHNlcGFyYXRvciIiIgorICAgIHByb2R1Y3Rpb25zID0gcFsxOl0gICAgICAgICAgIAorICAgIHRyeToKKyAgICAgICAgc2VwID0gZ2V0X3Byb2R1Y3Rpb24ocHJvZHVjdGlvbnMsICdzZXBhcmF0b3InKQorICAgICAgICBpZiBzZXBbMV0hPSc7JzoKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHRlcm0gPSBnZXRfcHJvZHVjdGlvbihwcm9kdWN0aW9ucywgJ3Rlcm0nKQorICAgIHBbMF0gPSBbJ2NvbXBvdW5kX2xpc3QnXSArIHRlcm1bMTpdCisKK2RlZiBwX3Rlcm0ocCk6CisgICAgIiIidGVybSA6IHRlcm0gc2VwYXJhdG9yIGFuZF9vcgorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICBhbmRfb3IiIiIKKyAgICBpZiBsZW4ocCk9PTI6CisgICAgICAgIHBbMF0gPSBbJ3Rlcm0nLCBwWzFdXQorICAgIGVsc2U6CisgICAgICAgIGlmIHBbMl0gaXMgbm90IE5vbmUgYW5kIHBbMl1bMV0gPT0gJyYnOgorICAgICAgICAgICAgcFswXSA9IFsndGVybScsICgnYXN5bmMnLCBwWzFdWzE6XSldICsgW3BbM11dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwWzBdID0gcFsxXSArIFtwWzNdXQorICAgICAgICAgICAgCitkZWYgcF9tYXliZV9mb3Jfd29yZChwKToKKyAgICAjIFJlYXJyYW5nZSAnRm9yJyBwcmlvcml0eSB3cnQgVE9LRU4uIFNlZSBwX2Zvcl93b3JkCisgICAgIiIibWF5YmVfZm9yX3dvcmQgOiBGb3IiIiIKKyAgICBwWzBdID0gKCdtYXliZV9mb3Jfd29yZCcsIHBbMV0pCisKK2RlZiBwX2Zvcl9jbGF1c2UocCk6CisgICAgIiIiZm9yX2NsYXVzZSA6IGZvcl93b3JkIG5hbWUgbGluZWJyZWFrICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2dyb3VwCisgICAgICAgICAgICAgICAgICB8IGZvcl93b3JkIG5hbWUgbGluZWJyZWFrIGluICAgICAgICAgIHNlcXVlbnRpYWxfc2VwIGRvX2dyb3VwCisgICAgICAgICAgICAgICAgICB8IGZvcl93b3JkIG5hbWUgbGluZWJyZWFrIGluIHdvcmRsaXN0IHNlcXVlbnRpYWxfc2VwIGRvX2dyb3VwIiIiCisgICAgcHJvZHVjdGlvbnMgPSBwWzE6XQorICAgIGRvX2dyb3VwID0gZ2V0X3Byb2R1Y3Rpb24ocHJvZHVjdGlvbnMsICdkb19ncm91cCcpCisgICAgdHJ5OgorICAgICAgICBpdGVtcyA9IGdldF9wcm9kdWN0aW9uKHByb2R1Y3Rpb25zLCAnaW4nKVsxOl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJyJpbiIgb21pc3Npb24gaXMgbm90IGltcGxlbWVudGVkJykKKyAgICAgICAgCisgICAgdHJ5OgorICAgICAgICBpdGVtcyA9IGdldF9wcm9kdWN0aW9uKHByb2R1Y3Rpb25zLCAnd29yZGxpc3QnKVsxOl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgCisgICAgbmFtZSA9IHBbMl0KKyAgICBwWzBdID0gKCdmb3JfY2xhdXNlJywgRm9yTG9vcChuYW1lLCBpdGVtcywgZG9fZ3JvdXBbMTpdKSkKKworZGVmIHBfbmFtZShwKToKKyAgICAiIiJuYW1lIDogdG9rZW4iIiIgI1dhcyBOQU1FIGluc3RlYWQgb2YgdG9rZW4KKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9pbihwKToKKyAgICAiIiJpbiA6IEluIiIiCisgICAgcFswXSA9ICgnaW4nLCBwWzFdKQorCitkZWYgcF93b3JkbGlzdChwKToKKyAgICAiIiJ3b3JkbGlzdCA6IHdvcmRsaXN0IHRva2VuCisgICAgICAgICAgICAgICAgfCAgICAgICAgICB0b2tlbiIiIgorICAgIGlmIGxlbihwKT09MjoKKyAgICAgICAgcFswXSA9IFsnd29yZGxpc3QnLCAoJ1RPS0VOJywgcFsxXSldCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0gKyBbKCdUT0tFTicsIHBbMl0pXQorCitkZWYgcF9jYXNlX2NsYXVzZShwKToKKyAgICAiIiJjYXNlX2NsYXVzZSA6IENhc2UgdG9rZW4gbGluZWJyZWFrIGluIGxpbmVicmVhayBjYXNlX2xpc3QgICAgRXNhYworICAgICAgICAgICAgICAgICAgIHwgQ2FzZSB0b2tlbiBsaW5lYnJlYWsgaW4gbGluZWJyZWFrIGNhc2VfbGlzdF9ucyBFc2FjCisgICAgICAgICAgICAgICAgICAgfCBDYXNlIHRva2VuIGxpbmVicmVhayBpbiBsaW5lYnJlYWsgICAgICAgICAgICAgIEVzYWMiIiIKKyAgICBpZiBsZW4ocCkgPCA4OgorICAgICAgICBpdGVtcyA9IFtdCisgICAgZWxzZToKKyAgICAgICAgaXRlbXMgPSBwWzZdWzE6XQorICAgIG5hbWUgPSBwWzJdCisgICAgcFswXSA9ICgnY2FzZV9jbGF1c2UnLCBDYXNlKG5hbWUsIFtjWzFdIGZvciBjIGluIGl0ZW1zXSkpCisgICAgICAgCitkZWYgcF9jYXNlX2xpc3RfbnMocCk6CisgICAgIiIiY2FzZV9saXN0X25zIDogY2FzZV9saXN0IGNhc2VfaXRlbV9ucworICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBjYXNlX2l0ZW1fbnMiIiIKKyAgICBwX2Nhc2VfbGlzdChwKQorICAgICAgCitkZWYgcF9jYXNlX2xpc3QocCk6CisgICAgIiIiY2FzZV9saXN0IDogY2FzZV9saXN0IGNhc2VfaXRlbQorICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBjYXNlX2l0ZW0iIiIKKyAgICBpZiBsZW4ocCk9PTI6CisgICAgICAgIHBbMF0gPSBbJ2Nhc2VfbGlzdCcsIHBbMV1dCisgICAgZWxzZToKKyAgICAgICAgcFswXSA9IHBbMV0gKyBbcFsyXV0KKyAgICAgICAgCitkZWYgcF9jYXNlX2l0ZW1fbnMocCk6CisgICAgIiIiY2FzZV9pdGVtX25zIDogICAgICAgICBwYXR0ZXJuIFJQQVJFTlMgICAgICAgICAgICAgICBsaW5lYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHBhdHRlcm4gUlBBUkVOUyBjb21wb3VuZF9saXN0IGxpbmVicmVhaworICAgICAgICAgICAgICAgICAgICB8IExQQVJFTlMgcGF0dGVybiBSUEFSRU5TICAgICAgICAgICAgICAgbGluZWJyZWFrCisgICAgICAgICAgICAgICAgICAgIHwgTFBBUkVOUyBwYXR0ZXJuIFJQQVJFTlMgY29tcG91bmRfbGlzdCBsaW5lYnJlYWsiIiIKKyAgICBwX2Nhc2VfaXRlbShwKQorICAgICAgICAgICAgICAgICAKK2RlZiBwX2Nhc2VfaXRlbShwKToKKyAgICAiIiJjYXNlX2l0ZW0gOiAgICAgICAgIHBhdHRlcm4gUlBBUkVOUyBsaW5lYnJlYWsgICAgIERTRU1JIGxpbmVicmVhaworICAgICAgICAgICAgICAgICB8ICAgICAgICAgcGF0dGVybiBSUEFSRU5TIGNvbXBvdW5kX2xpc3QgRFNFTUkgbGluZWJyZWFrCisgICAgICAgICAgICAgICAgIHwgTFBBUkVOUyBwYXR0ZXJuIFJQQVJFTlMgbGluZWJyZWFrICAgICBEU0VNSSBsaW5lYnJlYWsKKyAgICAgICAgICAgICAgICAgfCBMUEFSRU5TIHBhdHRlcm4gUlBBUkVOUyBjb21wb3VuZF9saXN0IERTRU1JIGxpbmVicmVhayIiIgorICAgIGlmIGxlbihwKSA8IDc6CisgICAgICAgIG5hbWUgPSBwWzFdWzE6XQorICAgIGVsc2U6CisgICAgICAgIG5hbWUgPSBwWzJdWzE6XQorCisgICAgdHJ5OgorICAgICAgICBjbWRzID0gZ2V0X3Byb2R1Y3Rpb24ocFsxOl0sICJjb21wb3VuZF9saXN0IilbMTpdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBjbWRzID0gW10KKworICAgIHBbMF0gPSAoJ2Nhc2VfaXRlbScsIChuYW1lLCBjbWRzKSkKKyAgICAgICAgICAgICAgICAgCitkZWYgcF9wYXR0ZXJuKHApOgorICAgICIiInBhdHRlcm4gOiAgICAgICAgICAgICAgdG9rZW4KKyAgICAgICAgICAgICAgIHwgcGF0dGVybiBQSVBFIHRva2VuIiIiCisgICAgaWYgbGVuKHApPT0yOgorICAgICAgICBwWzBdID0gWydwYXR0ZXJuJywgKCdUT0tFTicsIHBbMV0pXQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSBwWzFdICsgWygnVE9LRU4nLCBwWzJdKV0KKworZGVmIHBfbWF5YmVfaWZfd29yZChwKToKKyAgICAjIFJlYXJyYW5nZSAnSWYnIHByaW9yaXR5IHdydCBUT0tFTi4gU2VlIHBfaWZfd29yZAorICAgICIiIm1heWJlX2lmX3dvcmQgOiBJZiIiIgorICAgIHBbMF0gPSAoJ21heWJlX2lmX3dvcmQnLCBwWzFdKQorCitkZWYgcF9tYXliZV90aGVuX3dvcmQocCk6CisgICAgIyBSZWFycmFuZ2UgJ1RoZW4nIHByaW9yaXR5IHdydCBUT0tFTi4gU2VlIHBfdGhlbl93b3JkCisgICAgIiIibWF5YmVfdGhlbl93b3JkIDogVGhlbiIiIgorICAgIHBbMF0gPSAoJ21heWJlX3RoZW5fd29yZCcsIHBbMV0pCisgICAgICAgICAgICAgICAgIAorZGVmIHBfaWZfY2xhdXNlKHApOgorICAgICIiImlmX2NsYXVzZSA6IGlmX3dvcmQgY29tcG91bmRfbGlzdCB0aGVuX3dvcmQgY29tcG91bmRfbGlzdCBlbHNlX3BhcnQgRmkKKyAgICAgICAgICAgICAgICAgfCBpZl93b3JkIGNvbXBvdW5kX2xpc3QgdGhlbl93b3JkIGNvbXBvdW5kX2xpc3QgICAgICAgICAgIEZpIiIiCisgICAgZWxzZV9wYXJ0ID0gW10KKyAgICBpZiBsZW4ocCk9PTc6CisgICAgICAgIGVsc2VfcGFydCA9IHBbNV0KKyAgICBwWzBdID0gKCdpZl9jbGF1c2UnLCBJZkNvbmQocFsyXVsxOl0sIHBbNF1bMTpdLCBlbHNlX3BhcnQpKQorICAgICAgICAgICAgICAgICAKK2RlZiBwX2Vsc2VfcGFydChwKToKKyAgICAiIiJlbHNlX3BhcnQgOiBFbGlmIGNvbXBvdW5kX2xpc3QgdGhlbl93b3JkIGNvbXBvdW5kX2xpc3QgZWxzZV9wYXJ0CisgICAgICAgICAgICAgICAgIHwgRWxpZiBjb21wb3VuZF9saXN0IHRoZW5fd29yZCBjb21wb3VuZF9saXN0CisgICAgICAgICAgICAgICAgIHwgRWxzZSBjb21wb3VuZF9saXN0IiIiCisgICAgaWYgbGVuKHApPT0zOgorICAgICAgICBwWzBdID0gcFsyXVsxOl0KKyAgICBlbHNlOgorICAgICAgICBlbHNlX3BhcnQgPSBbXQorICAgICAgICBpZiBsZW4ocCk9PTY6CisgICAgICAgICAgICBlbHNlX3BhcnQgPSBwWzVdCisgICAgICAgIHBbMF0gPSAoJ2VsaWYnLCBJZkNvbmQocFsyXVsxOl0sIHBbNF1bMTpdLCBlbHNlX3BhcnQpKQorICAgICAgICAgICAgICAgICAKK2RlZiBwX3doaWxlX2NsYXVzZShwKToKKyAgICAiIiJ3aGlsZV9jbGF1c2UgOiBXaGlsZSBjb21wb3VuZF9saXN0IGRvX2dyb3VwIiIiCisgICAgcFswXSA9ICgnd2hpbGVfY2xhdXNlJywgV2hpbGVMb29wKHBbMl1bMTpdLCBwWzNdWzE6XSkpCisgICAgCitkZWYgcF9tYXliZV91bnRpbF93b3JkKHApOgorICAgICMgUmVhcnJhbmdlICdVbnRpbCcgcHJpb3JpdHkgd3J0IFRPS0VOLiBTZWUgcF91bnRpbF93b3JkCisgICAgIiIibWF5YmVfdW50aWxfd29yZCA6IFVudGlsIiIiCisgICAgcFswXSA9ICgnbWF5YmVfdW50aWxfd29yZCcsIHBbMV0pCisgICAgICAgICAgIAorZGVmIHBfdW50aWxfY2xhdXNlKHApOgorICAgICIiInVudGlsX2NsYXVzZSA6IHVudGlsX3dvcmQgY29tcG91bmRfbGlzdCBkb19ncm91cCIiIgorICAgIHBbMF0gPSAoJ3VudGlsX2NsYXVzZScsIFVudGlsTG9vcChwWzJdWzE6XSwgcFszXVsxOl0pKQorICAgICAgICAgICAgICAgICAKK2RlZiBwX2Z1bmN0aW9uX2RlZmluaXRpb24ocCk6CisgICAgIiIiZnVuY3Rpb25fZGVmaW5pdGlvbiA6IGZuYW1lIExQQVJFTlMgUlBBUkVOUyBsaW5lYnJlYWsgZnVuY3Rpb25fYm9keSIiIgorICAgIHBbMF0gPSAoJ2Z1bmN0aW9uX2RlZmluaXRpb24nLCBGdW5EZWYocFsxXSwgcFs1XSkpCisgICAgICAgICAgICAgICAgIAorZGVmIHBfZnVuY3Rpb25fYm9keShwKToKKyAgICAiIiJmdW5jdGlvbl9ib2R5IDogY29tcG91bmRfY29tbWFuZAorICAgICAgICAgICAgICAgICAgICAgfCBjb21wb3VuZF9jb21tYW5kIHJlZGlyZWN0X2xpc3QiIiIKKyAgICBpZiBsZW4ocCkhPTI6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ2Z1bmN0aW9ucyByZWRpcmVjdGlvbnMgbGlzdHMgYXJlIG5vdCBpbXBsZW1lbnRlZCcpICAgIAorICAgIHBbMF0gPSBwWzFdICAgIAorCitkZWYgcF9mbmFtZShwKToKKyAgICAiIiJmbmFtZSA6IFRPS0VOIiIiICNXYXMgTkFNRSBpbnN0ZWFkIG9mIHRva2VuCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfYnJhY2VfZ3JvdXAocCk6CisgICAgIiIiYnJhY2VfZ3JvdXAgOiBMYnJhY2UgY29tcG91bmRfbGlzdCBSYnJhY2UiIiIKKyAgICBwWzBdID0gKCdicmFjZV9ncm91cCcsIEJyYWNlR3JvdXAocFsyXVsxOl0pKQorCitkZWYgcF9tYXliZV9kb25lX3dvcmQocCk6CisgICAgI1NlZSBwX2Fzc2lnbm1lbnRfd29yZCBmb3IgZGV0YWlscy4KKyAgICAiIiJtYXliZV9kb25lX3dvcmQgOiBEb25lIiIiCisgICAgcFswXSA9ICgnbWF5YmVfZG9uZV93b3JkJywgcFsxXSkKKworZGVmIHBfbWF5YmVfZG9fd29yZChwKToKKyAgICAiIiJtYXliZV9kb193b3JkIDogRG8iIiIKKyAgICBwWzBdID0gKCdtYXliZV9kb193b3JkJywgcFsxXSkKKworZGVmIHBfZG9fZ3JvdXAocCk6CisgICAgIiIiZG9fZ3JvdXAgOiBkb193b3JkIGNvbXBvdW5kX2xpc3QgZG9uZV93b3JkIiIiCisgICAgI0RvIGdyb3VwIGNvbnRhaW5zIGEgbGlzdCBvZiBBbmRPcgorICAgIHBbMF0gPSBbJ2RvX2dyb3VwJ10gKyBwWzJdWzE6XQorCitkZWYgcF9zaW1wbGVfY29tbWFuZChwKToKKyAgICAiIiJzaW1wbGVfY29tbWFuZCA6IGNtZF9wcmVmaXggY21kX3dvcmQgY21kX3N1ZmZpeAorICAgICAgICAgICAgICAgICAgICAgIHwgY21kX3ByZWZpeCBjbWRfd29yZAorICAgICAgICAgICAgICAgICAgICAgIHwgY21kX3ByZWZpeAorICAgICAgICAgICAgICAgICAgICAgIHwgY21kX25hbWUgY21kX3N1ZmZpeAorICAgICAgICAgICAgICAgICAgICAgIHwgY21kX25hbWUiIiIKKyAgICB3b3JkcywgcmVkaXJzLCBhc3NpZ25zID0gW10sIFtdLCBbXQorICAgIGZvciBlIGluIHBbMTpdOgorICAgICAgICBuYW1lID0gZVswXQorICAgICAgICBpZiBuYW1lIGluICgnY21kX3ByZWZpeCcsICdjbWRfc3VmZml4Jyk6CisgICAgICAgICAgICBmb3Igc3ViZSBpbiBlWzE6XToKKyAgICAgICAgICAgICAgICBzdWJuYW1lID0gc3ViZVswXQorICAgICAgICAgICAgICAgIGlmIHN1Ym5hbWU9PSdpb19yZWRpcmVjdCc6CisgICAgICAgICAgICAgICAgICAgIHJlZGlycy5hcHBlbmQobWFrZV9pb19yZWRpcmVjdChzdWJlKSkKKyAgICAgICAgICAgICAgICBlbGlmIHN1Ym5hbWU9PSdBU1NJR05NRU5UX1dPUkQnOgorICAgICAgICAgICAgICAgICAgICBhc3NpZ25zLmFwcGVuZChzdWJlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdvcmRzLmFwcGVuZChzdWJlKQorICAgICAgICBlbGlmIG5hbWUgaW4gKCdjbWRfd29yZCcsICdjbWRfbmFtZScpOgorICAgICAgICAgICAgd29yZHMuYXBwZW5kKGUpCisgICAgICAgICAgICAKKyAgICBjbWQgPSBTaW1wbGVDb21tYW5kKHdvcmRzLCByZWRpcnMsIGFzc2lnbnMpCisgICAgcFswXSA9ICgnc2ltcGxlX2NvbW1hbmQnLCBjbWQpCisKK2RlZiBwX2NtZF9uYW1lKHApOgorICAgICIiImNtZF9uYW1lIDogVE9LRU4iIiIKKyAgICBwWzBdID0gKCdjbWRfbmFtZScsIHBbMV0pCisgICAgCitkZWYgcF9jbWRfd29yZChwKToKKyAgICAiIiJjbWRfd29yZCA6IHRva2VuIiIiCisgICAgcFswXSA9ICgnY21kX3dvcmQnLCBwWzFdKQorCitkZWYgcF9tYXliZV9hc3NpZ25tZW50X3dvcmQocCk6CisgICAgI1NlZSBwX2Fzc2lnbm1lbnRfd29yZCBmb3IgZGV0YWlscy4KKyAgICAiIiJtYXliZV9hc3NpZ25tZW50X3dvcmQgOiBBU1NJR05NRU5UX1dPUkQiIiIKKyAgICBwWzBdID0gKCdtYXliZV9hc3NpZ25tZW50X3dvcmQnLCBwWzFdKQorICAgIAorZGVmIHBfY21kX3ByZWZpeChwKToKKyAgICAiIiJjbWRfcHJlZml4IDogICAgICAgICAgICBpb19yZWRpcmVjdAorICAgICAgICAgICAgICAgICAgfCBjbWRfcHJlZml4IGlvX3JlZGlyZWN0CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgYXNzaWdubWVudF93b3JkCisgICAgICAgICAgICAgICAgICB8IGNtZF9wcmVmaXggYXNzaWdubWVudF93b3JkIiIiCisgICAgdHJ5OgorICAgICAgICBwcmVmaXggPSBnZXRfcHJvZHVjdGlvbihwWzE6XSwgJ2NtZF9wcmVmaXgnKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcHJlZml4ID0gWydjbWRfcHJlZml4J10KKyAgICAgICAgCisgICAgdHJ5OgorICAgICAgICB2YWx1ZSA9IGdldF9wcm9kdWN0aW9uKHBbMTpdLCAnYXNzaWdubWVudF93b3JkJylbMV0KKyAgICAgICAgdmFsdWUgPSAoJ0FTU0lHTk1FTlRfV09SRCcsIHZhbHVlLnNwbGl0KCc9JywgMSkpCisgICAgZXhjZXB0IEtleUVycm9yOiAgICAgICAgCisgICAgICAgIHZhbHVlID0gZ2V0X3Byb2R1Y3Rpb24ocFsxOl0sICdpb19yZWRpcmVjdCcpCisgICAgcFswXSA9IHByZWZpeCArIFt2YWx1ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2RlZiBwX2NtZF9zdWZmaXgocCk6CisgICAgIiIiY21kX3N1ZmZpeCAgIDogICAgICAgICAgICBpb19yZWRpcmVjdAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggaW9fcmVkaXJlY3QKKyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHRva2VuCisgICAgICAgICAgICAgICAgICAgIHwgY21kX3N1ZmZpeCB0b2tlbgorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgbWF5YmVfZm9yX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCBjbWRfc3VmZml4IG1heWJlX2Zvcl93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBtYXliZV9kb25lX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCBjbWRfc3VmZml4IG1heWJlX2RvbmVfd29yZAorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgbWF5YmVfZG9fd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfZG9fd29yZAorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgbWF5YmVfdW50aWxfd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfdW50aWxfd29yZAorICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgbWF5YmVfYXNzaWdubWVudF93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgY21kX3N1ZmZpeCBtYXliZV9hc3NpZ25tZW50X3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIG1heWJlX2lmX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCBjbWRfc3VmZml4IG1heWJlX2lmX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIG1heWJlX3RoZW5fd29yZAorICAgICAgICAgICAgICAgICAgICB8IGNtZF9zdWZmaXggbWF5YmVfdGhlbl93b3JkCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICBtYXliZV9iYW5nX3dvcmQKKyAgICAgICAgICAgICAgICAgICAgfCBjbWRfc3VmZml4IG1heWJlX2Jhbmdfd29yZCIiIgorICAgIHRyeToKKyAgICAgICAgc3VmZml4ID0gZ2V0X3Byb2R1Y3Rpb24ocFsxOl0sICdjbWRfc3VmZml4JykKKyAgICAgICAgdG9rZW4gPSBwWzJdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBzdWZmaXggPSBbJ2NtZF9zdWZmaXgnXQorICAgICAgICB0b2tlbiA9IHBbMV0KKyAgICAgICAgCisgICAgaWYgaXNpbnN0YW5jZSh0b2tlbiwgdHVwbGUpOgorICAgICAgICBpZiB0b2tlblswXT09J2lvX3JlZGlyZWN0JzoKKyAgICAgICAgICAgIHBbMF0gPSBzdWZmaXggKyBbdG9rZW5dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjQ29udmVydCBtYXliZV8qICB0byBUT0tFTiBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIHBbMF0gPSBzdWZmaXggKyBbKCdUT0tFTicsIHRva2VuWzFdKV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gc3VmZml4ICsgWygnVE9LRU4nLCB0b2tlbildCisgICAgICAgICAgICAgICAgIAorZGVmIHBfcmVkaXJlY3RfbGlzdChwKToKKyAgICAiIiJyZWRpcmVjdF9saXN0IDogaW9fcmVkaXJlY3QKKyAgICAgICAgICAgICAgICAgICAgIHwgcmVkaXJlY3RfbGlzdCBpb19yZWRpcmVjdCIiIgorICAgIGlmIGxlbihwKSA9PSAyOgorICAgICAgICBwWzBdID0gWydyZWRpcmVjdF9saXN0JywgbWFrZV9pb19yZWRpcmVjdChwWzFdKV0KKyAgICBlbHNlOgorICAgICAgICBwWzBdID0gcFsxXSArIFttYWtlX2lvX3JlZGlyZWN0KHBbMl0pXQorICAgIAorZGVmIHBfaW9fcmVkaXJlY3QocCk6CisgICAgIiIiaW9fcmVkaXJlY3QgOiAgICAgICAgICAgaW9fZmlsZQorICAgICAgICAgICAgICAgICAgIHwgSU9fTlVNQkVSIGlvX2ZpbGUKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBpb19oZXJlCisgICAgICAgICAgICAgICAgICAgfCBJT19OVU1CRVIgaW9faGVyZSIiIgorICAgIGlmIGxlbihwKT09MzoKKyAgICAgICAgcFswXSA9ICgnaW9fcmVkaXJlY3QnLCBwWzFdLCBwWzJdKQorICAgIGVsc2U6CisgICAgICAgIHBbMF0gPSAoJ2lvX3JlZGlyZWN0JywgTm9uZSwgcFsxXSkKKyAgICAKK2RlZiBwX2lvX2ZpbGUocCk6CisgICAgI1JldHVybiB0aGUgdHVwbGUgKG9wZXJhdG9yLCBmaWxlbmFtZSkKKyAgICAiIiJpb19maWxlIDogTEVTUyAgICAgIGZpbGVuYW1lCisgICAgICAgICAgICAgICB8IExFU1NBTkQgICBmaWxlbmFtZQorICAgICAgICAgICAgICAgfCBHUkVBVEVSICAgZmlsZW5hbWUKKyAgICAgICAgICAgICAgIHwgR1JFQVRBTkQgIGZpbGVuYW1lCisgICAgICAgICAgICAgICB8IERHUkVBVCAgICBmaWxlbmFtZQorICAgICAgICAgICAgICAgfCBMRVNTR1JFQVQgZmlsZW5hbWUKKyAgICAgICAgICAgICAgIHwgQ0xPQkJFUiAgIGZpbGVuYW1lIiIiCisgICAgI0V4dHJhY3QgdGhlIGZpbGVuYW1lIGZyb20gdGhlIGZpbGUKKyAgICBwWzBdID0gKCdpb19maWxlJywgcFsxXSwgcFsyXVsxXSkKKworZGVmIHBfZmlsZW5hbWUocCk6CisgICAgI1JldHVybiB0aGUgZmlsZW5hbWUKKyAgICAiIiJmaWxlbmFtZSA6IFRPS0VOIiIiCisgICAgcFswXSA9ICgnZmlsZW5hbWUnLCBwWzFdKQorICAgICAgICAKK2RlZiBwX2lvX2hlcmUocCk6CisgICAgIiIiaW9faGVyZSA6IERMRVNTIGhlcmVfZW5kCisgICAgICAgICAgICAgICB8IERMRVNTREFTSCBoZXJlX2VuZCIiIgorICAgIHBbMF0gPSAoJ2lvX2hlcmUnLCBwWzFdLCBwWzJdWzFdLCBwWzJdWzJdKQorCitkZWYgcF9oZXJlX2VuZChwKToKKyAgICAiIiJoZXJlX2VuZCA6IEhFUkVOQU1FIFRPS0VOIiIiCisgICAgcFswXSA9ICgnaGVyZV9kb2N1bWVudCcsIHBbMV0sIHBbMl0pCisgICAgCitkZWYgcF9uZXdsaW5lX3NlcXVlbmNlKHApOgorICAgICMgTm90aGluZyBpbiB0aGUgZ3JhbW1hciBjYW4gaGFuZGxlIGxlYWRpbmcgTkVXTElORSBwcm9kdWN0aW9ucywgc28gYWRkCisgICAgIyB0aGlzIG9uZSB3aXRoIHRoZSBsb3dlc3QgcG9zc2libGUgcHJpb3JpdHkgcmVsYXRpdmVseSB0byBuZXdsaW5lX2xpc3QuCisgICAgIiIibmV3bGluZV9zZXF1ZW5jZSA6IG5ld2xpbmVfbGlzdCIiIgorICAgIHBbMF0gPSBOb25lCisgICAgCitkZWYgcF9uZXdsaW5lX2xpc3QocCk6CisgICAgIiIibmV3bGluZV9saXN0IDogTkVXTElORQorICAgICAgICAgICAgICAgICAgICB8IG5ld2xpbmVfbGlzdCBORVdMSU5FIiIiCisgICAgcFswXSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgCitkZWYgcF9saW5lYnJlYWsocCk6CisgICAgIiIibGluZWJyZWFrIDogbmV3bGluZV9saXN0CisgICAgICAgICAgICAgICAgIHwgZW1wdHkiIiIKKyAgICBwWzBdID0gTm9uZQorCitkZWYgcF9zZXBhcmF0b3Jfb3AocCk6ICAgICAgICAgICAgICAgICAKKyAgICAiIiJzZXBhcmF0b3Jfb3AgOiBDT01NQQorICAgICAgICAgICAgICAgICAgICB8IEFNUCIiIgorICAgIHBbMF0gPSBwWzFdCisKK2RlZiBwX3NlcGFyYXRvcihwKToKKyAgICAiIiJzZXBhcmF0b3IgOiBzZXBhcmF0b3Jfb3AgbGluZWJyZWFrCisgICAgICAgICAgICAgICAgIHwgbmV3bGluZV9saXN0IiIiCisgICAgaWYgbGVuKHApPT0yOgorICAgICAgICAjSWdub3JlIG5ld2xpbmVzCisgICAgICAgIHBbMF0gPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgI0tlZXAgdGhlIHNlcGFyYXRvciBvcGVyYXRvcgorICAgICAgICBwWzBdID0gKCdzZXBhcmF0b3InLCBwWzFdKQorICAgICAgICAgICAgICAgICAKK2RlZiBwX3NlcXVlbnRpYWxfc2VwKHApOgorICAgICIiInNlcXVlbnRpYWxfc2VwIDogQ09NTUEgbGluZWJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgfCBuZXdsaW5lX2xpc3QiIiIKKyAgICBwWzBdID0gTm9uZQorCisjIExvdyBwcmlvcml0eSBUT0tFTiA9PiBmb3Jfd29yZCBjb252ZXJzaW9uLgorIyBMZXQgbWF5YmVfZm9yX3dvcmQgYmUgdXNlZCBhcyBhIHRva2VuIHdoZW4gbmVjZXNzYXJ5IGluIGhpZ2hlciBwcmlvcml0eQorIyBydWxlcy4gCitkZWYgcF9mb3Jfd29yZChwKToKKyAgICAiIiJmb3Jfd29yZCA6IG1heWJlX2Zvcl93b3JkIiIiCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfaWZfd29yZChwKToKKyAgICAiIiJpZl93b3JkIDogbWF5YmVfaWZfd29yZCIiIgorICAgIHBbMF0gPSBwWzFdCisKK2RlZiBwX3RoZW5fd29yZChwKToKKyAgICAiIiJ0aGVuX3dvcmQgOiBtYXliZV90aGVuX3dvcmQiIiIKKyAgICBwWzBdID0gcFsxXQorCitkZWYgcF9kb25lX3dvcmQocCk6CisgICAgIiIiZG9uZV93b3JkIDogbWF5YmVfZG9uZV93b3JkIiIiCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfZG9fd29yZChwKToKKyAgICAiIiJkb193b3JkIDogbWF5YmVfZG9fd29yZCIiIgorICAgIHBbMF0gPSBwWzFdCisgICAgCitkZWYgcF91bnRpbF93b3JkKHApOgorICAgICIiInVudGlsX3dvcmQgOiBtYXliZV91bnRpbF93b3JkIiIiCisgICAgcFswXSA9IHBbMV0KKyAgICAKK2RlZiBwX2Fzc2lnbm1lbnRfd29yZChwKToKKyAgICAiIiJhc3NpZ25tZW50X3dvcmQgOiBtYXliZV9hc3NpZ25tZW50X3dvcmQiIiIKKyAgICBwWzBdID0gKCdhc3NpZ25tZW50X3dvcmQnLCBwWzFdWzFdKQorICAgIAorZGVmIHBfYmFuZ193b3JkKHApOgorICAgICIiImJhbmdfd29yZCA6IG1heWJlX2Jhbmdfd29yZCIiIgorICAgIHBbMF0gPSAoJ2Jhbmdfd29yZCcsIHBbMV1bMV0pCisKK2RlZiBwX3Rva2VuKHApOgorICAgICIiInRva2VuIDogVE9LRU4KKyAgICAgICAgICAgICB8IEZpIiIiCisgICAgcFswXSA9IHBbMV0KKworZGVmIHBfZW1wdHkocCk6CisgICAgJ2VtcHR5IDonCisgICAgcFswXSA9IE5vbmUKKyAgICAKKyMgRXJyb3IgcnVsZSBmb3Igc3ludGF4IGVycm9ycworZGVmIHBfZXJyb3IocCk6CisgICAgbXNnID0gW10KKyAgICB3ID0gbXNnLmFwcGVuZAorICAgIHcoJyVyXG4nICUgcCkKKyAgICB3KCdmb2xsb3dlZCBieTpcbicpCisgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgIG4gPSB5YWNjLnRva2VuKCkKKyAgICAgICAgaWYgbm90IG46CisgICAgICAgICAgICBicmVhaworICAgICAgICB3KCcgICVyXG4nICUgbikKKyAgICByYWlzZSBzaGVycm9ycy5TaGVsbFN5bnRheEVycm9yKCcnLmpvaW4obXNnKSkKKworIyBCdWlsZCB0aGUgcGFyc2VyCit0cnk6CisgICAgaW1wb3J0IHB5c2h0YWJsZXMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBvdXRwdXRkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgaWYgbm90IG9zLmFjY2VzcyhvdXRwdXRkaXIsIG9zLldfT0spOgorICAgICAgICBvdXRwdXRkaXIgPSAnJworICAgIHlhY2MueWFjYyh0YWJtb2R1bGUgPSAncHlzaHRhYmxlcycsIG91dHB1dGRpciA9IG91dHB1dGRpciwgZGVidWcgPSAwKQorZWxzZToKKyAgICB5YWNjLnlhY2ModGFibW9kdWxlID0gJ3B5c2gucHlzaHRhYmxlcycsIHdyaXRlX3RhYmxlcyA9IDAsIGRlYnVnID0gMCkKKworCitkZWYgcGFyc2UoaW5wdXQsIGVvZj1GYWxzZSwgZGVidWc9RmFsc2UpOgorICAgICIiIlBhcnNlIGEgd2hvbGUgc2NyaXB0IGF0IG9uY2UgYW5kIHJldHVybiB0aGUgZ2VuZXJhdGVkIEFTVCBhbmQgdW5jb25zdW1lZAorICAgIGRhdGEgaW4gYSB0dXBsZS4KKyAgICAKKyAgICBOT1RFOiBlb2YgaXMgcHJvYmFibHkgbWVhbmluZ2xlc3MgZm9yIG5vdywgdGhlIHBhcnNlciBiZWluZyB1bmFibGUgdG8gd29yaworICAgIGluIHB1bGwgbW9kZS4gSXQgc2hvdWxkIGJlIHNldCB0byBUcnVlLgorICAgICIiIgorICAgIGxleGVyID0gcHlzaGxleC5QTFlMZXhlcigpCisgICAgcmVtYWluaW5nID0gbGV4ZXIuYWRkKGlucHV0LCBlb2YpCisgICAgaWYgbGV4ZXIuaXNfZW1wdHkoKToKKyAgICAgICAgcmV0dXJuIFtdLCByZW1haW5pbmcKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgZGVidWcgPSAyCisgICAgcmV0dXJuIHlhY2MucGFyc2UobGV4ZXI9bGV4ZXIsIGRlYnVnPWRlYnVnKSwgcmVtYWluaW5nCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFTVCByZW5kZXJpbmcgaGVscGVycworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisKK2RlZiBmb3JtYXRfY29tbWFuZHModik6CisgICAgIiIiUmV0dXJuIGEgdHJlZSBtYWRlIG9mIHN0cmluZ3MgYW5kIGxpc3RzLiBNYWtlIGNvbW1hbmQgdHJlZXMgZWFzaWVyIHRvCisgICAgZGlzcGxheS4KKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKHYsIGxpc3QpOgorICAgICAgICByZXR1cm4gW2Zvcm1hdF9jb21tYW5kcyhjKSBmb3IgYyBpbiB2XQorICAgIGlmIGlzaW5zdGFuY2UodiwgdHVwbGUpOgorICAgICAgICBpZiBsZW4odik9PTIgYW5kIGlzaW5zdGFuY2UodlswXSwgc3RyKSBhbmQgbm90IGlzaW5zdGFuY2UodlsxXSwgc3RyKToKKyAgICAgICAgICAgIGlmIHZbMF0gPT0gJ2FzeW5jJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gWydBc3luY0xpc3QnLCBtYXAoZm9ybWF0X2NvbW1hbmRzLCB2WzFdKV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgI0F2b2lkIGRlY29tcG9zaW5nIHR1cGxlcyBsaWtlICgncGlwZWxpbmUnLCBQaXBlbGluZSguLi4pKQorICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRfY29tbWFuZHModlsxXSkKKyAgICAgICAgcmV0dXJuIGZvcm1hdF9jb21tYW5kcyhsaXN0KHYpKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBJZkNvbmQpOgorICAgICAgICBuYW1lID0gWydJZkNvbmQnXQorICAgICAgICBuYW1lICs9IFsnaWYnLCBtYXAoZm9ybWF0X2NvbW1hbmRzLCB2LmNvbmQpXQorICAgICAgICBuYW1lICs9IFsndGhlbicsIG1hcChmb3JtYXRfY29tbWFuZHMsIHYuaWZfY21kcyldCisgICAgICAgIG5hbWUgKz0gWydlbHNlJywgbWFwKGZvcm1hdF9jb21tYW5kcywgdi5lbHNlX2NtZHMpXQorICAgICAgICByZXR1cm4gbmFtZQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBGb3JMb29wKToKKyAgICAgICAgbmFtZSA9IFsnRm9yTG9vcCddCisgICAgICAgIG5hbWUgKz0gW3JlcHIodi5uYW1lKSsnIGluICcsIG1hcChzdHIsIHYuaXRlbXMpXQorICAgICAgICBuYW1lICs9IFsnY29tbWFuZHMnLCBtYXAoZm9ybWF0X2NvbW1hbmRzLCB2LmNtZHMpXQorICAgICAgICByZXR1cm4gbmFtZQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBBbmRPcik6CisgICAgICAgIHJldHVybiBbdi5vcCwgZm9ybWF0X2NvbW1hbmRzKHYubGVmdCksIGZvcm1hdF9jb21tYW5kcyh2LnJpZ2h0KV0KKyAgICBlbGlmIGlzaW5zdGFuY2UodiwgUGlwZWxpbmUpOgorICAgICAgICBuYW1lID0gJ1BpcGVsaW5lJworICAgICAgICBpZiB2LnJldmVyc2Vfc3RhdHVzOgorICAgICAgICAgICAgbmFtZSA9ICchJyArIG5hbWUKKyAgICAgICAgcmV0dXJuIFtuYW1lLCBmb3JtYXRfY29tbWFuZHModi5jb21tYW5kcyldCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIENhc2UpOgorICAgICAgICBuYW1lID0gWydDYXNlJ10KKyAgICAgICAgbmFtZSArPSBbdi5uYW1lLCBmb3JtYXRfY29tbWFuZHModi5pdGVtcyldCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIFNpbXBsZUNvbW1hbmQpOgorICAgICAgICBuYW1lID0gWydTaW1wbGVDb21tYW5kJ10KKyAgICAgICAgaWYgdi53b3JkczogICAgICAgICAgICAgICAgCisgICAgICAgICAgICBuYW1lICs9IFsnd29yZHMnLCBtYXAoc3RyLCB2LndvcmRzKV0KKyAgICAgICAgaWYgdi5hc3NpZ25zOgorICAgICAgICAgICAgYXNzaWducyA9IFt0dXBsZShhWzFdKSBmb3IgYSBpbiB2LmFzc2lnbnNdCisgICAgICAgICAgICBuYW1lICs9IFsnYXNzaWducycsIG1hcChzdHIsIGFzc2lnbnMpXQorICAgICAgICBpZiB2LnJlZGlyczoKKyAgICAgICAgICAgIG5hbWUgKz0gWydyZWRpcnMnLCBtYXAoZm9ybWF0X2NvbW1hbmRzLCB2LnJlZGlycyldCisgICAgICAgIHJldHVybiBuYW1lCisgICAgZWxpZiBpc2luc3RhbmNlKHYsIFJlZGlyZWN0TGlzdCk6CisgICAgICAgIG5hbWUgPSBbJ1JlZGlyZWN0TGlzdCddCisgICAgICAgIGlmIHYucmVkaXJzOgorICAgICAgICAgICAgbmFtZSArPSBbJ3JlZGlycycsIG1hcChmb3JtYXRfY29tbWFuZHMsIHYucmVkaXJzKV0KKyAgICAgICAgbmFtZSArPSBbJ2NvbW1hbmQnLCBmb3JtYXRfY29tbWFuZHModi5jbWQpXQorICAgICAgICByZXR1cm4gbmFtZQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBJT1JlZGlyZWN0KToKKyAgICAgICAgcmV0dXJuICcgJy5qb2luKG1hcChzdHIsICh2LmlvX251bWJlciwgdi5vcCwgdi5maWxlbmFtZSkpKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBIZXJlRG9jdW1lbnQpOgorICAgICAgICByZXR1cm4gJyAnLmpvaW4obWFwKHN0ciwgKHYuaW9fbnVtYmVyLCB2Lm9wLCByZXByKHYubmFtZSksIHJlcHIodi5jb250ZW50KSkpKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBTdWJTaGVsbCk6CisgICAgICAgIHJldHVybiBbJ1N1YlNoZWxsJywgbWFwKGZvcm1hdF9jb21tYW5kcywgdi5jbWRzKV0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcmVwcih2KQorICAgICAgICAgICAgIAorZGVmIHByaW50X2NvbW1hbmRzKGNtZHMsIG91dHB1dD1zeXMuc3Rkb3V0KToKKyAgICAiIiJQcmV0dHkgcHJpbnQgYSBjb21tYW5kIHRyZWUuIiIiCisgICAgZGVmIHByaW50X3RyZWUoY21kLCBzcGFjZXMsIG91dHB1dCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY21kLCBsaXN0KToKKyAgICAgICAgICAgIGZvciBjIGluIGNtZDoKKyAgICAgICAgICAgICAgICBwcmludF90cmVlKGMsIHNwYWNlcyArIDMsIG91dHB1dCkgICAgICAgICAgICAgIAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5vdXRwdXQsICcgJypzcGFjZXMgKyBzdHIoY21kKQorICAgIAorICAgIGZvcm1hdHRlZCA9IGZvcm1hdF9jb21tYW5kcyhjbWRzKQorICAgIHByaW50X3RyZWUoZm9ybWF0dGVkLCAwLCBvdXRwdXQpCisgICAgCisgICAgCitkZWYgc3RyaW5naWZ5X2NvbW1hbmRzKGNtZHMpOiAKKyAgICAiIiJTZXJpYWxpemUgYSBjb21tYW5kIHRyZWUgYXMgYSBzdHJpbmcuCisgICAgCisgICAgUmV0dXJuZWQgc3RyaW5nIGlzIG5vdCBwcmV0dHkgYW5kIGlzIGN1cnJlbnRseSB1c2VkIGZvciB1bml0IHRlc3RzIG9ubHkuCisgICAgIiIiICAgCisgICAgZGVmIHN0cmluZ2lmeSh2YWx1ZSk6CisgICAgICAgIG91dHB1dCA9IFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgZm9ybWF0dGVkID0gW10KKyAgICAgICAgICAgIGZvciB2IGluIHZhbHVlOgorICAgICAgICAgICAgICAgIGZvcm1hdHRlZC5hcHBlbmQoc3RyaW5naWZ5KHYpKQorICAgICAgICAgICAgZm9ybWF0dGVkID0gJyAnLmpvaW4oZm9ybWF0dGVkKQorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgnJy5qb2luKFsnPCcsIGZvcm1hdHRlZCwgJz4nXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHZhbHVlKQorICAgICAgICByZXR1cm4gJyAnLmpvaW4ob3V0cHV0KQorICAgICAgICAgICAgCisgICAgcmV0dXJuIHN0cmluZ2lmeShmb3JtYXRfY29tbWFuZHMoY21kcykpCisgICAgCisgICAgICAgIAorZGVmIHZpc2l0X2NvbW1hbmRzKGNtZHMsIGNhbGxhYmxlKToKKyAgICAiIiJWaXNpdCB0aGUgY29tbWFuZCB0cmVlIGFuZCBleGVjdXRlIGNhbGxhYmxlIG9uIGV2ZXJ5IFBpcGVsaW5lIGFuZCAKKyAgICBTaW1wbGVDb21tYW5kIGluc3RhbmNlcy4KKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKGNtZHMsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICBtYXAobGFtYmRhIGM6IHZpc2l0X2NvbW1hbmRzKGMsY2FsbGFibGUpLCBjbWRzKQorICAgIGVsaWYgaXNpbnN0YW5jZShjbWRzLCAoUGlwZWxpbmUsIFNpbXBsZUNvbW1hbmQpKToKKyAgICAgICAgY2FsbGFibGUoY21kcykKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvc2hlcnJvcnMucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3NoZXJyb3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDA1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3NoZXJyb3JzLnB5CkBAIC0wLDAgKzEsNDEgQEAKKyMgc2hlcnJvcnMucHkgLSBzaGVsbCBlcnJvcnMgYW5kIHNpZ25hbHMKKyMKKyMgQ29weXJpZ2h0IDIwMDcgUGF0cmljayBNZXphcmQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisiIiJEZWZpbmUgc2hlbGwgZXhjZXB0aW9ucyBhbmQgZXJyb3IgY29kZXMuCisiIiIKKworY2xhc3MgU2hlbGxFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgU2hlbGxTeW50YXhFcnJvcihTaGVsbEVycm9yKToKKyAgICBwYXNzCisgICAgCitjbGFzcyBVdGlsaXR5RXJyb3IoU2hlbGxFcnJvcik6CisgICAgIiIiUmFpc2VkIHVwb24gdXRpbGl0eSBzeW50YXggZXJyb3IgKG9wdGlvbiBvciBvcGVyYW5kIGVycm9yKS4iIiIKKyAgICBwYXNzCisgICAKK2NsYXNzIEV4cGFuc2lvbkVycm9yKFNoZWxsRXJyb3IpOgorICAgIHBhc3MKKyAgICAgCitjbGFzcyBDb21tYW5kTm90Rm91bmQoU2hlbGxFcnJvcik6CisgICAgIiIiU3BlY2lmaWVkIGNvbW1hbmQgd2FzIG5vdCBmb3VuZC4iIiIKKyAgICBwYXNzCisgICAgCitjbGFzcyBSZWRpcmVjdGlvbkVycm9yKFNoZWxsRXJyb3IpOgorICAgIHBhc3MKKyAgICAKK2NsYXNzIFZhckFzc2lnbm1lbnRFcnJvcihTaGVsbEVycm9yKToKKyAgICAiIiJWYXJpYWJsZSBhc3NpZ25tZW50IGVycm9yLiIiIgorICAgIHBhc3MKKyAgICAKK2NsYXNzIEV4aXRTaWduYWwoU2hlbGxFcnJvcik6CisgICAgIiIiRXhpdCBzaWduYWwuIiIiCisgICAgcGFzcworICAgIAorY2xhc3MgUmV0dXJuU2lnbmFsKFNoZWxsRXJyb3IpOgorICAgICIiIkV4aXQgc2lnbmFsLiIiIgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3B5c2gvc3VicHJvY2Vzc19maXgucHkgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3N1YnByb2Nlc3NfZml4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWNhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9weXNoL3N1YnByb2Nlc3NfZml4LnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgc3VicHJvY2VzcyAtIFN1YnByb2Nlc3NlcyB3aXRoIGFjY2Vzc2libGUgSS9PIHN0cmVhbXMKKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtb2R1bGUsIHNlZSBQRVAgMzI0LgorIworIyBUaGlzIG1vZHVsZSBzaG91bGQgcmVtYWluIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4yLCBzZWUgUEVQIDI5MS4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgYnkgUGV0ZXIgQXN0cmFuZCA8YXN0cmFuZEBseXNhdG9yLmxpdS5zZT4KKyMKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuNC9saWNlbnNlIGZvciBsaWNlbnNpbmcgZGV0YWlscy4KKworZGVmIGxpc3QyY21kbGluZShzZXEpOgorICAgICIiIgorICAgIFRyYW5zbGF0ZSBhIHNlcXVlbmNlIG9mIGFyZ3VtZW50cyBpbnRvIGEgY29tbWFuZCBsaW5lCisgICAgc3RyaW5nLCB1c2luZyB0aGUgc2FtZSBydWxlcyBhcyB0aGUgTVMgQyBydW50aW1lOgorCisgICAgMSkgQXJndW1lbnRzIGFyZSBkZWxpbWl0ZWQgYnkgd2hpdGUgc3BhY2UsIHdoaWNoIGlzIGVpdGhlciBhCisgICAgICAgc3BhY2Ugb3IgYSB0YWIuCisKKyAgICAyKSBBIHN0cmluZyBzdXJyb3VuZGVkIGJ5IGRvdWJsZSBxdW90YXRpb24gbWFya3MgaXMKKyAgICAgICBpbnRlcnByZXRlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCwgcmVnYXJkbGVzcyBvZiB3aGl0ZSBzcGFjZQorICAgICAgIGNvbnRhaW5lZCB3aXRoaW4uICBBIHF1b3RlZCBzdHJpbmcgY2FuIGJlIGVtYmVkZGVkIGluIGFuCisgICAgICAgYXJndW1lbnQuCisKKyAgICAzKSBBIGRvdWJsZSBxdW90YXRpb24gbWFyayBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaCBpcworICAgICAgIGludGVycHJldGVkIGFzIGEgbGl0ZXJhbCBkb3VibGUgcXVvdGF0aW9uIG1hcmsuCisKKyAgICA0KSBCYWNrc2xhc2hlcyBhcmUgaW50ZXJwcmV0ZWQgbGl0ZXJhbGx5LCB1bmxlc3MgdGhleQorICAgICAgIGltbWVkaWF0ZWx5IHByZWNlZGUgYSBkb3VibGUgcXVvdGF0aW9uIG1hcmsuCisKKyAgICA1KSBJZiBiYWNrc2xhc2hlcyBpbW1lZGlhdGVseSBwcmVjZWRlIGEgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAorICAgICAgIGV2ZXJ5IHBhaXIgb2YgYmFja3NsYXNoZXMgaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaXRlcmFsCisgICAgICAgYmFja3NsYXNoLiAgSWYgdGhlIG51bWJlciBvZiBiYWNrc2xhc2hlcyBpcyBvZGQsIHRoZSBsYXN0CisgICAgICAgYmFja3NsYXNoIGVzY2FwZXMgdGhlIG5leHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrIGFzCisgICAgICAgZGVzY3JpYmVkIGluIHJ1bGUgMy4KKyAgICAiIiIKKworICAgICMgU2VlCisgICAgIyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvdmNjZWxuZy9odG0vcHJvZ3NfMTIuYXNwCisgICAgcmVzdWx0ID0gW10KKyAgICBuZWVkcXVvdGUgPSBGYWxzZQorICAgIGZvciBhcmcgaW4gc2VxOgorICAgICAgICBic19idWYgPSBbXQorCisgICAgICAgICMgQWRkIGEgc3BhY2UgdG8gc2VwYXJhdGUgdGhpcyBhcmd1bWVudCBmcm9tIHRoZSBvdGhlcnMKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpCisKKyAgICAgICAgbmVlZHF1b3RlID0gKCIgIiBpbiBhcmcpIG9yICgiXHQiIGluIGFyZykgb3IgKCJ8IiBpbiBhcmcpIG9yIGFyZyA9PSAiIgorICAgICAgICBpZiBuZWVkcXVvdGU6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCciJykKKworICAgICAgICBmb3IgYyBpbiBhcmc6CisgICAgICAgICAgICBpZiBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgIyBEb24ndCBrbm93IGlmIHdlIG5lZWQgdG8gZG91YmxlIHlldC4KKyAgICAgICAgICAgICAgICBic19idWYuYXBwZW5kKGMpCisgICAgICAgICAgICBlbGlmIGMgPT0gJyInOgorICAgICAgICAgICAgICAgICMgRG91YmxlIGJhY2tzcGFjZXMuCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXFwnICogbGVuKGJzX2J1ZikqMikKKyAgICAgICAgICAgICAgICBic19idWYgPSBbXQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xcIicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm9ybWFsIGNoYXIKKyAgICAgICAgICAgICAgICBpZiBic19idWY6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoYnNfYnVmKQorICAgICAgICAgICAgICAgICAgICBic19idWYgPSBbXQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYykKKworICAgICAgICAjIEFkZCByZW1haW5pbmcgYmFja3NwYWNlcywgaWYgYW55LgorICAgICAgICBpZiBic19idWY6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKworICAgICAgICBpZiBuZWVkcXVvdGU6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyInKQorICAgICAgICAgICAgCisgICAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvcnVucXVldWUucHkgYi9iaXRiYWtlL2xpYi9iYi9ydW5xdWV1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjcxZWVkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvcnVucXVldWUucHkKQEAgLTAsMCArMSwyMTk1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgJ1J1blF1ZXVlJyBpbXBsZW1lbnRhdGlvbgorCitIYW5kbGVzIHByZXBhcmF0aW9uIGFuZCBleGVjdXRpb24gb2YgYSBxdWV1ZSBvZiB0YXNrcworIiIiCisKKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgY29weQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3RhdAoraW1wb3J0IGZjbnRsCitpbXBvcnQgZXJybm8KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgcmUKK2ltcG9ydCBiYgorZnJvbSBiYiBpbXBvcnQgbXNnLCBkYXRhLCBldmVudAorZnJvbSBiYiBpbXBvcnQgbW9uaXRvcmRpc2sKK2ltcG9ydCBzdWJwcm9jZXNzCisKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgcGlja2xlCisKK2JibG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UuUnVuUXVldWUiKQorCitfX2ZpbmRfbWQ1X18gPSByZS5jb21waWxlKCByJyg/aSkoPzwhW2EtejAtOV0pW2EtZjAtOV17MzJ9KD8hW2EtejAtOV0pJyApCisKK2NsYXNzIFJ1blF1ZXVlU3RhdHM6CisgICAgIiIiCisgICAgSG9sZHMgc3RhdGlzdGljcyBvbiB0aGUgdGFza3MgaGFuZGxlZCBieSB0aGUgYXNzb2NpYXRlZCBydW5RdWV1ZQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3RhbCk6CisgICAgICAgIHNlbGYuY29tcGxldGVkID0gMAorICAgICAgICBzZWxmLnNraXBwZWQgPSAwCisgICAgICAgIHNlbGYuZmFpbGVkID0gMAorICAgICAgICBzZWxmLmFjdGl2ZSA9IDAKKyAgICAgICAgc2VsZi50b3RhbCA9IHRvdGFsCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fX2NsYXNzX18oc2VsZi50b3RhbCkKKyAgICAgICAgb2JqLl9fZGljdF9fLnVwZGF0ZShzZWxmLl9fZGljdF9fKQorICAgICAgICByZXR1cm4gb2JqCisKKyAgICBkZWYgdGFza0ZhaWxlZChzZWxmKToKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBzZWxmLmFjdGl2ZSAtIDEKKyAgICAgICAgc2VsZi5mYWlsZWQgPSBzZWxmLmZhaWxlZCArIDEKKworICAgIGRlZiB0YXNrQ29tcGxldGVkKHNlbGYsIG51bWJlciA9IDEpOgorICAgICAgICBzZWxmLmFjdGl2ZSA9IHNlbGYuYWN0aXZlIC0gbnVtYmVyCisgICAgICAgIHNlbGYuY29tcGxldGVkID0gc2VsZi5jb21wbGV0ZWQgKyBudW1iZXIKKworICAgIGRlZiB0YXNrU2tpcHBlZChzZWxmLCBudW1iZXIgPSAxKToKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBzZWxmLmFjdGl2ZSArIG51bWJlcgorICAgICAgICBzZWxmLnNraXBwZWQgPSBzZWxmLnNraXBwZWQgKyBudW1iZXIKKworICAgIGRlZiB0YXNrQWN0aXZlKHNlbGYpOgorICAgICAgICBzZWxmLmFjdGl2ZSA9IHNlbGYuYWN0aXZlICsgMQorCisjIFRoZXNlIHZhbHVlcyBpbmRpY2F0ZSB0aGUgbmV4dCBzdGVwIGR1ZSB0byBiZSBydW4gaW4gdGhlCisjIHJ1blF1ZXVlIHN0YXRlIG1hY2hpbmUKK3J1blF1ZXVlUHJlcGFyZSA9IDIKK3J1blF1ZXVlU2NlbmVJbml0ID0gMworcnVuUXVldWVTY2VuZVJ1biA9IDQKK3J1blF1ZXVlUnVuSW5pdCA9IDUKK3J1blF1ZXVlUnVubmluZyA9IDYKK3J1blF1ZXVlRmFpbGVkID0gNworcnVuUXVldWVDbGVhblVwID0gOAorcnVuUXVldWVDb21wbGV0ZSA9IDkKKworY2xhc3MgUnVuUXVldWVTY2hlZHVsZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBDb250cm9sIHRoZSBvcmRlciB0YXNrcyBhcmUgc2NoZWR1bGVkIGluLgorICAgICIiIgorICAgIG5hbWUgPSAiYmFzaWMiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcnVucXVldWUsIHJxZGF0YSk6CisgICAgICAgICIiIgorICAgICAgICBUaGUgZGVmYXVsdCBzY2hlZHVsZXIganVzdCByZXR1cm5zIHRoZSBmaXJzdCBidWlsZGFibGUgdGFzayAodGhlCisgICAgICAgIHByaW9yaXR5IG1hcCBpcyBzb3J0ZWQgYnkgdGFzayBudW1iZXIpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJxID0gcnVucXVldWUKKyAgICAgICAgc2VsZi5ycWRhdGEgPSBycWRhdGEKKyAgICAgICAgc2VsZi5udW1UYXNrcyA9IGxlbihzZWxmLnJxZGF0YS5ydW5xX2ZuaWQpCisKKyAgICAgICAgc2VsZi5wcmlvX21hcCA9IFtdCisgICAgICAgIHNlbGYucHJpb19tYXAuZXh0ZW5kKHJhbmdlKHNlbGYubnVtVGFza3MpKQorCisgICAgICAgIHNlbGYuYnVpbGRhYmxlID0gW10KKyAgICAgICAgc2VsZi5zdGFtcHMgPSB7fQorICAgICAgICBmb3IgdGFza2lkIGluIHhyYW5nZShzZWxmLm51bVRhc2tzKToKKyAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tpZF1dCisgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNraWRdCisgICAgICAgICAgICBzZWxmLnN0YW1wc1t0YXNraWRdID0gYmIuYnVpbGQuc3RhbXBmaWxlKHRhc2tuYW1lLCBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUsIGZuKQorICAgICAgICAgICAgaWYgc2VsZi5ycS5ydW5xX2J1aWxkYWJsZVt0YXNraWRdID09IDE6CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZGFibGUuYXBwZW5kKHRhc2tpZCkKKworICAgICAgICBzZWxmLnJldl9wcmlvX21hcCA9IE5vbmUKKworICAgIGRlZiBuZXh0X2J1aWxkYWJsZV90YXNrKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBpZCBvZiB0aGUgZmlyc3QgdGFzayB3ZSBmaW5kIHRoYXQgaXMgYnVpbGRhYmxlCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmJ1aWxkYWJsZSA9IFt4IGZvciB4IGluIHNlbGYuYnVpbGRhYmxlIGlmIG5vdCBzZWxmLnJxLnJ1bnFfcnVubmluZ1t4XSA9PSAxXQorICAgICAgICBpZiBub3Qgc2VsZi5idWlsZGFibGU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBsZW4oc2VsZi5idWlsZGFibGUpID09IDE6CisgICAgICAgICAgICB0YXNraWQgPSBzZWxmLmJ1aWxkYWJsZVswXQorICAgICAgICAgICAgc3RhbXAgPSBzZWxmLnN0YW1wc1t0YXNraWRdCisgICAgICAgICAgICBpZiBzdGFtcCBub3QgaW4gc2VsZi5ycS5idWlsZF9zdGFtcHMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgIHJldHVybiB0YXNraWQKKworICAgICAgICBpZiBub3Qgc2VsZi5yZXZfcHJpb19tYXA6CisgICAgICAgICAgICBzZWxmLnJldl9wcmlvX21hcCA9IHJhbmdlKHNlbGYubnVtVGFza3MpCisgICAgICAgICAgICBmb3IgdGFza2lkIGluIHhyYW5nZShzZWxmLm51bVRhc2tzKToKKyAgICAgICAgICAgICAgICBzZWxmLnJldl9wcmlvX21hcFtzZWxmLnByaW9fbWFwW3Rhc2tpZF1dID0gdGFza2lkCisKKyAgICAgICAgYmVzdCA9IE5vbmUKKyAgICAgICAgYmVzdHByaW8gPSBOb25lCisgICAgICAgIGZvciB0YXNraWQgaW4gc2VsZi5idWlsZGFibGU6CisgICAgICAgICAgICBwcmlvID0gc2VsZi5yZXZfcHJpb19tYXBbdGFza2lkXQorICAgICAgICAgICAgaWYgYmVzdHByaW8gaXMgTm9uZSBvciBiZXN0cHJpbyA+IHByaW86CisgICAgICAgICAgICAgICAgc3RhbXAgPSBzZWxmLnN0YW1wc1t0YXNraWRdCisgICAgICAgICAgICAgICAgaWYgc3RhbXAgaW4gc2VsZi5ycS5idWlsZF9zdGFtcHMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGJlc3RwcmlvID0gcHJpbworICAgICAgICAgICAgICAgIGJlc3QgPSB0YXNraWQKKworICAgICAgICByZXR1cm4gYmVzdAorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGlkIG9mIHRoZSB0YXNrIHdlIHNob3VsZCBidWlsZCBuZXh0CisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnJxLnN0YXRzLmFjdGl2ZSA8IHNlbGYucnEubnVtYmVyX3Rhc2tzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV4dF9idWlsZGFibGVfdGFzaygpCisKKyAgICBkZWYgbmV3YnVpbGFibGUoc2VsZiwgdGFzayk6CisgICAgICAgIHNlbGYuYnVpbGRhYmxlLmFwcGVuZCh0YXNrKQorCitjbGFzcyBSdW5RdWV1ZVNjaGVkdWxlclNwZWVkKFJ1blF1ZXVlU2NoZWR1bGVyKToKKyAgICAiIiIKKyAgICBBIHNjaGVkdWxlciBvcHRpbWlzZWQgZm9yIHNwZWVkLiBUaGUgcHJpb3JpdHkgbWFwIGlzIHNvcnRlZCBieSB0YXNrIHdlaWdodCwKKyAgICBoZWF2aWVyIHdlaWdodGVkIHRhc2tzICh0YXNrcyBuZWVkZWQgYnkgdGhlIG1vc3Qgb3RoZXIgdGFza3MpIGFyZSBydW4gZmlyc3QuCisgICAgIiIiCisgICAgbmFtZSA9ICJzcGVlZCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBydW5xdWV1ZSwgcnFkYXRhKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBwcmlvcml0eSBtYXAgaXMgc29ydGVkIGJ5IHRhc2sgd2VpZ2h0LgorICAgICAgICAiIiIKKyAgICAgICAgUnVuUXVldWVTY2hlZHVsZXIuX19pbml0X18oc2VsZiwgcnVucXVldWUsIHJxZGF0YSkKKworICAgICAgICBzb3J0d2VpZ2h0ID0gc29ydGVkKGNvcHkuZGVlcGNvcHkoc2VsZi5ycWRhdGEucnVucV93ZWlnaHQpKQorICAgICAgICBjb3B5d2VpZ2h0ID0gY29weS5kZWVwY29weShzZWxmLnJxZGF0YS5ydW5xX3dlaWdodCkKKyAgICAgICAgc2VsZi5wcmlvX21hcCA9IFtdCisKKyAgICAgICAgZm9yIHdlaWdodCBpbiBzb3J0d2VpZ2h0OgorICAgICAgICAgICAgaWR4ID0gY29weXdlaWdodC5pbmRleCh3ZWlnaHQpCisgICAgICAgICAgICBzZWxmLnByaW9fbWFwLmFwcGVuZChpZHgpCisgICAgICAgICAgICBjb3B5d2VpZ2h0W2lkeF0gPSAtMQorCisgICAgICAgIHNlbGYucHJpb19tYXAucmV2ZXJzZSgpCisKK2NsYXNzIFJ1blF1ZXVlU2NoZWR1bGVyQ29tcGxldGlvbihSdW5RdWV1ZVNjaGVkdWxlclNwZWVkKToKKyAgICAiIiIKKyAgICBBIHNjaGVkdWxlciBvcHRpbWlzZWQgdG8gY29tcGxldGUgLmJiIGZpbGVzIGFyZSBxdWlja2x5IGFzIHBvc3NpYmxlLiBUaGUKKyAgICBwcmlvcml0eSBtYXAgaXMgc29ydGVkIGJ5IHRhc2sgd2VpZ2h0LCBidXQgdGhlbiByZW9yZGVyZWQgc28gb25jZSBhIGdpdmVuCisgICAgLmJiIGZpbGUgc3RhcnRzIHRvIGJ1aWxkLCBpdCdzIGNvbXBsZXRlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBUaGlzIHdvcmtzCisgICAgd2VsbCB3aGVyZSBkaXNrIHNwYWNlIGlzIGF0IGEgcHJlbWl1bSBhbmQgY2xhc3NlcyBsaWtlIE9FJ3Mgcm1fd29yayBhcmUgaW4KKyAgICBmb3JjZS4KKyAgICAiIiIKKyAgICBuYW1lID0gImNvbXBsZXRpb24iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcnVucXVldWUsIHJxZGF0YSk6CisgICAgICAgIFJ1blF1ZXVlU2NoZWR1bGVyU3BlZWQuX19pbml0X18oc2VsZiwgcnVucXVldWUsIHJxZGF0YSkKKworICAgICAgICAjRklYTUUgLSB3aGlsc3QgdGhpcyBncm91cHMgYWxsIGZuaWRzIHRvZ2V0aGVyIGl0IGRvZXMgbm90IHJlb3JkZXIgdGhlCisgICAgICAgICNmbmlkIGdyb3VwcyBvcHRpbWFsbHkuCisKKyAgICAgICAgYmFzZW1hcCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5wcmlvX21hcCkKKyAgICAgICAgc2VsZi5wcmlvX21hcCA9IFtdCisgICAgICAgIHdoaWxlIChsZW4oYmFzZW1hcCkgPiAwKToKKyAgICAgICAgICAgIGVudHJ5ID0gYmFzZW1hcC5wb3AoMCkKKyAgICAgICAgICAgIHNlbGYucHJpb19tYXAuYXBwZW5kKGVudHJ5KQorICAgICAgICAgICAgZm5pZCA9IHNlbGYucnFkYXRhLnJ1bnFfZm5pZFtlbnRyeV0KKyAgICAgICAgICAgIHRvZGVsID0gW10KKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiBiYXNlbWFwOgorICAgICAgICAgICAgICAgIGVudHJ5X2ZuaWQgPSBzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbZW50cnldCisgICAgICAgICAgICAgICAgaWYgZW50cnlfZm5pZCA9PSBmbmlkOgorICAgICAgICAgICAgICAgICAgICB0b2RlbC5hcHBlbmQoYmFzZW1hcC5pbmRleChlbnRyeSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpb19tYXAuYXBwZW5kKGVudHJ5KQorICAgICAgICAgICAgdG9kZWwucmV2ZXJzZSgpCisgICAgICAgICAgICBmb3IgaWR4IGluIHRvZGVsOgorICAgICAgICAgICAgICAgIGRlbCBiYXNlbWFwW2lkeF0KKworY2xhc3MgUnVuUXVldWVEYXRhOgorICAgICIiIgorICAgIEJpdEJha2UgUnVuIFF1ZXVlIGltcGxlbWVudGF0aW9uCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJxLCBjb29rZXIsIGNmZ0RhdGEsIGRhdGFDYWNoZSwgdGFza0RhdGEsIHRhcmdldHMpOgorICAgICAgICBzZWxmLmNvb2tlciA9IGNvb2tlcgorICAgICAgICBzZWxmLmRhdGFDYWNoZSA9IGRhdGFDYWNoZQorICAgICAgICBzZWxmLnRhc2tEYXRhID0gdGFza0RhdGEKKyAgICAgICAgc2VsZi50YXJnZXRzID0gdGFyZ2V0cworICAgICAgICBzZWxmLnJxID0gcnEKKyAgICAgICAgc2VsZi53YXJuX211bHRpX2JiID0gRmFsc2UKKworICAgICAgICBzZWxmLnN0YW1wd2hpdGVsaXN0ID0gY2ZnRGF0YS5nZXRWYXIoIkJCX1NUQU1QX1dISVRFTElTVCIsIFRydWUpIG9yICIiCisgICAgICAgIHNlbGYubXVsdGlfcHJvdmlkZXJfd2hpdGVsaXN0ID0gKGNmZ0RhdGEuZ2V0VmFyKCJNVUxUSV9QUk9WSURFUl9XSElURUxJU1QiLCBUcnVlKSBvciAiIikuc3BsaXQoKQorCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnJ1bnFfZm5pZCA9IFtdCisgICAgICAgIHNlbGYucnVucV90YXNrID0gW10KKyAgICAgICAgc2VsZi5ydW5xX2RlcGVuZHMgPSBbXQorICAgICAgICBzZWxmLnJ1bnFfcmV2ZGVwcyA9IFtdCisgICAgICAgIHNlbGYucnVucV9oYXNoID0gW10KKworICAgIGRlZiBydW5xX2RlcGVuZHNfbmFtZXMoc2VsZiwgaWRzKToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIHJldCA9IFtdCisgICAgICAgIGZvciBpZCBpbiBzZWxmLnJ1bnFfZGVwZW5kc1tpZHNdOgorICAgICAgICAgICAgbmFtID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmdldF91c2VyX2lkc3RyaW5nKGlkKSkKKyAgICAgICAgICAgIG5hbSA9IHJlLnN1YigiX1teLF0qLCIsICIsIiwgbmFtKQorICAgICAgICAgICAgcmV0LmV4dGVuZChbbmFtXSkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIGdldF90YXNrX25hbWUoc2VsZiwgdGFzayk6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bnFfdGFza1t0YXNrXQorCisgICAgZGVmIGdldF90YXNrX2ZpbGUoc2VsZiwgdGFzayk6CisgICAgICAgIHJldHVybiBzZWxmLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW3Rhc2tdXQorCisgICAgZGVmIGdldF90YXNrX2hhc2goc2VsZiwgdGFzayk6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bnFfaGFzaFt0YXNrXQorCisgICAgZGVmIGdldF91c2VyX2lkc3RyaW5nKHNlbGYsIHRhc2ssIHRhc2tfbmFtZV9zdWZmaXggPSAiIik6CisgICAgICAgIGZuID0gc2VsZi50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgdGFza25hbWUgPSBzZWxmLnJ1bnFfdGFza1t0YXNrXSArIHRhc2tfbmFtZV9zdWZmaXgKKyAgICAgICAgcmV0dXJuICIlcywgJXMiICUgKGZuLCB0YXNrbmFtZSkKKworICAgIGRlZiBnZXRfdGFza19pZChzZWxmLCBmbmlkLCB0YXNrbmFtZSk6CisgICAgICAgIGZvciBsaXN0aWQgaW4geHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgaWYgc2VsZi5ydW5xX2ZuaWRbbGlzdGlkXSA9PSBmbmlkIGFuZCBzZWxmLnJ1bnFfdGFza1tsaXN0aWRdID09IHRhc2tuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0aWQKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBjaXJjdWxhcl9kZXBjaGFpbnNfaGFuZGxlcihzZWxmLCB0YXNrcyk6CisgICAgICAgICIiIgorICAgICAgICBTb21lIHRhc2tzIGFyZW4ndCBidWlsZGFibGUsIGxpa2VseSBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeSBpc3N1ZXMuCisgICAgICAgIElkZW50aWZ5IHRoZSBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYW5kIHByaW50IHRoZW0gaW4gYSB1c2VyIHJlYWRhYmxlIGZvcm1hdC4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKKworICAgICAgICB2YWxpZF9jaGFpbnMgPSBbXQorICAgICAgICBleHBsb3JlZF9kZXBzID0ge30KKyAgICAgICAgbXNncyA9IFtdCisKKyAgICAgICAgZGVmIGNoYWluX3Jlb3JkZXIoY2hhaW4pOgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBSZW9yZGVyIGEgZGVwZW5kZW5jeSBjaGFpbiBzbyB0aGUgbG93ZXN0IHRhc2sgaWQgaXMgZmlyc3QKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgbG93ZXN0ID0gMAorICAgICAgICAgICAgbmV3X2NoYWluID0gW10KKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiB4cmFuZ2UobGVuKGNoYWluKSk6CisgICAgICAgICAgICAgICAgaWYgY2hhaW5bZW50cnldIDwgY2hhaW5bbG93ZXN0XToKKyAgICAgICAgICAgICAgICAgICAgbG93ZXN0ID0gZW50cnkKKyAgICAgICAgICAgIG5ld19jaGFpbi5leHRlbmQoY2hhaW5bbG93ZXN0Ol0pCisgICAgICAgICAgICBuZXdfY2hhaW4uZXh0ZW5kKGNoYWluWzpsb3dlc3RdKQorICAgICAgICAgICAgcmV0dXJuIG5ld19jaGFpbgorCisgICAgICAgIGRlZiBjaGFpbl9jb21wYXJlX2VxdWFsKGNoYWluMSwgY2hhaW4yKToKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgQ29tcGFyZSB0d28gZGVwZW5kZW5jeSBjaGFpbnMgYW5kIHNlZSBpZiB0aGV5J3JlIHRoZSBzYW1lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGxlbihjaGFpbjEpICE9IGxlbihjaGFpbjIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZm9yIGluZGV4IGluIHhyYW5nZShsZW4oY2hhaW4xKSk6CisgICAgICAgICAgICAgICAgaWYgY2hhaW4xW2luZGV4XSAhPSBjaGFpbjJbaW5kZXhdOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgZGVmIGNoYWluX2FycmF5X2NvbnRhaW5zKGNoYWluLCBjaGFpbl9hcnJheSk6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIFJldHVybiBUcnVlIGlmIGNoYWluX2FycmF5IGNvbnRhaW5zIGNoYWluCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGZvciBjaCBpbiBjaGFpbl9hcnJheToKKyAgICAgICAgICAgICAgICBpZiBjaGFpbl9jb21wYXJlX2VxdWFsKGNoLCBjaGFpbik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBkZWYgZmluZF9jaGFpbnModGFza2lkLCBwcmV2X2NoYWluKToKKyAgICAgICAgICAgIHByZXZfY2hhaW4uYXBwZW5kKHRhc2tpZCkKKyAgICAgICAgICAgIHRvdGFsX2RlcHMgPSBbXQorICAgICAgICAgICAgdG90YWxfZGVwcy5leHRlbmQoc2VsZi5ydW5xX3JldmRlcHNbdGFza2lkXSkKKyAgICAgICAgICAgIGZvciByZXZkZXAgaW4gc2VsZi5ydW5xX3JldmRlcHNbdGFza2lkXToKKyAgICAgICAgICAgICAgICBpZiByZXZkZXAgaW4gcHJldl9jaGFpbjoKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gcHJldl9jaGFpbi5pbmRleChyZXZkZXApCisgICAgICAgICAgICAgICAgICAgICMgVG8gcHJldmVudCBkdXBsaWNhdGVzLCByZW9yZGVyIHRoZSBjaGFpbiB0byBzdGFydCB3aXRoIHRoZSBsb3dlc3QgdGFza2lkCisgICAgICAgICAgICAgICAgICAgICMgYW5kIHNlYXJjaCB0aHJvdWdoIGFuIGFycmF5IG9mIHRob3NlIHdlJ3ZlIGFscmVhZHkgcHJpbnRlZAorICAgICAgICAgICAgICAgICAgICBjaGFpbiA9IHByZXZfY2hhaW5baWR4Ol0KKyAgICAgICAgICAgICAgICAgICAgbmV3X2NoYWluID0gY2hhaW5fcmVvcmRlcihjaGFpbikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNoYWluX2FycmF5X2NvbnRhaW5zKG5ld19jaGFpbiwgdmFsaWRfY2hhaW5zKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX2NoYWlucy5hcHBlbmQobmV3X2NoYWluKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNncy5hcHBlbmQoIkRlcGVuZGVuY3kgbG9vcCAjJWQgZm91bmQ6XG4iICUgbGVuKHZhbGlkX2NoYWlucykpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGVwIGluIG5ld19jaGFpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dzLmFwcGVuZCgiICBUYXNrICVzICglcykgKGRlcGVuZGVudCBUYXNrcyAlcylcbiIgJSAoZGVwLCBzZWxmLmdldF91c2VyX2lkc3RyaW5nKGRlcCksIHNlbGYucnVucV9kZXBlbmRzX25hbWVzKGRlcCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNncy5hcHBlbmQoIlxuIikKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHZhbGlkX2NoYWlucykgPiAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3MuYXBwZW5kKCJBYm9ydGVkIGRlcGVuZGVuY3kgbG9vcHMgc2VhcmNoIGFmdGVyIDEwIG1hdGNoZXMuXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZ3MKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzY2FuID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiByZXZkZXAgbm90IGluIGV4cGxvcmVkX2RlcHM6CisgICAgICAgICAgICAgICAgICAgIHNjYW4gPSBUcnVlCisgICAgICAgICAgICAgICAgZWxpZiByZXZkZXAgaW4gZXhwbG9yZWRfZGVwc1tyZXZkZXBdOgorICAgICAgICAgICAgICAgICAgICBzY2FuID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gcHJldl9jaGFpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlcCBpbiBleHBsb3JlZF9kZXBzW3JldmRlcF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBzY2FuOgorICAgICAgICAgICAgICAgICAgICBmaW5kX2NoYWlucyhyZXZkZXAsIGNvcHkuZGVlcGNvcHkocHJldl9jaGFpbikpCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBleHBsb3JlZF9kZXBzW3JldmRlcF06CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcCBub3QgaW4gdG90YWxfZGVwczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2RlcHMuYXBwZW5kKGRlcCkKKworICAgICAgICAgICAgZXhwbG9yZWRfZGVwc1t0YXNraWRdID0gdG90YWxfZGVwcworCisgICAgICAgIGZvciB0YXNrIGluIHRhc2tzOgorICAgICAgICAgICAgZmluZF9jaGFpbnModGFzaywgW10pCisKKyAgICAgICAgcmV0dXJuIG1zZ3MKKworICAgIGRlZiBjYWxjdWxhdGVfdGFza193ZWlnaHRzKHNlbGYsIGVuZHBvaW50cyk6CisgICAgICAgICIiIgorICAgICAgICBDYWxjdWxhdGUgYSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSAid2VpZ2h0IiBvZiBlYWNoIHRhc2suIEhlYXZpZXIgd2VpZ2h0ZWQgdGFza3MKKyAgICAgICAgaGF2ZSBtb3JlIGRlcGVuZGVuY2llcyBhbmQgaGVuY2Ugc2hvdWxkIGJlIGV4ZWN1dGVkIHNvb25lciBmb3IgbWF4aW11bSBzcGVlZC4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsc28gc2FuaXR5IGNoZWNrcyB0aGUgdGFzayBsaXN0IGZpbmRpbmcgdGFza3MgdGhhdCBhcmUgbm90CisgICAgICAgIHBvc3NpYmxlIHRvIGV4ZWN1dGUgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbnVtVGFza3MgPSBsZW4oc2VsZi5ydW5xX2ZuaWQpCisgICAgICAgIHdlaWdodCA9IFtdCisgICAgICAgIGRlcHNfbGVmdCA9IFtdCisgICAgICAgIHRhc2tfZG9uZSA9IFtdCisKKyAgICAgICAgZm9yIGxpc3RpZCBpbiB4cmFuZ2UobnVtVGFza3MpOgorICAgICAgICAgICAgdGFza19kb25lLmFwcGVuZChGYWxzZSkKKyAgICAgICAgICAgIHdlaWdodC5hcHBlbmQoMSkKKyAgICAgICAgICAgIGRlcHNfbGVmdC5hcHBlbmQobGVuKHNlbGYucnVucV9yZXZkZXBzW2xpc3RpZF0pKQorCisgICAgICAgIGZvciBsaXN0aWQgaW4gZW5kcG9pbnRzOgorICAgICAgICAgICAgd2VpZ2h0W2xpc3RpZF0gPSAxMAorICAgICAgICAgICAgdGFza19kb25lW2xpc3RpZF0gPSBUcnVlCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIG5leHRfcG9pbnRzID0gW10KKyAgICAgICAgICAgIGZvciBsaXN0aWQgaW4gZW5kcG9pbnRzOgorICAgICAgICAgICAgICAgIGZvciByZXZkZXAgaW4gc2VsZi5ydW5xX2RlcGVuZHNbbGlzdGlkXToKKyAgICAgICAgICAgICAgICAgICAgd2VpZ2h0W3JldmRlcF0gPSB3ZWlnaHRbcmV2ZGVwXSArIHdlaWdodFtsaXN0aWRdCisgICAgICAgICAgICAgICAgICAgIGRlcHNfbGVmdFtyZXZkZXBdID0gZGVwc19sZWZ0W3JldmRlcF0gLSAxCisgICAgICAgICAgICAgICAgICAgIGlmIGRlcHNfbGVmdFtyZXZkZXBdID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BvaW50cy5hcHBlbmQocmV2ZGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGFza19kb25lW3JldmRlcF0gPSBUcnVlCisgICAgICAgICAgICBlbmRwb2ludHMgPSBuZXh0X3BvaW50cworICAgICAgICAgICAgaWYgbGVuKG5leHRfcG9pbnRzKSA9PSAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBDaXJjdWxhciBkZXBlbmRlbmN5IHNhbml0eSBjaGVjaworICAgICAgICBwcm9ibGVtX3Rhc2tzID0gW10KKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKG51bVRhc2tzKToKKyAgICAgICAgICAgIGlmIHRhc2tfZG9uZVt0YXNrXSBpcyBGYWxzZSBvciBkZXBzX2xlZnRbdGFza10gIT0gMDoKKyAgICAgICAgICAgICAgICBwcm9ibGVtX3Rhc2tzLmFwcGVuZCh0YXNrKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiVGFzayAlcyAoJXMpIGlzIG5vdCBidWlsZGFibGUiLCB0YXNrLCBzZWxmLmdldF91c2VyX2lkc3RyaW5nKHRhc2spKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiKENvbXBsZXRlIG1hcmtlciB3YXMgJXMgYW5kIHRoZSByZW1haW5pbmcgZGVwZW5kZW5jeSBjb3VudCB3YXMgJXMpXG4iLCB0YXNrX2RvbmVbdGFza10sIGRlcHNfbGVmdFt0YXNrXSkKKworICAgICAgICBpZiBwcm9ibGVtX3Rhc2tzOgorICAgICAgICAgICAgbWVzc2FnZSA9ICJVbmJ1aWxkYWJsZSB0YXNrcyB3ZXJlIGZvdW5kLlxuIgorICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAiVGhlc2UgYXJlIHVzdWFsbHkgY2F1c2VkIGJ5IGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgYW55IGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hhaW5zIGZvdW5kIHdpbGwgYmUgcHJpbnRlZCBiZWxvdy4gSW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsIHRvIHNlZSBhIGxpc3Qgb2YgdW5idWlsZGFibGUgdGFza3MuXG5cbiIKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlICsgIklkZW50aWZ5aW5nIGRlcGVuZGVuY3kgbG9vcHMgKHRoaXMgbWF5IHRha2UgYSBzaG9ydCB3aGlsZSkuLi5cbiIKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKQorCisgICAgICAgICAgICBtc2dzID0gc2VsZi5jaXJjdWxhcl9kZXBjaGFpbnNfaGFuZGxlcihwcm9ibGVtX3Rhc2tzKQorCisgICAgICAgICAgICBtZXNzYWdlID0gIlxuIgorICAgICAgICAgICAgZm9yIG1zZyBpbiBtc2dzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlICsgbXNnCisgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgbWVzc2FnZSkKKworICAgICAgICByZXR1cm4gd2VpZ2h0CisKKyAgICBkZWYgcHJlcGFyZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFR1cm4gYSBzZXQgb2YgdGFza0RhdGEgaW50byBhIFJ1blF1ZXVlIGFuZCBjb21wdXRlIGRhdGEgbmVlZGVkCisgICAgICAgIHRvIG9wdGltaXNlIHRoZSBleGVjdXRpb24gb3JkZXIuCisgICAgICAgICIiIgorCisgICAgICAgIHJ1bnFfYnVpbGQgPSBbXQorICAgICAgICByZWN1cnNpdmV0YXNrcyA9IHt9CisgICAgICAgIHJlY3Vyc2l2ZWl0YXNrcyA9IHt9CisgICAgICAgIHJlY3Vyc2l2ZXRhc2tzc2VsZnJlZiA9IHNldCgpCisKKyAgICAgICAgdGFza0RhdGEgPSBzZWxmLnRhc2tEYXRhCisKKyAgICAgICAgaWYgbGVuKHRhc2tEYXRhLnRhc2tzX25hbWUpID09IDA6CisgICAgICAgICAgICAjIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlByZXBhcmluZyBSdW5RdWV1ZSIpCisKKyAgICAgICAgIyBTdGVwIEEgLSBXb3JrIG91dCBhIGxpc3Qgb2YgdGFza3MgdG8gcnVuCisgICAgICAgICMKKyAgICAgICAgIyBUYXNrZGF0YSBnaXZlcyB1cyBhIGxpc3Qgb2YgcG9zc2libGUgcHJvdmlkZXJzIGZvciBldmVyeSBidWlsZCBhbmQgcnVuCisgICAgICAgICMgdGFyZ2V0IG9yZGVyZWQgYnkgcHJpb3JpdHkuIEl0IGFsc28gZ2l2ZXMgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aG9zZQorICAgICAgICAjIHByb3ZpZGVycy4KKyAgICAgICAgIworICAgICAgICAjIFRvIGNyZWF0ZSB0aGUgYWN0dWFsIGxpc3Qgb2YgdGFza3MgdG8gZXhlY3V0ZSB3ZSBmaXggdGhlIGxpc3Qgb2YKKyAgICAgICAgIyBwcm92aWRlcnMgYW5kIHRoZW4gcmVzb2x2ZSB0aGUgZGVwZW5kZW5jaWVzIGludG8gdGFzayBJRHMuIFRoaXMKKyAgICAgICAgIyBwcm9jZXNzIGlzIHJlcGVhdGVkIGZvciBlYWNoIHR5cGUgb2YgZGVwZW5kZW5jeSAodGRlcGVuZHMsIGRlcHRhc2ssCisgICAgICAgICMgcmRlcHRhc3QsIHJlY3JkZXB0YXNrLCBpZGVwZW5kcykuCisKKyAgICAgICAgZGVmIGFkZF9idWlsZF9kZXBlbmRlbmNpZXMoZGVwaWRzLCB0YXNrbmFtZXMsIGRlcGVuZHMpOgorICAgICAgICAgICAgZm9yIGRlcGlkIGluIGRlcGlkczoKKyAgICAgICAgICAgICAgICAjIFdvbid0IGJlIGluIGJ1aWxkX3RhcmdldHMgaWYgQVNTVU1FX1BST1ZJREVECisgICAgICAgICAgICAgICAgaWYgZGVwaWQgbm90IGluIHRhc2tEYXRhLmJ1aWxkX3RhcmdldHM6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZGVwZGF0YSA9IHRhc2tEYXRhLmJ1aWxkX3RhcmdldHNbZGVwaWRdWzBdCisgICAgICAgICAgICAgICAgaWYgZGVwZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZvciB0YXNrbmFtZSBpbiB0YXNrbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIHRhc2tpZCA9IHRhc2tEYXRhLmdldHRhc2tfaWRfZnJvbWZuaWQoZGVwZGF0YSwgdGFza25hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMuYWRkKHRhc2tpZCkKKworICAgICAgICBkZWYgYWRkX3J1bnRpbWVfZGVwZW5kZW5jaWVzKGRlcGlkcywgdGFza25hbWVzLCBkZXBlbmRzKToKKyAgICAgICAgICAgIGZvciBkZXBpZCBpbiBkZXBpZHM6CisgICAgICAgICAgICAgICAgaWYgZGVwaWQgbm90IGluIHRhc2tEYXRhLnJ1bl90YXJnZXRzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlcGRhdGEgPSB0YXNrRGF0YS5ydW5fdGFyZ2V0c1tkZXBpZF1bMF0KKyAgICAgICAgICAgICAgICBpZiBkZXBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZm9yIHRhc2tuYW1lIGluIHRhc2tuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgdGFza2lkID0gdGFza0RhdGEuZ2V0dGFza19pZF9mcm9tZm5pZChkZXBkYXRhLCB0YXNrbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFza2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcy5hZGQodGFza2lkKQorCisgICAgICAgIGRlZiBhZGRfcmVzb2x2ZWRfZGVwZW5kZW5jaWVzKGRlcGlkcywgdGFza25hbWVzLCBkZXBlbmRzKToKKyAgICAgICAgICAgIGZvciBkZXBpZCBpbiBkZXBpZHM6CisgICAgICAgICAgICAgICAgZm9yIHRhc2tuYW1lIGluIHRhc2tuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgdGFza2lkID0gdGFza0RhdGEuZ2V0dGFza19pZF9mcm9tZm5pZChkZXBpZCwgdGFza25hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMuYWRkKHRhc2tpZCkKKworICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHRhc2tEYXRhLnRhc2tzX25hbWUpKToKKyAgICAgICAgICAgIGRlcGVuZHMgPSBzZXQoKQorICAgICAgICAgICAgZm5pZCA9IHRhc2tEYXRhLnRhc2tzX2ZuaWRbdGFza10KKyAgICAgICAgICAgIGZuID0gdGFza0RhdGEuZm5faW5kZXhbZm5pZF0KKyAgICAgICAgICAgIHRhc2tfZGVwcyA9IHNlbGYuZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKworICAgICAgICAgICAgI2xvZ2dlci5kZWJ1ZygyLCAiUHJvY2Vzc2luZyAlczolcyIsIGZuLCB0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdKQorCisgICAgICAgICAgICBpZiBmbmlkIG5vdCBpbiB0YXNrRGF0YS5mYWlsZWRfZm5pZHM6CisKKyAgICAgICAgICAgICAgICAjIFJlc29sdmUgdGFzayBpbnRlcm5hbCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBlLmcuIGFkZHRhc2sgYmVmb3JlIFggYWZ0ZXIgWQorICAgICAgICAgICAgICAgIGRlcGVuZHMgPSBzZXQodGFza0RhdGEudGFza3NfdGRlcGVuZHNbdGFza10pCisKKyAgICAgICAgICAgICAgICAjIFJlc29sdmUgJ2RlcHRhc2snIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIGUuZy4gZG9fc29tZXRhc2tbZGVwdGFza10gPSAiZG9fc29tZW90aGVydGFzayIKKyAgICAgICAgICAgICAgICAjIChtYWtlcyBzdXJlIHNvbWV0YXNrIHJ1bnMgYWZ0ZXIgc29tZW90aGVydGFzayBvZiBhbGwgREVQRU5EUykKKyAgICAgICAgICAgICAgICBpZiAnZGVwdGFzaycgaW4gdGFza19kZXBzIGFuZCB0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdIGluIHRhc2tfZGVwc1snZGVwdGFzayddOgorICAgICAgICAgICAgICAgICAgICB0YXNrbmFtZXMgPSB0YXNrX2RlcHNbJ2RlcHRhc2snXVt0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdXS5zcGxpdCgpCisgICAgICAgICAgICAgICAgICAgIGFkZF9idWlsZF9kZXBlbmRlbmNpZXModGFza0RhdGEuZGVwaWRzW2ZuaWRdLCB0YXNrbmFtZXMsIGRlcGVuZHMpCisKKyAgICAgICAgICAgICAgICAjIFJlc29sdmUgJ3JkZXB0YXNrJyBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBlLmcuIGRvX3NvbWV0YXNrW3JkZXB0YXNrXSA9ICJkb19zb21lb3RoZXJ0YXNrIgorICAgICAgICAgICAgICAgICMgKG1ha2VzIHN1cmUgc29tZXRhc2sgcnVucyBhZnRlciBzb21lb3RoZXJ0YXNrIG9mIGFsbCBSREVQRU5EUykKKyAgICAgICAgICAgICAgICBpZiAncmRlcHRhc2snIGluIHRhc2tfZGVwcyBhbmQgdGFza0RhdGEudGFza3NfbmFtZVt0YXNrXSBpbiB0YXNrX2RlcHNbJ3JkZXB0YXNrJ106CisgICAgICAgICAgICAgICAgICAgIHRhc2tuYW1lcyA9IHRhc2tfZGVwc1sncmRlcHRhc2snXVt0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdXS5zcGxpdCgpCisgICAgICAgICAgICAgICAgICAgIGFkZF9ydW50aW1lX2RlcGVuZGVuY2llcyh0YXNrRGF0YS5yZGVwaWRzW2ZuaWRdLCB0YXNrbmFtZXMsIGRlcGVuZHMpCisKKyAgICAgICAgICAgICAgICAjIFJlc29sdmUgaW50ZXItdGFzayBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBlLmcuIGRvX3NvbWV0YXNrW2RlcGVuZHNdID0gInRhcmdldG5hbWU6ZG9fc29tZW90aGVydGFzayIKKyAgICAgICAgICAgICAgICAjIChtYWtlcyBzdXJlIHNvbWV0YXNrIHJ1bnMgYWZ0ZXIgdGFyZ2V0bmFtZSdzIHNvbWVvdGhlcnRhc2spCisgICAgICAgICAgICAgICAgaWRlcGVuZHMgPSB0YXNrRGF0YS50YXNrc19pZGVwZW5kc1t0YXNrXQorICAgICAgICAgICAgICAgIGZvciAoZGVwaWQsIGlkZXBlbmR0YXNrKSBpbiBpZGVwZW5kczoKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwaWQgaW4gdGFza0RhdGEuYnVpbGRfdGFyZ2V0cyBhbmQgbm90IGRlcGlkIGluIHRhc2tEYXRhLmZhaWxlZF9kZXBzOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBXb24ndCBiZSBpbiBidWlsZF90YXJnZXRzIGlmIEFTU1VNRV9QUk9WSURFRAorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZGF0YSA9IHRhc2tEYXRhLmJ1aWxkX3RhcmdldHNbZGVwaWRdWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZXBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tpZCA9IHRhc2tEYXRhLmdldHRhc2tfaWRfZnJvbWZuaWQoZGVwZGF0YSwgaWRlcGVuZHRhc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGFza2lkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiVGFzayAlcyBpbiAlcyBkZXBlbmRzIHVwb24gbm9uLWV4aXN0ZW50IHRhc2sgJXMgaW4gJXMiICUgKHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10sIGZuLCBpZGVwZW5kdGFzaywgdGFza0RhdGEuZm5faW5kZXhbZGVwZGF0YV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMuYWRkKHRhc2tpZCkKKyAgICAgICAgICAgICAgICBpcmRlcGVuZHMgPSB0YXNrRGF0YS50YXNrc19pcmRlcGVuZHNbdGFza10KKyAgICAgICAgICAgICAgICBmb3IgKGRlcGlkLCBpZGVwZW5kdGFzaykgaW4gaXJkZXBlbmRzOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXBpZCBpbiB0YXNrRGF0YS5ydW5fdGFyZ2V0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgV29uJ3QgYmUgaW4gcnVuX3RhcmdldHMgaWYgQVNTVU1FX1BST1ZJREVECisgICAgICAgICAgICAgICAgICAgICAgICBkZXBkYXRhID0gdGFza0RhdGEucnVuX3RhcmdldHNbZGVwaWRdWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZXBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tpZCA9IHRhc2tEYXRhLmdldHRhc2tfaWRfZnJvbWZuaWQoZGVwZGF0YSwgaWRlcGVuZHRhc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGFza2lkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiVGFzayAlcyBpbiAlcyByZGVwZW5kcyB1cG9uIG5vbi1leGlzdGVudCB0YXNrICVzIGluICVzIiAlICh0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdLCBmbiwgaWRlcGVuZHRhc2ssIHRhc2tEYXRhLmZuX2luZGV4W2RlcGRhdGFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzLmFkZCh0YXNraWQpCisKKyAgICAgICAgICAgICAgICAjIFJlc29sdmUgcmVjdXJzaXZlICdyZWNyZGVwdGFzaycgZGVwZW5kZW5jaWVzIChQYXJ0IEEpCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgZS5nLiBkb19zb21ldGFza1tyZWNyZGVwdGFza10gPSAiZG9fc29tZW90aGVydGFzayIKKyAgICAgICAgICAgICAgICAjIChtYWtlcyBzdXJlIHNvbWV0YXNrIHJ1bnMgYWZ0ZXIgc29tZW90aGVydGFzayBvZiBhbGwgREVQRU5EUywgUkRFUEVORFMgYW5kIGludGVydGFzayBkZXBlbmRlbmNpZXMsIHJlY3Vyc2l2ZWx5KQorICAgICAgICAgICAgICAgICMgV2UgY292ZXIgdGhlIHJlY3Vyc2l2ZSBwYXJ0IG9mIHRoZSBkZXBlbmRlbmNpZXMgYmVsb3cKKyAgICAgICAgICAgICAgICBpZiAncmVjcmRlcHRhc2snIGluIHRhc2tfZGVwcyBhbmQgdGFza0RhdGEudGFza3NfbmFtZVt0YXNrXSBpbiB0YXNrX2RlcHNbJ3JlY3JkZXB0YXNrJ106CisgICAgICAgICAgICAgICAgICAgIHRhc2tuYW1lcyA9IHRhc2tfZGVwc1sncmVjcmRlcHRhc2snXVt0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdXS5zcGxpdCgpCisgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZXRhc2tzW3Rhc2tdID0gdGFza25hbWVzCisgICAgICAgICAgICAgICAgICAgIGFkZF9idWlsZF9kZXBlbmRlbmNpZXModGFza0RhdGEuZGVwaWRzW2ZuaWRdLCB0YXNrbmFtZXMsIGRlcGVuZHMpCisgICAgICAgICAgICAgICAgICAgIGFkZF9ydW50aW1lX2RlcGVuZGVuY2llcyh0YXNrRGF0YS5yZGVwaWRzW2ZuaWRdLCB0YXNrbmFtZXMsIGRlcGVuZHMpCisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10gaW4gdGFza25hbWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZldGFza3NzZWxmcmVmLmFkZCh0YXNrKQorCisgICAgICAgICAgICAgICAgICAgIGlmICdyZWNpZGVwdGFzaycgaW4gdGFza19kZXBzIGFuZCB0YXNrRGF0YS50YXNrc19uYW1lW3Rhc2tdIGluIHRhc2tfZGVwc1sncmVjaWRlcHRhc2snXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWl0YXNrc1t0YXNrXSA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdCBpbiB0YXNrX2RlcHNbJ3JlY2lkZXB0YXNrJ11bdGFza0RhdGEudGFza3NfbmFtZVt0YXNrXV0uc3BsaXQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkZXAgPSB0YXNrRGF0YS5nZXR0YXNrX2lkX2Zyb21mbmlkKGZuaWQsIHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlaXRhc2tzW3Rhc2tdLmFwcGVuZChuZXdkZXApCisKKyAgICAgICAgICAgIHNlbGYucnVucV9mbmlkLmFwcGVuZCh0YXNrRGF0YS50YXNrc19mbmlkW3Rhc2tdKQorICAgICAgICAgICAgc2VsZi5ydW5xX3Rhc2suYXBwZW5kKHRhc2tEYXRhLnRhc2tzX25hbWVbdGFza10pCisgICAgICAgICAgICBzZWxmLnJ1bnFfZGVwZW5kcy5hcHBlbmQoZGVwZW5kcykKKyAgICAgICAgICAgIHNlbGYucnVucV9yZXZkZXBzLmFwcGVuZChzZXQoKSkKKyAgICAgICAgICAgIHNlbGYucnVucV9oYXNoLmFwcGVuZCgiIikKKworICAgICAgICAgICAgcnVucV9idWlsZC5hcHBlbmQoMCkKKworICAgICAgICAjIFJlc29sdmUgcmVjdXJzaXZlICdyZWNyZGVwdGFzaycgZGVwZW5kZW5jaWVzIChQYXJ0IEIpCisgICAgICAgICMKKyAgICAgICAgIyBlLmcuIGRvX3NvbWV0YXNrW3JlY3JkZXB0YXNrXSA9ICJkb19zb21lb3RoZXJ0YXNrIgorICAgICAgICAjIChtYWtlcyBzdXJlIHNvbWV0YXNrIHJ1bnMgYWZ0ZXIgc29tZW90aGVydGFzayBvZiBhbGwgREVQRU5EUywgUkRFUEVORFMgYW5kIGludGVydGFzayBkZXBlbmRlbmNpZXMsIHJlY3Vyc2l2ZWx5KQorICAgICAgICAjIFdlIG5lZWQgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5IHNpbmNlIHdlIG5lZWQgYWxsIG9mIHNlbGYucnVucV9kZXBlbmRzIHRvIGJlIGNvbXBsZXRlIGJlZm9yZSB0aGlzIGlzIHByb2Nlc3NlZAorICAgICAgICBleHRyYWRlcHMgPSB7fQorICAgICAgICBmb3IgdGFzayBpbiByZWN1cnNpdmV0YXNrczoKKyAgICAgICAgICAgIGV4dHJhZGVwc1t0YXNrXSA9IHNldChzZWxmLnJ1bnFfZGVwZW5kc1t0YXNrXSkKKyAgICAgICAgICAgIHRhc2tuYW1lcyA9IHJlY3Vyc2l2ZXRhc2tzW3Rhc2tdCisgICAgICAgICAgICBzZWVuZGVwcyA9IHNldCgpCisgICAgICAgICAgICBzZWVuZm5pZCA9IFtdCisKKyAgICAgICAgICAgIGRlZiBnZW5lcmF0ZV9yZWNkZXBzKHQpOgorICAgICAgICAgICAgICAgIG5ld2RlcHMgPSBzZXQoKQorICAgICAgICAgICAgICAgIGFkZF9yZXNvbHZlZF9kZXBlbmRlbmNpZXMoW3Rhc2tEYXRhLnRhc2tzX2ZuaWRbdF1dLCB0YXNrbmFtZXMsIG5ld2RlcHMpCisgICAgICAgICAgICAgICAgZXh0cmFkZXBzW3Rhc2tdLnVwZGF0ZShuZXdkZXBzKQorICAgICAgICAgICAgICAgIHNlZW5kZXBzLmFkZCh0KQorICAgICAgICAgICAgICAgIG5ld2RlcHMuYWRkKHQpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gbmV3ZGVwczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gc2VsZi5ydW5xX2RlcGVuZHNbaV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBuIG5vdCBpbiBzZWVuZGVwczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9yZWNkZXBzKG4pCisgICAgICAgICAgICBnZW5lcmF0ZV9yZWNkZXBzKHRhc2spCisKKyAgICAgICAgICAgIGlmIHRhc2sgaW4gcmVjdXJzaXZlaXRhc2tzOgorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gcmVjdXJzaXZlaXRhc2tzW3Rhc2tdOgorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9yZWNkZXBzKGRlcCkKKworICAgICAgICAjIFJlbW92ZSBjaXJjdWxhciByZWZlcmVuY2VzIHNvIHRoYXQgZG9fYVtyZWNyZGVwdGFza10gPSAiZG9fYSBkb19iIiBjYW4gd29yaworICAgICAgICBmb3IgdGFzayBpbiByZWN1cnNpdmV0YXNrczoKKyAgICAgICAgICAgIGV4dHJhZGVwc1t0YXNrXS5kaWZmZXJlbmNlX3VwZGF0ZShyZWN1cnNpdmV0YXNrc3NlbGZyZWYpCisKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbih0YXNrRGF0YS50YXNrc19uYW1lKSk6CisgICAgICAgICAgICAjIEFkZCBpbiBleHRyYSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmIHRhc2sgaW4gZXh0cmFkZXBzOgorICAgICAgICAgICAgICAgICBzZWxmLnJ1bnFfZGVwZW5kc1t0YXNrXSA9IGV4dHJhZGVwc1t0YXNrXQorICAgICAgICAgICAgIyBSZW1vdmUgYWxsIHNlbGYgcmVmZXJlbmNlcworICAgICAgICAgICAgaWYgdGFzayBpbiBzZWxmLnJ1bnFfZGVwZW5kc1t0YXNrXToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlRhc2sgJXMgKCVzICVzKSBjb250YWlucyBzZWxmIHJlZmVyZW5jZSEgJXMiLCB0YXNrLCB0YXNrRGF0YS5mbl9pbmRleFt0YXNrRGF0YS50YXNrc19mbmlkW3Rhc2tdXSwgdGFza0RhdGEudGFza3NfbmFtZVt0YXNrXSwgc2VsZi5ydW5xX2RlcGVuZHNbdGFza10pCisgICAgICAgICAgICAgICAgc2VsZi5ydW5xX2RlcGVuZHNbdGFza10ucmVtb3ZlKHRhc2spCisKKyAgICAgICAgIyBTdGVwIEIgLSBNYXJrIGFsbCBhY3RpdmUgdGFza3MKKyAgICAgICAgIworICAgICAgICAjIFN0YXJ0IHdpdGggdGhlIHRhc2tzIHdlIHdlcmUgYXNrZWQgdG8gcnVuIGFuZCBtYXJrIGFsbCBkZXBlbmRlbmNpZXMKKyAgICAgICAgIyBhcyBhY3RpdmUgdG9vLiBJZiB0aGUgdGFzayBpcyB0byBiZSAnZm9yY2VkJywgY2xlYXIgaXRzIHN0YW1wLiBPbmNlCisgICAgICAgICMgYWxsIGFjdGl2ZSB0YXNrcyBhcmUgbWFya2VkLCBwcnVuZSB0aGUgb25lcyB3ZSBkb24ndCBuZWVkLgorCisgICAgICAgIGxvZ2dlci52ZXJib3NlKCJNYXJraW5nIEFjdGl2ZSBUYXNrcyIpCisKKyAgICAgICAgZGVmIG1hcmtfYWN0aXZlKGxpc3RpZCwgZGVwdGgpOgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBNYXJrIGFuIGl0ZW0gYXMgYWN0aXZlIGFsb25nIHdpdGggaXRzIGRlcGVuZHMKKyAgICAgICAgICAgIChjYWxscyBpdHNlbGYgcmVjdXJzaXZlbHkpCisgICAgICAgICAgICAiIiIKKworICAgICAgICAgICAgaWYgcnVucV9idWlsZFtsaXN0aWRdID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHJ1bnFfYnVpbGRbbGlzdGlkXSA9IDEKKworICAgICAgICAgICAgZGVwZW5kcyA9IHNlbGYucnVucV9kZXBlbmRzW2xpc3RpZF0KKyAgICAgICAgICAgIGZvciBkZXBlbmQgaW4gZGVwZW5kczoKKyAgICAgICAgICAgICAgICBtYXJrX2FjdGl2ZShkZXBlbmQsIGRlcHRoKzEpCisKKyAgICAgICAgc2VsZi50YXJnZXRfcGFpcnMgPSBbXQorICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYudGFyZ2V0czoKKyAgICAgICAgICAgIHRhcmdldGlkID0gdGFza0RhdGEuZ2V0YnVpbGRfaWQodGFyZ2V0WzBdKQorCisgICAgICAgICAgICBpZiB0YXJnZXRpZCBub3QgaW4gdGFza0RhdGEuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiB0YXJnZXRpZCBpbiB0YXNrRGF0YS5mYWlsZWRfZGVwczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmbmlkID0gdGFza0RhdGEuYnVpbGRfdGFyZ2V0c1t0YXJnZXRpZF1bMF0KKyAgICAgICAgICAgIGZuID0gdGFza0RhdGEuZm5faW5kZXhbZm5pZF0KKyAgICAgICAgICAgIHNlbGYudGFyZ2V0X3BhaXJzLmFwcGVuZCgoZm4sIHRhcmdldFsxXSkpCisKKyAgICAgICAgICAgIGlmIGZuaWQgaW4gdGFza0RhdGEuZmFpbGVkX2ZuaWRzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHRhcmdldFsxXSBub3QgaW4gdGFza0RhdGEudGFza3NfbG9va3VwW2ZuaWRdOgorICAgICAgICAgICAgICAgIGltcG9ydCBkaWZmbGliCisgICAgICAgICAgICAgICAgY2xvc2VfbWF0Y2hlcyA9IGRpZmZsaWIuZ2V0X2Nsb3NlX21hdGNoZXModGFyZ2V0WzFdLCB0YXNrRGF0YS50YXNrc19sb29rdXBbZm5pZF0sIGN1dG9mZj0wLjcpCisgICAgICAgICAgICAgICAgaWYgY2xvc2VfbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSAiLiBDbG9zZSBtYXRjaGVzOlxuICAlcyIgJSAiXG4gICIuam9pbihjbG9zZV9tYXRjaGVzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gIiIKKyAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgIlRhc2sgJXMgZG9lcyBub3QgZXhpc3QgZm9yIHRhcmdldCAlcyVzIiAlICh0YXJnZXRbMV0sIHRhcmdldFswXSwgZXh0cmEpKQorCisgICAgICAgICAgICBsaXN0aWQgPSB0YXNrRGF0YS50YXNrc19sb29rdXBbZm5pZF1bdGFyZ2V0WzFdXQorCisgICAgICAgICAgICBtYXJrX2FjdGl2ZShsaXN0aWQsIDEpCisKKyAgICAgICAgIyBTdGVwIEMgLSBQcnVuZSBhbGwgaW5hY3RpdmUgdGFza3MKKyAgICAgICAgIworICAgICAgICAjIE9uY2UgYWxsIGFjdGl2ZSB0YXNrcyBhcmUgbWFya2VkLCBwcnVuZSB0aGUgb25lcyB3ZSBkb24ndCBuZWVkLgorCisgICAgICAgIG1hcHMgPSBbXQorICAgICAgICBkZWxjb3VudCA9IDAKKyAgICAgICAgZm9yIGxpc3RpZCBpbiB4cmFuZ2UobGVuKHNlbGYucnVucV9mbmlkKSk6CisgICAgICAgICAgICBpZiBydW5xX2J1aWxkW2xpc3RpZC1kZWxjb3VudF0gPT0gMToKKyAgICAgICAgICAgICAgICBtYXBzLmFwcGVuZChsaXN0aWQtZGVsY291bnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnJ1bnFfZm5pZFtsaXN0aWQtZGVsY291bnRdCisgICAgICAgICAgICAgICAgZGVsIHNlbGYucnVucV90YXNrW2xpc3RpZC1kZWxjb3VudF0KKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5ydW5xX2RlcGVuZHNbbGlzdGlkLWRlbGNvdW50XQorICAgICAgICAgICAgICAgIGRlbCBydW5xX2J1aWxkW2xpc3RpZC1kZWxjb3VudF0KKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5ydW5xX3JldmRlcHNbbGlzdGlkLWRlbGNvdW50XQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnJ1bnFfaGFzaFtsaXN0aWQtZGVsY291bnRdCisgICAgICAgICAgICAgICAgZGVsY291bnQgPSBkZWxjb3VudCArIDEKKyAgICAgICAgICAgICAgICBtYXBzLmFwcGVuZCgtMSkKKworICAgICAgICAjCisgICAgICAgICMgU3RlcCBEIC0gU2FuaXR5IGNoZWNrcyBhbmQgY29tcHV0YXRpb24KKyAgICAgICAgIworCisgICAgICAgICMgQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIHN0aWxsIGhhdmUgdGFza3MgdG8gcnVuCisgICAgICAgIGlmIGxlbihzZWxmLnJ1bnFfZm5pZCkgPT0gMDoKKyAgICAgICAgICAgIGlmIG5vdCB0YXNrRGF0YS5hYm9ydDoKKyAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgIkFsbCBidWlsZGFibGUgdGFza3MgaGF2ZSBiZWVuIHJ1biBidXQgdGhlIGJ1aWxkIGlzIGluY29tcGxldGUgKC0tY29udGludWUgbW9kZSkuIEVycm9ycyBmb3IgdGhlIHRhc2tzIHRoYXQgZmFpbGVkIHdpbGwgaGF2ZSBiZWVuIHByaW50ZWQgYWJvdmUuIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJObyBhY3RpdmUgdGFza3MgYW5kIG5vdCBpbiAtLWNvbnRpbnVlIG1vZGU/ISBQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLiIpCisKKyAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIlBydW5lZCAlcyBpbmFjdGl2ZSB0YXNrcywgJXMgbGVmdCIsIGRlbGNvdW50LCBsZW4oc2VsZi5ydW5xX2ZuaWQpKQorCisgICAgICAgICMgUmVtYXAgdGhlIGRlcGVuZGVuY2llcyB0byBhY2NvdW50IGZvciB0aGUgZGVsZXRlZCB0YXNrcworICAgICAgICAjIENoZWNrIHdlIGRpZG4ndCBkZWxldGUgYSB0YXNrIHdlIGRlcGVuZCBvbgorICAgICAgICBmb3IgbGlzdGlkIGluIHhyYW5nZShsZW4oc2VsZi5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIG5ld2RlcHMgPSBbXQorICAgICAgICAgICAgb3JpZ2RlcHMgPSBzZWxmLnJ1bnFfZGVwZW5kc1tsaXN0aWRdCisgICAgICAgICAgICBmb3Igb3JpZ2RlcCBpbiBvcmlnZGVwczoKKyAgICAgICAgICAgICAgICBpZiBtYXBzW29yaWdkZXBdID09IC0xOgorICAgICAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgIkludmFsaWQgbWFwcGluZyAtIFNob3VsZCBuZXZlciBoYXBwZW4hIikKKyAgICAgICAgICAgICAgICBuZXdkZXBzLmFwcGVuZChtYXBzW29yaWdkZXBdKQorICAgICAgICAgICAgc2VsZi5ydW5xX2RlcGVuZHNbbGlzdGlkXSA9IHNldChuZXdkZXBzKQorCisgICAgICAgIGxvZ2dlci52ZXJib3NlKCJBc3NpZ24gV2VpZ2h0aW5ncyIpCisKKyAgICAgICAgIyBHZW5lcmF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBkZXBlbmRlbmNpZXMgdG8gZWFzZSBmdXR1cmUgY2FsY3VsYXRpb25zCisgICAgICAgIGZvciBsaXN0aWQgaW4geHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJ1bnFfZGVwZW5kc1tsaXN0aWRdOgorICAgICAgICAgICAgICAgIHNlbGYucnVucV9yZXZkZXBzW2RlcF0uYWRkKGxpc3RpZCkKKworICAgICAgICAjIElkZW50aWZ5IHRhc2tzIGF0IHRoZSBlbmQgb2YgZGVwZW5kZW5jeSBjaGFpbnMKKyAgICAgICAgIyBFcnJvciBvbiBjaXJjdWxhciBkZXBlbmRlbmN5IGxvb3BzIChsZW5ndGggdHdvKQorICAgICAgICBlbmRwb2ludHMgPSBbXQorICAgICAgICBmb3IgbGlzdGlkIGluIHhyYW5nZShsZW4oc2VsZi5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIHJldmRlcHMgPSBzZWxmLnJ1bnFfcmV2ZGVwc1tsaXN0aWRdCisgICAgICAgICAgICBpZiBsZW4ocmV2ZGVwcykgPT0gMDoKKyAgICAgICAgICAgICAgICBlbmRwb2ludHMuYXBwZW5kKGxpc3RpZCkKKyAgICAgICAgICAgIGZvciBkZXAgaW4gcmV2ZGVwczoKKyAgICAgICAgICAgICAgICBpZiBkZXAgaW4gc2VsZi5ydW5xX2RlcGVuZHNbbGlzdGlkXToKKyAgICAgICAgICAgICAgICAgICAgI3NlbGYuZHVtcF9kYXRhKHRhc2tEYXRhKQorICAgICAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgIlRhc2sgJXMgKCVzKSBoYXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBvbiAlcyAoJXMpIiAlICh0YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJ1bnFfZm5pZFtkZXBdXSwgc2VsZi5ydW5xX3Rhc2tbZGVwXSwgdGFza0RhdGEuZm5faW5kZXhbc2VsZi5ydW5xX2ZuaWRbbGlzdGlkXV0sIHNlbGYucnVucV90YXNrW2xpc3RpZF0pKQorCisgICAgICAgIGxvZ2dlci52ZXJib3NlKCJDb21wdXRlIHRvdGFscyAoaGF2ZSAlcyBlbmRwb2ludChzKSkiLCBsZW4oZW5kcG9pbnRzKSkKKworICAgICAgICAjIENhbGN1bGF0ZSB0YXNrIHdlaWdodHMKKyAgICAgICAgIyBDaGVjayBvZiBoaWdoZXIgbGVuZ3RoIGNpcmN1bGFyIGRlcGVuZGVuY2llcworICAgICAgICBzZWxmLnJ1bnFfd2VpZ2h0ID0gc2VsZi5jYWxjdWxhdGVfdGFza193ZWlnaHRzKGVuZHBvaW50cykKKworICAgICAgICAjIFNhbml0eSBDaGVjayAtIENoZWNrIGZvciBtdWx0aXBsZSB0YXNrcyBidWlsZGluZyB0aGUgc2FtZSBwcm92aWRlcgorICAgICAgICBwcm92X2xpc3QgPSB7fQorICAgICAgICBzZWVuX2ZuID0gW10KKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgZm4gPSB0YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgICAgIGlmIGZuIGluIHNlZW5fZm46CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlZW5fZm4uYXBwZW5kKGZuKQorICAgICAgICAgICAgZm9yIHByb3YgaW4gc2VsZi5kYXRhQ2FjaGUuZm5fcHJvdmlkZXNbZm5dOgorICAgICAgICAgICAgICAgIGlmIHByb3Ygbm90IGluIHByb3ZfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdl9saXN0W3Byb3ZdID0gW2ZuXQorICAgICAgICAgICAgICAgIGVsaWYgZm4gbm90IGluIHByb3ZfbGlzdFtwcm92XToKKyAgICAgICAgICAgICAgICAgICAgcHJvdl9saXN0W3Byb3ZdLmFwcGVuZChmbikKKyAgICAgICAgZm9yIHByb3YgaW4gcHJvdl9saXN0OgorICAgICAgICAgICAgaWYgbGVuKHByb3ZfbGlzdFtwcm92XSkgPiAxIGFuZCBwcm92IG5vdCBpbiBzZWxmLm11bHRpX3Byb3ZpZGVyX3doaXRlbGlzdDoKKyAgICAgICAgICAgICAgICBzZWVuX3BuID0gW10KKyAgICAgICAgICAgICAgICAjIElmIHR3byB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBQTiBhcmUgYmVpbmcgYnVpbHQgaXRzIGZhdGFsLCB3ZSBkb24ndCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgICAgIGZvciBmbiBpbiBwcm92X2xpc3RbcHJvdl06CisgICAgICAgICAgICAgICAgICAgIHBuID0gc2VsZi5kYXRhQ2FjaGUucGtnX2ZuW2ZuXQorICAgICAgICAgICAgICAgICAgICBpZiBwbiBub3QgaW4gc2Vlbl9wbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5fcG4uYXBwZW5kKHBuKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYmIuZmF0YWwoIk11bHRpcGxlIHZlcnNpb25zIG9mICVzIGFyZSBkdWUgdG8gYmUgYnVpbHQgKCVzKS4gT25seSBvbmUgdmVyc2lvbiBvZiBhIGdpdmVuIFBOIHNob3VsZCBiZSBidWlsdCBpbiBhbnkgZ2l2ZW4gYnVpbGQuIFlvdSBsaWtlbHkgbmVlZCB0byBzZXQgUFJFRkVSUkVEX1ZFUlNJT05fJXMgdG8gc2VsZWN0IHRoZSBjb3JyZWN0IHZlcnNpb24gb3IgZG9uJ3QgZGVwZW5kIG9uIG11bHRpcGxlIHZlcnNpb25zLiIgJSAocG4sICIgIi5qb2luKHByb3ZfbGlzdFtwcm92XSksIHBuKSkKKyAgICAgICAgICAgICAgICBtc2cgPSAiTXVsdGlwbGUgLmJiIGZpbGVzIGFyZSBkdWUgdG8gYmUgYnVpbHQgd2hpY2ggZWFjaCBwcm92aWRlICVzICglcykuIiAlIChwcm92LCAiICIuam9pbihwcm92X2xpc3RbcHJvdl0pKQorICAgICAgICAgICAgICAgIGlmIHNlbGYud2Fybl9tdWx0aV9iYjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obXNnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiXG4gVGhpcyB1c3VhbGx5IG1lYW5zIG9uZSBwcm92aWRlcyBzb21ldGhpbmcgdGhlIG90aGVyIGRvZXNuJ3QgYW5kIHNob3VsZC4iCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtc2cpCisKKyAgICAgICAgIyBDcmVhdGUgYSB3aGl0ZWxpc3QgdXNhYmxlIGJ5IHRoZSBzdGFtcCBjaGVja3MKKyAgICAgICAgc3RhbXBmbndoaXRlbGlzdCA9IFtdCisgICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLnN0YW1wd2hpdGVsaXN0LnNwbGl0KCk6CisgICAgICAgICAgICBlbnRyeWlkID0gc2VsZi50YXNrRGF0YS5nZXRidWlsZF9pZChlbnRyeSkKKyAgICAgICAgICAgIGlmIGVudHJ5aWQgbm90IGluIHNlbGYudGFza0RhdGEuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm5pZCA9IHNlbGYudGFza0RhdGEuYnVpbGRfdGFyZ2V0c1tlbnRyeWlkXVswXQorICAgICAgICAgICAgZm4gPSBzZWxmLnRhc2tEYXRhLmZuX2luZGV4W2ZuaWRdCisgICAgICAgICAgICBzdGFtcGZud2hpdGVsaXN0LmFwcGVuZChmbikKKyAgICAgICAgc2VsZi5zdGFtcGZud2hpdGVsaXN0ID0gc3RhbXBmbndoaXRlbGlzdAorCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIHRoZSB0YXNrIGxpc3QgbG9va2luZyBmb3IgdGFza3Mgd2l0aCBhICdzZXRzY2VuZScgZnVuY3Rpb24KKyAgICAgICAgc2VsZi5ydW5xX3NldHNjZW5lID0gW10KKyAgICAgICAgaWYgbm90IHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24ubm9zZXRzY2VuZToKKyAgICAgICAgICAgIGZvciB0YXNrIGluIHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgICAgIHNldHNjZW5lID0gdGFza0RhdGEuZ2V0dGFza19pZChzZWxmLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW3Rhc2tdXSwgc2VsZi5ydW5xX3Rhc2tbdGFza10gKyAiX3NldHNjZW5lIiwgRmFsc2UpCisgICAgICAgICAgICAgICAgaWYgbm90IHNldHNjZW5lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYucnVucV9zZXRzY2VuZS5hcHBlbmQodGFzaykKKworICAgICAgICBkZWYgaW52YWxpZGF0ZV90YXNrKGZuLCB0YXNrbmFtZSwgZXJyb3Jfbm9zdGFtcCk6CisgICAgICAgICAgICB0YXNrZGVwID0gc2VsZi5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorICAgICAgICAgICAgZm5pZCA9IHNlbGYudGFza0RhdGEuZ2V0Zm5faWQoZm4pCisgICAgICAgICAgICBpZiB0YXNrbmFtZSBub3QgaW4gdGFza0RhdGEudGFza3NfbG9va3VwW2ZuaWRdOgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJUYXNrICVzIGRvZXMgbm90IGV4aXN0LCBpbnZhbGlkYXRpbmcgdGhpcyB0YXNrIHdpbGwgaGF2ZSBubyBlZmZlY3QiICUgdGFza25hbWUpCisgICAgICAgICAgICBpZiAnbm9zdGFtcCcgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnbm9zdGFtcCddOgorICAgICAgICAgICAgICAgIGlmIGVycm9yX25vc3RhbXA6CisgICAgICAgICAgICAgICAgICAgIGJiLmZhdGFsKCJUYXNrICVzIGlzIG1hcmtlZCBub3N0YW1wLCBjYW5ub3QgaW52YWxpZGF0ZSB0aGlzIHRhc2siICUgdGFza25hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYmIuZGVidWcoMSwgIlRhc2sgJXMgaXMgbWFya2VkIG5vc3RhbXAsIGNhbm5vdCBpbnZhbGlkYXRlIHRoaXMgdGFzayIgJSB0YXNrbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoIkludmFsaWRhdGUgdGFzayAlcywgJXMiLCB0YXNrbmFtZSwgZm4pCisgICAgICAgICAgICAgICAgYmIucGFyc2Uuc2lnZ2VuLmludmFsaWRhdGVfdGFzayh0YXNrbmFtZSwgc2VsZi5kYXRhQ2FjaGUsIGZuKQorCisgICAgICAgICMgSW52YWxpZGF0ZSB0YXNrIGlmIGZvcmNlIG1vZGUgYWN0aXZlCisgICAgICAgIGlmIHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24uZm9yY2U6CisgICAgICAgICAgICBmb3IgKGZuLCB0YXJnZXQpIGluIHNlbGYudGFyZ2V0X3BhaXJzOgorICAgICAgICAgICAgICAgIGludmFsaWRhdGVfdGFzayhmbiwgdGFyZ2V0LCBGYWxzZSkKKworICAgICAgICAjIEludmFsaWRhdGUgdGFzayBpZiBpbnZhbGlkYXRlIG1vZGUgYWN0aXZlCisgICAgICAgIGlmIHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24uaW52YWxpZGF0ZV9zdGFtcDoKKyAgICAgICAgICAgIGZvciAoZm4sIHRhcmdldCkgaW4gc2VsZi50YXJnZXRfcGFpcnM6CisgICAgICAgICAgICAgICAgZm9yIHN0IGluIHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24uaW52YWxpZGF0ZV9zdGFtcC5zcGxpdCgnLCcpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3Quc3RhcnRzd2l0aCgiZG9fIik6CisgICAgICAgICAgICAgICAgICAgICAgICBzdCA9ICJkb18lcyIgJSBzdAorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX3Rhc2soZm4sIHN0LCBUcnVlKQorCisgICAgICAgICMgSXRlcmF0ZSBvdmVyIHRoZSB0YXNrIGxpc3QgYW5kIGNhbGwgaW50byB0aGUgc2lnZ2VuIGNvZGUKKyAgICAgICAgZGVhbHR3aXRoID0gc2V0KCkKKyAgICAgICAgdG9kZWFsID0gc2V0KHJhbmdlKGxlbihzZWxmLnJ1bnFfZm5pZCkpKQorICAgICAgICB3aGlsZSBsZW4odG9kZWFsKSA+IDA6CisgICAgICAgICAgICBmb3IgdGFzayBpbiB0b2RlYWwuY29weSgpOgorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnJ1bnFfZGVwZW5kc1t0YXNrXSAtIGRlYWx0d2l0aCkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgZGVhbHR3aXRoLmFkZCh0YXNrKQorICAgICAgICAgICAgICAgICAgICB0b2RlYWwucmVtb3ZlKHRhc2spCisgICAgICAgICAgICAgICAgICAgIHByb2NkZXAgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgZGVwIGluIHNlbGYucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2RlcC5hcHBlbmQoc2VsZi50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJ1bnFfZm5pZFtkZXBdXSArICIuIiArIHNlbGYucnVucV90YXNrW2RlcF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYucnVucV9oYXNoW3Rhc2tdID0gYmIucGFyc2Uuc2lnZ2VuLmdldF90YXNraGFzaChzZWxmLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnVucV9mbmlkW3Rhc2tdXSwgc2VsZi5ydW5xX3Rhc2tbdGFza10sIHByb2NkZXAsIHNlbGYuZGF0YUNhY2hlKQorCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5ydW5xX2ZuaWQpCisKKyAgICBkZWYgZHVtcF9kYXRhKHNlbGYsIHRhc2tRdWV1ZSk6CisgICAgICAgICIiIgorICAgICAgICBEdW1wIHNvbWUgZGVidWcgaW5mb3JtYXRpb24gb24gdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICJydW5fdGFza3M6IikKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX3Rhc2spKToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiICglcyklcyAtICVzOiAlcyAgIERlcHMgJXMgUmV2RGVwcyAlcyIsIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1F1ZXVlLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLnJ1bnFfd2VpZ2h0W3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLnJ1bnFfZGVwZW5kc1t0YXNrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICJzb3J0ZWRfdGFza3M6IikKKyAgICAgICAgZm9yIHRhc2sxIGluIHhyYW5nZShsZW4oc2VsZi5ycWRhdGEucnVucV90YXNrKSk6CisgICAgICAgICAgICBpZiB0YXNrMSBpbiBzZWxmLnByaW9fbWFwOgorICAgICAgICAgICAgICAgIHRhc2sgPSBzZWxmLnByaW9fbWFwW3Rhc2sxXQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiICglcyklcyAtICVzOiAlcyAgIERlcHMgJXMgUmV2RGVwcyAlcyIsIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUXVldWUuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnFkYXRhLnJ1bnFfd2VpZ2h0W3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEucnVucV9yZXZkZXBzW3Rhc2tdKQorCitjbGFzcyBSdW5RdWV1ZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29va2VyLCBjZmdEYXRhLCBkYXRhQ2FjaGUsIHRhc2tEYXRhLCB0YXJnZXRzKToKKworICAgICAgICBzZWxmLmNvb2tlciA9IGNvb2tlcgorICAgICAgICBzZWxmLmNmZ0RhdGEgPSBjZmdEYXRhCisgICAgICAgIHNlbGYucnFkYXRhID0gUnVuUXVldWVEYXRhKHNlbGYsIGNvb2tlciwgY2ZnRGF0YSwgZGF0YUNhY2hlLCB0YXNrRGF0YSwgdGFyZ2V0cykKKworICAgICAgICBzZWxmLnN0YW1wcG9saWN5ID0gY2ZnRGF0YS5nZXRWYXIoIkJCX1NUQU1QX1BPTElDWSIsIFRydWUpIG9yICJwZXJmaWxlIgorICAgICAgICBzZWxmLmhhc2h2YWxpZGF0ZSA9IGNmZ0RhdGEuZ2V0VmFyKCJCQl9IQVNIQ0hFQ0tfRlVOQ1RJT04iLCBUcnVlKSBvciBOb25lCisgICAgICAgIHNlbGYuc2V0c2NlbmV2ZXJpZnkgPSBjZmdEYXRhLmdldFZhcigiQkJfU0VUU0NFTkVfVkVSSUZZX0ZVTkNUSU9OIiwgVHJ1ZSkgb3IgTm9uZQorICAgICAgICBzZWxmLmRlcHZhbGlkYXRlID0gY2ZnRGF0YS5nZXRWYXIoIkJCX1NFVFNDRU5FX0RFUFZBTElEIiwgVHJ1ZSkgb3IgTm9uZQorCisgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZVByZXBhcmUKKworICAgICAgICAjIEZvciBkaXNrIHNwYWNlIG1vbml0b3IKKyAgICAgICAgc2VsZi5kbSA9IG1vbml0b3JkaXNrLmRpc2tNb25pdG9yKGNmZ0RhdGEpCisKKyAgICAgICAgc2VsZi5ycWV4ZSA9IE5vbmUKKyAgICAgICAgc2VsZi53b3JrZXIgPSBOb25lCisgICAgICAgIHNlbGYud29ya2VycGlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5mYWtld29ya2VyID0gTm9uZQorICAgICAgICBzZWxmLmZha2V3b3JrZXJwaXBlID0gTm9uZQorCisgICAgZGVmIF9zdGFydF93b3JrZXIoc2VsZiwgZmFrZXJvb3QgPSBGYWxzZSwgcnFleGVjID0gTm9uZSk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiU3RhcnRpbmcgYml0YmFrZS13b3JrZXIiKQorICAgICAgICBtYWdpYyA9ICJkZWNhZmJhZCIKKyAgICAgICAgaWYgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5wcm9maWxlOgorICAgICAgICAgICAgbWFnaWMgPSAiZGVjYWZiYWRiYWQiCisgICAgICAgIGlmIGZha2Vyb290OgorICAgICAgICAgICAgZmFrZXJvb3RjbWQgPSBzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJGQUtFUk9PVENNRCIsIFRydWUpCisgICAgICAgICAgICBmYWtlcm9vdGVudiA9IChzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJGQUtFUk9PVEJBU0VFTlYiLCBUcnVlKSBvciAiIikuc3BsaXQoKQorICAgICAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluICh2YXIuc3BsaXQoJz0nKSBmb3IgdmFyIGluIGZha2Vyb290ZW52KToKKyAgICAgICAgICAgICAgICBlbnZba2V5XSA9IHZhbHVlCisgICAgICAgICAgICB3b3JrZXIgPSBzdWJwcm9jZXNzLlBvcGVuKFtmYWtlcm9vdGNtZCwgImJpdGJha2Utd29ya2VyIiwgbWFnaWNdLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIGVudj1lbnYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3b3JrZXIgPSBzdWJwcm9jZXNzLlBvcGVuKFsiYml0YmFrZS13b3JrZXIiLCBtYWdpY10sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgYmIudXRpbHMubm9uYmxvY2tpbmdmZCh3b3JrZXIuc3Rkb3V0KQorICAgICAgICB3b3JrZXJwaXBlID0gcnVuUXVldWVQaXBlKHdvcmtlci5zdGRvdXQsIE5vbmUsIHNlbGYuY2ZnRGF0YSwgc2VsZiwgcnFleGVjKQorCisgICAgICAgIHdvcmtlcmRhdGEgPSB7CisgICAgICAgICAgICAidGFza2RlcHMiIDogc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnRhc2tfZGVwcywKKyAgICAgICAgICAgICJmYWtlcm9vdGVudiIgOiBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUuZmFrZXJvb3RlbnYsCisgICAgICAgICAgICAiZmFrZXJvb3RkaXJzIiA6IHNlbGYucnFkYXRhLmRhdGFDYWNoZS5mYWtlcm9vdGRpcnMsCisgICAgICAgICAgICAiZmFrZXJvb3Rub2VudiIgOiBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUuZmFrZXJvb3Rub2VudiwKKyAgICAgICAgICAgICJzaWdkYXRhIiA6IGJiLnBhcnNlLnNpZ2dlbi5nZXRfdGFza2RhdGEoKSwKKyAgICAgICAgICAgICJydW5xX2hhc2giIDogc2VsZi5ycWRhdGEucnVucV9oYXNoLAorICAgICAgICAgICAgImxvZ2RlZmF1bHRkZWJ1ZyIgOiBiYi5tc2cubG9nZ2VyRGVmYXVsdERlYnVnTGV2ZWwsCisgICAgICAgICAgICAibG9nZGVmYXVsdHZlcmJvc2UiIDogYmIubXNnLmxvZ2dlckRlZmF1bHRWZXJib3NlLAorICAgICAgICAgICAgImxvZ2RlZmF1bHR2ZXJib3NlbG9ncyIgOiBiYi5tc2cubG9nZ2VyVmVyYm9zZUxvZ3MsCisgICAgICAgICAgICAibG9nZGVmYXVsdGRvbWFpbiIgOiBiYi5tc2cubG9nZ2VyRGVmYXVsdERvbWFpbnMsCisgICAgICAgICAgICAicHJob3N0IiA6IHNlbGYuY29va2VyLnByaG9zdCwKKyAgICAgICAgICAgICJidWlsZG5hbWUiIDogc2VsZi5jZmdEYXRhLmdldFZhcigiQlVJTEROQU1FIiwgVHJ1ZSksCisgICAgICAgICAgICAiZGF0ZSIgOiBzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJEQVRFIiwgVHJ1ZSksCisgICAgICAgICAgICAidGltZSIgOiBzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJUSU1FIiwgVHJ1ZSksCisgICAgICAgIH0KKworICAgICAgICB3b3JrZXIuc3RkaW4ud3JpdGUoIjxjb29rZXJjb25maWc+IiArIHBpY2tsZS5kdW1wcyhzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uKSArICI8L2Nvb2tlcmNvbmZpZz4iKQorICAgICAgICB3b3JrZXIuc3RkaW4ud3JpdGUoIjx3b3JrZXJkYXRhPiIgKyBwaWNrbGUuZHVtcHMod29ya2VyZGF0YSkgKyAiPC93b3JrZXJkYXRhPiIpCisgICAgICAgIHdvcmtlci5zdGRpbi5mbHVzaCgpCisKKyAgICAgICAgcmV0dXJuIHdvcmtlciwgd29ya2VycGlwZQorCisgICAgZGVmIF90ZWFyZG93bl93b3JrZXIoc2VsZiwgd29ya2VyLCB3b3JrZXJwaXBlKToKKyAgICAgICAgaWYgbm90IHdvcmtlcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBsb2dnZXIuZGVidWcoMSwgIlRlYXJkb3duIGZvciBiaXRiYWtlLXdvcmtlciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgd29ya2VyLnN0ZGluLndyaXRlKCI8cXVpdD48L3F1aXQ+IikKKyAgICAgICAgICAgd29ya2VyLnN0ZGluLmZsdXNoKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2hpbGUgd29ya2VyLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHdvcmtlcnBpcGUucmVhZCgpCisgICAgICAgICAgICB3b3JrZXIucG9sbCgpCisgICAgICAgIHdoaWxlIHdvcmtlcnBpcGUucmVhZCgpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgd29ya2VycGlwZS5jbG9zZSgpCisKKyAgICBkZWYgc3RhcnRfd29ya2VyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLndvcmtlcjoKKyAgICAgICAgICAgIHNlbGYudGVhcmRvd25fd29ya2VycygpCisgICAgICAgIHNlbGYudGVhcmRvd24gPSBGYWxzZQorICAgICAgICBzZWxmLndvcmtlciwgc2VsZi53b3JrZXJwaXBlID0gc2VsZi5fc3RhcnRfd29ya2VyKCkKKworICAgIGRlZiBzdGFydF9mYWtld29ya2VyKHNlbGYsIHJxZXhlYyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmZha2V3b3JrZXI6CisgICAgICAgICAgICBzZWxmLmZha2V3b3JrZXIsIHNlbGYuZmFrZXdvcmtlcnBpcGUgPSBzZWxmLl9zdGFydF93b3JrZXIoVHJ1ZSwgcnFleGVjKQorCisgICAgZGVmIHRlYXJkb3duX3dvcmtlcnMoc2VsZik6CisgICAgICAgIHNlbGYudGVhcmRvd24gPSBUcnVlCisgICAgICAgIHNlbGYuX3RlYXJkb3duX3dvcmtlcihzZWxmLndvcmtlciwgc2VsZi53b3JrZXJwaXBlKQorICAgICAgICBzZWxmLndvcmtlciA9IE5vbmUKKyAgICAgICAgc2VsZi53b3JrZXJwaXBlID0gTm9uZQorICAgICAgICBzZWxmLl90ZWFyZG93bl93b3JrZXIoc2VsZi5mYWtld29ya2VyLCBzZWxmLmZha2V3b3JrZXJwaXBlKQorICAgICAgICBzZWxmLmZha2V3b3JrZXIgPSBOb25lCisgICAgICAgIHNlbGYuZmFrZXdvcmtlcnBpcGUgPSBOb25lCisKKyAgICBkZWYgcmVhZF93b3JrZXJzKHNlbGYpOgorICAgICAgICBzZWxmLndvcmtlcnBpcGUucmVhZCgpCisgICAgICAgIGlmIHNlbGYuZmFrZXdvcmtlcnBpcGU6CisgICAgICAgICAgICBzZWxmLmZha2V3b3JrZXJwaXBlLnJlYWQoKQorCisgICAgZGVmIGFjdGl2ZV9mZHMoc2VsZik6CisgICAgICAgIGZkcyA9IFtdCisgICAgICAgIGlmIHNlbGYud29ya2VycGlwZToKKyAgICAgICAgICAgIGZkcy5hcHBlbmQoc2VsZi53b3JrZXJwaXBlLmlucHV0KQorICAgICAgICBpZiBzZWxmLmZha2V3b3JrZXJwaXBlOgorICAgICAgICAgICAgZmRzLmFwcGVuZChzZWxmLmZha2V3b3JrZXJwaXBlLmlucHV0KQorICAgICAgICByZXR1cm4gZmRzCisKKyAgICBkZWYgY2hlY2tfc3RhbXBfdGFzayhzZWxmLCB0YXNrLCB0YXNrbmFtZSA9IE5vbmUsIHJlY3Vyc2UgPSBGYWxzZSwgY2FjaGUgPSBOb25lKToKKyAgICAgICAgZGVmIGdldF90aW1lc3RhbXAoZik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhmLCBvcy5GX09LKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gb3Muc3RhdChmKVtzdGF0LlNUX01USU1FXQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc2VsZi5zdGFtcHBvbGljeSA9PSAicGVyZmlsZSI6CisgICAgICAgICAgICBmdWxsZGVwdHJlZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdWxsZGVwdHJlZSA9IFRydWUKKyAgICAgICAgICAgIHN0YW1wd2hpdGVsaXN0ID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuc3RhbXBwb2xpY3kgPT0gIndoaXRlbGlzdCI6CisgICAgICAgICAgICAgICAgc3RhbXB3aGl0ZWxpc3QgPSBzZWxmLnJxZGF0YS5zdGFtcGZud2hpdGVsaXN0CisKKyAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dCisgICAgICAgIGlmIHRhc2tuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXQorCisgICAgICAgIHN0YW1wZmlsZSA9IGJiLmJ1aWxkLnN0YW1wZmlsZSh0YXNrbmFtZSwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbikKKworICAgICAgICAjIElmIHRoZSBzdGFtcCBpcyBtaXNzaW5nLCBpdCdzIG5vdCBjdXJyZW50CisgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Moc3RhbXBmaWxlLCBvcy5GX09LKToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiU3RhbXBmaWxlICVzIG5vdCBhdmFpbGFibGUiLCBzdGFtcGZpbGUpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgIyBJZiBpdCdzIGEgJ25vc3RhbXAnIHRhc2ssIGl0J3Mgbm90IGN1cnJlbnQKKyAgICAgICAgdGFza2RlcCA9IHNlbGYucnFkYXRhLmRhdGFDYWNoZS50YXNrX2RlcHNbZm5dCisgICAgICAgIGlmICdub3N0YW1wJyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydub3N0YW1wJ106CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIiVzLiVzIGlzIG5vc3RhbXBcbiIsIGZuLCB0YXNrbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIHRhc2tuYW1lICE9ICJkb19zZXRzY2VuZSIgYW5kIHRhc2tuYW1lLmVuZHN3aXRoKCJfc2V0c2NlbmUiKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaWYgY2FjaGUgaXMgTm9uZToKKyAgICAgICAgICAgIGNhY2hlID0ge30KKworICAgICAgICBpc2N1cnJlbnQgPSBUcnVlCisgICAgICAgIHQxID0gZ2V0X3RpbWVzdGFtcChzdGFtcGZpbGUpCisgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgaWYgaXNjdXJyZW50OgorICAgICAgICAgICAgICAgIGZuMiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFtkZXBdXQorICAgICAgICAgICAgICAgIHRhc2tuYW1lMiA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1tkZXBdCisgICAgICAgICAgICAgICAgc3RhbXBmaWxlMiA9IGJiLmJ1aWxkLnN0YW1wZmlsZSh0YXNrbmFtZTIsIHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgZm4yKQorICAgICAgICAgICAgICAgIHN0YW1wZmlsZTMgPSBiYi5idWlsZC5zdGFtcGZpbGUodGFza25hbWUyICsgIl9zZXRzY2VuZSIsIHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgZm4yKQorICAgICAgICAgICAgICAgIHQyID0gZ2V0X3RpbWVzdGFtcChzdGFtcGZpbGUyKQorICAgICAgICAgICAgICAgIHQzID0gZ2V0X3RpbWVzdGFtcChzdGFtcGZpbGUzKQorICAgICAgICAgICAgICAgIGlmIHQzIGFuZCB0MyA+IHQyOgorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgZm4gPT0gZm4yIG9yIChmdWxsZGVwdHJlZSBhbmQgZm4yIG5vdCBpbiBzdGFtcHdoaXRlbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB0MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnU3RhbXBmaWxlICVzIGRvZXMgbm90IGV4aXN0Jywgc3RhbXBmaWxlMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzY3VycmVudCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIHQxIDwgdDI6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ1N0YW1wZmlsZSAlcyA8ICVzJywgc3RhbXBmaWxlLCBzdGFtcGZpbGUyKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNjdXJyZW50ID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVjdXJzZSBhbmQgaXNjdXJyZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVwIGluIGNhY2hlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY3VycmVudCA9IGNhY2hlW2RlcF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNjdXJyZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ1N0YW1wZmlsZSBmb3IgZGVwZW5kZW5jeSAlczolcyBpbnZhbGlkIChjYWNoZWQpJyAlIChmbjIsIHRhc2tuYW1lMikpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzY3VycmVudCA9IHNlbGYuY2hlY2tfc3RhbXBfdGFzayhkZXAsIHJlY3Vyc2U9VHJ1ZSwgY2FjaGU9Y2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVbZGVwXSA9IGlzY3VycmVudAorICAgICAgICBpZiByZWN1cnNlOgorICAgICAgICAgICAgY2FjaGVbdGFza10gPSBpc2N1cnJlbnQKKyAgICAgICAgcmV0dXJuIGlzY3VycmVudAorCisgICAgZGVmIF9leGVjdXRlX3J1bnF1ZXVlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUnVuIHRoZSB0YXNrcyBpbiBhIHF1ZXVlIHByZXBhcmVkIGJ5IHJxZGF0YS5wcmVwYXJlKCkKKyAgICAgICAgVXBvbiBmYWlsdXJlLCBvcHRpb25hbGx5IHRyeSB0byByZWNvdmVyIHRoZSBidWlsZCB1c2luZyBhbnkgYWx0ZXJuYXRlIHByb3ZpZGVycworICAgICAgICAoaWYgdGhlIGFib3J0IG9uIGZhaWx1cmUgY29uZmlndXJhdGlvbiBvcHRpb24gaXNuJ3Qgc2V0KQorICAgICAgICAiIiIKKworICAgICAgICByZXR2YWwgPSBUcnVlCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZVByZXBhcmU6CisgICAgICAgICAgICBzZWxmLnJxZXhlID0gUnVuUXVldWVFeGVjdXRlRHVtbXkoc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYucnFkYXRhLnByZXBhcmUoKSA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZVNjZW5lSW5pdAorCisgICAgICAgICAgICAgICAgIyB3ZSBhcmUgcmVhZHkgdG8gcnVuLCBzZWUgaWYgYW55IFVJIGNsaWVudCBuZWVkcyB0aGUgZGVwZW5kZW5jeSBpbmZvCisgICAgICAgICAgICAgICAgaWYgYmIuY29va2VyLkNvb2tlckZlYXR1cmVzLlNFTkRfREVQRU5EU19UUkVFIGluIHNlbGYuY29va2VyLmZlYXR1cmVzZXQ6CisgICAgICAgICAgICAgICAgICAgIGRlcGdyYXBoID0gc2VsZi5jb29rZXIuYnVpbGREZXBlbmRUcmVlKHNlbGYsIHNlbGYucnFkYXRhLnRhc2tEYXRhKQorICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50LkRlcFRyZWVHZW5lcmF0ZWQoZGVwZ3JhcGgpLCBzZWxmLmNvb2tlci5kYXRhKQorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgaXMgcnVuUXVldWVTY2VuZUluaXQ6CisgICAgICAgICAgICBkdW1wID0gc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5kdW1wX3NpZ25hdHVyZXMKKyAgICAgICAgICAgIGlmIGR1bXA6CisgICAgICAgICAgICAgICAgaWYgJ3ByaW50ZGlmZicgaW4gZHVtcDoKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZHRhc2tzID0gc2VsZi5wcmludF9kaWZmc2NlbmV0YXNrcygpCisgICAgICAgICAgICAgICAgc2VsZi5kdW1wX3NpZ25hdHVyZXMoZHVtcCkKKyAgICAgICAgICAgICAgICBpZiAncHJpbnRkaWZmJyBpbiBkdW1wOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2RpZmZzY2VuZXRhc2tzKGludmFsaWR0YXNrcykKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gcnVuUXVldWVDb21wbGV0ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X3dvcmtlcigpCisgICAgICAgICAgICAgICAgc2VsZi5ycWV4ZSA9IFJ1blF1ZXVlRXhlY3V0ZVNjZW5lcXVldWUoc2VsZikKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGluIFtydW5RdWV1ZVNjZW5lUnVuLCBydW5RdWV1ZVJ1bm5pbmcsIHJ1blF1ZXVlQ2xlYW5VcF06CisgICAgICAgICAgICBzZWxmLmRtLmNoZWNrKHNlbGYpCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZVNjZW5lUnVuOgorICAgICAgICAgICAgcmV0dmFsID0gc2VsZi5ycWV4ZS5leGVjdXRlKCkKKworICAgICAgICBpZiBzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlUnVuSW5pdDoKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFeGVjdXRpbmcgUnVuUXVldWUgVGFza3MiKQorICAgICAgICAgICAgc2VsZi5ycWV4ZSA9IFJ1blF1ZXVlRXhlY3V0ZVRhc2tzKHNlbGYpCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gcnVuUXVldWVSdW5uaW5nCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZVJ1bm5pbmc6CisgICAgICAgICAgICByZXR2YWwgPSBzZWxmLnJxZXhlLmV4ZWN1dGUoKQorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgaXMgcnVuUXVldWVDbGVhblVwOgorICAgICAgICAgICAgcmV0dmFsID0gc2VsZi5ycWV4ZS5maW5pc2goKQorCisgICAgICAgIGlmIChzZWxmLnN0YXRlIGlzIHJ1blF1ZXVlQ29tcGxldGUgb3Igc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZUZhaWxlZCkgYW5kIHNlbGYucnFleGU6CisgICAgICAgICAgICBzZWxmLnRlYXJkb3duX3dvcmtlcnMoKQorICAgICAgICAgICAgaWYgc2VsZi5ycWV4ZS5zdGF0cy5mYWlsZWQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlRhc2tzIFN1bW1hcnk6IEF0dGVtcHRlZCAlZCB0YXNrcyBvZiB3aGljaCAlZCBkaWRuJ3QgbmVlZCB0byBiZSByZXJ1biBhbmQgJWQgZmFpbGVkLiIsIHNlbGYucnFleGUuc3RhdHMuY29tcGxldGVkICsgc2VsZi5ycWV4ZS5zdGF0cy5mYWlsZWQsIHNlbGYucnFleGUuc3RhdHMuc2tpcHBlZCwgc2VsZi5ycWV4ZS5zdGF0cy5mYWlsZWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTGV0J3MgYXZvaWQgdGhlIHdvcmQgImZhaWxlZCIgaWYgbm90aGluZyBhY3R1YWxseSBkaWQKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVGFza3MgU3VtbWFyeTogQXR0ZW1wdGVkICVkIHRhc2tzIG9mIHdoaWNoICVkIGRpZG4ndCBuZWVkIHRvIGJlIHJlcnVuIGFuZCBhbGwgc3VjY2VlZGVkLiIsIHNlbGYucnFleGUuc3RhdHMuY29tcGxldGVkLCBzZWxmLnJxZXhlLnN0YXRzLnNraXBwZWQpCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZUZhaWxlZDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJxZGF0YS50YXNrRGF0YS50cnlhbHRjb25maWdzOgorICAgICAgICAgICAgICAgIHJhaXNlIGJiLnJ1bnF1ZXVlLlRhc2tGYWlsdXJlKHNlbGYucnFleGUuZmFpbGVkX2ZuaWRzKQorICAgICAgICAgICAgZm9yIGZuaWQgaW4gc2VsZi5ycWV4ZS5mYWlsZWRfZm5pZHM6CisgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEudGFza0RhdGEuZmFpbF9mbmlkKGZuaWQpCisgICAgICAgICAgICBzZWxmLnJxZGF0YS5yZXNldCgpCisKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBydW5RdWV1ZUNvbXBsZXRlOgorICAgICAgICAgICAgIyBBbGwgZG9uZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBMb29wCisgICAgICAgIHJldHVybiByZXR2YWwKKworICAgIGRlZiBleGVjdXRlX3J1bnF1ZXVlKHNlbGYpOgorICAgICAgICAjIENhdGNoIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBhbmQgZW5zdXJlIHdlIGV4aXQgd2hlbiBhbiBlcnJvciBvY2N1cnMsIG5vdCBsb29wLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXhlY3V0ZV9ydW5xdWV1ZSgpCisgICAgICAgIGV4Y2VwdCBiYi5ydW5xdWV1ZS5UYXNrRmFpbHVyZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IGJiLkJCSGFuZGxlZEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRlYXJkb3duX3dvcmtlcnMoKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBvY2N1cmVkIGluIHJ1bnF1ZXVlLCBwbGVhc2Ugc2VlIHRoZSBmYWlsdXJlIGJlbG93OiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi50ZWFyZG93bl93b3JrZXJzKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gcnVuUXVldWVDb21wbGV0ZQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBmaW5pc2hfcnVucXVldWUoc2VsZiwgbm93ID0gRmFsc2UpOgorICAgICAgICBpZiBub3Qgc2VsZi5ycWV4ZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3c6CisgICAgICAgICAgICBzZWxmLnJxZXhlLmZpbmlzaF9ub3coKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ycWV4ZS5maW5pc2goKQorCisgICAgZGVmIGR1bXBfc2lnbmF0dXJlcyhzZWxmLCBvcHRpb25zKToKKyAgICAgICAgZG9uZSA9IHNldCgpCisgICAgICAgIGJiLm5vdGUoIlJlcGFyc2luZyBmaWxlcyB0byBjb2xsZWN0IGRlcGVuZGVuY3kgZGF0YSIpCisgICAgICAgIGZvciB0YXNrIGluIHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIGlmIHNlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXSBub3QgaW4gZG9uZToKKyAgICAgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgICAgICAgICB0aGVfZGF0YSA9IGJiLmNhY2hlLkNhY2hlLmxvYWREYXRhRnVsbChmbiwgc2VsZi5jb29rZXIuY29sbGVjdGlvbi5nZXRfZmlsZV9hcHBlbmRzKGZuKSwgc2VsZi5jb29rZXIuZGF0YSkKKyAgICAgICAgICAgICAgICBkb25lLmFkZChzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza10pCisKKyAgICAgICAgYmIucGFyc2Uuc2lnZ2VuLmR1bXBfc2lncyhzZWxmLnJxZGF0YS5kYXRhQ2FjaGUsIG9wdGlvbnMpCisKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcHJpbnRfZGlmZnNjZW5ldGFza3Moc2VsZik6CisKKyAgICAgICAgdmFsaWQgPSBbXQorICAgICAgICBzcV9oYXNoID0gW10KKyAgICAgICAgc3FfaGFzaGZuID0gW10KKyAgICAgICAgc3FfZm4gPSBbXQorICAgICAgICBzcV90YXNrbmFtZSA9IFtdCisgICAgICAgIHNxX3Rhc2sgPSBbXQorICAgICAgICBub2V4ZWMgPSBbXQorICAgICAgICBzdGFtcHByZXNlbnQgPSBbXQorICAgICAgICB2YWxpZF9uZXcgPSBzZXQoKQorCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5ycWRhdGEucnVucV9mbmlkKSk6CisgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFt0YXNrXV0KKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3Rhc2tdCisgICAgICAgICAgICB0YXNrZGVwID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKworICAgICAgICAgICAgaWYgJ25vZXhlYycgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnbm9leGVjJ106CisgICAgICAgICAgICAgICAgbm9leGVjLmFwcGVuZCh0YXNrKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHNxX2ZuLmFwcGVuZChmbikKKyAgICAgICAgICAgIHNxX2hhc2hmbi5hcHBlbmQoc2VsZi5ycWRhdGEuZGF0YUNhY2hlLmhhc2hmbltmbl0pCisgICAgICAgICAgICBzcV9oYXNoLmFwcGVuZChzZWxmLnJxZGF0YS5ydW5xX2hhc2hbdGFza10pCisgICAgICAgICAgICBzcV90YXNrbmFtZS5hcHBlbmQodGFza25hbWUpCisgICAgICAgICAgICBzcV90YXNrLmFwcGVuZCh0YXNrKQorICAgICAgICBsb2NzID0geyAic3FfZm4iIDogc3FfZm4sICJzcV90YXNrIiA6IHNxX3Rhc2tuYW1lLCAic3FfaGFzaCIgOiBzcV9oYXNoLCAic3FfaGFzaGZuIiA6IHNxX2hhc2hmbiwgImQiIDogc2VsZi5jb29rZXIuZXhwYW5kZWRfZGF0YSB9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhbGwgPSBzZWxmLmhhc2h2YWxpZGF0ZSArICIoc3FfZm4sIHNxX3Rhc2ssIHNxX2hhc2gsIHNxX2hhc2hmbiwgZCwgc2lnaW5mbz1UcnVlKSIKKyAgICAgICAgICAgIHZhbGlkID0gYmIudXRpbHMuYmV0dGVyX2V2YWwoY2FsbCwgbG9jcykKKyAgICAgICAgIyBIYW5kbGUgdmVyc2lvbiB3aXRoIG5vIHNpZ2luZm8gcGFyYW1ldGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBjYWxsID0gc2VsZi5oYXNodmFsaWRhdGUgKyAiKHNxX2ZuLCBzcV90YXNrLCBzcV9oYXNoLCBzcV9oYXNoZm4sIGQpIgorICAgICAgICAgICAgdmFsaWQgPSBiYi51dGlscy5iZXR0ZXJfZXZhbChjYWxsLCBsb2NzKQorICAgICAgICBmb3IgdiBpbiB2YWxpZDoKKyAgICAgICAgICAgIHZhbGlkX25ldy5hZGQoc3FfdGFza1t2XSkKKworICAgICAgICAjIFRhc2tzIHdoaWNoIGFyZSBib3RoIHNldHNjZW5lIGFuZCBub2V4ZWMgbmV2ZXIgY2FyZSBhYm91dCBkZXBlbmRlbmNpZXMKKyAgICAgICAgIyBXZSB0aGVyZWZvcmUgZmluZCB0YXNrcyB3aGljaCBhcmUgc2V0c2NlbmUgYW5kIG5vZXhlYyBhbmQgbWFyayB0aGVpcgorICAgICAgICAjIHVuaXF1ZSBkZXBlbmRlbmNpZXMgYXMgdmFsaWQuCisgICAgICAgIGZvciB0YXNrIGluIG5vZXhlYzoKKyAgICAgICAgICAgIGlmIHRhc2sgbm90IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgICAgIGhhc25vZXhlY3BhcmVudHMgPSBUcnVlCisgICAgICAgICAgICAgICAgZm9yIGRlcDIgaW4gc2VsZi5ycWRhdGEucnVucV9yZXZkZXBzW2RlcF06CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcDIgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZSBhbmQgZGVwMiBpbiBub2V4ZWM6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBoYXNub2V4ZWNwYXJlbnRzID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBoYXNub2V4ZWNwYXJlbnRzOgorICAgICAgICAgICAgICAgICAgICB2YWxpZF9uZXcuYWRkKGRlcCkKKworICAgICAgICBpbnZhbGlkdGFza3MgPSBzZXQoKQorICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYucnFkYXRhLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgaWYgdGFzayBub3QgaW4gdmFsaWRfbmV3IGFuZCB0YXNrIG5vdCBpbiBub2V4ZWM6CisgICAgICAgICAgICAgICAgaW52YWxpZHRhc2tzLmFkZCh0YXNrKQorCisgICAgICAgIGZvdW5kID0gc2V0KCkKKyAgICAgICAgcHJvY2Vzc2VkID0gc2V0KCkKKyAgICAgICAgZm9yIHRhc2sgaW4gaW52YWxpZHRhc2tzOgorICAgICAgICAgICAgdG9wcm9jZXNzID0gc2V0KFt0YXNrXSkKKyAgICAgICAgICAgIHdoaWxlIHRvcHJvY2VzczoKKyAgICAgICAgICAgICAgICBuZXh0ID0gc2V0KCkKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiB0b3Byb2Nlc3M6CisgICAgICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3RdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVwIGluIGludmFsaWR0YXNrczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5hZGQodGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlcCBub3QgaW4gcHJvY2Vzc2VkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQoZGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuYWRkKGRlcCkKKyAgICAgICAgICAgICAgICB0b3Byb2Nlc3MgPSBuZXh0CisgICAgICAgICAgICAgICAgaWYgdGFzayBpbiBmb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgdG9wcm9jZXNzID0gc2V0KCkKKworICAgICAgICB0YXNrbGlzdCA9IFtdCisgICAgICAgIGZvciB0YXNrIGluIGludmFsaWR0YXNrcy5kaWZmZXJlbmNlKGZvdW5kKToKKyAgICAgICAgICAgIHRhc2tsaXN0LmFwcGVuZChzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSkKKworICAgICAgICBpZiB0YXNrbGlzdDoKKyAgICAgICAgICAgIGJiLnBsYWluKCJUaGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgY3VycmVudCBidWlsZCBhbmQgYW55IGNhY2hlZCB0YXNrcyBzdGFydCBhdCB0aGUgZm9sbG93aW5nIHRhc2tzOlxuIiArICJcbiIuam9pbih0YXNrbGlzdCkpCisKKyAgICAgICAgcmV0dXJuIGludmFsaWR0YXNrcy5kaWZmZXJlbmNlKGZvdW5kKQorCisgICAgZGVmIHdyaXRlX2RpZmZzY2VuZXRhc2tzKHNlbGYsIGludmFsaWR0YXNrcyk6CisKKyAgICAgICAgIyBEZWZpbmUgcmVjdXJzaW9uIGNhbGxiYWNrCisgICAgICAgIGRlZiByZWN1cnNlY2Ioa2V5LCBoYXNoMSwgaGFzaDIpOgorICAgICAgICAgICAgaGFzaGVzID0gW2hhc2gxLCBoYXNoMl0KKyAgICAgICAgICAgIGhhc2hmaWxlcyA9IGJiLnNpZ2dlbi5maW5kX3NpZ2luZm8oa2V5LCBOb25lLCBoYXNoZXMsIHNlbGYuY2ZnRGF0YSkKKworICAgICAgICAgICAgcmVjb3V0ID0gW10KKyAgICAgICAgICAgIGlmIGxlbihoYXNoZmlsZXMpID09IDI6CisgICAgICAgICAgICAgICAgb3V0MiA9IGJiLnNpZ2dlbi5jb21wYXJlX3NpZ2ZpbGVzKGhhc2hmaWxlc1toYXNoMV0sIGhhc2hmaWxlc1toYXNoMl0sIHJlY3Vyc2VjYikKKyAgICAgICAgICAgICAgICByZWNvdXQuZXh0ZW5kKGxpc3QoJyAgJyArIGwgZm9yIGwgaW4gb3V0MikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlY291dC5hcHBlbmQoIlVuYWJsZSB0byBmaW5kIG1hdGNoaW5nIHNpZ2RhdGEgZm9yICVzIHdpdGggaGFzaGVzICVzIG9yICVzIiAlIChrZXksIGhhc2gxLCBoYXNoMikpCisKKyAgICAgICAgICAgIHJldHVybiByZWNvdXQKKworCisgICAgICAgIGZvciB0YXNrIGluIGludmFsaWR0YXNrczoKKyAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3Rhc2tdXQorICAgICAgICAgICAgcG4gPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUucGtnX2ZuW2ZuXQorICAgICAgICAgICAgdGFza25hbWUgPSBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10KKyAgICAgICAgICAgIGggPSBzZWxmLnJxZGF0YS5ydW5xX2hhc2hbdGFza10KKyAgICAgICAgICAgIG1hdGNoZXMgPSBiYi5zaWdnZW4uZmluZF9zaWdpbmZvKHBuLCB0YXNrbmFtZSwgW10sIHNlbGYuY2ZnRGF0YSkKKyAgICAgICAgICAgIG1hdGNoID0gTm9uZQorICAgICAgICAgICAgZm9yIG0gaW4gbWF0Y2hlczoKKyAgICAgICAgICAgICAgICBpZiBoIGluIG06CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbQorICAgICAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBiYi5mYXRhbCgiQ2FuJ3QgZmluZCBhIHRhc2sgd2UncmUgc3VwcG9zZWQgdG8gaGF2ZSB3cml0dGVuIG91dD8gKGhhc2g6ICVzKT8iICUgaCkKKyAgICAgICAgICAgIG1hdGNoZXMgPSB7ayA6IHYgZm9yIGssIHYgaW4gbWF0Y2hlcy5pdGVyaXRlbXMoKSBpZiBoIG5vdCBpbiBrfQorICAgICAgICAgICAgaWYgbWF0Y2hlczoKKyAgICAgICAgICAgICAgICBsYXRlc3RtYXRjaCA9IHNvcnRlZChtYXRjaGVzLmtleXMoKSwga2V5PWxhbWJkYSBmOiBtYXRjaGVzW2ZdKVstMV0KKyAgICAgICAgICAgICAgICBwcmV2aCA9IF9fZmluZF9tZDVfXy5zZWFyY2gobGF0ZXN0bWF0Y2gpLmdyb3VwKDApCisgICAgICAgICAgICAgICAgb3V0cHV0ID0gYmIuc2lnZ2VuLmNvbXBhcmVfc2lnZmlsZXMobGF0ZXN0bWF0Y2gsIG1hdGNoLCByZWN1cnNlY2IpCisgICAgICAgICAgICAgICAgYmIucGxhaW4oIlxuVGFzayAlczolcyBjb3VsZG4ndCBiZSB1c2VkIGZyb20gdGhlIGNhY2hlIGJlY2F1c2U6XG4gIFdlIG5lZWQgaGFzaCAlcywgY2xvc2VzdCBtYXRjaGluZyB0YXNrIHdhcyAlc1xuICAiICUgKHBuLCB0YXNrbmFtZSwgaCwgcHJldmgpICsgJ1xuICAnLmpvaW4ob3V0cHV0KSkKKworY2xhc3MgUnVuUXVldWVFeGVjdXRlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJxKToKKyAgICAgICAgc2VsZi5ycSA9IHJxCisgICAgICAgIHNlbGYuY29va2VyID0gcnEuY29va2VyCisgICAgICAgIHNlbGYuY2ZnRGF0YSA9IHJxLmNmZ0RhdGEKKyAgICAgICAgc2VsZi5ycWRhdGEgPSBycS5ycWRhdGEKKworICAgICAgICBzZWxmLm51bWJlcl90YXNrcyA9IGludChzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJCQl9OVU1CRVJfVEhSRUFEUyIsIFRydWUpIG9yIDEpCisgICAgICAgIHNlbGYuc2NoZWR1bGVyID0gc2VsZi5jZmdEYXRhLmdldFZhcigiQkJfU0NIRURVTEVSIiwgVHJ1ZSkgb3IgInNwZWVkIgorCisgICAgICAgIHNlbGYucnVucV9idWlsZGFibGUgPSBbXQorICAgICAgICBzZWxmLnJ1bnFfcnVubmluZyA9IFtdCisgICAgICAgIHNlbGYucnVucV9jb21wbGV0ZSA9IFtdCisKKyAgICAgICAgc2VsZi5idWlsZF9zdGFtcHMgPSB7fQorICAgICAgICBzZWxmLmJ1aWxkX3N0YW1wczIgPSBbXQorICAgICAgICBzZWxmLmZhaWxlZF9mbmlkcyA9IFtdCisKKyAgICAgICAgc2VsZi5zdGFtcGNhY2hlID0ge30KKworICAgICAgICBycS53b3JrZXJwaXBlLnNldHJ1bnF1ZXVlZXhlYyhzZWxmKQorICAgICAgICBpZiBycS5mYWtld29ya2VycGlwZToKKyAgICAgICAgICAgIHJxLmZha2V3b3JrZXJwaXBlLnNldHJ1bnF1ZXVlZXhlYyhzZWxmKQorCisgICAgICAgIGlmIHNlbGYubnVtYmVyX3Rhc2tzIDw9IDA6CisgICAgICAgICAgICAgYmIuZmF0YWwoIkludmFsaWQgQkJfTlVNQkVSX1RIUkVBRFMgJXMiICUgc2VsZi5udW1iZXJfdGFza3MpCisKKyAgICBkZWYgcnVucXVldWVfcHJvY2Vzc193YWl0cGlkKHNlbGYsIHRhc2ssIHN0YXR1cyk6CisKKyAgICAgICAgIyBzZWxmLmJ1aWxkX3N0YW1wc1twaWRdIG1heSBub3QgZXhpc3Qgd2hlbiB1c2Ugc2hhcmVkIHdvcmsgZGlyZWN0b3J5LgorICAgICAgICBpZiB0YXNrIGluIHNlbGYuYnVpbGRfc3RhbXBzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9zdGFtcHMyLnJlbW92ZShzZWxmLmJ1aWxkX3N0YW1wc1t0YXNrXSkKKyAgICAgICAgICAgIGRlbCBzZWxmLmJ1aWxkX3N0YW1wc1t0YXNrXQorCisgICAgICAgIGlmIHN0YXR1cyAhPSAwOgorICAgICAgICAgICAgc2VsZi50YXNrX2ZhaWwodGFzaywgc3RhdHVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50YXNrX2NvbXBsZXRlKHRhc2spCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZmluaXNoX25vdyhzZWxmKToKKworICAgICAgICBmb3Igd29ya2VyIGluIFtzZWxmLnJxLndvcmtlciwgc2VsZi5ycS5mYWtld29ya2VyXToKKyAgICAgICAgICAgIGlmIG5vdCB3b3JrZXI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3b3JrZXIuc3RkaW4ud3JpdGUoIjxmaW5pc2hub3c+PC9maW5pc2hub3c+IikKKyAgICAgICAgICAgICAgICB3b3JrZXIuc3RkaW4uZmx1c2goKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgIyB3b3JrZXIgbXVzdCBoYXZlIGRpZWQ/CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIGxlbihzZWxmLmZhaWxlZF9mbmlkcykgIT0gMDoKKyAgICAgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUZhaWxlZAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVDbGVhblVwCisKKyAgICAgICAgaWYgc2VsZi5zdGF0cy5hY3RpdmUgPiAwOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShydW5RdWV1ZUV4aXRXYWl0KHNlbGYuc3RhdHMuYWN0aXZlKSwgc2VsZi5jZmdEYXRhKQorICAgICAgICAgICAgc2VsZi5ycS5yZWFkX3dvcmtlcnMoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucnEuYWN0aXZlX2ZkcygpCisKKyAgICAgICAgaWYgbGVuKHNlbGYuZmFpbGVkX2ZuaWRzKSAhPSAwOgorICAgICAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlRmFpbGVkCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hlY2tfZGVwZW5kZW5jaWVzKHNlbGYsIHRhc2ssIHRhc2tkZXBzLCBzZXRzY2VuZSA9IEZhbHNlKToKKyAgICAgICAgaWYgbm90IHNlbGYucnEuZGVwdmFsaWRhdGU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICB0YXNrZGF0YSA9IHt9CisgICAgICAgIHRhc2tkZXBzLmFkZCh0YXNrKQorICAgICAgICBmb3IgZGVwIGluIHRhc2tkZXBzOgorICAgICAgICAgICAgaWYgc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgZGVwaWQgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW2RlcF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVwaWQgPSBkZXAKKyAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW2RlcGlkXV0KKyAgICAgICAgICAgIHBuID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnBrZ19mbltmbl0KKyAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW2RlcGlkXQorICAgICAgICAgICAgdGFza2RhdGFbZGVwXSA9IFtwbiwgdGFza25hbWUsIGZuXQorICAgICAgICBjYWxsID0gc2VsZi5ycS5kZXB2YWxpZGF0ZSArICIodGFzaywgdGFza2RhdGEsIG5vdG5lZWRlZCwgZCkiCisgICAgICAgIGxvY3MgPSB7ICJ0YXNrIiA6IHRhc2ssICJ0YXNrZGF0YSIgOiB0YXNrZGF0YSwgIm5vdG5lZWRlZCIgOiBzZWxmLnNjZW5lcXVldWVfbm90bmVlZGVkLCAiZCIgOiBzZWxmLmNvb2tlci5leHBhbmRlZF9kYXRhIH0KKyAgICAgICAgdmFsaWQgPSBiYi51dGlscy5iZXR0ZXJfZXZhbChjYWxsLCBsb2NzKQorICAgICAgICByZXR1cm4gdmFsaWQKKworY2xhc3MgUnVuUXVldWVFeGVjdXRlRHVtbXkoUnVuUXVldWVFeGVjdXRlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcnEpOgorICAgICAgICBzZWxmLnJxID0gcnEKKyAgICAgICAgc2VsZi5zdGF0cyA9IFJ1blF1ZXVlU3RhdHMoMCkKKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUNvbXBsZXRlCisgICAgICAgIHJldHVybgorCitjbGFzcyBSdW5RdWV1ZUV4ZWN1dGVUYXNrcyhSdW5RdWV1ZUV4ZWN1dGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBycSk6CisgICAgICAgIFJ1blF1ZXVlRXhlY3V0ZS5fX2luaXRfXyhzZWxmLCBycSkKKworICAgICAgICBzZWxmLnN0YXRzID0gUnVuUXVldWVTdGF0cyhsZW4oc2VsZi5ycWRhdGEucnVucV9mbmlkKSkKKworICAgICAgICBzZWxmLnN0YW1wY2FjaGUgPSB7fQorCisgICAgICAgIGluaXRpYWxfY292ZXJlZCA9IHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkLmNvcHkoKQorCisgICAgICAgICMgTWFyayBpbml0aWFsIGJ1aWxkYWJsZSB0YXNrcworICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2Uoc2VsZi5zdGF0cy50b3RhbCk6CisgICAgICAgICAgICBzZWxmLnJ1bnFfcnVubmluZy5hcHBlbmQoMCkKKyAgICAgICAgICAgIHNlbGYucnVucV9jb21wbGV0ZS5hcHBlbmQoMCkKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza10pID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZS5hcHBlbmQoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZS5hcHBlbmQoMCkKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pID4gMCBhbmQgc2VsZi5ycWRhdGEucnVucV9yZXZkZXBzW3Rhc2tdLmlzc3Vic2V0KHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkKSBhbmQgdGFzayBub3QgaW4gc2VsZi5ycS5zY2VuZXF1ZXVlX25vdGNvdmVyZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQuYWRkKHRhc2spCisKKyAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgIHdoaWxlIGZvdW5kOgorICAgICAgICAgICAgZm91bmQgPSBGYWxzZQorICAgICAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKHNlbGYuc3RhdHMudG90YWwpOgorICAgICAgICAgICAgICAgIGlmIHRhc2sgaW4gc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICdDb25zaWRlcmluZyAlcyAoJXMpOiAlcycgJSAodGFzaywgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcodGFzayksIHN0cihzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pKSkKKworICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pID4gMCBhbmQgc2VsZi5ycWRhdGEucnVucV9yZXZkZXBzW3Rhc2tdLmlzc3Vic2V0KHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkKSBhbmQgdGFzayBub3QgaW4gc2VsZi5ycS5zY2VuZXF1ZXVlX25vdGNvdmVyZWQ6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZC5hZGQodGFzaykKKworICAgICAgICBsb2dnZXIuZGVidWcoMSwgJ1NraXAgbGlzdCAocHJlIHNldHNjZW5ldmVyaWZ5KSAlcycsIHNvcnRlZChzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZCkpCisKKyAgICAgICAgIyBBbGxvdyB0aGUgbWV0YWRhdGEgdG8gZWxlY3QgZm9yIHNldHNjZW5lIHRhc2tzIHRvIHJ1biBhbnl3YXkKKyAgICAgICAgY292ZXJlZF9yZW1vdmUgPSBzZXQoKQorICAgICAgICBpZiBzZWxmLnJxLnNldHNjZW5ldmVyaWZ5OgorICAgICAgICAgICAgaW52YWxpZHRhc2tzID0gW10KKyAgICAgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5ycWRhdGEucnVucV90YXNrKSk6CisgICAgICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dCisgICAgICAgICAgICAgICAgdGFza25hbWUgPSBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10KKyAgICAgICAgICAgICAgICB0YXNrZGVwID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKworICAgICAgICAgICAgICAgIGlmICdub2V4ZWMnIGluIHRhc2tkZXAgYW5kIHRhc2tuYW1lIGluIHRhc2tkZXBbJ25vZXhlYyddOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHNlbGYucnEuY2hlY2tfc3RhbXBfdGFzayh0YXNrLCB0YXNrbmFtZSArICJfc2V0c2NlbmUiLCBjYWNoZT1zZWxmLnN0YW1wY2FjaGUpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ1NldHNjZW5lIHN0YW1wIGN1cnJlbnQgZm9yIHRhc2sgJXMoJXMpJywgdGFzaywgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcodGFzaykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgc2VsZi5ycS5jaGVja19zdGFtcF90YXNrKHRhc2ssIHRhc2tuYW1lLCByZWN1cnNlID0gVHJ1ZSwgY2FjaGU9c2VsZi5zdGFtcGNhY2hlKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICdOb3JtYWwgc3RhbXAgY3VycmVudCBmb3IgdGFzayAlcyglcyknLCB0YXNrLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpbnZhbGlkdGFza3MuYXBwZW5kKHRhc2spCisKKyAgICAgICAgICAgIGNhbGwgPSBzZWxmLnJxLnNldHNjZW5ldmVyaWZ5ICsgIihjb3ZlcmVkLCB0YXNrbmFtZXMsIGZuaWRzLCBmbnMsIGQsIGludmFsaWR0YXNrcz1pbnZhbGlkdGFza3MpIgorICAgICAgICAgICAgY2FsbDIgPSBzZWxmLnJxLnNldHNjZW5ldmVyaWZ5ICsgIihjb3ZlcmVkLCB0YXNrbmFtZXMsIGZuaWRzLCBmbnMsIGQpIgorICAgICAgICAgICAgbG9jcyA9IHsgImNvdmVyZWQiIDogc2VsZi5ycS5zY2VuZXF1ZXVlX2NvdmVyZWQsICJ0YXNrbmFtZXMiIDogc2VsZi5ycWRhdGEucnVucV90YXNrLCAiZm5pZHMiIDogc2VsZi5ycWRhdGEucnVucV9mbmlkLCAiZm5zIiA6IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4LCAiZCIgOiBzZWxmLmNvb2tlci5leHBhbmRlZF9kYXRhLCAiaW52YWxpZHRhc2tzIiA6IGludmFsaWR0YXNrcyB9CisgICAgICAgICAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgd2l0aG91dCBpbnZhbGlkdGFza3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb3ZlcmVkX3JlbW92ZSA9IGJiLnV0aWxzLmJldHRlcl9ldmFsKGNhbGwsIGxvY3MpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIGNvdmVyZWRfcmVtb3ZlID0gYmIudXRpbHMuYmV0dGVyX2V2YWwoY2FsbDIsIGxvY3MpCisKKyAgICAgICAgZGVmIHJlbW92ZWNvdmVyZWR0YXNrKHRhc2spOgorICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dCisgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXSArICdfc2V0c2NlbmUnCisgICAgICAgICAgICBiYi5idWlsZC5kZWxfc3RhbXAodGFza25hbWUsIHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgZm4pCisgICAgICAgICAgICBzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZC5yZW1vdmUodGFzaykKKworICAgICAgICB0b3JlbW92ZSA9IGNvdmVyZWRfcmVtb3ZlCisgICAgICAgIGZvciB0YXNrIGluIHRvcmVtb3ZlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICdOb3Qgc2tpcHBpbmcgdGFzayAlcyBkdWUgdG8gc2V0c2NlbmV2ZXJpZnknLCB0YXNrKQorICAgICAgICB3aGlsZSB0b3JlbW92ZToKKyAgICAgICAgICAgIGNvdmVyZWRfcmVtb3ZlID0gW10KKyAgICAgICAgICAgIGZvciB0YXNrIGluIHRvcmVtb3ZlOgorICAgICAgICAgICAgICAgIHJlbW92ZWNvdmVyZWR0YXNrKHRhc2spCisgICAgICAgICAgICAgICAgZm9yIGRlcHRhc2sgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXB0YXNrIG5vdCBpbiBzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGRlcHRhc2sgaW4gdG9yZW1vdmUgb3IgZGVwdGFzayBpbiBjb3ZlcmVkX3JlbW92ZSBvciBkZXB0YXNrIGluIGluaXRpYWxfY292ZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAnVGFzayAlcyBkZXBlbmRzIG9uIHRhc2sgJXMgc28gbm90IHNraXBwaW5nJyAlICh0YXNrLCBkZXB0YXNrKSkKKyAgICAgICAgICAgICAgICAgICAgY292ZXJlZF9yZW1vdmUuYXBwZW5kKGRlcHRhc2spCisgICAgICAgICAgICB0b3JlbW92ZSA9IGNvdmVyZWRfcmVtb3ZlCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICdGdWxsIHNraXAgbGlzdCAlcycsIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkKQorCisgICAgICAgIGV2ZW50LmZpcmUoYmIuZXZlbnQuU3RhbXBVcGRhdGUoc2VsZi5ycWRhdGEudGFyZ2V0X3BhaXJzLCBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUuc3RhbXApLCBzZWxmLmNmZ0RhdGEpCisKKyAgICAgICAgc2NoZWR1bGVycyA9IHNlbGYuZ2V0X3NjaGVkdWxlcnMoKQorICAgICAgICBmb3Igc2NoZWR1bGVyIGluIHNjaGVkdWxlcnM6CisgICAgICAgICAgICBpZiBzZWxmLnNjaGVkdWxlciA9PSBzY2hlZHVsZXIubmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLnNjaGVkID0gc2NoZWR1bGVyKHNlbGYsIHNlbGYucnFkYXRhKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiVXNpbmcgcnVucXVldWUgc2NoZWR1bGVyICclcyciLCBzY2hlZHVsZXIubmFtZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmIuZmF0YWwoIkludmFsaWQgc2NoZWR1bGVyICclcycuICBBdmFpbGFibGUgc2NoZWR1bGVyczogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgIChzZWxmLnNjaGVkdWxlciwgIiwgIi5qb2luKG9iai5uYW1lIGZvciBvYmogaW4gc2NoZWR1bGVycykpKQorCisgICAgZGVmIGdldF9zY2hlZHVsZXJzKHNlbGYpOgorICAgICAgICBzY2hlZHVsZXJzID0gc2V0KG9iaiBmb3Igb2JqIGluIGdsb2JhbHMoKS52YWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0eXBlKG9iaikgaXMgdHlwZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWJjbGFzcyhvYmosIFJ1blF1ZXVlU2NoZWR1bGVyKSkKKworICAgICAgICB1c2VyX3NjaGVkdWxlcnMgPSBzZWxmLmNmZ0RhdGEuZ2V0VmFyKCJCQl9TQ0hFRFVMRVJTIiwgVHJ1ZSkKKyAgICAgICAgaWYgdXNlcl9zY2hlZHVsZXJzOgorICAgICAgICAgICAgZm9yIHNjaGVkIGluIHVzZXJfc2NoZWR1bGVycy5zcGxpdCgpOgorICAgICAgICAgICAgICAgIGlmIG5vdCAiLiIgaW4gc2NoZWQ6CisgICAgICAgICAgICAgICAgICAgIGJiLm5vdGUoIklnbm9yaW5nIHNjaGVkdWxlciAnJXMnIGZyb20gQkJfU0NIRURVTEVSUzogbm90IGFuIGltcG9ydCIgJSBzY2hlZCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIG1vZG5hbWUsIG5hbWUgPSBzY2hlZC5yc3BsaXQoIi4iLCAxKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhtb2RuYW1lLCBmcm9tbGlzdD0obmFtZSwpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiVW5hYmxlIHRvIGltcG9ydCBzY2hlZHVsZXIgJyVzJyBmcm9tICclcyc6ICVzIiAlIChuYW1lLCBtb2RuYW1lLCBleGMpKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVycy5hZGQoZ2V0YXR0cihtb2R1bGUsIG5hbWUpKQorICAgICAgICByZXR1cm4gc2NoZWR1bGVycworCisgICAgZGVmIHNldGJ1aWxkYWJsZShzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZVt0YXNrXSA9IDEKKyAgICAgICAgc2VsZi5zY2hlZC5uZXdidWlsYWJsZSh0YXNrKQorCisgICAgZGVmIHRhc2tfY29tcGxldGVvdXRyaWdodChzZWxmLCB0YXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcmsgYSB0YXNrIGFzIGNvbXBsZXRlZAorICAgICAgICBMb29rIGF0IHRoZSByZXZlcnNlIGRlcGVuZGVuY2llcyBhbmQgbWFyayBhbnkgdGFzayB3aXRoCisgICAgICAgIGNvbXBsZXRlZCBkZXBlbmRlbmNpZXMgYXMgYnVpbGRhYmxlCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJ1bnFfY29tcGxldGVbdGFza10gPSAxCisgICAgICAgIGZvciByZXZkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9yZXZkZXBzW3Rhc2tdOgorICAgICAgICAgICAgaWYgc2VsZi5ydW5xX3J1bm5pbmdbcmV2ZGVwXSA9PSAxOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzZWxmLnJ1bnFfYnVpbGRhYmxlW3JldmRlcF0gPT0gMToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYWxsZGVwcyA9IDEKKyAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3JldmRlcF06CisgICAgICAgICAgICAgICAgaWYgc2VsZi5ydW5xX2NvbXBsZXRlW2RlcF0gIT0gMToKKyAgICAgICAgICAgICAgICAgICAgYWxsZGVwcyA9IDAKKyAgICAgICAgICAgIGlmIGFsbGRlcHMgPT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLnNldGJ1aWxkYWJsZShyZXZkZXApCisgICAgICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbcmV2ZGVwXV0KKyAgICAgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1tyZXZkZXBdCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJNYXJraW5nIHRhc2sgJXMgKCVzLCAlcykgYXMgYnVpbGRhYmxlIiwgcmV2ZGVwLCBmbiwgdGFza25hbWUpCisKKyAgICBkZWYgdGFza19jb21wbGV0ZShzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrQ29tcGxldGVkKCkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShydW5RdWV1ZVRhc2tDb21wbGV0ZWQodGFzaywgc2VsZi5zdGF0cywgc2VsZi5ycSksIHNlbGYuY2ZnRGF0YSkKKyAgICAgICAgc2VsZi50YXNrX2NvbXBsZXRlb3V0cmlnaHQodGFzaykKKworICAgIGRlZiB0YXNrX2ZhaWwoc2VsZiwgdGFzaywgZXhpdGNvZGUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2FsbGVkIHdoZW4gYSB0YXNrIGhhcyBmYWlsZWQKKyAgICAgICAgVXBkYXRlcyB0aGUgc3RhdGUgZW5naW5lIHdpdGggdGhlIGZhaWx1cmUKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RhdHMudGFza0ZhaWxlZCgpCisgICAgICAgIGZuaWQgPSBzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza10KKyAgICAgICAgc2VsZi5mYWlsZWRfZm5pZHMuYXBwZW5kKGZuaWQpCisgICAgICAgIGJiLmV2ZW50LmZpcmUocnVuUXVldWVUYXNrRmFpbGVkKHRhc2ssIHNlbGYuc3RhdHMsIGV4aXRjb2RlLCBzZWxmLnJxKSwgc2VsZi5jZmdEYXRhKQorICAgICAgICBpZiBzZWxmLnJxZGF0YS50YXNrRGF0YS5hYm9ydDoKKyAgICAgICAgICAgIHNlbGYucnEuc3RhdGUgPSBydW5RdWV1ZUNsZWFuVXAKKworICAgIGRlZiB0YXNrX3NraXAoc2VsZiwgdGFzaywgcmVhc29uKToKKyAgICAgICAgc2VsZi5ydW5xX3J1bm5pbmdbdGFza10gPSAxCisgICAgICAgIHNlbGYuc2V0YnVpbGRhYmxlKHRhc2spCisgICAgICAgIGJiLmV2ZW50LmZpcmUocnVuUXVldWVUYXNrU2tpcHBlZCh0YXNrLCBzZWxmLnN0YXRzLCBzZWxmLnJxLCByZWFzb24pLCBzZWxmLmNmZ0RhdGEpCisgICAgICAgIHNlbGYudGFza19jb21wbGV0ZW91dHJpZ2h0KHRhc2spCisgICAgICAgIHNlbGYuc3RhdHMudGFza0NvbXBsZXRlZCgpCisgICAgICAgIHNlbGYuc3RhdHMudGFza1NraXBwZWQoKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSdW4gdGhlIHRhc2tzIGluIGEgcXVldWUgcHJlcGFyZWQgYnkgcnFkYXRhLnByZXBhcmUoKQorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnJxLnJlYWRfd29ya2VycygpCisgICAgICAgIAorCisgICAgICAgIGlmIHNlbGYuc3RhdHMudG90YWwgPT0gMDoKKyAgICAgICAgICAgICMgbm90aGluZyB0byBkbworICAgICAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlQ2xlYW5VcAorCisgICAgICAgIHRhc2sgPSBzZWxmLnNjaGVkLm5leHQoKQorICAgICAgICBpZiB0YXNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dCisgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1t0YXNrXQorCisgICAgICAgICAgICBpZiB0YXNrIGluIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiU2V0c2NlbmUgY292ZXJlZCB0YXNrICVzICglcykiLCB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tfc2tpcCh0YXNrLCAiY292ZXJlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgaWYgc2VsZi5ycS5jaGVja19zdGFtcF90YXNrKHRhc2ssIHRhc2tuYW1lLCBjYWNoZT1zZWxmLnN0YW1wY2FjaGUpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiU3RhbXAgY3VycmVudCB0YXNrICVzICglcykiLCB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyh0YXNrKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tfc2tpcCh0YXNrLCAiZXhpc3RpbmciKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorICAgICAgICAgICAgaWYgJ25vZXhlYycgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnbm9leGVjJ106CisgICAgICAgICAgICAgICAgc3RhcnRldmVudCA9IHJ1blF1ZXVlVGFza1N0YXJ0ZWQodGFzaywgc2VsZi5zdGF0cywgc2VsZi5ycSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2V4ZWM9VHJ1ZSkKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKHN0YXJ0ZXZlbnQsIHNlbGYuY2ZnRGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSA9IDEKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRzLnRhc2tBY3RpdmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvb2tlci5jb25maWd1cmF0aW9uLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIGJiLmJ1aWxkLm1ha2Vfc3RhbXAodGFza25hbWUsIHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgZm4pCisgICAgICAgICAgICAgICAgc2VsZi50YXNrX2NvbXBsZXRlKHRhc2spCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhcnRldmVudCA9IHJ1blF1ZXVlVGFza1N0YXJ0ZWQodGFzaywgc2VsZi5zdGF0cywgc2VsZi5ycSkKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKHN0YXJ0ZXZlbnQsIHNlbGYuY2ZnRGF0YSkKKworICAgICAgICAgICAgdGFza2RlcGRhdGEgPSBzZWxmLmJ1aWxkX3Rhc2tkZXBkYXRhKHRhc2spCisKKyAgICAgICAgICAgIHRhc2tkZXAgPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorICAgICAgICAgICAgaWYgJ2Zha2Vyb290JyBpbiB0YXNrZGVwIGFuZCB0YXNrbmFtZSBpbiB0YXNrZGVwWydmYWtlcm9vdCddIGFuZCBub3Qgc2VsZi5jb29rZXIuY29uZmlndXJhdGlvbi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJxLmZha2V3b3JrZXI6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnEuc3RhcnRfZmFrZXdvcmtlcihzZWxmKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoIkZhaWxlZCB0byBzcGF3biBmYWtlcm9vdCB3b3JrZXIgdG8gcnVuICVzOiVzOiAlcyIgJSAoZm4sIHRhc2tuYW1lLCBzdHIoZXhjKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVGYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5ycS5mYWtld29ya2VyLnN0ZGluLndyaXRlKCI8cnVudGFzaz4iICsgcGlja2xlLmR1bXBzKChmbiwgdGFzaywgdGFza25hbWUsIEZhbHNlLCBzZWxmLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZm4pLCB0YXNrZGVwZGF0YSkpICsgIjwvcnVudGFzaz4iKQorICAgICAgICAgICAgICAgIHNlbGYucnEuZmFrZXdvcmtlci5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucnEud29ya2VyLnN0ZGluLndyaXRlKCI8cnVudGFzaz4iICsgcGlja2xlLmR1bXBzKChmbiwgdGFzaywgdGFza25hbWUsIEZhbHNlLCBzZWxmLmNvb2tlci5jb2xsZWN0aW9uLmdldF9maWxlX2FwcGVuZHMoZm4pLCB0YXNrZGVwZGF0YSkpICsgIjwvcnVudGFzaz4iKQorICAgICAgICAgICAgICAgIHNlbGYucnEud29ya2VyLnN0ZGluLmZsdXNoKCkKKworICAgICAgICAgICAgc2VsZi5idWlsZF9zdGFtcHNbdGFza10gPSBiYi5idWlsZC5zdGFtcGZpbGUodGFza25hbWUsIHNlbGYucnFkYXRhLmRhdGFDYWNoZSwgZm4pCisgICAgICAgICAgICBzZWxmLmJ1aWxkX3N0YW1wczIuYXBwZW5kKHNlbGYuYnVpbGRfc3RhbXBzW3Rhc2tdKSAKKyAgICAgICAgICAgIHNlbGYucnVucV9ydW5uaW5nW3Rhc2tdID0gMQorICAgICAgICAgICAgc2VsZi5zdGF0cy50YXNrQWN0aXZlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhdHMuYWN0aXZlIDwgc2VsZi5udW1iZXJfdGFza3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBpZiBzZWxmLnN0YXRzLmFjdGl2ZSA+IDA6CisgICAgICAgICAgICBzZWxmLnJxLnJlYWRfd29ya2VycygpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5ycS5hY3RpdmVfZmRzKCkKKworICAgICAgICBpZiBsZW4oc2VsZi5mYWlsZWRfZm5pZHMpICE9IDA6CisgICAgICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVGYWlsZWQKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBTYW5pdHkgQ2hlY2tzCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShzZWxmLnN0YXRzLnRvdGFsKToKKyAgICAgICAgICAgIGlmIHNlbGYucnVucV9idWlsZGFibGVbdGFza10gPT0gMDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRhc2sgJXMgbmV2ZXIgYnVpbGRhYmxlISIsIHRhc2spCisgICAgICAgICAgICBpZiBzZWxmLnJ1bnFfcnVubmluZ1t0YXNrXSA9PSAwOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGFzayAlcyBuZXZlciByYW4hIiwgdGFzaykKKyAgICAgICAgICAgIGlmIHNlbGYucnVucV9jb21wbGV0ZVt0YXNrXSA9PSAwOgorICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGFzayAlcyBuZXZlciBjb21wbGV0ZWQhIiwgdGFzaykKKyAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlQ29tcGxldGUKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGJ1aWxkX3Rhc2tkZXBkYXRhKHNlbGYsIHRhc2spOgorICAgICAgICB0YXNrZGVwZGF0YSA9IHt9CisgICAgICAgIG5leHQgPSBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbdGFza10KKyAgICAgICAgbmV4dC5hZGQodGFzaykKKyAgICAgICAgd2hpbGUgbmV4dDoKKyAgICAgICAgICAgIGFkZGl0aW9uYWwgPSBbXQorICAgICAgICAgICAgZm9yIHJldmRlcCBpbiBuZXh0OgorICAgICAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3JldmRlcF1dCisgICAgICAgICAgICAgICAgcG4gPSBzZWxmLnJxZGF0YS5kYXRhQ2FjaGUucGtnX2ZuW2ZuXQorICAgICAgICAgICAgICAgIHRhc2tuYW1lID0gc2VsZi5ycWRhdGEucnVucV90YXNrW3JldmRlcF0KKyAgICAgICAgICAgICAgICBkZXBzID0gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3JldmRlcF0KKyAgICAgICAgICAgICAgICBwcm92aWRlcyA9IHNlbGYucnFkYXRhLmRhdGFDYWNoZS5mbl9wcm92aWRlc1tmbl0KKyAgICAgICAgICAgICAgICB0YXNrZGVwZGF0YVtyZXZkZXBdID0gW3BuLCB0YXNrbmFtZSwgZm4sIGRlcHMsIHByb3ZpZGVzXQorICAgICAgICAgICAgICAgIGZvciByZXZkZXAyIGluIGRlcHM6CisgICAgICAgICAgICAgICAgICAgIGlmIHJldmRlcDIgbm90IGluIHRhc2tkZXBkYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbC5hcHBlbmQocmV2ZGVwMikKKyAgICAgICAgICAgIG5leHQgPSBhZGRpdGlvbmFsCisKKyAgICAgICAgI2JiLm5vdGUoIlRhc2sgJXM6ICIgJSB0YXNrICsgc3RyKHRhc2tkZXBkYXRhKS5yZXBsYWNlKCJdLCAiLCAiXSxcbiIpKQorICAgICAgICByZXR1cm4gdGFza2RlcGRhdGEKKworY2xhc3MgUnVuUXVldWVFeGVjdXRlU2NlbmVxdWV1ZShSdW5RdWV1ZUV4ZWN1dGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBycSk6CisgICAgICAgIFJ1blF1ZXVlRXhlY3V0ZS5fX2luaXRfXyhzZWxmLCBycSkKKworICAgICAgICBzZWxmLnNjZW5lcXVldWVfY292ZXJlZCA9IHNldCgpCisgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV9ub3Rjb3ZlcmVkID0gc2V0KCkKKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX25vdG5lZWRlZCA9IHNldCgpCisKKyAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGFueSBzZXRzY2VuZSBmdW5jdGlvbnMsIHNraXAgdGhpcyBzdGVwCisgICAgICAgIGlmIGxlbihzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lKSA9PSAwOgorICAgICAgICAgICAgcnEuc2NlbmVxdWV1ZV9jb3ZlcmVkID0gc2V0KCkKKyAgICAgICAgICAgIHJxLnN0YXRlID0gcnVuUXVldWVSdW5Jbml0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLnN0YXRzID0gUnVuUXVldWVTdGF0cyhsZW4oc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZSkpCisKKyAgICAgICAgc3FfcmV2ZGVwcyA9IFtdCisgICAgICAgIHNxX3JldmRlcHNfbmV3ID0gW10KKyAgICAgICAgc3FfcmV2ZGVwc19zcXVhc2ggPSBbXQorICAgICAgICBzZWxmLnNxX2hhcmRkZXBzID0ge30KKworICAgICAgICAjIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgZGVwZW5kZW5jeSBncmFwaCBmb3IgdGhlIHNldHNjZW5lIGZ1bmN0aW9ucy4gSW50ZXJtZWRpYXRlCisgICAgICAgICMgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIHNldHNjZW5lIHRhc2tzIG9ubHkgY29tcGxpY2F0ZSB0aGUgY29kZS4gVGhpcyBjb2RlCisgICAgICAgICMgdGhlcmVmb3JlIGFpbXMgdG8gY29sbGFwc2UgdGhlIGh1Z2UgcnVucXVldWUgZGVwZW5kZW5jeSB0cmVlIGludG8gYSBzbWFsbGVyIG9uZQorICAgICAgICAjIG9ubHkgY29udGFpbmluZyB0aGUgc2V0c2NlbmUgZnVuY3Rpb25zLgorCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShzZWxmLnN0YXRzLnRvdGFsKToKKyAgICAgICAgICAgIHNlbGYucnVucV9ydW5uaW5nLmFwcGVuZCgwKQorICAgICAgICAgICAgc2VsZi5ydW5xX2NvbXBsZXRlLmFwcGVuZCgwKQorICAgICAgICAgICAgc2VsZi5ydW5xX2J1aWxkYWJsZS5hcHBlbmQoMCkKKworICAgICAgICAjIEZpcnN0IHByb2Nlc3MgdGhlIGNoYWlucyB1cCB0byB0aGUgZmlyc3Qgc2V0c2NlbmUgdGFzay4KKyAgICAgICAgZW5kcG9pbnRzID0ge30KKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnJxZGF0YS5ydW5xX2ZuaWQpKToKKyAgICAgICAgICAgIHNxX3JldmRlcHMuYXBwZW5kKGNvcHkuY29weShzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pKQorICAgICAgICAgICAgc3FfcmV2ZGVwc19uZXcuYXBwZW5kKHNldCgpKQorICAgICAgICAgICAgaWYgKGxlbihzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pID09IDApIGFuZCB0YXNrIG5vdCBpbiBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lOgorICAgICAgICAgICAgICAgIGVuZHBvaW50c1t0YXNrXSA9IHNldCgpCisKKyAgICAgICAgIyBTZWNvbmRseSBwcm9jZXNzIHRoZSBjaGFpbnMgYmV0d2VlbiBzZXRzY2VuZSB0YXNrcy4KKyAgICAgICAgZm9yIHRhc2sgaW4gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZToKKyAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3Rhc2tdOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXAgbm90IGluIGVuZHBvaW50czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50c1tkZXBdID0gc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzW2RlcF0uYWRkKHRhc2spCisKKyAgICAgICAgZGVmIHByb2Nlc3NfZW5kcG9pbnRzKGVuZHBvaW50cyk6CisgICAgICAgICAgICBuZXdlbmRwb2ludHMgPSB7fQorICAgICAgICAgICAgZm9yIHBvaW50LCB0YXNrIGluIGVuZHBvaW50cy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHRhc2tzID0gc2V0KCkKKyAgICAgICAgICAgICAgICBpZiB0YXNrOgorICAgICAgICAgICAgICAgICAgICB0YXNrcyB8PSB0YXNrCisgICAgICAgICAgICAgICAgaWYgc3FfcmV2ZGVwc19uZXdbcG9pbnRdOgorICAgICAgICAgICAgICAgICAgICB0YXNrcyB8PSBzcV9yZXZkZXBzX25ld1twb2ludF0KKyAgICAgICAgICAgICAgICBzcV9yZXZkZXBzX25ld1twb2ludF0gPSBzZXQoKQorICAgICAgICAgICAgICAgIGlmIHBvaW50IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3W3BvaW50XSA9IHRhc2tzCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJxZGF0YS5ydW5xX2RlcGVuZHNbcG9pbnRdOgorICAgICAgICAgICAgICAgICAgICBpZiBwb2ludCBpbiBzcV9yZXZkZXBzW2RlcF06CisgICAgICAgICAgICAgICAgICAgICAgICBzcV9yZXZkZXBzW2RlcF0ucmVtb3ZlKHBvaW50KQorICAgICAgICAgICAgICAgICAgICBpZiB0YXNrczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3W2RlcF0gfD0gdGFza3MKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihzcV9yZXZkZXBzW2RlcF0pID09IDAgb3IgbGVuKHNxX3JldmRlcHNfbmV3W2RlcF0pICE9IDApIGFuZCBkZXAgbm90IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdlbmRwb2ludHNbZGVwXSA9IHRhc2sKKyAgICAgICAgICAgIGlmIGxlbihuZXdlbmRwb2ludHMpICE9IDA6CisgICAgICAgICAgICAgICAgcHJvY2Vzc19lbmRwb2ludHMobmV3ZW5kcG9pbnRzKQorCisgICAgICAgIHByb2Nlc3NfZW5kcG9pbnRzKGVuZHBvaW50cykKKworICAgICAgICAjIEJ1aWxkIGEgbGlzdCBvZiBzZXRzY2VuZSB0YXNrcyB3aGljaCBhcmUgInVuc2tpcHBhYmxlIgorICAgICAgICAjIFRoZXNlIGFyZSBkaXJlY3QgZW5kcG9pbnRzIHJlZmVyZW5jZWQgYnkgdGhlIGJ1aWxkCisgICAgICAgIGVuZHBvaW50czIgPSB7fQorICAgICAgICBzcV9yZXZkZXBzMiA9IFtdCisgICAgICAgIHNxX3JldmRlcHNfbmV3MiA9IFtdCisgICAgICAgIGRlZiBwcm9jZXNzX2VuZHBvaW50czIoZW5kcG9pbnRzKToKKyAgICAgICAgICAgIG5ld2VuZHBvaW50cyA9IHt9CisgICAgICAgICAgICBmb3IgcG9pbnQsIHRhc2sgaW4gZW5kcG9pbnRzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdGFza3MgPSBzZXQoW3BvaW50XSkKKyAgICAgICAgICAgICAgICBpZiB0YXNrOgorICAgICAgICAgICAgICAgICAgICB0YXNrcyB8PSB0YXNrCisgICAgICAgICAgICAgICAgaWYgc3FfcmV2ZGVwc19uZXcyW3BvaW50XToKKyAgICAgICAgICAgICAgICAgICAgdGFza3MgfD0gc3FfcmV2ZGVwc19uZXcyW3BvaW50XQorICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3Mltwb2ludF0gPSBzZXQoKQorICAgICAgICAgICAgICAgIGlmIHBvaW50IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3Mltwb2ludF0gPSB0YXNrcworICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5ycWRhdGEucnVucV9kZXBlbmRzW3BvaW50XToKKyAgICAgICAgICAgICAgICAgICAgaWYgcG9pbnQgaW4gc3FfcmV2ZGVwczJbZGVwXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHMyW2RlcF0ucmVtb3ZlKHBvaW50KQorICAgICAgICAgICAgICAgICAgICBpZiB0YXNrczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxX3JldmRlcHNfbmV3MltkZXBdIHw9IHRhc2tzCisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4oc3FfcmV2ZGVwczJbZGVwXSkgPT0gMCBvciBsZW4oc3FfcmV2ZGVwc19uZXcyW2RlcF0pICE9IDApIGFuZCBkZXAgbm90IGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdlbmRwb2ludHNbZGVwXSA9IHRhc2tzCisgICAgICAgICAgICBpZiBsZW4obmV3ZW5kcG9pbnRzKSAhPSAwOgorICAgICAgICAgICAgICAgIHByb2Nlc3NfZW5kcG9pbnRzMihuZXdlbmRwb2ludHMpCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5ycWRhdGEucnVucV9mbmlkKSk6CisgICAgICAgICAgICBzcV9yZXZkZXBzMi5hcHBlbmQoY29weS5jb3B5KHNlbGYucnFkYXRhLnJ1bnFfcmV2ZGVwc1t0YXNrXSkpCisgICAgICAgICAgICBzcV9yZXZkZXBzX25ldzIuYXBwZW5kKHNldCgpKQorICAgICAgICAgICAgaWYgKGxlbihzZWxmLnJxZGF0YS5ydW5xX3JldmRlcHNbdGFza10pID09IDApIGFuZCB0YXNrIG5vdCBpbiBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lOgorICAgICAgICAgICAgICAgIGVuZHBvaW50czJbdGFza10gPSBzZXQoKQorICAgICAgICBwcm9jZXNzX2VuZHBvaW50czIoZW5kcG9pbnRzMikKKyAgICAgICAgc2VsZi51bnNraXBwYWJsZSA9IFtdCisgICAgICAgIGZvciB0YXNrIGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICBpZiBzcV9yZXZkZXBzX25ldzJbdGFza106CisgICAgICAgICAgICAgICAgc2VsZi51bnNraXBwYWJsZS5hcHBlbmQoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleCh0YXNrKSkKKworICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYucnFkYXRhLnJ1bnFfZm5pZCkpOgorICAgICAgICAgICAgaWYgdGFzayBpbiBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lOgorICAgICAgICAgICAgICAgIGRlcHMgPSBzZXQoKQorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gc3FfcmV2ZGVwc19uZXdbdGFza106CisgICAgICAgICAgICAgICAgICAgIGRlcHMuYWRkKHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmUuaW5kZXgoZGVwKSkKKyAgICAgICAgICAgICAgICBzcV9yZXZkZXBzX3NxdWFzaC5hcHBlbmQoZGVwcykKKyAgICAgICAgICAgIGVsaWYgbGVuKHNxX3JldmRlcHNfbmV3W3Rhc2tdKSAhPSAwOgorICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiUnVuUXVldWUiLCAiU29tZXRoaW5nIHdlbnQgYmFkbHkgd3JvbmcgZHVyaW5nIHNjZW5lcXVldWUgZ2VuZXJhdGlvbiwgYWJvcnRpbmcuIFBsZWFzZSByZXBvcnQgdGhpcyBwcm9ibGVtLiIpCisKKyAgICAgICAgIyBSZXNvbHZlIHNldHNjZW5lIGludGVyLXRhc2sgZGVwZW5kZW5jaWVzCisgICAgICAgICMgZS5nLiBkb19zb21ldGFza19zZXRzY2VuZVtkZXBlbmRzXSA9ICJ0YXJnZXRuYW1lOmRvX3NvbWVvdGhlcnRhc2tfc2V0c2NlbmUiCisgICAgICAgICMgTm90ZSB0aGF0IGFueXRoaW5nIGV4cGxpY2l0bHkgZGVwZW5kZWQgdXBvbiB3aWxsIGhhdmUgaXRzIHJldmVyc2UgZGVwZW5kZW5jaWVzIHJlbW92ZWQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzCisgICAgICAgIGZvciB0YXNrIGluIHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmU6CisgICAgICAgICAgICAgICAgcmVhbGlkID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZ2V0dGFza19pZChzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbdGFza11dLCBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbdGFza10gKyAiX3NldHNjZW5lIiwgRmFsc2UpCisgICAgICAgICAgICAgICAgaWRlcGVuZHMgPSBzZWxmLnJxZGF0YS50YXNrRGF0YS50YXNrc19pZGVwZW5kc1tyZWFsaWRdCisgICAgICAgICAgICAgICAgZm9yIChkZXBpZCwgaWRlcGVuZHRhc2spIGluIGlkZXBlbmRzOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXBpZCBub3QgaW4gc2VsZi5ycWRhdGEudGFza0RhdGEuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgZGVwZGF0YSA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmJ1aWxkX3RhcmdldHNbZGVwaWRdWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIGRlcGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBkZXAgPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtkZXBkYXRhXQorICAgICAgICAgICAgICAgICAgICB0YXNraWQgPSBzZWxmLnJxZGF0YS5nZXRfdGFza19pZChzZWxmLnJxZGF0YS50YXNrRGF0YS5nZXRmbl9pZChkZXApLCBpZGVwZW5kdGFzay5yZXBsYWNlKCJfc2V0c2NlbmUiLCAiIikpCisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tpZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJUYXNrICVzX3NldHNjZW5lIGRlcGVuZHMgdXBvbiBub24tZXhpc3RlbnQgdGFzayAlczolcyIgJSAoc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcodGFzayksIGRlcCwgaWRlcGVuZHRhc2spKQorCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2tpZCkgaW4gc2VsZi5zcV9oYXJkZGVwczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3FfaGFyZGRlcHNbc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleCh0YXNraWQpXSA9IHNldCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3FfaGFyZGRlcHNbc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleCh0YXNraWQpXS5hZGQoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleCh0YXNrKSkKKworICAgICAgICAgICAgICAgICAgICBzcV9yZXZkZXBzX3NxdWFzaFtzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2spXS5hZGQoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZS5pbmRleCh0YXNraWQpKQorICAgICAgICAgICAgICAgICAgICAjIEhhdmUgdG8gemVybyB0aGlzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICBzcV9yZXZkZXBzX3NxdWFzaFtzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lLmluZGV4KHRhc2tpZCldID0gc2V0KCkKKworICAgICAgICBmb3IgdGFzayBpbiBzZWxmLnNxX2hhcmRkZXBzOgorICAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5zcV9oYXJkZGVwc1t0YXNrXToKKyAgICAgICAgICAgICAgICAgc3FfcmV2ZGVwc19zcXVhc2hbZGVwXS5hZGQodGFzaykKKworICAgICAgICAjZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzcV9yZXZkZXBzX3NxdWFzaCkpOgorICAgICAgICAjICAgIHJlYWx0YXNrID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXQorICAgICAgICAjICAgIGJiLndhcm4oIlRhc2sgJXM6ICVzX3NldHNjZW5lIGlzICVzICIgJSAodGFzaywgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbHRhc2spICwgc3FfcmV2ZGVwc19zcXVhc2hbdGFza10pKQorCisgICAgICAgIHNlbGYuc3FfZGVwcyA9IFtdCisgICAgICAgIHNlbGYuc3FfcmV2ZGVwcyA9IHNxX3JldmRlcHNfc3F1YXNoCisgICAgICAgIHNlbGYuc3FfcmV2ZGVwczIgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc3FfcmV2ZGVwcykKKworICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYuc3FfcmV2ZGVwcykpOgorICAgICAgICAgICAgc2VsZi5zcV9kZXBzLmFwcGVuZChzZXQoKSkKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnNxX3JldmRlcHMpKToKKyAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5zcV9yZXZkZXBzW3Rhc2tdOgorICAgICAgICAgICAgICAgIHNlbGYuc3FfZGVwc1tkZXBdLmFkZCh0YXNrKQorCisgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5zcV9yZXZkZXBzKSk6CisgICAgICAgICAgICBpZiBsZW4oc2VsZi5zcV9yZXZkZXBzW3Rhc2tdKSA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYucnVucV9idWlsZGFibGVbdGFza10gPSAxCisKKyAgICAgICAgc2VsZi5vdXRyaWdodGZhaWwgPSBbXQorICAgICAgICBpZiBzZWxmLnJxLmhhc2h2YWxpZGF0ZToKKyAgICAgICAgICAgIHNxX2hhc2ggPSBbXQorICAgICAgICAgICAgc3FfaGFzaGZuID0gW10KKyAgICAgICAgICAgIHNxX2ZuID0gW10KKyAgICAgICAgICAgIHNxX3Rhc2tuYW1lID0gW10KKyAgICAgICAgICAgIHNxX3Rhc2sgPSBbXQorICAgICAgICAgICAgbm9leGVjID0gW10KKyAgICAgICAgICAgIHN0YW1wcHJlc2VudCA9IFtdCisgICAgICAgICAgICBmb3IgdGFzayBpbiB4cmFuZ2UobGVuKHNlbGYuc3FfcmV2ZGVwcykpOgorICAgICAgICAgICAgICAgIHJlYWx0YXNrID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXQorICAgICAgICAgICAgICAgIGZuID0gc2VsZi5ycWRhdGEudGFza0RhdGEuZm5faW5kZXhbc2VsZi5ycWRhdGEucnVucV9mbmlkW3JlYWx0YXNrXV0KKyAgICAgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1tyZWFsdGFza10KKyAgICAgICAgICAgICAgICB0YXNrZGVwID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKworICAgICAgICAgICAgICAgIGlmICdub2V4ZWMnIGluIHRhc2tkZXAgYW5kIHRhc2tuYW1lIGluIHRhc2tkZXBbJ25vZXhlYyddOgorICAgICAgICAgICAgICAgICAgICBub2V4ZWMuYXBwZW5kKHRhc2spCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKHRhc2spCisgICAgICAgICAgICAgICAgICAgIGJiLmJ1aWxkLm1ha2Vfc3RhbXAodGFza25hbWUgKyAiX3NldHNjZW5lIiwgc2VsZi5ycWRhdGEuZGF0YUNhY2hlLCBmbikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHNlbGYucnEuY2hlY2tfc3RhbXBfdGFzayhyZWFsdGFzaywgdGFza25hbWUgKyAiX3NldHNjZW5lIiwgY2FjaGU9c2VsZi5zdGFtcGNhY2hlKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDIsICdTZXRzY2VuZSBzdGFtcCBjdXJyZW50IGZvciB0YXNrICVzKCVzKScsIHRhc2ssIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHJlYWx0YXNrKSkKKyAgICAgICAgICAgICAgICAgICAgc3RhbXBwcmVzZW50LmFwcGVuZCh0YXNrKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tfc2tpcCh0YXNrKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5ycS5jaGVja19zdGFtcF90YXNrKHJlYWx0YXNrLCB0YXNrbmFtZSwgcmVjdXJzZSA9IFRydWUsIGNhY2hlPXNlbGYuc3RhbXBjYWNoZSk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnTm9ybWFsIHN0YW1wIGN1cnJlbnQgZm9yIHRhc2sgJXMoJXMpJywgdGFzaywgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbHRhc2spKQorICAgICAgICAgICAgICAgICAgICBzdGFtcHByZXNlbnQuYXBwZW5kKHRhc2spCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza19za2lwKHRhc2spCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBzcV9mbi5hcHBlbmQoZm4pCisgICAgICAgICAgICAgICAgc3FfaGFzaGZuLmFwcGVuZChzZWxmLnJxZGF0YS5kYXRhQ2FjaGUuaGFzaGZuW2ZuXSkKKyAgICAgICAgICAgICAgICBzcV9oYXNoLmFwcGVuZChzZWxmLnJxZGF0YS5ydW5xX2hhc2hbcmVhbHRhc2tdKQorICAgICAgICAgICAgICAgIHNxX3Rhc2tuYW1lLmFwcGVuZCh0YXNrbmFtZSkKKyAgICAgICAgICAgICAgICBzcV90YXNrLmFwcGVuZCh0YXNrKQorICAgICAgICAgICAgY2FsbCA9IHNlbGYucnEuaGFzaHZhbGlkYXRlICsgIihzcV9mbiwgc3FfdGFzaywgc3FfaGFzaCwgc3FfaGFzaGZuLCBkKSIKKyAgICAgICAgICAgIGxvY3MgPSB7ICJzcV9mbiIgOiBzcV9mbiwgInNxX3Rhc2siIDogc3FfdGFza25hbWUsICJzcV9oYXNoIiA6IHNxX2hhc2gsICJzcV9oYXNoZm4iIDogc3FfaGFzaGZuLCAiZCIgOiBzZWxmLmNvb2tlci5leHBhbmRlZF9kYXRhIH0KKyAgICAgICAgICAgIHZhbGlkID0gYmIudXRpbHMuYmV0dGVyX2V2YWwoY2FsbCwgbG9jcykKKworICAgICAgICAgICAgdmFsaWRfbmV3ID0gc3RhbXBwcmVzZW50CisgICAgICAgICAgICBmb3IgdiBpbiB2YWxpZDoKKyAgICAgICAgICAgICAgICB2YWxpZF9uZXcuYXBwZW5kKHNxX3Rhc2tbdl0pCisKKyAgICAgICAgICAgIGZvciB0YXNrIGluIHhyYW5nZShsZW4oc2VsZi5zcV9yZXZkZXBzKSk6CisgICAgICAgICAgICAgICAgaWYgdGFzayBub3QgaW4gdmFsaWRfbmV3IGFuZCB0YXNrIG5vdCBpbiBub2V4ZWM6CisgICAgICAgICAgICAgICAgICAgIHJlYWx0YXNrID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ05vIHBhY2thZ2UgZm91bmQsIHNvIHNraXBwaW5nIHNldHNjZW5lIHRhc2sgJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbHRhc2spKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHJpZ2h0ZmFpbC5hcHBlbmQodGFzaykKKworICAgICAgICBsb2dnZXIuaW5mbygnRXhlY3V0aW5nIFNldFNjZW5lIFRhc2tzJykKKworICAgICAgICBzZWxmLnJxLnN0YXRlID0gcnVuUXVldWVTY2VuZVJ1bgorCisgICAgZGVmIHNjZW5lcXVldWVfdXBkYXRlY291bnRlcnMoc2VsZiwgdGFzaywgZmFpbCA9IEZhbHNlKToKKyAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnNxX2RlcHNbdGFza106CisgICAgICAgICAgICBpZiBmYWlsIGFuZCB0YXNrIGluIHNlbGYuc3FfaGFyZGRlcHMgYW5kIGRlcCBpbiBzZWxmLnNxX2hhcmRkZXBzW3Rhc2tdOgorICAgICAgICAgICAgICAgIHJlYWx0YXNrID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXQorICAgICAgICAgICAgICAgIHJlYWxkZXAgPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW2RlcF0KKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIiVzIHdhcyB1bmF2YWlsYWJsZSBhbmQgaXMgYSBoYXJkIGRlcGVuZGVuY3kgb2YgJXMgc28gc2tpcHBpbmciICUgKHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHJlYWx0YXNrKSwgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcocmVhbGRlcCkpKQorICAgICAgICAgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV91cGRhdGVjb3VudGVycyhkZXAsIGZhaWwpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHRhc2sgbm90IGluIHNlbGYuc3FfcmV2ZGVwczJbZGVwXToKKyAgICAgICAgICAgICAgICAjIE1heSBhbHJlYWR5IGhhdmUgYmVlbiByZW1vdmVkIGJ5IHRoZSBmYWlsIGNhc2UgYWJvdmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5zcV9yZXZkZXBzMltkZXBdLnJlbW92ZSh0YXNrKQorICAgICAgICAgICAgaWYgbGVuKHNlbGYuc3FfcmV2ZGVwczJbZGVwXSkgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bnFfYnVpbGRhYmxlW2RlcF0gPSAxCisKKyAgICBkZWYgdGFza19jb21wbGV0ZW91dHJpZ2h0KHNlbGYsIHRhc2spOgorICAgICAgICAiIiIKKyAgICAgICAgTWFyayBhIHRhc2sgYXMgY29tcGxldGVkCisgICAgICAgIExvb2sgYXQgdGhlIHJldmVyc2UgZGVwZW5kZW5jaWVzIGFuZCBtYXJrIGFueSB0YXNrIHdpdGgKKyAgICAgICAgY29tcGxldGVkIGRlcGVuZGVuY2llcyBhcyBidWlsZGFibGUKKyAgICAgICAgIiIiCisKKyAgICAgICAgaW5kZXggPSBzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAnRm91bmQgdGFzayAlcyB3aGljaCBjb3VsZCBiZSBhY2NlbGVyYXRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhpbmRleCkpCisKKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX2NvdmVyZWQuYWRkKHRhc2spCisgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV91cGRhdGVjb3VudGVycyh0YXNrKQorCisgICAgZGVmIHRhc2tfY29tcGxldGUoc2VsZiwgdGFzayk6CisgICAgICAgIHNlbGYuc3RhdHMudGFza0NvbXBsZXRlZCgpCisgICAgICAgIGJiLmV2ZW50LmZpcmUoc2NlbmVRdWV1ZVRhc2tDb21wbGV0ZWQodGFzaywgc2VsZi5zdGF0cywgc2VsZi5ycSksIHNlbGYuY2ZnRGF0YSkKKyAgICAgICAgc2VsZi50YXNrX2NvbXBsZXRlb3V0cmlnaHQodGFzaykKKworICAgIGRlZiB0YXNrX2ZhaWwoc2VsZiwgdGFzaywgcmVzdWx0KToKKyAgICAgICAgc2VsZi5zdGF0cy50YXNrRmFpbGVkKCkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShzY2VuZVF1ZXVlVGFza0ZhaWxlZCh0YXNrLCBzZWxmLnN0YXRzLCByZXN1bHQsIHNlbGYpLCBzZWxmLmNmZ0RhdGEpCisgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV9ub3Rjb3ZlcmVkLmFkZCh0YXNrKQorICAgICAgICBzZWxmLnNjZW5lcXVldWVfdXBkYXRlY291bnRlcnModGFzaywgVHJ1ZSkKKworICAgIGRlZiB0YXNrX2ZhaWxvdXRyaWdodChzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5ydW5xX3J1bm5pbmdbdGFza10gPSAxCisgICAgICAgIHNlbGYucnVucV9idWlsZGFibGVbdGFza10gPSAxCisgICAgICAgIHNlbGYuc3RhdHMudGFza0NvbXBsZXRlZCgpCisgICAgICAgIHNlbGYuc3RhdHMudGFza1NraXBwZWQoKQorICAgICAgICBpbmRleCA9IHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbdGFza10KKyAgICAgICAgc2VsZi5zY2VuZXF1ZXVlX25vdGNvdmVyZWQuYWRkKHRhc2spCisgICAgICAgIHNlbGYuc2NlbmVxdWV1ZV91cGRhdGVjb3VudGVycyh0YXNrLCBUcnVlKQorCisgICAgZGVmIHRhc2tfc2tpcChzZWxmLCB0YXNrKToKKyAgICAgICAgc2VsZi5ydW5xX3J1bm5pbmdbdGFza10gPSAxCisgICAgICAgIHNlbGYucnVucV9idWlsZGFibGVbdGFza10gPSAxCisgICAgICAgIHNlbGYudGFza19jb21wbGV0ZW91dHJpZ2h0KHRhc2spCisgICAgICAgIHNlbGYuc3RhdHMudGFza0NvbXBsZXRlZCgpCisgICAgICAgIHNlbGYuc3RhdHMudGFza1NraXBwZWQoKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSdW4gdGhlIHRhc2tzIGluIGEgcXVldWUgcHJlcGFyZWQgYnkgcHJlcGFyZV9ydW5xdWV1ZQorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnJxLnJlYWRfd29ya2VycygpCisKKyAgICAgICAgdGFzayA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5zdGF0cy5hY3RpdmUgPCBzZWxmLm51bWJlcl90YXNrczoKKyAgICAgICAgICAgICMgRmluZCB0aGUgbmV4dCBzZXRzY2VuZSB0byBydW4KKyAgICAgICAgICAgIGZvciBuZXh0dGFzayBpbiB4cmFuZ2Uoc2VsZi5zdGF0cy50b3RhbCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5ydW5xX2J1aWxkYWJsZVtuZXh0dGFza10gPT0gMSBhbmQgc2VsZi5ydW5xX3J1bm5pbmdbbmV4dHRhc2tdICE9IDE6CisgICAgICAgICAgICAgICAgICAgIGlmIG5leHR0YXNrIGluIHNlbGYudW5za2lwcGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlNldHNjZW5lIHRhc2sgJXMgaXMgdW5za2lwcGFibGUiICUgc2VsZi5ycWRhdGEuZ2V0X3VzZXJfaWRzdHJpbmcoc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVtuZXh0dGFza10pKSAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV4dHRhc2sgbm90IGluIHNlbGYudW5za2lwcGFibGUgYW5kIGxlbihzZWxmLnNxX3JldmRlcHNbbmV4dHRhc2tdKSA+IDAgYW5kIHNlbGYuc3FfcmV2ZGVwc1tuZXh0dGFza10uaXNzdWJzZXQoc2VsZi5zY2VuZXF1ZXVlX2NvdmVyZWQpIGFuZCBzZWxmLmNoZWNrX2RlcGVuZGVuY2llcyhuZXh0dGFzaywgc2VsZi5zcV9yZXZkZXBzW25leHR0YXNrXSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZWFsdGFzayA9IHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbbmV4dHRhc2tdCisgICAgICAgICAgICAgICAgICAgICAgICBmbiA9IHNlbGYucnFkYXRhLnRhc2tEYXRhLmZuX2luZGV4W3NlbGYucnFkYXRhLnJ1bnFfZm5pZFtyZWFsdGFza11dCisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZHRhcmdldCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYucnFkYXRhLnRhcmdldF9wYWlyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0YXJnZXRbMF0gPT0gZm4gYW5kIHRhcmdldFsxXSA9PSBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbcmVhbHRhc2tdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZHRhcmdldCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZHRhcmdldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIlNraXBwaW5nIHNldHNjZW5lIGZvciB0YXNrICVzIiAlIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbbmV4dHRhc2tdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tfc2tpcChuZXh0dGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNjZW5lcXVldWVfbm90bmVlZGVkLmFkZChuZXh0dGFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBuZXh0dGFzayBpbiBzZWxmLm91dHJpZ2h0ZmFpbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFza19mYWlsb3V0cmlnaHQobmV4dHRhc2spCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICB0YXNrID0gbmV4dHRhc2sKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgdGFzayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlYWx0YXNrID0gc2VsZi5ycWRhdGEucnVucV9zZXRzY2VuZVt0YXNrXQorICAgICAgICAgICAgZm4gPSBzZWxmLnJxZGF0YS50YXNrRGF0YS5mbl9pbmRleFtzZWxmLnJxZGF0YS5ydW5xX2ZuaWRbcmVhbHRhc2tdXQorCisgICAgICAgICAgICB0YXNrbmFtZSA9IHNlbGYucnFkYXRhLnJ1bnFfdGFza1tyZWFsdGFza10gKyAiX3NldHNjZW5lIgorICAgICAgICAgICAgaWYgc2VsZi5ycS5jaGVja19zdGFtcF90YXNrKHJlYWx0YXNrLCBzZWxmLnJxZGF0YS5ydW5xX3Rhc2tbcmVhbHRhc2tdLCByZWN1cnNlID0gVHJ1ZSwgY2FjaGU9c2VsZi5zdGFtcGNhY2hlKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgJ1N0YW1wIGZvciB1bmRlcmx5aW5nIHRhc2sgJXMoJXMpIGlzIGN1cnJlbnQsIHNvIHNraXBwaW5nIHNldHNjZW5lIHZhcmlhbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhyZWFsdGFzaykpCisgICAgICAgICAgICAgICAgc2VsZi50YXNrX2ZhaWxvdXRyaWdodCh0YXNrKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIGlmIHNlbGYuY29va2VyLmNvbmZpZ3VyYXRpb24uZm9yY2U6CisgICAgICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLnJxZGF0YS50YXJnZXRfcGFpcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIHRhcmdldFswXSA9PSBmbiBhbmQgdGFyZ2V0WzFdID09IHNlbGYucnFkYXRhLnJ1bnFfdGFza1tyZWFsdGFza106CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tfZmFpbG91dHJpZ2h0KHRhc2spCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICBpZiBzZWxmLnJxLmNoZWNrX3N0YW1wX3Rhc2socmVhbHRhc2ssIHRhc2tuYW1lLCBjYWNoZT1zZWxmLnN0YW1wY2FjaGUpOgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAnU2V0c2NlbmUgc3RhbXAgY3VycmVudCB0YXNrICVzKCVzKSwgc28gc2tpcCBpdCBhbmQgaXRzIGRlcGVuZGVuY2llcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2ssIHNlbGYucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHJlYWx0YXNrKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhc2tfc2tpcCh0YXNrKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIHN0YXJ0ZXZlbnQgPSBzY2VuZVF1ZXVlVGFza1N0YXJ0ZWQodGFzaywgc2VsZi5zdGF0cywgc2VsZi5ycSkKKyAgICAgICAgICAgIGJiLmV2ZW50LmZpcmUoc3RhcnRldmVudCwgc2VsZi5jZmdEYXRhKQorCisgICAgICAgICAgICB0YXNrZGVwID0gc2VsZi5ycWRhdGEuZGF0YUNhY2hlLnRhc2tfZGVwc1tmbl0KKyAgICAgICAgICAgIGlmICdmYWtlcm9vdCcgaW4gdGFza2RlcCBhbmQgdGFza25hbWUgaW4gdGFza2RlcFsnZmFrZXJvb3QnXToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5ycS5mYWtld29ya2VyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJxLnN0YXJ0X2Zha2V3b3JrZXIoc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLnJxLmZha2V3b3JrZXIuc3RkaW4ud3JpdGUoIjxydW50YXNrPiIgKyBwaWNrbGUuZHVtcHMoKGZuLCByZWFsdGFzaywgdGFza25hbWUsIFRydWUsIHNlbGYuY29va2VyLmNvbGxlY3Rpb24uZ2V0X2ZpbGVfYXBwZW5kcyhmbiksIE5vbmUpKSArICI8L3J1bnRhc2s+IikKKyAgICAgICAgICAgICAgICBzZWxmLnJxLmZha2V3b3JrZXIuc3RkaW4uZmx1c2goKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJxLndvcmtlci5zdGRpbi53cml0ZSgiPHJ1bnRhc2s+IiArIHBpY2tsZS5kdW1wcygoZm4sIHJlYWx0YXNrLCB0YXNrbmFtZSwgVHJ1ZSwgc2VsZi5jb29rZXIuY29sbGVjdGlvbi5nZXRfZmlsZV9hcHBlbmRzKGZuKSwgTm9uZSkpICsgIjwvcnVudGFzaz4iKQorICAgICAgICAgICAgICAgIHNlbGYucnEud29ya2VyLnN0ZGluLmZsdXNoKCkKKworICAgICAgICAgICAgc2VsZi5ydW5xX3J1bm5pbmdbdGFza10gPSAxCisgICAgICAgICAgICBzZWxmLnN0YXRzLnRhc2tBY3RpdmUoKQorICAgICAgICAgICAgaWYgc2VsZi5zdGF0cy5hY3RpdmUgPCBzZWxmLm51bWJlcl90YXNrczoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGlmIHNlbGYuc3RhdHMuYWN0aXZlID4gMDoKKyAgICAgICAgICAgIHNlbGYucnEucmVhZF93b3JrZXJzKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJxLmFjdGl2ZV9mZHMoKQorCisgICAgICAgICNmb3IgdGFzayBpbiB4cmFuZ2Uoc2VsZi5zdGF0cy50b3RhbCk6CisgICAgICAgICMgICAgaWYgc2VsZi5ydW5xX3J1bm5pbmdbdGFza10gIT0gMToKKyAgICAgICAgIyAgICAgICAgYnVpbGRhYmxlID0gc2VsZi5ydW5xX2J1aWxkYWJsZVt0YXNrXQorICAgICAgICAjICAgICAgICByZXZkZXBzID0gc2VsZi5zcV9yZXZkZXBzW3Rhc2tdCisgICAgICAgICMgICAgICAgIGJiLndhcm4oIkZvdW5kIHdlIGRpZG4ndCBydW4gJXMgJXMgJXMgJXMiICUgKHRhc2ssIGJ1aWxkYWJsZSwgc3RyKHJldmRlcHMpLCBzZWxmLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdKSkpCisKKyAgICAgICAgIyBDb252ZXJ0IHNjZW5lcXVldWVfY292ZXJlZCB0YXNrIG51bWJlcnMgaW50byBmdWxsIHRhc2tncmFwaCBpZHMKKyAgICAgICAgb2xkY292ZXJlZCA9IHNlbGYuc2NlbmVxdWV1ZV9jb3ZlcmVkCisgICAgICAgIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkID0gc2V0KCkKKyAgICAgICAgZm9yIHRhc2sgaW4gb2xkY292ZXJlZDoKKyAgICAgICAgICAgIHNlbGYucnEuc2NlbmVxdWV1ZV9jb3ZlcmVkLmFkZChzZWxmLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdKQorICAgICAgICBzZWxmLnJxLnNjZW5lcXVldWVfbm90Y292ZXJlZCA9IHNldCgpCisgICAgICAgIGZvciB0YXNrIGluIHNlbGYuc2NlbmVxdWV1ZV9ub3Rjb3ZlcmVkOgorICAgICAgICAgICAgc2VsZi5ycS5zY2VuZXF1ZXVlX25vdGNvdmVyZWQuYWRkKHNlbGYucnFkYXRhLnJ1bnFfc2V0c2NlbmVbdGFza10pCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICdXZSBjYW4gc2tpcCB0YXNrcyAlcycsIHNvcnRlZChzZWxmLnJxLnNjZW5lcXVldWVfY292ZXJlZCkpCisKKyAgICAgICAgc2VsZi5ycS5zdGF0ZSA9IHJ1blF1ZXVlUnVuSW5pdAorCisgICAgICAgIGNvbXBsZXRlZXZlbnQgPSBzY2VuZVF1ZXVlQ29tcGxldGUoc2VsZi5zdGF0cywgc2VsZi5ycSkKKyAgICAgICAgYmIuZXZlbnQuZmlyZShjb21wbGV0ZWV2ZW50LCBzZWxmLmNmZ0RhdGEpCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBydW5xdWV1ZV9wcm9jZXNzX3dhaXRwaWQoc2VsZiwgdGFzaywgc3RhdHVzKToKKyAgICAgICAgdGFzayA9IHNlbGYucnEucnFkYXRhLnJ1bnFfc2V0c2NlbmUuaW5kZXgodGFzaykKKworICAgICAgICBSdW5RdWV1ZUV4ZWN1dGUucnVucXVldWVfcHJvY2Vzc193YWl0cGlkKHNlbGYsIHRhc2ssIHN0YXR1cykKKworY2xhc3MgVGFza0ZhaWx1cmUoRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSB0YXNrIGluIGEgcnVucXVldWUgZmFpbHMKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgIHNlbGYuYXJncyA9IHgKKworCitjbGFzcyBydW5RdWV1ZUV4aXRXYWl0KGJiLmV2ZW50LkV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCB3aGVuIHdhaXRpbmcgZm9yIHRhc2sgcHJvY2Vzc2VzIHRvIGV4aXQKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZW1haW4pOgorICAgICAgICBzZWxmLnJlbWFpbiA9IHJlbWFpbgorICAgICAgICBzZWxmLm1lc3NhZ2UgPSAiV2FpdGluZyBmb3IgJXMgYWN0aXZlIHRhc2tzIHRvIGZpbmlzaCIgJSByZW1haW4KKyAgICAgICAgYmIuZXZlbnQuRXZlbnQuX19pbml0X18oc2VsZikKKworY2xhc3MgcnVuUXVldWVFdmVudChiYi5ldmVudC5FdmVudCk6CisgICAgIiIiCisgICAgQmFzZSBydW5RdWV1ZSBldmVudCBjbGFzcworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEpOgorICAgICAgICBzZWxmLnRhc2tpZCA9IHRhc2sKKyAgICAgICAgc2VsZi50YXNrc3RyaW5nID0gcnEucnFkYXRhLmdldF91c2VyX2lkc3RyaW5nKHRhc2spCisgICAgICAgIHNlbGYudGFza25hbWUgPSBycS5ycWRhdGEuZ2V0X3Rhc2tfbmFtZSh0YXNrKQorICAgICAgICBzZWxmLnRhc2tmaWxlID0gcnEucnFkYXRhLmdldF90YXNrX2ZpbGUodGFzaykKKyAgICAgICAgc2VsZi50YXNraGFzaCA9IHJxLnJxZGF0YS5nZXRfdGFza19oYXNoKHRhc2spCisgICAgICAgIHNlbGYuc3RhdHMgPSBzdGF0cy5jb3B5KCkKKyAgICAgICAgYmIuZXZlbnQuRXZlbnQuX19pbml0X18oc2VsZikKKworY2xhc3Mgc2NlbmVRdWV1ZUV2ZW50KHJ1blF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEJhc2Ugc2NlbmVRdWV1ZSBldmVudCBjbGFzcworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEsIG5vZXhlYz1GYWxzZSk6CisgICAgICAgIHJ1blF1ZXVlRXZlbnQuX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxKQorICAgICAgICByZWFsdGFzayA9IHJxLnJxZGF0YS5ydW5xX3NldHNjZW5lW3Rhc2tdCisgICAgICAgIHNlbGYudGFza3N0cmluZyA9IHJxLnJxZGF0YS5nZXRfdXNlcl9pZHN0cmluZyhyZWFsdGFzaywgIl9zZXRzY2VuZSIpCisgICAgICAgIHNlbGYudGFza25hbWUgPSBycS5ycWRhdGEuZ2V0X3Rhc2tfbmFtZShyZWFsdGFzaykgKyAiX3NldHNjZW5lIgorICAgICAgICBzZWxmLnRhc2tmaWxlID0gcnEucnFkYXRhLmdldF90YXNrX2ZpbGUocmVhbHRhc2spCisgICAgICAgIHNlbGYudGFza2hhc2ggPSBycS5ycWRhdGEuZ2V0X3Rhc2tfaGFzaChyZWFsdGFzaykKKworY2xhc3MgcnVuUXVldWVUYXNrU3RhcnRlZChydW5RdWV1ZUV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCBub3RpZnlpbmcgYSB0YXNrIHdhcyBzdGFydGVkCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBycSwgbm9leGVjPUZhbHNlKToKKyAgICAgICAgcnVuUXVldWVFdmVudC5fX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEpCisgICAgICAgIHNlbGYubm9leGVjID0gbm9leGVjCisKK2NsYXNzIHNjZW5lUXVldWVUYXNrU3RhcnRlZChzY2VuZVF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IG5vdGlmeWluZyBhIHNldHNjZW5lIHRhc2sgd2FzIHN0YXJ0ZWQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxLCBub2V4ZWM9RmFsc2UpOgorICAgICAgICBzY2VuZVF1ZXVlRXZlbnQuX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxKQorICAgICAgICBzZWxmLm5vZXhlYyA9IG5vZXhlYworCitjbGFzcyBydW5RdWV1ZVRhc2tGYWlsZWQocnVuUXVldWVFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgbm90aWZ5aW5nIGEgdGFzayBmYWlsZWQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIGV4aXRjb2RlLCBycSk6CisgICAgICAgIHJ1blF1ZXVlRXZlbnQuX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxKQorICAgICAgICBzZWxmLmV4aXRjb2RlID0gZXhpdGNvZGUKKworY2xhc3Mgc2NlbmVRdWV1ZVRhc2tGYWlsZWQoc2NlbmVRdWV1ZUV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCBub3RpZnlpbmcgYSBzZXRzY2VuZSB0YXNrIGZhaWxlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgZXhpdGNvZGUsIHJxKToKKyAgICAgICAgc2NlbmVRdWV1ZUV2ZW50Ll9faW5pdF9fKHNlbGYsIHRhc2ssIHN0YXRzLCBycSkKKyAgICAgICAgc2VsZi5leGl0Y29kZSA9IGV4aXRjb2RlCisKK2NsYXNzIHNjZW5lUXVldWVDb21wbGV0ZShzY2VuZVF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IHdoZW4gYWxsIHRoZSBzY2VuZVF1ZXVlIHRhc2tzIGFyZSBjb21wbGV0ZQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGF0cywgcnEpOgorICAgICAgICBzZWxmLnN0YXRzID0gc3RhdHMuY29weSgpCisgICAgICAgIGJiLmV2ZW50LkV2ZW50Ll9faW5pdF9fKHNlbGYpCisKK2NsYXNzIHJ1blF1ZXVlVGFza0NvbXBsZXRlZChydW5RdWV1ZUV2ZW50KToKKyAgICAiIiIKKyAgICBFdmVudCBub3RpZnlpbmcgYSB0YXNrIGNvbXBsZXRlZAorICAgICIiIgorCitjbGFzcyBzY2VuZVF1ZXVlVGFza0NvbXBsZXRlZChzY2VuZVF1ZXVlRXZlbnQpOgorICAgICIiIgorICAgIEV2ZW50IG5vdGlmeWluZyBhIHNldHNjZW5lIHRhc2sgY29tcGxldGVkCisgICAgIiIiCisKK2NsYXNzIHJ1blF1ZXVlVGFza1NraXBwZWQocnVuUXVldWVFdmVudCk6CisgICAgIiIiCisgICAgRXZlbnQgbm90aWZ5aW5nIGEgdGFzayB3YXMgc2tpcHBlZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXNrLCBzdGF0cywgcnEsIHJlYXNvbik6CisgICAgICAgIHJ1blF1ZXVlRXZlbnQuX19pbml0X18oc2VsZiwgdGFzaywgc3RhdHMsIHJxKQorICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgorCitjbGFzcyBydW5RdWV1ZVBpcGUoKToKKyAgICAiIiIKKyAgICBBYnN0cmFjdGlvbiBmb3IgYSBwaXBlIGJldHdlZW4gYSB3b3JrZXIgdGhyZWFkIGFuZCB0aGUgc2VydmVyCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBpcGVpbiwgcGlwZW91dCwgZCwgcnEsIHJxZXhlYyk6CisgICAgICAgIHNlbGYuaW5wdXQgPSBwaXBlaW4KKyAgICAgICAgaWYgcGlwZW91dDoKKyAgICAgICAgICAgIHBpcGVvdXQuY2xvc2UoKQorICAgICAgICBiYi51dGlscy5ub25ibG9ja2luZ2ZkKHNlbGYuaW5wdXQpCisgICAgICAgIHNlbGYucXVldWUgPSAiIgorICAgICAgICBzZWxmLmQgPSBkCisgICAgICAgIHNlbGYucnEgPSBycQorICAgICAgICBzZWxmLnJxZXhlYyA9IHJxZXhlYworCisgICAgZGVmIHNldHJ1bnF1ZXVlZXhlYyhzZWxmLCBycWV4ZWMpOgorICAgICAgICBzZWxmLnJxZXhlYyA9IHJxZXhlYworCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGZvciB3IGluIFtzZWxmLnJxLndvcmtlciwgc2VsZi5ycS5mYWtld29ya2VyXToKKyAgICAgICAgICAgIGlmIG5vdCB3OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB3LnBvbGwoKQorICAgICAgICAgICAgaWYgdy5yZXR1cm5jb2RlIGlzIG5vdCBOb25lIGFuZCBub3Qgc2VsZi5ycS50ZWFyZG93bjoKKyAgICAgICAgICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIHNlbGYucnEud29ya2VyIGFuZCB3LnBpZCA9PSBzZWxmLnJxLndvcmtlci5waWQ6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiV29ya2VyIgorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5ycS5mYWtld29ya2VyIGFuZCB3LnBpZCA9PSBzZWxmLnJxLmZha2V3b3JrZXIucGlkOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkZha2Vyb290IgorICAgICAgICAgICAgICAgIGJiLmVycm9yKCIlcyBwcm9jZXNzICglcykgZXhpdGVkIHVuZXhwZWN0ZWRseSAoJXMpLCBzaHV0dGluZyBkb3duLi4uIiAlIChuYW1lLCB3LnBpZCwgc3RyKHcucmV0dXJuY29kZSkpKQorICAgICAgICAgICAgICAgIHNlbGYucnEuZmluaXNoX3J1bnF1ZXVlKFRydWUpCisKKyAgICAgICAgc3RhcnQgPSBsZW4oc2VsZi5xdWV1ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHNlbGYucXVldWUgKyBzZWxmLmlucHV0LnJlYWQoMTAyNDAwKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVBR0FJTjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbmQgPSBsZW4oc2VsZi5xdWV1ZSkKKyAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgIHdoaWxlIGZvdW5kIGFuZCBsZW4oc2VsZi5xdWV1ZSk6CisgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgICAgICBpbmRleCA9IHNlbGYucXVldWUuZmluZCgiPC9ldmVudD4iKQorICAgICAgICAgICAgd2hpbGUgaW5kZXggIT0gLTEgYW5kIHNlbGYucXVldWUuc3RhcnRzd2l0aCgiPGV2ZW50PiIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBwaWNrbGUubG9hZHMoc2VsZi5xdWV1ZVs3OmluZGV4XSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlJ1blF1ZXVlIiwgImZhaWxlZCBsb2FkIHBpY2tsZSAnJXMnOiAnJXMnIiAlIChlLCBzZWxmLnF1ZXVlWzc6aW5kZXhdKSkKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlX2Zyb21fd29ya2VyKGV2ZW50LCBzZWxmLmQpCisgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHNlbGYucXVldWVbaW5kZXgrODpdCisgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLnF1ZXVlLmZpbmQoIjwvZXZlbnQ+IikKKyAgICAgICAgICAgIGluZGV4ID0gc2VsZi5xdWV1ZS5maW5kKCI8L2V4aXRjb2RlPiIpCisgICAgICAgICAgICB3aGlsZSBpbmRleCAhPSAtMSBhbmQgc2VsZi5xdWV1ZS5zdGFydHN3aXRoKCI8ZXhpdGNvZGU+Iik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0YXNrLCBzdGF0dXMgPSBwaWNrbGUubG9hZHMoc2VsZi5xdWV1ZVsxMDppbmRleF0pCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgYmIubXNnLmZhdGFsKCJSdW5RdWV1ZSIsICJmYWlsZWQgbG9hZCBwaWNrbGUgJyVzJzogJyVzJyIgJSAoZSwgc2VsZi5xdWV1ZVsxMDppbmRleF0pKQorICAgICAgICAgICAgICAgIHNlbGYucnFleGVjLnJ1bnF1ZXVlX3Byb2Nlc3Nfd2FpdHBpZCh0YXNrLCBzdGF0dXMpCisgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHNlbGYucXVldWVbaW5kZXgrMTE6XQorICAgICAgICAgICAgICAgIGluZGV4ID0gc2VsZi5xdWV1ZS5maW5kKCI8L2V4aXRjb2RlPiIpCisgICAgICAgIHJldHVybiAoZW5kID4gc3RhcnQpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYucmVhZCgpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbGVuKHNlbGYucXVldWUpID4gMDoKKyAgICAgICAgICAgIHByaW50KCJXYXJuaW5nLCB3b3JrZXIgbGVmdCBwYXJ0aWFsIG1lc3NhZ2U6ICVzIiAlIHNlbGYucXVldWUpCisgICAgICAgIHNlbGYuaW5wdXQuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvc2VydmVyL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvc2VydmVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWU0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9zZXJ2ZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSw5NiBAQAorIworIyBCaXRCYWtlIEJhc2UgU2VydmVyIENvZGUKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyAgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA4ICBSaWNoYXJkIFB1cmRpZQorIyBDb3B5cmlnaHQgKEMpIDIwMTMgICAgICAgICBBbGV4YW5kcnUgRGFtaWFuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisiIiIgQmFzZSBjb2RlIGZvciBCaXRiYWtlIHNlcnZlciBwcm9jZXNzCisKK0hhdmUgYSBjb21tb24gYmFzZSBmb3IgdGhhdCBhbGwgQml0YmFrZSBzZXJ2ZXIgY2xhc3NlcyBlbnN1cmVzIGEgY29uc2lzdGVudAorYXBwcm9hY2ggdG8gdGhlIGludGVyZmFjZSwgYW5kIG1pbmltaXplIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBjb2RlIGR1cGxpY2F0aW9uLgorCisiIiIKKworIiIiICBCYXNlSW1wbFNlcnZlcigpIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgWFhTZXJ2ZXIoKSBpbXBsZW1lbnRhdGlvbnMuCisKKyAgICBUaGVzZSBjbGFzc2VzIGNvbnRhaW4gdGhlIGFjdHVhbCBjb2RlIHRoYXQgcnVucyB0aGUgc2VydmVyIHNpZGUsIGkuZS4KKyAgICBsaXN0ZW5zIGZvciB0aGUgY29tbWFuZHMgYW5kIGV4ZWN1dGVzIHRoZW0uIEFsdGhvdWdoIHRoZXNlIGltcGxlbWVudGF0aW9ucworICAgIGNvbnRhaW4gYWxsIHRoZSBkYXRhIG9mIHRoZSBvcmlnaW5hbCBiaXRiYWtlIGNvbW1hbmQsIGkuZSB0aGUgY29va2VyIGluc3RhbmNlLAorICAgIHRoZXkgbWF5IHdlbGwgcnVuIG9uIGEgZGlmZmVyZW50IHByb2Nlc3Mgb3IgZXZlbiBtYWNoaW5lLgorCisiIiIKKworY2xhc3MgQmFzZUltcGxTZXJ2ZXIoKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2lkbGVmdW5zID0ge30KKworICAgIGRlZiBhZGRjb29rZXIoc2VsZiwgY29va2VyKToKKyAgICAgICAgc2VsZi5jb29rZXIgPSBjb29rZXIKKworICAgIGRlZiByZWdpc3Rlcl9pZGxlX2Z1bmN0aW9uKHNlbGYsIGZ1bmN0aW9uLCBkYXRhKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hpbGUgdGhlIHNlcnZlciBpcyBpZGxlIiIiCisgICAgICAgIGFzc2VydCBoYXNhdHRyKGZ1bmN0aW9uLCAnX19jYWxsX18nKQorICAgICAgICBzZWxmLl9pZGxlZnVuc1tmdW5jdGlvbl0gPSBkYXRhCisKKworCisiIiIgQml0QmFrZUJhc2VTZXJ2ZXJDb25uZWN0aW9uIGNsYXNzIGlzIHRoZSBjb21tb24gYW5jZXN0b3IgdG8gYWxsCisgICAgQml0QmFrZVNlcnZlckNvbm5lY3Rpb24gY2xhc3Nlcy4KKworICAgIFRoZXNlIGNsYXNzZXMgY29udHJvbCB0aGUgcmVtb3RlIHNlcnZlci4gVGhlIG9ubHkgY29tbWFuZCBjdXJyZW50bHkKKyAgICBpbXBsZW1lbnRlZCBpcyB0aGUgdGVybWluYXRlKCkgY29tbWFuZC4KKworIiIiCisKK2NsYXNzIEJpdEJha2VCYXNlU2VydmVyQ29ubmVjdGlvbigpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJJbXBsKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgcGFzcworCisKKyIiIiBCaXRCYWtlQmFzZVNlcnZlciBjbGFzcyBpcyB0aGUgY29tbW9uIGFuY2VzdG9yIHRvIGFsbCBCaXRiYWtlIHNlcnZlcnMKKworICAgIERlcml2ZSB0aGlzIGNsYXNzIGluIG9yZGVyIHRvIGltcGxlbWVudCBhIEJpdEJha2VTZXJ2ZXIgd2hpY2ggaXMgdGhlCisgICAgY29udHJvbGxpbmcgc3R1YiBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKworIiIiCitjbGFzcyBCaXRCYWtlQmFzZVNlcnZlcihvYmplY3QpOgorICAgIGRlZiBpbml0U2VydmVyKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlckltcGwgPSBOb25lICAjIHdlIGVuc3VyZSBhIHJ1bnRpbWUgY3Jhc2ggaWYgbm90IG92ZXJsb2FkZWQKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gTm9uZQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBhZGRjb29rZXIoc2VsZiwgY29va2VyKToKKyAgICAgICAgc2VsZi5jb29rZXIgPSBjb29rZXIKKyAgICAgICAgc2VsZi5zZXJ2ZXJJbXBsLmFkZGNvb2tlcihjb29rZXIpCisKKyAgICBkZWYgZ2V0U2VydmVySWRsZUNCKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXJ2ZXJJbXBsLnJlZ2lzdGVyX2lkbGVfZnVuY3Rpb24KKworICAgIGRlZiBzYXZlQ29ubmVjdGlvbkRldGFpbHMoc2VsZik6CisgICAgICAgIHJldHVybgorCisgICAgZGVmIGRldGFjaChzZWxmKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZXN0YWJsaXNoQ29ubmVjdGlvbihzZWxmLCBmZWF0dXJlc2V0KToKKyAgICAgICAgcmFpc2UgICAiTXVzdCByZWRlZmluZSB0aGUgJXMuZXN0YWJsaXNoQ29ubmVjdGlvbigpIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICBkZWYgZW5kU2Vzc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLnRlcm1pbmF0ZSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi9zZXJ2ZXIvcHJvY2Vzcy5weSBiL2JpdGJha2UvbGliL2JiL3NlcnZlci9wcm9jZXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2EzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9zZXJ2ZXIvcHJvY2Vzcy5weQpAQCAtMCwwICsxLDI2NCBAQAorIworIyBCaXRCYWtlIFByb2Nlc3MgYmFzZWQgc2VydmVyLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgQm9iIEZvZXJzdGVyIDxyb2JlcnRAZXJhZnguY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIiIiCisgICAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzIGJhc2VkIHNlcnZlciBmb3IgYml0YmFrZS4KKyIiIgorCitpbXBvcnQgYmIKK2ltcG9ydCBiYi5ldmVudAoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBzZWxlY3QKK2Zyb20gUXVldWUgaW1wb3J0IEVtcHR5Citmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgRXZlbnQsIFByb2Nlc3MsIHV0aWwsIFF1ZXVlLCBQaXBlLCBxdWV1ZXMsIE1hbmFnZXIKKworZnJvbSAuIGltcG9ydCBCaXRCYWtlQmFzZVNlcnZlciwgQml0QmFrZUJhc2VTZXJ2ZXJDb25uZWN0aW9uLCBCYXNlSW1wbFNlcnZlcgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZScpCisKK2NsYXNzIFNlcnZlckNvbW11bmljYXRvcigpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uZWN0aW9uLCBldmVudF9oYW5kbGUsIHNlcnZlcik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KKyAgICAgICAgc2VsZi5ldmVudF9oYW5kbGUgPSBldmVudF9oYW5kbGUKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKworICAgIGRlZiBydW5Db21tYW5kKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICAjIEB0b2RvIHRyeS9leGNlcHQKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLnNlbmQoY29tbWFuZCkKKworICAgICAgICBpZiBub3Qgc2VsZi5zZXJ2ZXIuaXNfYWxpdmUoKToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBkb24ndCBsZXQgdGhlIHVzZXIgY3RybC1jIHdoaWxlIHdlJ3JlIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpb24ucG9sbCgyMCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24ucmVjdigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYmIuZmF0YWwoIlRpbWVvdXQgd2hpbGUgYXR0ZW1wdGluZyB0byBjb21tdW5pY2F0ZSB3aXRoIGJpdGJha2Ugc2VydmVyIikKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0RXZlbnRIYW5kbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV2ZW50X2hhbmRsZS52YWx1ZQorCitjbGFzcyBFdmVudEFkYXB0ZXIoKToKKyAgICAiIiIKKyAgICBBZGFwdGVyIHRvIHdyYXAgb3VyIGV2ZW50IHF1ZXVlIHNpbmNlIHRoZSBjYWxsZXIgKGJiLmV2ZW50KSBleHBlY3RzIHRvCisgICAgY2FsbCBhIHNlbmQoKSBtZXRob2QsIGJ1dCBvdXIgYWN0dWFsIHF1ZXVlIG9ubHkgaGFzIHB1dCgpCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHF1ZXVlKToKKyAgICAgICAgc2VsZi5xdWV1ZSA9IHF1ZXVlCisKKyAgICBkZWYgc2VuZChzZWxmLCBldmVudCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucXVldWUucHV0KGV2ZW50KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgICAgIHByaW50KCJFdmVudEFkYXB0ZXIgcHVrZWQ6ICVzIiAlIHN0cihlcnIpKQorCisKK2NsYXNzIFByb2Nlc3NTZXJ2ZXIoUHJvY2VzcywgQmFzZUltcGxTZXJ2ZXIpOgorICAgIHByb2ZpbGVfZmlsZW5hbWUgPSAicHJvZmlsZS5sb2ciCisgICAgcHJvZmlsZV9wcm9jZXNzZWRfZmlsZW5hbWUgPSAicHJvZmlsZS5sb2cucHJvY2Vzc2VkIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmRfY2hhbm5lbCwgZXZlbnRfcXVldWUsIGZlYXR1cmVsaXN0KToKKyAgICAgICAgQmFzZUltcGxTZXJ2ZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgUHJvY2Vzcy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNvbW1hbmRfY2hhbm5lbCA9IGNvbW1hbmRfY2hhbm5lbAorICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlID0gZXZlbnRfcXVldWUKKyAgICAgICAgc2VsZi5ldmVudCA9IEV2ZW50QWRhcHRlcihldmVudF9xdWV1ZSkKKyAgICAgICAgc2VsZi5mZWF0dXJlbGlzdCA9IGZlYXR1cmVsaXN0CisgICAgICAgIHNlbGYucXVpdCA9IEZhbHNlCisKKyAgICAgICAgc2VsZi5xdWl0aW4sIHNlbGYucXVpdG91dCA9IFBpcGUoKQorICAgICAgICBzZWxmLmV2ZW50X2hhbmRsZSA9IG11bHRpcHJvY2Vzc2luZy5WYWx1ZSgiaSIpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBmb3IgZXZlbnQgaW4gYmIuZXZlbnQudWlfcXVldWU6CisgICAgICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlLnB1dChldmVudCkKKyAgICAgICAgc2VsZi5ldmVudF9oYW5kbGUudmFsdWUgPSBiYi5ldmVudC5yZWdpc3Rlcl9VSUhoYW5kbGVyKHNlbGYsIFRydWUpCisKKyAgICAgICAgYmIuY29va2VyLnNlcnZlcl9tYWluKHNlbGYuY29va2VyLCBzZWxmLm1haW4pCisKKyAgICBkZWYgbWFpbihzZWxmKToKKyAgICAgICAgIyBJZ25vcmUgU0lHSU5UIHdpdGhpbiB0aGUgc2VydmVyLCBhcyBhbGwgU0lHSU5UIGhhbmRsaW5nIGlzIGRvbmUgYnkKKyAgICAgICAgIyB0aGUgVUkgYW5kIGNvbW11bmljYXRlZCB0byB1cworICAgICAgICBzZWxmLnF1aXRpbi5jbG9zZSgpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgc2lnbmFsLlNJR19JR04pCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb21tYW5kX2NoYW5uZWwucG9sbCgpOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gc2VsZi5jb21tYW5kX2NoYW5uZWwucmVjdigpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChjb21tYW5kKQorICAgICAgICAgICAgICAgIGlmIHNlbGYucXVpdG91dC5wb2xsKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucXVpdG91dC5yZWN2KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWl0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgc2VsZi5pZGxlX2NvbW1hbmRzKC4xLCBbc2VsZi5jb21tYW5kX2NoYW5uZWwsIHNlbGYucXVpdG91dF0pCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ1J1bm5pbmcgY29tbWFuZCAlcycsIGNvbW1hbmQpCisKKyAgICAgICAgc2VsZi5ldmVudF9xdWV1ZS5jbG9zZSgpCisgICAgICAgIGJiLmV2ZW50LnVucmVnaXN0ZXJfVUlIaGFuZGxlcihzZWxmLmV2ZW50X2hhbmRsZS52YWx1ZSkKKyAgICAgICAgc2VsZi5jb21tYW5kX2NoYW5uZWwuY2xvc2UoKQorICAgICAgICBzZWxmLmNvb2tlci5zaHV0ZG93bihUcnVlKQorICAgICAgICBzZWxmLnF1aXRvdXQuY2xvc2UoKQorCisgICAgZGVmIGlkbGVfY29tbWFuZHMoc2VsZiwgZGVsYXksIGZkcz1Ob25lKToKKyAgICAgICAgbmV4dHNsZWVwID0gZGVsYXkKKyAgICAgICAgaWYgbm90IGZkczoKKyAgICAgICAgICAgIGZkcyA9IFtdCisKKyAgICAgICAgZm9yIGZ1bmN0aW9uLCBkYXRhIGluIHNlbGYuX2lkbGVmdW5zLml0ZW1zKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dmFsID0gZnVuY3Rpb24oc2VsZiwgZGF0YSwgRmFsc2UpCisgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIEZhbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5faWRsZWZ1bnNbZnVuY3Rpb25dCisgICAgICAgICAgICAgICAgICAgIG5leHRzbGVlcCA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIHJldHZhbCBpcyBUcnVlOgorICAgICAgICAgICAgICAgICAgICBuZXh0c2xlZXAgPSBOb25lCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJldHZhbCwgZmxvYXQpOgorICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsIDwgbmV4dHNsZWVwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRzbGVlcCA9IHJldHZhbAorICAgICAgICAgICAgICAgIGVsaWYgbmV4dHNsZWVwIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmRzID0gZmRzICsgcmV0dmFsCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBiYi5CQkhhbmRsZWRFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdSdW5uaW5nIGlkbGUgZnVuY3Rpb24nKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9pZGxlZnVuc1tmdW5jdGlvbl0KKyAgICAgICAgICAgICAgICBzZWxmLnF1aXQgPSBUcnVlCisKKyAgICAgICAgaWYgbmV4dHNsZWVwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChmZHMsW10sW10sbmV4dHNsZWVwKQorCisgICAgZGVmIHJ1bkNvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgICIiIgorICAgICAgICBSdW4gYSBjb29rZXIgY29tbWFuZCBvbiB0aGUgc2VydmVyCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbW1hbmRfY2hhbm5lbC5zZW5kKHNlbGYuY29va2VyLmNvbW1hbmQucnVuQ29tbWFuZChjb21tYW5kKSkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBzZWxmLnF1aXRpbi5zZW5kKCJxdWl0IikKKyAgICAgICAgc2VsZi5xdWl0aW4uY2xvc2UoKQorCitjbGFzcyBCaXRCYWtlUHJvY2Vzc1NlcnZlckNvbm5lY3Rpb24oQml0QmFrZUJhc2VTZXJ2ZXJDb25uZWN0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVySW1wbCwgdWlfY2hhbm5lbCwgZXZlbnRfcXVldWUpOgorICAgICAgICBzZWxmLnByb2NzZXJ2ZXIgPSBzZXJ2ZXJJbXBsCisgICAgICAgIHNlbGYudWlfY2hhbm5lbCA9IHVpX2NoYW5uZWwKKyAgICAgICAgc2VsZi5ldmVudF9xdWV1ZSA9IGV2ZW50X3F1ZXVlCisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IFNlcnZlckNvbW11bmljYXRvcihzZWxmLnVpX2NoYW5uZWwsIHNlbGYucHJvY3NlcnZlci5ldmVudF9oYW5kbGUsIHNlbGYucHJvY3NlcnZlcikKKyAgICAgICAgc2VsZi5ldmVudHMgPSBzZWxmLmV2ZW50X3F1ZXVlCisgICAgICAgIHNlbGYudGVybWluYXRlZCA9IEZhbHNlCisKKyAgICBkZWYgc2lndGVybV90ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIGJiLmVycm9yKCJVSSByZWNlaXZlZCBTSUdURVJNIikKKyAgICAgICAgc2VsZi50ZXJtaW5hdGUoKQorCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZXJtaW5hdGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGVybWluYXRlZCA9IFRydWUKKyAgICAgICAgZGVmIGZsdXNoZXZlbnRzKCk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBzZWxmLmV2ZW50X3F1ZXVlLmdldChibG9jaz1GYWxzZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgKEVtcHR5LCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBsb2dnaW5nLkxvZ1JlY29yZCk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGUoZXZlbnQpCisKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzaWduYWwuU0lHX0lHTikKKyAgICAgICAgc2VsZi5wcm9jc2VydmVyLnN0b3AoKQorCisgICAgICAgIHdoaWxlIHNlbGYucHJvY3NlcnZlci5pc19hbGl2ZSgpOgorICAgICAgICAgICAgZmx1c2hldmVudHMoKQorICAgICAgICAgICAgc2VsZi5wcm9jc2VydmVyLmpvaW4oMC4xKQorCisgICAgICAgIHNlbGYudWlfY2hhbm5lbC5jbG9zZSgpCisgICAgICAgIHNlbGYuZXZlbnRfcXVldWUuY2xvc2UoKQorICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlLnNldGV4aXQoKQorCisjIFdyYXAgUXVldWUgdG8gcHJvdmlkZSBBUEkgd2hpY2ggaXNuJ3Qgc2VydmVyIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCitjbGFzcyBQcm9jZXNzRXZlbnRRdWV1ZShtdWx0aXByb2Nlc3NpbmcucXVldWVzLlF1ZXVlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZSk6CisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5xdWV1ZXMuUXVldWUuX19pbml0X18oc2VsZiwgbWF4c2l6ZSkKKyAgICAgICAgc2VsZi5leGl0ID0gRmFsc2UKKworICAgIGRlZiBzZXRleGl0KHNlbGYpOgorICAgICAgICBzZWxmLmV4aXQgPSBUcnVlCisKKyAgICBkZWYgd2FpdEV2ZW50KHNlbGYsIHRpbWVvdXQpOgorICAgICAgICBpZiBzZWxmLmV4aXQ6CisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zZXJ2ZXIuaXNfYWxpdmUoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNldGV4aXQoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXQoVHJ1ZSwgdGltZW91dCkKKyAgICAgICAgZXhjZXB0IEVtcHR5OgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRFdmVudChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuc2VydmVyLmlzX2FsaXZlKCk6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRleGl0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KEZhbHNlKQorICAgICAgICBleGNlcHQgRW1wdHk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIEJpdEJha2VTZXJ2ZXIoQml0QmFrZUJhc2VTZXJ2ZXIpOgorICAgIGRlZiBpbml0U2VydmVyKHNlbGYpOgorICAgICAgICAjIGVzdGFibGlzaCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLiAgV2UgdXNlIGJpZGlyZWN0aW9uYWwgcGlwZXMgZm9yCisgICAgICAgICMgdWkgPC0tPiBzZXJ2ZXIgY29tbWFuZC9yZXNwb25zZSBwYWlycworICAgICAgICAjIGFuZCBhIHF1ZXVlIGZvciBzZXJ2ZXIgLT4gdWkgZXZlbnQgbm90aWZpY2F0aW9ucworICAgICAgICAjCisgICAgICAgIHNlbGYudWlfY2hhbm5lbCwgc2VsZi5zZXJ2ZXJfY2hhbm5lbCA9IFBpcGUoKQorICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlID0gUHJvY2Vzc0V2ZW50UXVldWUoMCkKKyAgICAgICAgc2VsZi5zZXJ2ZXJJbXBsID0gUHJvY2Vzc1NlcnZlcihzZWxmLnNlcnZlcl9jaGFubmVsLCBzZWxmLmV2ZW50X3F1ZXVlLCBOb25lKQorICAgICAgICBzZWxmLmV2ZW50X3F1ZXVlLnNlcnZlciA9IHNlbGYuc2VydmVySW1wbAorCisgICAgZGVmIGRldGFjaChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJJbXBsLnN0YXJ0KCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZXN0YWJsaXNoQ29ubmVjdGlvbihzZWxmLCBmZWF0dXJlc2V0KToKKworICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBCaXRCYWtlUHJvY2Vzc1NlcnZlckNvbm5lY3Rpb24oc2VsZi5zZXJ2ZXJJbXBsLCBzZWxmLnVpX2NoYW5uZWwsIHNlbGYuZXZlbnRfcXVldWUpCisKKyAgICAgICAgXywgZXJyb3IgPSBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdGlvbi5ydW5Db21tYW5kKFsic2V0RmVhdHVyZXMiLCBmZWF0dXJlc2V0XSkKKyAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBzZXQgdGhlIGNvb2tlciB0byB0aGUgY29ycmVjdCBmZWF0dXJlc2V0OiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgIHJhaXNlIEJhc2VFeGNlcHRpb24oZXJyb3IpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1RFUk0sIGxhbWJkYSBpLCBzOiBzZWxmLmNvbm5lY3Rpb24uc2lndGVybV90ZXJtaW5hdGUoKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvc2VydmVyL3htbHJwYy5weSBiL2JpdGJha2UvbGliL2JiL3NlcnZlci94bWxycGMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NDdjMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3NlcnZlci94bWxycGMucHkKQEAgLTAsMCArMSwzOTIgQEAKKyMKKyMgQml0QmFrZSBYTUxSUEMgU2VydmVyCisjCisjIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgIE1pY2hhZWwgJ01pY2tleScgTGF1ZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwOCAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyIiIgorICAgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4geG1scnBjIHNlcnZlciBmb3IgQml0QmFrZS4KKworICAgIFVzZSB0aGlzIGJ5IGRlcml2aW5nIGEgY2xhc3MgZnJvbSBCaXRCYWtlWE1MUlBDU2VydmVyIGFuZCB0aGVuIGFkZGluZworICAgIG1ldGhvZHMgd2hpY2ggeW91IHdhbnQgdG8gImV4cG9ydCIgdmlhIFhNTFJQQy4gSWYgdGhlIG1ldGhvZHMgaGF2ZSB0aGUKKyAgICBwcmVmaXggeG1scnBjXywgdGhlbiByZWdpc3RlcmluZyB0aG9zZSBmdW5jdGlvbiB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5LAorICAgIGlmIG5vdCwgeW91IG5lZWQgdG8gY2FsbCByZWdpc3Rlcl9mdW5jdGlvbi4KKworICAgIFVzZSByZWdpc3Rlcl9pZGxlX2Z1bmN0aW9uKCkgdG8gYWRkIGEgZnVuY3Rpb24gd2hpY2ggdGhlIHhtbHJwYyBzZXJ2ZXIKKyAgICBjYWxscyBmcm9tIHdpdGhpbiBzZXJ2ZXJfZm9yZXZlciB3aGVuIG5vIHJlcXVlc3RzIGFyZSBwZW5kaW5nLiBNYWtlIHN1cmUKKyAgICB0aGF0IHRob3NlIGZ1bmN0aW9ucyBhcmUgbm9uLWJsb2NraW5nIG9yIGVsc2UgeW91IHdpbGwgaW50cm9kdWNlIGxhdGVuY3kKKyAgICBpbiB0aGUgc2VydmVyJ3MgbWFpbiBsb29wLgorIiIiCisKK2ltcG9ydCBiYgoraW1wb3J0IHhtbHJwY2xpYiwgc3lzCitmcm9tIGJiIGltcG9ydCBkYWVtb25pemUKK2Zyb20gYmIudWkgaW1wb3J0IHVpZXZlbnQKK2ltcG9ydCBoYXNobGliLCB0aW1lCitpbXBvcnQgc29ja2V0CitpbXBvcnQgb3MsIHNpZ25hbAoraW1wb3J0IHRocmVhZGluZwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKworREVCVUcgPSBGYWxzZQorCitmcm9tIFNpbXBsZVhNTFJQQ1NlcnZlciBpbXBvcnQgU2ltcGxlWE1MUlBDU2VydmVyLCBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgoraW1wb3J0IGluc3BlY3QsIHNlbGVjdCwgaHR0cGxpYgorCitmcm9tIC4gaW1wb3J0IEJpdEJha2VCYXNlU2VydmVyLCBCaXRCYWtlQmFzZVNlcnZlckNvbm5lY3Rpb24sIEJhc2VJbXBsU2VydmVyCisKK2NsYXNzIEJCVHJhbnNwb3J0KHhtbHJwY2xpYi5UcmFuc3BvcnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aW1lb3V0KToKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLmNvbm5lY3Rpb25fdG9rZW4gPSBOb25lCisgICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuX19pbml0X18oc2VsZikKKworICAgICMgTW9kaWZpZWQgZnJvbSBkZWZhdWx0IHRvIHBhc3MgdGltZW91dCB0byBIVFRQQ29ubmVjdGlvbgorICAgIGRlZiBtYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCk6CisgICAgICAgICNyZXR1cm4gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBwb3NzaWJsZS4gIFRoaXMgYWxsb3dzCisgICAgICAgICNIVFRQLzEuMSBrZWVwLWFsaXZlLgorICAgICAgICBpZiBzZWxmLl9jb25uZWN0aW9uIGFuZCBob3N0ID09IHNlbGYuX2Nvbm5lY3Rpb25bMF06CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdGlvblsxXQorCisgICAgICAgICMgY3JlYXRlIGEgSFRUUCBjb25uZWN0aW9uIG9iamVjdCBmcm9tIGEgaG9zdCBkZXNjcmlwdG9yCisgICAgICAgIGNob3N0LCBzZWxmLl9leHRyYV9oZWFkZXJzLCB4NTA5ID0gc2VsZi5nZXRfaG9zdF9pbmZvKGhvc3QpCisgICAgICAgICNzdG9yZSB0aGUgaG9zdCBhcmd1bWVudCBhbG9uZyB3aXRoIHRoZSBjb25uZWN0aW9uIG9iamVjdAorICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gaG9zdCwgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihjaG9zdCwgdGltZW91dD1zZWxmLnRpbWVvdXQpCisgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uWzFdCisKKyAgICBkZWYgc2V0X2Nvbm5lY3Rpb25fdG9rZW4oc2VsZiwgdG9rZW4pOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb25fdG9rZW4gPSB0b2tlbgorCisgICAgZGVmIHNlbmRfY29udGVudChzZWxmLCBoLCBib2R5KToKKyAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uX3Rva2VuOgorICAgICAgICAgICAgaC5wdXRoZWFkZXIoIkJpdGJha2UtdG9rZW4iLCBzZWxmLmNvbm5lY3Rpb25fdG9rZW4pCisgICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuc2VuZF9jb250ZW50KHNlbGYsIGgsIGJvZHkpCisKK2RlZiBfY3JlYXRlX3NlcnZlcihob3N0LCBwb3J0LCB0aW1lb3V0ID0gNjApOgorICAgIHQgPSBCQlRyYW5zcG9ydCh0aW1lb3V0KQorICAgIHMgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoImh0dHA6Ly8lczolZC8iICUgKGhvc3QsIHBvcnQpLCB0cmFuc3BvcnQ9dCwgYWxsb3dfbm9uZT1UcnVlKQorICAgIHJldHVybiBzLCB0CisKK2NsYXNzIEJpdEJha2VTZXJ2ZXJDb21tYW5kcygpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcik6CisgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgIHNlbGYuaGFzX2NsaWVudCA9IEZhbHNlCisKKyAgICBkZWYgcmVnaXN0ZXJFdmVudEhhbmRsZXIoc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgICIiIgorICAgICAgICBSZWdpc3RlciBhIHJlbW90ZSBVSSBFdmVudCBIYW5kbGVyCisgICAgICAgICIiIgorICAgICAgICBzLCB0ID0gX2NyZWF0ZV9zZXJ2ZXIoaG9zdCwgcG9ydCkKKworICAgICAgICAjIHdlIGRvbid0IGFsbG93IGNvbm5lY3Rpb25zIGlmIHRoZSBjb29rZXIgaXMgcnVubmluZworICAgICAgICBpZiAoc2VsZi5jb29rZXIuc3RhdGUgaW4gW2JiLmNvb2tlci5zdGF0ZS5wYXJzaW5nLCBiYi5jb29rZXIuc3RhdGUucnVubmluZ10pOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzZWxmLmV2ZW50X2hhbmRsZSA9IGJiLmV2ZW50LnJlZ2lzdGVyX1VJSGhhbmRsZXIocywgVHJ1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXZlbnRfaGFuZGxlCisKKyAgICBkZWYgdW5yZWdpc3RlckV2ZW50SGFuZGxlcihzZWxmLCBoYW5kbGVyTnVtKToKKyAgICAgICAgIiIiCisgICAgICAgIFVucmVnaXN0ZXIgYSByZW1vdGUgVUkgRXZlbnQgSGFuZGxlcgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGJiLmV2ZW50LnVucmVnaXN0ZXJfVUlIaGFuZGxlcihoYW5kbGVyTnVtKQorCisgICAgZGVmIHJ1bkNvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgICIiIgorICAgICAgICBSdW4gYSBjb29rZXIgY29tbWFuZCBvbiB0aGUgc2VydmVyCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5jb29rZXIuY29tbWFuZC5ydW5Db21tYW5kKGNvbW1hbmQsIHNlbGYuc2VydmVyLnJlYWRvbmx5KQorCisgICAgZGVmIGdldEV2ZW50SGFuZGxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ldmVudF9oYW5kbGUKKworICAgIGRlZiB0ZXJtaW5hdGVTZXJ2ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUcmlnZ2VyIHRoZSBzZXJ2ZXIgdG8gcXVpdAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zZXJ2ZXIucXVpdCA9IFRydWUKKyAgICAgICAgcHJpbnQoIlNlcnZlciAoY29va2VyKSBleGl0aW5nIikKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgYWRkQ2xpZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19jbGllbnQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0b2tlbiA9IGhhc2hsaWIubWQ1KHN0cih0aW1lLnRpbWUoKSkpLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuc2VydmVyLnNldF9jb25uZWN0aW9uX3Rva2VuKHRva2VuKQorICAgICAgICBzZWxmLmhhc19jbGllbnQgPSBUcnVlCisgICAgICAgIHJldHVybiB0b2tlbgorCisgICAgZGVmIHJlbW92ZUNsaWVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNfY2xpZW50OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2V0X2Nvbm5lY3Rpb25fdG9rZW4oTm9uZSkKKyAgICAgICAgICAgIHNlbGYuaGFzX2NsaWVudCA9IEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLnNlcnZlci5zaW5nbGVfdXNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnF1aXQgPSBUcnVlCisKKyMgVGhpcyByZXF1ZXN0IGhhbmRsZXIgY2hlY2tzIGlmIHRoZSByZXF1ZXN0IGhhcyBhICJCaXRiYWtlLXRva2VuIiBoZWFkZXIKKyMgZmllbGQgKHRoaXMgY29tZXMgZnJvbSB0aGUgY2xpZW50IHNpZGUpIGFuZCBjb21wYXJlcyBpdCB3aXRoIGl0cyBpbnRlcm5hbAorIyAiQml0YmFrZS10b2tlbiIgZmllbGQgKHRoaXMgY29tZXMgZnJvbSB0aGUgc2VydmVyKS4gSWYgdGhlIHR3byBhcmUgbm90CisjIGVxdWFsLCBpdCBpcyBhc3N1bWVkIHRoYXQgYSBjbGllbnQgaXMgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlcgorIyB3aGlsZSBhbm90aGVyIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIHNlcnZlci4gSW4gdGhpcyBjYXNlLCBhIDUwMyBlcnJvcgorIyAoInNlcnZpY2UgdW5hdmFpbGFibGUiKSBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorY2xhc3MgQml0QmFrZVhNTFJQQ1JlcXVlc3RIYW5kbGVyKFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MsIHNlcnZlcik6CisgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzLCBzZXJ2ZXIpCisKKyAgICBkZWYgZG9fUE9TVChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVtb3RlX3Rva2VuID0gc2VsZi5oZWFkZXJzWyJCaXRiYWtlLXRva2VuIl0KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmVtb3RlX3Rva2VuID0gTm9uZQorICAgICAgICBpZiByZW1vdGVfdG9rZW4gIT0gc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbl90b2tlbiBhbmQgcmVtb3RlX3Rva2VuICE9ICJvYnNlcnZlciI6CisgICAgICAgICAgICBzZWxmLnJlcG9ydF81MDMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgcmVtb3RlX3Rva2VuID09ICJvYnNlcnZlciI6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZG9ubHkgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnJlYWRvbmx5ID0gRmFsc2UKKyAgICAgICAgICAgIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLmRvX1BPU1Qoc2VsZikKKworICAgIGRlZiByZXBvcnRfNTAzKHNlbGYpOgorICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAzKQorICAgICAgICByZXNwb25zZSA9ICdObyBtb3JlIGNsaWVudCBhbGxvd2VkJworICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9wbGFpbiIpCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgc3RyKGxlbihyZXNwb25zZSkpKQorICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgc2VsZi53ZmlsZS53cml0ZShyZXNwb25zZSkKKworCitjbGFzcyBYTUxSUENQcm94eVNlcnZlcihCYXNlSW1wbFNlcnZlcik6CisgICAgIiIiIG5vdCBhIHJlYWwgd29ya2luZyBzZXJ2ZXIsIGJ1dCBhIHN0dWIgZm9yIGEgcHJveHkgc2VydmVyIGNvbm5lY3Rpb24KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisKK2NsYXNzIFhNTFJQQ1NlcnZlcihTaW1wbGVYTUxSUENTZXJ2ZXIsIEJhc2VJbXBsU2VydmVyKToKKyAgICAjIHJlbW92ZSB0aGlzIHdoZW4geW91J3JlIGRvbmUgd2l0aCBkZWJ1Z2dpbmcKKyAgICAjIGFsbG93X3JldXNlX2FkZHJlc3MgPSBUcnVlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW50ZXJmYWNlKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbnN0cnVjdG9yCisgICAgICAgICIiIgorICAgICAgICBCYXNlSW1wbFNlcnZlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiAoaW50ZXJmYWNlWzFdID09IDApOiAgICAgIyBhbm9ueW1vdXMgcG9ydCwgbm90IGdldHRpbmcgcmV1c2VkCisgICAgICAgICAgICBzZWxmLnNpbmdsZV91c2UgPSBUcnVlCisgICAgICAgICMgVXNlIGF1dG8gcG9ydCBjb25maWd1cmF0aW9uCisgICAgICAgIGlmIChpbnRlcmZhY2VbMV0gPT0gLTEpOgorICAgICAgICAgICAgaW50ZXJmYWNlID0gKGludGVyZmFjZVswXSwgMCkKKyAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLl9faW5pdF9fKHNlbGYsIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyPUJpdEJha2VYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPUZhbHNlLCBhbGxvd19ub25lPVRydWUpCisgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0ID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgICAgICBzZWxmLmNvbm5lY3Rpb25fdG9rZW4gPSBOb25lCisgICAgICAgICNzZWxmLnJlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zKCkKKyAgICAgICAgc2VsZi5jb21tYW5kcyA9IEJpdEJha2VTZXJ2ZXJDb21tYW5kcyhzZWxmKQorICAgICAgICBzZWxmLmF1dG9yZWdpc3Rlcl9hbGxfZnVuY3Rpb25zKHNlbGYuY29tbWFuZHMsICIiKQorICAgICAgICBzZWxmLmludGVyZmFjZSA9IGludGVyZmFjZQorICAgICAgICBzZWxmLnNpbmdsZV91c2UgPSBGYWxzZQorCisgICAgZGVmIGFkZGNvb2tlcihzZWxmLCBjb29rZXIpOgorICAgICAgICBCYXNlSW1wbFNlcnZlci5hZGRjb29rZXIoc2VsZiwgY29va2VyKQorICAgICAgICBzZWxmLmNvbW1hbmRzLmNvb2tlciA9IGNvb2tlcgorCisgICAgZGVmIGF1dG9yZWdpc3Rlcl9hbGxfZnVuY3Rpb25zKHNlbGYsIGNvbnRleHQsIHByZWZpeCk6CisgICAgICAgICIiIgorICAgICAgICBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHJlZ2lzdGVyaW5nIGFsbCBmdW5jdGlvbnMgaW4gdGhlIHNjb3BlCisgICAgICAgIG9mIHRoaXMgY2xhc3MgdGhhdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeAorICAgICAgICAiIiIKKyAgICAgICAgbWV0aG9kbGlzdCA9IGluc3BlY3QuZ2V0bWVtYmVycyhjb250ZXh0LCBpbnNwZWN0LmlzbWV0aG9kKQorICAgICAgICBmb3IgbmFtZSwgbWV0aG9kIGluIG1ldGhvZGxpc3Q6CisgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgocHJlZml4KToKKyAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyX2Z1bmN0aW9uKG1ldGhvZCwgbmFtZVtsZW4ocHJlZml4KTpdKQorCisKKyAgICBkZWYgc2VydmVfZm9yZXZlcihzZWxmKToKKyAgICAgICAgIyBTdGFydCB0aGUgYWN0dWFsIFhNTFJQQyBzZXJ2ZXIKKyAgICAgICAgYmIuY29va2VyLnNlcnZlcl9tYWluKHNlbGYuY29va2VyLCBzZWxmLl9zZXJ2ZV9mb3JldmVyKQorCisgICAgZGVmIF9zZXJ2ZV9mb3JldmVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VydmUgUmVxdWVzdHMuIE92ZXJsb2FkZWQgdG8gaG9ub3IgYSBxdWl0IGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucXVpdCA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICBmZHMgPSBbc2VsZl0KKyAgICAgICAgICAgIG5leHRzbGVlcCA9IDAuMQorICAgICAgICAgICAgZm9yIGZ1bmN0aW9uLCBkYXRhIGluIHNlbGYuX2lkbGVmdW5zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTm9uZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZnVuY3Rpb24oc2VsZiwgZGF0YSwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIGlmIHJldHZhbCBpcyBGYWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9pZGxlZnVuc1tmdW5jdGlvbl0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiByZXR2YWwgaXMgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRzbGVlcCA9IDAKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJldHZhbCwgZmxvYXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA8IG5leHRzbGVlcCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHNsZWVwID0gcmV0dmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmZHMgPSBmZHMgKyByZXR2YWwKKyAgICAgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICAgICAgICAgIGlmIHJldHZhbCA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZnVuY3Rpb24gZXhlY3V0ZSBmYWlsZWQ7IGRlbGV0ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2lkbGVmdW5zW2Z1bmN0aW9uXQorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHNvY2t0aW1lb3V0ID0gc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpIG9yIG5leHRzbGVlcAorICAgICAgICAgICAgc29ja3RpbWVvdXQgPSBtaW4oc29ja3RpbWVvdXQsIG5leHRzbGVlcCkKKyAgICAgICAgICAgICMgTWlycm9yIHdoYXQgQmFzZVNlcnZlciBoYW5kbGVfcmVxdWVzdCB3b3VsZCBkbworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZkX3NldHMgPSBzZWxlY3Quc2VsZWN0KGZkcywgW10sIFtdLCBzb2NrdGltZW91dCkKKyAgICAgICAgICAgICAgICBpZiBmZF9zZXRzWzBdIGFuZCBzZWxmIGluIGZkX3NldHNbMF06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9yZXF1ZXN0X25vYmxvY2soKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgIyB3ZSBpZ25vcmUgaW50ZXJydXB0ZWQgY2FsbHMKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBUZWxsIGlkbGUgZnVuY3Rpb25zIHdlJ3JlIGV4aXRpbmcKKyAgICAgICAgZm9yIGZ1bmN0aW9uLCBkYXRhIGluIHNlbGYuX2lkbGVmdW5zLml0ZW1zKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dmFsID0gZnVuY3Rpb24oc2VsZiwgZGF0YSwgVHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgc2V0X2Nvbm5lY3Rpb25fdG9rZW4oc2VsZiwgdG9rZW4pOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb25fdG9rZW4gPSB0b2tlbgorCitjbGFzcyBCaXRCYWtlWE1MUlBDU2VydmVyQ29ubmVjdGlvbihCaXRCYWtlQmFzZVNlcnZlckNvbm5lY3Rpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJJbXBsLCBjbGllbnRpbmZvPSgibG9jYWxob3N0IiwgMCksIG9ic2VydmVyX29ubHkgPSBGYWxzZSwgZmVhdHVyZXNldCA9IE5vbmUpOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24sIHNlbGYudHJhbnNwb3J0ID0gX2NyZWF0ZV9zZXJ2ZXIoc2VydmVySW1wbC5ob3N0LCBzZXJ2ZXJJbXBsLnBvcnQpCisgICAgICAgIHNlbGYuY2xpZW50aW5mbyA9IGNsaWVudGluZm8KKyAgICAgICAgc2VsZi5zZXJ2ZXJJbXBsID0gc2VydmVySW1wbAorICAgICAgICBzZWxmLm9ic2VydmVyX29ubHkgPSBvYnNlcnZlcl9vbmx5CisgICAgICAgIGlmIGZlYXR1cmVzZXQ6CisgICAgICAgICAgICBzZWxmLmZlYXR1cmVzZXQgPSBmZWF0dXJlc2V0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZlYXR1cmVzZXQgPSBbXQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZiwgdG9rZW4gPSBOb25lKToKKyAgICAgICAgaWYgdG9rZW4gaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYub2JzZXJ2ZXJfb25seToKKyAgICAgICAgICAgICAgICB0b2tlbiA9ICJvYnNlcnZlciIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBzZWxmLmNvbm5lY3Rpb24uYWRkQ2xpZW50KCkKKworICAgICAgICBpZiB0b2tlbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzZWxmLnRyYW5zcG9ydC5zZXRfY29ubmVjdGlvbl90b2tlbih0b2tlbikKKworICAgICAgICBzZWxmLmV2ZW50cyA9IHVpZXZlbnQuQkJVSUV2ZW50UXVldWUoc2VsZi5jb25uZWN0aW9uLCBzZWxmLmNsaWVudGluZm8pCisgICAgICAgIGZvciBldmVudCBpbiBiYi5ldmVudC51aV9xdWV1ZToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLnF1ZXVlX2V2ZW50KGV2ZW50KQorCisgICAgICAgIF8sIGVycm9yID0gc2VsZi5jb25uZWN0aW9uLnJ1bkNvbW1hbmQoWyJzZXRGZWF0dXJlcyIsIHNlbGYuZmVhdHVyZXNldF0pCisgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgIyBkaXNjb25uZWN0IHRoZSBjbGllbnQsIHdlIGNhbid0IG1ha2UgdGhlIHNldEZlYXR1cmUgd29yaworICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLnJlbW92ZUNsaWVudCgpCisgICAgICAgICAgICAjIG5vIG5lZWQgdG8gbG9nIGl0IGhlcmUsIHRoZSBlcnJvciBzaGFsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgIHJhaXNlIEJhc2VFeGNlcHRpb24oZXJyb3IpCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiByZW1vdmVDbGllbnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLm9ic2VydmVyX29ubHk6CisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucmVtb3ZlQ2xpZW50KCkKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgICMgRG9uJ3Qgd2FpdCBmb3Igc2VydmVyIGluZGVmaW5pdGVseQorICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmV2ZW50cy5zeXN0ZW1fcXVpdCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLnJlbW92ZUNsaWVudCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgQml0QmFrZVNlcnZlcihCaXRCYWtlQmFzZVNlcnZlcik6CisgICAgZGVmIGluaXRTZXJ2ZXIoc2VsZiwgaW50ZXJmYWNlID0gKCJsb2NhbGhvc3QiLCAwKSk6CisgICAgICAgIHNlbGYuaW50ZXJmYWNlID0gaW50ZXJmYWNlCisgICAgICAgIHNlbGYuc2VydmVySW1wbCA9IFhNTFJQQ1NlcnZlcihpbnRlcmZhY2UpCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICBkYWVtb25pemUuY3JlYXRlRGFlbW9uKHNlbGYuc2VydmVySW1wbC5zZXJ2ZV9mb3JldmVyLCAiYml0YmFrZS1jb29rZXJkYWVtb24ubG9nIikKKyAgICAgICAgZGVsIHNlbGYuY29va2VyCisKKyAgICBkZWYgZXN0YWJsaXNoQ29ubmVjdGlvbihzZWxmLCBmZWF0dXJlc2V0KToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gQml0QmFrZVhNTFJQQ1NlcnZlckNvbm5lY3Rpb24oc2VsZi5zZXJ2ZXJJbXBsLCBzZWxmLmludGVyZmFjZSwgRmFsc2UsIGZlYXR1cmVzZXQpCisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdCgpCisKKyAgICBkZWYgc2V0X2Nvbm5lY3Rpb25fdG9rZW4oc2VsZiwgdG9rZW4pOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24udHJhbnNwb3J0LnNldF9jb25uZWN0aW9uX3Rva2VuKHRva2VuKQorCitjbGFzcyBCaXRCYWtlWE1MUlBDQ2xpZW50KEJpdEJha2VCYXNlU2VydmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYnNlcnZlcl9vbmx5ID0gRmFsc2UsIHRva2VuID0gTm9uZSk6CisgICAgICAgIHNlbGYudG9rZW4gPSB0b2tlbgorCisgICAgICAgIHNlbGYub2JzZXJ2ZXJfb25seSA9IG9ic2VydmVyX29ubHkKKyAgICAgICAgIyBpZiB3ZSBuZWVkIGV4dHJhIGNhY2hlcywganVzdCB0ZWxsIHRoZSBzZXJ2ZXIgdG8gbG9hZCB0aGVtIGFsbAorICAgICAgICBwYXNzCisKKyAgICBkZWYgc2F2ZUNvbm5lY3Rpb25EZXRhaWxzKHNlbGYsIHJlbW90ZSk6CisgICAgICAgIHNlbGYucmVtb3RlID0gcmVtb3RlCisKKyAgICBkZWYgZXN0YWJsaXNoQ29ubmVjdGlvbihzZWxmLCBmZWF0dXJlc2V0KToKKyAgICAgICAgIyBUaGUgZm9ybWF0IG9mICJyZW1vdGUiIG11c3QgYmUgInNlcnZlcjpwb3J0IgorICAgICAgICB0cnk6CisgICAgICAgICAgICBbaG9zdCwgcG9ydF0gPSBzZWxmLnJlbW90ZS5zcGxpdCgiOiIpCisgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGJiLndhcm4oIkZhaWxlZCB0byByZWFkIHJlbW90ZSBkZWZpbml0aW9uICglcykiICUgc3RyKGUpKQorICAgICAgICAgICAgcmFpc2UgZQorCisgICAgICAgICMgV2UgbmVlZCBvdXIgSVAgZm9yIHRoZSBzZXJ2ZXIgY29ubmVjdGlvbi4gV2UgZ2V0IHRoZSBJUAorICAgICAgICAjIGJ5IHRyeWluZyB0byBjb25uZWN0IHdpdGggdGhlIHNlcnZlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCisgICAgICAgICAgICBzLmNvbm5lY3QoKGhvc3QsIHBvcnQpKQorICAgICAgICAgICAgaXAgPSBzLmdldHNvY2tuYW1lKClbMF0KKyAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBiYi53YXJuKCJDb3VsZCBub3QgY3JlYXRlIHNvY2tldCBmb3IgJXM6JXMgKCVzKSIgJSAoaG9zdCwgcG9ydCwgc3RyKGUpKSkKKyAgICAgICAgICAgIHJhaXNlIGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXJJbXBsID0gWE1MUlBDUHJveHlTZXJ2ZXIoaG9zdCwgcG9ydCkKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IEJpdEJha2VYTUxSUENTZXJ2ZXJDb25uZWN0aW9uKHNlbGYuc2VydmVySW1wbCwgKGlwLCAwKSwgc2VsZi5vYnNlcnZlcl9vbmx5LCBmZWF0dXJlc2V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5jb25uZWN0KHNlbGYudG9rZW4pCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGJiLndhcm4oIkNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciBhdCAlczolcyAoJXMpIiAlIChob3N0LCBwb3J0LCBzdHIoZSkpKQorICAgICAgICAgICAgcmFpc2UgZQorCisgICAgZGVmIGVuZFNlc3Npb24oc2VsZik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5yZW1vdmVDbGllbnQoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvc2hlbGwucHkgYi9iaXRiYWtlL2xpYi9iYi9zaGVsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQ4ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvc2hlbGwucHkKQEAgLTAsMCArMSw4MjAgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBNaWNoYWVsICdNaWNrZXknIExhdWVyIDxtaWNrZXlAVmFuaWxsZS5kZT4KKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgVmFuaWxsZSBNZWRpYQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoYW5rcyB0bzoKKyMgKiBIb2xnZXIgRnJleXRoZXIgPHplY2tlQGhhbmRoZWxkcy5vcmc+CisjICogSnVzdGluIFBhdHJpbiA8cGFwZXJjcmFuZUByZXZlcnNlZm9sZC5jb20+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisiIiIKK0JpdEJha2UgU2hlbGwKKworSURFQVM6CisgICAgKiBsaXN0IGRlZmluZWQgdGFza3MgcGVyIHBhY2thZ2UKKyAgICAqIGxpc3QgY2xhc3NlcworICAgICogdG9nZ2xlIGZvcmNlCisgICAgKiBjb21tYW5kIHRvIHJlcGFyc2UganVzdCBvbmUgKG9yIG1vcmUpIGJiZmlsZShzKQorICAgICogYXV0b21hdGljIGNoZWNrIGlmIHJlcGFyc2luZyBpcyBuZWNlc3NhcnkgKGlub3RpZnk/KQorICAgICogZnJvbnRlbmQgZm9yIGJiIGZpbGUgbWFuaXB1bGF0aW9uCisgICAgKiBtb3JlIHNoZWxsLWxpa2UgZmVhdHVyZXM6CisgICAgICAgIC0gb3V0cHV0IGNvbnRyb2wsIGkuZS4gcGlwZSBvdXRwdXQgaW50byBncmVwLCBzb3J0LCBldGMuCisgICAgICAgIC0gam9iIGNvbnRyb2wsIGkuZS4gYnJpbmcgcnVubmluZyBjb21tYW5kcyBpbnRvIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQKKyAgICAqIHN0YXJ0IHBhcnNpbmcgaW4gYmFja2dyb3VuZCByaWdodCBhZnRlciBzdGFydHVwCisgICAgKiBuY3Vyc2VzIGludGVyZmFjZQorCitQUk9CTEVNUzoKKyAgICAqIGZvcmNlIGRvZXNuJ3QgYWx3YXlzIHdvcmsKKyAgICAqIHJlYWRsaW5lIGNvbXBsZXRpb24gZm9yIGNvbW1hbmRzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXJzCisKKyIiIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBJbXBvcnQgYW5kIHNldHVwIGdsb2JhbCB2YXJpYWJsZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKK3RyeToKKyAgICBzZXQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgc2V0CitpbXBvcnQgc3lzLCBvcywgcmVhZGxpbmUsIHNvY2tldCwgaHR0cGxpYiwgdXJsbGliLCBjb21tYW5kcywgcG9wZW4yLCBzaGxleCwgUXVldWUsIGZubWF0Y2gKK2Zyb20gYmIgaW1wb3J0IGRhdGEsIHBhcnNlLCBidWlsZCwgY2FjaGUsIHRhc2tkYXRhLCBydW5xdWV1ZSwgcHJvdmlkZXJzIGFzIFByb3ZpZGVycworCitfX3ZlcnNpb25fXyA9ICIwLjUuMy4xIgorX19jcmVkaXRzX18gPSAiIiJCaXRCYWtlIFNoZWxsIFZlcnNpb24gJXMgKEMpIDIwMDUgTWljaGFlbCAnTWlja2V5JyBMYXVlciA8bWlja2V5QFZhbmlsbGUuZGU+CitUeXBlICdoZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgcHJlc3MgQ1RSTC1EIHRvIGV4aXQuIiIiICUgX192ZXJzaW9uX18KKworY21kcyA9IHt9CitsZWF2ZV9tYWlubG9vcCA9IEZhbHNlCitsYXN0X2V4Y2VwdGlvbiA9IE5vbmUKK2Nvb2tlciA9IE5vbmUKK3BhcnNlZCA9IEZhbHNlCitkZWJ1ZyA9IG9zLmVudmlyb24uZ2V0KCAiQkJTSEVMTF9ERUJVRyIsICIiICkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2xhc3MgQml0QmFrZVNoZWxsQ29tbWFuZHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIEJpdEJha2VTaGVsbENvbW1hbmRzOgorICAgICIiIlRoaXMgY2xhc3MgY29udGFpbnMgdGhlIHZhbGlkIGNvbW1hbmRzIGZvciB0aGUgc2hlbGwiIiIKKworICAgIGRlZiBfX2luaXRfXyggc2VsZiwgc2hlbGwgKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYWxsIHRoZSBjb21tYW5kcyIiIgorICAgICAgICBzZWxmLl9zaGVsbCA9IHNoZWxsCisgICAgICAgIGZvciBhdHRyIGluIEJpdEJha2VTaGVsbENvbW1hbmRzLl9fZGljdF9fOgorICAgICAgICAgICAgaWYgbm90IGF0dHIuc3RhcnRzd2l0aCggIl8iICk6CisgICAgICAgICAgICAgICAgaWYgYXR0ci5lbmRzd2l0aCggIl8iICk6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBhdHRyWzotMV0ubG93ZXIoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBhdHRyWzpdLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKCBCaXRCYWtlU2hlbGxDb21tYW5kcywgYXR0ciApCisgICAgICAgICAgICAgICAgZGVidWdPdXQoICJyZWdpc3RlcmluZyBjb21tYW5kICclcyciICUgY29tbWFuZCApCisgICAgICAgICAgICAgICAgIyBzY2FuIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICB1c2FnZSA9IGdldGF0dHIoIG1ldGhvZCwgInVzYWdlIiwgIiIgKQorICAgICAgICAgICAgICAgIGlmIHVzYWdlICE9ICI8Li4uPiI6CisgICAgICAgICAgICAgICAgICAgIG51bUFyZ3MgPSBsZW4oIHVzYWdlLnNwbGl0KCkgKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG51bUFyZ3MgPSAtMQorICAgICAgICAgICAgICAgIHNoZWxsLnJlZ2lzdGVyQ29tbWFuZCggY29tbWFuZCwgbWV0aG9kLCBudW1BcmdzLCAiJXMgJXMiICUgKCBjb21tYW5kLCB1c2FnZSApLCBtZXRob2QuX19kb2NfXyApCisKKyAgICBkZWYgX2NoZWNrUGFyc2VkKCBzZWxmICk6CisgICAgICAgIGlmIG5vdCBwYXJzZWQ6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IFRoaXMgY29tbWFuZCBuZWVkcyB0byBwYXJzZSBiYmZpbGVzLi4uIikKKyAgICAgICAgICAgIHNlbGYucGFyc2UoIE5vbmUgKQorCisgICAgZGVmIF9maW5kUHJvdmlkZXIoIHNlbGYsIGl0ZW0gKToKKyAgICAgICAgc2VsZi5fY2hlY2tQYXJzZWQoKQorICAgICAgICAjIE5lZWQgdG8gdXNlIHRhc2tEYXRhIGZvciB0aGlzIGluZm9ybWF0aW9uCisgICAgICAgIHByZWZlcnJlZCA9IGRhdGEuZ2V0VmFyKCAiUFJFRkVSUkVEX1BST1ZJREVSXyVzIiAlIGl0ZW0sIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIDEgKQorICAgICAgICBpZiBub3QgcHJlZmVycmVkOiBwcmVmZXJyZWQgPSBpdGVtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGx2LCBsZiwgcHYsIHBmID0gUHJvdmlkZXJzLmZpbmRCZXN0UHJvdmlkZXIocHJlZmVycmVkLCBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhLCBjb29rZXIuc3RhdHVzKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiBpdGVtIGluIGNvb2tlci5zdGF0dXMucHJvdmlkZXJzOgorICAgICAgICAgICAgICAgIHBmID0gY29va2VyLnN0YXR1cy5wcm92aWRlcnNbaXRlbV1bMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGYgPSBOb25lCisgICAgICAgIHJldHVybiBwZgorCisgICAgZGVmIGFsaWFzKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYSBuZXcgbmFtZSBmb3IgYSBjb21tYW5kIiIiCisgICAgICAgIG5ldywgb2xkID0gcGFyYW1zCisgICAgICAgIGlmIG5vdCBvbGQgaW4gY21kczoKKyAgICAgICAgICAgIHByaW50KCJFUlJPUjogQ29tbWFuZCAnJXMnIG5vdCBrbm93biIgJSBvbGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWRzW25ld10gPSBjbWRzW29sZF0KKyAgICAgICAgICAgIHByaW50KCJPSyIpCisgICAgYWxpYXMudXNhZ2UgPSAiPGFsaWFzPiA8Y29tbWFuZD4iCisKKyAgICBkZWYgYnVmZmVyKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRHVtcCBzcGVjaWZpZWQgb3V0cHV0IGJ1ZmZlciIiIgorICAgICAgICBpbmRleCA9IHBhcmFtc1swXQorICAgICAgICBwcmludChzZWxmLl9zaGVsbC5teW91dC5idWZmZXIoIGludCggaW5kZXggKSApKQorICAgIGJ1ZmZlci51c2FnZSA9ICI8aW5kZXg+IgorCisgICAgZGVmIGJ1ZmZlcnMoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJTaG93IHRoZSBhdmFpbGFibGUgb3V0cHV0IGJ1ZmZlcnMiIiIKKyAgICAgICAgY29tbWFuZHMgPSBzZWxmLl9zaGVsbC5teW91dC5idWZmZXJlZENvbW1hbmRzKCkKKyAgICAgICAgaWYgbm90IGNvbW1hbmRzOgorICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBObyBidWZmZXJlZCBjb21tYW5kcyBhdmFpbGFibGUgeWV0LiBTdGFydCBkb2luZyBzb21ldGhpbmcuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCI9IiozNSwgIkF2YWlsYWJsZSBPdXRwdXQgQnVmZmVycyIsICI9IioyNykKKyAgICAgICAgICAgIGZvciBpbmRleCwgY21kIGluIGVudW1lcmF0ZSggY29tbWFuZHMgKToKKyAgICAgICAgICAgICAgICBwcmludCgifCAlcyAlcyIgJSAoIHN0ciggaW5kZXggKS5sanVzdCggMyApLCBjbWQgKSkKKyAgICAgICAgICAgIHByaW50KCI9Iio4OCkKKworICAgIGRlZiBidWlsZCggc2VsZiwgcGFyYW1zLCBjbWQgPSAiYnVpbGQiICk6CisgICAgICAgICIiIkJ1aWxkIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgZ2xvYmFsIGxhc3RfZXhjZXB0aW9uCisgICAgICAgIGdsb2JleHByID0gcGFyYW1zWzBdCisgICAgICAgIHNlbGYuX2NoZWNrUGFyc2VkKCkKKyAgICAgICAgbmFtZXMgPSBnbG9iZmlsdGVyKCBjb29rZXIuc3RhdHVzLnBrZ19wbiwgZ2xvYmV4cHIgKQorICAgICAgICBpZiBsZW4oIG5hbWVzICkgPT0gMDogbmFtZXMgPSBbIGdsb2JleHByIF0KKyAgICAgICAgcHJpbnQoIlNIRUxMOiBCdWlsZGluZyAlcyIgJSAnICcuam9pbiggbmFtZXMgKSkKKworICAgICAgICB0ZCA9IHRhc2tkYXRhLlRhc2tEYXRhKGNvb2tlci5jb25maWd1cmF0aW9uLmFib3J0KQorICAgICAgICBsb2NhbGRhdGEgPSBkYXRhLmNyZWF0ZUNvcHkoY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSkKKyAgICAgICAgZGF0YS51cGRhdGVfZGF0YShsb2NhbGRhdGEpCisgICAgICAgIGRhdGEuZXhwYW5kS2V5cyhsb2NhbGRhdGEpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFza3MgPSBbXQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgdGQuYWRkX3Byb3ZpZGVyKGxvY2FsZGF0YSwgY29va2VyLnN0YXR1cywgbmFtZSkKKyAgICAgICAgICAgICAgICBwcm92aWRlcnMgPSB0ZC5nZXRfcHJvdmlkZXIobmFtZSkKKworICAgICAgICAgICAgICAgIGlmIGxlbihwcm92aWRlcnMpID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFByb3ZpZGVycy5Ob1Byb3ZpZGVyCisKKyAgICAgICAgICAgICAgICB0YXNrcy5hcHBlbmQoW25hbWUsICJkb18lcyIgJSBjbWRdKQorCisgICAgICAgICAgICB0ZC5hZGRfdW5yZXNvbHZlZChsb2NhbGRhdGEsIGNvb2tlci5zdGF0dXMpCisKKyAgICAgICAgICAgIHJxID0gcnVucXVldWUuUnVuUXVldWUoY29va2VyLCBsb2NhbGRhdGEsIGNvb2tlci5zdGF0dXMsIHRkLCB0YXNrcykKKyAgICAgICAgICAgIHJxLnByZXBhcmVfcnVucXVldWUoKQorICAgICAgICAgICAgcnEuZXhlY3V0ZV9ydW5xdWV1ZSgpCisKKyAgICAgICAgZXhjZXB0IFByb3ZpZGVycy5Ob1Byb3ZpZGVyOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBObyBQcm92aWRlciIpCisgICAgICAgICAgICBsYXN0X2V4Y2VwdGlvbiA9IFByb3ZpZGVycy5Ob1Byb3ZpZGVyCisKKyAgICAgICAgZXhjZXB0IHJ1bnF1ZXVlLlRhc2tGYWlsdXJlIGFzIGZuaWRzOgorICAgICAgICAgICAgbGFzdF9leGNlcHRpb24gPSBydW5xdWV1ZS5UYXNrRmFpbHVyZQorCisgICAgICAgIGV4Y2VwdCBidWlsZC5GdW5jRmFpbGVkIGFzIGU6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IENvdWxkbid0IGJ1aWxkICclcyciICUgbmFtZXMpCisgICAgICAgICAgICBsYXN0X2V4Y2VwdGlvbiA9IGUKKworCisgICAgYnVpbGQudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBjbGVhbiggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkNsZWFuIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAiY2xlYW4iICkKKyAgICBjbGVhbi51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIGNvbXBpbGUoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJFeGVjdXRlICdjb21waWxlJyBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgImNvbXBpbGUiICkKKyAgICBjb21waWxlLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgY29uZmlndXJlKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRXhlY3V0ZSAnY29uZmlndXJlJyBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgImNvbmZpZ3VyZSIgKQorICAgIGNvbmZpZ3VyZS51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIGluc3RhbGwoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJFeGVjdXRlICdpbnN0YWxsJyBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgImluc3RhbGwiICkKKyAgICBpbnN0YWxsLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgZWRpdCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkNhbGwgJEVESVRPUiBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIG5hbWUgPSBwYXJhbXNbMF0KKyAgICAgICAgYmJmaWxlID0gc2VsZi5fZmluZFByb3ZpZGVyKCBuYW1lICkKKyAgICAgICAgaWYgYmJmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3Muc3lzdGVtKCAiJXMgJXMiICUgKCBvcy5lbnZpcm9uLmdldCggIkVESVRPUiIsICJ2aSIgKSwgYmJmaWxlICkgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBOb3RoaW5nIHByb3ZpZGVzICclcyciICUgbmFtZSkKKyAgICBlZGl0LnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyAgICBkZWYgZW52aXJvbm1lbnQoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJEdW1wIG91dCB0aGUgb3V0ZXIgQml0QmFrZSBlbnZpcm9ubWVudCIiIgorICAgICAgICBjb29rZXIuc2hvd0Vudmlyb25tZW50KCkKKworICAgIGRlZiBleGl0Xyggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkxlYXZlIHRoZSBCaXRCYWtlIFNoZWxsIiIiCisgICAgICAgIGRlYnVnT3V0KCAic2V0dGluZyBsZWF2ZV9tYWlubG9vcCB0byB0cnVlIiApCisgICAgICAgIGdsb2JhbCBsZWF2ZV9tYWlubG9vcAorICAgICAgICBsZWF2ZV9tYWlubG9vcCA9IFRydWUKKworICAgIGRlZiBmZXRjaCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkZldGNoIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAiZmV0Y2giICkKKyAgICBmZXRjaC51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIGZpbGVCdWlsZCggc2VsZiwgcGFyYW1zLCBjbWQgPSAiYnVpbGQiICk6CisgICAgICAgICIiIlBhcnNlIGFuZCBidWlsZCBhIC5iYiBmaWxlIiIiCisgICAgICAgIGdsb2JhbCBsYXN0X2V4Y2VwdGlvbgorICAgICAgICBuYW1lID0gcGFyYW1zWzBdCisgICAgICAgIGJmID0gY29tcGxldGVGaWxlUGF0aCggbmFtZSApCisgICAgICAgIHByaW50KCJTSEVMTDogQ2FsbGluZyAnJXMnIG9uICclcyciICUgKCBjbWQsIGJmICkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29va2VyLmJ1aWxkRmlsZShiZiwgY21kKQorICAgICAgICBleGNlcHQgcGFyc2UuUGFyc2VFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJFUlJPUjogVW5hYmxlIHRvIG9wZW4gb3IgcGFyc2UgJyVzJyIgJSBiZikKKyAgICAgICAgZXhjZXB0IGJ1aWxkLkZ1bmNGYWlsZWQgYXMgZToKKyAgICAgICAgICAgIHByaW50KCJFUlJPUjogQ291bGRuJ3QgYnVpbGQgJyVzJyIgJSBuYW1lKQorICAgICAgICAgICAgbGFzdF9leGNlcHRpb24gPSBlCisKKyAgICBmaWxlQnVpbGQudXNhZ2UgPSAiPGJiZmlsZT4iCisKKyAgICBkZWYgZmlsZUNsZWFuKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiQ2xlYW4gYSAuYmIgZmlsZSIiIgorICAgICAgICBzZWxmLmZpbGVCdWlsZCggcGFyYW1zLCAiY2xlYW4iICkKKyAgICBmaWxlQ2xlYW4udXNhZ2UgPSAiPGJiZmlsZT4iCisKKyAgICBkZWYgZmlsZUVkaXQoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJDYWxsICRFRElUT1Igb24gYSAuYmIgZmlsZSIiIgorICAgICAgICBuYW1lID0gcGFyYW1zWzBdCisgICAgICAgIG9zLnN5c3RlbSggIiVzICVzIiAlICggb3MuZW52aXJvbi5nZXQoICJFRElUT1IiLCAidmkiICksIGNvbXBsZXRlRmlsZVBhdGgoIG5hbWUgKSApICkKKyAgICBmaWxlRWRpdC51c2FnZSA9ICI8YmJmaWxlPiIKKworICAgIGRlZiBmaWxlUmVidWlsZCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlJlYnVpbGQgKGNsZWFuICYgYnVpbGQpIGEgLmJiIGZpbGUiIiIKKyAgICAgICAgc2VsZi5maWxlQnVpbGQoIHBhcmFtcywgInJlYnVpbGQiICkKKyAgICBmaWxlUmVidWlsZC51c2FnZSA9ICI8YmJmaWxlPiIKKworICAgIGRlZiBmaWxlUmVwYXJzZSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIihyZSlQYXJzZSBhIGJiIGZpbGUiIiIKKyAgICAgICAgYmJmaWxlID0gcGFyYW1zWzBdCisgICAgICAgIHByaW50KCJTSEVMTDogUGFyc2luZyAnJXMnIiAlIGJiZmlsZSkKKyAgICAgICAgcGFyc2UudXBkYXRlX210aW1lKCBiYmZpbGUgKQorICAgICAgICBjb29rZXIucGFyc2VyLnJlcGFyc2UoYmJmaWxlKQorICAgICAgICBpZiBGYWxzZTogI2Zyb21DYWNoZToKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogRmlsZSBoYXMgbm90IGJlZW4gdXBkYXRlZCwgbm90IHJlcGFyc2luZyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IFBhcnNlZCIpCisgICAgZmlsZVJlcGFyc2UudXNhZ2UgPSAiPGJiZmlsZT4iCisKKyAgICBkZWYgYWJvcnQoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJUb2dnbGUgYWJvcnQgdGFzayBleGVjdXRpb24gZmxhZyAoc2VlIGJpdGJha2UgLWspIiIiCisgICAgICAgIGNvb2tlci5jb25maWd1cmF0aW9uLmFib3J0ID0gbm90IGNvb2tlci5jb25maWd1cmF0aW9uLmFib3J0CisgICAgICAgIHByaW50KCJTSEVMTDogQWJvcnQgRmxhZyBpcyBub3cgJyVzJyIgJSByZXByKCBjb29rZXIuY29uZmlndXJhdGlvbi5hYm9ydCApKQorCisgICAgZGVmIGZvcmNlKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiVG9nZ2xlIGZvcmNlIHRhc2sgZXhlY3V0aW9uIGZsYWcgKHNlZSBiaXRiYWtlIC1mKSIiIgorICAgICAgICBjb29rZXIuY29uZmlndXJhdGlvbi5mb3JjZSA9IG5vdCBjb29rZXIuY29uZmlndXJhdGlvbi5mb3JjZQorICAgICAgICBwcmludCgiU0hFTEw6IEZvcmNlIEZsYWcgaXMgbm93ICclcyciICUgcmVwciggY29va2VyLmNvbmZpZ3VyYXRpb24uZm9yY2UgKSkKKworICAgIGRlZiBoZWxwKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiU2hvdyBhIGNvbXByZWhlbnNpdmUgbGlzdCBvZiBjb21tYW5kcyBhbmQgdGhlaXIgcHVycG9zZSIiIgorICAgICAgICBwcmludCgiPSIqMzAsICJBdmFpbGFibGUgQ29tbWFuZHMiLCAiPSIqMzApCisgICAgICAgIGZvciBjbWQgaW4gc29ydGVkKGNtZHMpOgorICAgICAgICAgICAgZnVuY3Rpb24sIG51bXBhcmFtcywgdXNhZ2UsIGhlbHB0ZXh0ID0gY21kc1tjbWRdCisgICAgICAgICAgICBwcmludCgifCAlcyB8ICVzIiAlICh1c2FnZS5sanVzdCgzMCksIGhlbHB0ZXh0KSkKKyAgICAgICAgcHJpbnQoIj0iKjc4KQorCisgICAgZGVmIGxhc3RFcnJvciggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlNob3cgdGhlIHJlYXNvbiBvciBsb2cgdGhhdCB3YXMgcHJvZHVjZWQgYnkgdGhlIGxhc3QgQml0QmFrZSBldmVudCBleGNlcHRpb24iIiIKKyAgICAgICAgaWYgbGFzdF9leGNlcHRpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogTm8gRXJyb3JzIHlldCAoUGhldykuLi4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVhc29uLCBldmVudCA9IGxhc3RfZXhjZXB0aW9uLmFyZ3MKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogUmVhc29uIGZvciB0aGUgbGFzdCBlcnJvcjogJyVzJyIgJSByZWFzb24pCisgICAgICAgICAgICBpZiAnOicgaW4gcmVhc29uOgorICAgICAgICAgICAgICAgIG1zZywgZmlsZW5hbWUgPSByZWFzb24uc3BsaXQoICc6JyApCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBEdW1waW5nIGxvZyBmaWxlIGZvciBsYXN0IGVycm9yOiIpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwcmludChvcGVuKCBmaWxlbmFtZSApLnJlYWQoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBDb3VsZG4ndCBvcGVuICclcyciICUgZmlsZW5hbWUpCisKKyAgICBkZWYgbWF0Y2goIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJEdW1wIGFsbCBmaWxlcyBvciBwcm92aWRlcnMgbWF0Y2hpbmcgYSBnbG9iIGV4cHJlc3Npb24iIiIKKyAgICAgICAgd2hhdCwgZ2xvYmV4cHIgPSBwYXJhbXMKKyAgICAgICAgaWYgd2hhdCA9PSAiZmlsZXMiOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tQYXJzZWQoKQorICAgICAgICAgICAgZm9yIGtleSBpbiBnbG9iZmlsdGVyKCBjb29rZXIuc3RhdHVzLnBrZ19mbiwgZ2xvYmV4cHIgKTogcHJpbnQoa2V5KQorICAgICAgICBlbGlmIHdoYXQgPT0gInByb3ZpZGVycyI6CisgICAgICAgICAgICBzZWxmLl9jaGVja1BhcnNlZCgpCisgICAgICAgICAgICBmb3Iga2V5IGluIGdsb2JmaWx0ZXIoIGNvb2tlci5zdGF0dXMucGtnX3BuLCBnbG9iZXhwciApOiBwcmludChrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiVXNhZ2U6IG1hdGNoICVzIiAlIHNlbGYucHJpbnRfLnVzYWdlKQorICAgIG1hdGNoLnVzYWdlID0gIjxmaWxlc3xwcm92aWRlcnM+IDxnbG9iPiIKKworICAgIGRlZiBuZXcoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgLmJiIGZpbGUgYW5kIG9wZW4gdGhlIGVkaXRvciIiIgorICAgICAgICBkaXJuYW1lLCBmaWxlbmFtZSA9IHBhcmFtcworICAgICAgICBwYWNrYWdlcyA9ICcvJy5qb2luKCBkYXRhLmdldFZhciggIkJCRklMRVMiLCBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhLCAxICkuc3BsaXQoJy8nKVs6LTJdICkKKyAgICAgICAgZnVsbGRpcm5hbWUgPSAiJXMvJXMiICUgKCBwYWNrYWdlcywgZGlybmFtZSApCisKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCBmdWxsZGlybmFtZSApOgorICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBDcmVhdGluZyAnJXMnIiAlIGZ1bGxkaXJuYW1lKQorICAgICAgICAgICAgb3MubWtkaXIoIGZ1bGxkaXJuYW1lICkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoIGZ1bGxkaXJuYW1lICkgYW5kIG9zLnBhdGguaXNkaXIoIGZ1bGxkaXJuYW1lICk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyggIiVzLyVzIiAlICggZnVsbGRpcm5hbWUsIGZpbGVuYW1lICkgKToKKyAgICAgICAgICAgICAgICBwcmludCgiU0hFTEw6IEVSUk9SOiAlcy8lcyBhbHJlYWR5IGV4aXN0cyIgJSAoIGZ1bGxkaXJuYW1lLCBmaWxlbmFtZSApKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBDcmVhdGluZyAnJXMvJXMnIiAlICggZnVsbGRpcm5hbWUsIGZpbGVuYW1lICkpCisgICAgICAgICAgICBuZXdwYWNrYWdlID0gb3BlbiggIiVzLyVzIiAlICggZnVsbGRpcm5hbWUsIGZpbGVuYW1lICksICJ3IiApCisgICAgICAgICAgICBwcmludCgiIiJERVNDUklQVElPTiA9ICIiCitTRUNUSU9OID0gIiIKK0FVVEhPUiA9ICIiCitIT01FUEFHRSA9ICIiCitNQUlOVEFJTkVSID0gIiIKK0xJQ0VOU0UgPSAiR1BMIgorUFIgPSAicjAiCisKK1NSQ19VUkkgPSAiIgorCisjaW5oZXJpdCBiYXNlCisKKyNkb19jb25maWd1cmUoKSB7CisjCisjfQorCisjZG9fY29tcGlsZSgpIHsKKyMKKyN9CisKKyNkb19zdGFnZSgpIHsKKyMKKyN9CisKKyNkb19pbnN0YWxsKCkgeworIworI30KKyIiIiwgZmlsZT1uZXdwYWNrYWdlKQorICAgICAgICAgICAgbmV3cGFja2FnZS5jbG9zZSgpCisgICAgICAgICAgICBvcy5zeXN0ZW0oICIlcyAlcy8lcyIgJSAoIG9zLmVudmlyb24uZ2V0KCAiRURJVE9SIiApLCBmdWxsZGlybmFtZSwgZmlsZW5hbWUgKSApCisgICAgbmV3LnVzYWdlID0gIjxkaXJlY3Rvcnk+IDxmaWxlbmFtZT4iCisKKyAgICBkZWYgcGFja2FnZSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgJ3BhY2thZ2UnIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAicGFja2FnZSIgKQorICAgIHBhY2thZ2UudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBwYXN0ZUJpbiggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlNlbmQgYSBjb21tYW5kICsgb3V0cHV0IGJ1ZmZlciB0byB0aGUgcGFzdGViaW4gYXQgaHR0cDovL3JhZmIubmV0L3Bhc3RlIiIiCisgICAgICAgIGluZGV4ID0gcGFyYW1zWzBdCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5fc2hlbGwubXlvdXQuYnVmZmVyKCBpbnQoIGluZGV4ICkgKQorICAgICAgICBzZW5kVG9QYXN0ZWJpbiggIm91dHB1dCBvZiAiICsgcGFyYW1zWzBdLCBjb250ZW50cyApCisgICAgcGFzdGVCaW4udXNhZ2UgPSAiPGluZGV4PiIKKworICAgIGRlZiBwYXN0ZUxvZyggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlNlbmQgdGhlIGxhc3QgZXZlbnQgZXhjZXB0aW9uIGVycm9yIGxvZyAoaWYgdGhlcmUgaXMgb25lKSB0byBodHRwOi8vcmFmYi5uZXQvcGFzdGUiIiIKKyAgICAgICAgaWYgbGFzdF9leGNlcHRpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogTm8gRXJyb3JzIHlldCAoUGhldykuLi4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVhc29uLCBldmVudCA9IGxhc3RfZXhjZXB0aW9uLmFyZ3MKKyAgICAgICAgICAgIHByaW50KCJTSEVMTDogUmVhc29uIGZvciB0aGUgbGFzdCBlcnJvcjogJyVzJyIgJSByZWFzb24pCisgICAgICAgICAgICBpZiAnOicgaW4gcmVhc29uOgorICAgICAgICAgICAgICAgIG1zZywgZmlsZW5hbWUgPSByZWFzb24uc3BsaXQoICc6JyApCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgcHJpbnQoIlNIRUxMOiBQYXN0aW5nIGxvZyBmaWxlIHRvIHBhc3RlYmluLi4uIikKKworICAgICAgICAgICAgICAgIGZpbGUgPSBvcGVuKCBmaWxlbmFtZSApLnJlYWQoKQorICAgICAgICAgICAgICAgIHNlbmRUb1Bhc3RlYmluKCAiY29udGVudHMgb2YgIiArIGZpbGVuYW1lLCBmaWxlICkKKworICAgIGRlZiBwYXRjaCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgJ3BhdGNoJyBjb21tYW5kIG9uIGEgcHJvdmlkZWUiIiIKKyAgICAgICAgc2VsZi5idWlsZCggcGFyYW1zLCAicGF0Y2giICkKKyAgICBwYXRjaC51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIHBhcnNlKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiKFJlLSlwYXJzZSAuYmIgZmlsZXMgYW5kIGNhbGN1bGF0ZSB0aGUgZGVwZW5kZW5jeSBncmFwaCIiIgorICAgICAgICBjb29rZXIuc3RhdHVzID0gY2FjaGUuQ2FjaGVEYXRhKGNvb2tlci5jYWNoZXNfYXJyYXkpCisgICAgICAgIGlnbm9yZSA9IGRhdGEuZ2V0VmFyKCJBU1NVTUVfUFJPVklERUQiLCBjb29rZXIuY29uZmlndXJhdGlvbi5kYXRhLCAxKSBvciAiIgorICAgICAgICBjb29rZXIuc3RhdHVzLmlnbm9yZWRfZGVwZW5kZW5jaWVzID0gc2V0KCBpZ25vcmUuc3BsaXQoKSApCisgICAgICAgIGNvb2tlci5oYW5kbGVDb2xsZWN0aW9ucyggZGF0YS5nZXRWYXIoIkJCRklMRV9DT0xMRUNUSU9OUyIsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIDEpICkKKworICAgICAgICAoZmlsZWxpc3QsIG1hc2tlZCkgPSBjb29rZXIuY29sbGVjdF9iYmZpbGVzKCkKKyAgICAgICAgY29va2VyLnBhcnNlX2JiZmlsZXMoZmlsZWxpc3QsIG1hc2tlZCwgY29va2VyLm15UHJvZ3Jlc3NDYWxsYmFjaykKKyAgICAgICAgY29va2VyLmJ1aWxkRGVwZ3JhcGgoKQorICAgICAgICBnbG9iYWwgcGFyc2VkCisgICAgICAgIHBhcnNlZCA9IFRydWUKKyAgICAgICAgcHJpbnQoKQorCisgICAgZGVmIHJlcGFyc2UoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiIocmUpUGFyc2UgYSBwcm92aWRlZSdzIGJiIGZpbGUiIiIKKyAgICAgICAgYmJmaWxlID0gc2VsZi5fZmluZFByb3ZpZGVyKCBwYXJhbXNbMF0gKQorICAgICAgICBpZiBiYmZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IEZvdW5kIGJiZmlsZSAnJXMnIGZvciAnJXMnIiAlICggYmJmaWxlLCBwYXJhbXNbMF0gKSkKKyAgICAgICAgICAgIHNlbGYuZmlsZVJlcGFyc2UoIFsgYmJmaWxlIF0gKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBOb3RoaW5nIHByb3ZpZGVzICclcyciICUgcGFyYW1zWzBdKQorICAgIHJlcGFyc2UudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBnZXR2YXIoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJEdW1wIHRoZSBjb250ZW50cyBvZiBhbiBvdXRlciBCaXRCYWtlIGVudmlyb25tZW50IHZhcmlhYmxlIiIiCisgICAgICAgIHZhciA9IHBhcmFtc1swXQorICAgICAgICB2YWx1ZSA9IGRhdGEuZ2V0VmFyKCB2YXIsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEsIDEgKQorICAgICAgICBwcmludCh2YWx1ZSkKKyAgICBnZXR2YXIudXNhZ2UgPSAiPHZhcmlhYmxlPiIKKworICAgIGRlZiBwZWVrKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRHVtcCBjb250ZW50cyBvZiB2YXJpYWJsZSBkZWZpbmVkIGluIHByb3ZpZGVlJ3MgbWV0YWRhdGEiIiIKKyAgICAgICAgbmFtZSwgdmFyID0gcGFyYW1zCisgICAgICAgIGJiZmlsZSA9IHNlbGYuX2ZpbmRQcm92aWRlciggbmFtZSApCisgICAgICAgIGlmIGJiZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRoZV9kYXRhID0gY2FjaGUuQ2FjaGUubG9hZERhdGFGdWxsKGJiZmlsZSwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSkKKyAgICAgICAgICAgIHZhbHVlID0gdGhlX2RhdGEuZ2V0VmFyKCB2YXIsIDEgKQorICAgICAgICAgICAgcHJpbnQodmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCgiRVJST1I6IE5vdGhpbmcgcHJvdmlkZXMgJyVzJyIgJSBuYW1lKQorICAgIHBlZWsudXNhZ2UgPSAiPHByb3ZpZGVlPiA8dmFyaWFibGU+IgorCisgICAgZGVmIHBva2UoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJTZXQgY29udGVudHMgb2YgdmFyaWFibGUgZGVmaW5lZCBpbiBwcm92aWRlZSdzIG1ldGFkYXRhIiIiCisgICAgICAgIG5hbWUsIHZhciwgdmFsdWUgPSBwYXJhbXMKKyAgICAgICAgYmJmaWxlID0gc2VsZi5fZmluZFByb3ZpZGVyKCBuYW1lICkKKyAgICAgICAgaWYgYmJmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBTb3JyeSwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGN1cnJlbnRseSBicm9rZW4iKQorICAgICAgICAgICAgI2QgPSBjb29rZXIucGtnZGF0YVtiYmZpbGVdCisgICAgICAgICAgICAjZGF0YS5zZXRWYXIoIHZhciwgdmFsdWUsIGQgKQorCisgICAgICAgICAgICAjIG1hcmsgdGhlIGNoYW5nZSBzZW1pIHBlcnNpc3RhbnQKKyAgICAgICAgICAgICNjb29rZXIucGtnZGF0YS5zZXREaXJ0eShiYmZpbGUsIGQpCisgICAgICAgICAgICAjcHJpbnQgIk9LIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIkVSUk9SOiBOb3RoaW5nIHByb3ZpZGVzICclcyciICUgbmFtZSkKKyAgICBwb2tlLnVzYWdlID0gIjxwcm92aWRlZT4gPHZhcmlhYmxlPiA8dmFsdWU+IgorCisgICAgZGVmIHByaW50Xyggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkR1bXAgYWxsIGZpbGVzIG9yIHByb3ZpZGVycyIiIgorICAgICAgICB3aGF0ID0gcGFyYW1zWzBdCisgICAgICAgIGlmIHdoYXQgPT0gImZpbGVzIjoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrUGFyc2VkKCkKKyAgICAgICAgICAgIGZvciBrZXkgaW4gY29va2VyLnN0YXR1cy5wa2dfZm46IHByaW50KGtleSkKKyAgICAgICAgZWxpZiB3aGF0ID09ICJwcm92aWRlcnMiOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tQYXJzZWQoKQorICAgICAgICAgICAgZm9yIGtleSBpbiBjb29rZXIuc3RhdHVzLnByb3ZpZGVyczogcHJpbnQoa2V5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoIlVzYWdlOiBwcmludCAlcyIgJSBzZWxmLnByaW50Xy51c2FnZSkKKyAgICBwcmludF8udXNhZ2UgPSAiPGZpbGVzfHByb3ZpZGVycz4iCisKKyAgICBkZWYgcHl0aG9uKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRW50ZXIgdGhlIGV4cGVydCBtb2RlIC0gYW4gaW50ZXJhY3RpdmUgQml0QmFrZSBQeXRob24gSW50ZXJwcmV0ZXIiIiIKKyAgICAgICAgc3lzLnBzMSA9ICJFWFBFUlQgQkI+Pj4gIgorICAgICAgICBzeXMucHMyID0gIkVYUEVSVCBCQi4uLiAiCisgICAgICAgIGltcG9ydCBjb2RlCisgICAgICAgIGludGVycHJldGVyID0gY29kZS5JbnRlcmFjdGl2ZUNvbnNvbGUoIGRpY3QoIGdsb2JhbHMoKSApICkKKyAgICAgICAgaW50ZXJwcmV0ZXIuaW50ZXJhY3QoICJTSEVMTDogRXhwZXJ0IE1vZGUgLSBCaXRCYWtlIFB5dGhvbiAlc1xuVHlwZSAnaGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHByZXNzIENUUkwtRCB0byBzd2l0Y2ggYmFjayB0byBCQlNIRUxMLiIgJSBzeXMudmVyc2lvbiApCisKKyAgICBkZWYgc2hvd2RhdGEoIHNlbGYsIHBhcmFtcyApOgorICAgICAgICAiIiJFeGVjdXRlICdzaG93ZGF0YScgb24gYSBwcm92aWRlZSIiIgorICAgICAgICBjb29rZXIuc2hvd0Vudmlyb25tZW50KE5vbmUsIHBhcmFtcykKKyAgICBzaG93ZGF0YS51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIHNldFZhciggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIlNldCBhbiBvdXRlciBCaXRCYWtlIGVudmlyb25tZW50IHZhcmlhYmxlIiIiCisgICAgICAgIHZhciwgdmFsdWUgPSBwYXJhbXMKKyAgICAgICAgZGF0YS5zZXRWYXIoIHZhciwgdmFsdWUsIGNvb2tlci5jb25maWd1cmF0aW9uLmRhdGEgKQorICAgICAgICBwcmludCgiT0siKQorICAgIHNldFZhci51c2FnZSA9ICI8dmFyaWFibGU+IDx2YWx1ZT4iCisKKyAgICBkZWYgcmVidWlsZCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkNsZWFuIGFuZCByZWJ1aWxkIGEgLmJiIGZpbGUgb3IgYSBwcm92aWRlZSIiIgorICAgICAgICBzZWxmLmJ1aWxkKCBwYXJhbXMsICJjbGVhbiIgKQorICAgICAgICBzZWxmLmJ1aWxkKCBwYXJhbXMsICJidWlsZCIgKQorICAgIHJlYnVpbGQudXNhZ2UgPSAiPHByb3ZpZGVlPiIKKworICAgIGRlZiBzaGVsbCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIGFuZCBkdW1wIHRoZSBvdXRwdXQiIiIKKyAgICAgICAgaWYgcGFyYW1zICE9ICIiOgorICAgICAgICAgICAgcHJpbnQoY29tbWFuZHMuZ2V0b3V0cHV0KCAiICIuam9pbiggcGFyYW1zICkgKSkKKyAgICBzaGVsbC51c2FnZSA9ICI8Li4uPiIKKworICAgIGRlZiBzdGFnZSggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIkV4ZWN1dGUgJ3N0YWdlJyBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgInBvcHVsYXRlX3N0YWdpbmciICkKKyAgICBzdGFnZS51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIHN0YXR1cyggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIjxqdXN0IGZvciB0ZXN0aW5nPiIiIgorICAgICAgICBwcmludCgiLSIgKiA3OCkKKyAgICAgICAgcHJpbnQoImJ1aWxkaW5nIGxpc3QgPSAnJXMnIiAlIGNvb2tlci5idWlsZGluZ19saXN0KQorICAgICAgICBwcmludCgiYnVpbGQgcGF0aCA9ICclcyciICUgY29va2VyLmJ1aWxkX3BhdGgpCisgICAgICAgIHByaW50KCJjb25zaWRlcl9tc2dzX2NhY2hlID0gJyVzJyIgJSBjb29rZXIuY29uc2lkZXJfbXNnc19jYWNoZSkKKyAgICAgICAgcHJpbnQoImJ1aWxkIHN0YXRzID0gJyVzJyIgJSBjb29rZXIuc3RhdHMpCisgICAgICAgIGlmIGxhc3RfZXhjZXB0aW9uIGlzIG5vdCBOb25lOiBwcmludCgibGFzdF9leGNlcHRpb24gPSAnJXMnIiAlIHJlcHIoIGxhc3RfZXhjZXB0aW9uLmFyZ3MgKSkKKyAgICAgICAgcHJpbnQoIm1lbW9yeSBvdXRwdXQgY29udGVudHMgPSAnJXMnIiAlIHNlbGYuX3NoZWxsLm15b3V0Ll9idWZmZXIpCisKKyAgICBkZWYgdGVzdCggc2VsZiwgcGFyYW1zICk6CisgICAgICAgICIiIjxqdXN0IGZvciB0ZXN0aW5nPiIiIgorICAgICAgICBwcmludCgidGVzdENvbW1hbmQgY2FsbGVkIHdpdGggJyVzJyIgJSBwYXJhbXMpCisKKyAgICBkZWYgdW5wYWNrKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiRXhlY3V0ZSAndW5wYWNrJyBvbiBhIHByb3ZpZGVlIiIiCisgICAgICAgIHNlbGYuYnVpbGQoIHBhcmFtcywgInVucGFjayIgKQorICAgIHVucGFjay51c2FnZSA9ICI8cHJvdmlkZWU+IgorCisgICAgZGVmIHdoaWNoKCBzZWxmLCBwYXJhbXMgKToKKyAgICAgICAgIiIiQ29tcHV0ZXMgdGhlIHByb3ZpZGVycyBmb3IgYSBnaXZlbiBwcm92aWRlZSIiIgorICAgICAgICAjIE5lZWQgdG8gdXNlIHRhc2tEYXRhIGZvciB0aGlzIGluZm9ybWF0aW9uCisgICAgICAgIGl0ZW0gPSBwYXJhbXNbMF0KKworICAgICAgICBzZWxmLl9jaGVja1BhcnNlZCgpCisKKyAgICAgICAgcHJlZmVycmVkID0gZGF0YS5nZXRWYXIoICJQUkVGRVJSRURfUFJPVklERVJfJXMiICUgaXRlbSwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSwgMSApCisgICAgICAgIGlmIG5vdCBwcmVmZXJyZWQ6IHByZWZlcnJlZCA9IGl0ZW0KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsdiwgbGYsIHB2LCBwZiA9IFByb3ZpZGVycy5maW5kQmVzdFByb3ZpZGVyKHByZWZlcnJlZCwgY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YSwgY29va2VyLnN0YXR1cykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgbHYsIGxmLCBwdiwgcGYgPSAoTm9uZSwpKjQKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm92aWRlcnMgPSBjb29rZXIuc3RhdHVzLnByb3ZpZGVyc1tpdGVtXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IEVSUk9SOiBOb3RoaW5nIHByb3ZpZGVzIiwgcHJlZmVycmVkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHByb3ZpZGVyIGluIHByb3ZpZGVyczoKKyAgICAgICAgICAgICAgICBpZiBwcm92aWRlciA9PSBwZjogcHJvdmlkZXIgPSAiICgqKiopICVzIiAlIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgIHByb3ZpZGVyID0gIiAgICAgICAlcyIgJSBwcm92aWRlcgorICAgICAgICAgICAgICAgIHByaW50KHByb3ZpZGVyKQorICAgIHdoaWNoLnVzYWdlID0gIjxwcm92aWRlZT4iCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbW1vbiBoZWxwZXIgZnVuY3Rpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgY29tcGxldGVGaWxlUGF0aCggYmJmaWxlICk6CisgICAgIiIiR2V0IHRoZSBjb21wbGV0ZSBiYmZpbGUgcGF0aCIiIgorICAgIGlmIG5vdCBjb29rZXIuc3RhdHVzOiByZXR1cm4gYmJmaWxlCisgICAgaWYgbm90IGNvb2tlci5zdGF0dXMucGtnX2ZuOiByZXR1cm4gYmJmaWxlCisgICAgZm9yIGtleSBpbiBjb29rZXIuc3RhdHVzLnBrZ19mbjoKKyAgICAgICAgaWYga2V5LmVuZHN3aXRoKCBiYmZpbGUgKToKKyAgICAgICAgICAgIHJldHVybiBrZXkKKyAgICByZXR1cm4gYmJmaWxlCisKK2RlZiBzZW5kVG9QYXN0ZWJpbiggZGVzYywgY29udGVudCApOgorICAgICIiIlNlbmQgY29udGVudCB0byBodHRwOi8vb2UucGFzdGViaW4uY29tIiIiCisgICAgbXlkYXRhID0ge30KKyAgICBteWRhdGFbImxhbmciXSA9ICJQbGFpbiBUZXh0IgorICAgIG15ZGF0YVsiZGVzYyJdID0gZGVzYworICAgIG15ZGF0YVsiY3Z0X3RhYnMiXSA9ICJObyIKKyAgICBteWRhdGFbIm5pY2siXSA9ICIlc0AlcyIgJSAoIG9zLmVudmlyb24uZ2V0KCAiVVNFUiIsICJ1bmtub3duIiApLCBzb2NrZXQuZ2V0aG9zdG5hbWUoKSBvciAidW5rbm93biIgKQorICAgIG15ZGF0YVsidGV4dCJdID0gY29udGVudAorICAgIHBhcmFtcyA9IHVybGxpYi51cmxlbmNvZGUoIG15ZGF0YSApCisgICAgaGVhZGVycyA9IHsiQ29udGVudC10eXBlIjogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICJBY2NlcHQiOiAidGV4dC9wbGFpbiJ9CisKKyAgICBob3N0ID0gInJhZmIubmV0IgorICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCAiJXM6ODAiICUgaG9zdCApCisgICAgY29ubi5yZXF1ZXN0KCJQT1NUIiwgIi9wYXN0ZS9wYXN0ZS5waHAiLCBwYXJhbXMsIGhlYWRlcnMgKQorCisgICAgcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKCkKKyAgICBjb25uLmNsb3NlKCkKKworICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDI6CisgICAgICAgIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0aGVhZGVyKCAibG9jYXRpb24iICkgb3IgInVua25vd24iCisgICAgICAgIHByaW50KCJTSEVMTDogUGFzdGVkIHRvIGh0dHA6Ly8lcyVzIiAlICggaG9zdCwgbG9jYXRpb24gKSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiRVJST1I6ICVzICVzIiAlICggcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5yZWFzb24gKSkKKworZGVmIGNvbXBsZXRlciggdGV4dCwgc3RhdGUgKToKKyAgICAiIiJSZXR1cm4gYSBwb3NzaWJsZSByZWFkbGluZSBjb21wbGV0aW9uIiIiCisgICAgZGVidWdPdXQoICJjb21wbGV0ZXIgY2FsbGVkIHdpdGggdGV4dD0nJXMnLCBzdGF0ZT0nJWQnIiAlICggdGV4dCwgc3RhdGUgKSApCisKKyAgICBpZiBzdGF0ZSA9PSAwOgorICAgICAgICBsaW5lID0gcmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKKyAgICAgICAgaWYgIiAiIGluIGxpbmU6CisgICAgICAgICAgICBsaW5lID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICAjIHdlIGFyZSBpbiBzZWNvbmQgKG9yIG1vcmUpIGFyZ3VtZW50CisgICAgICAgICAgICBpZiBsaW5lWzBdIGluIGNtZHMgYW5kIGhhc2F0dHIoIGNtZHNbbGluZVswXV1bMF0sICJ1c2FnZSIgKTogIyBrbm93biBjb21tYW5kIGFuZCB1c2FnZQorICAgICAgICAgICAgICAgIHUgPSBnZXRhdHRyKCBjbWRzW2xpbmVbMF1dWzBdLCAidXNhZ2UiICkuc3BsaXQoKVswXQorICAgICAgICAgICAgICAgIGlmIHUgPT0gIjx2YXJpYWJsZT4iOgorICAgICAgICAgICAgICAgICAgICBhbGxtYXRjaGVzID0gY29va2VyLmNvbmZpZ3VyYXRpb24uZGF0YS5rZXlzKCkKKyAgICAgICAgICAgICAgICBlbGlmIHUgPT0gIjxiYmZpbGU+IjoKKyAgICAgICAgICAgICAgICAgICAgaWYgY29va2VyLnN0YXR1cy5wa2dfZm4gaXMgTm9uZTogYWxsbWF0Y2hlcyA9IFsgIihObyBNYXRjaGVzIEF2YWlsYWJsZS4gUGFyc2VkIHlldD8pIiBdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6IGFsbG1hdGNoZXMgPSBbIHguc3BsaXQoIi8iKVstMV0gZm9yIHggaW4gY29va2VyLnN0YXR1cy5wa2dfZm4gXQorICAgICAgICAgICAgICAgIGVsaWYgdSA9PSAiPHByb3ZpZGVlPiI6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvb2tlci5zdGF0dXMucGtnX2ZuIGlzIE5vbmU6IGFsbG1hdGNoZXMgPSBbICIoTm8gTWF0Y2hlcyBBdmFpbGFibGUuIFBhcnNlZCB5ZXQ/KSIgXQorICAgICAgICAgICAgICAgICAgICBlbHNlOiBhbGxtYXRjaGVzID0gY29va2VyLnN0YXR1cy5wcm92aWRlcnMuaXRlcmtleXMoKQorICAgICAgICAgICAgICAgIGVsc2U6IGFsbG1hdGNoZXMgPSBbICIoTm8gdGFiIGNvbXBsZXRpb24gYXZhaWxhYmxlIGZvciB0aGlzIGNvbW1hbmQpIiBdCisgICAgICAgICAgICBlbHNlOiBhbGxtYXRjaGVzID0gWyAiKE5vIHRhYiBjb21wbGV0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBjb21tYW5kKSIgXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB3ZSBhcmUgaW4gZmlyc3QgYXJndW1lbnQKKyAgICAgICAgICAgIGFsbG1hdGNoZXMgPSBjbWRzLml0ZXJrZXlzKCkKKworICAgICAgICBjb21wbGV0ZXIubWF0Y2hlcyA9IFsgeCBmb3IgeCBpbiBhbGxtYXRjaGVzIGlmIHhbOmxlbih0ZXh0KV0gPT0gdGV4dCBdCisgICAgICAgICNwcmludCAiY29tcGxldGVyLm1hdGNoZXMgPSAnJXMnIiAlIGNvbXBsZXRlci5tYXRjaGVzCisgICAgaWYgbGVuKCBjb21wbGV0ZXIubWF0Y2hlcyApID4gc3RhdGU6CisgICAgICAgIHJldHVybiBjb21wbGV0ZXIubWF0Y2hlc1tzdGF0ZV0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgZGVidWdPdXQoIHRleHQgKToKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIiggJXMgKVxuIiAlIHRleHQgKQorCitkZWYgY29sdW1uaXplKCBhbGlzdCwgd2lkdGggPSA4MCApOgorICAgICIiIgorICAgIEEgd29yZC13cmFwIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGV4aXN0aW5nIGxpbmUgYnJlYWtzCisgICAgYW5kIG1vc3Qgc3BhY2VzIGluIHRoZSB0ZXh0LiBFeHBlY3RzIHRoYXQgZXhpc3RpbmcgbGluZQorICAgIGJyZWFrcyBhcmUgcG9zaXggbmV3bGluZXMgKFxuKS4KKyAgICAiIiIKKyAgICByZXR1cm4gcmVkdWNlKGxhbWJkYSBsaW5lLCB3b3JkLCB3aWR0aD13aWR0aDogJyVzJXMlcycgJQorICAgICAgICAgICAgICAgICAgKGxpbmUsCisgICAgICAgICAgICAgICAgICAgJyBcbidbKGxlbihsaW5lW2xpbmUucmZpbmQoJ1xuJykrMTpdKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuKHdvcmQuc3BsaXQoJ1xuJywgMSlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPj0gd2lkdGgpXSwKKyAgICAgICAgICAgICAgICAgICB3b3JkKSwKKyAgICAgICAgICAgICAgICAgIGFsaXN0CisgICAgICAgICAgICAgICAgICkKKworZGVmIGdsb2JmaWx0ZXIoIG5hbWVzLCBwYXR0ZXJuICk6CisgICAgcmV0dXJuIGZubWF0Y2guZmlsdGVyKCBuYW1lcywgcGF0dGVybiApCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENsYXNzIE1lbW9yeU91dHB1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgTWVtb3J5T3V0cHV0OgorICAgICIiIkZpbGUtbGlrZSBvdXRwdXQgY2xhc3MgYnVmZmVyaW5nIHRoZSBvdXRwdXQgb2YgdGhlIGxhc3QgMTAgY29tbWFuZHMiIiIKKyAgICBkZWYgX19pbml0X18oIHNlbGYsIGRlbGVnYXRlICk6CisgICAgICAgIHNlbGYuZGVsZWdhdGUgPSBkZWxlZ2F0ZQorICAgICAgICBzZWxmLl9idWZmZXIgPSBbXQorICAgICAgICBzZWxmLnRleHQgPSBbXQorICAgICAgICBzZWxmLl9jb21tYW5kID0gTm9uZQorCisgICAgZGVmIHN0YXJ0Q29tbWFuZCggc2VsZiwgY29tbWFuZCApOgorICAgICAgICBzZWxmLl9jb21tYW5kID0gY29tbWFuZAorICAgICAgICBzZWxmLnRleHQgPSBbXQorICAgIGRlZiBlbmRDb21tYW5kKCBzZWxmICk6CisgICAgICAgIGlmIHNlbGYuX2NvbW1hbmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsZW4oIHNlbGYuX2J1ZmZlciApID09IDEwOiBkZWwgc2VsZi5fYnVmZmVyWzBdCisgICAgICAgICAgICBzZWxmLl9idWZmZXIuYXBwZW5kKCAoIHNlbGYuX2NvbW1hbmQsIHNlbGYudGV4dCApICkKKyAgICBkZWYgcmVtb3ZlTGFzdCggc2VsZiApOgorICAgICAgICBpZiBzZWxmLl9idWZmZXI6CisgICAgICAgICAgICBkZWwgc2VsZi5fYnVmZmVyWyBsZW4oIHNlbGYuX2J1ZmZlciApIC0gMSBdCisgICAgICAgIHNlbGYudGV4dCA9IFtdCisgICAgICAgIHNlbGYuX2NvbW1hbmQgPSBOb25lCisgICAgZGVmIGxhc3RCdWZmZXIoIHNlbGYgKToKKyAgICAgICAgaWYgc2VsZi5fYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlclsgbGVuKCBzZWxmLl9idWZmZXIgKSAtMSBdWzFdCisgICAgZGVmIGJ1ZmZlcmVkQ29tbWFuZHMoIHNlbGYgKToKKyAgICAgICAgcmV0dXJuIFsgY21kIGZvciBjbWQsIG91dHB1dCBpbiBzZWxmLl9idWZmZXIgXQorICAgIGRlZiBidWZmZXIoIHNlbGYsIGkgKToKKyAgICAgICAgaWYgaSA8IGxlbiggc2VsZi5fYnVmZmVyICk6CisgICAgICAgICAgICByZXR1cm4gIkJCPj4gJXNcbiVzIiAlICggc2VsZi5fYnVmZmVyW2ldWzBdLCAiIi5qb2luKCBzZWxmLl9idWZmZXJbaV1bMV0gKSApCisgICAgICAgIGVsc2U6IHJldHVybiAiRVJST1I6IEludmFsaWQgYnVmZmVyIG51bWJlci4gQnVmZmVyIG5lZWRzIHRvIGJlIGluICgwLCAlZCkiICUgKCBsZW4oIHNlbGYuX2J1ZmZlciApIC0gMSApCisgICAgZGVmIHdyaXRlKCBzZWxmLCB0ZXh0ICk6CisgICAgICAgIGlmIHNlbGYuX2NvbW1hbmQgaXMgbm90IE5vbmUgYW5kIHRleHQgIT0gIkJCPj4gIjogc2VsZi50ZXh0LmFwcGVuZCggdGV4dCApCisgICAgICAgIGlmIHNlbGYuZGVsZWdhdGUgaXMgbm90IE5vbmU6IHNlbGYuZGVsZWdhdGUud3JpdGUoIHRleHQgKQorICAgIGRlZiBmbHVzaCggc2VsZiApOgorICAgICAgICByZXR1cm4gc2VsZi5kZWxlZ2F0ZS5mbHVzaCgpCisgICAgZGVmIGZpbGVubyggc2VsZiApOgorICAgICAgICByZXR1cm4gc2VsZi5kZWxlZ2F0ZS5maWxlbm8oKQorICAgIGRlZiBpc2F0dHkoIHNlbGYgKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVsZWdhdGUuaXNhdHR5KCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2xhc3MgQml0QmFrZVNoZWxsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBCaXRCYWtlU2hlbGw6CisKKyAgICBkZWYgX19pbml0X18oIHNlbGYgKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgY29tbWFuZHMgYW5kIHNldCB1cCByZWFkbGluZSIiIgorICAgICAgICBzZWxmLmNvbW1hbmRRID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLmNvbW1hbmRzID0gQml0QmFrZVNoZWxsQ29tbWFuZHMoIHNlbGYgKQorICAgICAgICBzZWxmLm15b3V0ID0gTWVtb3J5T3V0cHV0KCBzeXMuc3Rkb3V0ICkKKyAgICAgICAgc2VsZi5oaXN0b3J5ZmlsZW5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoICJ+Ly5iYnNoX2hpc3RvcnkiICkKKyAgICAgICAgc2VsZi5zdGFydHVwZmlsZW5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoICJ+Ly5iYnNoX3N0YXJ0dXAiICkKKworICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKCBjb21wbGV0ZXIgKQorICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyX2RlbGltcyggIiAiICkKKyAgICAgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoInRhYjogY29tcGxldGUiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlYWRsaW5lLnJlYWRfaGlzdG9yeV9maWxlKCBzZWxmLmhpc3RvcnlmaWxlbmFtZSApCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcyAgIyBJdCBkb2Vzbid0IGV4aXN0IHlldC4KKworICAgICAgICBwcmludChfX2NyZWRpdHNfXykKKworICAgIGRlZiBjbGVhbnVwKCBzZWxmICk6CisgICAgICAgICIiIldyaXRlIHJlYWRsaW5lIGhpc3RvcnkgYW5kIGNsZWFuIHVwIHJlc291cmNlcyIiIgorICAgICAgICBkZWJ1Z091dCggIndyaXRpbmcgY29tbWFuZCBoaXN0b3J5IiApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlYWRsaW5lLndyaXRlX2hpc3RvcnlfZmlsZSggc2VsZi5oaXN0b3J5ZmlsZW5hbWUgKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IFVuYWJsZSB0byBzYXZlIGNvbW1hbmQgaGlzdG9yeSIpCisKKyAgICBkZWYgcmVnaXN0ZXJDb21tYW5kKCBzZWxmLCBjb21tYW5kLCBmdW5jdGlvbiwgbnVtcGFyYW1zID0gMCwgdXNhZ2UgPSAiIiwgaGVscHRleHQgPSAiIiApOgorICAgICAgICAiIiJSZWdpc3RlciBhIGNvbW1hbmQiIiIKKyAgICAgICAgaWYgdXNhZ2UgPT0gIiI6IHVzYWdlID0gY29tbWFuZAorICAgICAgICBpZiBoZWxwdGV4dCA9PSAiIjogaGVscHRleHQgPSBmdW5jdGlvbi5fX2RvY19fIG9yICI8bm90IHlldCBkb2N1bWVudGVkPiIKKyAgICAgICAgY21kc1tjb21tYW5kXSA9ICggZnVuY3Rpb24sIG51bXBhcmFtcywgdXNhZ2UsIGhlbHB0ZXh0ICkKKworICAgIGRlZiBwcm9jZXNzQ29tbWFuZCggc2VsZiwgY29tbWFuZCwgcGFyYW1zICk6CisgICAgICAgICIiIlByb2Nlc3MgYSBjb21tYW5kLiBDaGVjayBudW1iZXIgb2YgcGFyYW1zIGFuZCBwcmludCBhIHVzYWdlIHN0cmluZywgaWYgYXBwcm9wcmlhdGUiIiIKKyAgICAgICAgZGVidWdPdXQoICJwcm9jZXNzaW5nIGNvbW1hbmQgJyVzJy4uLiIgJSBjb21tYW5kICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuY3Rpb24sIG51bXBhcmFtcywgdXNhZ2UsIGhlbHB0ZXh0ID0gY21kc1tjb21tYW5kXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcmludCgiU0hFTEw6IEVSUk9SOiAnJXMnIGNvbW1hbmQgaXMgbm90IGEgdmFsaWQgY29tbWFuZC4iICUgY29tbWFuZCkKKyAgICAgICAgICAgIHNlbGYubXlvdXQucmVtb3ZlTGFzdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAobnVtcGFyYW1zICE9IC0xKSBhbmQgKG5vdCBsZW4oIHBhcmFtcyApID09IG51bXBhcmFtcyk6CisgICAgICAgICAgICAgICAgcHJpbnQoIlVzYWdlOiAnJXMnIiAlIHVzYWdlKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICByZXN1bHQgPSBmdW5jdGlvbiggc2VsZi5jb21tYW5kcywgcGFyYW1zICkKKyAgICAgICAgICAgIGRlYnVnT3V0KCAicmVzdWx0IHdhcyAnJXMnIiAlIHJlc3VsdCApCisKKyAgICBkZWYgcHJvY2Vzc1N0YXJ0dXBGaWxlKCBzZWxmICk6CisgICAgICAgICIiIlJlYWQgYW5kIGV4ZWN1dGUgYWxsIGNvbW1hbmRzIGZvdW5kIGluICRIT01FLy5iYnNoX3N0YXJ0dXAiIiIKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoIHNlbGYuc3RhcnR1cGZpbGVuYW1lICk6CisgICAgICAgICAgICBzdGFydHVwZmlsZSA9IG9wZW4oIHNlbGYuc3RhcnR1cGZpbGVuYW1lLCAiciIgKQorICAgICAgICAgICAgZm9yIGNtZGxpbmUgaW4gc3RhcnR1cGZpbGU6CisgICAgICAgICAgICAgICAgZGVidWdPdXQoICJwcm9jZXNzaW5nIHN0YXJ0dXAgbGluZSAnJXMnIiAlIGNtZGxpbmUgKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbWRsaW5lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmICJ8IiBpbiBjbWRsaW5lOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiRVJST1I6ICd8JyBpbiBzdGFydHVwIGZpbGUgaXMgbm90IGFsbG93ZWQuIElnbm9yaW5nIGxpbmUiKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZFEucHV0KCBjbWRsaW5lLnN0cmlwKCkgKQorCisgICAgZGVmIG1haW4oIHNlbGYgKToKKyAgICAgICAgIiIiVGhlIG1haW4gY29tbWFuZCBsb29wIiIiCisgICAgICAgIHdoaWxlIG5vdCBsZWF2ZV9tYWlubG9vcDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbW1hbmRRLmVtcHR5KCk6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLm15b3V0LmRlbGVnYXRlCisgICAgICAgICAgICAgICAgICAgIGNtZGxpbmUgPSByYXdfaW5wdXQoICJCQj4+ICIgKQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5teW91dAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNtZGxpbmUgPSBzZWxmLmNvbW1hbmRRLmdldCgpCisgICAgICAgICAgICAgICAgaWYgY21kbGluZToKKyAgICAgICAgICAgICAgICAgICAgYWxsQ29tbWFuZHMgPSBjbWRsaW5lLnNwbGl0KCAnOycgKQorICAgICAgICAgICAgICAgICAgICBmb3IgY29tbWFuZCBpbiBhbGxDb21tYW5kczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVjbWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgY2FzZSBmb3IgZXhwZXJ0IG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbW1hbmQgPT0gJ3B5dGhvbic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYubXlvdXQuZGVsZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NDb21tYW5kKCBjb21tYW5kLCAiIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYubXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5teW91dC5zdGFydENvbW1hbmQoIGNvbW1hbmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICd8JyBpbiBjb21tYW5kOiAjIGRpc2FibGUgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsIHBpcGVjbWQgPSBjb21tYW5kLnNwbGl0KCAnfCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSA9IHNlbGYubXlvdXQuZGVsZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5teW91dC5kZWxlZ2F0ZSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBzaGxleC5zcGxpdCggY29tbWFuZCwgVHJ1ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzQ29tbWFuZCggdG9rZW5zWzBdLCB0b2tlbnNbMTpdIG9yICIiICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm15b3V0LmVuZENvbW1hbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBpcGVjbWQgaXMgbm90IE5vbmU6ICMgcmVzdG9yZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5teW91dC5kZWxlZ2F0ZSA9IGRlbGVnYXRlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHBvcGVuMi5Qb3BlbjQoIHBpcGVjbWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlLnRvY2hpbGQud3JpdGUoICJcbiIuam9pbiggc2VsZi5teW91dC5sYXN0QnVmZmVyKCkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUudG9jaGlsZC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIHBpcGUuZnJvbWNoaWxkLnJlYWQoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHByaW50KCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU3RhcnQgZnVuY3Rpb24gLSBjYWxsZWQgZnJvbSB0aGUgQml0QmFrZSBjb21tYW5kIGxpbmUgdXRpbGl0eQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHN0YXJ0KCBhQ29va2VyICk6CisgICAgZ2xvYmFsIGNvb2tlcgorICAgIGNvb2tlciA9IGFDb29rZXIKKyAgICBiYnNoZWxsID0gQml0QmFrZVNoZWxsKCkKKyAgICBiYnNoZWxsLnByb2Nlc3NTdGFydHVwRmlsZSgpCisgICAgYmJzaGVsbC5tYWluKCkKKyAgICBiYnNoZWxsLmNsZWFudXAoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHByaW50KCJTSEVMTDogU29ycnksIHRoaXMgcHJvZ3JhbSBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgQml0QmFrZS4iKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvc2lnZ2VuLnB5IGIvYml0YmFrZS9saWIvYmIvc2lnZ2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODUyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi9zaWdnZW4ucHkKQEAgLTAsMCArMSw1MjYgQEAKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IGJiLmRhdGEKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ0JpdEJha2UuU2lnR2VuJykKKwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKyAgICBsb2dnZXIuaW5mbygnSW1wb3J0aW5nIGNQaWNrbGUgZmFpbGVkLiAgRmFsbGluZyBiYWNrIHRvIGEgdmVyeSBzbG93IGltcGxlbWVudGF0aW9uLicpCisKK2RlZiBpbml0KGQpOgorICAgIHNpZ2dlbnMgPSBbb2JqIGZvciBvYmogaW4gZ2xvYmFscygpLml0ZXJ2YWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUob2JqKSBpcyB0eXBlIGFuZCBpc3N1YmNsYXNzKG9iaiwgU2lnbmF0dXJlR2VuZXJhdG9yKV0KKworICAgIGRlc2lyZWQgPSBkLmdldFZhcigiQkJfU0lHTkFUVVJFX0hBTkRMRVIiLCBUcnVlKSBvciAibm9vcCIKKyAgICBmb3Igc2cgaW4gc2lnZ2VuczoKKyAgICAgICAgaWYgZGVzaXJlZCA9PSBzZy5uYW1lOgorICAgICAgICAgICAgcmV0dXJuIHNnKGQpCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGxvZ2dlci5lcnJvcigiSW52YWxpZCBzaWduYXR1cmUgZ2VuZXJhdG9yICclcycsIHVzaW5nIGRlZmF1bHQgJ25vb3AnXG4iCisgICAgICAgICAgICAgICAgICAgICAiQXZhaWxhYmxlIGdlbmVyYXRvcnM6ICVzIiwgZGVzaXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihvYmoubmFtZSBmb3Igb2JqIGluIHNpZ2dlbnMpKQorICAgICAgICByZXR1cm4gU2lnbmF0dXJlR2VuZXJhdG9yKGQpCisKK2NsYXNzIFNpZ25hdHVyZUdlbmVyYXRvcihvYmplY3QpOgorICAgICIiIgorICAgICIiIgorICAgIG5hbWUgPSAibm9vcCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi50YXNraGFzaCA9IHt9CisgICAgICAgIHNlbGYucnVudGFza2RlcHMgPSB7fQorICAgICAgICBzZWxmLmZpbGVfY2hlY2tzdW1fdmFsdWVzID0ge30KKworICAgIGRlZiBmaW5hbGlzZShzZWxmLCBmbiwgZCwgdmFyaWVudCk6CisgICAgICAgIHJldHVybgorCisgICAgZGVmIGdldF90YXNraGFzaChzZWxmLCBmbiwgdGFzaywgZGVwcywgZGF0YUNhY2hlKToKKyAgICAgICAgcmV0dXJuICIwIgorCisgICAgZGVmIHNldF90YXNrZGF0YShzZWxmLCBoYXNoZXMsIGRlcHMsIGNoZWNrc3VtKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgc3RhbXBmaWxlKHNlbGYsIHN0YW1wYmFzZSwgZmlsZV9uYW1lLCB0YXNrbmFtZSwgZXh0cmFpbmZvKToKKyAgICAgICAgcmV0dXJuICgiJXMuJXMuJXMiICUgKHN0YW1wYmFzZSwgdGFza25hbWUsIGV4dHJhaW5mbykpLnJzdHJpcCgnLicpCisKKyAgICBkZWYgc3RhbXBjbGVhbm1hc2soc2VsZiwgc3RhbXBiYXNlLCBmaWxlX25hbWUsIHRhc2tuYW1lLCBleHRyYWluZm8pOgorICAgICAgICByZXR1cm4gKCIlcy4lcy4lcyIgJSAoc3RhbXBiYXNlLCB0YXNrbmFtZSwgZXh0cmFpbmZvKSkucnN0cmlwKCcuJykKKworICAgIGRlZiBkdW1wX3NpZ3Rhc2soc2VsZiwgZm4sIHRhc2ssIHN0YW1wYmFzZSwgcnVudGltZSk6CisgICAgICAgIHJldHVybgorCisgICAgZGVmIGludmFsaWRhdGVfdGFzayhzZWxmLCB0YXNrLCBkLCBmbik6CisgICAgICAgIGJiLmJ1aWxkLmRlbF9zdGFtcCh0YXNrLCBkLCBmbikKKworICAgIGRlZiBkdW1wX3NpZ3Moc2VsZiwgZGF0YUNhY2hlLCBvcHRpb25zKToKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZ2V0X3Rhc2tkYXRhKHNlbGYpOgorICAgICAgIHJldHVybiAoc2VsZi5ydW50YXNrZGVwcywgc2VsZi50YXNraGFzaCwgc2VsZi5maWxlX2NoZWNrc3VtX3ZhbHVlcykKKworICAgIGRlZiBzZXRfdGFza2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYucnVudGFza2RlcHMsIHNlbGYudGFza2hhc2gsIHNlbGYuZmlsZV9jaGVja3N1bV92YWx1ZXMgPSBkYXRhCisKKworY2xhc3MgU2lnbmF0dXJlR2VuZXJhdG9yQmFzaWMoU2lnbmF0dXJlR2VuZXJhdG9yKToKKyAgICAiIiIKKyAgICAiIiIKKyAgICBuYW1lID0gImJhc2ljIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmJhc2VoYXNoID0ge30KKyAgICAgICAgc2VsZi50YXNraGFzaCA9IHt9CisgICAgICAgIHNlbGYudGFza2RlcHMgPSB7fQorICAgICAgICBzZWxmLnJ1bnRhc2tkZXBzID0ge30KKyAgICAgICAgc2VsZi5maWxlX2NoZWNrc3VtX3ZhbHVlcyA9IHt9CisgICAgICAgIHNlbGYuZ2VuZGVwcyA9IHt9CisgICAgICAgIHNlbGYubG9va3VwY2FjaGUgPSB7fQorICAgICAgICBzZWxmLnBrZ25hbWVleHRyYWN0ID0gcmUuY29tcGlsZSgiKD9QPGZuPi4qKVwuLioiKQorICAgICAgICBzZWxmLmJhc2V3aGl0ZWxpc3QgPSBzZXQoKGRhdGEuZ2V0VmFyKCJCQl9IQVNIQkFTRV9XSElURUxJU1QiLCBUcnVlKSBvciAiIikuc3BsaXQoKSkKKyAgICAgICAgc2VsZi50YXNrd2hpdGVsaXN0ID0gTm9uZQorICAgICAgICBzZWxmLmluaXRfcnVuZGVwY2hlY2soZGF0YSkKKworICAgIGRlZiBpbml0X3J1bmRlcGNoZWNrKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnRhc2t3aGl0ZWxpc3QgPSBkYXRhLmdldFZhcigiQkJfSEFTSFRBU0tfV0hJVEVMSVNUIiwgVHJ1ZSkgb3IgTm9uZQorICAgICAgICBpZiBzZWxmLnRhc2t3aGl0ZWxpc3Q6CisgICAgICAgICAgICBzZWxmLnR3bCA9IHJlLmNvbXBpbGUoc2VsZi50YXNrd2hpdGVsaXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50d2wgPSBOb25lCisKKyAgICBkZWYgX2J1aWxkX2RhdGEoc2VsZiwgZm4sIGQpOgorCisgICAgICAgIHRhc2tsaXN0LCBnZW5kZXBzLCBsb29rdXBjYWNoZSA9IGJiLmRhdGEuZ2VuZXJhdGVfZGVwZW5kZW5jaWVzKGQpCisKKyAgICAgICAgdGFza2RlcHMgPSB7fQorICAgICAgICBiYXNlaGFzaCA9IHt9CisKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza2xpc3Q6CisgICAgICAgICAgICBkYXRhID0gbG9va3VwY2FjaGVbdGFza10KKworICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJiLmVycm9yKCJUYXNrICVzIGZyb20gJXMgc2VlbXMgdG8gYmUgZW1wdHk/ISIgJSAodGFzaywgZm4pKQorICAgICAgICAgICAgICAgIGRhdGEgPSAnJworCisgICAgICAgICAgICBnZW5kZXBzW3Rhc2tdIC09IHNlbGYuYmFzZXdoaXRlbGlzdAorICAgICAgICAgICAgbmV3ZGVwcyA9IGdlbmRlcHNbdGFza10KKyAgICAgICAgICAgIHNlZW4gPSBzZXQoKQorICAgICAgICAgICAgd2hpbGUgbmV3ZGVwczoKKyAgICAgICAgICAgICAgICBuZXh0ZGVwcyA9IG5ld2RlcHMKKyAgICAgICAgICAgICAgICBzZWVuIHw9IG5leHRkZXBzCisgICAgICAgICAgICAgICAgbmV3ZGVwcyA9IHNldCgpCisgICAgICAgICAgICAgICAgZm9yIGRlcCBpbiBuZXh0ZGVwczoKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVwIGluIHNlbGYuYmFzZXdoaXRlbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGdlbmRlcHNbZGVwXSAtPSBzZWxmLmJhc2V3aGl0ZWxpc3QKKyAgICAgICAgICAgICAgICAgICAgbmV3ZGVwcyB8PSBnZW5kZXBzW2RlcF0KKyAgICAgICAgICAgICAgICBuZXdkZXBzIC09IHNlZW4KKworICAgICAgICAgICAgYWxsZGVwcyA9IHNvcnRlZChzZWVuKQorICAgICAgICAgICAgZm9yIGRlcCBpbiBhbGxkZXBzOgorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgZGVwCisgICAgICAgICAgICAgICAgdmFyID0gbG9va3VwY2FjaGVbZGVwXQorICAgICAgICAgICAgICAgIGlmIHZhciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBzdHIodmFyKQorICAgICAgICAgICAgc2VsZi5iYXNlaGFzaFtmbiArICIuIiArIHRhc2tdID0gaGFzaGxpYi5tZDUoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIHRhc2tkZXBzW3Rhc2tdID0gYWxsZGVwcworCisgICAgICAgIHNlbGYudGFza2RlcHNbZm5dID0gdGFza2RlcHMKKyAgICAgICAgc2VsZi5nZW5kZXBzW2ZuXSA9IGdlbmRlcHMKKyAgICAgICAgc2VsZi5sb29rdXBjYWNoZVtmbl0gPSBsb29rdXBjYWNoZQorCisgICAgICAgIHJldHVybiB0YXNrZGVwcworCisgICAgZGVmIGZpbmFsaXNlKHNlbGYsIGZuLCBkLCB2YXJpYW50KToKKworICAgICAgICBpZiB2YXJpYW50OgorICAgICAgICAgICAgZm4gPSAidmlydHVhbDoiICsgdmFyaWFudCArICI6IiArIGZuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFza2RlcHMgPSBzZWxmLl9idWlsZF9kYXRhKGZuLCBkKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBiYi5ub3RlKCJFcnJvciBkdXJpbmcgZmluYWxpc2Ugb2YgJXMiICUgZm4pCisgICAgICAgICAgICByYWlzZQorCisgICAgICAgICNTbG93IGJ1dCBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzbWF0Y2hlZCBiYXNlaGFzaGVzCisgICAgICAgICNmb3IgdGFzayBpbiBzZWxmLnRhc2tkZXBzW2ZuXToKKyAgICAgICAgIyAgICBzZWxmLmR1bXBfc2lndGFzayhmbiwgdGFzaywgZC5nZXRWYXIoIlNUQU1QIiwgVHJ1ZSksIEZhbHNlKQorCisgICAgICAgIGZvciB0YXNrIGluIHRhc2tkZXBzOgorICAgICAgICAgICAgZC5zZXRWYXIoIkJCX0JBU0VIQVNIX3Rhc2stJXMiICUgdGFzaywgc2VsZi5iYXNlaGFzaFtmbiArICIuIiArIHRhc2tdKQorCisgICAgZGVmIHJ1bmRlcF9jaGVjayhzZWxmLCBmbiwgcmVjaXBlbmFtZSwgdGFzaywgZGVwLCBkZXBuYW1lLCBkYXRhQ2FjaGUpOgorICAgICAgICAjIFJldHVybiBUcnVlIGlmIHdlIHNob3VsZCBrZWVwIHRoZSBkZXBlbmRlbmN5LCBGYWxzZSB0byBkcm9wIGl0CisgICAgICAgICMgV2Ugb25seSBtYW5pcHVsYXRlIHRoZSBkZXBlbmRlbmNpZXMgZm9yIHBhY2thZ2VzIG5vdCBpbiB0aGUgd2hpdGVsaXN0CisgICAgICAgIGlmIHNlbGYudHdsIGFuZCBub3Qgc2VsZi50d2wuc2VhcmNoKHJlY2lwZW5hbWUpOgorICAgICAgICAgICAgIyB0aGVuIHByb2Nlc3MgdGhlIGFjdHVhbCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmIHNlbGYudHdsLnNlYXJjaChkZXBuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZWFkX3RhaW50KHNlbGYsIGZuLCB0YXNrLCBzdGFtcGJhc2UpOgorICAgICAgICB0YWludCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHN0YW1wYmFzZSArICcuJyArIHRhc2sgKyAnLnRhaW50JywgJ3InKSBhcyB0YWludGY6CisgICAgICAgICAgICAgICAgdGFpbnQgPSB0YWludGYucmVhZCgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gdGFpbnQKKworICAgIGRlZiBnZXRfdGFza2hhc2goc2VsZiwgZm4sIHRhc2ssIGRlcHMsIGRhdGFDYWNoZSk6CisgICAgICAgIGsgPSBmbiArICIuIiArIHRhc2sKKyAgICAgICAgZGF0YSA9IGRhdGFDYWNoZS5iYXNldGFza2hhc2hba10KKyAgICAgICAgc2VsZi5ydW50YXNrZGVwc1trXSA9IFtdCisgICAgICAgIHNlbGYuZmlsZV9jaGVja3N1bV92YWx1ZXNba10gPSB7fQorICAgICAgICByZWNpcGVuYW1lID0gZGF0YUNhY2hlLnBrZ19mbltmbl0KKyAgICAgICAgZm9yIGRlcCBpbiBzb3J0ZWQoZGVwcywga2V5PWNsZWFuX2Jhc2VwYXRoKToKKyAgICAgICAgICAgIGRlcG5hbWUgPSBkYXRhQ2FjaGUucGtnX2ZuW3NlbGYucGtnbmFtZWV4dHJhY3Quc2VhcmNoKGRlcCkuZ3JvdXAoJ2ZuJyldCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5ydW5kZXBfY2hlY2soZm4sIHJlY2lwZW5hbWUsIHRhc2ssIGRlcCwgZGVwbmFtZSwgZGF0YUNhY2hlKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZGVwIG5vdCBpbiBzZWxmLnRhc2toYXNoOgorICAgICAgICAgICAgICAgIGJiLmZhdGFsKCIlcyBpcyBub3QgaW4gdGFza2hhc2gsIGNhbGxlciBpc24ndCBjYWxsaW5nIGluIGRlcGVuZGVuY3kgb3JkZXI/IiwgZGVwKQorICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBzZWxmLnRhc2toYXNoW2RlcF0KKyAgICAgICAgICAgIHNlbGYucnVudGFza2RlcHNba10uYXBwZW5kKGRlcCkKKworICAgICAgICBpZiB0YXNrIGluIGRhdGFDYWNoZS5maWxlX2NoZWNrc3Vtc1tmbl06CisgICAgICAgICAgICBjaGVja3N1bXMgPSBiYi5mZXRjaDIuZ2V0X2ZpbGVfY2hlY2tzdW1zKGRhdGFDYWNoZS5maWxlX2NoZWNrc3Vtc1tmbl1bdGFza10sIHJlY2lwZW5hbWUpCisgICAgICAgICAgICBmb3IgKGYsY3MpIGluIGNoZWNrc3VtczoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVfY2hlY2tzdW1fdmFsdWVzW2tdW2ZdID0gY3MKKyAgICAgICAgICAgICAgICBpZiBjczoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBjcworCisgICAgICAgIHRhc2tkZXAgPSBkYXRhQ2FjaGUudGFza19kZXBzW2ZuXQorICAgICAgICBpZiAnbm9zdGFtcCcgaW4gdGFza2RlcCBhbmQgdGFzayBpbiB0YXNrZGVwWydub3N0YW1wJ106CisgICAgICAgICAgICAjIE5vc3RhbXAgdGFza3MgbmVlZCBhbiBpbXBsaWNpdCB0YWludCBzbyB0aGF0IHRoZXkgZm9yY2UgYW55IGRlcGVuZGVudCB0YXNrcyB0byBydW4KKyAgICAgICAgICAgIGltcG9ydCB1dWlkCisgICAgICAgICAgICBkYXRhID0gZGF0YSArIHN0cih1dWlkLnV1aWQ0KCkpCisKKyAgICAgICAgdGFpbnQgPSBzZWxmLnJlYWRfdGFpbnQoZm4sIHRhc2ssIGRhdGFDYWNoZS5zdGFtcFtmbl0pCisgICAgICAgIGlmIHRhaW50OgorICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyB0YWludAorICAgICAgICAgICAgbG9nZ2VyLndhcm4oIiVzIGlzIHRhaW50ZWQgZnJvbSBhIGZvcmNlZCBydW4iICUgaykKKworICAgICAgICBoID0gaGFzaGxpYi5tZDUoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi50YXNraGFzaFtrXSA9IGgKKyAgICAgICAgI2Quc2V0VmFyKCJCQl9UQVNLSEFTSF90YXNrLSVzIiAlIHRhc2ssIHRhc2toYXNoW3Rhc2tdKQorICAgICAgICByZXR1cm4gaAorCisgICAgZGVmIGR1bXBfc2lndGFzayhzZWxmLCBmbiwgdGFzaywgc3RhbXBiYXNlLCBydW50aW1lKToKKyAgICAgICAgayA9IGZuICsgIi4iICsgdGFzaworICAgICAgICBpZiBydW50aW1lID09ICJjdXN0b21maWxlIjoKKyAgICAgICAgICAgIHNpZ2ZpbGUgPSBzdGFtcGJhc2UKKyAgICAgICAgZWxpZiBydW50aW1lIGFuZCBrIGluIHNlbGYudGFza2hhc2g6CisgICAgICAgICAgICBzaWdmaWxlID0gc3RhbXBiYXNlICsgIi4iICsgdGFzayArICIuc2lnZGF0YSIgKyAiLiIgKyBzZWxmLnRhc2toYXNoW2tdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWdmaWxlID0gc3RhbXBiYXNlICsgIi4iICsgdGFzayArICIuc2lnYmFzZWRhdGEiICsgIi4iICsgc2VsZi5iYXNlaGFzaFtrXQorCisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoc2lnZmlsZSkpCisKKyAgICAgICAgZGF0YSA9IHt9CisgICAgICAgIGRhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSA9IHNlbGYuYmFzZXdoaXRlbGlzdAorICAgICAgICBkYXRhWyd0YXNrd2hpdGVsaXN0J10gPSBzZWxmLnRhc2t3aGl0ZWxpc3QKKyAgICAgICAgZGF0YVsndGFza2RlcHMnXSA9IHNlbGYudGFza2RlcHNbZm5dW3Rhc2tdCisgICAgICAgIGRhdGFbJ2Jhc2VoYXNoJ10gPSBzZWxmLmJhc2VoYXNoW2tdCisgICAgICAgIGRhdGFbJ2dlbmRlcHMnXSA9IHt9CisgICAgICAgIGRhdGFbJ3ZhcnZhbHMnXSA9IHt9CisgICAgICAgIGRhdGFbJ3ZhcnZhbHMnXVt0YXNrXSA9IHNlbGYubG9va3VwY2FjaGVbZm5dW3Rhc2tdCisgICAgICAgIGZvciBkZXAgaW4gc2VsZi50YXNrZGVwc1tmbl1bdGFza106CisgICAgICAgICAgICBpZiBkZXAgaW4gc2VsZi5iYXNld2hpdGVsaXN0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkYXRhWydnZW5kZXBzJ11bZGVwXSA9IHNlbGYuZ2VuZGVwc1tmbl1bZGVwXQorICAgICAgICAgICAgZGF0YVsndmFydmFscyddW2RlcF0gPSBzZWxmLmxvb2t1cGNhY2hlW2ZuXVtkZXBdCisKKyAgICAgICAgaWYgcnVudGltZSBhbmQgayBpbiBzZWxmLnRhc2toYXNoOgorICAgICAgICAgICAgZGF0YVsncnVudGFza2RlcHMnXSA9IHNlbGYucnVudGFza2RlcHNba10KKyAgICAgICAgICAgIGRhdGFbJ2ZpbGVfY2hlY2tzdW1fdmFsdWVzJ10gPSBbKG9zLnBhdGguYmFzZW5hbWUoZiksIGNzKSBmb3IgZixjcyBpbiBzZWxmLmZpbGVfY2hlY2tzdW1fdmFsdWVzW2tdLml0ZW1zKCldCisgICAgICAgICAgICBkYXRhWydydW50YXNraGFzaGVzJ10gPSB7fQorICAgICAgICAgICAgZm9yIGRlcCBpbiBkYXRhWydydW50YXNrZGVwcyddOgorICAgICAgICAgICAgICAgIGRhdGFbJ3J1bnRhc2toYXNoZXMnXVtkZXBdID0gc2VsZi50YXNraGFzaFtkZXBdCisKKyAgICAgICAgdGFpbnQgPSBzZWxmLnJlYWRfdGFpbnQoZm4sIHRhc2ssIHN0YW1wYmFzZSkKKyAgICAgICAgaWYgdGFpbnQ6CisgICAgICAgICAgICBkYXRhWyd0YWludCddID0gdGFpbnQKKworICAgICAgICBmZCwgdG1wZmlsZSA9IHRlbXBmaWxlLm1rc3RlbXAoZGlyPW9zLnBhdGguZGlybmFtZShzaWdmaWxlKSwgcHJlZml4PSJzaWd0YXNrLiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3MuZmRvcGVuKGZkLCAid2IiKSBhcyBzdHJlYW06CisgICAgICAgICAgICAgICAgcCA9IHBpY2tsZS5kdW1wKGRhdGEsIHN0cmVhbSwgLTEpCisgICAgICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKKyAgICAgICAgICAgIG9zLmNobW9kKHRtcGZpbGUsIDA2NjQpCisgICAgICAgICAgICBvcy5yZW5hbWUodG1wZmlsZSwgc2lnZmlsZSkKKyAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKSBhcyBlcnI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHRtcGZpbGUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByYWlzZSBlcnIKKworICAgIGRlZiBkdW1wX3NpZ3Moc2VsZiwgZGF0YUNhY2hlLCBvcHRpb25zKToKKyAgICAgICAgZm9yIGZuIGluIHNlbGYudGFza2RlcHM6CisgICAgICAgICAgICBmb3IgdGFzayBpbiBzZWxmLnRhc2tkZXBzW2ZuXToKKyAgICAgICAgICAgICAgICBrID0gZm4gKyAiLiIgKyB0YXNrCisgICAgICAgICAgICAgICAgaWYgayBub3QgaW4gc2VsZi50YXNraGFzaDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBkYXRhQ2FjaGUuYmFzZXRhc2toYXNoW2tdICE9IHNlbGYuYmFzZWhhc2hba106CisgICAgICAgICAgICAgICAgICAgIGJiLmVycm9yKCJCaXRiYWtlJ3MgY2FjaGVkIGJhc2VoYXNoIGRvZXMgbm90IG1hdGNoIHRoZSBvbmUgd2UganVzdCBnZW5lcmF0ZWQgKCVzKSEiICUgaykKKyAgICAgICAgICAgICAgICAgICAgYmIuZXJyb3IoIlRoZSBtaXNtYXRjaGVkIGhhc2hlcyB3ZXJlICVzIGFuZCAlcyIgJSAoZGF0YUNhY2hlLmJhc2V0YXNraGFzaFtrXSwgc2VsZi5iYXNlaGFzaFtrXSkpCisgICAgICAgICAgICAgICAgc2VsZi5kdW1wX3NpZ3Rhc2soZm4sIHRhc2ssIGRhdGFDYWNoZS5zdGFtcFtmbl0sIFRydWUpCisKK2NsYXNzIFNpZ25hdHVyZUdlbmVyYXRvckJhc2ljSGFzaChTaWduYXR1cmVHZW5lcmF0b3JCYXNpYyk6CisgICAgbmFtZSA9ICJiYXNpY2hhc2giCisKKyAgICBkZWYgc3RhbXBmaWxlKHNlbGYsIHN0YW1wYmFzZSwgZm4sIHRhc2tuYW1lLCBleHRyYWluZm8sIGNsZWFuPUZhbHNlKToKKyAgICAgICAgaWYgdGFza25hbWUgIT0gImRvX3NldHNjZW5lIiBhbmQgdGFza25hbWUuZW5kc3dpdGgoIl9zZXRzY2VuZSIpOgorICAgICAgICAgICAgayA9IGZuICsgIi4iICsgdGFza25hbWVbOi05XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgayA9IGZuICsgIi4iICsgdGFza25hbWUKKyAgICAgICAgaWYgY2xlYW46CisgICAgICAgICAgICBoID0gIioiCisgICAgICAgIGVsaWYgayBpbiBzZWxmLnRhc2toYXNoOgorICAgICAgICAgICAgaCA9IHNlbGYudGFza2hhc2hba10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSWYgayBpcyBub3QgaW4gYmFzZWhhc2gsIHRoZW4gZXJyb3IKKyAgICAgICAgICAgIGggPSBzZWxmLmJhc2VoYXNoW2tdCisgICAgICAgIHJldHVybiAoIiVzLiVzLiVzLiVzIiAlIChzdGFtcGJhc2UsIHRhc2tuYW1lLCBoLCBleHRyYWluZm8pKS5yc3RyaXAoJy4nKQorCisgICAgZGVmIHN0YW1wY2xlYW5tYXNrKHNlbGYsIHN0YW1wYmFzZSwgZm4sIHRhc2tuYW1lLCBleHRyYWluZm8pOgorICAgICAgICByZXR1cm4gc2VsZi5zdGFtcGZpbGUoc3RhbXBiYXNlLCBmbiwgdGFza25hbWUsIGV4dHJhaW5mbywgY2xlYW49VHJ1ZSkKKyAgICAgICAgCisgICAgZGVmIGludmFsaWRhdGVfdGFzayhzZWxmLCB0YXNrLCBkLCBmbik6CisgICAgICAgIGJiLm5vdGUoIlRhaW50aW5nIGhhc2ggdG8gZm9yY2UgcmVidWlsZCBvZiB0YXNrICVzLCAlcyIgJSAoZm4sIHRhc2spKQorICAgICAgICBiYi5idWlsZC53cml0ZV90YWludCh0YXNrLCBkLCBmbikKKworZGVmIGR1bXBfdGhpc190YXNrKG91dGZpbGUsIGQpOgorICAgIGltcG9ydCBiYi5wYXJzZQorICAgIGZuID0gZC5nZXRWYXIoIkJCX0ZJTEVOQU1FIiwgVHJ1ZSkKKyAgICB0YXNrID0gImRvXyIgKyBkLmdldFZhcigiQkJfQ1VSUkVOVFRBU0siLCBUcnVlKQorICAgIGJiLnBhcnNlLnNpZ2dlbi5kdW1wX3NpZ3Rhc2soZm4sIHRhc2ssIG91dGZpbGUsICJjdXN0b21maWxlIikKKworZGVmIGNsZWFuX2Jhc2VwYXRoKGEpOgorICAgIGIgPSBhLnJzcGxpdCgiLyIsIDIpWzFdICsgYS5yc3BsaXQoIi8iLCAyKVsyXQorICAgIGlmIGEuc3RhcnRzd2l0aCgidmlydHVhbDoiKToKKyAgICAgICAgYiA9IGIgKyAiOiIgKyBhLnJzcGxpdCgiOiIsIDEpWzBdCisgICAgcmV0dXJuIGIKKworZGVmIGNsZWFuX2Jhc2VwYXRocyhhKToKKyAgICBiID0ge30KKyAgICBmb3IgeCBpbiBhOgorICAgICAgICBiW2NsZWFuX2Jhc2VwYXRoKHgpXSA9IGFbeF0KKyAgICByZXR1cm4gYgorCitkZWYgY2xlYW5fYmFzZXBhdGhzX2xpc3QoYSk6CisgICAgYiA9IFtdCisgICAgZm9yIHggaW4gYToKKyAgICAgICAgYi5hcHBlbmQoY2xlYW5fYmFzZXBhdGgoeCkpCisgICAgcmV0dXJuIGIKKworZGVmIGNvbXBhcmVfc2lnZmlsZXMoYSwgYiwgcmVjdXJzZWNiID0gTm9uZSk6CisgICAgb3V0cHV0ID0gW10KKworICAgIHAxID0gcGlja2xlLlVucGlja2xlcihvcGVuKGEsICJyYiIpKQorICAgIGFfZGF0YSA9IHAxLmxvYWQoKQorICAgIHAyID0gcGlja2xlLlVucGlja2xlcihvcGVuKGIsICJyYiIpKQorICAgIGJfZGF0YSA9IHAyLmxvYWQoKQorCisgICAgZGVmIGRpY3RfZGlmZihhLCBiLCB3aGl0ZWxpc3Q9c2V0KCkpOgorICAgICAgICBzYSA9IHNldChhLmtleXMoKSkKKyAgICAgICAgc2IgPSBzZXQoYi5rZXlzKCkpCisgICAgICAgIGNvbW1vbiA9IHNhICYgc2IKKyAgICAgICAgY2hhbmdlZCA9IHNldCgpCisgICAgICAgIGZvciBpIGluIGNvbW1vbjoKKyAgICAgICAgICAgIGlmIGFbaV0gIT0gYltpXSBhbmQgaSBub3QgaW4gd2hpdGVsaXN0OgorICAgICAgICAgICAgICAgIGNoYW5nZWQuYWRkKGkpCisgICAgICAgIGFkZGVkID0gc2IgLSBzYQorICAgICAgICByZW1vdmVkID0gc2EgLSBzYgorICAgICAgICByZXR1cm4gY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQKKworICAgIGRlZiBmaWxlX2NoZWNrc3Vtc19kaWZmKGEsIGIpOgorICAgICAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyCisgICAgICAgICMgSGFuZGxlIG9sZCBzaWdpbmZvIGZvcm1hdAorICAgICAgICBpZiBpc2luc3RhbmNlKGEsIGRpY3QpOgorICAgICAgICAgICAgYSA9IFsob3MucGF0aC5iYXNlbmFtZShmKSwgY3MpIGZvciBmLCBjcyBpbiBhLml0ZW1zKCldCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgZGljdCk6CisgICAgICAgICAgICBiID0gWyhvcy5wYXRoLmJhc2VuYW1lKGYpLCBjcykgZm9yIGYsIGNzIGluIGIuaXRlbXMoKV0KKyAgICAgICAgIyBDb21wYXJlIGxpc3RzLCBlbnN1cmluZyB3ZSBjYW4gaGFuZGxlIGR1cGxpY2F0ZSBmaWxlbmFtZXMgaWYgdGhleSBleGlzdAorICAgICAgICByZW1vdmVkY291bnQgPSBDb3VudGVyKGEpCisgICAgICAgIHJlbW92ZWRjb3VudC5zdWJ0cmFjdChiKQorICAgICAgICBhZGRlZGNvdW50ID0gQ291bnRlcihiKQorICAgICAgICBhZGRlZGNvdW50LnN1YnRyYWN0KGEpCisgICAgICAgIGFkZGVkID0gW10KKyAgICAgICAgZm9yIHggaW4gYjoKKyAgICAgICAgICAgIGlmIGFkZGVkY291bnRbeF0gPiAwOgorICAgICAgICAgICAgICAgIGFkZGVkY291bnRbeF0gLT0gMQorICAgICAgICAgICAgICAgIGFkZGVkLmFwcGVuZCh4KQorICAgICAgICByZW1vdmVkID0gW10KKyAgICAgICAgY2hhbmdlZCA9IFtdCisgICAgICAgIGZvciB4IGluIGE6CisgICAgICAgICAgICBpZiByZW1vdmVkY291bnRbeF0gPiAwOgorICAgICAgICAgICAgICAgIHJlbW92ZWRjb3VudFt4XSAtPSAxCisgICAgICAgICAgICAgICAgZm9yIHkgaW4gYWRkZWQ6CisgICAgICAgICAgICAgICAgICAgIGlmIHlbMF0gPT0geFswXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQuYXBwZW5kKCh4WzBdLCB4WzFdLCB5WzFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLnJlbW92ZSh5KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZW1vdmVkLmFwcGVuZCh4KQorICAgICAgICBhZGRlZCA9IFt4WzBdIGZvciB4IGluIGFkZGVkXQorICAgICAgICByZW1vdmVkID0gW3hbMF0gZm9yIHggaW4gcmVtb3ZlZF0KKyAgICAgICAgcmV0dXJuIGNoYW5nZWQsIGFkZGVkLCByZW1vdmVkCisKKyAgICBpZiAnYmFzZXdoaXRlbGlzdCcgaW4gYV9kYXRhIGFuZCBhX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSAhPSBiX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiYmFzZXdoaXRlbGlzdCBjaGFuZ2VkIGZyb20gJyVzJyB0byAnJXMnIiAlIChhX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSwgYl9kYXRhWydiYXNld2hpdGVsaXN0J10pKQorICAgICAgICBpZiBhX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSBhbmQgYl9kYXRhWydiYXNld2hpdGVsaXN0J106CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJjaGFuZ2VkIGl0ZW1zOiAlcyIgJSBhX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXS5zeW1tZXRyaWNfZGlmZmVyZW5jZShiX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSkpCisKKyAgICBpZiAndGFza3doaXRlbGlzdCcgaW4gYV9kYXRhIGFuZCBhX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSAhPSBiX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgidGFza3doaXRlbGlzdCBjaGFuZ2VkIGZyb20gJyVzJyB0byAnJXMnIiAlIChhX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSwgYl9kYXRhWyd0YXNrd2hpdGVsaXN0J10pKQorICAgICAgICBpZiBhX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSBhbmQgYl9kYXRhWyd0YXNrd2hpdGVsaXN0J106CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJjaGFuZ2VkIGl0ZW1zOiAlcyIgJSBhX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXS5zeW1tZXRyaWNfZGlmZmVyZW5jZShiX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSkpCisKKyAgICBpZiBhX2RhdGFbJ3Rhc2tkZXBzJ10gIT0gYl9kYXRhWyd0YXNrZGVwcyddOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJUYXNrIGRlcGVuZGVuY2llcyBjaGFuZ2VkIGZyb206XG4lc1xudG86XG4lcyIgJSAoc29ydGVkKGFfZGF0YVsndGFza2RlcHMnXSksIHNvcnRlZChiX2RhdGFbJ3Rhc2tkZXBzJ10pKSkKKworICAgIGlmIGFfZGF0YVsnYmFzZWhhc2gnXSAhPSBiX2RhdGFbJ2Jhc2VoYXNoJ106CisgICAgICAgIG91dHB1dC5hcHBlbmQoImJhc2VoYXNoIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIgJSAoYV9kYXRhWydiYXNlaGFzaCddLCBiX2RhdGFbJ2Jhc2VoYXNoJ10pKQorCisgICAgY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQgPSBkaWN0X2RpZmYoYV9kYXRhWydnZW5kZXBzJ10sIGJfZGF0YVsnZ2VuZGVwcyddLCBhX2RhdGFbJ2Jhc2V3aGl0ZWxpc3QnXSAmIGJfZGF0YVsnYmFzZXdoaXRlbGlzdCddKQorICAgIGlmIGNoYW5nZWQ6CisgICAgICAgIGZvciBkZXAgaW4gY2hhbmdlZDoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciB2YXJpYWJsZSAlcyBjaGFuZ2VkIGZyb20gJyVzJyB0byAnJXMnIiAlIChkZXAsIGFfZGF0YVsnZ2VuZGVwcyddW2RlcF0sIGJfZGF0YVsnZ2VuZGVwcyddW2RlcF0pKQorICAgICAgICAgICAgaWYgYV9kYXRhWydnZW5kZXBzJ11bZGVwXSBhbmQgYl9kYXRhWydnZW5kZXBzJ11bZGVwXToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJjaGFuZ2VkIGl0ZW1zOiAlcyIgJSBhX2RhdGFbJ2dlbmRlcHMnXVtkZXBdLnN5bW1ldHJpY19kaWZmZXJlbmNlKGJfZGF0YVsnZ2VuZGVwcyddW2RlcF0pKQorICAgIGlmIGFkZGVkOgorICAgICAgICBmb3IgZGVwIGluIGFkZGVkOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiRGVwZW5kZW5jeSBvbiB2YXJpYWJsZSAlcyB3YXMgYWRkZWQiICUgKGRlcCkpCisgICAgaWYgcmVtb3ZlZDoKKyAgICAgICAgZm9yIGRlcCBpbiByZW1vdmVkOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiRGVwZW5kZW5jeSBvbiBWYXJpYWJsZSAlcyB3YXMgcmVtb3ZlZCIgJSAoZGVwKSkKKworCisgICAgY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQgPSBkaWN0X2RpZmYoYV9kYXRhWyd2YXJ2YWxzJ10sIGJfZGF0YVsndmFydmFscyddKQorICAgIGlmIGNoYW5nZWQ6CisgICAgICAgIGZvciBkZXAgaW4gY2hhbmdlZDoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlZhcmlhYmxlICVzIHZhbHVlIGNoYW5nZWQgZnJvbSAnJXMnIHRvICclcyciICUgKGRlcCwgYV9kYXRhWyd2YXJ2YWxzJ11bZGVwXSwgYl9kYXRhWyd2YXJ2YWxzJ11bZGVwXSkpCisKKyAgICBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCA9IGZpbGVfY2hlY2tzdW1zX2RpZmYoYV9kYXRhWydmaWxlX2NoZWNrc3VtX3ZhbHVlcyddLCBiX2RhdGFbJ2ZpbGVfY2hlY2tzdW1fdmFsdWVzJ10pCisgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgZm9yIGYsIG9sZCwgbmV3IGluIGNoYW5nZWQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJDaGVja3N1bSBmb3IgZmlsZSAlcyBjaGFuZ2VkIGZyb20gJXMgdG8gJXMiICUgKGYsIG9sZCwgbmV3KSkKKyAgICBpZiBhZGRlZDoKKyAgICAgICAgZm9yIGYgaW4gYWRkZWQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIGNoZWNrc3VtIG9mIGZpbGUgJXMgd2FzIGFkZGVkIiAlIChmKSkKKyAgICBpZiByZW1vdmVkOgorICAgICAgICBmb3IgZiBpbiByZW1vdmVkOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiRGVwZW5kZW5jeSBvbiBjaGVja3N1bSBvZiBmaWxlICVzIHdhcyByZW1vdmVkIiAlIChmKSkKKworCisgICAgaWYgbGVuKGFfZGF0YVsncnVudGFza2RlcHMnXSkgIT0gbGVuKGJfZGF0YVsncnVudGFza2RlcHMnXSk6CisgICAgICAgIGNoYW5nZWQgPSBbIk51bWJlciBvZiB0YXNrIGRlcGVuZGVuY2llcyBjaGFuZ2VkIl0KKyAgICBlbHNlOgorICAgICAgICBjaGFuZ2VkID0gW10KKyAgICAgICAgZm9yIGlkeCwgdGFzayBpbiBlbnVtZXJhdGUoYV9kYXRhWydydW50YXNrZGVwcyddKToKKyAgICAgICAgICAgIGEgPSBhX2RhdGFbJ3J1bnRhc2tkZXBzJ11baWR4XQorICAgICAgICAgICAgYiA9IGJfZGF0YVsncnVudGFza2RlcHMnXVtpZHhdCisgICAgICAgICAgICBpZiBhX2RhdGFbJ3J1bnRhc2toYXNoZXMnXVthXSAhPSBiX2RhdGFbJ3J1bnRhc2toYXNoZXMnXVtiXToKKyAgICAgICAgICAgICAgICBjaGFuZ2VkLmFwcGVuZCgiJXMgd2l0aCBoYXNoICVzXG4gY2hhbmdlZCB0b1xuJXMgd2l0aCBoYXNoICVzIiAlIChhLCBhX2RhdGFbJ3J1bnRhc2toYXNoZXMnXVthXSwgYiwgYl9kYXRhWydydW50YXNraGFzaGVzJ11bYl0pKQorCisgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgicnVudGFza2RlcHMgY2hhbmdlZCBmcm9tICVzIHRvICVzIiAlIChjbGVhbl9iYXNlcGF0aHNfbGlzdChhX2RhdGFbJ3J1bnRhc2tkZXBzJ10pLCBjbGVhbl9iYXNlcGF0aHNfbGlzdChiX2RhdGFbJ3J1bnRhc2tkZXBzJ10pKSkKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiXG4iLmpvaW4oY2hhbmdlZCkpCisKKworICAgIGlmICdydW50YXNraGFzaGVzJyBpbiBhX2RhdGEgYW5kICdydW50YXNraGFzaGVzJyBpbiBiX2RhdGE6CisgICAgICAgIGEgPSBhX2RhdGFbJ3J1bnRhc2toYXNoZXMnXQorICAgICAgICBiID0gYl9kYXRhWydydW50YXNraGFzaGVzJ10KKyAgICAgICAgY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQgPSBkaWN0X2RpZmYoYSwgYikKKyAgICAgICAgaWYgYWRkZWQ6CisgICAgICAgICAgICBmb3IgZGVwIGluIGFkZGVkOgorICAgICAgICAgICAgICAgIGJkZXBfZm91bmQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHJlbW92ZWQ6CisgICAgICAgICAgICAgICAgICAgIGZvciBiZGVwIGluIHJlbW92ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiW2RlcF0gPT0gYVtiZGVwXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb3V0cHV0LmFwcGVuZCgiRGVwZW5kZW5jeSBvbiB0YXNrICVzIHdhcyByZXBsYWNlZCBieSAlcyB3aXRoIHNhbWUgaGFzaCIgJSAoZGVwLCBiZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGVwX2ZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBiZGVwX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIHRhc2sgJXMgd2FzIGFkZGVkIHdpdGggaGFzaCAlcyIgJSAoY2xlYW5fYmFzZXBhdGgoZGVwKSwgYltkZXBdKSkKKyAgICAgICAgaWYgcmVtb3ZlZDoKKyAgICAgICAgICAgIGZvciBkZXAgaW4gcmVtb3ZlZDoKKyAgICAgICAgICAgICAgICBhZGVwX2ZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBhZGRlZDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGFkZXAgaW4gYWRkZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBiW2FkZXBdID09IGFbZGVwXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjb3V0cHV0LmFwcGVuZCgiRGVwZW5kZW5jeSBvbiB0YXNrICVzIHdhcyByZXBsYWNlZCBieSAlcyB3aXRoIHNhbWUgaGFzaCIgJSAoYWRlcCwgZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGVwX2ZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBhZGVwX2ZvdW5kOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJEZXBlbmRlbmN5IG9uIHRhc2sgJXMgd2FzIHJlbW92ZWQgd2l0aCBoYXNoICVzIiAlIChjbGVhbl9iYXNlcGF0aChkZXApLCBhW2RlcF0pKQorICAgICAgICBpZiBjaGFuZ2VkOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBjaGFuZ2VkOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIkhhc2ggZm9yIGRlcGVuZGVudCB0YXNrICVzIGNoYW5nZWQgZnJvbSAlcyB0byAlcyIgJSAoY2xlYW5fYmFzZXBhdGgoZGVwKSwgYVtkZXBdLCBiW2RlcF0pKQorICAgICAgICAgICAgICAgIGlmIGNhbGxhYmxlKHJlY3Vyc2VjYik6CisgICAgICAgICAgICAgICAgICAgICMgSWYgYSBkZXBlbmRlbnQgaGFzaCBjaGFuZ2VkLCBtaWdodCBhcyB3ZWxsIHByaW50IHRoZSBsaW5lIGFib3ZlIGFuZCB0aGVuIGRlZmVyIHRvIHRoZSBjaGFuZ2VzIGluIAorICAgICAgICAgICAgICAgICAgICAjIHRoYXQgaGFzaCBzaW5jZSBpbiBhbGwgbGlrZWx5aG9vZCwgdGhleSdyZSB0aGUgc2FtZSBjaGFuZ2VzIHRoaXMgdGFzayBhbHNvIHNhdy4KKyAgICAgICAgICAgICAgICAgICAgcmVjb3V0ID0gcmVjdXJzZWNiKGRlcCwgYVtkZXBdLCBiW2RlcF0pCisgICAgICAgICAgICAgICAgICAgIGlmIHJlY291dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IFtvdXRwdXRbLTFdXSArIHJlY291dAorCisgICAgYV90YWludCA9IGFfZGF0YS5nZXQoJ3RhaW50JywgTm9uZSkKKyAgICBiX3RhaW50ID0gYl9kYXRhLmdldCgndGFpbnQnLCBOb25lKQorICAgIGlmIGFfdGFpbnQgIT0gYl90YWludDoKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiVGFpbnQgKGJ5IGZvcmNlZC9pbnZhbGlkYXRlZCB0YXNrKSBjaGFuZ2VkIGZyb20gJXMgdG8gJXMiICUgKGFfdGFpbnQsIGJfdGFpbnQpKQorCisgICAgcmV0dXJuIG91dHB1dAorCisKK2RlZiBkdW1wX3NpZ2ZpbGUoYSk6CisgICAgb3V0cHV0ID0gW10KKworICAgIHAxID0gcGlja2xlLlVucGlja2xlcihvcGVuKGEsICJyYiIpKQorICAgIGFfZGF0YSA9IHAxLmxvYWQoKQorCisgICAgb3V0cHV0LmFwcGVuZCgiYmFzZXdoaXRlbGlzdDogJXMiICUgKGFfZGF0YVsnYmFzZXdoaXRlbGlzdCddKSkKKworICAgIG91dHB1dC5hcHBlbmQoInRhc2t3aGl0ZWxpc3Q6ICVzIiAlIChhX2RhdGFbJ3Rhc2t3aGl0ZWxpc3QnXSkpCisKKyAgICBvdXRwdXQuYXBwZW5kKCJUYXNrIGRlcGVuZGVuY2llczogJXMiICUgKHNvcnRlZChhX2RhdGFbJ3Rhc2tkZXBzJ10pKSkKKworICAgIG91dHB1dC5hcHBlbmQoImJhc2VoYXNoOiAlcyIgJSAoYV9kYXRhWydiYXNlaGFzaCddKSkKKworICAgIGZvciBkZXAgaW4gYV9kYXRhWydnZW5kZXBzJ106CisgICAgICAgIG91dHB1dC5hcHBlbmQoIkxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciB2YXJpYWJsZSAlcyBpcyAlcyIgJSAoZGVwLCBhX2RhdGFbJ2dlbmRlcHMnXVtkZXBdKSkKKworICAgIGZvciBkZXAgaW4gYV9kYXRhWyd2YXJ2YWxzJ106CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlZhcmlhYmxlICVzIHZhbHVlIGlzICVzIiAlIChkZXAsIGFfZGF0YVsndmFydmFscyddW2RlcF0pKQorCisgICAgaWYgJ3J1bnRhc2tkZXBzJyBpbiBhX2RhdGE6CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlRhc2tzIHRoaXMgdGFzayBkZXBlbmRzIG9uOiAlcyIgJSAoYV9kYXRhWydydW50YXNrZGVwcyddKSkKKworICAgIGlmICdmaWxlX2NoZWNrc3VtX3ZhbHVlcycgaW4gYV9kYXRhOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJUaGlzIHRhc2sgZGVwZW5kcyBvbiB0aGUgY2hlY2tzdW1zIG9mIGZpbGVzOiAlcyIgJSAoYV9kYXRhWydmaWxlX2NoZWNrc3VtX3ZhbHVlcyddKSkKKworICAgIGlmICdydW50YXNraGFzaGVzJyBpbiBhX2RhdGE6CisgICAgICAgIGZvciBkZXAgaW4gYV9kYXRhWydydW50YXNraGFzaGVzJ106CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJIYXNoIGZvciBkZXBlbmRlbnQgdGFzayAlcyBpcyAlcyIgJSAoZGVwLCBhX2RhdGFbJ3J1bnRhc2toYXNoZXMnXVtkZXBdKSkKKworICAgIGlmICd0YWludCcgaW4gYV9kYXRhOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCJUYWludGVkIChieSBmb3JjZWQvaW52YWxpZGF0ZWQgdGFzayk6ICVzIiAlIGFfZGF0YVsndGFpbnQnXSkKKworICAgIGRhdGEgPSBhX2RhdGFbJ2Jhc2VoYXNoJ10KKyAgICBmb3IgZGVwIGluIGFfZGF0YVsncnVudGFza2RlcHMnXToKKyAgICAgICAgZGF0YSA9IGRhdGEgKyBhX2RhdGFbJ3J1bnRhc2toYXNoZXMnXVtkZXBdCisKKyAgICBmb3IgYyBpbiBhX2RhdGFbJ2ZpbGVfY2hlY2tzdW1fdmFsdWVzJ106CisgICAgICAgIGRhdGEgPSBkYXRhICsgY1sxXQorCisgICAgaWYgJ3RhaW50JyBpbiBhX2RhdGE6CisgICAgICAgIGRhdGEgPSBkYXRhICsgYV9kYXRhWyd0YWludCddCisKKyAgICBoID0gaGFzaGxpYi5tZDUoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICBvdXRwdXQuYXBwZW5kKCJDb21wdXRlZCBIYXNoIGlzICVzIiAlIGgpCisKKyAgICByZXR1cm4gb3V0cHV0CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi90YXNrZGF0YS5weSBiL2JpdGJha2UvbGliL2JiL3Rhc2tkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYWI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90YXNrZGF0YS5weQpAQCAtMCwwICsxLDY1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIiIiCitCaXRCYWtlICdUYXNrRGF0YScgaW1wbGVtZW50YXRpb24KKworVGFzayBkYXRhIGNvbGxlY3Rpb24gYW5kIGhhbmRsaW5nCisKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwNiAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgcmUKK2ltcG9ydCBiYgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5UYXNrRGF0YSIpCisKK2RlZiByZV9tYXRjaF9zdHJpbmdzKHRhcmdldCwgc3RyaW5ncyk6CisgICAgIiIiCisgICAgV2hldGhlciBvciBub3QgdGhlIHN0cmluZyAndGFyZ2V0JyBtYXRjaGVzCisgICAgYW55IG9uZSBzdHJpbmcgb2YgdGhlIHN0cmluZ3Mgd2hpY2ggY2FuIGJlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICAiIiIKKyAgICByZXR1cm4gYW55KG5hbWUgPT0gdGFyZ2V0IG9yIHJlLm1hdGNoKG5hbWUsIHRhcmdldCkKKyAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHN0cmluZ3MpCisKK2NsYXNzIFRhc2tEYXRhOgorICAgICIiIgorICAgIEJpdEJha2UgVGFzayBEYXRhIGltcGxlbWVudGF0aW9uCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFib3J0ID0gVHJ1ZSwgdHJ5YWx0Y29uZmlncyA9IEZhbHNlLCBza2lwbGlzdCA9IE5vbmUsIGFsbG93aW5jb21wbGV0ZSA9IEZhbHNlKToKKyAgICAgICAgc2VsZi5idWlsZF9uYW1lc19pbmRleCA9IFtdCisgICAgICAgIHNlbGYucnVuX25hbWVzX2luZGV4ID0gW10KKyAgICAgICAgc2VsZi5mbl9pbmRleCA9IFtdCisKKyAgICAgICAgc2VsZi5idWlsZF90YXJnZXRzID0ge30KKyAgICAgICAgc2VsZi5ydW5fdGFyZ2V0cyA9IHt9CisKKyAgICAgICAgc2VsZi5leHRlcm5hbF90YXJnZXRzID0gW10KKworICAgICAgICBzZWxmLnRhc2tzX2ZuaWQgPSBbXQorICAgICAgICBzZWxmLnRhc2tzX25hbWUgPSBbXQorICAgICAgICBzZWxmLnRhc2tzX3RkZXBlbmRzID0gW10KKyAgICAgICAgc2VsZi50YXNrc19pZGVwZW5kcyA9IFtdCisgICAgICAgIHNlbGYudGFza3NfaXJkZXBlbmRzID0gW10KKyAgICAgICAgIyBDYWNoZSB0byBzcGVlZCB1cCB0YXNrIElEIGxvb2t1cHMKKyAgICAgICAgc2VsZi50YXNrc19sb29rdXAgPSB7fQorCisgICAgICAgIHNlbGYuZGVwaWRzID0ge30KKyAgICAgICAgc2VsZi5yZGVwaWRzID0ge30KKworICAgICAgICBzZWxmLmNvbnNpZGVyX21zZ3NfY2FjaGUgPSBbXQorCisgICAgICAgIHNlbGYuZmFpbGVkX2RlcHMgPSBbXQorICAgICAgICBzZWxmLmZhaWxlZF9yZGVwcyA9IFtdCisgICAgICAgIHNlbGYuZmFpbGVkX2ZuaWRzID0gW10KKworICAgICAgICBzZWxmLmFib3J0ID0gYWJvcnQKKyAgICAgICAgc2VsZi50cnlhbHRjb25maWdzID0gdHJ5YWx0Y29uZmlncworICAgICAgICBzZWxmLmFsbG93aW5jb21wbGV0ZSA9IGFsbG93aW5jb21wbGV0ZQorCisgICAgICAgIHNlbGYuc2tpcGxpc3QgPSBza2lwbGlzdAorCisgICAgZGVmIGdldGJ1aWxkX2lkKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIElEIG51bWJlciBmb3IgdGhlIGJ1aWxkIHRhcmdldCBuYW1lLgorICAgICAgICBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi5idWlsZF9uYW1lc19pbmRleDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfbmFtZXNfaW5kZXguYXBwZW5kKG5hbWUpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuYnVpbGRfbmFtZXNfaW5kZXgpIC0gMQorCisgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX25hbWVzX2luZGV4LmluZGV4KG5hbWUpCisKKyAgICBkZWYgZ2V0cnVuX2lkKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIElEIG51bWJlciBmb3IgdGhlIHJ1biB0YXJnZXQgbmFtZS4KKyAgICAgICAgSWYgaXQgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBuYW1lIGluIHNlbGYucnVuX25hbWVzX2luZGV4OgorICAgICAgICAgICAgc2VsZi5ydW5fbmFtZXNfaW5kZXguYXBwZW5kKG5hbWUpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYucnVuX25hbWVzX2luZGV4KSAtIDEKKworICAgICAgICByZXR1cm4gc2VsZi5ydW5fbmFtZXNfaW5kZXguaW5kZXgobmFtZSkKKworICAgIGRlZiBnZXRmbl9pZChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhbiBJRCBudW1iZXIgZm9yIHRoZSBmaWxlbmFtZS4KKyAgICAgICAgSWYgaXQgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBuYW1lIGluIHNlbGYuZm5faW5kZXg6CisgICAgICAgICAgICBzZWxmLmZuX2luZGV4LmFwcGVuZChuYW1lKQorICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLmZuX2luZGV4KSAtIDEKKworICAgICAgICByZXR1cm4gc2VsZi5mbl9pbmRleC5pbmRleChuYW1lKQorCisgICAgZGVmIGdldHRhc2tfaWRzKHNlbGYsIGZuaWQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBJRCBudW1iZXJzIG1hdGNoaW5nIGEgZ2l2ZW4gZm5pZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlkcyA9IFtdCisgICAgICAgIGlmIGZuaWQgaW4gc2VsZi50YXNrc19sb29rdXA6CisgICAgICAgICAgICBmb3IgdGFzayBpbiBzZWxmLnRhc2tzX2xvb2t1cFtmbmlkXToKKyAgICAgICAgICAgICAgICBpZHMuYXBwZW5kKHNlbGYudGFza3NfbG9va3VwW2ZuaWRdW3Rhc2tdKQorICAgICAgICByZXR1cm4gaWRzCisKKyAgICBkZWYgZ2V0dGFza19pZF9mcm9tZm5pZChzZWxmLCBmbmlkLCB0YXNrKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhbiBJRCBudW1iZXIgZm9yIHRoZSB0YXNrIG1hdGNoaW5nIGZuaWQgYW5kIHRhc2suCisgICAgICAgICIiIgorICAgICAgICBpZiBmbmlkIGluIHNlbGYudGFza3NfbG9va3VwOgorICAgICAgICAgICAgaWYgdGFzayBpbiBzZWxmLnRhc2tzX2xvb2t1cFtmbmlkXToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50YXNrc19sb29rdXBbZm5pZF1bdGFza10KKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldHRhc2tfaWQoc2VsZiwgZm4sIHRhc2ssIGNyZWF0ZSA9IFRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIElEIG51bWJlciBmb3IgdGhlIHRhc2sgbWF0Y2hpbmcgZm4gYW5kIHRhc2suCisgICAgICAgIElmIGl0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBvbmUgYnkgZGVmYXVsdC4KKyAgICAgICAgT3B0aW9uYWxseSByZXR1cm4gTm9uZSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgZm5pZCA9IHNlbGYuZ2V0Zm5faWQoZm4pCisKKyAgICAgICAgaWYgZm5pZCBpbiBzZWxmLnRhc2tzX2xvb2t1cDoKKyAgICAgICAgICAgIGlmIHRhc2sgaW4gc2VsZi50YXNrc19sb29rdXBbZm5pZF06CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudGFza3NfbG9va3VwW2ZuaWRdW3Rhc2tdCisKKyAgICAgICAgaWYgbm90IGNyZWF0ZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgc2VsZi50YXNrc19uYW1lLmFwcGVuZCh0YXNrKQorICAgICAgICBzZWxmLnRhc2tzX2ZuaWQuYXBwZW5kKGZuaWQpCisgICAgICAgIHNlbGYudGFza3NfdGRlcGVuZHMuYXBwZW5kKFtdKQorICAgICAgICBzZWxmLnRhc2tzX2lkZXBlbmRzLmFwcGVuZChbXSkKKyAgICAgICAgc2VsZi50YXNrc19pcmRlcGVuZHMuYXBwZW5kKFtdKQorCisgICAgICAgIGxpc3RpZCA9IGxlbihzZWxmLnRhc2tzX25hbWUpIC0gMQorCisgICAgICAgIGlmIGZuaWQgbm90IGluIHNlbGYudGFza3NfbG9va3VwOgorICAgICAgICAgICAgc2VsZi50YXNrc19sb29rdXBbZm5pZF0gPSB7fQorICAgICAgICBzZWxmLnRhc2tzX2xvb2t1cFtmbmlkXVt0YXNrXSA9IGxpc3RpZAorCisgICAgICAgIHJldHVybiBsaXN0aWQKKworICAgIGRlZiBhZGRfdGFza3Moc2VsZiwgZm4sIGRhdGFDYWNoZSk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgdGFza3MgZm9yIGEgZ2l2ZW4gZm4gdG8gdGhlIGRhdGFiYXNlCisgICAgICAgICIiIgorCisgICAgICAgIHRhc2tfZGVwcyA9IGRhdGFDYWNoZS50YXNrX2RlcHNbZm5dCisKKyAgICAgICAgZm5pZCA9IHNlbGYuZ2V0Zm5faWQoZm4pCisKKyAgICAgICAgaWYgZm5pZCBpbiBzZWxmLmZhaWxlZF9mbmlkczoKKyAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiVGFza0RhdGEiLCAiVHJ5aW5nIHRvIHJlLWFkZCBhIGZhaWxlZCBmaWxlPyBTb21ldGhpbmcgaXMgYnJva2VuLi4uIikKKworICAgICAgICAjIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZuCisgICAgICAgIGlmIGZuaWQgaW4gc2VsZi50YXNrc19mbmlkOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza19kZXBzWyd0YXNrcyddOgorCisgICAgICAgICAgICAjIFdvcmsgb3V0IHRhc2sgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBwYXJlbnRpZHMgPSBbXQorICAgICAgICAgICAgZm9yIGRlcCBpbiB0YXNrX2RlcHNbJ3BhcmVudHMnXVt0YXNrXToKKyAgICAgICAgICAgICAgICBpZiBkZXAgbm90IGluIHRhc2tfZGVwc1sndGFza3MnXToKKyAgICAgICAgICAgICAgICAgICAgYmIuZGVidWcoMiwgIk5vdCBhZGRpbmcgZGVwZW5kZW55IG9mICVzIG9uICVzIHNpbmNlICVzIGRvZXMgbm90IGV4aXN0IiAlICh0YXNrLCBkZXAsIGRlcCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcGFyZW50aWQgPSBzZWxmLmdldHRhc2tfaWQoZm4sIGRlcCkKKyAgICAgICAgICAgICAgICBwYXJlbnRpZHMuYXBwZW5kKHBhcmVudGlkKQorICAgICAgICAgICAgdGFza2lkID0gc2VsZi5nZXR0YXNrX2lkKGZuLCB0YXNrKQorICAgICAgICAgICAgc2VsZi50YXNrc190ZGVwZW5kc1t0YXNraWRdLmV4dGVuZChwYXJlbnRpZHMpCisKKyAgICAgICAgICAgICMgVG91Y2ggYWxsIGludGVydGFzayBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmICdkZXBlbmRzJyBpbiB0YXNrX2RlcHMgYW5kIHRhc2sgaW4gdGFza19kZXBzWydkZXBlbmRzJ106CisgICAgICAgICAgICAgICAgaWRzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZGVwIGluIHRhc2tfZGVwc1snZGVwZW5kcyddW3Rhc2tdLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGRlcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICI6IiBub3QgaW4gZGVwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLm1zZy5mYXRhbCgiVGFza0RhdGEiLCAiRXJyb3IgZm9yICVzLCBkZXBlbmRlbmN5ICVzIGRvZXMgbm90IGNvbnRhaW4gJzonIGNoYXJhY3RlclxuLiBUYXNrICdkZXBlbmRzJyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBmb3JtICdwYWNrYWdlbmFtZTp0YXNrJyIgJSAoZm4sIGRlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZHMuYXBwZW5kKCgoc2VsZi5nZXRidWlsZF9pZChkZXAuc3BsaXQoIjoiKVswXSkpLCBkZXAuc3BsaXQoIjoiKVsxXSkpCisgICAgICAgICAgICAgICAgc2VsZi50YXNrc19pZGVwZW5kc1t0YXNraWRdLmV4dGVuZChpZHMpCisgICAgICAgICAgICBpZiAncmRlcGVuZHMnIGluIHRhc2tfZGVwcyBhbmQgdGFzayBpbiB0YXNrX2RlcHNbJ3JkZXBlbmRzJ106CisgICAgICAgICAgICAgICAgaWRzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZGVwIGluIHRhc2tfZGVwc1sncmRlcGVuZHMnXVt0YXNrXS5zcGxpdCgpOgorICAgICAgICAgICAgICAgICAgICBpZiBkZXA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAiOiIgbm90IGluIGRlcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5tc2cuZmF0YWwoIlRhc2tEYXRhIiwgIkVycm9yIGZvciAlcywgZGVwZW5kZW5jeSAlcyBkb2VzIG5vdCBjb250YWluICc6JyBjaGFyYWN0ZXJcbi4gVGFzayAncmRlcGVuZHMnIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvcm0gJ3BhY2thZ2VuYW1lOnRhc2snIiAlIChmbiwgZGVwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkcy5hcHBlbmQoKChzZWxmLmdldHJ1bl9pZChkZXAuc3BsaXQoIjoiKVswXSkpLCBkZXAuc3BsaXQoIjoiKVsxXSkpCisgICAgICAgICAgICAgICAgc2VsZi50YXNrc19pcmRlcGVuZHNbdGFza2lkXS5leHRlbmQoaWRzKQorCisKKyAgICAgICAgIyBXb3JrIG91dCBidWlsZCBkZXBlbmRlbmNpZXMKKyAgICAgICAgaWYgbm90IGZuaWQgaW4gc2VsZi5kZXBpZHM6CisgICAgICAgICAgICBkZXBlbmRpZHMgPSB7fQorICAgICAgICAgICAgZm9yIGRlcGVuZCBpbiBkYXRhQ2FjaGUuZGVwc1tmbl06CisgICAgICAgICAgICAgICAgZGVwZW5kaWRzW3NlbGYuZ2V0YnVpbGRfaWQoZGVwZW5kKV0gPSBOb25lCisgICAgICAgICAgICBzZWxmLmRlcGlkc1tmbmlkXSA9IGRlcGVuZGlkcy5rZXlzKCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQWRkZWQgZGVwZW5kZW5jaWVzICVzIGZvciAlcyIsIHN0cihkYXRhQ2FjaGUuZGVwc1tmbl0pLCBmbikKKworICAgICAgICAjIFdvcmsgb3V0IHJ1bnRpbWUgZGVwZW5kZW5jaWVzCisgICAgICAgIGlmIG5vdCBmbmlkIGluIHNlbGYucmRlcGlkczoKKyAgICAgICAgICAgIHJkZXBlbmRpZHMgPSB7fQorICAgICAgICAgICAgcmRlcGVuZHMgPSBkYXRhQ2FjaGUucnVuZGVwc1tmbl0KKyAgICAgICAgICAgIHJyZWNzID0gZGF0YUNhY2hlLnJ1bnJlY3NbZm5dCisgICAgICAgICAgICByZGVwZW5kbGlzdCA9IFtdCisgICAgICAgICAgICBycmVjbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiByZGVwZW5kczoKKyAgICAgICAgICAgICAgICBmb3IgcmRlcGVuZCBpbiByZGVwZW5kc1twYWNrYWdlXToKKyAgICAgICAgICAgICAgICAgICAgcmRlcGVuZGxpc3QuYXBwZW5kKHJkZXBlbmQpCisgICAgICAgICAgICAgICAgICAgIHJkZXBlbmRpZHNbc2VsZi5nZXRydW5faWQocmRlcGVuZCldID0gTm9uZQorICAgICAgICAgICAgZm9yIHBhY2thZ2UgaW4gcnJlY3M6CisgICAgICAgICAgICAgICAgZm9yIHJkZXBlbmQgaW4gcnJlY3NbcGFja2FnZV06CisgICAgICAgICAgICAgICAgICAgIHJyZWNsaXN0LmFwcGVuZChyZGVwZW5kKQorICAgICAgICAgICAgICAgICAgICByZGVwZW5kaWRzW3NlbGYuZ2V0cnVuX2lkKHJkZXBlbmQpXSA9IE5vbmUKKyAgICAgICAgICAgIGlmIHJkZXBlbmRsaXN0OgorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiQWRkZWQgcnVudGltZSBkZXBlbmRlbmNpZXMgJXMgZm9yICVzIiwgc3RyKHJkZXBlbmRsaXN0KSwgZm4pCisgICAgICAgICAgICBpZiBycmVjbGlzdDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoMiwgIkFkZGVkIHJ1bnRpbWUgcmVjb21tZW5kYXRpb25zICVzIGZvciAlcyIsIHN0cihycmVjbGlzdCksIGZuKQorICAgICAgICAgICAgc2VsZi5yZGVwaWRzW2ZuaWRdID0gcmRlcGVuZGlkcy5rZXlzKCkKKworICAgICAgICBmb3IgZGVwIGluIHNlbGYuZGVwaWRzW2ZuaWRdOgorICAgICAgICAgICAgaWYgZGVwIGluIHNlbGYuZmFpbGVkX2RlcHM6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsX2ZuaWQoZm5pZCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIGRlcCBpbiBzZWxmLnJkZXBpZHNbZm5pZF06CisgICAgICAgICAgICBpZiBkZXAgaW4gc2VsZi5mYWlsZWRfcmRlcHM6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsX2ZuaWQoZm5pZCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiBoYXZlX2J1aWxkX3RhcmdldChzZWxmLCB0YXJnZXQpOgorICAgICAgICAiIiIKKyAgICAgICAgSGF2ZSB3ZSBhIGJ1aWxkIHRhcmdldCBtYXRjaGluZyB0aGlzIG5hbWU/CisgICAgICAgICIiIgorICAgICAgICB0YXJnZXRpZCA9IHNlbGYuZ2V0YnVpbGRfaWQodGFyZ2V0KQorCisgICAgICAgIGlmIHRhcmdldGlkIGluIHNlbGYuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhdmVfcnVudGltZV90YXJnZXQoc2VsZiwgdGFyZ2V0KToKKyAgICAgICAgIiIiCisgICAgICAgIEhhdmUgd2UgYSBydW50aW1lIHRhcmdldCBtYXRjaGluZyB0aGlzIG5hbWU/CisgICAgICAgICIiIgorICAgICAgICB0YXJnZXRpZCA9IHNlbGYuZ2V0cnVuX2lkKHRhcmdldCkKKworICAgICAgICBpZiB0YXJnZXRpZCBpbiBzZWxmLnJ1bl90YXJnZXRzOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYWRkX2J1aWxkX3RhcmdldChzZWxmLCBmbiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgYSBidWlsZCB0YXJnZXQuCisgICAgICAgIElmIGFscmVhZHkgcHJlc2VudCwgYXBwZW5kIHRoZSBwcm92aWRlciBmbiB0byB0aGUgbGlzdAorICAgICAgICAiIiIKKyAgICAgICAgdGFyZ2V0aWQgPSBzZWxmLmdldGJ1aWxkX2lkKGl0ZW0pCisgICAgICAgIGZuaWQgPSBzZWxmLmdldGZuX2lkKGZuKQorCisgICAgICAgIGlmIHRhcmdldGlkIGluIHNlbGYuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgIGlmIGZuaWQgaW4gc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldGlkXToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuYnVpbGRfdGFyZ2V0c1t0YXJnZXRpZF0uYXBwZW5kKGZuaWQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldGlkXSA9IFtmbmlkXQorCisgICAgZGVmIGFkZF9ydW50aW1lX3RhcmdldChzZWxmLCBmbiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgYSBydW50aW1lIHRhcmdldC4KKyAgICAgICAgSWYgYWxyZWFkeSBwcmVzZW50LCBhcHBlbmQgdGhlIHByb3ZpZGVyIGZuIHRvIHRoZSBsaXN0CisgICAgICAgICIiIgorICAgICAgICB0YXJnZXRpZCA9IHNlbGYuZ2V0cnVuX2lkKGl0ZW0pCisgICAgICAgIGZuaWQgPSBzZWxmLmdldGZuX2lkKGZuKQorCisgICAgICAgIGlmIHRhcmdldGlkIGluIHNlbGYucnVuX3RhcmdldHM6CisgICAgICAgICAgICBpZiBmbmlkIGluIHNlbGYucnVuX3RhcmdldHNbdGFyZ2V0aWRdOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5ydW5fdGFyZ2V0c1t0YXJnZXRpZF0uYXBwZW5kKGZuaWQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5ydW5fdGFyZ2V0c1t0YXJnZXRpZF0gPSBbZm5pZF0KKworICAgIGRlZiBtYXJrX2V4dGVybmFsX3RhcmdldChzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcmsgYSBidWlsZCB0YXJnZXQgYXMgYmVpbmcgZXh0ZXJuYWxseSByZXF1ZXN0ZWQKKyAgICAgICAgIiIiCisgICAgICAgIHRhcmdldGlkID0gc2VsZi5nZXRidWlsZF9pZChpdGVtKQorCisgICAgICAgIGlmIHRhcmdldGlkIG5vdCBpbiBzZWxmLmV4dGVybmFsX3RhcmdldHM6CisgICAgICAgICAgICBzZWxmLmV4dGVybmFsX3RhcmdldHMuYXBwZW5kKHRhcmdldGlkKQorCisgICAgZGVmIGdldF91bnJlc29sdmVkX2J1aWxkX3RhcmdldHMoc2VsZiwgZGF0YUNhY2hlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2YgYnVpbGQgdGFyZ2V0cyB3aG8ncyBwcm92aWRlcnMKKyAgICAgICAgYXJlIHVua25vd24uCisgICAgICAgICIiIgorICAgICAgICB1bnJlc29sdmVkID0gW10KKyAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLmJ1aWxkX25hbWVzX2luZGV4OgorICAgICAgICAgICAgaWYgcmVfbWF0Y2hfc3RyaW5ncyh0YXJnZXQsIGRhdGFDYWNoZS5pZ25vcmVkX2RlcGVuZGVuY2llcyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHNlbGYuYnVpbGRfbmFtZXNfaW5kZXguaW5kZXgodGFyZ2V0KSBpbiBzZWxmLmZhaWxlZF9kZXBzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5oYXZlX2J1aWxkX3RhcmdldCh0YXJnZXQpOgorICAgICAgICAgICAgICAgIHVucmVzb2x2ZWQuYXBwZW5kKHRhcmdldCkKKyAgICAgICAgcmV0dXJuIHVucmVzb2x2ZWQKKworICAgIGRlZiBnZXRfdW5yZXNvbHZlZF9ydW5fdGFyZ2V0cyhzZWxmLCBkYXRhQ2FjaGUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiBydW50aW1lIHRhcmdldHMgd2hvJ3MgcHJvdmlkZXJzCisgICAgICAgIGFyZSB1bmtub3duLgorICAgICAgICAiIiIKKyAgICAgICAgdW5yZXNvbHZlZCA9IFtdCisgICAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5ydW5fbmFtZXNfaW5kZXg6CisgICAgICAgICAgICBpZiByZV9tYXRjaF9zdHJpbmdzKHRhcmdldCwgZGF0YUNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc2VsZi5ydW5fbmFtZXNfaW5kZXguaW5kZXgodGFyZ2V0KSBpbiBzZWxmLmZhaWxlZF9yZGVwczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IHNlbGYuaGF2ZV9ydW50aW1lX3RhcmdldCh0YXJnZXQpOgorICAgICAgICAgICAgICAgIHVucmVzb2x2ZWQuYXBwZW5kKHRhcmdldCkKKyAgICAgICAgcmV0dXJuIHVucmVzb2x2ZWQKKworICAgIGRlZiBnZXRfcHJvdmlkZXIoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHByb3ZpZGVycyBvZiBpdGVtCisgICAgICAgICIiIgorICAgICAgICB0YXJnZXRpZCA9IHNlbGYuZ2V0YnVpbGRfaWQoaXRlbSkKKworICAgICAgICByZXR1cm4gc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldGlkXQorCisgICAgZGVmIGdldF9kZXBlbmRlZXMoc2VsZiwgaXRlbWlkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2YgdGFyZ2V0cyB3aGljaCBkZXBlbmQgb24gaXRlbQorICAgICAgICAiIiIKKyAgICAgICAgZGVwZW5kZWVzID0gW10KKyAgICAgICAgZm9yIGZuaWQgaW4gc2VsZi5kZXBpZHM6CisgICAgICAgICAgICBpZiBpdGVtaWQgaW4gc2VsZi5kZXBpZHNbZm5pZF06CisgICAgICAgICAgICAgICAgZGVwZW5kZWVzLmFwcGVuZChmbmlkKQorICAgICAgICByZXR1cm4gZGVwZW5kZWVzCisKKyAgICBkZWYgZ2V0X2RlcGVuZGVlc19zdHIoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHRhcmdldHMgd2hpY2ggZGVwZW5kIG9uIGl0ZW0gYXMgYSB1c2VyIHJlYWRhYmxlIHN0cmluZworICAgICAgICAiIiIKKyAgICAgICAgaXRlbWlkID0gc2VsZi5nZXRidWlsZF9pZChpdGVtKQorICAgICAgICBkZXBlbmRlZXMgPSBbXQorICAgICAgICBmb3IgZm5pZCBpbiBzZWxmLmRlcGlkczoKKyAgICAgICAgICAgIGlmIGl0ZW1pZCBpbiBzZWxmLmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgICAgICBkZXBlbmRlZXMuYXBwZW5kKHNlbGYuZm5faW5kZXhbZm5pZF0pCisgICAgICAgIHJldHVybiBkZXBlbmRlZXMKKworICAgIGRlZiBnZXRfcmRlcGVuZGVlcyhzZWxmLCBpdGVtaWQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiB0YXJnZXRzIHdoaWNoIGRlcGVuZCBvbiBydW50aW1lIGl0ZW0KKyAgICAgICAgIiIiCisgICAgICAgIGRlcGVuZGVlcyA9IFtdCisgICAgICAgIGZvciBmbmlkIGluIHNlbGYucmRlcGlkczoKKyAgICAgICAgICAgIGlmIGl0ZW1pZCBpbiBzZWxmLnJkZXBpZHNbZm5pZF06CisgICAgICAgICAgICAgICAgZGVwZW5kZWVzLmFwcGVuZChmbmlkKQorICAgICAgICByZXR1cm4gZGVwZW5kZWVzCisKKyAgICBkZWYgZ2V0X3JkZXBlbmRlZXNfc3RyKHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiB0YXJnZXRzIHdoaWNoIGRlcGVuZCBvbiBydW50aW1lIGl0ZW0gYXMgYSB1c2VyIHJlYWRhYmxlIHN0cmluZworICAgICAgICAiIiIKKyAgICAgICAgaXRlbWlkID0gc2VsZi5nZXRydW5faWQoaXRlbSkKKyAgICAgICAgZGVwZW5kZWVzID0gW10KKyAgICAgICAgZm9yIGZuaWQgaW4gc2VsZi5yZGVwaWRzOgorICAgICAgICAgICAgaWYgaXRlbWlkIGluIHNlbGYucmRlcGlkc1tmbmlkXToKKyAgICAgICAgICAgICAgICBkZXBlbmRlZXMuYXBwZW5kKHNlbGYuZm5faW5kZXhbZm5pZF0pCisgICAgICAgIHJldHVybiBkZXBlbmRlZXMKKworICAgIGRlZiBnZXRfcmVhc29ucyhzZWxmLCBpdGVtLCBydW50aW1lPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCB0aGUgcmVhc29uKHMpIGZvciBhbiBpdGVtIG5vdCBiZWluZyBwcm92aWRlZCwgaWYgYW55CisgICAgICAgICIiIgorICAgICAgICByZWFzb25zID0gW10KKyAgICAgICAgaWYgc2VsZi5za2lwbGlzdDoKKyAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnNraXBsaXN0OgorICAgICAgICAgICAgICAgIHNraXBpdGVtID0gc2VsZi5za2lwbGlzdFtmbl0KKyAgICAgICAgICAgICAgICBpZiBza2lwaXRlbS5wbiA9PSBpdGVtOgorICAgICAgICAgICAgICAgICAgICByZWFzb25zLmFwcGVuZCgiJXMgd2FzIHNraXBwZWQ6ICVzIiAlIChza2lwaXRlbS5wbiwgc2tpcGl0ZW0uc2tpcHJlYXNvbikpCisgICAgICAgICAgICAgICAgZWxpZiBydW50aW1lIGFuZCBpdGVtIGluIHNraXBpdGVtLnJwcm92aWRlczoKKyAgICAgICAgICAgICAgICAgICAgcmVhc29ucy5hcHBlbmQoIiVzIFJQUk9WSURFUyAlcyBidXQgd2FzIHNraXBwZWQ6ICVzIiAlIChza2lwaXRlbS5wbiwgaXRlbSwgc2tpcGl0ZW0uc2tpcHJlYXNvbikpCisgICAgICAgICAgICAgICAgZWxpZiBub3QgcnVudGltZSBhbmQgaXRlbSBpbiBza2lwaXRlbS5wcm92aWRlczoKKyAgICAgICAgICAgICAgICAgICAgcmVhc29ucy5hcHBlbmQoIiVzIFBST1ZJREVTICVzIGJ1dCB3YXMgc2tpcHBlZDogJXMiICUgKHNraXBpdGVtLnBuLCBpdGVtLCBza2lwaXRlbS5za2lwcmVhc29uKSkKKyAgICAgICAgcmV0dXJuIHJlYXNvbnMKKworICAgIGRlZiBnZXRfY2xvc2VfbWF0Y2hlcyhzZWxmLCBpdGVtLCBwcm92aWRlcl9saXN0KToKKyAgICAgICAgaW1wb3J0IGRpZmZsaWIKKyAgICAgICAgaWYgc2VsZi5za2lwbGlzdDoKKyAgICAgICAgICAgIHNraXBwZWQgPSBbXQorICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYuc2tpcGxpc3Q6CisgICAgICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQoc2VsZi5za2lwbGlzdFtmbl0ucG4pCisgICAgICAgICAgICBmdWxsX2xpc3QgPSBwcm92aWRlcl9saXN0ICsgc2tpcHBlZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnVsbF9saXN0ID0gcHJvdmlkZXJfbGlzdAorICAgICAgICByZXR1cm4gZGlmZmxpYi5nZXRfY2xvc2VfbWF0Y2hlcyhpdGVtLCBmdWxsX2xpc3QsIGN1dG9mZj0wLjcpCisKKyAgICBkZWYgYWRkX3Byb3ZpZGVyKHNlbGYsIGNmZ0RhdGEsIGRhdGFDYWNoZSwgaXRlbSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYWRkX3Byb3ZpZGVyX2ludGVybmFsKGNmZ0RhdGEsIGRhdGFDYWNoZSwgaXRlbSkKKyAgICAgICAgZXhjZXB0IGJiLnByb3ZpZGVycy5Ob1Byb3ZpZGVyOgorICAgICAgICAgICAgaWYgc2VsZi5hYm9ydDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgc2VsZi5yZW1vdmVfYnVpbGR0YXJnZXQoc2VsZi5nZXRidWlsZF9pZChpdGVtKSkKKworICAgICAgICBzZWxmLm1hcmtfZXh0ZXJuYWxfdGFyZ2V0KGl0ZW0pCisKKyAgICBkZWYgYWRkX3Byb3ZpZGVyX2ludGVybmFsKHNlbGYsIGNmZ0RhdGEsIGRhdGFDYWNoZSwgaXRlbSk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgdGhlIHByb3ZpZGVycyBvZiBpdGVtIHRvIHRoZSB0YXNrIGRhdGEKKyAgICAgICAgTWFyayBlbnRyaWVzIHdlcmUgc3BlY2lmaWNhbGx5IGFkZGVkIGV4dGVybmFsbHkgYXMgYWdhaW5zdCBkZXBlbmRlbmNpZXMKKyAgICAgICAgYWRkZWQgaW50ZXJuYWxseSBkdXJpbmcgZGVwZW5kZW5jeSByZXNvbHV0aW9uCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHJlX21hdGNoX3N0cmluZ3MoaXRlbSwgZGF0YUNhY2hlLmlnbm9yZWRfZGVwZW5kZW5jaWVzKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBpdGVtIGluIGRhdGFDYWNoZS5wcm92aWRlcnM6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk5vUHJvdmlkZXIoaXRlbSwgZGVwZW5kZWVzPXNlbGYuZ2V0X2RlcGVuZGVlc19zdHIoaXRlbSksIHJlYXNvbnM9c2VsZi5nZXRfcmVhc29ucyhpdGVtKSwgY2xvc2VfbWF0Y2hlcz1zZWxmLmdldF9jbG9zZV9tYXRjaGVzKGl0ZW0sIGRhdGFDYWNoZS5wcm92aWRlcnMua2V5cygpKSksIGNmZ0RhdGEpCisgICAgICAgICAgICByYWlzZSBiYi5wcm92aWRlcnMuTm9Qcm92aWRlcihpdGVtKQorCisgICAgICAgIGlmIHNlbGYuaGF2ZV9idWlsZF90YXJnZXQoaXRlbSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBhbGxfcCA9IGRhdGFDYWNoZS5wcm92aWRlcnNbaXRlbV0KKworICAgICAgICBlbGlnaWJsZSwgZm91bmRVbmlxdWUgPSBiYi5wcm92aWRlcnMuZmlsdGVyUHJvdmlkZXJzKGFsbF9wLCBpdGVtLCBjZmdEYXRhLCBkYXRhQ2FjaGUpCisgICAgICAgIGVsaWdpYmxlID0gW3AgZm9yIHAgaW4gZWxpZ2libGUgaWYgbm90IHNlbGYuZ2V0Zm5faWQocCkgaW4gc2VsZi5mYWlsZWRfZm5pZHNdCisKKyAgICAgICAgaWYgbm90IGVsaWdpYmxlOgorICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5Ob1Byb3ZpZGVyKGl0ZW0sIGRlcGVuZGVlcz1zZWxmLmdldF9kZXBlbmRlZXNfc3RyKGl0ZW0pLCByZWFzb25zPVsiTm8gZWxpZ2libGUgUFJPVklERVJzIGV4aXN0IGZvciAnJXMnIiAlIGl0ZW1dKSwgY2ZnRGF0YSkKKyAgICAgICAgICAgIHJhaXNlIGJiLnByb3ZpZGVycy5Ob1Byb3ZpZGVyKGl0ZW0pCisKKyAgICAgICAgaWYgbGVuKGVsaWdpYmxlKSA+IDEgYW5kIGZvdW5kVW5pcXVlID09IEZhbHNlOgorICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5jb25zaWRlcl9tc2dzX2NhY2hlOgorICAgICAgICAgICAgICAgIHByb3ZpZGVyc19saXN0ID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gZWxpZ2libGU6CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc19saXN0LmFwcGVuZChkYXRhQ2FjaGUucGtnX2ZuW2ZuXSkKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzKGl0ZW0sIHByb3ZpZGVyc19saXN0KSwgY2ZnRGF0YSkKKyAgICAgICAgICAgIHNlbGYuY29uc2lkZXJfbXNnc19jYWNoZS5hcHBlbmQoaXRlbSkKKworICAgICAgICBmb3IgZm4gaW4gZWxpZ2libGU6CisgICAgICAgICAgICBmbmlkID0gc2VsZi5nZXRmbl9pZChmbikKKyAgICAgICAgICAgIGlmIGZuaWQgaW4gc2VsZi5mYWlsZWRfZm5pZHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiYWRkaW5nICVzIHRvIHNhdGlzZnkgJXMiLCBmbiwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuYWRkX2J1aWxkX3RhcmdldChmbiwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuYWRkX3Rhc2tzKGZuLCBkYXRhQ2FjaGUpCisKKworICAgICAgICAgICAgI2l0ZW0gPSBkYXRhQ2FjaGUucGtnX2ZuW2ZuXQorCisgICAgZGVmIGFkZF9ycHJvdmlkZXIoc2VsZiwgY2ZnRGF0YSwgZGF0YUNhY2hlLCBpdGVtKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0aGUgcnVudGltZSBwcm92aWRlcnMgb2YgaXRlbSB0byB0aGUgdGFzayBkYXRhCisgICAgICAgICh0YWtlcyBpdGVtIG5hbWVzIGZyb20gUkRFUEVORFMvUEFDS0FHRVMgbmFtZXNwYWNlKQorICAgICAgICAiIiIKKworICAgICAgICBpZiByZV9tYXRjaF9zdHJpbmdzKGl0ZW0sIGRhdGFDYWNoZS5pZ25vcmVkX2RlcGVuZGVuY2llcyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmhhdmVfcnVudGltZV90YXJnZXQoaXRlbSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBhbGxfcCA9IGJiLnByb3ZpZGVycy5nZXRSdW50aW1lUHJvdmlkZXJzKGRhdGFDYWNoZSwgaXRlbSkKKworICAgICAgICBpZiBub3QgYWxsX3A6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk5vUHJvdmlkZXIoaXRlbSwgcnVudGltZT1UcnVlLCBkZXBlbmRlZXM9c2VsZi5nZXRfcmRlcGVuZGVlc19zdHIoaXRlbSksIHJlYXNvbnM9c2VsZi5nZXRfcmVhc29ucyhpdGVtLCBUcnVlKSksIGNmZ0RhdGEpCisgICAgICAgICAgICByYWlzZSBiYi5wcm92aWRlcnMuTm9SUHJvdmlkZXIoaXRlbSkKKworICAgICAgICBlbGlnaWJsZSwgbnVtYmVyUHJlZmVycmVkID0gYmIucHJvdmlkZXJzLmZpbHRlclByb3ZpZGVyc1J1blRpbWUoYWxsX3AsIGl0ZW0sIGNmZ0RhdGEsIGRhdGFDYWNoZSkKKyAgICAgICAgZWxpZ2libGUgPSBbcCBmb3IgcCBpbiBlbGlnaWJsZSBpZiBub3Qgc2VsZi5nZXRmbl9pZChwKSBpbiBzZWxmLmZhaWxlZF9mbmlkc10KKworICAgICAgICBpZiBub3QgZWxpZ2libGU6CisgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk5vUHJvdmlkZXIoaXRlbSwgcnVudGltZT1UcnVlLCBkZXBlbmRlZXM9c2VsZi5nZXRfcmRlcGVuZGVlc19zdHIoaXRlbSksIHJlYXNvbnM9WyJObyBlbGlnaWJsZSBSUFJPVklERVJzIGV4aXN0IGZvciAnJXMnIiAlIGl0ZW1dKSwgY2ZnRGF0YSkKKyAgICAgICAgICAgIHJhaXNlIGJiLnByb3ZpZGVycy5Ob1JQcm92aWRlcihpdGVtKQorCisgICAgICAgIGlmIGxlbihlbGlnaWJsZSkgPiAxIGFuZCBudW1iZXJQcmVmZXJyZWQgPT0gMDoKKyAgICAgICAgICAgIGlmIGl0ZW0gbm90IGluIHNlbGYuY29uc2lkZXJfbXNnc19jYWNoZToKKyAgICAgICAgICAgICAgICBwcm92aWRlcnNfbGlzdCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIGVsaWdpYmxlOgorICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnNfbGlzdC5hcHBlbmQoZGF0YUNhY2hlLnBrZ19mbltmbl0pCisgICAgICAgICAgICAgICAgYmIuZXZlbnQuZmlyZShiYi5ldmVudC5NdWx0aXBsZVByb3ZpZGVycyhpdGVtLCBwcm92aWRlcnNfbGlzdCwgcnVudGltZT1UcnVlKSwgY2ZnRGF0YSkKKyAgICAgICAgICAgIHNlbGYuY29uc2lkZXJfbXNnc19jYWNoZS5hcHBlbmQoaXRlbSkKKworICAgICAgICBpZiBudW1iZXJQcmVmZXJyZWQgPiAxOgorICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gc2VsZi5jb25zaWRlcl9tc2dzX2NhY2hlOgorICAgICAgICAgICAgICAgIHByb3ZpZGVyc19saXN0ID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gZWxpZ2libGU6CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc19saXN0LmFwcGVuZChkYXRhQ2FjaGUucGtnX2ZuW2ZuXSkKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5maXJlKGJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzKGl0ZW0sIHByb3ZpZGVyc19saXN0LCBydW50aW1lPVRydWUpLCBjZmdEYXRhKQorICAgICAgICAgICAgc2VsZi5jb25zaWRlcl9tc2dzX2NhY2hlLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgcmFpc2UgYmIucHJvdmlkZXJzLk11bHRpcGxlUlByb3ZpZGVyKGl0ZW0pCisKKyAgICAgICAgIyBydW4gdGhyb3VnaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHdlIGNhbiBidWlsZAorICAgICAgICBmb3IgZm4gaW4gZWxpZ2libGU6CisgICAgICAgICAgICBmbmlkID0gc2VsZi5nZXRmbl9pZChmbikKKyAgICAgICAgICAgIGlmIGZuaWQgaW4gc2VsZi5mYWlsZWRfZm5pZHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygyLCAiYWRkaW5nICclcycgdG8gc2F0aXNmeSBydW50aW1lICclcyciLCBmbiwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfdGFyZ2V0KGZuLCBpdGVtKQorICAgICAgICAgICAgc2VsZi5hZGRfdGFza3MoZm4sIGRhdGFDYWNoZSkKKworICAgIGRlZiBmYWlsX2ZuaWQoc2VsZiwgZm5pZCwgbWlzc2luZ19saXN0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFyayBhIGZpbGUgYXMgZmFpbGVkICh1bmJ1aWxkYWJsZSkKKyAgICAgICAgUmVtb3ZlIGFueSByZWZlcmVuY2VzIGZyb20gYnVpbGQgYW5kIHJ1bnRpbWUgcHJvdmlkZXIgbGlzdHMKKworICAgICAgICBtaXNzaW5nX2xpc3QsIEEgbGlzdCBvZiBtaXNzaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhpcyB0YXJnZXQKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZuaWQgaW4gc2VsZi5mYWlsZWRfZm5pZHM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IG1pc3NpbmdfbGlzdDoKKyAgICAgICAgICAgIG1pc3NpbmdfbGlzdCA9IFtdCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiRmlsZSAnJXMnIGlzIHVuYnVpbGRhYmxlLCByZW1vdmluZy4uLiIsIHNlbGYuZm5faW5kZXhbZm5pZF0pCisgICAgICAgIHNlbGYuZmFpbGVkX2ZuaWRzLmFwcGVuZChmbmlkKQorICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgIGlmIGZuaWQgaW4gc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldF06CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZF90YXJnZXRzW3RhcmdldF0ucmVtb3ZlKGZuaWQpCisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYuYnVpbGRfdGFyZ2V0c1t0YXJnZXRdKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZV9idWlsZHRhcmdldCh0YXJnZXQsIG1pc3NpbmdfbGlzdCkKKyAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLnJ1bl90YXJnZXRzOgorICAgICAgICAgICAgaWYgZm5pZCBpbiBzZWxmLnJ1bl90YXJnZXRzW3RhcmdldF06CisgICAgICAgICAgICAgICAgc2VsZi5ydW5fdGFyZ2V0c1t0YXJnZXRdLnJlbW92ZShmbmlkKQorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnJ1bl90YXJnZXRzW3RhcmdldF0pID09IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlX3J1bnRhcmdldCh0YXJnZXQsIG1pc3NpbmdfbGlzdCkKKworICAgIGRlZiByZW1vdmVfYnVpbGR0YXJnZXQoc2VsZiwgdGFyZ2V0aWQsIG1pc3NpbmdfbGlzdD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hcmsgYSBidWlsZCB0YXJnZXQgYXMgZmFpbGVkICh1bmJ1aWxkYWJsZSkKKyAgICAgICAgVHJpZ2dlciByZW1vdmFsIG9mIGFueSBmaWxlcyB0aGF0IGhhdmUgdGhpcyBhcyBhIGRlcGVuZGVuY3kKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBtaXNzaW5nX2xpc3Q6CisgICAgICAgICAgICBtaXNzaW5nX2xpc3QgPSBbc2VsZi5idWlsZF9uYW1lc19pbmRleFt0YXJnZXRpZF1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtaXNzaW5nX2xpc3QgPSBbc2VsZi5idWlsZF9uYW1lc19pbmRleFt0YXJnZXRpZF1dICsgbWlzc2luZ19saXN0CisgICAgICAgIGxvZ2dlci52ZXJib3NlKCJUYXJnZXQgJyVzJyBpcyB1bmJ1aWxkYWJsZSwgcmVtb3ZpbmcuLi5cbk1pc3Npbmcgb3IgdW5idWlsZGFibGUgZGVwZW5kZW5jeSBjaGFpbiB3YXM6ICVzIiwgc2VsZi5idWlsZF9uYW1lc19pbmRleFt0YXJnZXRpZF0sIG1pc3NpbmdfbGlzdCkKKyAgICAgICAgc2VsZi5mYWlsZWRfZGVwcy5hcHBlbmQodGFyZ2V0aWQpCisgICAgICAgIGRlcGVuZGVlcyA9IHNlbGYuZ2V0X2RlcGVuZGVlcyh0YXJnZXRpZCkKKyAgICAgICAgZm9yIGZuaWQgaW4gZGVwZW5kZWVzOgorICAgICAgICAgICAgc2VsZi5mYWlsX2ZuaWQoZm5pZCwgbWlzc2luZ19saXN0KQorICAgICAgICBmb3IgdGFza2lkIGluIHhyYW5nZShsZW4oc2VsZi50YXNrc19pZGVwZW5kcykpOgorICAgICAgICAgICAgaWRlcGVuZHMgPSBzZWxmLnRhc2tzX2lkZXBlbmRzW3Rhc2tpZF0KKyAgICAgICAgICAgIGZvciAoaWRlcGVuZGlkLCBpZGVwZW5kdGFzaykgaW4gaWRlcGVuZHM6CisgICAgICAgICAgICAgICAgaWYgaWRlcGVuZGlkID09IHRhcmdldGlkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxfZm5pZChzZWxmLnRhc2tzX2ZuaWRbdGFza2lkXSwgbWlzc2luZ19saXN0KQorCisgICAgICAgIGlmIHNlbGYuYWJvcnQgYW5kIHRhcmdldGlkIGluIHNlbGYuZXh0ZXJuYWxfdGFyZ2V0czoKKyAgICAgICAgICAgIHRhcmdldCA9IHNlbGYuYnVpbGRfbmFtZXNfaW5kZXhbdGFyZ2V0aWRdCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlJlcXVpcmVkIGJ1aWxkIHRhcmdldCAnJXMnIGhhcyBubyBidWlsZGFibGUgcHJvdmlkZXJzLlxuTWlzc2luZyBvciB1bmJ1aWxkYWJsZSBkZXBlbmRlbmN5IGNoYWluIHdhczogJXMiLCB0YXJnZXQsIG1pc3NpbmdfbGlzdCkKKyAgICAgICAgICAgIHJhaXNlIGJiLnByb3ZpZGVycy5Ob1Byb3ZpZGVyKHRhcmdldCkKKworICAgIGRlZiByZW1vdmVfcnVudGFyZ2V0KHNlbGYsIHRhcmdldGlkLCBtaXNzaW5nX2xpc3Q9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBNYXJrIGEgcnVuIHRhcmdldCBhcyBmYWlsZWQgKHVuYnVpbGRhYmxlKQorICAgICAgICBUcmlnZ2VyIHJlbW92YWwgb2YgYW55IGZpbGVzIHRoYXQgaGF2ZSB0aGlzIGFzIGEgZGVwZW5kZW5jeQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IG1pc3NpbmdfbGlzdDoKKyAgICAgICAgICAgIG1pc3NpbmdfbGlzdCA9IFtzZWxmLnJ1bl9uYW1lc19pbmRleFt0YXJnZXRpZF1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtaXNzaW5nX2xpc3QgPSBbc2VsZi5ydW5fbmFtZXNfaW5kZXhbdGFyZ2V0aWRdXSArIG1pc3NpbmdfbGlzdAorCisgICAgICAgIGxvZ2dlci5pbmZvKCJSdW50aW1lIHRhcmdldCAnJXMnIGlzIHVuYnVpbGRhYmxlLCByZW1vdmluZy4uLlxuTWlzc2luZyBvciB1bmJ1aWxkYWJsZSBkZXBlbmRlbmN5IGNoYWluIHdhczogJXMiLCBzZWxmLnJ1bl9uYW1lc19pbmRleFt0YXJnZXRpZF0sIG1pc3NpbmdfbGlzdCkKKyAgICAgICAgc2VsZi5mYWlsZWRfcmRlcHMuYXBwZW5kKHRhcmdldGlkKQorICAgICAgICBkZXBlbmRlZXMgPSBzZWxmLmdldF9yZGVwZW5kZWVzKHRhcmdldGlkKQorICAgICAgICBmb3IgZm5pZCBpbiBkZXBlbmRlZXM6CisgICAgICAgICAgICBzZWxmLmZhaWxfZm5pZChmbmlkLCBtaXNzaW5nX2xpc3QpCisgICAgICAgIGZvciB0YXNraWQgaW4geHJhbmdlKGxlbihzZWxmLnRhc2tzX2lyZGVwZW5kcykpOgorICAgICAgICAgICAgaXJkZXBlbmRzID0gc2VsZi50YXNrc19pcmRlcGVuZHNbdGFza2lkXQorICAgICAgICAgICAgZm9yIChpZGVwZW5kaWQsIGlkZXBlbmR0YXNrKSBpbiBpcmRlcGVuZHM6CisgICAgICAgICAgICAgICAgaWYgaWRlcGVuZGlkID09IHRhcmdldGlkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxfZm5pZChzZWxmLnRhc2tzX2ZuaWRbdGFza2lkXSwgbWlzc2luZ19saXN0KQorCisgICAgZGVmIGFkZF91bnJlc29sdmVkKHNlbGYsIGNmZ0RhdGEsIGRhdGFDYWNoZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXNvbHZlIGFsbCB1bnJlc29sdmVkIGJ1aWxkIGFuZCBydW50aW1lIHRhcmdldHMKKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dlci5pbmZvKCJSZXNvbHZpbmcgYW55IG1pc3NpbmcgdGFzayBxdWV1ZSBkZXBlbmRlbmNpZXMiKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgYWRkZWQgPSAwCisgICAgICAgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuZ2V0X3VucmVzb2x2ZWRfYnVpbGRfdGFyZ2V0cyhkYXRhQ2FjaGUpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfcHJvdmlkZXJfaW50ZXJuYWwoY2ZnRGF0YSwgZGF0YUNhY2hlLCB0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gYWRkZWQgKyAxCisgICAgICAgICAgICAgICAgZXhjZXB0IGJiLnByb3ZpZGVycy5Ob1Byb3ZpZGVyOgorICAgICAgICAgICAgICAgICAgICB0YXJnZXRpZCA9IHNlbGYuZ2V0YnVpbGRfaWQodGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmFib3J0IGFuZCB0YXJnZXRpZCBpbiBzZWxmLmV4dGVybmFsX3RhcmdldHMgYW5kIG5vdCBzZWxmLmFsbG93aW5jb21wbGV0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFsbG93aW5jb21wbGV0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlX2J1aWxkdGFyZ2V0KHRhcmdldGlkKQorICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLmdldF91bnJlc29sdmVkX3J1bl90YXJnZXRzKGRhdGFDYWNoZSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9ycHJvdmlkZXIoY2ZnRGF0YSwgZGF0YUNhY2hlLCB0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gYWRkZWQgKyAxCisgICAgICAgICAgICAgICAgZXhjZXB0IChiYi5wcm92aWRlcnMuTm9SUHJvdmlkZXIsIGJiLnByb3ZpZGVycy5NdWx0aXBsZVJQcm92aWRlcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlX3J1bnRhcmdldChzZWxmLmdldHJ1bl9pZCh0YXJnZXQpKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJSZXNvbHZlZCAiICsgc3RyKGFkZGVkKSArICIgZXh0cmEgZGVwZW5kZW5jaWVzIikKKyAgICAgICAgICAgIGlmIGFkZGVkID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIyBzZWxmLmR1bXBfZGF0YSgpCisKKyAgICBkZWYgZHVtcF9kYXRhKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgRHVtcCBzb21lIGRlYnVnIGluZm9ybWF0aW9uIG9uIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiYnVpbGRfbmFtZXM6IikKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICIsICIuam9pbihzZWxmLmJ1aWxkX25hbWVzX2luZGV4KSkKKworICAgICAgICBsb2dnZXIuZGVidWcoMywgInJ1bl9uYW1lczoiKQorICAgICAgICBsb2dnZXIuZGVidWcoMywgIiwgIi5qb2luKHNlbGYucnVuX25hbWVzX2luZGV4KSkKKworICAgICAgICBsb2dnZXIuZGVidWcoMywgImJ1aWxkX3RhcmdldHM6IikKKyAgICAgICAgZm9yIGJ1aWxkaWQgaW4geHJhbmdlKGxlbihzZWxmLmJ1aWxkX25hbWVzX2luZGV4KSk6CisgICAgICAgICAgICB0YXJnZXQgPSBzZWxmLmJ1aWxkX25hbWVzX2luZGV4W2J1aWxkaWRdCisgICAgICAgICAgICB0YXJnZXRzID0gIk5vbmUiCisgICAgICAgICAgICBpZiBidWlsZGlkIGluIHNlbGYuYnVpbGRfdGFyZ2V0czoKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0gc2VsZi5idWlsZF90YXJnZXRzW2J1aWxkaWRdCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMywgIiAoJXMpJXM6ICVzIiwgYnVpbGRpZCwgdGFyZ2V0LCB0YXJnZXRzKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAicnVuX3RhcmdldHM6IikKKyAgICAgICAgZm9yIHJ1bmlkIGluIHhyYW5nZShsZW4oc2VsZi5ydW5fbmFtZXNfaW5kZXgpKToKKyAgICAgICAgICAgIHRhcmdldCA9IHNlbGYucnVuX25hbWVzX2luZGV4W3J1bmlkXQorICAgICAgICAgICAgdGFyZ2V0cyA9ICJOb25lIgorICAgICAgICAgICAgaWYgcnVuaWQgaW4gc2VsZi5ydW5fdGFyZ2V0czoKKyAgICAgICAgICAgICAgICB0YXJnZXRzID0gc2VsZi5ydW5fdGFyZ2V0c1tydW5pZF0KKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiICglcyklczogJXMiLCBydW5pZCwgdGFyZ2V0LCB0YXJnZXRzKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAidGFza3M6IikKKyAgICAgICAgZm9yIHRhc2sgaW4geHJhbmdlKGxlbihzZWxmLnRhc2tzX25hbWUpKToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiICglcyklcyAtICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm5faW5kZXhbc2VsZi50YXNrc19mbmlkW3Rhc2tdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YXNrc19uYW1lW3Rhc2tdLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhc2tzX3RkZXBlbmRzW3Rhc2tdKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygzLCAiZGVwZW5kZW5jeSBpZHMgKHBlciBmbik6IikKKyAgICAgICAgZm9yIGZuaWQgaW4gc2VsZi5kZXBpZHM6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMywgIiAlcyAlczogJXMiLCBmbmlkLCBzZWxmLmZuX2luZGV4W2ZuaWRdLCBzZWxmLmRlcGlkc1tmbmlkXSkKKworICAgICAgICBsb2dnZXIuZGVidWcoMywgInJ1bnRpbWUgZGVwZW5kZW5jeSBpZHMgKHBlciBmbik6IikKKyAgICAgICAgZm9yIGZuaWQgaW4gc2VsZi5yZGVwaWRzOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDMsICIgJXMgJXM6ICVzIiwgZm5pZCwgc2VsZi5mbl9pbmRleFtmbmlkXSwgc2VsZi5yZGVwaWRzW2ZuaWRdKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdGVzdHMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Rlc3RzL2NvZGVwYXJzZXIucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9jb2RlcGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTRiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9jb2RlcGFyc2VyLnB5CkBAIC0wLDAgKzEsMzc1IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRlc3QgZm9yIGNvZGVwYXJzZXIucHkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIENocmlzIExhcnNvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignQml0QmFrZS5UZXN0Q29kZVBhcnNlcicpCisKKyMgYmIuZGF0YSByZWZlcmVuY2VzIGJiLnBhcnNlIGJ1dCBjYW4ndCBkaXJlY3RseSBpbXBvcnQgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4KKyMgSGFjayBhcm91bmQgaXQgZm9yIG5vdyA6KCAKK2ltcG9ydCBiYi5wYXJzZQoraW1wb3J0IGJiLmRhdGEKKworY2xhc3MgUmVmZXJlbmNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorCisgICAgZGVmIHNldEVtcHR5VmFycyhzZWxmLCB2YXJsaXN0KToKKyAgICAgICAgZm9yIGsgaW4gdmFybGlzdDoKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoaywgIiIpCisKKyAgICBkZWYgc2V0VmFsdWVzKHNlbGYsIHZhbHVlcyk6CisgICAgICAgIGZvciBrLCB2IGluIHZhbHVlcy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5kLnNldFZhcihrLCB2KQorCisgICAgZGVmIGFzc2VydFJlZmVyZW5jZXMoc2VsZiwgcmVmcyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWZlcmVuY2VzLCByZWZzKQorCisgICAgZGVmIGFzc2VydEV4ZWNzKHNlbGYsIGV4ZWNzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmV4ZWNzLCBleGVjcykKKworY2xhc3MgVmFyaWFibGVSZWZlcmVuY2VUZXN0KFJlZmVyZW5jZVRlc3QpOgorCisgICAgZGVmIHBhcnNlRXhwcmVzc2lvbihzZWxmLCBleHApOgorICAgICAgICBwYXJzZWR2YXIgPSBzZWxmLmQuZXhwYW5kV2l0aFJlZnMoZXhwLCBOb25lKQorICAgICAgICBzZWxmLnJlZmVyZW5jZXMgPSBwYXJzZWR2YXIucmVmZXJlbmNlcworCisgICAgZGVmIHRlc3Rfc2ltcGxlX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnMoWyJGT08iXSkKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiR7Rk9PfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJGT08iXSkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbIkJBUiJdKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiQkFSIikKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiR7JHtGT099fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJGT08iLCAiQkFSIl0pKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnMoWyJCQVIiXSkKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiR7QGJiLmRhdGEuZ2V0VmFyKCdCQVInLCBkLCBUcnVlKSArICdmb28nfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJCQVIiXSkpCisKK2NsYXNzIFNoZWxsUmVmZXJlbmNlVGVzdChSZWZlcmVuY2VUZXN0KToKKworICAgIGRlZiBwYXJzZUV4cHJlc3Npb24oc2VsZiwgZXhwKToKKyAgICAgICAgcGFyc2VkdmFyID0gc2VsZi5kLmV4cGFuZFdpdGhSZWZzKGV4cCwgTm9uZSkKKyAgICAgICAgcGFyc2VyID0gYmIuY29kZXBhcnNlci5TaGVsbFBhcnNlcigiUGFyc2VyVGVzdCIsIGxvZ2dlcikKKyAgICAgICAgcGFyc2VyLnBhcnNlX3NoZWxsKHBhcnNlZHZhci52YWx1ZSkKKworICAgICAgICBzZWxmLnJlZmVyZW5jZXMgPSBwYXJzZWR2YXIucmVmZXJlbmNlcworICAgICAgICBzZWxmLmV4ZWNzID0gcGFyc2VyLmV4ZWNzCisKKyAgICBkZWYgdGVzdF9xdW90ZXNfaW5zaWRlX2Fzc2lnbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oJ2Zvbz1mb28iYmFyImJheicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoW10pKQorCisgICAgZGVmIHRlc3RfcXVvdGVzX2luc2lkZV9hcmcoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCdzZWQgcyMiYmFyIGJheiIjImFscGhhIGJldGEiI2cnKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInNlZCJdKSkKKworICAgIGRlZiB0ZXN0X2FyZ19jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJzZWQgLWkgLWUgcyxmb28sYmFyLGcgXFxcbiAqLnBjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJzZWQiXSkpCisKKyAgICBkZWYgdGVzdF9kb2xsYXJfaW5fcXVvdGVkKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbignc2VkIC1pIC1lICJmb28kIiAqLnBjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJzZWQiXSkpCisKKyAgICBkZWYgdGVzdF9xdW90ZXNfaW5zaWRlX2FyZ19jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKFsiYmluZGlyIiwgIkQiLCAibGliZGlyIl0pCisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCIiIgorc2VkIC1pIC1lIHMjIm1vY19sb2NhdGlvbj0uKiQiIyJtb2NfbG9jYXRpb249JHtiaW5kaXJ9L21vYzQiIyBcXAorLWUgcyMidWljX2xvY2F0aW9uPS4qJCIjInVpY19sb2NhdGlvbj0ke2JpbmRpcn0vdWljNCIjIFxcCiske0R9JHtsaWJkaXJ9L3BrZ2NvbmZpZy8qLnBjCisiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJiaW5kaXIiLCAiRCIsICJsaWJkaXIiXSkpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fc3Vic2hlbGxfZXhwYW5zaW9uKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiZm9vPSQoZWNobyBiYXIpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJlY2hvIl0pKQorCisgICAgZGVmIHRlc3Rfc2hlbGxfdW5leHBhbmRlZChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnMoWyJRVF9CQVNFX05BTUUiXSkKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oJ2VjaG8gIiR7UVRfQkFTRV9OQU1FfSInKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImVjaG8iXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJRVF9CQVNFX05BTUUiXSkpCisKKyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX3ZhcmV4cF9zaW5nbGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigic2VkIC1pIC1lICdzOklQezpJJHs6ZycgJHBjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJzZWQiXSkpCisKKworICAgIGRlZiB0ZXN0X3VudGlsKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigidW50aWwgZmFsc2U7IGRvIGVjaG8gdHJ1ZTsgZG9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsiZmFsc2UiLCAiZWNobyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldCgpKQorCisgICAgZGVmIHRlc3RfY2FzZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiIiCitjYXNlICRmb28gaW4KKyopCitiYXIKKzs7Citlc2FjCisiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsiYmFyIl0pKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KCkpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fZXhlYyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oImE9YiBjPSdmb28gYmFyJyBhbHBoYSAxIDIgMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsiYWxwaGEiXSkpCisKKyAgICBkZWYgdGVzdF9yZWRpcmVjdF90b19maWxlKHNlbGYpOgorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbImZvbyJdKQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiZWNobyBmb28gPiR7Zm9vfS9iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImVjaG8iXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJmb28iXSkpCisKKyAgICBkZWYgdGVzdF9oZXJlZG9jKHNlbGYpOgorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbInRoZXRhIl0pCisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCIiIgorY2F0IDw8RU5ECithbHBoYQorYmV0YQorJHt0aGV0YX0KK0VORAorIiIiKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KFsidGhldGEiXSkpCisKKyAgICBkZWYgdGVzdF9yZWRpcmVjdF9mcm9tX2hlcmVkb2Moc2VsZik6CisgICAgICAgIHYgPSBbIkIiLCAiU0hBRE9XX01BSUxESVIiLCAiU0hBRE9XX01BSUxGSUxFIiwgIlNIQURPV19VVE1QRElSIiwgIlNIQURPV19MT0dESVIiLCAiYmluZGlyIl0KKyAgICAgICAgc2VsZi5zZXRFbXB0eVZhcnModikKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oIiIiCitjYXQgPDxFTkQgPiR7Qn0vY2FjaGVkcGF0aHMKK3NoYWRvd19jdl9tYWlsZGlyPSR7U0hBRE9XX01BSUxESVJ9CitzaGFkb3dfY3ZfbWFpbGZpbGU9JHtTSEFET1dfTUFJTEZJTEV9CitzaGFkb3dfY3ZfdXRtcGRpcj0ke1NIQURPV19VVE1QRElSfQorc2hhZG93X2N2X2xvZ2Rpcj0ke1NIQURPV19MT0dESVJ9CitzaGFkb3dfY3ZfcGFzc3dkX2Rpcj0ke2JpbmRpcn0KK0VORAorIiIiKQorICAgICAgICBzZWxmLmFzc2VydFJlZmVyZW5jZXMoc2V0KHYpKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbImNhdCJdKSkKKworIyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX2NvbW1hbmRfZXhwYW5zaW9uKHNlbGYpOgorIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmVmdHJhY2tlci5TaGVsbFN5bnRheEVycm9yLCByZWZ0cmFja2VyLmV4ZWNzLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmJ2YWx1ZS5zaHBhcnNlKCJjcCBmb29gIiwgc2VsZi5kKSwgc2VsZi5kKQorCisjICAgIGRlZiB0ZXN0X3JvZ3VlX2RvbGxhcnNpZ24oc2VsZik6CisjICAgICAgICBzZWxmLnNldFZhbHVlcyh7IkQiIDogIi90bXAifSkKKyMgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJpbnN0YWxsIC1kICR7RH0kIikKKyMgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoWyJEIl0pKQorIyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJpbnN0YWxsIl0pKQorCisKK2NsYXNzIFB5dGhvblJlZmVyZW5jZVRlc3QoUmVmZXJlbmNlVGVzdCk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIGlmIGhhc2F0dHIoYmIudXRpbHMsICJfY29udGV4dCIpOgorICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gYmIudXRpbHMuX2NvbnRleHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gX19idWlsdGluX18uX19kaWN0X18KKworICAgIGRlZiBwYXJzZUV4cHJlc3Npb24oc2VsZiwgZXhwKToKKyAgICAgICAgcGFyc2VkdmFyID0gc2VsZi5kLmV4cGFuZFdpdGhSZWZzKGV4cCwgTm9uZSkKKyAgICAgICAgcGFyc2VyID0gYmIuY29kZXBhcnNlci5QeXRob25QYXJzZXIoIlBhcnNlclRlc3QiLCBsb2dnZXIpCisgICAgICAgIHBhcnNlci5wYXJzZV9weXRob24ocGFyc2VkdmFyLnZhbHVlKQorCisgICAgICAgIHNlbGYucmVmZXJlbmNlcyA9IHBhcnNlZHZhci5yZWZlcmVuY2VzIHwgcGFyc2VyLnJlZmVyZW5jZXMKKyAgICAgICAgc2VsZi5leGVjcyA9IHBhcnNlci5leGVjcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBpbmRlbnQodmFsdWUpOgorICAgICAgICAiIiJQeXRob24gU25pcHBldHMgaGF2ZSB0byBiZSBpbmRlbnRlZCwgcHl0aG9uIHZhbHVlcyBkb24ndCBoYXZlIHRvCitiZS4gVGhlc2UgdW5pdCB0ZXN0cyBhcmUgdGVzdGluZyBzbmlwcGV0cy4iIiIKKyAgICAgICAgcmV0dXJuICIgIiArIHZhbHVlCisKKyAgICBkZWYgdGVzdF9nZXR2YXJfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiYmIuZGF0YS5nZXRWYXIoJ2ZvbycsIGQsIFRydWUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbImZvbyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoKSkKKworICAgIGRlZiB0ZXN0X2dldHZhcl9jb21wdXRlZF9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJiYi5kYXRhLmdldFZhcignZicgKyAnbycgKyAnbycsIGQsIFRydWUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldCgpKQorCisgICAgZGVmIHRlc3RfZ2V0dmFyX2V4ZWNfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigiZXZhbCgnYmIuZGF0YS5nZXRWYXIoXCJmb29cIiwgZCwgVHJ1ZSknKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJldmFsIl0pKQorCisgICAgZGVmIHRlc3RfdmFyX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0WyJmb28iXSA9IGxhbWJkYSB4OiB4CisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKFsiRk9PIl0pCisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJmb28oJyR7Rk9PfScpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIkZPTyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJmb28iXSkpCisgICAgICAgIGRlbCBzZWxmLmNvbnRleHRbImZvbyJdCisKKyAgICBkZWYgdGVzdF92YXJfZXhlYyhzZWxmKToKKyAgICAgICAgZm9yIGV0eXBlIGluICgiZnVuYyIsICJ0YXNrIik6CisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJkb19zb21ldGhpbmciLCAiZWNobyAnaGkgbW9tISAke0ZPT30nIikKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFnKCJkb19zb21ldGhpbmciLCBldHlwZSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJiYi5idWlsZC5leGVjX2Z1bmMoJ2RvX3NvbWV0aGluZycsIGQpIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmVmZXJlbmNlcyhzZXQoW10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJkb19zb21ldGhpbmciXSkpCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbl9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dFsidGVzdGZ1bmMiXSA9IGxhbWJkYSBtc2c6IGJiLm1zZy5ub3RlKDEsIE5vbmUsIG1zZykKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgIkhlbGxvLCBXb3JsZCEiKQorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigidGVzdGZ1bmMoJyR7Rk9PfScpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWZlcmVuY2VzKHNldChbIkZPTyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJ0ZXN0ZnVuYyJdKSkKKyAgICAgICAgZGVsIHNlbGYuY29udGV4dFsidGVzdGZ1bmMiXQorCisgICAgZGVmIHRlc3RfcXVhbGlmaWVkX2Z1bmN0aW9uX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZUV4cHJlc3Npb24oInRpbWUudGltZSgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFeGVjcyhzZXQoWyJ0aW1lLnRpbWUiXSkpCisKKyAgICBkZWYgdGVzdF9xdWFsaWZpZWRfZnVuY3Rpb25fcmVmZXJlbmNlXzIoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VFeHByZXNzaW9uKCJvcy5wYXRoLmRpcm5hbWUoJy9mb28vYmFyJykiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbIm9zLnBhdGguZGlybmFtZSJdKSkKKworICAgIGRlZiB0ZXN0X3F1YWxpZmllZF9mdW5jdGlvbl9yZWZlcmVuY2VfbmVzdGVkKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigidGltZS5zdHJmdGltZSgnJVklbSVkJyx0aW1lLmdtdGltZSgpKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXhlY3Moc2V0KFsidGltZS5zdHJmdGltZSIsICJ0aW1lLmdtdGltZSJdKSkKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9uX3JlZmVyZW5jZV9jaGFpbmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHRbInRlc3RnZXQiXSA9IGxhbWJkYTogIlx0c3RyaXAgbWUgIgorICAgICAgICBzZWxmLnBhcnNlRXhwcmVzc2lvbigidGVzdGdldCgpLnN0cmlwKCkiKQorICAgICAgICBzZWxmLmFzc2VydEV4ZWNzKHNldChbInRlc3RnZXQiXSkpCisgICAgICAgIGRlbCBzZWxmLmNvbnRleHRbInRlc3RnZXQiXQorCisKK2NsYXNzIERlcGVuZGVuY3lSZWZlcmVuY2VUZXN0KFJlZmVyZW5jZVRlc3QpOgorCisgICAgcHlkYXRhID0gIiIiCitiYi5kYXRhLmdldFZhcignc29tZXZhcicsIGQsIFRydWUpCitkZWYgdGVzdChkKToKKyAgICBmb28gPSAnYmFyICVzJyAlICdmb28nCitkZWYgdGVzdDIoZCk6CisgICAgZC5nZXRWYXIoZm9vLCBUcnVlKQorICAgIGQuZ2V0VmFyKCdiYXInLCBGYWxzZSkKKyAgICB0ZXN0MihkKQorCitkZWYgYSgpOgorICAgIFwiXCJcInNvbWUKKyAgICBzdHVmZgorICAgIFwiXCJcIgorICAgIHJldHVybiAiaGVoIgorCit0ZXN0KGQpCisKK2JiLmRhdGEuZXhwYW5kKGJiLmRhdGEuZ2V0VmFyKCJzb21ldGhpbmciLCBGYWxzZSwgZCksIGQpCitiYi5kYXRhLmV4cGFuZCgiJHtpbmV4cGFuZH0gc29tZXRoaW5nZWxzZSIsIGQpCitiYi5kYXRhLmdldFZhcihhKCksIGQsIEZhbHNlKQorIiIiCisKKyAgICBkZWYgdGVzdF9weXRob24oc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsIHNlbGYucHlkYXRhKQorICAgICAgICBzZWxmLnNldEVtcHR5VmFycyhbImluZXhwYW5kIiwgImEiLCAidGVzdDIiLCAidGVzdCJdKQorICAgICAgICBzZWxmLmQuc2V0VmFyRmxhZ3MoIkZPTyIsIHsiZnVuYyI6IFRydWUsICJweXRob24iOiBUcnVlfSkKKworICAgICAgICBkZXBzLCB2YWx1ZXMgPSBiYi5kYXRhLmJ1aWxkX2RlcGVuZGVuY2llcygiRk9PIiwgc2V0KHNlbGYuZC5rZXlzKCkpLCBzZXQoKSwgc2V0KCksIHNlbGYuZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZXBzLCBzZXQoWyJzb21ldmFyIiwgImJhciIsICJzb21ldGhpbmciLCAiaW5leHBhbmQiLCAidGVzdCIsICJ0ZXN0MiIsICJhIl0pKQorCisKKyAgICBzaGVsbGRhdGEgPSAiIiIKK2ZvbyAoKSB7CitiYXIKK30KK3sKK2VjaG8gYmF6CiskKGhlaCkKK2V2YWwgYG1vb2AKK30KK2E9YgorYz1kCisoCit0cnVlICYmIGZhbHNlCit0ZXN0IC1mIGZvbwordGVzdHZhbD1zb21ldGhpbmcKKyR0ZXN0dmFsCispIHx8IGFpZWUKKyEgaW52ZXJ0ZWQKK2VjaG8gJHtzb21ldmFyfQorCitjYXNlIGZvbyBpbgorYmFyKQorZWNobyBiYXIKKzs7CitiYXopCitlY2hvIGJhegorOzsKK2ZvbyopCitlY2hvIGZvbworOzsKK2VzYWMKKyIiIgorCisgICAgZGVmIHRlc3Rfc2hlbGwoc2VsZik6CisgICAgICAgIGV4ZWNzID0gWyJiYXIiLCAiZWNobyIsICJoZWgiLCAibW9vIiwgInRydWUiLCAiYWllZSJdCisgICAgICAgIHNlbGYuZC5zZXRWYXIoInNvbWV2YXIiLCAiaGVoIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiaW52ZXJ0ZWQiLCAiZWNobyBpbnZlcnRlZC4uLiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFnKCJpbnZlcnRlZCIsICJmdW5jIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgc2VsZi5zaGVsbGRhdGEpCisgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFncygiRk9PIiwgeyJmdW5jIjogVHJ1ZX0pCisgICAgICAgIHNlbGYuc2V0RW1wdHlWYXJzKGV4ZWNzKQorCisgICAgICAgIGRlcHMsIHZhbHVlcyA9IGJiLmRhdGEuYnVpbGRfZGVwZW5kZW5jaWVzKCJGT08iLCBzZXQoc2VsZi5kLmtleXMoKSksIHNldCgpLCBzZXQoKSwgc2VsZi5kKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlcHMsIHNldChbInNvbWV2YXIiLCAiaW52ZXJ0ZWQiXSArIGV4ZWNzKSkKKworCisgICAgZGVmIHRlc3RfdmFyZGVwcyhzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigib2VfbGliaW5zdGFsbCIsICJlY2hvIHRlc3QiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiZm9vPW9lX2xpYmluc3RhbGw7IGV2YWwgJGZvbyIpCisgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFnKCJGT08iLCAidmFyZGVwcyIsICJvZV9saWJpbnN0YWxsIikKKworICAgICAgICBkZXBzLCB2YWx1ZXMgPSBiYi5kYXRhLmJ1aWxkX2RlcGVuZGVuY2llcygiRk9PIiwgc2V0KHNlbGYuZC5rZXlzKCkpLCBzZXQoKSwgc2V0KCksIHNlbGYuZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZXBzLCBzZXQoWyJvZV9saWJpbnN0YWxsIl0pKQorCisgICAgZGVmIHRlc3RfdmFyZGVwc19leHBhbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIm9lX2xpYmluc3RhbGwiLCAiZWNobyB0ZXN0IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgImZvbz1vZV9saWJpbnN0YWxsOyBldmFsICRmb28iKQorICAgICAgICBzZWxmLmQuc2V0VmFyRmxhZygiRk9PIiwgInZhcmRlcHMiLCAiJHtAJ29lX2xpYmluc3RhbGwnfSIpCisKKyAgICAgICAgZGVwcywgdmFsdWVzID0gYmIuZGF0YS5idWlsZF9kZXBlbmRlbmNpZXMoIkZPTyIsIHNldChzZWxmLmQua2V5cygpKSwgc2V0KCksIHNldCgpLCBzZWxmLmQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVwcywgc2V0KFsib2VfbGliaW5zdGFsbCJdKSkKKworICAgICNDdXJyZW50bHkgbm8gd2lsZGNhcmQgc3VwcG9ydAorICAgICNkZWYgdGVzdF92YXJkZXBzX3dpbGRjYXJkcyhzZWxmKToKKyAgICAjICAgIHNlbGYuZC5zZXRWYXIoIm9lX2xpYmluc3RhbGwiLCAiZWNobyB0ZXN0IikKKyAgICAjICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICJmb289b2VfbGliaW5zdGFsbDsgZXZhbCAkZm9vIikKKyAgICAjICAgIHNlbGYuZC5zZXRWYXJGbGFnKCJGT08iLCAidmFyZGVwcyIsICJvZV8qIikKKyAgICAjICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlcHMsIHNldChbIm9lX2xpYmluc3RhbGwiXSkpCisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvY293LnB5IGIvYml0YmFrZS9saWIvYmIvdGVzdHMvY293LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzU4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9jb3cucHkKQEAgLTAsMCArMSwxMzYgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVGVzdHMgZm9yIENvcHktb24tV3JpdGUgKGNvdy5weSkKKyMKKyMgQ29weXJpZ2h0IDIwMDYgSG9sZ2VyIEZyZXl0aGVyIDxmcmV5dGhlckBoYW5kaGVsZHMub3JnPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKKworY2xhc3MgQ09XVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgY2FzZSBmb3IgdGhlIENPVyBtb2R1bGUgZnJvbSBtaXRocm8KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0R2V0U2V0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCBhbmQgc2V0CisgICAgICAgICIiIgorICAgICAgICBmcm9tIGJiLkNPVyBpbXBvcnQgQ09XRGljdEJhc2UKKyAgICAgICAgYSA9IENPV0RpY3RCYXNlLmNvcHkoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBhLmhhc19rZXkoJ2EnKSkKKworICAgICAgICBhWydhJ10gPSAnYScKKyAgICAgICAgYVsnYiddID0gJ2InCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIGEuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhUcnVlLCBhLmhhc19rZXkoJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2EnLCBhWydhJ10gKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYicsIGFbJ2InXSApCisKKyAgICBkZWYgdGVzdENvcHlDb3B5KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGUgY29weSBvZiBjb3BpZXMKKyAgICAgICAgIiIiCisKKyAgICAgICAgZnJvbSBiYi5DT1cgaW1wb3J0IENPV0RpY3RCYXNlCisKKyAgICAgICAgIyBjcmVhdGUgdHdvIENPVyBkaWN0ICdpbnN0YW5jZXMnCisgICAgICAgIGIgPSBDT1dEaWN0QmFzZS5jb3B5KCkKKyAgICAgICAgYyA9IENPV0RpY3RCYXNlLmNvcHkoKQorCisgICAgICAgICMgYXNzaWduIHNvbWUga2V5cyB0byBvbmUgaW5zdGFuY2UsIHNvbWUga2V5cyB0byBhbm90aGVyCisgICAgICAgIGJbJ2EnXSA9IDEwCisgICAgICAgIGJbJ2MnXSA9IDIwCisgICAgICAgIGNbJ2EnXSA9IDMwCisKKyAgICAgICAgIyB0ZXN0IHNlcGFyYXRpb24gb2YgdGhlIHR3byBpbnN0YW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGMuaGFzX2tleSgnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygzMCwgY1snYSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxMCwgYlsnYSddKQorCisgICAgICAgICMgdGVzdCBjb3B5CisgICAgICAgIGJfMiA9IGIuY29weSgpCisgICAgICAgIGNfMiA9IGMuY29weSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGNfMi5oYXNfa2V5KCdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEwLCBiXzJbJ2EnXSkKKworICAgICAgICBiXzJbJ2QnXSA9IDQwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBjXzIuaGFzX2tleSgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhUcnVlLCBiXzIuaGFzX2tleSgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0MCwgYl8yWydkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBiLmhhc19rZXkoJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGMuaGFzX2tleSgnZCcpKQorCisgICAgICAgIGNfMlsnZCddID0gMzAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoVHJ1ZSwgY18yLmhhc19rZXkoJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoVHJ1ZSwgYl8yLmhhc19rZXkoJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMzAsIGNfMlsnZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0MCwgYl8yWydkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBiLmhhc19rZXkoJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGMuaGFzX2tleSgnZCcpKQorCisgICAgICAgICMgdGVzdCBjb3B5IG9mIHRoZSBjb3B5CisgICAgICAgIGNfMyA9IGNfMi5jb3B5KCkKKyAgICAgICAgYl8zID0gYl8yLmNvcHkoKQorICAgICAgICBiXzNfMiA9IGJfMi5jb3B5KCkKKworICAgICAgICBjXzNbJ2UnXSA9IDQ3MTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNDcxMSwgY18zWydlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBjXzIuaGFzX2tleSgnZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYl8zLmhhc19rZXkoJ2UnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGJfM18yLmhhc19rZXkoJ2UnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoRmFsc2UsIGJfMi5oYXNfa2V5KCdlJykpCisKKyAgICAgICAgYl8zWydlJ10gPSAndmllbCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3ZpZWwnLCBiXzNbJ2UnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNDcxMSwgY18zWydlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBjXzIuaGFzX2tleSgnZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhUcnVlLCBiXzMuaGFzX2tleSgnZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYl8zXzIuaGFzX2tleSgnZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhGYWxzZSwgYl8yLmhhc19rZXkoJ2UnKSkKKworICAgIGRlZiB0ZXN0Q293KHNlbGYpOgorICAgICAgICBmcm9tIGJiLkNPVyBpbXBvcnQgQ09XRGljdEJhc2UKKyAgICAgICAgYyA9IENPV0RpY3RCYXNlLmNvcHkoKQorICAgICAgICBjWycxMjMnXSA9IDEwMjcKKyAgICAgICAgY1snb3RoZXInXSA9IDQ3MTEKKyAgICAgICAgY1snZCddID0geyAnYWJjJyA6IDEwLCAnYmNkJyA6IDIwIH0KKworICAgICAgICBjb3B5ID0gYy5jb3B5KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxMDI3LCBjWycxMjMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNDcxMSwgY1snb3RoZXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeydhYmMnOjEwLCAnYmNkJzoyMH0sIGNbJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMTAyNywgY29weVsnMTIzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDQ3MTEsIGNvcHlbJ290aGVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHsnYWJjJzoxMCwgJ2JjZCc6MjB9LCBjb3B5WydkJ10pCisKKyAgICAgICAgIyBjb3cgaXQgbm93CisgICAgICAgIGNvcHlbJzEyMyddID0gMTAyOAorICAgICAgICBjb3B5WydvdGhlciddID0gNDcxMgorICAgICAgICBjb3B5WydkJ11bJ2FiYyddID0gMjAKKworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEwMjcsIGNbJzEyMyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0NzExLCBjWydvdGhlciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh7J2FiYyc6MTAsICdiY2QnOjIwfSwgY1snZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxMDI4LCBjb3B5WycxMjMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNDcxMiwgY29weVsnb3RoZXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeydhYmMnOjIwLCAnYmNkJzoyMH0sIGNvcHlbJ2QnXSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Rlc3RzL2RhdGEucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9kYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWFiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9kYXRhLnB5CkBAIC0wLDAgKzEsNDQxIEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRlc3RzIGZvciB0aGUgRGF0YSBTdG9yZSAoZGF0YS5weS9kYXRhX3NtYXJ0LnB5KQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXMgTGFyc29uCisjIENvcHlyaWdodCAoQykgMjAxMiBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgYmIKK2ltcG9ydCBiYi5kYXRhCitpbXBvcnQgYmIucGFyc2UKK2ltcG9ydCBsb2dnaW5nCisKK2NsYXNzIExvZ1JlY29yZCgpOgorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIGxvZ3MgPSBbXQorICAgICAgICBjbGFzcyBMb2dIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CisgICAgICAgICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAgICAgICAgIGxvZ3MuYXBwZW5kKHJlY29yZCkKKyAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQorICAgICAgICBoYW5kbGVyID0gTG9nSGFuZGxlcigpCisgICAgICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKKyAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKyAgICAgICAgcmV0dXJuIGxvZ3MKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlIikKKyAgICAgICAgbG9nZ2VyLnJlbW92ZUhhbmRsZXIoc2VsZi5oYW5kbGVyKQorICAgICAgICByZXR1cm4KKworZGVmIGxvZ0NvbnRhaW5zKGl0ZW0sIGxvZ3MpOgorICAgIGZvciBsIGluIGxvZ3M6CisgICAgICAgIG0gPSBsLmdldE1lc3NhZ2UoKQorICAgICAgICBpZiBpdGVtIGluIG06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBEYXRhRXhwYW5zaW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmRbImZvbyJdID0gInZhbHVlX29mX2ZvbyIKKyAgICAgICAgc2VsZi5kWyJiYXIiXSA9ICJ2YWx1ZV9vZl9iYXIiCisgICAgICAgIHNlbGYuZFsidmFsdWVfb2ZfZm9vIl0gPSAidmFsdWVfb2ZfJ3ZhbHVlX29mX2ZvbyciCisKKyAgICBkZWYgdGVzdF9vbmVfdmFyKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke2Zvb30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAidmFsdWVfb2ZfZm9vIikKKworICAgIGRlZiB0ZXN0X2luZGlyZWN0X29uZV92YXIoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7JHtmb299fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJ2YWx1ZV9vZl8ndmFsdWVfb2ZfZm9vJyIpCisKKyAgICBkZWYgdGVzdF9pbmRpcmVjdF9hbmRfYW5vdGhlcihzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHske2Zvb319ICR7YmFyfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJ2YWx1ZV9vZl8ndmFsdWVfb2ZfZm9vJyB2YWx1ZV9vZl9iYXIiKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3NuaXBwZXQoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7QDUqMTJ9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIjYwIikKKworICAgIGRlZiB0ZXN0X2V4cGFuZF9pbl9weXRob25fc25pcHBldChzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHtAJ2JvbyAnICsgJyR7Zm9vfSd9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgImJvbyB2YWx1ZV9vZl9mb28iKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3NuaXBwZXRfZ2V0dmFyKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke0BkLmdldFZhcignZm9vJywgVHJ1ZSkgKyAnICR7YmFyfSd9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgInZhbHVlX29mX2ZvbyB2YWx1ZV9vZl9iYXIiKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3NuaXBwZXRfc3ludGF4X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiJHtAZm9vID0gNX0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yLCBzZWxmLmQuZ2V0VmFyLCAiRk9PIiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3B5dGhvbl9zbmlwcGV0X3J1bnRpbWVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICIke0BpbnQoJ3Rlc3QnKX0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yLCBzZWxmLmQuZ2V0VmFyLCAiRk9PIiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3B5dGhvbl9zbmlwcGV0X2Vycm9yX3BhdGgoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICJmb28gdmFsdWUgJHtCQVJ9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiQkFSIiwgImJhciB2YWx1ZSAke0BpbnQoJ3Rlc3QnKX0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yLCBzZWxmLmQuZ2V0VmFyLCAiRk9PIiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3ZhbHVlX2NvbnRhaW5pbmdfdmFsdWUoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7QGQuZ2V0VmFyKCdmb28nLCBUcnVlKSArICcgJHtiYXJ9J30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAidmFsdWVfb2ZfZm9vIHZhbHVlX29mX2JhciIpCisKKyAgICBkZWYgdGVzdF9yZWZlcmVuY2VfdW5kZWZpbmVkX3ZhcihzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHt1bmRlZmluZWR2YXJ9IG1laCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICIke3VuZGVmaW5lZHZhcn0gbWVoIikKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBUiIsICJiYXIgdmFsdWUiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiJHtCQVJ9IGZvbyAke0JBUn0iKQorICAgICAgICB2YWwgPSBzZWxmLmQuZ2V0VmFyKCJGT08iLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2YWwpLCAiYmFyIHZhbHVlIGZvbyBiYXIgdmFsdWUiKQorCisgICAgZGVmIHRlc3RfZGlyZWN0X3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgIiR7Rk9PfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmRhdGFfc21hcnQuRXhwYW5zaW9uRXJyb3IsIHNlbGYuZC5nZXRWYXIsICJGT08iLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaW5kaXJlY3RfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAiJHtCQVJ9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiQkFSIiwgIiR7QkFafSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBWiIsICIke0ZPT30iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi5kYXRhX3NtYXJ0LkV4cGFuc2lvbkVycm9yLCBzZWxmLmQuZ2V0VmFyLCAiRk9PIiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbl9leGNlcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICIke0JBUn0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiJHske0AnRk9PJ319IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYmIuZGF0YV9zbWFydC5FeHBhbnNpb25FcnJvciwgc2VsZi5kLmdldFZhciwgIkZPTyIsIFRydWUpCisKKyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX3ZhcmV4cF9zaW5nbGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJGT08iLCAic2VkIC1pIC1lICdzOklQezpJJHs6ZycgJHBjIikKKyAgICAgICAgdmFsID0gc2VsZi5kLmdldFZhcigiRk9PIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgInNlZCAtaSAtZSAnczpJUHs6SSR7OmcnICRwYyIpCisKKyAgICBkZWYgdGVzdF9ub25zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCA1KQorICAgICAgICB2YWwgPSBzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIjUiKQorCisgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmQucmVuYW1lVmFyKCJmb28iLCAibmV3Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJuZXdmb28iLCBGYWxzZSksICJ2YWx1ZV9vZl9mb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoImZvbyIsIEZhbHNlKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2RlbGV0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmQuZGVsVmFyKCJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoImZvbyIsIEZhbHNlKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2tleXMoc2VsZik6CisgICAgICAgIGtleXMgPSBzZWxmLmQua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgWyd2YWx1ZV9vZl9mb28nLCAnZm9vJywgJ2JhciddKQorCisgICAgZGVmIHRlc3Rfa2V5c19kZWxldGlvbihzZWxmKToKKyAgICAgICAgbmV3ZCA9IGJiLmRhdGEuY3JlYXRlQ29weShzZWxmLmQpCisgICAgICAgIG5ld2QuZGVsVmFyKCJiYXIiKQorICAgICAgICBrZXlzID0gbmV3ZC5rZXlzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXlzLCBbJ3ZhbHVlX29mX2ZvbycsICdmb28nXSkKKworY2xhc3MgVGVzdE5lc3RlZEV4cGFuc2lvbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgc2VsZi5kWyJmb28iXSA9ICJmb28iCisgICAgICAgIHNlbGYuZFsiYmFyIl0gPSAiYmFyIgorICAgICAgICBzZWxmLmRbInZhbHVlX29mX2Zvb2JhciJdID0gIjE4NyIKKworICAgIGRlZiB0ZXN0X3JlZnMoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7dmFsdWVfb2ZfJHtmb299JHtiYXJ9fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICIxODciKQorCisgICAgI2RlZiB0ZXN0X3B5dGhvbl9yZWZzKHNlbGYpOgorICAgICMgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHtAJHtAM30qKjIgKyAke0A0fSoqMn0iKQorICAgICMgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIjI1IikKKworICAgIGRlZiB0ZXN0X3JlZl9pbl9weXRob25fcmVmKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke0AnJHtmb299JyArICdiYXInfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJmb29iYXIiKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX3JlZl9pbl9yZWYoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYuZC5leHBhbmQoIiR7JHtAJ2YnKydvJysnbyd9fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJmb28iKQorCisgICAgZGVmIHRlc3RfZGVlcF9uZXN0aW5nKHNlbGYpOgorICAgICAgICBkZXB0aCA9IDEwMAorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIkeyIgKiBkZXB0aCArICJmb28iICsgIn0iICogZGVwdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICJmb28iKQorCisgICAgI2RlZiB0ZXN0X2RlZXBfcHl0aG9uX25lc3Rpbmcoc2VsZik6CisgICAgIyAgICBkZXB0aCA9IDUwCisgICAgIyAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIke0AiICogZGVwdGggKyAiMSIgKyAiKzF9IiAqIGRlcHRoKQorICAgICMgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgc3RyKGRlcHRoICsgMSkpCisKKyAgICBkZWYgdGVzdF9taXhlZChzZWxmKToKKyAgICAgICAgdmFsID0gc2VsZi5kLmV4cGFuZCgiJHt2YWx1ZV9vZl8ke0AoJyR7Zm9vfScrJ2JhcicpWzA6M119JHske0AnQkFSJy5sb3dlcigpfX19IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmFsKSwgIjE4NyIpCisKKyAgICBkZWYgdGVzdF9ydW50aW1lKHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLmQuZXhwYW5kKCIkeyR7QCd2YWx1ZV9vZicgKyAnX2YnKydvJysnbycrJ2InKydhJysncid9fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZhbCksICIxODciKQorCitjbGFzcyBUZXN0TWVtb2l6ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbWVtb2l6ZWQoc2VsZik6CisgICAgICAgIGQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBkLnNldFZhcigiRk9PIiwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmdldFZhcigiRk9PIiwgRmFsc2UpIGlzIGQuZ2V0VmFyKCJGT08iLCBGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9ub3RfbWVtb2l6ZWQoc2VsZik6CisgICAgICAgIGQxID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgZDIgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBkMS5zZXRWYXIoIkZPTyIsICJiYXIiKQorICAgICAgICBkMi5zZXRWYXIoIkZPTyIsICJiYXIyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxLmdldFZhcigiRk9PIiwgRmFsc2UpIGlzIG5vdCBkMi5nZXRWYXIoIkZPTyIsIEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X2NoYW5nZWRfYWZ0ZXJfbWVtb2l6ZWQoc2VsZik6CisgICAgICAgIGQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBkLnNldFZhcigiZm9vIiwgInZhbHVlIG9mIGZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQuZ2V0VmFyKCJmb28iLCBGYWxzZSkpLCAidmFsdWUgb2YgZm9vIikKKyAgICAgICAgZC5zZXRWYXIoImZvbyIsICJzZWNvbmQgdmFsdWUgb2YgZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZC5nZXRWYXIoImZvbyIsIEZhbHNlKSksICJzZWNvbmQgdmFsdWUgb2YgZm9vIikKKworICAgIGRlZiB0ZXN0X3NhbWVfdmFsdWUoc2VsZik6CisgICAgICAgIGQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBkLnNldFZhcigiZm9vIiwgInZhbHVlIG9mIikKKyAgICAgICAgZC5zZXRWYXIoImJhciIsICJ2YWx1ZSBvZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoImZvbyIsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkLmdldFZhcigiYmFyIiwgRmFsc2UpKQorCitjbGFzcyBUZXN0Q29uY2F0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZPTyIsICJmb28iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJWQUwiLCAidmFsIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiQkFSIiwgImJhciIpCisKKyAgICBkZWYgdGVzdF9wcmVwZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUIiwgIiR7VkFMfSIpCisgICAgICAgIHNlbGYuZC5wcmVwZW5kVmFyKCJURVNUIiwgIiR7Rk9PfToiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgImZvbzp2YWwiKQorCisgICAgZGVmIHRlc3RfYXBwZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUIiwgIiR7VkFMfSIpCisgICAgICAgIHNlbGYuZC5hcHBlbmRWYXIoIlRFU1QiLCAiOiR7QkFSfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidmFsOmJhciIpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtWQUx9IikKKyAgICAgICAgc2VsZi5kLnByZXBlbmRWYXIoIlRFU1QiLCAiJHtGT099OiIpCisgICAgICAgIHNlbGYuZC5hcHBlbmRWYXIoIlRFU1QiLCAiOnZhbDIiKQorICAgICAgICBzZWxmLmQuYXBwZW5kVmFyKCJURVNUIiwgIjoke0JBUn0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgImZvbzp2YWw6dmFsMjpiYXIiKQorCitjbGFzcyBUZXN0Q29uY2F0T3ZlcnJpZGUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgImZvbyIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlZBTCIsICJ2YWwiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiYmFyIikKKworICAgIGRlZiB0ZXN0X3ByZXBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtWQUx9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9wcmVwZW5kIiwgIiR7Rk9PfToiKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJmb286dmFsIikKKworICAgIGRlZiB0ZXN0X2FwcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke1ZBTH0iKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2FwcGVuZCIsICI6JHtCQVJ9IikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidmFsOmJhciIpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtWQUx9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9wcmVwZW5kIiwgIiR7Rk9PfToiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2FwcGVuZCIsICI6dmFsMiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYXBwZW5kIiwgIjoke0JBUn0iKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJmb286dmFsOnZhbDI6YmFyIikKKworICAgIGRlZiB0ZXN0X2FwcGVuZF91bnNldChzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9wcmVwZW5kIiwgIiR7Rk9PfToiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2FwcGVuZCIsICI6dmFsMiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfYXBwZW5kIiwgIjoke0JBUn0iKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJmb286OnZhbDI6YmFyIikKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVCIsICIke1ZBTH0gJHtCQVJ9IikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9yZW1vdmUiLCAidmFsIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAiYmFyIikKKworICAgIGRlZiB0ZXN0X2RvdWJsZXJlZl9yZW1vdmUoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtWQUx9ICR7QkFSfSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfcmVtb3ZlIiwgInZhbCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfVEVTVCIsICIke1RFU1R9ICR7VEVTVH0iKQorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUX1RFU1QiLCBUcnVlKSwgImJhciBiYXIiKQorCisgICAgZGVmIHRlc3RfZW1wdHlfcmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUIiwgIiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfcmVtb3ZlIiwgInZhbCIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgIiIpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfZXhwYW5zaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiWiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAiJHtCQVJ9L1ggWSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfcmVtb3ZlIiwgIiR7QkFSfS9YIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAiWSIpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfZXhwYW5zaW9uX2l0ZW1zKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUIiwgIkEgQiBDIEQiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQVIiLCAiQiBEIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9yZW1vdmUiLCAiJHtCQVJ9IikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAiQSBDIikKKworY2xhc3MgVGVzdE92ZXJyaWRlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJPVkVSUklERVMiLCAiZm9vOmJhcjpsb2NhbCIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QiLCAidGVzdHZhbHVlIikKKworICAgIGRlZiB0ZXN0X25vX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBiYi5kYXRhLnVwZGF0ZV9kYXRhKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyKCJURVNUIiwgVHJ1ZSksICJ0ZXN0dmFsdWUiKQorCisgICAgZGVmIHRlc3Rfb25lX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2JhciIsICJ0ZXN0dmFsdWUyIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidGVzdHZhbHVlMiIpCisKKyAgICBkZWYgdGVzdF9vbmVfb3ZlcnJpZGVfdW5zZXQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QyX2JhciIsICJ0ZXN0dmFsdWUyIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVDIiLCBUcnVlKSwgInRlc3R2YWx1ZTIiKQorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoc2VsZi5kLmtleXMoKSwgWydURVNUJywgJ1RFU1QyJywgJ09WRVJSSURFUycsICdURVNUMl9iYXInXSkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2JhciIsICJ0ZXN0dmFsdWUyIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9sb2NhbCIsICJ0ZXN0dmFsdWUzIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9mb28iLCAidGVzdHZhbHVlNCIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgInRlc3R2YWx1ZTMiKQorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoc2VsZi5kLmtleXMoKSwgWydURVNUJywgJ1RFU1RfZm9vJywgJ09WRVJSSURFUycsICdURVNUX2JhcicsICdURVNUX2xvY2FsJ10pCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9jb21iaW5lZF9vdmVycmlkZXMoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfbG9jYWxfZm9vX2JhciIsICJ0ZXN0dmFsdWUzIikKKyAgICAgICAgYmIuZGF0YS51cGRhdGVfZGF0YShzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidGVzdHZhbHVlMyIpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9vdmVycmlkZXNfdW5zZXQoc2VsZik6CisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1QyX2xvY2FsX2Zvb19iYXIiLCAidGVzdHZhbHVlMyIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QyIiwgVHJ1ZSksICJ0ZXN0dmFsdWUzIikKKworICAgIGRlZiB0ZXN0X2tleWV4cGFuc2lvbl9vdmVycmlkZShzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiTE9DQUwiLCAibG9jYWwiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJURVNUX2JhciIsICJ0ZXN0dmFsdWUyIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF8ke0xPQ0FMfSIsICJ0ZXN0dmFsdWUzIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9mb28iLCAidGVzdHZhbHVlNCIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBiYi5kYXRhLmV4cGFuZEtleXMoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIlRFU1QiLCBUcnVlKSwgInRlc3R2YWx1ZTMiKQorCisgICAgZGVmIHRlc3RfcmVuYW1lX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJBTFRFUk5BVElWRV9uY3Vyc2VzLXRvb2xzX2NsYXNzLXRhcmdldCIsICJhIikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiT1ZFUlJJREVTIiwgImNsYXNzLXRhcmdldCIpCisgICAgICAgIGJiLmRhdGEudXBkYXRlX2RhdGEoc2VsZi5kKQorICAgICAgICBzZWxmLmQucmVuYW1lVmFyKCJBTFRFUk5BVElWRV9uY3Vyc2VzLXRvb2xzIiwgIkFMVEVSTkFUSVZFX2xpYjMyLW5jdXJzZXMtdG9vbHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXIoIkFMVEVSTkFUSVZFX2xpYjMyLW5jdXJzZXMtdG9vbHMiLCBUcnVlKSwgImEiKQorCisgICAgZGVmIHRlc3RfdW5kZXJzY29yZV9vdmVycmlkZShzZWxmKToKKyAgICAgICAgc2VsZi5kLnNldFZhcigiVEVTVF9iYXIiLCAidGVzdHZhbHVlMiIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1Rfc29tZV92YWwiLCAidGVzdHZhbHVlMyIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlRFU1RfZm9vIiwgInRlc3R2YWx1ZTQiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJPVkVSUklERVMiLCAiZm9vOmJhcjpzb21lX3ZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVEVTVCIsIFRydWUpLCAidGVzdHZhbHVlMyIpCisKK2NsYXNzIFRlc3RLZXlFeHBhbnNpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kID0gYmIuZGF0YS5pbml0KCkKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRk9PIiwgImZvbyIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJBUiIsICJmb28iKQorCisgICAgZGVmIHRlc3Rfa2V5ZXhwYW5kKHNlbGYpOgorICAgICAgICBzZWxmLmQuc2V0VmFyKCJWQUxfJHtGT099IiwgIkEiKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJWQUxfJHtCQVJ9IiwgIkIiKQorICAgICAgICB3aXRoIExvZ1JlY29yZCgpIGFzIGxvZ3M6CisgICAgICAgICAgICBiYi5kYXRhLmV4cGFuZEtleXMoc2VsZi5kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ0NvbnRhaW5zKCJWYXJpYWJsZSBrZXkgVkFMXyR7Rk9PfSAoQSkgcmVwbGFjZXMgb3JpZ2luYWwga2V5IFZBTF9mb28gKEIpIiwgbG9ncykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhcigiVkFMX2ZvbyIsIFRydWUpLCAiQSIpCisKK2NsYXNzIFRlc3RGbGFncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJmb28iLCAidmFsdWUgb2YgZm9vIikKKyAgICAgICAgc2VsZi5kLnNldFZhckZsYWcoImZvbyIsICJmbGFnMSIsICJ2YWx1ZSBvZiBmbGFnMSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXJGbGFnKCJmb28iLCAiZmxhZzIiLCAidmFsdWUgb2YgZmxhZzIiKQorCisgICAgZGVmIHRlc3Rfc2V0ZmxhZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQuZ2V0VmFyRmxhZygiZm9vIiwgImZsYWcxIiksICJ2YWx1ZSBvZiBmbGFnMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhckZsYWcoImZvbyIsICJmbGFnMiIpLCAidmFsdWUgb2YgZmxhZzIiKQorCisgICAgZGVmIHRlc3RfZGVsZmxhZyhzZWxmKToKKyAgICAgICAgc2VsZi5kLmRlbFZhckZsYWcoImZvbyIsICJmbGFnMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLmdldFZhckZsYWcoImZvbyIsICJmbGFnMSIpLCAidmFsdWUgb2YgZmxhZzEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5nZXRWYXJGbGFnKCJmb28iLCAiZmxhZzIiKSwgTm9uZSkKKworCitjbGFzcyBDb250YWlucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBzZWxmLmQuc2V0VmFyKCJTT01FRkxBRyIsICJhIGIgYyIpCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zKCJTT01FRkxBRyIsICJhIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYiIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgImMiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgImEgYiIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgImIgYyIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgImMgYSIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYSBiIGMiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zKCJTT01FRkxBRyIsICJjIGIgYSIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgIngiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiYi51dGlscy5jb250YWlucygiU09NRUZMQUciLCAiYSB4IiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgInggYyBiIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIudXRpbHMuY29udGFpbnMoIlNPTUVGTEFHIiwgInggYyBiIGEiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zX2FueShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAiYSIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJiIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWluc19hbnkoIlNPTUVGTEFHIiwgImMiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJhIGIiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAiYiBjIiwgVHJ1ZSwgRmFsc2UsIHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWluc19hbnkoIlNPTUVGTEFHIiwgImMgYSIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYi51dGlscy5jb250YWluc19hbnkoIlNPTUVGTEFHIiwgImEgeCIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIudXRpbHMuY29udGFpbnNfYW55KCJTT01FRkxBRyIsICJ4IGMiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAieCIsIFRydWUsIEZhbHNlLCBzZWxmLmQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGJiLnV0aWxzLmNvbnRhaW5zX2FueSgiU09NRUZMQUciLCAieCB5IHoiLCBUcnVlLCBGYWxzZSwgc2VsZi5kKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Rlc3RzL2ZldGNoLnB5IGIvYml0YmFrZS9saWIvYmIvdGVzdHMvZmV0Y2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2MWYzYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL2ZldGNoLnB5CkBAIC0wLDAgKzEsNzU5IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRlc3RzIGZvciB0aGUgRmV0Y2hlciAoZmV0Y2gyLykKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJpY2hhcmQgUHVyZGllCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBvcworZnJvbSBiYi5mZXRjaDIgaW1wb3J0IFVSSQorZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoTWV0aG9kCitpbXBvcnQgYmIKKworY2xhc3MgVVJJVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdGVzdF91cmlzID0geworICAgICAgICAiaHR0cDovL3d3dy5nb29nbGUuY29tL2luZGV4Lmh0bWwiIDogeworICAgICAgICAgICAgJ3VyaSc6ICdodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW5kZXguaHRtbCcsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2h0dHAnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ3d3dy5nb29nbGUuY29tJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICd3d3cuZ29vZ2xlLmNvbScsCisgICAgICAgICAgICAncGF0aCc6ICcvaW5kZXguaHRtbCcsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICcnLAorICAgICAgICAgICAgJ3Bhc3N3b3JkJzogJycsCisgICAgICAgICAgICAncGFyYW1zJzoge30sCisgICAgICAgICAgICAncXVlcnknOiB7fSwKKyAgICAgICAgICAgICdyZWxhdGl2ZSc6IEZhbHNlCisgICAgICAgIH0sCisgICAgICAgICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW5kZXguaHRtbDtwYXJhbTE9dmFsdWUxIiA6IHsKKyAgICAgICAgICAgICd1cmknOiAnaHR0cDovL3d3dy5nb29nbGUuY29tL2luZGV4Lmh0bWw7cGFyYW0xPXZhbHVlMScsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2h0dHAnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ3d3dy5nb29nbGUuY29tJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICd3d3cuZ29vZ2xlLmNvbScsCisgICAgICAgICAgICAncGF0aCc6ICcvaW5kZXguaHRtbCcsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICcnLAorICAgICAgICAgICAgJ3Bhc3N3b3JkJzogJycsCisgICAgICAgICAgICAncGFyYW1zJzogeworICAgICAgICAgICAgICAgICdwYXJhbTEnOiAndmFsdWUxJworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvaW5kZXguaHRtbD9wYXJhbTE9dmFsdWUxIiA6IHsKKyAgICAgICAgICAgICd1cmknOiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZy9pbmRleC5odG1sP3BhcmFtMT12YWx1ZTEnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdodHRwJywKKyAgICAgICAgICAgICdob3N0bmFtZSc6ICd3d3cuZXhhbXBsZS5vcmcnLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJ3d3dy5leGFtcGxlLm9yZycsCisgICAgICAgICAgICAncGF0aCc6ICcvaW5kZXguaHRtbCcsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICcnLAorICAgICAgICAgICAgJ3Bhc3N3b3JkJzogJycsCisgICAgICAgICAgICAncGFyYW1zJzoge30sCisgICAgICAgICAgICAncXVlcnknOiB7CisgICAgICAgICAgICAgICAgJ3BhcmFtMSc6ICd2YWx1ZTEnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvaW5kZXguaHRtbD9xcGFyYW0xPXF2YWx1ZTE7cGFyYW0yPXZhbHVlMiIgOiB7CisgICAgICAgICAgICAndXJpJzogJ2h0dHA6Ly93d3cuZXhhbXBsZS5vcmcvaW5kZXguaHRtbD9xcGFyYW0xPXF2YWx1ZTE7cGFyYW0yPXZhbHVlMicsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2h0dHAnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ3d3dy5leGFtcGxlLm9yZycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnd3d3LmV4YW1wbGUub3JnJywKKyAgICAgICAgICAgICdwYXRoJzogJy9pbmRleC5odG1sJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7CisgICAgICAgICAgICAgICAgJ3BhcmFtMic6ICd2YWx1ZTInCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ3F1ZXJ5JzogeworICAgICAgICAgICAgICAgICdxcGFyYW0xJzogJ3F2YWx1ZTEnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImh0dHA6Ly93d3cuZXhhbXBsZS5jb206ODA4MC9pbmRleC5odG1sIiA6IHsKKyAgICAgICAgICAgICd1cmknOiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbTo4MDgwL2luZGV4Lmh0bWwnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdodHRwJywKKyAgICAgICAgICAgICdob3N0bmFtZSc6ICd3d3cuZXhhbXBsZS5jb20nLAorICAgICAgICAgICAgJ3BvcnQnOiA4MDgwLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJ3d3dy5leGFtcGxlLmNvbTo4MDgwJywKKyAgICAgICAgICAgICdwYXRoJzogJy9pbmRleC5odG1sJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImN2czovL2Fub25jdnNAY3ZzLmhhbmRoZWxkcy5vcmcvY3ZzO21vZHVsZT1mYW1pbGlhci9kaXN0L2lwa2ciIDogeworICAgICAgICAgICAgJ3VyaSc6ICdjdnM6Ly9hbm9uY3ZzQGN2cy5oYW5kaGVsZHMub3JnL2N2czttb2R1bGU9ZmFtaWxpYXIvZGlzdC9pcGtnJywKKyAgICAgICAgICAgICdzY2hlbWUnOiAnY3ZzJywKKyAgICAgICAgICAgICdob3N0bmFtZSc6ICdjdnMuaGFuZGhlbGRzLm9yZycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnY3ZzLmhhbmRoZWxkcy5vcmcnLAorICAgICAgICAgICAgJ3BhdGgnOiAnL2N2cycsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnYW5vbmN2cycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnYW5vbmN2cycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7CisgICAgICAgICAgICAgICAgJ21vZHVsZSc6ICdmYW1pbGlhci9kaXN0L2lwa2cnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiY3ZzOi8vYW5vbmN2czphbm9ueW1vdXNAY3ZzLmhhbmRoZWxkcy5vcmcvY3ZzO3RhZz1WMC05OS04MTttb2R1bGU9ZmFtaWxpYXIvZGlzdC9pcGtnIjogeworICAgICAgICAgICAgJ3VyaSc6ICdjdnM6Ly9hbm9uY3ZzOmFub255bW91c0BjdnMuaGFuZGhlbGRzLm9yZy9jdnM7dGFnPVYwLTk5LTgxO21vZHVsZT1mYW1pbGlhci9kaXN0L2lwa2cnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdjdnMnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ2N2cy5oYW5kaGVsZHMub3JnJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICdjdnMuaGFuZGhlbGRzLm9yZycsCisgICAgICAgICAgICAncGF0aCc6ICcvY3ZzJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICdhbm9uY3ZzOmFub255bW91cycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnYW5vbmN2cycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnYW5vbnltb3VzJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7CisgICAgICAgICAgICAgICAgJ3RhZyc6ICdWMC05OS04MScsCisgICAgICAgICAgICAgICAgJ21vZHVsZSc6ICdmYW1pbGlhci9kaXN0L2lwa2cnCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBGYWxzZQorICAgICAgICB9LAorICAgICAgICAiZmlsZTovL2V4YW1wbGUuZGlmZiI6IHsgIyBOT1RFOiBOb3QgUkZDIGNvbXBsaWFudCEKKyAgICAgICAgICAgICd1cmknOiAnZmlsZTpleGFtcGxlLmRpZmYnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdmaWxlJywKKyAgICAgICAgICAgICdob3N0bmFtZSc6ICcnLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJycsCisgICAgICAgICAgICAncGF0aCc6ICdleGFtcGxlLmRpZmYnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcm5hbWUnOiAnJywKKyAgICAgICAgICAgICdwYXNzd29yZCc6ICcnLAorICAgICAgICAgICAgJ3BhcmFtcyc6IHt9LAorICAgICAgICAgICAgJ3F1ZXJ5Jzoge30sCisgICAgICAgICAgICAncmVsYXRpdmUnOiBUcnVlCisgICAgICAgIH0sCisgICAgICAgICJmaWxlOmV4YW1wbGUuZGlmZiI6IHsgIyBOT1RFOiBSRkMgY29tcGxpYW50IHZlcnNpb24gb2YgdGhlIGZvcm1lcgorICAgICAgICAgICAgJ3VyaSc6ICdmaWxlOmV4YW1wbGUuZGlmZicsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2ZpbGUnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnJywKKyAgICAgICAgICAgICdwYXRoJzogJ2V4YW1wbGUuZGlmZicsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogVHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZmlsZTovLy90bXAvZXhhbXBsZS5kaWZmIjogeworICAgICAgICAgICAgJ3VyaSc6ICdmaWxlOi8vL3RtcC9leGFtcGxlLmRpZmYnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdmaWxlJywKKyAgICAgICAgICAgICdob3N0bmFtZSc6ICcnLAorICAgICAgICAgICAgJ3BvcnQnOiBOb25lLAorICAgICAgICAgICAgJ2hvc3Rwb3J0JzogJycsCisgICAgICAgICAgICAncGF0aCc6ICcvdG1wL2V4YW1wbGUuZGlmZicsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfSwKKyAgICAgICAgImdpdDovLy9wYXRoL2V4YW1wbGUuZ2l0IjogeworICAgICAgICAgICAgJ3VyaSc6ICdnaXQ6Ly8vcGF0aC9leGFtcGxlLmdpdCcsCisgICAgICAgICAgICAnc2NoZW1lJzogJ2dpdCcsCisgICAgICAgICAgICAnaG9zdG5hbWUnOiAnJywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICcnLAorICAgICAgICAgICAgJ3BhdGgnOiAnL3BhdGgvZXhhbXBsZS5naXQnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICcnLAorICAgICAgICAgICAgJ3Bhc3N3b3JkJzogJycsCisgICAgICAgICAgICAncGFyYW1zJzoge30sCisgICAgICAgICAgICAncXVlcnknOiB7fSwKKyAgICAgICAgICAgICdyZWxhdGl2ZSc6IEZhbHNlCisgICAgICAgIH0sCisgICAgICAgICJnaXQ6cGF0aC9leGFtcGxlLmdpdCI6IHsKKyAgICAgICAgICAgICd1cmknOiAnZ2l0OnBhdGgvZXhhbXBsZS5naXQnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdnaXQnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJycsCisgICAgICAgICAgICAncG9ydCc6IE5vbmUsCisgICAgICAgICAgICAnaG9zdHBvcnQnOiAnJywKKyAgICAgICAgICAgICdwYXRoJzogJ3BhdGgvZXhhbXBsZS5naXQnLAorICAgICAgICAgICAgJ3VzZXJpbmZvJzogJycsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VybmFtZSc6ICcnLAorICAgICAgICAgICAgJ3Bhc3N3b3JkJzogJycsCisgICAgICAgICAgICAncGFyYW1zJzoge30sCisgICAgICAgICAgICAncXVlcnknOiB7fSwKKyAgICAgICAgICAgICdyZWxhdGl2ZSc6IFRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImdpdDovL2V4YW1wbGUubmV0L3BhdGgvZXhhbXBsZS5naXQiOiB7CisgICAgICAgICAgICAndXJpJzogJ2dpdDovL2V4YW1wbGUubmV0L3BhdGgvZXhhbXBsZS5naXQnLAorICAgICAgICAgICAgJ3NjaGVtZSc6ICdnaXQnLAorICAgICAgICAgICAgJ2hvc3RuYW1lJzogJ2V4YW1wbGUubmV0JywKKyAgICAgICAgICAgICdwb3J0JzogTm9uZSwKKyAgICAgICAgICAgICdob3N0cG9ydCc6ICdleGFtcGxlLm5ldCcsCisgICAgICAgICAgICAncGF0aCc6ICcvcGF0aC9leGFtcGxlLmdpdCcsCisgICAgICAgICAgICAndXNlcmluZm8nOiAnJywKKyAgICAgICAgICAgICd1c2VyaW5mbyc6ICcnLAorICAgICAgICAgICAgJ3VzZXJuYW1lJzogJycsCisgICAgICAgICAgICAncGFzc3dvcmQnOiAnJywKKyAgICAgICAgICAgICdwYXJhbXMnOiB7fSwKKyAgICAgICAgICAgICdxdWVyeSc6IHt9LAorICAgICAgICAgICAgJ3JlbGF0aXZlJzogRmFsc2UKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlZiB0ZXN0X3VyaShzZWxmKToKKyAgICAgICAgZm9yIHRlc3RfdXJpLCByZWYgaW4gc2VsZi50ZXN0X3VyaXMuaXRlbXMoKToKKyAgICAgICAgICAgIHVyaSA9IFVSSSh0ZXN0X3VyaSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodXJpKSwgcmVmWyd1cmknXSkKKworICAgICAgICAgICAgIyBleHBlY3RlZCBhdHRyaWJ1dGVzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5zY2hlbWUsIHJlZlsnc2NoZW1lJ10pCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJpbmZvLCByZWZbJ3VzZXJpbmZvJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VybmFtZSwgcmVmWyd1c2VybmFtZSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGFzc3dvcmQsIHJlZlsncGFzc3dvcmQnXSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkuaG9zdG5hbWUsIHJlZlsnaG9zdG5hbWUnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBvcnQsIHJlZlsncG9ydCddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkuaG9zdHBvcnQsIHJlZlsnaG9zdHBvcnQnXSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGF0aCwgcmVmWydwYXRoJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXJhbXMsIHJlZlsncGFyYW1zJ10pCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnJlbGF0aXZlLCByZWZbJ3JlbGF0aXZlJ10pCisKKyAgICBkZWYgdGVzdF9kaWN0KHNlbGYpOgorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmLnRlc3RfdXJpcy52YWx1ZXMoKToKKyAgICAgICAgICAgIHVyaSA9IFVSSSgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnNjaGVtZSwgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VyaW5mbywgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VybmFtZSwgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXNzd29yZCwgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5ob3N0bmFtZSwgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wb3J0LCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGF0aCwgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXJhbXMsIHt9KQorCisKKyAgICAgICAgICAgIHVyaS5zY2hlbWUgPSB0ZXN0WydzY2hlbWUnXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkuc2NoZW1lLCB0ZXN0WydzY2hlbWUnXSkKKworICAgICAgICAgICAgdXJpLnVzZXJpbmZvID0gdGVzdFsndXNlcmluZm8nXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkudXNlcmluZm8sIHRlc3RbJ3VzZXJpbmZvJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS51c2VybmFtZSwgdGVzdFsndXNlcm5hbWUnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhc3N3b3JkLCB0ZXN0WydwYXNzd29yZCddKQorCisgICAgICAgICAgICAjIG1ha2Ugc3VyZSBjaGFuZ2luZyB0aGUgdmFsdWVzIGRvZXNuJ3QgZG8gYW55dGhpbmcgdW5leHBlY3RlZAorICAgICAgICAgICAgdXJpLnVzZXJuYW1lID0gJ2NoYW5nZW1lJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkudXNlcm5hbWUsICdjaGFuZ2VtZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXNzd29yZCwgdGVzdFsncGFzc3dvcmQnXSkKKyAgICAgICAgICAgIHVyaS5wYXNzd29yZCA9ICdpbnNlY3VyZScKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJuYW1lLCAnY2hhbmdlbWUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGFzc3dvcmQsICdpbnNlY3VyZScpCisKKyAgICAgICAgICAgICMgcmVzZXQgYmFjayBhZnRlciBvdXIgdHJpY2tlcnkKKyAgICAgICAgICAgIHVyaS51c2VyaW5mbyA9IHRlc3RbJ3VzZXJpbmZvJ10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnVzZXJpbmZvLCB0ZXN0Wyd1c2VyaW5mbyddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkudXNlcm5hbWUsIHRlc3RbJ3VzZXJuYW1lJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXNzd29yZCwgdGVzdFsncGFzc3dvcmQnXSkKKworICAgICAgICAgICAgdXJpLmhvc3RuYW1lID0gdGVzdFsnaG9zdG5hbWUnXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkuaG9zdG5hbWUsIHRlc3RbJ2hvc3RuYW1lJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5ob3N0cG9ydCwgdGVzdFsnaG9zdG5hbWUnXSkKKworICAgICAgICAgICAgdXJpLnBvcnQgPSB0ZXN0Wydwb3J0J10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBvcnQsIHRlc3RbJ3BvcnQnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLmhvc3Rwb3J0LCB0ZXN0Wydob3N0cG9ydCddKQorCisgICAgICAgICAgICB1cmkucGF0aCA9IHRlc3RbJ3BhdGgnXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmkucGF0aCwgdGVzdFsncGF0aCddKQorCisgICAgICAgICAgICB1cmkucGFyYW1zID0gdGVzdFsncGFyYW1zJ10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnBhcmFtcywgdGVzdFsncGFyYW1zJ10pCisKKyAgICAgICAgICAgIHVyaS5xdWVyeSA9IHRlc3RbJ3F1ZXJ5J10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpLnF1ZXJ5LCB0ZXN0WydxdWVyeSddKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1cmkpLCB0ZXN0Wyd1cmknXSkKKworICAgICAgICAgICAgdXJpLnBhcmFtcyA9IHt9CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaS5wYXJhbXMsIHt9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodXJpKSwgKHN0cih1cmkpLnNwbGl0KCI7IikpWzBdKQorCitjbGFzcyBGZXRjaGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub3JpZ2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIHNlbGYuZCA9IGJiLmRhdGEuaW5pdCgpCisgICAgICAgIHNlbGYudGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLmRsZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgImRvd25sb2FkIikKKyAgICAgICAgb3MubWtkaXIoc2VsZi5kbGRpcikKKyAgICAgICAgc2VsZi5kLnNldFZhcigiRExfRElSIiwgc2VsZi5kbGRpcikKKyAgICAgICAgc2VsZi51bnBhY2tkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCAidW5wYWNrZWQiKQorICAgICAgICBvcy5ta2RpcihzZWxmLnVucGFja2RpcikKKyAgICAgICAgcGVyc2lzdGRpciA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsICJwZXJzaXN0ZGF0YSIpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBFUlNJU1RFTlRfRElSIiwgcGVyc2lzdGRpcikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5vcmlnZGlyKQorICAgICAgICBiYi51dGlscy5wcnVuZWRpcihzZWxmLnRlbXBkaXIpCisKK2NsYXNzIE1pcnJvclVyaVRlc3QoRmV0Y2hlclRlc3QpOgorCisgICAgcmVwbGFjZXVyaXMgPSB7CisgICAgICAgICgiZ2l0Oi8vZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgImdpdDovLy4qLy4qIiwgImh0dHA6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvIikgCisgICAgICAgICAgICA6ICJodHRwOi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL2dpdDJfZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy5tdGQtdXRpbHMuZ2l0LnRhci5neiIsCisgICAgICAgICgiZ2l0Oi8vZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgImdpdDovLy4qLyhbXi9dKy8pKihbXi9dKikiLCAiZ2l0Oi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL1xcMjtwcm90b2NvbD1odHRwIikgCisgICAgICAgICAgICA6ICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDtwcm90b2NvbD1odHRwIiwgCisgICAgICAgICgiZ2l0Oi8vZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy9mb28vbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsICJnaXQ6Ly8uKi8oW14vXSsvKSooW14vXSopIiwgImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9cXDI7cHJvdG9jb2w9aHR0cCIpIAorICAgICAgICAgICAgOiAiZ2l0Oi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTA7cHJvdG9jb2w9aHR0cCIsIAorICAgICAgICAoImdpdDovL2dpdC5pbnZhbGlkLmluZnJhZGVhZC5vcmcvZm9vL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCAiZ2l0Oi8vLiovKFteL10rLykqKFteL10qKSIsICJnaXQ6Ly9zb21ld2hlcmUub3JnL1xcMjtwcm90b2NvbD1odHRwIikgCisgICAgICAgICAgICA6ICJnaXQ6Ly9zb21ld2hlcmUub3JnL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTA7cHJvdG9jb2w9aHR0cCIsIAorICAgICAgICAoImdpdDovL3NvbWVzZXJ2ZXIub3JnL2JpdGJha2U7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCAiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZSIsICJnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlIikKKyAgICAgICAgICAgIDogImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2U7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorICAgICAgICAoImZpbGU6Ly9zc3RhdGUteHl6LnRneiIsICJmaWxlOi8vLioiLCAiZmlsZTovLy9zb21ld2hlcmUvMTIzNC9zc3RhdGUtY2FjaGUiKSAKKyAgICAgICAgICAgIDogImZpbGU6Ly8vc29tZXdoZXJlLzEyMzQvc3N0YXRlLWNhY2hlL3NzdGF0ZS14eXoudGd6IiwKKyAgICAgICAgKCJmaWxlOi8vc3N0YXRlLXh5ei50Z3oiLCAiZmlsZTovLy4qIiwgImZpbGU6Ly8vc29tZXdoZXJlLzEyMzQvc3N0YXRlLWNhY2hlLyIpIAorICAgICAgICAgICAgOiAiZmlsZTovLy9zb21ld2hlcmUvMTIzNC9zc3RhdGUtY2FjaGUvc3N0YXRlLXh5ei50Z3oiLAorICAgICAgICAoImh0dHA6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIxL3NvbWVkaXIyL3NvbWVmaWxlXzEuMi4zLnRhci5neiIsICJodHRwOi8vLiovLioiLCAiaHR0cDovL3NvbWV3aGVyZTIub3JnL3NvbWVkaXIzIikgCisgICAgICAgICAgICA6ICJodHRwOi8vc29tZXdoZXJlMi5vcmcvc29tZWRpcjMvc29tZWZpbGVfMS4yLjMudGFyLmd6IiwKKyAgICAgICAgKCJodHRwOi8vc29tZXdoZXJlLm9yZy9zb21lZGlyMS9zb21lZmlsZV8xLjIuMy50YXIuZ3oiLCAiaHR0cDovL3NvbWV3aGVyZS5vcmcvc29tZWRpcjEvc29tZWZpbGVfMS4yLjMudGFyLmd6IiwgImh0dHA6Ly9zb21ld2hlcmUyLm9yZy9zb21lZGlyMy9zb21lZmlsZV8xLjIuMy50YXIuZ3oiKSAKKyAgICAgICAgICAgIDogImh0dHA6Ly9zb21ld2hlcmUyLm9yZy9zb21lZGlyMy9zb21lZmlsZV8xLjIuMy50YXIuZ3oiLAorICAgICAgICAoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3N1YnZlcnNpb24vc3VidmVyc2lvbi0xLjcuMS50YXIuYnoyIiwgImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0IiwgImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdCIpCisgICAgICAgICAgICA6ICJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvc3VidmVyc2lvbi9zdWJ2ZXJzaW9uLTEuNy4xLnRhci5iejIiLAorICAgICAgICAoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3N1YnZlcnNpb24vc3VidmVyc2lvbi0xLjcuMS50YXIuYnoyIiwgImh0dHA6Ly8uKi8uKiIsICJmaWxlOi8vL3NvbWVwYXRoL2Rvd25sb2Fkcy8iKQorICAgICAgICAgICAgOiAiZmlsZTovLy9zb21lcGF0aC9kb3dubG9hZHMvc3VidmVyc2lvbi0xLjcuMS50YXIuYnoyIiwKKyAgICAgICAgKCJnaXQ6Ly9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnL210ZC11dGlscy5naXQ7dGFnPTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLCAiZ2l0Oi8vLiovLioiLCAiZ2l0Oi8vc29tZXdoZXJlLm9yZy9zb21lZGlyL0JBU0VOQU1FO3Byb3RvY29sPWh0dHAiKSAKKyAgICAgICAgICAgIDogImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwO3Byb3RvY29sPWh0dHAiLCAKKyAgICAgICAgKCJnaXQ6Ly9naXQuaW52YWxpZC5pbmZyYWRlYWQub3JnL2Zvby9tdGQtdXRpbHMuZ2l0O3RhZz0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwgImdpdDovLy4qLy4qIiwgImdpdDovL3NvbWV3aGVyZS5vcmcvc29tZWRpci9CQVNFTkFNRTtwcm90b2NvbD1odHRwIikgCisgICAgICAgICAgICA6ICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDtwcm90b2NvbD1odHRwIiwgCisgICAgICAgICgiZ2l0Oi8vZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy9mb28vbXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsICJnaXQ6Ly8uKi8uKiIsICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvTUlSUk9STkFNRTtwcm90b2NvbD1odHRwIikgCisgICAgICAgICAgICA6ICJnaXQ6Ly9zb21ld2hlcmUub3JnL3NvbWVkaXIvZ2l0LmludmFsaWQuaW5mcmFkZWFkLm9yZy5mb28ubXRkLXV0aWxzLmdpdDt0YWc9MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDtwcm90b2NvbD1odHRwIiwgCisKKyAgICAgICAgI1JlbmFtaW5nIGZpbGVzIGRvZXNuJ3Qgd29yaworICAgICAgICAjKCJodHRwOi8vc29tZXdoZXJlLm9yZy9zb21lZGlyMS9zb21lZmlsZV8xLjIuMy50YXIuZ3oiLCAiaHR0cDovL3NvbWV3aGVyZS5vcmcvc29tZWRpcjEvc29tZWZpbGVfMS4yLjMudGFyLmd6IiwgImh0dHA6Ly9zb21ld2hlcmUyLm9yZy9zb21lZGlyMy9zb21lZmlsZV8yLjMuNC50YXIuZ3oiKSA6ICJodHRwOi8vc29tZXdoZXJlMi5vcmcvc29tZWRpcjMvc29tZWZpbGVfMi4zLjQudGFyLmd6IgorICAgICAgICAjKCJmaWxlOi8vc3N0YXRlLXh5ei50Z3oiLCAiZmlsZTovLy4qLy4qIiwgImZpbGU6Ly8vc29tZXdoZXJlLzEyMzQvc3N0YXRlLWNhY2hlIikgOiAiZmlsZTovLy9zb21ld2hlcmUvMTIzNC9zc3RhdGUtY2FjaGUvc3N0YXRlLXh5ei50Z3oiLAorICAgIH0KKworICAgIG1pcnJvcnZhciA9ICJodHRwOi8vLiovLiogZmlsZTovLy9zb21lcGF0aC9kb3dubG9hZHMvIFxuIiBcCisgICAgICAgICAgICAgICAgImdpdDovL3NvbWVzZXJ2ZXIub3JnL2JpdGJha2UgZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZSBcbiIgXAorICAgICAgICAgICAgICAgICJodHRwczovLy4qLy4qIGZpbGU6Ly8vc29tZW90aGVycGF0aC9kb3dubG9hZHMvIFxuIiBcCisgICAgICAgICAgICAgICAgImh0dHA6Ly8uKi8uKiBmaWxlOi8vL3NvbWVvdGhlcnBhdGgvZG93bmxvYWRzLyBcbiIKKworICAgIGRlZiB0ZXN0X3VyaXJlcGxhY2Uoc2VsZik6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYucmVwbGFjZXVyaXMuaXRlbXMoKToKKyAgICAgICAgICAgIHVkID0gYmIuZmV0Y2guRmV0Y2hEYXRhKGtbMF0sIHNlbGYuZCkKKyAgICAgICAgICAgIHVkLnNldHVwX2xvY2FscGF0aChzZWxmLmQpCisgICAgICAgICAgICBtaXJyb3JzID0gYmIuZmV0Y2gyLm1pcnJvcl9mcm9tX3N0cmluZygiJXMgJXMiICUgKGtbMV0sIGtbMl0pKQorICAgICAgICAgICAgbmV3dXJpcywgdWRzID0gYmIuZmV0Y2gyLmJ1aWxkX21pcnJvcnVyaXModWQsIG1pcnJvcnMsIHNlbGYuZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3ZdLCBuZXd1cmlzKQorCisgICAgZGVmIHRlc3RfdXJpbGlzdDEoc2VsZik6CisgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaERhdGEoImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiIsIHNlbGYuZCkKKyAgICAgICAgbWlycm9ycyA9IGJiLmZldGNoMi5taXJyb3JfZnJvbV9zdHJpbmcoc2VsZi5taXJyb3J2YXIpCisgICAgICAgIHVyaXMsIHVkcyA9IGJiLmZldGNoMi5idWlsZF9taXJyb3J1cmlzKGZldGNoZXIsIG1pcnJvcnMsIHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmlzLCBbJ2ZpbGU6Ly8vc29tZXBhdGgvZG93bmxvYWRzL2JpdGJha2UtMS4wLnRhci5neicsICdmaWxlOi8vL3NvbWVvdGhlcnBhdGgvZG93bmxvYWRzL2JpdGJha2UtMS4wLnRhci5neiddKQorCisgICAgZGVmIHRlc3RfdXJpbGlzdDIoc2VsZik6CisgICAgICAgICMgQ2F0Y2ggaHR0cHM6Ly8gLT4gZmlsZXM6Ly8gYnVnCisgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaERhdGEoImh0dHBzOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMC50YXIuZ3oiLCBzZWxmLmQpCisgICAgICAgIG1pcnJvcnMgPSBiYi5mZXRjaDIubWlycm9yX2Zyb21fc3RyaW5nKHNlbGYubWlycm9ydmFyKQorICAgICAgICB1cmlzLCB1ZHMgPSBiYi5mZXRjaDIuYnVpbGRfbWlycm9ydXJpcyhmZXRjaGVyLCBtaXJyb3JzLCBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJpcywgWydmaWxlOi8vL3NvbWVvdGhlcnBhdGgvZG93bmxvYWRzL2JpdGJha2UtMS4wLnRhci5neiddKQorCisgICAgZGVmIHRlc3RfbWlycm9yX29mX21pcnJvcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIG1pcnJvciBvZiBhIG1pcnJvciB3b3JrcworICAgICAgICBtaXJyb3J2YXIgPSBzZWxmLm1pcnJvcnZhciArICIgaHR0cDovLy4qLy4qIGh0dHA6Ly9vdGhlcmRvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL2Rvd25sb2Fkcy8gXG4iCisgICAgICAgIG1pcnJvcnZhciA9IG1pcnJvcnZhciArICIgaHR0cDovL290aGVyZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvLiogaHR0cDovL2Rvd25sb2FkczIueW9jdG9wcm9qZWN0Lm9yZy9kb3dubG9hZHMvIFxuIgorICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2hEYXRhKCJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMC50YXIuZ3oiLCBzZWxmLmQpCisgICAgICAgIG1pcnJvcnMgPSBiYi5mZXRjaDIubWlycm9yX2Zyb21fc3RyaW5nKG1pcnJvcnZhcikKKyAgICAgICAgdXJpcywgdWRzID0gYmIuZmV0Y2gyLmJ1aWxkX21pcnJvcnVyaXMoZmV0Y2hlciwgbWlycm9ycywgc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVyaXMsIFsnZmlsZTovLy9zb21lcGF0aC9kb3dubG9hZHMvYml0YmFrZS0xLjAudGFyLmd6JywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlOi8vL3NvbWVvdGhlcnBhdGgvZG93bmxvYWRzL2JpdGJha2UtMS4wLnRhci5neicsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL290aGVyZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvZG93bmxvYWRzL2JpdGJha2UtMS4wLnRhci5neicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8vZG93bmxvYWRzMi55b2N0b3Byb2plY3Qub3JnL2Rvd25sb2Fkcy9iaXRiYWtlLTEuMC50YXIuZ3onXSkKKworCitjbGFzcyBGZXRjaGVyTG9jYWxUZXN0KEZldGNoZXJUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGRlZiB0b3VjaChmbik6CisgICAgICAgICAgICB3aXRoIGZpbGUoZm4sICdhJyk6CisgICAgICAgICAgICAgICAgb3MudXRpbWUoZm4sIE5vbmUpCisKKyAgICAgICAgc3VwZXIoRmV0Y2hlckxvY2FsVGVzdCwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLmxvY2Fsc3JjZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgJ2xvY2Fsc3JjJykKKyAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5sb2NhbHNyY2RpcikKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYubG9jYWxzcmNkaXIsICdhJykpCisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLmxvY2Fsc3JjZGlyLCAnYicpKQorICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4oc2VsZi5sb2NhbHNyY2RpciwgJ2RpcicpKQorICAgICAgICB0b3VjaChvcy5wYXRoLmpvaW4oc2VsZi5sb2NhbHNyY2RpciwgJ2RpcicsICdjJykpCisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLmxvY2Fsc3JjZGlyLCAnZGlyJywgJ2QnKSkKKyAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5qb2luKHNlbGYubG9jYWxzcmNkaXIsICdkaXInLCAnc3ViZGlyJykpCisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLmxvY2Fsc3JjZGlyLCAnZGlyJywgJ3N1YmRpcicsICdlJykpCisgICAgICAgIHNlbGYuZC5zZXRWYXIoIkZJTEVTUEFUSCIsIHNlbGYubG9jYWxzcmNkaXIpCisKKyAgICBkZWYgZmV0Y2hVbnBhY2soc2VsZiwgdXJpcyk6CisgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaCh1cmlzLCBzZWxmLmQpCisgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICBmZXRjaGVyLnVucGFjayhzZWxmLnVucGFja2RpcikKKyAgICAgICAgZmxzdCA9IFtdCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYudW5wYWNrZGlyKToKKyAgICAgICAgICAgIGZvciBmIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGZsc3QuYXBwZW5kKG9zLnBhdGgucmVscGF0aChvcy5wYXRoLmpvaW4ocm9vdCwgZiksIHNlbGYudW5wYWNrZGlyKSkKKyAgICAgICAgZmxzdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIGZsc3QKKworICAgIGRlZiB0ZXN0X2xvY2FsKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5mZXRjaFVucGFjayhbJ2ZpbGU6Ly9hJywgJ2ZpbGU6Ly9kaXIvYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUsIFsnYScsICdkaXIvYyddKQorCisgICAgZGVmIHRlc3RfbG9jYWxfd2lsZGNhcmQoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLmZldGNoVW5wYWNrKFsnZmlsZTovL2EnLCAnZmlsZTovL2Rpci8qJ10pCisgICAgICAgICMgRklYTUU6IHRoaXMgaXMgYnJva2VuIC0gaXQgc2hvdWxkIHJldHVybiBbJ2EnLCAnZGlyL2MnLCAnZGlyL2QnLCAnZGlyL3N1YmRpci9lJ10KKyAgICAgICAgIyBzZWUgaHR0cHM6Ly9idWd6aWxsYS55b2N0b3Byb2plY3Qub3JnL3Nob3dfYnVnLmNnaT9pZD02MTI4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwgWydhJywgJ2InLCAnZGlyL2MnLCAnZGlyL2QnLCAnZGlyL3N1YmRpci9lJ10pCisKKyAgICBkZWYgdGVzdF9sb2NhbF9kaXIoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLmZldGNoVW5wYWNrKFsnZmlsZTovL2EnLCAnZmlsZTovL2RpciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUsIFsnYScsICdkaXIvYycsICdkaXIvZCcsICdkaXIvc3ViZGlyL2UnXSkKKworICAgIGRlZiB0ZXN0X2xvY2FsX3N1YmRpcihzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuZmV0Y2hVbnBhY2soWydmaWxlOi8vZGlyL3N1YmRpciddKQorICAgICAgICAjIEZJWE1FOiB0aGlzIGlzIGJyb2tlbiAtIGl0IHNob3VsZCByZXR1cm4gWydkaXIvc3ViZGlyL2UnXQorICAgICAgICAjIHNlZSBodHRwczovL2J1Z3ppbGxhLnlvY3RvcHJvamVjdC5vcmcvc2hvd19idWcuY2dpP2lkPTYxMjkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmVlLCBbJ3N1YmRpci9lJ10pCisKKyAgICBkZWYgdGVzdF9sb2NhbF9zdWJkaXJfZmlsZShzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuZmV0Y2hVbnBhY2soWydmaWxlOi8vZGlyL3N1YmRpci9lJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwgWydkaXIvc3ViZGlyL2UnXSkKKworICAgIGRlZiB0ZXN0X2xvY2FsX3N1YmRpcnBhcmFtKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5mZXRjaFVucGFjayhbJ2ZpbGU6Ly9hO3N1YmRpcj1iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmVlLCBbJ2Jhci9hJ10pCisKKyAgICBkZWYgdGVzdF9sb2NhbF9kZWVwc3ViZGlycGFyYW0oc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLmZldGNoVW5wYWNrKFsnZmlsZTovL2Rpci9zdWJkaXIvZTtzdWJkaXI9YmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwgWydiYXIvZGlyL3N1YmRpci9lJ10pCisKK2NsYXNzIEZldGNoZXJOZXR3b3JrVGVzdChGZXRjaGVyVGVzdCk6CisKKyAgICBpZiBvcy5lbnZpcm9uLmdldCgiQkJfU0tJUF9ORVRURVNUUyIpID09ICJ5ZXMiOgorICAgICAgICBwcmludCgiVW5zZXQgQkJfU0tJUF9ORVRURVNUUyB0byBydW4gbmV0d29yayB0ZXN0cyIpCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3RfZmV0Y2goc2VsZik6CisgICAgICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2goWyJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMC50YXIuZ3oiLCAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UvYml0YmFrZS0xLjEudGFyLmd6Il0sIHNlbGYuZCkKKyAgICAgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUoc2VsZi5kbGRpciArICIvYml0YmFrZS0xLjAudGFyLmd6IiksIDU3NzQ5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUoc2VsZi5kbGRpciArICIvYml0YmFrZS0xLjEudGFyLmd6IiksIDU3ODkyKQorICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiQkJfTk9fTkVUV09SSyIsICIxIikKKyAgICAgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaChbImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiIsICJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMS50YXIuZ3oiXSwgc2VsZi5kKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBmZXRjaGVyLnVucGFjayhzZWxmLnVucGFja2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLmxpc3RkaXIoc2VsZi51bnBhY2tkaXIgKyAiL2JpdGJha2UtMS4wLyIpKSwgOSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLmxpc3RkaXIoc2VsZi51bnBhY2tkaXIgKyAiL2JpdGJha2UtMS4xLyIpKSwgOSkKKworICAgICAgICBkZWYgdGVzdF9mZXRjaF9taXJyb3Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJNSVJST1JTIiwgImh0dHA6Ly8uKi8uKiBodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZSIpCisgICAgICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2goWyJodHRwOi8vaW52YWxpZC55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UvYml0YmFrZS0xLjAudGFyLmd6Il0sIHNlbGYuZCkKKyAgICAgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUoc2VsZi5kbGRpciArICIvYml0YmFrZS0xLjAudGFyLmd6IiksIDU3NzQ5KQorCisgICAgICAgIGRlZiB0ZXN0X2ZldGNoX21pcnJvcl9vZl9taXJyb3Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJNSVJST1JTIiwgImh0dHA6Ly8uKi8uKiBodHRwOi8vaW52YWxpZDIueW9jdG9wcm9qZWN0Lm9yZy8gXG4gaHR0cDovL2ludmFsaWQyLnlvY3RvcHJvamVjdC5vcmcvLiogaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UiKQorICAgICAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKFsiaHR0cDovL2ludmFsaWQueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiJdLCBzZWxmLmQpCisgICAgICAgICAgICBmZXRjaGVyLmRvd25sb2FkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5nZXRzaXplKHNlbGYuZGxkaXIgKyAiL2JpdGJha2UtMS4wLnRhci5neiIpLCA1Nzc0OSkKKworICAgICAgICBkZWYgdGVzdF9mZXRjaF9maWxlX21pcnJvcl9vZl9taXJyb3Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJNSVJST1JTIiwgImh0dHA6Ly8uKi8uKiBmaWxlOi8vL3NvbWUxd2hlcmUvIFxuIGZpbGU6Ly8vc29tZTF3aGVyZS8uKiBmaWxlOi8vc29tZTJ3aGVyZS8gXG4gZmlsZTovL3NvbWUyd2hlcmUvLiogaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL2JpdGJha2UiKQorICAgICAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKFsiaHR0cDovL2ludmFsaWQueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlL2JpdGJha2UtMS4wLnRhci5neiJdLCBzZWxmLmQpCisgICAgICAgICAgICBvcy5ta2RpcihzZWxmLmRsZGlyICsgIi9zb21lMndoZXJlIikKKyAgICAgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUoc2VsZi5kbGRpciArICIvYml0YmFrZS0xLjAudGFyLmd6IiksIDU3NzQ5KQorCisgICAgICAgIGRlZiB0ZXN0X2ZldGNoX3ByZW1pcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBSRU1JUlJPUlMiLCAiaHR0cDovLy4qLy4qIGh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9iaXRiYWtlIikKKyAgICAgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaChbImh0dHA6Ly9pbnZhbGlkLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvYml0YmFrZS9iaXRiYWtlLTEuMC50YXIuZ3oiXSwgc2VsZi5kKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZShzZWxmLmRsZGlyICsgIi9iaXRiYWtlLTEuMC50YXIuZ3oiKSwgNTc3NDkpCisKKyAgICAgICAgZGVmIGdpdGZldGNoZXIoc2VsZiwgdXJsMSwgdXJsMik6CisgICAgICAgICAgICBkZWYgY2hlY2tyZXZpc2lvbihzZWxmLCBmZXRjaGVyKToKKyAgICAgICAgICAgICAgICBmZXRjaGVyLnVucGFjayhzZWxmLnVucGFja2RpcikKKyAgICAgICAgICAgICAgICByZXZpc2lvbiA9IGJiLnByb2Nlc3MucnVuKCJnaXQgcmV2LXBhcnNlIEhFQUQiLCBzaGVsbD1UcnVlLCBjd2Q9c2VsZi51bnBhY2tkaXIgKyAiL2dpdCIpWzBdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldmlzaW9uLCAiMjcwYTA1YjBiNGJhMDk1OWZlMDYyNGQyYTQ4ODVkN2I3MDQyNmRhNSIpCisKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0dFTkVSQVRFX01JUlJPUl9UQVJCQUxMUyIsICIxIikKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlNSQ1JFViIsICIyNzBhMDViMGI0YmEwOTU5ZmUwNjI0ZDJhNDg4NWQ3YjcwNDI2ZGE1IikKKyAgICAgICAgICAgIGZldGNoZXIgPSBiYi5mZXRjaC5GZXRjaChbdXJsMV0sIHNlbGYuZCkKKyAgICAgICAgICAgIGZldGNoZXIuZG93bmxvYWQoKQorICAgICAgICAgICAgY2hlY2tyZXZpc2lvbihzZWxmLCBmZXRjaGVyKQorICAgICAgICAgICAgIyBXaXBlIG91dCB0aGUgZGxkaXIgY2xvbmUgYW5kIHRoZSB1bnBhY2tlZCBzb3VyY2UsIHR1cm4gb2ZmIHRoZSBuZXR3b3JrIGFuZCBjaGVjayBtaXJyb3IgdGFyYmFsbCB3b3JrcworICAgICAgICAgICAgYmIudXRpbHMucHJ1bmVkaXIoc2VsZi5kbGRpciArICIvZ2l0Mi8iKQorICAgICAgICAgICAgYmIudXRpbHMucHJ1bmVkaXIoc2VsZi51bnBhY2tkaXIpCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9OT19ORVRXT1JLIiwgIjEiKQorICAgICAgICAgICAgZmV0Y2hlciA9IGJiLmZldGNoLkZldGNoKFt1cmwyXSwgc2VsZi5kKQorICAgICAgICAgICAgZmV0Y2hlci5kb3dubG9hZCgpCisgICAgICAgICAgICBjaGVja3JldmlzaW9uKHNlbGYsIGZldGNoZXIpCisKKyAgICAgICAgZGVmIHRlc3RfZ2l0ZmV0Y2goc2VsZik6CisgICAgICAgICAgICB1cmwxID0gdXJsMiA9ICJnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlIgorICAgICAgICAgICAgc2VsZi5naXRmZXRjaGVyKHVybDEsIHVybDIpCisKKyAgICAgICAgZGVmIHRlc3RfZ2l0ZmV0Y2hfZ29vZHNyY3JldihzZWxmKToKKyAgICAgICAgICAgICMgU1JDUkVWIGlzIHNldCBidXQgbWF0Y2hlcyByZXY9IHBhcmFtZXRlcgorICAgICAgICAgICAgdXJsMSA9IHVybDIgPSAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZTtyZXY9MjcwYTA1YjBiNGJhMDk1OWZlMDYyNGQyYTQ4ODVkN2I3MDQyNmRhNSIKKyAgICAgICAgICAgIHNlbGYuZ2l0ZmV0Y2hlcih1cmwxLCB1cmwyKQorCisgICAgICAgIGRlZiB0ZXN0X2dpdGZldGNoX2JhZHNyY3JldihzZWxmKToKKyAgICAgICAgICAgICMgU1JDUkVWIGlzIHNldCBidXQgZG9lcyBub3QgbWF0Y2ggcmV2PSBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHVybDEgPSB1cmwyID0gImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2U7cmV2PWRlYWQwNWIwYjRiYTA5NTlmZTA2MjRkMmE0ODg1ZDdiNzA0MjZkYTUiCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi5mZXRjaC5GZXRjaEVycm9yLCBzZWxmLmdpdGZldGNoZXIsIHVybDEsIHVybDIpCisKKyAgICAgICAgZGVmIHRlc3RfZ2l0ZmV0Y2hfdGFnYW5kcmV2KHNlbGYpOgorICAgICAgICAgICAgIyBTUkNSRVYgaXMgc2V0IGJ1dCBkb2VzIG5vdCBtYXRjaCByZXY9IHBhcmFtZXRlcgorICAgICAgICAgICAgdXJsMSA9IHVybDIgPSAiZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZTtyZXY9MjcwYTA1YjBiNGJhMDk1OWZlMDYyNGQyYTQ4ODVkN2I3MDQyNmRhNTt0YWc9MjcwYTA1YjBiNGJhMDk1OWZlMDYyNGQyYTQ4ODVkN2I3MDQyNmRhNSIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLmZldGNoLkZldGNoRXJyb3IsIHNlbGYuZ2l0ZmV0Y2hlciwgdXJsMSwgdXJsMikKKworICAgICAgICBkZWYgdGVzdF9naXRmZXRjaF9wcmVtaXJyb3Ioc2VsZik6CisgICAgICAgICAgICB1cmwxID0gImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UiCisgICAgICAgICAgICB1cmwyID0gImdpdDovL3NvbWVzZXJ2ZXIub3JnL2JpdGJha2UiCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJQUkVNSVJST1JTIiwgImdpdDovL3NvbWVzZXJ2ZXIub3JnL2JpdGJha2UgZ2l0Oi8vZ2l0Lm9wZW5lbWJlZGRlZC5vcmcvYml0YmFrZSBcbiIpCisgICAgICAgICAgICBzZWxmLmdpdGZldGNoZXIodXJsMSwgdXJsMikKKworICAgICAgICBkZWYgdGVzdF9naXRmZXRjaF9wcmVtaXJyb3IyKHNlbGYpOgorICAgICAgICAgICAgdXJsMSA9IHVybDIgPSAiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIlBSRU1JUlJPUlMiLCAiZ2l0Oi8vc29tZXNlcnZlci5vcmcvYml0YmFrZSBnaXQ6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9iaXRiYWtlIFxuIikKKyAgICAgICAgICAgIHNlbGYuZ2l0ZmV0Y2hlcih1cmwxLCB1cmwyKQorCisgICAgICAgIGRlZiB0ZXN0X2dpdGZldGNoX3ByZW1pcnJvcjMoc2VsZik6CisgICAgICAgICAgICByZWFsdXJsID0gImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2UiCisgICAgICAgICAgICBkdW1teXVybCA9ICJnaXQ6Ly9zb21lc2VydmVyLm9yZy9iaXRiYWtlIgorICAgICAgICAgICAgc2VsZi5zb3VyY2VkaXIgPSBzZWxmLnVucGFja2Rpci5yZXBsYWNlKCJ1bnBhY2tlZCIsICJzb3VyY2VtaXJyb3IuZ2l0IikKKyAgICAgICAgICAgIG9zLmNoZGlyKHNlbGYudGVtcGRpcikKKyAgICAgICAgICAgIGJiLnByb2Nlc3MucnVuKCJnaXQgY2xvbmUgJXMgJXMgMj4gL2Rldi9udWxsIiAlIChyZWFsdXJsLCBzZWxmLnNvdXJjZWRpciksIHNoZWxsPVRydWUpCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJQUkVNSVJST1JTIiwgIiVzIGdpdDovLyVzO3Byb3RvY29sPWZpbGUgXG4iICUgKGR1bW15dXJsLCBzZWxmLnNvdXJjZWRpcikpCisgICAgICAgICAgICBzZWxmLmdpdGZldGNoZXIoZHVtbXl1cmwsIGR1bW15dXJsKQorCisgICAgICAgIGRlZiB0ZXN0X2dpdF9zdWJtb2R1bGUoc2VsZik6CisgICAgICAgICAgICBmZXRjaGVyID0gYmIuZmV0Y2guRmV0Y2goWyJnaXRzbTovL2dpdC55b2N0b3Byb2plY3Qub3JnL2dpdC1zdWJtb2R1bGUtdGVzdDtyZXY9ZjEyZTU3ZjJlZGYwYWE1MzRjZjE2MTZmYTk4M2QxNjVhOTJiMDg0MiJdLCBzZWxmLmQpCisgICAgICAgICAgICBmZXRjaGVyLmRvd25sb2FkKCkKKyAgICAgICAgICAgICMgUHJldmlvdXMgY3dkIGhhcyBiZWVuIGRlbGV0ZWQKKyAgICAgICAgICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShzZWxmLnVucGFja2RpcikpCisgICAgICAgICAgICBmZXRjaGVyLnVucGFjayhzZWxmLnVucGFja2RpcikKKworICAgICAgICBkZWYgdGVzdF90cnVzdGVkX25ldHdvcmsoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0cnVzdGVkX25ldHdvcmsgcmV0dXJucyBGYWxzZSB3aGVuIHRoZSBob3N0IElTIGluIHRoZSBsaXN0LgorICAgICAgICAgICAgdXJsID0gImdpdDovL1NvbWVzZXJ2ZXIub3JnL2ZvbztyZXY9MSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0FMTE9XRURfTkVUV09SS1MiLCAic2VydmVyMS5vcmcgc29tZXNlcnZlci5vcmcgc2VydmVyMi5vcmcgc2VydmVyMy5vcmciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLmZldGNoLnRydXN0ZWRfbmV0d29yayhzZWxmLmQsIHVybCkpCisKKyAgICAgICAgZGVmIHRlc3Rfd2lsZF90cnVzdGVkX25ldHdvcmsoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0cnVzdGVkX25ldHdvcmsgcmV0dXJucyB0cnVlIHdoZW4gdGhlICouaG9zdCBJUyBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgIHVybCA9ICJnaXQ6Ly9Tb21lc2VydmVyLm9yZy9mb287cmV2PTEiCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9BTExPV0VEX05FVFdPUktTIiwgInNlcnZlcjEub3JnICouc29tZXNlcnZlci5vcmcgc2VydmVyMi5vcmcgc2VydmVyMy5vcmciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLmZldGNoLnRydXN0ZWRfbmV0d29yayhzZWxmLmQsIHVybCkpCisKKyAgICAgICAgZGVmIHRlc3RfcHJlZml4X3dpbGRfdHJ1c3RlZF9uZXR3b3JrKHNlbGYpOgorICAgICAgICAgICAgIyBFbnN1cmUgdHJ1c3RlZF9uZXR3b3JrIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcmVmaXggbWF0Y2hlcyAqLmhvc3QuCisgICAgICAgICAgICB1cmwgPSAiZ2l0Oi8vZ2l0LlNvbWVzZXJ2ZXIub3JnL2ZvbztyZXY9MSIKKyAgICAgICAgICAgIHNlbGYuZC5zZXRWYXIoIkJCX0FMTE9XRURfTkVUV09SS1MiLCAic2VydmVyMS5vcmcgKi5zb21lc2VydmVyLm9yZyBzZXJ2ZXIyLm9yZyBzZXJ2ZXIzLm9yZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYmIuZmV0Y2gudHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdXJsKSkKKworICAgICAgICBkZWYgdGVzdF90d29fcHJlZml4X3dpbGRfdHJ1c3RlZF9uZXR3b3JrKHNlbGYpOgorICAgICAgICAgICAgIyBFbnN1cmUgdHJ1c3RlZF9uZXR3b3JrIHJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwcmVmaXggbWF0Y2hlcyAqLmhvc3QuCisgICAgICAgICAgICB1cmwgPSAiZ2l0Oi8vc29tZXRoaW5nLmdpdC5Tb21lc2VydmVyLm9yZy9mb287cmV2PTEiCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9BTExPV0VEX05FVFdPUktTIiwgInNlcnZlcjEub3JnICouc29tZXNlcnZlci5vcmcgc2VydmVyMi5vcmcgc2VydmVyMy5vcmciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJiLmZldGNoLnRydXN0ZWRfbmV0d29yayhzZWxmLmQsIHVybCkpCisKKyAgICAgICAgZGVmIHRlc3RfdW50cnVzdGVkX25ldHdvcmsoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0cnVzdGVkX25ldHdvcmsgcmV0dXJucyBGYWxzZSB3aGVuIHRoZSBob3N0IGlzIE5PVCBpbiB0aGUgbGlzdC4KKyAgICAgICAgICAgIHVybCA9ICJnaXQ6Ly9zb21lc2VydmVyLm9yZy9mb287cmV2PTEiCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9BTExPV0VEX05FVFdPUktTIiwgInNlcnZlcjEub3JnIHNlcnZlcjIub3JnIHNlcnZlcjMub3JnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIuZmV0Y2gudHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdXJsKSkKKworICAgICAgICBkZWYgdGVzdF93aWxkX3VudHJ1c3RlZF9uZXR3b3JrKHNlbGYpOgorICAgICAgICAgICAgIyBFbnN1cmUgdHJ1c3RlZF9uZXR3b3JrIHJldHVybnMgRmFsc2Ugd2hlbiB0aGUgaG9zdCBpcyBOT1QgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICB1cmwgPSAiZ2l0Oi8vKi5zb21lc2VydmVyLm9yZy9mb287cmV2PTEiCisgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJCQl9BTExPV0VEX05FVFdPUktTIiwgInNlcnZlcjEub3JnIHNlcnZlcjIub3JnIHNlcnZlcjMub3JnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYmIuZmV0Y2gudHJ1c3RlZF9uZXR3b3JrKHNlbGYuZCwgdXJsKSkKKworCitjbGFzcyBVUkxIYW5kbGUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGF0YXRhYmxlID0geworICAgICAgICJodHRwOi8vd3d3Lmdvb2dsZS5jb20vaW5kZXguaHRtbCIgOiAoJ2h0dHAnLCAnd3d3Lmdvb2dsZS5jb20nLCAnL2luZGV4Lmh0bWwnLCAnJywgJycsIHt9KSwKKyAgICAgICAiY3ZzOi8vYW5vbmN2c0BjdnMuaGFuZGhlbGRzLm9yZy9jdnM7bW9kdWxlPWZhbWlsaWFyL2Rpc3QvaXBrZyIgOiAoJ2N2cycsICdjdnMuaGFuZGhlbGRzLm9yZycsICcvY3ZzJywgJ2Fub25jdnMnLCAnJywgeydtb2R1bGUnOiAnZmFtaWxpYXIvZGlzdC9pcGtnJ30pLAorICAgICAgICJjdnM6Ly9hbm9uY3ZzOmFub255bW91c0BjdnMuaGFuZGhlbGRzLm9yZy9jdnM7dGFnPVYwLTk5LTgxO21vZHVsZT1mYW1pbGlhci9kaXN0L2lwa2ciIDogKCdjdnMnLCAnY3ZzLmhhbmRoZWxkcy5vcmcnLCAnL2N2cycsICdhbm9uY3ZzJywgJ2Fub255bW91cycsIHsndGFnJzogJ1YwLTk5LTgxJywgJ21vZHVsZSc6ICdmYW1pbGlhci9kaXN0L2lwa2cnfSksCisgICAgICAgImdpdDovL2dpdC5vcGVuZW1iZWRkZWQub3JnL2JpdGJha2U7YnJhbmNoPUBmb28iIDogKCdnaXQnLCAnZ2l0Lm9wZW5lbWJlZGRlZC5vcmcnLCAnL2JpdGJha2UnLCAnJywgJycsIHsnYnJhbmNoJzogJ0Bmb28nfSkKKyAgICB9CisKKyAgICBkZWYgdGVzdF9kZWNvZGV1cmwoc2VsZik6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZGF0YXRhYmxlLml0ZW1zKCk6CisgICAgICAgICAgICByZXN1bHQgPSBiYi5mZXRjaC5kZWNvZGV1cmwoaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB2KQorCisgICAgZGVmIHRlc3RfZW5jb2RldXJsKHNlbGYpOgorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmRhdGF0YWJsZS5pdGVtcygpOgorICAgICAgICAgICAgcmVzdWx0ID0gYmIuZmV0Y2guZW5jb2RldXJsKHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgaykKKworY2xhc3MgRmV0Y2hMYXRlc3RWZXJzaW9uVGVzdChGZXRjaGVyVGVzdCk6CisKKyAgICB0ZXN0X2dpdF91cmlzID0geworICAgICAgICAjIHZlcnNpb24gcGF0dGVybiAiWC5ZLloiCisgICAgICAgICgibXgtMS4wIiwgImdpdDovL2dpdGh1Yi5jb20vY2x1dHRlci1wcm9qZWN0L214LmdpdDticmFuY2g9bXgtMS40IiwgIjliMWRiNmI4MDYwYmQwMGIxMjFhNjkyZjk0MjQwNGEyNGFlMjk2MGYiLCAiIikKKyAgICAgICAgICAgIDogIjEuOTkuNCIsCisgICAgICAgICMgdmVyc2lvbiBwYXR0ZXJuICJ2WC5ZIgorICAgICAgICAoIm10ZC11dGlscyIsICJnaXQ6Ly9naXQuaW5mcmFkZWFkLm9yZy9tdGQtdXRpbHMuZ2l0IiwgImNhMzllYjFkOThlNzM2MTA5YzY0ZmY5YzFhYTJhNmVjY2EyMjJkOGYiLCAiIikKKyAgICAgICAgICAgIDogIjEuNS4wIiwKKyAgICAgICAgIyB2ZXJzaW9uIHBhdHRlcm4gInBrZ19uYW1lLVguWSIKKyAgICAgICAgKCJwcmVzZW50cHJvdG8iLCAiZ2l0Oi8vYW5vbmdpdC5mcmVlZGVza3RvcC5vcmcvZ2l0L3hvcmcvcHJvdG8vcHJlc2VudHByb3RvIiwgIjI0ZjNhNTZlNTQxYjBhOWU2YzZlZTc2MDgxZjQ0MTIyMWExMjBlZjkiLCAiIikKKyAgICAgICAgICAgIDogIjEuMCIsCisgICAgICAgICMgdmVyc2lvbiBwYXR0ZXJuICJwa2dfbmFtZS12WC5ZLloiCisgICAgICAgICgiZHRjIiwgImdpdDovL2dpdC5xZW11Lm9yZy9kdGMuZ2l0IiwgIjY1Y2M0ZDI3NDhhMmMyZTZmMjdmMWNmMzllMDdhNWRiYWJkODBlYmYiLCAiIikKKyAgICAgICAgICAgIDogIjEuNC4wIiwKKyAgICAgICAgIyBjb21iaW5hdGlvbiB2ZXJzaW9uIHBhdHRlcm4KKyAgICAgICAgKCJzeXNwcm9mIiwgImdpdDovL2dpdC5nbm9tZS5vcmcvc3lzcHJvZiIsICJjZDQ0ZWU2NjQ0YzM2NDE1MDdmYjUzYjhhMmE2OTEzN2YyOTcxMjE5IiwgIiIpCisgICAgICAgICAgICA6ICIxLjIuMCIsCisgICAgICAgICgidS1ib290LW1raW1hZ2UiLCAiZ2l0Oi8vZ2l0LmRlbnguZGUvdS1ib290LmdpdDticmFuY2g9bWFzdGVyO3Byb3RvY29sPWdpdCIsICI2MmMxNzVmYmI4YTBmOWE5MjZjODgyOTRlYTlmN2U4OGViODk4ZjZjIiwgIiIpCisgICAgICAgICAgICA6ICIyMDE0LjAxIiwKKyAgICAgICAgIyB2ZXJzaW9uIHBhdHRlcm4gInl5eXltbWRkIgorICAgICAgICAoIm1vYmlsZS1icm9hZGJhbmQtcHJvdmlkZXItaW5mbyIsICJnaXQ6Ly9naXQuZ25vbWUub3JnL21vYmlsZS1icm9hZGJhbmQtcHJvdmlkZXItaW5mbyIsICI0ZWQxOWUxMWMyOTc1MTA1YjcxYjk1NjQ0MGFjZGIyNWQ0NmEzNDdkIiwgIiIpCisgICAgICAgICAgICA6ICIyMDEyMDYxNCIsCisgICAgICAgICMgcGFja2FnZXMgd2l0aCBhIHZhbGlkIEdJVFRBR1JFR0VYCisgICAgICAgICgieGY4Ni12aWRlby1vbWFwIiwgImdpdDovL2Fub25naXQuZnJlZWRlc2t0b3Aub3JnL3hvcmcvZHJpdmVyL3hmODYtdmlkZW8tb21hcCIsICJhZTAzOTRlNjg3ZjFhNzdlOTY2Y2Y3MmY4OTVkYTkxODQwZGZmYjhmIiwgIig/UDxwdmVyPihcZCtcLihcZFwuPykqKSkiKQorICAgICAgICAgICAgOiAiMC40LjMiLAorICAgICAgICAoImJ1aWxkLWFwcGxpYW5jZS1pbWFnZSIsICJnaXQ6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9wb2t5IiwgImIzN2RkNDUxYTUyNjIyZDViNTcwMTgzYTgxNTgzY2MzNGMyZmY1NTUiLCAiKD9QPHB2ZXI+KChbMC05XVtcLnxfXT8pK1swLTldKSkiKQorICAgICAgICAgICAgOiAiMTEuMC4wIiwKKyAgICAgICAgKCJjaGtjb25maWctYWx0ZXJuYXRpdmVzLW5hdGl2ZSIsICJnaXQ6Ly9naXRodWIuY29tL2tlcmdvdGgvY2hrY29uZmlnO2JyYW5jaD1zeXNyb290IiwgImNkNDM3ZWNiZDg5ODZjODk0NDQyZjhmY2UxZTAwNjFlMjBmMDRkZWUiLCAiY2hrY29uZmlnXC0oP1A8cHZlcj4oKFxkK1tcLlwtX10qKSspKSIpCisgICAgICAgICAgICA6ICIxLjMuNTkiLAorICAgICAgICAoInJlbWFrZSIsICJnaXQ6Ly9naXRodWIuY29tL3JvY2t5L3JlbWFrZS5naXQiLCAiZjA1NTA4ZTUyMTk4N2M4NDk0YzkyZDljMjg3MWFlYzQ2MzA3ZDUxZCIsICIoP1A8cHZlcj4oXGQrXC4oXGQrXC4pKlxkKihcK2RiZ1xkKyhcLlxkKykqKSopKSIpCisgICAgICAgICAgICA6ICIzLjgyK2RiZzAuOSIsCisgICAgfQorCisgICAgdGVzdF93Z2V0X3VyaXMgPSB7CisgICAgICAgICMgcGFja2FnZXMgd2l0aCB2ZXJzaW9ucyBpbnNpZGUgZGlyZWN0b3J5IG5hbWUKKyAgICAgICAgKCJ1dGlsLWxpbnV4IiwgImh0dHA6Ly9rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy91dGlsLWxpbnV4L3YyLjIzL3V0aWwtbGludXgtMi4yNC4yLnRhci5iejIiLCAiIiwgIiIpCisgICAgICAgICAgICA6ICIyLjI0LjIiLAorICAgICAgICAoImVuY2hhbnQiLCAiaHR0cDovL3d3dy5hYmlzb3VyY2UuY29tL2Rvd25sb2Fkcy9lbmNoYW50LzEuNi4wL2VuY2hhbnQtMS42LjAudGFyLmd6IiwgIiIsICIiKQorICAgICAgICAgICAgOiAiMS42LjAiLAorICAgICAgICAoImNtYWtlIiwgImh0dHA6Ly93d3cuY21ha2Uub3JnL2ZpbGVzL3YyLjgvY21ha2UtMi44LjEyLjEudGFyLmd6IiwgIiIsICIiKQorICAgICAgICAgICAgOiAiMi44LjEyLjEiLAorICAgICAgICAjIHBhY2thZ2VzIHdpdGggdmVyc2lvbnMgb25seSBpbiBjdXJyZW50IGRpcmVjdG9yeQorICAgICAgICAoImVnbGljIiwgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9lZ2xpYmMvZWdsaWJjLTIuMTgtc3ZucjIzNzg3LnRhci5iejIiLCAiIiwgIiIpCisgICAgICAgICAgICA6ICIyLjE5IiwKKyAgICAgICAgKCJnbnUtY29uZmlnIiwgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9nbnUtY29uZmlnL2dudS1jb25maWctMjAxMjA4MTQudGFyLmJ6MiIsICIiLCAiIikKKyAgICAgICAgICAgIDogIjIwMTIwODE0IiwKKyAgICAgICAgIyBwYWNrYWdlcyB3aXRoICI5OSIgaW4gdGhlIG5hbWUgb2YgcG9zc2libGUgdmVyc2lvbgorICAgICAgICAoInB1bHNlYXVkaW8iLCAiaHR0cDovL2ZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9wdWxzZWF1ZGlvL3JlbGVhc2VzL3B1bHNlYXVkaW8tNC4wLnRhci54eiIsICIiLCAiIikKKyAgICAgICAgICAgIDogIjUuMCIsCisgICAgICAgICgieHNlcnZlci14b3JnIiwgImh0dHA6Ly94b3JnLmZyZWVkZXNrdG9wLm9yZy9yZWxlYXNlcy9pbmRpdmlkdWFsL3hzZXJ2ZXIveG9yZy1zZXJ2ZXItMS4xNS4xLnRhci5iejIiLCAiIiwgIiIpCisgICAgICAgICAgICA6ICIxLjE1LjEiLAorICAgICAgICAjIHBhY2thZ2VzIHdpdGggdmFsaWQgUkVHRVhfVVJJIGFuZCBSRUdFWAorICAgICAgICAoImN1cHMiLCAiaHR0cDovL3d3dy5jdXBzLm9yZy9zb2Z0d2FyZS8xLjcuMi9jdXBzLTEuNy4yLXNvdXJjZS50YXIuYnoyIiwgImh0dHA6Ly93d3cuY3Vwcy5vcmcvc29mdHdhcmUucGhwIiwgIig/UDxuYW1lPmN1cHNcLSkoP1A8cHZlcj4oKFxkK1tcLlwtX10qKSspKVwtc291cmNlXC50YXJcLmd6IikKKyAgICAgICAgICAgIDogIjIuMC4wIiwKKyAgICAgICAgKCJkYiIsICJodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9iZXJrZWxleS1kYi9kYi01LjMuMjEudGFyLmd6IiwgImh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9wcm9kdWN0cy9iZXJrZWxleWRiL2Rvd25sb2Fkcy9pbmRleC0wODI5NDQuaHRtbCIsICJodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9vdG4vYmVya2VsZXktZGIvKD9QPG5hbWU+ZGItKSg/UDxwdmVyPigoXGQrW1wuXC1fXSopKykpXC50YXJcLmd6IikKKyAgICAgICAgICAgIDogIjYuMS4xOSIsCisgICAgfQorICAgIGlmIG9zLmVudmlyb24uZ2V0KCJCQl9TS0lQX05FVFRFU1RTIikgPT0gInllcyI6CisgICAgICAgIHByaW50KCJVbnNldCBCQl9TS0lQX05FVFRFU1RTIHRvIHJ1biBuZXR3b3JrIHRlc3RzIikKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF9naXRfbGF0ZXN0X3ZlcnNpb25zdHJpbmcoc2VsZik6CisgICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLnRlc3RfZ2l0X3VyaXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJQTiIsIGtbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiU1JDUkVWIiwga1syXSkKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJHSVRUQUdSRUdFWCIsIGtbM10pCisgICAgICAgICAgICAgICAgdWQgPSBiYi5mZXRjaDIuRmV0Y2hEYXRhKGtbMV0sIHNlbGYuZCkKKyAgICAgICAgICAgICAgICBwdXB2ZXI9IHVkLm1ldGhvZC5sYXRlc3RfdmVyc2lvbnN0cmluZyh1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgIHZlcnN0cmluZyA9IHB1cHZlclswXQorICAgICAgICAgICAgICAgIHIgPSBiYi51dGlscy52ZXJjbXBfc3RyaW5nKHYsIHZlcnN0cmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUociA9PSAtMSBvciByID09IDAsIG1zZz0iUGFja2FnZSAlcywgdmVyc2lvbjogJXMgPD0gJXMiICUgKGtbMF0sIHYsIHZlcnN0cmluZykpCisKKyAgICAgICAgZGVmIHRlc3Rfd2dldF9sYXRlc3RfdmVyc2lvbnN0cmluZyhzZWxmKToKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYudGVzdF93Z2V0X3VyaXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJQTiIsIGtbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5kLnNldFZhcigiUkVHRVhfVVJJIiwga1syXSkKKyAgICAgICAgICAgICAgICBzZWxmLmQuc2V0VmFyKCJSRUdFWCIsIGtbM10pCisgICAgICAgICAgICAgICAgdWQgPSBiYi5mZXRjaDIuRmV0Y2hEYXRhKGtbMV0sIHNlbGYuZCkKKyAgICAgICAgICAgICAgICBwdXB2ZXIgPSB1ZC5tZXRob2QubGF0ZXN0X3ZlcnNpb25zdHJpbmcodWQsIHNlbGYuZCkKKyAgICAgICAgICAgICAgICB2ZXJzdHJpbmcgPSBwdXB2ZXJbMF0KKyAgICAgICAgICAgICAgICByID0gYmIudXRpbHMudmVyY21wX3N0cmluZyh2LCB2ZXJzdHJpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgPT0gLTEgb3IgciA9PSAwLCBtc2c9IlBhY2thZ2UgJXMsIHZlcnNpb246ICVzIDw9ICVzIiAlIChrWzBdLCB2LCB2ZXJzdHJpbmcpKQorCisKK2NsYXNzIEZldGNoQ2hlY2tTdGF0dXNUZXN0KEZldGNoZXJUZXN0KToKKyAgICB0ZXN0X3dnZXRfdXJpcyA9IFsiaHR0cDovL3d3dy5jdXBzLm9yZy9zb2Z0d2FyZS8xLjcuMi9jdXBzLTEuNy4yLXNvdXJjZS50YXIuYnoyIiwKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5jdXBzLm9yZy9zb2Z0d2FyZS9pcHB0b29sL2lwcHRvb2wtMjAxMzA3MzEtbGludXgtdWJ1bnR1LWk2ODYudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5jdXBzLm9yZy8iLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvc2F0by9zYXRvLWVuZ2luZS0wLjEudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2Rvd25sb2Fkcy55b2N0b3Byb2plY3Qub3JnL3JlbGVhc2VzL3NhdG8vc2F0by1lbmdpbmUtMC4yLnRhci5neiIsCisgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9zYXRvL3NhdG8tZW5naW5lLTAuMy50YXIuZ3oiLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL3lvY3RvcHJvamVjdC5vcmcvIiwKKyAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly95b2N0b3Byb2plY3Qub3JnL2RvY3VtZW50YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZG93bmxvYWRzLnlvY3RvcHJvamVjdC5vcmcvcmVsZWFzZXMvb3BrZy9vcGtnLTAuMS43LnRhci5neiIsCisgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9kb3dubG9hZHMueW9jdG9wcm9qZWN0Lm9yZy9yZWxlYXNlcy9vcGtnL29wa2ctMC4zLjAudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZnRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9jb25mL2F1dG9jb25mLTIuNjAudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZnRwOi8vZnRwLmdudS5vcmcvZ251L2NoZXNzL2dudWNoZXNzLTUuMDgudGFyLmd6IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZnRwOi8vZnRwLmdudS5vcmcvZ251L2dtcC9nbXAtNC4wLnRhci5neiIsCisgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgaWYgb3MuZW52aXJvbi5nZXQoIkJCX1NLSVBfTkVUVEVTVFMiKSA9PSAieWVzIjoKKyAgICAgICAgcHJpbnQoIlVuc2V0IEJCX1NLSVBfTkVUVEVTVFMgdG8gcnVuIG5ldHdvcmsgdGVzdHMiKQorICAgIGVsc2U6CisKKyAgICAgICAgZGVmIHRlc3Rfd2dldF9jaGVja3N0YXR1cyhzZWxmKToKKyAgICAgICAgICAgIGZldGNoID0gYmIuZmV0Y2gyLkZldGNoKHNlbGYudGVzdF93Z2V0X3VyaXMsIHNlbGYuZCkKKyAgICAgICAgICAgIGZvciB1IGluIHNlbGYudGVzdF93Z2V0X3VyaXM6CisgICAgICAgICAgICAgICAgdWQgPSBmZXRjaC51ZFt1XQorICAgICAgICAgICAgICAgIG0gPSB1ZC5tZXRob2QKKyAgICAgICAgICAgICAgICByZXQgPSBtLmNoZWNrc3RhdHVzKGZldGNoLCB1ZCwgc2VsZi5kKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXQsIG1zZz0iVVJJICVzLCBjYW4ndCBjaGVjayBzdGF0dXMiICUgKHUpKQorCisKKyAgICAgICAgZGVmIHRlc3Rfd2dldF9jaGVja3N0YXR1c19jb25uZWN0aW9uX2NhY2hlKHNlbGYpOgorICAgICAgICAgICAgZnJvbSBiYi5mZXRjaDIgaW1wb3J0IEZldGNoQ29ubmVjdGlvbkNhY2hlCisKKyAgICAgICAgICAgIGNvbm5lY3Rpb25fY2FjaGUgPSBGZXRjaENvbm5lY3Rpb25DYWNoZSgpCisgICAgICAgICAgICBmZXRjaCA9IGJiLmZldGNoMi5GZXRjaChzZWxmLnRlc3Rfd2dldF91cmlzLCBzZWxmLmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uX2NhY2hlID0gY29ubmVjdGlvbl9jYWNoZSkKKworICAgICAgICAgICAgZm9yIHUgaW4gc2VsZi50ZXN0X3dnZXRfdXJpczoKKyAgICAgICAgICAgICAgICB1ZCA9IGZldGNoLnVkW3VdCisgICAgICAgICAgICAgICAgbSA9IHVkLm1ldGhvZAorICAgICAgICAgICAgICAgIHJldCA9IG0uY2hlY2tzdGF0dXMoZmV0Y2gsIHVkLCBzZWxmLmQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJldCwgbXNnPSJVUkkgJXMsIGNhbid0IGNoZWNrIHN0YXR1cyIgJSAodSkpCisKKyAgICAgICAgICAgIGNvbm5lY3Rpb25fY2FjaGUuY2xvc2VfY29ubmVjdGlvbnMoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdGVzdHMvcGFyc2UucHkgYi9iaXRiYWtlL2xpYi9iYi90ZXN0cy9wYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmViNzZhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdGVzdHMvcGFyc2UucHkKQEAgLTAsMCArMSwxNDcgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIEJpdEJha2UgVGVzdCBmb3IgbGliL2JiL3BhcnNlLworIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGJiCitpbXBvcnQgb3MKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ0JpdEJha2UuVGVzdFBhcnNlJykKKworaW1wb3J0IGJiLnBhcnNlCitpbXBvcnQgYmIuZGF0YQoraW1wb3J0IGJiLnNpZ2dlbgorCitjbGFzcyBQYXJzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdGVzdGZpbGUgPSAiIiIKK0EgPSAiMSIKK0IgPSAiMiIKK2RvX2luc3RhbGwoKSB7CisJZWNobyAiaGVsbG8iCit9CisKK0MgPSAiMyIKKyIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBiYi5kYXRhLmluaXQoKQorICAgICAgICBiYi5wYXJzZS5zaWdnZW4gPSBiYi5zaWdnZW4uaW5pdChzZWxmLmQpCisKKyAgICBkZWYgcGFyc2VoZWxwZXIoc2VsZiwgY29udGVudCwgc3VmZml4ID0gIi5iYiIpOgorCisgICAgICAgIGYgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoc3VmZml4ID0gc3VmZml4KQorICAgICAgICBmLndyaXRlKGNvbnRlbnQpCisgICAgICAgIGYuZmx1c2goKQorICAgICAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoZi5uYW1lKSkKKyAgICAgICAgcmV0dXJuIGYKKworICAgIGRlZiB0ZXN0X3BhcnNlX3NpbXBsZShzZWxmKToKKyAgICAgICAgZiA9IHNlbGYucGFyc2VoZWxwZXIoc2VsZi50ZXN0ZmlsZSkKKyAgICAgICAgZCA9IGJiLnBhcnNlLmhhbmRsZShmLm5hbWUsIHNlbGYuZClbJyddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIkEiLCBUcnVlKSwgIjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJCIiwgVHJ1ZSksICIyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldFZhcigiQyIsIFRydWUpLCAiMyIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9pbmNvbXBsZXRlX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICB0ZXN0ZmlsZUIgPSBzZWxmLnRlc3RmaWxlLnJlcGxhY2UoIn0iLCAiIikKKyAgICAgICAgZiA9IHNlbGYucGFyc2VoZWxwZXIodGVzdGZpbGVCKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGJiLnBhcnNlLlBhcnNlRXJyb3IpOgorICAgICAgICAgICAgZCA9IGJiLnBhcnNlLmhhbmRsZShmLm5hbWUsIHNlbGYuZClbJyddCisKKyAgICBvdmVycmlkZXRlc3QgPSAiIiIKK1JSRUNPTU1FTkRTXyR7UE59ID0gImEiCitSUkVDT01NRU5EU18ke1BOfV9saWJjID0gImIiCitPVkVSUklERVMgPSAibGliYzoke1BOfSIKK1BOID0gImd0aysiCisiIiIKKworICAgIGRlZiB0ZXN0X3BhcnNlX292ZXJyaWRlcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYucGFyc2VoZWxwZXIoc2VsZi5vdmVycmlkZXRlc3QpCisgICAgICAgIGQgPSBiYi5wYXJzZS5oYW5kbGUoZi5uYW1lLCBzZWxmLmQpWycnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJSUkVDT01NRU5EUyIsIFRydWUpLCAiYiIpCisgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJSUkVDT01NRU5EUyIsIFRydWUpLCAiYiIpCisgICAgICAgIGQuc2V0VmFyKCJSUkVDT01NRU5EU19ndGsrIiwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJSUkVDT01NRU5EUyIsIFRydWUpLCAiYyIpCisKKyAgICBvdmVycmlkZXRlc3QyID0gIiIiCitFWFRSQV9PRUNPTkYgPSAiIgorRVhUUkFfT0VDT05GX2NsYXNzLXRhcmdldCA9ICJiIgorRVhUUkFfT0VDT05GX2FwcGVuZCA9ICIgYyIKKyIiIgorCisgICAgZGVmIHRlc3RfcGFyc2Vfb3ZlcnJpZGVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5wYXJzZWhlbHBlcihzZWxmLm92ZXJyaWRldGVzdDIpCisgICAgICAgIGQgPSBiYi5wYXJzZS5oYW5kbGUoZi5uYW1lLCBzZWxmLmQpWycnXQorICAgICAgICBkLmFwcGVuZFZhcigiRVhUUkFfT0VDT05GIiwgIiBkIikKKyAgICAgICAgZC5zZXRWYXIoIk9WRVJSSURFUyIsICJjbGFzcy10YXJnZXQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJFWFRSQV9PRUNPTkYiLCBUcnVlKSwgImIgYyBkIikKKworICAgIG92ZXJyaWRldGVzdDMgPSAiIiIKK0RFU0NSSVBUSU9OID0gIkEiCitERVNDUklQVElPTl8ke1BOfS1kZXYgPSAiJHtERVNDUklQVElPTn0gQiIKK1BOID0gImJjIgorIiIiCisKKyAgICBkZWYgdGVzdF9wYXJzZV9jb21iaW5hdGlvbnMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLnBhcnNlaGVscGVyKHNlbGYub3ZlcnJpZGV0ZXN0MykKKyAgICAgICAgZCA9IGJiLnBhcnNlLmhhbmRsZShmLm5hbWUsIHNlbGYuZClbJyddCisgICAgICAgIGJiLmRhdGEuZXhwYW5kS2V5cyhkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0VmFyKCJERVNDUklQVElPTl9iYy1kZXYiLCBUcnVlKSwgIkEgQiIpCisgICAgICAgIGQuc2V0VmFyKCJERVNDUklQVElPTiIsICJFIikKKyAgICAgICAgZC5zZXRWYXIoIkRFU0NSSVBUSU9OX2JjLWRldiIsICJDIEQiKQorICAgICAgICBkLnNldFZhcigiT1ZFUlJJREVTIiwgImJjLWRldiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRWYXIoIkRFU0NSSVBUSU9OIiwgVHJ1ZSksICJDIEQiKQorCisKKyAgICBjbGFzc2V4dGVuZCA9ICIiIgorVkFSX3Zhcl9vdmVycmlkZTEgPSAiQiIKK0VYVFJBID0gIjpvdmVycmlkZTEiCitPVkVSUklERVMgPSAibm90aGluZyR7RVhUUkF9IgorCitCQkNMQVNTRVhURU5EID0gIiMjI0NMQVNTIyMjIgorIiIiCisgICAgY2xhc3NleHRlbmRfYmJjbGFzcyA9ICIiIgorRVhUUkEgPSAiIgorcHl0aG9uICgpIHsKKyAgICBkLnJlbmFtZVZhcigiVkFSX3ZhciIsICJWQVJfdmFyMiIpCit9CisiIiIKKworICAgICMKKyAgICAjIFRlc3QgYmFzZWQgdXBvbiBhIHJlYWwgd29ybGQgZGF0YSBjb3JydXB0aW9uIGlzc3VlLiBPbmUKKyAgICAjIGRhdGEgc3RvcmUgY2hhbmdpbmcgYSB2YXJpYWJsZSBwb2tlZCB0aHJvdWdoIGludG8gYSBkaWZmZXJlbnQgZGF0YQorICAgICMgc3RvcmUuIFRoaXMgdGVzdCBjYXNlIHJlcGxpY2F0ZXMgdGhhdCBpc3N1ZSB3aGVyZSB0aGUgdmFsdWUgJ0InIHdvdWxkIAorICAgICMgYmVjb21lIHVuc2V0L2Rpc2FwcGVhci4KKyAgICAjCisgICAgZGVmIHRlc3RfcGFyc2VfY2xhc3NleHRlbmRfY29udGFtaW5hdGlvbihzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi5wYXJzZWhlbHBlcihzZWxmLmNsYXNzZXh0ZW5kX2JiY2xhc3MsIHN1ZmZpeD0iLmJiY2xhc3MiKQorICAgICAgICAjY2xzbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoY2xzLm5hbWUpLnJlcGxhY2UoIi5iYmNsYXNzIiwgIiIpCisgICAgICAgIHNlbGYuY2xhc3NleHRlbmQgPSBzZWxmLmNsYXNzZXh0ZW5kLnJlcGxhY2UoIiMjI0NMQVNTIyMjIiwgY2xzLm5hbWUpCisgICAgICAgIGYgPSBzZWxmLnBhcnNlaGVscGVyKHNlbGYuY2xhc3NleHRlbmQpCisgICAgICAgIGFsbGRhdGEgPSBiYi5wYXJzZS5oYW5kbGUoZi5uYW1lLCBzZWxmLmQpCisgICAgICAgIGQxID0gYWxsZGF0YVsnJ10KKyAgICAgICAgZDIgPSBhbGxkYXRhW2Nscy5uYW1lXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLmdldFZhcigiVkFSX3ZhciIsIFRydWUpLCAiQiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZ2V0VmFyKCJWQVJfdmFyIiwgVHJ1ZSksIE5vbmUpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3Rlc3RzL3V0aWxzLnB5IGIvYml0YmFrZS9saWIvYmIvdGVzdHMvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MTUwOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3Rlc3RzL3V0aWxzLnB5CkBAIC0wLDAgKzEsMzc4IEBACisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBCaXRCYWtlIFRlc3RzIGZvciB1dGlscy5weQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGJiCitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQorCitjbGFzcyBWZXJDbXBTdHJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdmVyY21wc3RyaW5nKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBiYi51dGlscy52ZXJjbXBfc3RyaW5nKCcxJywgJzInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0IDwgMCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZygnMicsICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCA+IDApCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcoJzEnLCAnMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCA8IDApCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcoJzEnLCAnMS4xJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCA8IDApCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcoJzEuMScsICcxX3AyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCA8IDApCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcoJzEuMCcsICcxLjArMS4xLWJldGExJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCA8IDApCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLnZlcmNtcF9zdHJpbmcoJzEuMScsICcxLjArMS4xLWJldGExJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCA+IDApCisKKyAgICBkZWYgdGVzdF9leHBsb2RlX2RlcF92ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgY29ycmVjdHJlc3VsdCA9IHsiZm9vIiA6IFsiPSAxLjEwIl19CisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLmV4cGxvZGVfZGVwX3ZlcnNpb25zMigiZm9vICg9IDEuMTApIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNvcnJlY3RyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLmV4cGxvZGVfZGVwX3ZlcnNpb25zMigiZm9vICg9MS4xMCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY29ycmVjdHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKCJmb28gKCA9IDEuMTApIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNvcnJlY3RyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLmV4cGxvZGVfZGVwX3ZlcnNpb25zMigiZm9vICggPTEuMTApIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNvcnJlY3RyZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLmV4cGxvZGVfZGVwX3ZlcnNpb25zMigiZm9vICggPSAxLjEwICkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY29ycmVjdHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMuZXhwbG9kZV9kZXBfdmVyc2lvbnMyKCJmb28gKCA9MS4xMCApIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNvcnJlY3RyZXN1bHQpCisKKyAgICBkZWYgdGVzdF92ZXJjbXBfc3RyaW5nX29wKHNlbGYpOgorICAgICAgICBjb21wYXJlb3BzID0gWygnMScsICcxJywgJz0nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMScsICc9PScsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcxJywgJyE9JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcxJywgJz4nLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzEnLCAnPCcsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMScsICc+PScsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcxJywgJzw9JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzAnLCAnPScsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICc9PScsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICchPScsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcwJywgJz4nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICc8JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMScsICcwJywgJz4+JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzAnLCAnPDwnLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcxJywgJzAnLCAnPj0nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzEnLCAnMCcsICc8PScsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc9JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMCcsICcxJywgJz09JywgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICgnMCcsICcxJywgJyE9JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcwJywgJzEnLCAnPicsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc8JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcwJywgJzEnLCAnPj4nLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcwJywgJzEnLCAnPDwnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc+PScsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJzAnLCAnMScsICc8PScsIFRydWUpXQorCisgICAgICAgIGZvciBhcmcxLCBhcmcyLCBvcCwgY29ycmVjdHJlc3VsdCBpbiBjb21wYXJlb3BzOgorICAgICAgICAgICAgcmVzdWx0ID0gYmIudXRpbHMudmVyY21wX3N0cmluZ19vcChhcmcxLCBhcmcyLCBvcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBjb3JyZWN0cmVzdWx0LCAndmVyY21wX3N0cmluZ19vcCgiJXMiLCAiJXMiLCAiJXMiKSAhPSAlcycgJSAoYXJnMSwgYXJnMiwgb3AsIGNvcnJlY3RyZXN1bHQpKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBjbGVhcmx5IGludmFsaWQgb3BlcmF0b3IgcmFpc2VzIGFuIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiYi51dGlscy5WZXJzaW9uU3RyaW5nRXhjZXB0aW9uLCBiYi51dGlscy52ZXJjbXBfc3RyaW5nX29wLCAnMCcsICcwJywgJyQnKQorCisKK2NsYXNzIFBhdGgodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3Vuc2FmZV9kZWxldGVfcGF0aChzZWxmKToKKyAgICAgICAgY2hlY2tpdGVtcyA9IFsoJy8nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJy8vJywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcvLy8nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAob3MuZ2V0Y3dkKCkuY291bnQob3Muc2VwKSAqICgnLi4nICsgb3Muc2VwKSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKG9zLmVudmlyb24uZ2V0KCdIT01FJywgJy9ob21lL3Rlc3QnKSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcvaG9tZS9zb21lb25lJywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgKCcvaG9tZS9vdGhlci8nLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJy9ob21lL290aGVyL3N1YmRpcicsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJycsIEZhbHNlKV0KKyAgICAgICAgZm9yIGFyZzEsIGNvcnJlY3RyZXN1bHQgaW4gY2hlY2tpdGVtczoKKyAgICAgICAgICAgIHJlc3VsdCA9IGJiLnV0aWxzLl9jaGVja191bnNhZmVfZGVsZXRlX3BhdGgoYXJnMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBjb3JyZWN0cmVzdWx0LCAnX2NoZWNrX3Vuc2FmZV9kZWxldGVfcGF0aCgiJXMiKSAhPSAlcycgJSAoYXJnMSwgY29ycmVjdHJlc3VsdCkpCisKKworY2xhc3MgRWRpdE1ldGFkYXRhRmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgX29yaWdmaWxlID0gIiIiCisjIEEgY29tbWVudAorSEVMTE8gPSAib2xkdmFsdWUiCisKK1RISVMgPSAidGhhdCIKKworIyBBbm90aGVyIGNvbW1lbnQKK05PQ0hBTkdFID0gInNhbWV2YWx1ZSIKK09USEVSID0gJ2Fub3RoZXJ2YWx1ZScKKworTVVMVElMSU5FID0gImExIFxcCisgICAgICAgICAgICAgYTIgXFwKKyAgICAgICAgICAgICBhMyIKKworTVVMVElMSU5FMiA6PSAiIFxcCisgICAgICAgICAgICAgICBiMSBcXAorICAgICAgICAgICAgICAgYjIgXFwKKyAgICAgICAgICAgICAgIGIzIFxcCisgICAgICAgICAgICAgICAiCisKKworTVVMVElMSU5FMyA9ICIgXFwKKyAgICAgICAgICAgICAgYzEgXFwKKyAgICAgICAgICAgICAgYzIgXFwKKyAgICAgICAgICAgICAgYzMgXFwKKyIKKworZG9fZnVuY3Rpb25uYW1lKCkgeworICAgIGNvbW1hbmQxICR7VkFMMX0gJHtWQUwyfQorICAgIGNvbW1hbmQyICR7VkFMM30gJHtWQUw0fQorfQorIiIiCisgICAgZGVmIF90ZXN0ZWRpdGZpbGUoc2VsZiwgdmFydmFsdWVzLCBjb21wYXJldG8sIGR1bW15dmFycz1Ob25lKToKKyAgICAgICAgaWYgZHVtbXl2YXJzIGlzIE5vbmU6CisgICAgICAgICAgICBkdW1teXZhcnMgPSBbXQorICAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgndycsIGRlbGV0ZT1GYWxzZSkgYXMgdGY6CisgICAgICAgICAgICB0Zi53cml0ZShzZWxmLl9vcmlnZmlsZSkKKyAgICAgICAgICAgIHRmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YXJjYWxscyA9IFtdCisgICAgICAgICAgICAgICAgZGVmIGhhbmRsZV9maWxlKHZhcm5hbWUsIG9yaWd2YWx1ZSwgb3AsIG5ld2xpbmVzKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih2YXJuYW1lLCB2YXJ2YWx1ZXMsICdDYWxsYmFjayBjYWxsZWQgZm9yIHZhcmlhYmxlICVzIG5vdCBpbiB0aGUgbGlzdCEnICUgdmFybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbih2YXJuYW1lLCBkdW1teXZhcnMsICdDYWxsYmFjayBjYWxsZWQgZm9yIHZhcmlhYmxlICVzIGluIGR1bW15IGxpc3QhJyAlIHZhcm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHZhcmNhbGxzLmFwcGVuZCh2YXJuYW1lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFydmFsdWVzW3Zhcm5hbWVdCisKKyAgICAgICAgICAgICAgICBiYi51dGlscy5lZGl0X21ldGFkYXRhX2ZpbGUodGYubmFtZSwgdmFydmFsdWVzLmtleXMoKSwgaGFuZGxlX2ZpbGUpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHRmLm5hbWUpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIG1vZGZpbGUgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhlIG91dHB1dCBtYXRjaGVzIHRoZSBleHBlY3RlZCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBhcmV0by5zcGxpdGxpbmVzKFRydWUpLCBtb2RmaWxlKQorICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3YXMgY2FsbGVkIGZvciBldmVyeSB2YXJpYWJsZSB3ZSBhc2tlZCBmb3IKKyAgICAgICAgICAgICAgICAjIChwbHVzIGFsbG93IHRlc3RpbmcgYmVoYXZpb3VyIHdoZW4gYSByZXF1ZXN0ZWQgdmFyaWFibGUgaXMgbm90IHByZXNlbnQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodmFydmFsdWVzLmtleXMoKSksIHNvcnRlZCh2YXJjYWxscyArIGR1bW15dmFycykpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0Zi5uYW1lKQorCisKKyAgICBkZWYgdGVzdF9lZGl0X21ldGFkYXRhX2ZpbGVfbm9jaGFuZ2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBmaWxlIGRvZXNuJ3QgZ2V0IG1vZGlmaWVkIHdpdGggbm90aGluZyB0byBkbworICAgICAgICBzZWxmLl90ZXN0ZWRpdGZpbGUoe30sIHNlbGYuX29yaWdmaWxlKQorICAgICAgICAjIFRlc3QgZmlsZSBkb2Vzbid0IGdldCBtb2RpZmllZCB3aXRoIG9ubHkgZHVtbXkgdmFyaWFibGVzCisgICAgICAgIHNlbGYuX3Rlc3RlZGl0ZmlsZSh7J0RVTU1ZMSc6ICgnc2hvdWxkX25vdF9zZXQnLCBOb25lLCAwLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdEVU1NWTInOiAoJ3Nob3VsZF9ub3Rfc2V0X2FnYWluJywgTm9uZSwgMCwgVHJ1ZSl9LCBzZWxmLl9vcmlnZmlsZSwgZHVtbXl2YXJzPVsnRFVNTVkxJywgJ0RVTU1ZMiddKQorICAgICAgICAjIFRlc3QgZmlsZSBkb2Vzbid0IGdldCBtb2RpZmllZCB3aXRoIHNvbWUgdGhlIHNhbWUgdmFsdWVzCisgICAgICAgIHNlbGYuX3Rlc3RlZGl0ZmlsZSh7J1RISVMnOiAoJ3RoYXQnLCBOb25lLCAwLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdPVEhFUic6ICgnYW5vdGhlcnZhbHVlJywgTm9uZSwgMCwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAnTVVMVElMSU5FMyc6ICgnICAgICAgICAgICAgICAgYzEgICAgICAgICAgICAgICBjMiAgICAgICAgICAgICAgIGMzJywgTm9uZSwgNCwgRmFsc2UpfSwgc2VsZi5fb3JpZ2ZpbGUpCisKKyAgICBkZWYgdGVzdF9lZGl0X21ldGFkYXRhX2ZpbGVfMShzZWxmKToKKworICAgICAgICBuZXdmaWxlMSA9ICIiIgorIyBBIGNvbW1lbnQKK0hFTExPID0gIm5ld3ZhbHVlIgorCitUSElTID0gInRoYXQiCisKKyMgQW5vdGhlciBjb21tZW50CitOT0NIQU5HRSA9ICJzYW1ldmFsdWUiCitPVEhFUiA9ICdhbm90aGVydmFsdWUnCisKK01VTFRJTElORSA9ICJhMSBcXAorICAgICAgICAgICAgIGEyIFxcCisgICAgICAgICAgICAgYTMiCisKK01VTFRJTElORTIgOj0gIiBcXAorICAgICAgICAgICAgICAgYjEgXFwKKyAgICAgICAgICAgICAgIGIyIFxcCisgICAgICAgICAgICAgICBiMyBcXAorICAgICAgICAgICAgICAgIgorCisKK01VTFRJTElORTMgPSAiIFxcCisgICAgICAgICAgICAgIGMxIFxcCisgICAgICAgICAgICAgIGMyIFxcCisgICAgICAgICAgICAgIGMzIFxcCisiCisKK2RvX2Z1bmN0aW9ubmFtZSgpIHsKKyAgICBjb21tYW5kMSAke1ZBTDF9ICR7VkFMMn0KKyAgICBjb21tYW5kMiAke1ZBTDN9ICR7VkFMNH0KK30KKyIiIgorICAgICAgICBzZWxmLl90ZXN0ZWRpdGZpbGUoeydIRUxMTyc6ICgnbmV3dmFsdWUnLCBOb25lLCA0LCBUcnVlKX0sIG5ld2ZpbGUxKQorCisKKyAgICBkZWYgdGVzdF9lZGl0X21ldGFkYXRhX2ZpbGVfMihzZWxmKToKKworICAgICAgICBuZXdmaWxlMiA9ICIiIgorIyBBIGNvbW1lbnQKK0hFTExPID0gIm9sZHZhbHVlIgorCitUSElTID0gInRoYXQiCisKKyMgQW5vdGhlciBjb21tZW50CitOT0NIQU5HRSA9ICJzYW1ldmFsdWUiCitPVEhFUiA9ICdhbm90aGVydmFsdWUnCisKK01VTFRJTElORSA9ICIgXFwKKyAgICBkMSBcXAorICAgIGQyIFxcCisgICAgZDMgXFwKKyAgICAiCisKK01VTFRJTElORTIgOj0gIiBcXAorICAgICAgICAgICAgICAgYjEgXFwKKyAgICAgICAgICAgICAgIGIyIFxcCisgICAgICAgICAgICAgICBiMyBcXAorICAgICAgICAgICAgICAgIgorCisKK01VTFRJTElORTMgPSAibm93c2luZ2xlIgorCitkb19mdW5jdGlvbm5hbWUoKSB7CisgICAgY29tbWFuZDEgJHtWQUwxfSAke1ZBTDJ9CisgICAgY29tbWFuZDIgJHtWQUwzfSAke1ZBTDR9Cit9CisiIiIKKyAgICAgICAgc2VsZi5fdGVzdGVkaXRmaWxlKHsnTVVMVElMSU5FJzogKFsnZDEnLCdkMicsJ2QzJ10sIE5vbmUsIDQsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdNVUxUSUxJTkUzJzogKCdub3dzaW5nbGUnLCBOb25lLCA0LCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdOT1RQUkVTRU5UJzogKFsnYScsICdiJ10sIE5vbmUsIDQsIEZhbHNlKX0sIG5ld2ZpbGUyLCBkdW1teXZhcnM9WydOT1RQUkVTRU5UJ10pCisKKworICAgIGRlZiB0ZXN0X2VkaXRfbWV0YWRhdGFfZmlsZV8zKHNlbGYpOgorCisgICAgICAgIG5ld2ZpbGUzID0gIiIiCisjIEEgY29tbWVudAorSEVMTE8gPSAib2xkdmFsdWUiCisKKyMgQW5vdGhlciBjb21tZW50CitOT0NIQU5HRSA9ICJzYW1ldmFsdWUiCitPVEhFUiA9ICJ5ZXRhbm90aGVydmFsdWUiCisKK01VTFRJTElORSA9ICJlMSBcXAorICAgICAgICAgICAgIGUyIFxcCisgICAgICAgICAgICAgZTMgXFwKKyAgICAgICAgICAgICAiCisKK01VTFRJTElORTIgOj0gImYxIFxcCitcdGYyIFxcCitcdCIKKworCitNVUxUSUxJTkUzID0gIiBcXAorICAgICAgICAgICAgICBjMSBcXAorICAgICAgICAgICAgICBjMiBcXAorICAgICAgICAgICAgICBjMyBcXAorIgorCitkb19mdW5jdGlvbm5hbWUoKSB7CisgICAgb3RoZXJjb21tYW5kX29uZSBhIGIgYworICAgIG90aGVyY29tbWFuZF90d28gZCBlIGYKK30KKyIiIgorCisgICAgICAgIHNlbGYuX3Rlc3RlZGl0ZmlsZSh7J2RvX2Z1bmN0aW9ubmFtZSgpJzogKFsnb3RoZXJjb21tYW5kX29uZSBhIGIgYycsICdvdGhlcmNvbW1hbmRfdHdvIGQgZSBmJ10sIE5vbmUsIDQsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdNVUxUSUxJTkUyJzogKFsnZjEnLCAnZjInXSwgTm9uZSwgJ1x0JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAnTVVMVElMSU5FJzogKFsnZTEnLCAnZTInLCAnZTMnXSwgTm9uZSwgLTEsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RISVMnOiAoTm9uZSwgTm9uZSwgMCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ09USEVSJzogKCd5ZXRhbm90aGVydmFsdWUnLCBOb25lLCAwLCBUcnVlKX0sIG5ld2ZpbGUzKQorCisKKyAgICBkZWYgdGVzdF9lZGl0X21ldGFkYXRhX2ZpbGVfNChzZWxmKToKKworICAgICAgICBuZXdmaWxlNCA9ICIiIgorIyBBIGNvbW1lbnQKK0hFTExPID0gIm9sZHZhbHVlIgorCitUSElTID0gInRoYXQiCisKKyMgQW5vdGhlciBjb21tZW50CitPVEhFUiA9ICdhbm90aGVydmFsdWUnCisKK01VTFRJTElORSA9ICJhMSBcXAorICAgICAgICAgICAgIGEyIFxcCisgICAgICAgICAgICAgYTMiCisKK01VTFRJTElORTIgOj0gIiBcXAorICAgICAgICAgICAgICAgYjEgXFwKKyAgICAgICAgICAgICAgIGIyIFxcCisgICAgICAgICAgICAgICBiMyBcXAorICAgICAgICAgICAgICAgIgorCisKKyIiIgorCisgICAgICAgIHNlbGYuX3Rlc3RlZGl0ZmlsZSh7J05PQ0hBTkdFJzogKE5vbmUsIE5vbmUsIDAsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdNVUxUSUxJTkUzJzogKE5vbmUsIE5vbmUsIDAsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdUSElTJzogKCd0aGF0JywgTm9uZSwgMCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RvX2Z1bmN0aW9ubmFtZSgpJzogKE5vbmUsIE5vbmUsIDAsIEZhbHNlKX0sIG5ld2ZpbGU0KQorCisKKyAgICBkZWYgdGVzdF9lZGl0X21ldGFkYXRhKHNlbGYpOgorICAgICAgICBuZXdmaWxlNSA9ICIiIgorIyBBIGNvbW1lbnQKK0hFTExPID0gImhpdGhlcmUiCisKKyMgQSBuZXcgY29tbWVudAorVEhJUyArPSAidGhhdCIKKworIyBBbm90aGVyIGNvbW1lbnQKK05PQ0hBTkdFID0gInNhbWV2YWx1ZSIKK09USEVSID0gJ2Fub3RoZXJ2YWx1ZScKKworTVVMVElMSU5FID0gImExIFxcCisgICAgICAgICAgICAgYTIgXFwKKyAgICAgICAgICAgICBhMyIKKworTVVMVElMSU5FMiA6PSAiIFxcCisgICAgICAgICAgICAgICBiMSBcXAorICAgICAgICAgICAgICAgYjIgXFwKKyAgICAgICAgICAgICAgIGIzIFxcCisgICAgICAgICAgICAgICAiCisKKworTVVMVElMSU5FMyA9ICIgXFwKKyAgICAgICAgICAgICAgYzEgXFwKKyAgICAgICAgICAgICAgYzIgXFwKKyAgICAgICAgICAgICAgYzMgXFwKKyIKKworTkVXVkFSID0gInZhbHVlIgorCitkb19mdW5jdGlvbm5hbWUoKSB7CisgICAgY29tbWFuZDEgJHtWQUwxfSAke1ZBTDJ9CisgICAgY29tbWFuZDIgJHtWQUwzfSAke1ZBTDR9Cit9CisiIiIKKworCisgICAgICAgIGRlZiBoYW5kbGVfdmFyKHZhcm5hbWUsIG9yaWd2YWx1ZSwgb3AsIG5ld2xpbmVzKToKKyAgICAgICAgICAgIGlmIHZhcm5hbWUgPT0gJ1RISVMnOgorICAgICAgICAgICAgICAgIG5ld2xpbmVzLmFwcGVuZCgnIyBBIG5ldyBjb21tZW50XG4nKQorICAgICAgICAgICAgZWxpZiB2YXJuYW1lID09ICdkb19mdW5jdGlvbm5hbWUoKSc6CisgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCdORVdWQVIgPSAidmFsdWUiXG4nKQorICAgICAgICAgICAgICAgIG5ld2xpbmVzLmFwcGVuZCgnXG4nKQorICAgICAgICAgICAgdmFsdWVpdGVtID0gdmFydmFsdWVzLmdldCh2YXJuYW1lLCBOb25lKQorICAgICAgICAgICAgaWYgdmFsdWVpdGVtOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZWl0ZW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIChvcmlndmFsdWUsIG9wLCAwLCBUcnVlKQorCisgICAgICAgIHZhcnZhbHVlcyA9IHsnSEVMTE8nOiAoJ2hpdGhlcmUnLCBOb25lLCAwLCBUcnVlKSwgJ1RISVMnOiAoJ3RoYXQnLCAnKz0nLCAwLCBUcnVlKX0KKyAgICAgICAgdmFybGlzdCA9IFsnSEVMTE8nLCAnVEhJUycsICdkb19mdW5jdGlvbm5hbWUoKSddCisgICAgICAgICh1cGRhdGVkLCBuZXdsaW5lcykgPSBiYi51dGlscy5lZGl0X21ldGFkYXRhKHNlbGYuX29yaWdmaWxlLnNwbGl0bGluZXMoVHJ1ZSksIHZhcmxpc3QsIGhhbmRsZV92YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1cGRhdGVkLCAnTGlzdCBzaG91bGQgYmUgdXBkYXRlZCBidXQgaXNuXCd0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdsaW5lcywgbmV3ZmlsZTUuc3BsaXRsaW5lcyhUcnVlKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3RpbmZvaWwucHkgYi9iaXRiYWtlL2xpYi9iYi90aW5mb2lsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi90aW5mb2lsLnB5CkBAIC0wLDAgKzEsMTA0IEBACisjIHRpbmZvaWw6IGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGNvb2tlciBmb3IgYml0YmFrZS1iYXNlZCBjb21tYW5kLWxpbmUgdXRpbGl0aWVzCisjCisjIENvcHlyaWdodCAoQykgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTEgTWVudG9yIEdyYXBoaWNzIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IGJiLmNhY2hlCitpbXBvcnQgYmIuY29va2VyCitpbXBvcnQgYmIucHJvdmlkZXJzCitpbXBvcnQgYmIudXRpbHMKK2Zyb20gYmIuY29va2VyIGltcG9ydCBzdGF0ZSwgQkJDb29rZXIsIENvb2tlckZlYXR1cmVzCitmcm9tIGJiLmNvb2tlcmRhdGEgaW1wb3J0IENvb2tlckNvbmZpZ3VyYXRpb24sIENvbmZpZ1BhcmFtZXRlcnMKK2ltcG9ydCBiYi5mZXRjaDIKKworY2xhc3MgVGluZm9pbDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0cHV0PXN5cy5zdGRvdXQsIHRyYWNraW5nPUZhbHNlKToKKyAgICAgICAgIyBOZWVkZWQgdG8gYXZvaWQgZGVwcmVjYXRpb24gd2FybmluZ3Mgd2l0aCBweXRob24gMi42CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcpCisKKyAgICAgICAgIyBTZXQgdXAgbG9nZ2luZworICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdCaXRCYWtlJykKKyAgICAgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihvdXRwdXQpCisgICAgICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGUpCisgICAgICAgIGZvcm1hdCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcigiJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiKQorICAgICAgICBpZiBvdXRwdXQuaXNhdHR5KCk6CisgICAgICAgICAgICBmb3JtYXQuZW5hYmxlX2NvbG9yKCkKKyAgICAgICAgY29uc29sZS5zZXRGb3JtYXR0ZXIoZm9ybWF0KQorICAgICAgICBzZWxmLmxvZ2dlci5hZGRIYW5kbGVyKGNvbnNvbGUpCisKKyAgICAgICAgc2VsZi5jb25maWcgPSBDb29rZXJDb25maWd1cmF0aW9uKCkKKyAgICAgICAgY29uZmlncGFyYW1zID0gVGluZm9pbENvbmZpZ1BhcmFtZXRlcnMocGFyc2Vfb25seT1UcnVlKQorICAgICAgICBzZWxmLmNvbmZpZy5zZXRDb25maWdQYXJhbWV0ZXJzKGNvbmZpZ3BhcmFtcykKKyAgICAgICAgc2VsZi5jb25maWcuc2V0U2VydmVyUmVnSWRsZUNhbGxiYWNrKHNlbGYucmVnaXN0ZXJfaWRsZV9mdW5jdGlvbikKKyAgICAgICAgZmVhdHVyZXMgPSBbXQorICAgICAgICBpZiB0cmFja2luZzoKKyAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChDb29rZXJGZWF0dXJlcy5CQVNFREFUQVNUT1JFX1RSQUNLSU5HKQorICAgICAgICBzZWxmLmNvb2tlciA9IEJCQ29va2VyKHNlbGYuY29uZmlnLCBmZWF0dXJlcykKKyAgICAgICAgc2VsZi5jb25maWdfZGF0YSA9IHNlbGYuY29va2VyLmRhdGEKKyAgICAgICAgYmIucHJvdmlkZXJzLmxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkVSUk9SKQorICAgICAgICBzZWxmLmNvb2tlcl9kYXRhID0gTm9uZQorCisgICAgZGVmIHJlZ2lzdGVyX2lkbGVfZnVuY3Rpb24oc2VsZiwgZnVuY3Rpb24sIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcGFyc2VSZWNpcGVzKHNlbGYpOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJQYXJzaW5nIHJlY2lwZXMuLiIpCisgICAgICAgIHNlbGYubG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuV0FSTklORykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBzZWxmLmNvb2tlci5zdGF0ZSBpbiAoc3RhdGUuaW5pdGlhbCwgc3RhdGUucGFyc2luZyk6CisgICAgICAgICAgICAgICAgc2VsZi5jb29rZXIudXBkYXRlQ2FjaGUoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBzZWxmLmNvb2tlci5zaHV0ZG93bigpCisgICAgICAgICAgICBzZWxmLmNvb2tlci51cGRhdGVDYWNoZSgpCisgICAgICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgICAgIHNlbGYubG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiZG9uZS5cbiIpCisKKyAgICAgICAgc2VsZi5jb29rZXJfZGF0YSA9IHNlbGYuY29va2VyLnJlY2lwZWNhY2hlCisKKyAgICBkZWYgcHJlcGFyZShzZWxmLCBjb25maWdfb25seSA9IEZhbHNlKToKKyAgICAgICAgaWYgbm90IHNlbGYuY29va2VyX2RhdGE6CisgICAgICAgICAgICBpZiBjb25maWdfb25seToKKyAgICAgICAgICAgICAgICBzZWxmLmNvb2tlci5wYXJzZUNvbmZpZ3VyYXRpb24oKQorICAgICAgICAgICAgICAgIHNlbGYuY29va2VyX2RhdGEgPSBzZWxmLmNvb2tlci5yZWNpcGVjYWNoZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlUmVjaXBlcygpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29va2VyLnNodXRkb3duKGZvcmNlPVRydWUpCisgICAgICAgIHNlbGYuY29va2VyLnBvc3Rfc2VydmUoKQorICAgICAgICBzZWxmLmNvb2tlci51bmxvY2tCaXRiYWtlKCkKKworY2xhc3MgVGluZm9pbENvbmZpZ1BhcmFtZXRlcnMoQ29uZmlnUGFyYW1ldGVycyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKipvcHRpb25zKToKKyAgICAgICAgc2VsZi5pbml0aWFsX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHN1cGVyKFRpbmZvaWxDb25maWdQYXJhbWV0ZXJzLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICBkZWYgcGFyc2VDb21tYW5kTGluZShzZWxmLCBhcmd2PXN5cy5hcmd2KToKKyAgICAgICAgY2xhc3MgRHVtbXlPcHRpb25zOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluaXRpYWxfb3B0aW9ucyk6CisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIGluaXRpYWxfb3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgdmFsKQorCisgICAgICAgIHJldHVybiBEdW1teU9wdGlvbnMoc2VsZi5pbml0aWFsX29wdGlvbnMpLCBOb25lCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL2JiL3VpL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODA1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE3IEBACisjCisjIEJpdEJha2UgVUkgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9idWlsZGluZm9oZWxwZXIucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9idWlsZGluZm9oZWxwZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxZWQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2J1aWxkaW5mb2hlbHBlci5weQpAQCAtMCwwICsxLDEzMzkgQEAKKyMKKyMgQml0QmFrZSBUb2FzdGVyVUkgSW1wbGVtZW50YXRpb24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IHN5cworaW1wb3J0IGJiCitpbXBvcnQgcmUKK2ltcG9ydCBvcworCitvcy5lbnZpcm9uWyJESkFOR09fU0VUVElOR1NfTU9EVUxFIl0gPSAidG9hc3Rlci50b2FzdGVybWFpbi5zZXR0aW5ncyIKKworCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKKworCitkZWYgX2NvbmZpZ3VyZV90b2FzdGVyKCk6CisgICAgIiIiIEFkZCB0b2FzdGVyIHRvIHN5cyBwYXRoIGZvciBpbXBvcnRpbmcgbW9kdWxlcworICAgICIiIgorICAgIHN5cy5wYXRoLmFwcGVuZChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSksICd0b2FzdGVyJykpCitfY29uZmlndXJlX3RvYXN0ZXIoKQorCitmcm9tIHRvYXN0ZXIub3JtLm1vZGVscyBpbXBvcnQgQnVpbGQsIFRhc2ssIFJlY2lwZSwgTGF5ZXJfVmVyc2lvbiwgTGF5ZXIsIFRhcmdldCwgTG9nTWVzc2FnZSwgSGVscFRleHQKK2Zyb20gdG9hc3Rlci5vcm0ubW9kZWxzIGltcG9ydCBUYXJnZXRfSW1hZ2VfRmlsZSwgQnVpbGRBcnRpZmFjdAorZnJvbSB0b2FzdGVyLm9ybS5tb2RlbHMgaW1wb3J0IFZhcmlhYmxlLCBWYXJpYWJsZUhpc3RvcnkKK2Zyb20gdG9hc3Rlci5vcm0ubW9kZWxzIGltcG9ydCBQYWNrYWdlLCBQYWNrYWdlX0ZpbGUsIFRhcmdldF9JbnN0YWxsZWRfUGFja2FnZSwgVGFyZ2V0X0ZpbGUKK2Zyb20gdG9hc3Rlci5vcm0ubW9kZWxzIGltcG9ydCBUYXNrX0RlcGVuZGVuY3ksIFBhY2thZ2VfRGVwZW5kZW5jeQorZnJvbSB0b2FzdGVyLm9ybS5tb2RlbHMgaW1wb3J0IFJlY2lwZV9EZXBlbmRlbmN5CisKK2Zyb20gdG9hc3Rlci5vcm0ubW9kZWxzIGltcG9ydCBQcm9qZWN0Citmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZEVudmlyb25tZW50LCBCdWlsZFJlcXVlc3QKKworZnJvbSBiYi5tc2cgaW1wb3J0IEJCTG9nRm9ybWF0dGVyIGFzIGZvcm1hdHRlcgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworZnJvbSBwcHJpbnQgaW1wb3J0IHBmb3JtYXQKK2ltcG9ydCBsb2dnaW5nCisKK2Zyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbiwgY29ubmVjdGlvbgorCisjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyMgdGhlIGxvZ2dlciBuYW1lIGlzIHN0YW5kYXJkIHRocm91Z2hvdXQgQml0QmFrZQorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIlRvYXN0ZXJMb2dnZXIiKQorCisKK2NsYXNzIE5vdEV4aXN0aW5nKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBPUk1XcmFwcGVyKG9iamVjdCk6CisgICAgIiIiIFRoaXMgY2xhc3MgY3JlYXRlcyB0aGUgZGljdGlvbmFyaWVzIG5lZWRlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgZGF0YWJhc2UKKyAgICAgICAgZm9sbG93aW5nIHRoZSBmb3JtYXQgZGVmaW5lZCBieSB0aGUgRGphbmdvIG1vZGVscy4gSXQgaXMgYWxzbyB1c2VkIHRvIHNhdmUgdGhpcworICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgZGF0YWJhc2UuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubGF5ZXJfdmVyc2lvbl9vYmplY3RzID0gW10KKyAgICAgICAgc2VsZi50YXNrX29iamVjdHMgPSB7fQorICAgICAgICBzZWxmLnJlY2lwZV9vYmplY3RzID0ge30KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2J1aWxkX2tleSgqKmt3YXJncyk6CisgICAgICAgIGtleSA9ICIwIgorICAgICAgICBmb3IgayBpbiBzb3J0ZWQoa3dhcmdzLmtleXMoKSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3YXJnc1trXSwgbW9kZWxzLk1vZGVsKToKKyAgICAgICAgICAgICAgICBrZXkgKz0gIi0lZCIgJSBrd2FyZ3Nba10uaWQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAga2V5ICs9ICItJXMiICUgc3RyKGt3YXJnc1trXSkKKyAgICAgICAgcmV0dXJuIGtleQorCisKKyAgICBkZWYgX2NhY2hlZF9nZXRfb3JfY3JlYXRlKHNlbGYsIGNsYXp6LCAqKmt3YXJncyk6CisgICAgICAgICIiIiBUaGlzIGlzIGEgbWVtb3J5LWNhY2hlZCBnZXRfb3JfY3JlYXRlLiBXZSBhc3N1bWUgdGhhdCB0aGUgb2JqZWN0cyB3aWxsIG5vdCBiZSBjcmVhdGVkIGluIHRoZQorICAgICAgICAgICAgZGF0YWJhc2UgdGhyb3VnaCBhbnkgb3RoZXIgbWVhbnMuCisgICAgICAgICIiIgorCisgICAgICAgIGFzc2VydCBpc3N1YmNsYXNzKGNsYXp6LCBtb2RlbHMuTW9kZWwpLCAiX2NhY2hlZF9nZXRfb3JfY3JlYXRlIG5lZWRzIHRvIGdldCB0aGUgY2xhc3MgYXMgZmlyc3QgYXJndW1lbnQiCisKKyAgICAgICAga2V5ID0gT1JNV3JhcHBlci5fYnVpbGRfa2V5KCoqa3dhcmdzKQorICAgICAgICBkaWN0bmFtZSA9ICJvYmplY3RzXyVzIiAlIGNsYXp6Ll9fbmFtZV9fCisgICAgICAgIGlmIG5vdCBkaWN0bmFtZSBpbiB2YXJzKHNlbGYpLmtleXMoKToKKyAgICAgICAgICAgIHZhcnMoc2VsZilbZGljdG5hbWVdID0ge30KKworICAgICAgICBjcmVhdGVkID0gRmFsc2UKKyAgICAgICAgaWYgbm90IGtleSBpbiB2YXJzKHNlbGYpW2RpY3RuYW1lXS5rZXlzKCk6CisgICAgICAgICAgICB2YXJzKHNlbGYpW2RpY3RuYW1lXVtrZXldID0gY2xhenoub2JqZWN0cy5jcmVhdGUoKiprd2FyZ3MpCisgICAgICAgICAgICBjcmVhdGVkID0gVHJ1ZQorCisgICAgICAgIHJldHVybiAodmFycyhzZWxmKVtkaWN0bmFtZV1ba2V5XSwgY3JlYXRlZCkKKworCisgICAgZGVmIF9jYWNoZWRfZ2V0KHNlbGYsIGNsYXp6LCAqKmt3YXJncyk6CisgICAgICAgICIiIiBUaGlzIGlzIGEgbWVtb3J5LWNhY2hlZCBnZXQuIFdlIGFzc3VtZSB0aGF0IHRoZSBvYmplY3RzIHdpbGwgbm90IGNoYW5nZSAgaW4gdGhlIGRhdGFiYXNlIGJldHdlZW4gZ2V0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBpc3N1YmNsYXNzKGNsYXp6LCBtb2RlbHMuTW9kZWwpLCAiX2NhY2hlZF9nZXQgbmVlZHMgdG8gZ2V0IHRoZSBjbGFzcyBhcyBmaXJzdCBhcmd1bWVudCIKKworICAgICAgICBrZXkgPSBPUk1XcmFwcGVyLl9idWlsZF9rZXkoKiprd2FyZ3MpCisgICAgICAgIGRpY3RuYW1lID0gIm9iamVjdHNfJXMiICUgY2xhenouX19uYW1lX18KKworICAgICAgICBpZiBub3QgZGljdG5hbWUgaW4gdmFycyhzZWxmKS5rZXlzKCk6CisgICAgICAgICAgICB2YXJzKHNlbGYpW2RpY3RuYW1lXSA9IHt9CisKKyAgICAgICAgaWYgbm90IGtleSBpbiB2YXJzKHNlbGYpW2RpY3RuYW1lXS5rZXlzKCk6CisgICAgICAgICAgICB2YXJzKHNlbGYpW2RpY3RuYW1lXVtrZXldID0gY2xhenoub2JqZWN0cy5nZXQoKiprd2FyZ3MpCisKKyAgICAgICAgcmV0dXJuIHZhcnMoc2VsZilbZGljdG5hbWVdW2tleV0KKworICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgICAgIyB3ZSBkaXNhYmxlIGRldGVjdGlvbiBvZiBubyBzZWxmIHVzZSBpbiBmdW5jdGlvbnMgYmVjYXVzZSB0aGUgbWV0aG9kcyBhY3R1YWxseSB3b3JrIG9uIHRoZSBvYmplY3QKKyAgICAjIGV2ZW4gaWYgdGhleSBkb24ndCB0b3VjaCBzZWxmIGFueXdoZXJlCisKKyAgICAjIHB5bGludDogZGlzYWJsZT1iYWQtY29udGludWF0aW9uCisgICAgIyB3ZSBkbyBub3QgZm9sbG93IHRoZSBweXRob24gY29udmVudGlvbnMgZm9yIGNvbnRpbnVhdGlvbiBpbmRlbnRhdGlvbiBkdWUgdG8gbG9uZyBsaW5lcyBoZXJlCisKKyAgICBkZWYgY3JlYXRlX2J1aWxkX29iamVjdChzZWxmLCBidWlsZF9pbmZvLCBicmJlLCBwcm9qZWN0X2lkKToKKyAgICAgICAgYXNzZXJ0ICdtYWNoaW5lJyBpbiBidWlsZF9pbmZvCisgICAgICAgIGFzc2VydCAnZGlzdHJvJyBpbiBidWlsZF9pbmZvCisgICAgICAgIGFzc2VydCAnZGlzdHJvX3ZlcnNpb24nIGluIGJ1aWxkX2luZm8KKyAgICAgICAgYXNzZXJ0ICdzdGFydGVkX29uJyBpbiBidWlsZF9pbmZvCisgICAgICAgIGFzc2VydCAnY29va2VyX2xvZ19wYXRoJyBpbiBidWlsZF9pbmZvCisgICAgICAgIGFzc2VydCAnYnVpbGRfbmFtZScgaW4gYnVpbGRfaW5mbworICAgICAgICBhc3NlcnQgJ2JpdGJha2VfdmVyc2lvbicgaW4gYnVpbGRfaW5mbworCisgICAgICAgIHByaiA9IE5vbmUKKyAgICAgICAgYnVpbGRyZXF1ZXN0ID0gTm9uZQorICAgICAgICBpZiBicmJlIGlzIG5vdCBOb25lOiAgICAgICAgICAgICMgdGhpcyBidWlsZCB3YXMgdHJpZ2dlcmVkIGJ5IGEgcmVxdWVzdCBmcm9tIGEgdXNlcgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJidWlsZGluZm9oZWxwZXI6IGJyYmUgaXMgJXMiICUgYnJiZSkKKyAgICAgICAgICAgIGJyLCBfID0gYnJiZS5zcGxpdCgiOiIpCisgICAgICAgICAgICBidWlsZHJlcXVlc3QgPSBCdWlsZFJlcXVlc3Qub2JqZWN0cy5nZXQocGsgPSBicikKKyAgICAgICAgICAgIHByaiA9IGJ1aWxkcmVxdWVzdC5wcm9qZWN0CisKKyAgICAgICAgZWxpZiBwcm9qZWN0X2lkIGlzIG5vdCBOb25lOiAgICAjIHRoaXMgYnVpbGQgd2FzIHRyaWdnZXJlZCBieSBhbiBleHRlcm5hbCBzeXN0ZW0gZm9yIGEgc3BlY2lmaWMgcHJvamVjdAorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJidWlsZGluZm9oZWxwZXI6IHByb2plY3QgaXMgJXMiICUgcHJqKQorICAgICAgICAgICAgcHJqID0gUHJvamVjdC5vYmplY3RzLmdldChwayA9IHByb2plY3RfaWQpCisKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoaXMgYnVpbGQgd2FzIHRyaWdnZXJlZCBieSBhIGxlZ2FjeSBzeXN0ZW0sIG9yIGNvbW1hbmQgbGluZSBpbnRlcmFjdGl2ZSBtb2RlCisgICAgICAgICAgICBwcmogPSBQcm9qZWN0Lm9iamVjdHMuZ2V0X2RlZmF1bHRfcHJvamVjdCgpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoMSwgImJ1aWxkaW5mb2hlbHBlcjogcHJvamVjdCBpcyBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0aW5nIHRvICVzIiAlIHByaikKKworCisgICAgICAgIGlmIGJ1aWxkcmVxdWVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGJ1aWxkID0gYnVpbGRyZXF1ZXN0LmJ1aWxkCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRpbmcgZXhpc3RpbmcgYnVpbGQsIHdpdGggJXMiLCBidWlsZF9pbmZvKQorICAgICAgICAgICAgYnVpbGQucHJvamVjdCA9IHByagorICAgICAgICAgICAgYnVpbGQubWFjaGluZT1idWlsZF9pbmZvWydtYWNoaW5lJ10KKyAgICAgICAgICAgIGJ1aWxkLmRpc3Rybz1idWlsZF9pbmZvWydkaXN0cm8nXQorICAgICAgICAgICAgYnVpbGQuZGlzdHJvX3ZlcnNpb249YnVpbGRfaW5mb1snZGlzdHJvX3ZlcnNpb24nXQorICAgICAgICAgICAgYnVpbGQuY29va2VyX2xvZ19wYXRoPWJ1aWxkX2luZm9bJ2Nvb2tlcl9sb2dfcGF0aCddCisgICAgICAgICAgICBidWlsZC5idWlsZF9uYW1lPWJ1aWxkX2luZm9bJ2J1aWxkX25hbWUnXQorICAgICAgICAgICAgYnVpbGQuYml0YmFrZV92ZXJzaW9uPWJ1aWxkX2luZm9bJ2JpdGJha2VfdmVyc2lvbiddCisgICAgICAgICAgICBidWlsZC5zYXZlKCkKKworICAgICAgICAgICAgVGFyZ2V0Lm9iamVjdHMuZmlsdGVyKGJ1aWxkID0gYnVpbGQpLmRlbGV0ZSgpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1aWxkID0gQnVpbGQub2JqZWN0cy5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gcHJqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZT1idWlsZF9pbmZvWydtYWNoaW5lJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cm89YnVpbGRfaW5mb1snZGlzdHJvJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cm9fdmVyc2lvbj1idWlsZF9pbmZvWydkaXN0cm9fdmVyc2lvbiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZF9vbj1idWlsZF9pbmZvWydzdGFydGVkX29uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRfb249YnVpbGRfaW5mb1snc3RhcnRlZF9vbiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VyX2xvZ19wYXRoPWJ1aWxkX2luZm9bJ2Nvb2tlcl9sb2dfcGF0aCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfbmFtZT1idWlsZF9pbmZvWydidWlsZF9uYW1lJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYWtlX3ZlcnNpb249YnVpbGRfaW5mb1snYml0YmFrZV92ZXJzaW9uJ10pCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKDEsICJidWlsZGluZm9oZWxwZXI6IGJ1aWxkIGlzIGNyZWF0ZWQgJXMiICUgYnVpbGQpCisKKyAgICAgICAgaWYgYnVpbGRyZXF1ZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVpbGRyZXF1ZXN0LmJ1aWxkID0gYnVpbGQKKyAgICAgICAgICAgIGJ1aWxkcmVxdWVzdC5zYXZlKCkKKworICAgICAgICByZXR1cm4gYnVpbGQKKworICAgIGRlZiBjcmVhdGVfdGFyZ2V0X29iamVjdHMoc2VsZiwgdGFyZ2V0X2luZm8pOgorICAgICAgICBhc3NlcnQgJ2J1aWxkJyBpbiB0YXJnZXRfaW5mbworICAgICAgICBhc3NlcnQgJ3RhcmdldHMnIGluIHRhcmdldF9pbmZvCisKKyAgICAgICAgdGFyZ2V0cyA9IFtdCisgICAgICAgIGZvciB0Z3RfbmFtZSBpbiB0YXJnZXRfaW5mb1sndGFyZ2V0cyddOgorICAgICAgICAgICAgdGd0X29iamVjdCA9IFRhcmdldC5vYmplY3RzLmNyZWF0ZSggYnVpbGQgPSB0YXJnZXRfaW5mb1snYnVpbGQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRndF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaW1hZ2UgPSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRhcmdldHMuYXBwZW5kKHRndF9vYmplY3QpCisgICAgICAgIHJldHVybiB0YXJnZXRzCisKKyAgICBkZWYgdXBkYXRlX2J1aWxkX29iamVjdChzZWxmLCBidWlsZCwgZXJyb3JzLCB3YXJuaW5ncywgdGFza2ZhaWx1cmVzKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVpbGQsQnVpbGQpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGVycm9ycywgaW50KQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh3YXJuaW5ncywgaW50KQorCisgICAgICAgIG91dGNvbWUgPSBCdWlsZC5TVUNDRUVERUQKKyAgICAgICAgaWYgZXJyb3JzIG9yIHRhc2tmYWlsdXJlczoKKyAgICAgICAgICAgIG91dGNvbWUgPSBCdWlsZC5GQUlMRUQKKworICAgICAgICBidWlsZC5jb21wbGV0ZWRfb24gPSB0aW1lem9uZS5ub3coKQorICAgICAgICBidWlsZC5vdXRjb21lID0gb3V0Y29tZQorICAgICAgICBidWlsZC5zYXZlKCkKKworICAgIGRlZiB1cGRhdGVfdGFyZ2V0X3NldF9saWNlbnNlX21hbmlmZXN0KHNlbGYsIHRhcmdldCwgbGljZW5zZV9tYW5pZmVzdF9wYXRoKToKKyAgICAgICAgdGFyZ2V0LmxpY2Vuc2VfbWFuaWZlc3RfcGF0aCA9IGxpY2Vuc2VfbWFuaWZlc3RfcGF0aAorICAgICAgICB0YXJnZXQuc2F2ZSgpCisKKyAgICBkZWYgZ2V0X3VwZGF0ZV90YXNrX29iamVjdChzZWxmLCB0YXNrX2luZm9ybWF0aW9uLCBtdXN0X2V4aXN0ID0gRmFsc2UpOgorICAgICAgICBhc3NlcnQgJ2J1aWxkJyBpbiB0YXNrX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAncmVjaXBlJyBpbiB0YXNrX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAndGFza19uYW1lJyBpbiB0YXNrX2luZm9ybWF0aW9uCisKKyAgICAgICAgIyB3ZSB1c2UgbXVzdF9leGlzdCBpbmZvIGZvciBkYXRhYmFzZSBsb29rLXVwIG9wdGltaXphdGlvbgorICAgICAgICB0YXNrX29iamVjdCwgY3JlYXRlZCA9IHNlbGYuX2NhY2hlZF9nZXRfb3JfY3JlYXRlKFRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZD10YXNrX2luZm9ybWF0aW9uWydidWlsZCddLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBlPXRhc2tfaW5mb3JtYXRpb25bJ3JlY2lwZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFza19uYW1lPXRhc2tfaW5mb3JtYXRpb25bJ3Rhc2tfbmFtZSddCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGlmIGNyZWF0ZWQgYW5kIG11c3RfZXhpc3Q6CisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydkZWJ1ZyddID0gImJ1aWxkIGlkICVkLCByZWNpcGUgaWQgJWQiICUgKHRhc2tfaW5mb3JtYXRpb25bJ2J1aWxkJ10ucGssIHRhc2tfaW5mb3JtYXRpb25bJ3JlY2lwZSddLnBrKQorICAgICAgICAgICAgcmFpc2UgTm90RXhpc3RpbmcoIlRhc2sgb2JqZWN0IGNyZWF0ZWQgd2hlbiBleHBlY3RlZCB0byBleGlzdCIsIHRhc2tfaW5mb3JtYXRpb24pCisKKyAgICAgICAgb2JqZWN0X2NoYW5nZWQgPSBGYWxzZQorICAgICAgICBmb3IgdiBpbiB2YXJzKHRhc2tfb2JqZWN0KToKKyAgICAgICAgICAgIGlmIHYgaW4gdGFza19pbmZvcm1hdGlvbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgdmFycyh0YXNrX29iamVjdClbdl0gIT0gdGFza19pbmZvcm1hdGlvblt2XToKKyAgICAgICAgICAgICAgICAgICAgdmFycyh0YXNrX29iamVjdClbdl0gPSB0YXNrX2luZm9ybWF0aW9uW3ZdCisgICAgICAgICAgICAgICAgICAgIG9iamVjdF9jaGFuZ2VkID0gVHJ1ZQorCisgICAgICAgICMgdXBkYXRlIHNldHNjZW5lLXJlbGF0ZWQgaW5mb3JtYXRpb24gaWYgdGhlIHRhc2sgaGFzIGEgc2V0c2NlbmUKKyAgICAgICAgaWYgdGFza19vYmplY3Qub3V0Y29tZSA9PSBUYXNrLk9VVENPTUVfQ09WRVJFRCBhbmQgMSA9PSB0YXNrX29iamVjdC5nZXRfcmVsYXRlZF9zZXRzY2VuZSgpLmNvdW50KCk6CisgICAgICAgICAgICB0YXNrX29iamVjdC5vdXRjb21lID0gVGFzay5PVVRDT01FX0NBQ0hFRAorICAgICAgICAgICAgb2JqZWN0X2NoYW5nZWQgPSBUcnVlCisKKyAgICAgICAgICAgIG91dGNvbWVfdGFza19zZXRzY2VuZSA9IFRhc2sub2JqZWN0cy5nZXQodGFza19leGVjdXRlZD1UcnVlLCBidWlsZCA9IHRhc2tfb2JqZWN0LmJ1aWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBlID0gdGFza19vYmplY3QucmVjaXBlLCB0YXNrX25hbWU9dGFza19vYmplY3QudGFza19uYW1lKyJfc2V0c2NlbmUiKS5vdXRjb21lCisgICAgICAgICAgICBpZiBvdXRjb21lX3Rhc2tfc2V0c2NlbmUgPT0gVGFzay5PVVRDT01FX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgdGFza19vYmplY3Quc3N0YXRlX3Jlc3VsdCA9IFRhc2suU1NUQVRFX1JFU1RPUkVECisgICAgICAgICAgICAgICAgb2JqZWN0X2NoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICBlbGlmIG91dGNvbWVfdGFza19zZXRzY2VuZSA9PSBUYXNrLk9VVENPTUVfRkFJTEVEOgorICAgICAgICAgICAgICAgIHRhc2tfb2JqZWN0LnNzdGF0ZV9yZXN1bHQgPSBUYXNrLlNTVEFURV9GQUlMRUQKKyAgICAgICAgICAgICAgICBvYmplY3RfY2hhbmdlZCA9IFRydWUKKworICAgICAgICAjIG1hcmsgZG93biBkdXJhdGlvbiBpZiB3ZSBoYXZlIGEgc3RhcnQgdGltZSBhbmQgYSBjdXJyZW50IHRpbWUKKyAgICAgICAgaWYgJ3N0YXJ0X3RpbWUnIGluIHRhc2tfaW5mb3JtYXRpb24ua2V5cygpIGFuZCAnZW5kX3RpbWUnIGluIHRhc2tfaW5mb3JtYXRpb24ua2V5cygpOgorICAgICAgICAgICAgZHVyYXRpb24gPSB0YXNrX2luZm9ybWF0aW9uWydlbmRfdGltZSddIC0gdGFza19pbmZvcm1hdGlvblsnc3RhcnRfdGltZSddCisgICAgICAgICAgICB0YXNrX29iamVjdC5lbGFwc2VkX3RpbWUgPSBkdXJhdGlvbgorICAgICAgICAgICAgb2JqZWN0X2NoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICBkZWwgdGFza19pbmZvcm1hdGlvblsnc3RhcnRfdGltZSddCisgICAgICAgICAgICBkZWwgdGFza19pbmZvcm1hdGlvblsnZW5kX3RpbWUnXQorCisgICAgICAgIGlmIG9iamVjdF9jaGFuZ2VkOgorICAgICAgICAgICAgdGFza19vYmplY3Quc2F2ZSgpCisgICAgICAgIHJldHVybiB0YXNrX29iamVjdAorCisKKyAgICBkZWYgZ2V0X3VwZGF0ZV9yZWNpcGVfb2JqZWN0KHNlbGYsIHJlY2lwZV9pbmZvcm1hdGlvbiwgbXVzdF9leGlzdCA9IEZhbHNlKToKKyAgICAgICAgYXNzZXJ0ICdsYXllcl92ZXJzaW9uJyBpbiByZWNpcGVfaW5mb3JtYXRpb24KKyAgICAgICAgYXNzZXJ0ICdmaWxlX3BhdGgnIGluIHJlY2lwZV9pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ3BhdGhmbGFncycgaW4gcmVjaXBlX2luZm9ybWF0aW9uCisKKyAgICAgICAgYXNzZXJ0IG5vdCByZWNpcGVfaW5mb3JtYXRpb25bJ2ZpbGVfcGF0aCddLnN0YXJ0c3dpdGgoIi8iKSAgICAgICMgd2Ugc2hvdWxkIGhhdmUgbGF5ZXItcmVsYXRpdmUgcGF0aHMgYXQgYWxsIHRpbWVzCisKKyAgICAgICAgcmVjaXBlX29iamVjdCwgY3JlYXRlZCA9IHNlbGYuX2NhY2hlZF9nZXRfb3JfY3JlYXRlKFJlY2lwZSwgbGF5ZXJfdmVyc2lvbj1yZWNpcGVfaW5mb3JtYXRpb25bJ2xheWVyX3ZlcnNpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3BhdGg9cmVjaXBlX2luZm9ybWF0aW9uWydmaWxlX3BhdGgnXSwgcGF0aGZsYWdzID0gcmVjaXBlX2luZm9ybWF0aW9uWydwYXRoZmxhZ3MnXSkKKyAgICAgICAgaWYgY3JlYXRlZCBhbmQgbXVzdF9leGlzdDoKKyAgICAgICAgICAgIHJhaXNlIE5vdEV4aXN0aW5nKCJSZWNpcGUgb2JqZWN0IGNyZWF0ZWQgd2hlbiBleHBlY3RlZCB0byBleGlzdCIsIHJlY2lwZV9pbmZvcm1hdGlvbikKKworICAgICAgICBvYmplY3RfY2hhbmdlZCA9IEZhbHNlCisgICAgICAgIGZvciB2IGluIHZhcnMocmVjaXBlX29iamVjdCk6CisgICAgICAgICAgICBpZiB2IGluIHJlY2lwZV9pbmZvcm1hdGlvbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgb2JqZWN0X2NoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdmFycyhyZWNpcGVfb2JqZWN0KVt2XSA9IHJlY2lwZV9pbmZvcm1hdGlvblt2XQorCisgICAgICAgIGlmIG9iamVjdF9jaGFuZ2VkOgorICAgICAgICAgICAgcmVjaXBlX29iamVjdC5zYXZlKCkKKworICAgICAgICByZXR1cm4gcmVjaXBlX29iamVjdAorCisgICAgZGVmIGdldF91cGRhdGVfbGF5ZXJfdmVyc2lvbl9vYmplY3Qoc2VsZiwgYnVpbGRfb2JqLCBsYXllcl9vYmosIGxheWVyX3ZlcnNpb25faW5mb3JtYXRpb24pOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWlsZF9vYmosIEJ1aWxkKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShsYXllcl9vYmosIExheWVyKQorICAgICAgICBhc3NlcnQgJ2JyYW5jaCcgaW4gbGF5ZXJfdmVyc2lvbl9pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ2NvbW1pdCcgaW4gbGF5ZXJfdmVyc2lvbl9pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ3ByaW9yaXR5JyBpbiBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uCisgICAgICAgIGFzc2VydCAnbG9jYWxfcGF0aCcgaW4gbGF5ZXJfdmVyc2lvbl9pbmZvcm1hdGlvbgorCisgICAgICAgIGxheWVyX3ZlcnNpb25fb2JqZWN0LCBfID0gTGF5ZXJfVmVyc2lvbi5vYmplY3RzLmdldF9vcl9jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZCA9IGJ1aWxkX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gbGF5ZXJfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoID0gbGF5ZXJfdmVyc2lvbl9pbmZvcm1hdGlvblsnYnJhbmNoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21taXQgPSBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uWydjb21taXQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gbGF5ZXJfdmVyc2lvbl9pbmZvcm1hdGlvblsncHJpb3JpdHknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BhdGggPSBsYXllcl92ZXJzaW9uX2luZm9ybWF0aW9uWydsb2NhbF9wYXRoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5sYXllcl92ZXJzaW9uX29iamVjdHMuYXBwZW5kKGxheWVyX3ZlcnNpb25fb2JqZWN0KQorCisgICAgICAgIHJldHVybiBsYXllcl92ZXJzaW9uX29iamVjdAorCisgICAgZGVmIGdldF91cGRhdGVfbGF5ZXJfb2JqZWN0KHNlbGYsIGxheWVyX2luZm9ybWF0aW9uLCBicmJlKToKKyAgICAgICAgYXNzZXJ0ICduYW1lJyBpbiBsYXllcl9pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ2xheWVyX2luZGV4X3VybCcgaW4gbGF5ZXJfaW5mb3JtYXRpb24KKworICAgICAgICBpZiBicmJlIGlzIE5vbmU6CisgICAgICAgICAgICBsYXllcl9vYmplY3QsIF8gPSBMYXllci5vYmplY3RzLmdldF9vcl9jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bGF5ZXJfaW5mb3JtYXRpb25bJ25hbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfaW5kZXhfdXJsPWxheWVyX2luZm9ybWF0aW9uWydsYXllcl9pbmRleF91cmwnXSkKKyAgICAgICAgICAgIHJldHVybiBsYXllcl9vYmplY3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgd2UgYXJlIHVuZGVyIG1hbmFnZWQgbW9kZTsgd2UgbXVzdCBtYXRjaCB0aGUgbGF5ZXIgdXNlZCBpbiB0aGUgUHJvamVjdCBMYXllcgorICAgICAgICAgICAgYnJfaWQsIGJlX2lkID0gYnJiZS5zcGxpdCgiOiIpCisKKyAgICAgICAgICAgICMgZmluZCBsYXllciBieSBjaGVja291dCBwYXRoOworICAgICAgICAgICAgZnJvbSBibGRjb250cm9sIGltcG9ydCBiYmNvbnRyb2xsZXIKKyAgICAgICAgICAgIGJjID0gYmJjb250cm9sbGVyLmdldEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKHBrID0gYmVfaWQpCisKKyAgICAgICAgICAgICMgd2UgbWlnaHQgaGF2ZSBhIHJhY2UgY29uZGl0aW9uIGhlcmUsIGFzIHRoZSBwcm9qZWN0IGxheWVycyBtYXkgY2hhbmdlIGJldHdlZW4gdGhlIGJ1aWxkIHRyaWdnZXIgYW5kIHRoZSBhY3R1YWwgYnVpbGQgZXhlY3V0aW9uCisgICAgICAgICAgICAjIGJ1dCB3ZSBjYW4gb25seSBtYXRjaCBvbiB0aGUgbGF5ZXIgbmFtZSwgc28gdGhlIHdvcnN0IHRoaW5nIGNhbiBoYXBwZW4gaXMgYSBtaXMtaWRlbnRpZmljYXRpb24gb2YgdGhlIGxheWVyLCBub3QgYSB0b3RhbCBmYWlsdXJlCisKKyAgICAgICAgICAgICMgbm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50CisgICAgICAgICAgICBidWlsZHJlcXVlc3QgPSBCdWlsZFJlcXVlc3Qub2JqZWN0cy5nZXQocGsgPSBicl9pZCkKKyAgICAgICAgICAgIGZvciBicmwgaW4gYnVpbGRyZXF1ZXN0LmJybGF5ZXJfc2V0LmFsbCgpOgorICAgICAgICAgICAgICAgIGxvY2FsZGlybmFtZSA9IG9zLnBhdGguam9pbihiYy5nZXRHaXRDbG9uZURpcmVjdG9yeShicmwuZ2l0dXJsLCBicmwuY29tbWl0KSwgYnJsLmRpcnBhdGgpCisgICAgICAgICAgICAgICAgIyB3ZSBnZXQgYSByZWxhdGl2ZSBwYXRoLCB1bmxlc3MgcnVubmluZyBpbiBIRUFEIG1vZGUgd2hlcmUgdGhlIHBhdGggaXMgYWJzb2x1dGUKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9jYWxkaXJuYW1lLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxkaXJuYW1lID0gb3MucGF0aC5qb2luKGJjLmJlLnNvdXJjZWRpciwgbG9jYWxkaXJuYW1lKQorICAgICAgICAgICAgICAgICNsb2dnZXIuZGVidWcoMSwgIkxvY2FsZGlybmFtZSAlcyBsY2FsX3BhdGggJXMiICUgKGxvY2FsZGlybmFtZSwgbGF5ZXJfaW5mb3JtYXRpb25bJ2xvY2FsX3BhdGgnXSkpCisgICAgICAgICAgICAgICAgaWYgbG9jYWxkaXJuYW1lLnN0YXJ0c3dpdGgobGF5ZXJfaW5mb3JtYXRpb25bJ2xvY2FsX3BhdGgnXSk6CisgICAgICAgICAgICAgICAgICAgICMgd2UgbWF0Y2hlZCB0aGUgQlJMYXllciwgYnV0IHdlIG5lZWQgdGhlIGxheWVyX3ZlcnNpb24gdGhhdCBnZW5lcmF0ZWQgdGhpcyBCUjsgcmV2ZXJzZSBvZiB0aGUgUHJvamVjdC5zY2hlZHVsZV9idWlsZCgpCisgICAgICAgICAgICAgICAgICAgICNsb2dnZXIuZGVidWcoMSwgIk1hdGNoZWQgJXMgdG8gQlJsYXllciAlcyIgJSAocGZvcm1hdChsYXllcl9pbmZvcm1hdGlvblsibG9jYWxfcGF0aCJdKSwgbG9jYWxkaXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBsIGluIGJ1aWxkcmVxdWVzdC5wcm9qZWN0LnByb2plY3RsYXllcl9zZXQuZmlsdGVyKGxheWVyY29tbWl0X19sYXllcl9fbmFtZSA9IGJybC5uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBsLmxheWVyY29tbWl0LmxheWVyLnZjc191cmwgPT0gYnJsLmdpdHVybCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgPSBwbC5sYXllcmNvbW1pdC5sYXllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnNhdmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXllcgorCisgICAgICAgICAgICByYWlzZSBOb3RFeGlzdGluZygiVW5pZGVudGlmaWVkIGxheWVyICVzIiAlIHBmb3JtYXQobGF5ZXJfaW5mb3JtYXRpb24pKQorCisKKyAgICBkZWYgc2F2ZV90YXJnZXRfZmlsZV9pbmZvcm1hdGlvbihzZWxmLCBidWlsZF9vYmosIHRhcmdldF9vYmosIGZpbGVkYXRhKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVpbGRfb2JqLCBCdWlsZCkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodGFyZ2V0X29iaiwgVGFyZ2V0KQorICAgICAgICBkaXJzID0gZmlsZWRhdGFbJ2RpcnMnXQorICAgICAgICBmaWxlcyA9IGZpbGVkYXRhWydmaWxlcyddCisgICAgICAgIHN5bXMgPSBmaWxlZGF0YVsnc3ltcyddCisKKyAgICAgICAgIyB3ZSBpbnNlcnQgZGlyZWN0b3JpZXMsIG9yZGVyZWQgYnkgbmFtZSBkZXB0aAorICAgICAgICBmb3IgZCBpbiBzb3J0ZWQoZGlycywga2V5PWxhbWJkYSB4Omxlbih4Wy0xXS5zcGxpdCgiLyIpKSk6CisgICAgICAgICAgICAodXNlciwgZ3JvdXAsIHNpemUpID0gZFsxOjRdCisgICAgICAgICAgICBwZXJtaXNzaW9uID0gZFswXVsxOl0KKyAgICAgICAgICAgIHBhdGggPSBkWzRdLmxzdHJpcCgiLiIpCisgICAgICAgICAgICBpZiBsZW4ocGF0aCkgPT0gMDoKKyAgICAgICAgICAgICAgICAjIHdlIGNyZWF0ZSB0aGUgcm9vdCBkaXJlY3RvcnkgYXMgYSBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgICAgICBwYXRoID0gIi8iCisgICAgICAgICAgICAgICAgdGZfb2JqID0gVGFyZ2V0X0ZpbGUub2JqZWN0cy5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlub2RldHlwZSA9IFRhcmdldF9GaWxlLklUWVBFX0RJUkVDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPSB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB0Zl9vYmouZGlyZWN0b3J5ID0gdGZfb2JqCisgICAgICAgICAgICAgICAgdGZfb2JqLnNhdmUoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBwYXJlbnRfcGF0aCA9ICIvIi5qb2luKHBhdGguc3BsaXQoIi8iKVs6bGVuKHBhdGguc3BsaXQoIi8iKSkgLSAxXSkKKyAgICAgICAgICAgIGlmIGxlbihwYXJlbnRfcGF0aCkgPT0gMDoKKyAgICAgICAgICAgICAgICBwYXJlbnRfcGF0aCA9ICIvIgorICAgICAgICAgICAgcGFyZW50X29iaiA9IHNlbGYuX2NhY2hlZF9nZXQoVGFyZ2V0X0ZpbGUsIHRhcmdldCA9IHRhcmdldF9vYmosIHBhdGggPSBwYXJlbnRfcGF0aCwgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfRElSRUNUT1JZKQorICAgICAgICAgICAgdGZfb2JqID0gVGFyZ2V0X0ZpbGUub2JqZWN0cy5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlub2RldHlwZSA9IFRhcmdldF9GaWxlLklUWVBFX0RJUkVDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPSB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IHBhcmVudF9vYmopCisKKworICAgICAgICAjIHdlIGluc2VydCBmaWxlcworICAgICAgICBmb3IgZCBpbiBmaWxlczoKKyAgICAgICAgICAgICh1c2VyLCBncm91cCwgc2l6ZSkgPSBkWzE6NF0KKyAgICAgICAgICAgIHBlcm1pc3Npb24gPSBkWzBdWzE6XQorICAgICAgICAgICAgcGF0aCA9IGRbNF0ubHN0cmlwKCIuIikKKyAgICAgICAgICAgIHBhcmVudF9wYXRoID0gIi8iLmpvaW4ocGF0aC5zcGxpdCgiLyIpWzpsZW4ocGF0aC5zcGxpdCgiLyIpKSAtIDFdKQorICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfUkVHVUxBUgorICAgICAgICAgICAgaWYgZFswXS5zdGFydHN3aXRoKCdiJyk6CisgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfQkxPQ0sKKyAgICAgICAgICAgIGlmIGRbMF0uc3RhcnRzd2l0aCgnYycpOgorICAgICAgICAgICAgICAgIGlub2RldHlwZSA9IFRhcmdldF9GaWxlLklUWVBFX0NIQVJBQ1RFUgorICAgICAgICAgICAgaWYgZFswXS5zdGFydHN3aXRoKCdwJyk6CisgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfRklGTworCisgICAgICAgICAgICB0Zl9vYmogPSBUYXJnZXRfRmlsZS5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gaW5vZGV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lciA9IHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwKQorICAgICAgICAgICAgcGFyZW50X29iaiA9IHNlbGYuX2NhY2hlZF9nZXQoVGFyZ2V0X0ZpbGUsIHRhcmdldCA9IHRhcmdldF9vYmosIHBhdGggPSBwYXJlbnRfcGF0aCwgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfRElSRUNUT1JZKQorICAgICAgICAgICAgdGZfb2JqLmRpcmVjdG9yeSA9IHBhcmVudF9vYmoKKyAgICAgICAgICAgIHRmX29iai5zYXZlKCkKKworICAgICAgICAjIHdlIGluc2VydCBzeW1saW5rcworICAgICAgICBmb3IgZCBpbiBzeW1zOgorICAgICAgICAgICAgKHVzZXIsIGdyb3VwLCBzaXplKSA9IGRbMTo0XQorICAgICAgICAgICAgcGVybWlzc2lvbiA9IGRbMF1bMTpdCisgICAgICAgICAgICBwYXRoID0gZFs0XS5sc3RyaXAoIi4iKQorICAgICAgICAgICAgZmlsZXRhcmdldF9wYXRoID0gZFs2XQorCisgICAgICAgICAgICBwYXJlbnRfcGF0aCA9ICIvIi5qb2luKHBhdGguc3BsaXQoIi8iKVs6bGVuKHBhdGguc3BsaXQoIi8iKSkgLSAxXSkKKyAgICAgICAgICAgIGlmIG5vdCBmaWxldGFyZ2V0X3BhdGguc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICMgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGgsIGdldCBhIG5vcm1hbGl6ZWQgYWJzb2x1dGUgb25lCisgICAgICAgICAgICAgICAgZmlsZXRhcmdldF9wYXRoID0gcGFyZW50X3BhdGggKyAiLyIgKyBmaWxldGFyZ2V0X3BhdGgKKyAgICAgICAgICAgICAgICBmY3AgPSBmaWxldGFyZ2V0X3BhdGguc3BsaXQoIi8iKQorICAgICAgICAgICAgICAgIGZjcGwgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIGZjcDoKKyAgICAgICAgICAgICAgICAgICAgaWYgaSA9PSAiLi4iOgorICAgICAgICAgICAgICAgICAgICAgICAgZmNwbC5wb3AoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmNwbC5hcHBlbmQoaSkKKyAgICAgICAgICAgICAgICBmaWxldGFyZ2V0X3BhdGggPSAiLyIuam9pbihmY3BsKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZXRhcmdldF9vYmogPSBUYXJnZXRfRmlsZS5vYmplY3RzLmdldCh0YXJnZXQgPSB0YXJnZXRfb2JqLCBwYXRoID0gZmlsZXRhcmdldF9wYXRoKQorICAgICAgICAgICAgZXhjZXB0IFRhcmdldF9GaWxlLkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgICAgICAjIHdlIG1pZ2h0IGhhdmUgYW4gaW52YWxpZCBsaW5rOyBubyB3YXkgdG8gZGV0ZWN0IHRoaXMuIGp1c3Qgc2V0IGl0IHRvIE5vbmUKKyAgICAgICAgICAgICAgICBmaWxldGFyZ2V0X29iaiA9IE5vbmUKKworICAgICAgICAgICAgcGFyZW50X29iaiA9IFRhcmdldF9GaWxlLm9iamVjdHMuZ2V0KHRhcmdldCA9IHRhcmdldF9vYmosIHBhdGggPSBwYXJlbnRfcGF0aCwgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfRElSRUNUT1JZKQorCisgICAgICAgICAgICB0Zl9vYmogPSBUYXJnZXRfRmlsZS5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGV0eXBlID0gVGFyZ2V0X0ZpbGUuSVRZUEVfU1lNTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gPSBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPSB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IHBhcmVudF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBzeW1fdGFyZ2V0ID0gZmlsZXRhcmdldF9vYmopCisKKworICAgIGRlZiBzYXZlX3RhcmdldF9wYWNrYWdlX2luZm9ybWF0aW9uKHNlbGYsIGJ1aWxkX29iaiwgdGFyZ2V0X29iaiwgcGFja2FnZWRpY3QsIHBrZ3BubWFwLCByZWNpcGVzKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVpbGRfb2JqLCBCdWlsZCkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodGFyZ2V0X29iaiwgVGFyZ2V0KQorCisgICAgICAgIGVycm9ybXNnID0gIiIKKyAgICAgICAgZm9yIHAgaW4gcGFja2FnZWRpY3Q6CisgICAgICAgICAgICBzZWFyY2huYW1lID0gcAorICAgICAgICAgICAgaWYgJ09QS0dOJyBpbiBwa2dwbm1hcFtwXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgc2VhcmNobmFtZSA9IHBrZ3BubWFwW3BdWydPUEtHTiddCisKKyAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXSwgY3JlYXRlZCA9IFBhY2thZ2Uub2JqZWN0cy5nZXRfb3JfY3JlYXRlKCBidWlsZCA9IGJ1aWxkX29iaiwgbmFtZSA9IHNlYXJjaG5hbWUgKQorICAgICAgICAgICAgaWYgY3JlYXRlZCBvciBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10uc2l6ZSA9PSAtMTogICAgIyBzYXZlIHRoZSBkYXRhIGFueXdheSB3ZSBjYW4sIG5vdCBqdXN0IGlmIGl0IHdhcyBub3QgY3JlYXRlZCBoZXJlOyBidWcgW1lPQ1RPICM2ODg3XQorICAgICAgICAgICAgICAgICMgZmlsbCBpbiBldmVyeXRoaW5nIHdlIGNhbiBmcm9tIHRoZSBydW50aW1lLXJldmVyc2UgcGFja2FnZSBkYXRhCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10ucmVjaXBlID0gcmVjaXBlc1twa2dwbm1hcFtwXVsnUE4nXV0KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLnZlcnNpb24gPSBwa2dwbm1hcFtwXVsnUFYnXQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10uaW5zdGFsbGVkX25hbWUgPSBwCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5yZXZpc2lvbiA9IHBrZ3BubWFwW3BdWydQUiddCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5saWNlbnNlID0gcGtncG5tYXBbcF1bJ0xJQ0VOU0UnXQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10uc2VjdGlvbiA9IHBrZ3BubWFwW3BdWydTRUNUSU9OJ10KKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLnN1bW1hcnkgPSBwa2dwbm1hcFtwXVsnU1VNTUFSWSddCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5kZXNjcmlwdGlvbiA9IHBrZ3BubWFwW3BdWydERVNDUklQVElPTiddCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5zaXplID0gaW50KHBrZ3BubWFwW3BdWydQS0dTSVpFJ10pCisKKyAgICAgICAgICAgICAgICAjIG5vIGZpbGVzIHJlY29yZGVkIGZvciB0aGlzIHBhY2thZ2UsIHNvIHNhdmUgZmlsZXMgaW5mbworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZmlsZV9vYmplY3RzID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHRhcmdldHBhdGggaW4gcGtncG5tYXBbcF1bJ0ZJTEVTX0lORk8nXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGZpbGVzaXplID0gcGtncG5tYXBbcF1bJ0ZJTEVTX0lORk8nXVt0YXJnZXRwYXRoXQorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZWZpbGVfb2JqZWN0cy5hcHBlbmQoUGFja2FnZV9GaWxlKCBwYWNrYWdlID0gcGFja2FnZWRpY3RbcF1bJ29iamVjdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB0YXJnZXRwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0YXJnZXRmaWxlc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihwYWNrYWdlZmlsZV9vYmplY3RzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VfRmlsZS5vYmplY3RzLmJ1bGtfY3JlYXRlKHBhY2thZ2VmaWxlX29iamVjdHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGVycm9ybXNnICs9ICIgIHN0cGk6IEtleSBlcnJvciwgcGFja2FnZSAlcyBrZXkgJXMgXG4iICUgKCBwLCBlICkKKworICAgICAgICAgICAgIyBzYXZlIGRpc2sgaW5zdGFsbGVkIHNpemUKKyAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5pbnN0YWxsZWRfc2l6ZSA9IHBhY2thZ2VkaWN0W3BdWydzaXplJ10KKyAgICAgICAgICAgIHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXS5zYXZlKCkKKworICAgICAgICAgICAgVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlLm9iamVjdHMuY3JlYXRlKHRhcmdldCA9IHRhcmdldF9vYmosIHBhY2thZ2UgPSBwYWNrYWdlZGljdFtwXVsnb2JqZWN0J10pCisKKyAgICAgICAgcGFja2FnZWRlcHNfb2JqcyA9IFtdCisgICAgICAgIGZvciBwIGluIHBhY2thZ2VkaWN0OgorICAgICAgICAgICAgZm9yIChweCxkZXB0eXBlKSBpbiBwYWNrYWdlZGljdFtwXVsnZGVwZW5kcyddOgorICAgICAgICAgICAgICAgIGlmIGRlcHR5cGUgPT0gJ2RlcGVuZHMnOgorICAgICAgICAgICAgICAgICAgICB0ZGVwdHlwZSA9IFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1RSREVQRU5EUworICAgICAgICAgICAgICAgIGVsaWYgZGVwdHlwZSA9PSAncmVjb21tZW5kcyc6CisgICAgICAgICAgICAgICAgICAgIHRkZXB0eXBlID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfVFJFQ09NTUVORFMKKworICAgICAgICAgICAgICAgIHBhY2thZ2VkZXBzX29ianMuYXBwZW5kKFBhY2thZ2VfRGVwZW5kZW5jeSggcGFja2FnZSA9IHBhY2thZ2VkaWN0W3BdWydvYmplY3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gcGFja2FnZWRpY3RbcHhdWydvYmplY3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBfdHlwZSA9IHRkZXB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldF9vYmopKQorCisgICAgICAgIGlmIGxlbihwYWNrYWdlZGVwc19vYmpzKSA+IDA6CisgICAgICAgICAgICBQYWNrYWdlX0RlcGVuZGVuY3kub2JqZWN0cy5idWxrX2NyZWF0ZShwYWNrYWdlZGVwc19vYmpzKQorCisgICAgICAgIGlmIGxlbihlcnJvcm1zZykgPiAwOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oImJ1aWxkaW5mb2hlbHBlcjogdGFyZ2V0X3BhY2thZ2VfaW5mbyBjb3VsZCBub3QgaWRlbnRpZnkgcmVjaXBlczogXG4lcyIsIGVycm9ybXNnKQorCisgICAgZGVmIHNhdmVfdGFyZ2V0X2ltYWdlX2ZpbGVfaW5mb3JtYXRpb24oc2VsZiwgdGFyZ2V0X29iaiwgZmlsZV9uYW1lLCBmaWxlX3NpemUpOgorICAgICAgICBUYXJnZXRfSW1hZ2VfRmlsZS5vYmplY3RzLmNyZWF0ZSggdGFyZ2V0ID0gdGFyZ2V0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gZmlsZV9zaXplKQorCisgICAgZGVmIHNhdmVfYXJ0aWZhY3RfaW5mb3JtYXRpb24oc2VsZiwgYnVpbGRfb2JqLCBmaWxlX25hbWUsIGZpbGVfc2l6ZSk6CisgICAgICAgICMgd2Ugc2tpcCB0aGUgaW1hZ2UgZmlsZXMgZnJvbSBvdGhlciBidWlsZHMKKyAgICAgICAgaWYgVGFyZ2V0X0ltYWdlX0ZpbGUub2JqZWN0cy5maWx0ZXIoZmlsZV9uYW1lID0gZmlsZV9uYW1lKS5jb3VudCgpID4gMDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgZG8gbm90IHVwZGF0ZSBhcnRpZmFjdHMgZm91bmQgaW4gb3RoZXIgYnVpbGRzCisgICAgICAgIGlmIEJ1aWxkQXJ0aWZhY3Qub2JqZWN0cy5maWx0ZXIoZmlsZV9uYW1lID0gZmlsZV9uYW1lKS5jb3VudCgpID4gMDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIEJ1aWxkQXJ0aWZhY3Qub2JqZWN0cy5jcmVhdGUoYnVpbGQgPSBidWlsZF9vYmosIGZpbGVfbmFtZSA9IGZpbGVfbmFtZSwgZmlsZV9zaXplID0gZmlsZV9zaXplKQorCisgICAgZGVmIGNyZWF0ZV9sb2dtZXNzYWdlKHNlbGYsIGxvZ19pbmZvcm1hdGlvbik6CisgICAgICAgIGFzc2VydCAnYnVpbGQnIGluIGxvZ19pbmZvcm1hdGlvbgorICAgICAgICBhc3NlcnQgJ2xldmVsJyBpbiBsb2dfaW5mb3JtYXRpb24KKyAgICAgICAgYXNzZXJ0ICdtZXNzYWdlJyBpbiBsb2dfaW5mb3JtYXRpb24KKworICAgICAgICBsb2dfb2JqZWN0ID0gTG9nTWVzc2FnZS5vYmplY3RzLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkID0gbG9nX2luZm9ybWF0aW9uWydidWlsZCddLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBsb2dfaW5mb3JtYXRpb25bJ2xldmVsJ10sCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbG9nX2luZm9ybWF0aW9uWydtZXNzYWdlJ10pCisKKyAgICAgICAgZm9yIHYgaW4gdmFycyhsb2dfb2JqZWN0KToKKyAgICAgICAgICAgIGlmIHYgaW4gbG9nX2luZm9ybWF0aW9uLmtleXMoKToKKyAgICAgICAgICAgICAgICB2YXJzKGxvZ19vYmplY3QpW3ZdID0gbG9nX2luZm9ybWF0aW9uW3ZdCisKKyAgICAgICAgcmV0dXJuIGxvZ19vYmplY3Quc2F2ZSgpCisKKworICAgIGRlZiBzYXZlX2J1aWxkX3BhY2thZ2VfaW5mb3JtYXRpb24oc2VsZiwgYnVpbGRfb2JqLCBwYWNrYWdlX2luZm8sIHJlY2lwZXMpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWlsZF9vYmosIEJ1aWxkKQorCisgICAgICAgICMgY3JlYXRlIGFuZCBzYXZlIHRoZSBvYmplY3QKKyAgICAgICAgcG5hbWUgPSBwYWNrYWdlX2luZm9bJ1BLRyddCisgICAgICAgIGlmICdPUEtHTicgaW4gcGFja2FnZV9pbmZvLmtleXMoKToKKyAgICAgICAgICAgIHBuYW1lID0gcGFja2FnZV9pbmZvWydPUEtHTiddCisKKyAgICAgICAgYnBfb2JqZWN0LCBfID0gUGFja2FnZS5vYmplY3RzLmdldF9vcl9jcmVhdGUoIGJ1aWxkID0gYnVpbGRfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBuYW1lICkKKworICAgICAgICBicF9vYmplY3QuaW5zdGFsbGVkX25hbWUgPSBwYWNrYWdlX2luZm9bJ1BLRyddCisgICAgICAgIGJwX29iamVjdC5yZWNpcGUgPSByZWNpcGVzW3BhY2thZ2VfaW5mb1snUE4nXV0KKyAgICAgICAgYnBfb2JqZWN0LnZlcnNpb24gPSBwYWNrYWdlX2luZm9bJ1BLR1YnXQorICAgICAgICBicF9vYmplY3QucmV2aXNpb24gPSBwYWNrYWdlX2luZm9bJ1BLR1InXQorICAgICAgICBicF9vYmplY3Quc3VtbWFyeSA9IHBhY2thZ2VfaW5mb1snU1VNTUFSWSddCisgICAgICAgIGJwX29iamVjdC5kZXNjcmlwdGlvbiA9IHBhY2thZ2VfaW5mb1snREVTQ1JJUFRJT04nXQorICAgICAgICBicF9vYmplY3Quc2l6ZSA9IGludChwYWNrYWdlX2luZm9bJ1BLR1NJWkUnXSkKKyAgICAgICAgYnBfb2JqZWN0LnNlY3Rpb24gPSBwYWNrYWdlX2luZm9bJ1NFQ1RJT04nXQorICAgICAgICBicF9vYmplY3QubGljZW5zZSA9IHBhY2thZ2VfaW5mb1snTElDRU5TRSddCisgICAgICAgIGJwX29iamVjdC5zYXZlKCkKKworICAgICAgICAjIHNhdmUgYW55IGF0dGFjaGVkIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgcGFja2FnZWZpbGVfb2JqZWN0cyA9IFtdCisgICAgICAgIGZvciBwYXRoIGluIHBhY2thZ2VfaW5mb1snRklMRVNfSU5GTyddOgorICAgICAgICAgICAgcGFja2FnZWZpbGVfb2JqZWN0cy5hcHBlbmQoUGFja2FnZV9GaWxlKCBwYWNrYWdlID0gYnBfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBwYWNrYWdlX2luZm9bJ0ZJTEVTX0lORk8nXVtwYXRoXSApKQorICAgICAgICBpZiBsZW4ocGFja2FnZWZpbGVfb2JqZWN0cyk6CisgICAgICAgICAgICBQYWNrYWdlX0ZpbGUub2JqZWN0cy5idWxrX2NyZWF0ZShwYWNrYWdlZmlsZV9vYmplY3RzKQorCisgICAgICAgIGRlZiBfcG9fYnluYW1lKHApOgorICAgICAgICAgICAgcGtnLCBjcmVhdGVkID0gUGFja2FnZS5vYmplY3RzLmdldF9vcl9jcmVhdGUoYnVpbGQgPSBidWlsZF9vYmosIG5hbWUgPSBwKQorICAgICAgICAgICAgaWYgY3JlYXRlZDoKKyAgICAgICAgICAgICAgICBwa2cuc2l6ZSA9IC0xCisgICAgICAgICAgICAgICAgcGtnLnNhdmUoKQorICAgICAgICAgICAgcmV0dXJuIHBrZworCisgICAgICAgIHBhY2thZ2VkZXBzX29ianMgPSBbXQorICAgICAgICAjIHNhdmUgc29mdCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uCisgICAgICAgIGlmICdSREVQRU5EUycgaW4gcGFja2FnZV9pbmZvIGFuZCBwYWNrYWdlX2luZm9bJ1JERVBFTkRTJ106CisgICAgICAgICAgICBmb3IgcCBpbiBiYi51dGlscy5leHBsb2RlX2RlcHMocGFja2FnZV9pbmZvWydSREVQRU5EUyddKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlZGVwc19vYmpzLmFwcGVuZChQYWNrYWdlX0RlcGVuZGVuY3koICBwYWNrYWdlID0gYnBfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gX3BvX2J5bmFtZShwKSwgZGVwX3R5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SREVQRU5EUykpCisgICAgICAgIGlmICdSUFJPVklERVMnIGluIHBhY2thZ2VfaW5mbyBhbmQgcGFja2FnZV9pbmZvWydSUFJPVklERVMnXToKKyAgICAgICAgICAgIGZvciBwIGluIGJiLnV0aWxzLmV4cGxvZGVfZGVwcyhwYWNrYWdlX2luZm9bJ1JQUk9WSURFUyddKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlZGVwc19vYmpzLmFwcGVuZChQYWNrYWdlX0RlcGVuZGVuY3koICBwYWNrYWdlID0gYnBfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gX3BvX2J5bmFtZShwKSwgZGVwX3R5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SUFJPVklERVMpKQorICAgICAgICBpZiAnUlJFQ09NTUVORFMnIGluIHBhY2thZ2VfaW5mbyBhbmQgcGFja2FnZV9pbmZvWydSUkVDT01NRU5EUyddOgorICAgICAgICAgICAgZm9yIHAgaW4gYmIudXRpbHMuZXhwbG9kZV9kZXBzKHBhY2thZ2VfaW5mb1snUlJFQ09NTUVORFMnXSk6CisgICAgICAgICAgICAgICAgcGFja2FnZWRlcHNfb2Jqcy5hcHBlbmQoUGFja2FnZV9EZXBlbmRlbmN5KCAgcGFja2FnZSA9IGJwX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kc19vbiA9IF9wb19ieW5hbWUocCksIGRlcF90eXBlID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfUlJFQ09NTUVORFMpKQorICAgICAgICBpZiAnUlNVR0dFU1RTJyBpbiBwYWNrYWdlX2luZm8gYW5kIHBhY2thZ2VfaW5mb1snUlNVR0dFU1RTJ106CisgICAgICAgICAgICBmb3IgcCBpbiBiYi51dGlscy5leHBsb2RlX2RlcHMocGFja2FnZV9pbmZvWydSU1VHR0VTVFMnXSk6CisgICAgICAgICAgICAgICAgcGFja2FnZWRlcHNfb2Jqcy5hcHBlbmQoUGFja2FnZV9EZXBlbmRlbmN5KCAgcGFja2FnZSA9IGJwX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kc19vbiA9IF9wb19ieW5hbWUocCksIGRlcF90eXBlID0gUGFja2FnZV9EZXBlbmRlbmN5LlRZUEVfUlNVR0dFU1RTKSkKKyAgICAgICAgaWYgJ1JSRVBMQUNFUycgaW4gcGFja2FnZV9pbmZvIGFuZCBwYWNrYWdlX2luZm9bJ1JSRVBMQUNFUyddOgorICAgICAgICAgICAgZm9yIHAgaW4gYmIudXRpbHMuZXhwbG9kZV9kZXBzKHBhY2thZ2VfaW5mb1snUlJFUExBQ0VTJ10pOgorICAgICAgICAgICAgICAgIHBhY2thZ2VkZXBzX29ianMuYXBwZW5kKFBhY2thZ2VfRGVwZW5kZW5jeSggIHBhY2thZ2UgPSBicF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZHNfb24gPSBfcG9fYnluYW1lKHApLCBkZXBfdHlwZSA9IFBhY2thZ2VfRGVwZW5kZW5jeS5UWVBFX1JSRVBMQUNFUykpCisgICAgICAgIGlmICdSQ09ORkxJQ1RTJyBpbiBwYWNrYWdlX2luZm8gYW5kIHBhY2thZ2VfaW5mb1snUkNPTkZMSUNUUyddOgorICAgICAgICAgICAgZm9yIHAgaW4gYmIudXRpbHMuZXhwbG9kZV9kZXBzKHBhY2thZ2VfaW5mb1snUkNPTkZMSUNUUyddKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlZGVwc19vYmpzLmFwcGVuZChQYWNrYWdlX0RlcGVuZGVuY3koICBwYWNrYWdlID0gYnBfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gX3BvX2J5bmFtZShwKSwgZGVwX3R5cGUgPSBQYWNrYWdlX0RlcGVuZGVuY3kuVFlQRV9SQ09ORkxJQ1RTKSkKKworICAgICAgICBpZiBsZW4ocGFja2FnZWRlcHNfb2JqcykgPiAwOgorICAgICAgICAgICAgUGFja2FnZV9EZXBlbmRlbmN5Lm9iamVjdHMuYnVsa19jcmVhdGUocGFja2FnZWRlcHNfb2JqcykKKworICAgICAgICByZXR1cm4gYnBfb2JqZWN0CisKKyAgICBkZWYgc2F2ZV9idWlsZF92YXJpYWJsZXMoc2VsZiwgYnVpbGRfb2JqLCB2YXJkdW1wKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVpbGRfb2JqLCBCdWlsZCkKKworICAgICAgICBoZWxwdGV4dF9vYmplY3RzID0gW10KKyAgICAgICAgZm9yIGsgaW4gdmFyZHVtcDoKKyAgICAgICAgICAgIGRlc2MgPSB2YXJkdW1wW2tdWydkb2MnXQorICAgICAgICAgICAgaWYgZGVzYyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHZhcl93b3JkcyA9IFt3b3JkIGZvciB3b3JkIGluIGsuc3BsaXQoJ18nKV0KKyAgICAgICAgICAgICAgICByb290X3ZhciA9ICJfIi5qb2luKFt3b3JkIGZvciB3b3JkIGluIHZhcl93b3JkcyBpZiB3b3JkLmlzdXBwZXIoKV0pCisgICAgICAgICAgICAgICAgaWYgcm9vdF92YXIgYW5kIHJvb3RfdmFyICE9IGsgYW5kIHJvb3RfdmFyIGluIHZhcmR1bXA6CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSB2YXJkdW1wW3Jvb3RfdmFyXVsnZG9jJ10KKyAgICAgICAgICAgIGlmIGRlc2MgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkZXNjID0gJycKKyAgICAgICAgICAgIGlmIGxlbihkZXNjKToKKyAgICAgICAgICAgICAgICBoZWxwdGV4dF9vYmplY3RzLmFwcGVuZChIZWxwVGV4dChidWlsZD1idWlsZF9vYmosCisgICAgICAgICAgICAgICAgICAgIGFyZWE9SGVscFRleHQuVkFSSUFCTEUsCisgICAgICAgICAgICAgICAgICAgIGtleT1rLAorICAgICAgICAgICAgICAgICAgICB0ZXh0PWRlc2MpKQorICAgICAgICAgICAgaWYgbm90IGJvb2wodmFyZHVtcFtrXVsnZnVuYyddKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhcmR1bXBba11bJ3YnXQorICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJycKKyAgICAgICAgICAgICAgICB2YXJpYWJsZV9vYmogPSBWYXJpYWJsZS5vYmplY3RzLmNyZWF0ZSggYnVpbGQgPSBidWlsZF9vYmosCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX25hbWUgPSBrLAorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV92YWx1ZSA9IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2MpCisKKyAgICAgICAgICAgICAgICB2YXJoaXN0X29iamVjdHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciB2aCBpbiB2YXJkdW1wW2tdWydoaXN0b3J5J106CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAnZG9jdW1lbnRhdGlvbi5jb25mJyBpbiB2aFsnZmlsZSddOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyaGlzdF9vYmplY3RzLmFwcGVuZChWYXJpYWJsZUhpc3RvcnkoIHZhcmlhYmxlID0gdmFyaWFibGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSB2aFsnZmlsZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciA9IHZoWydsaW5lJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IHZoWydvcCddKSkKKyAgICAgICAgICAgICAgICBpZiBsZW4odmFyaGlzdF9vYmplY3RzKToKKyAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVIaXN0b3J5Lm9iamVjdHMuYnVsa19jcmVhdGUodmFyaGlzdF9vYmplY3RzKQorCisgICAgICAgIEhlbHBUZXh0Lm9iamVjdHMuYnVsa19jcmVhdGUoaGVscHRleHRfb2JqZWN0cykKKworCitjbGFzcyBNb2NrRXZlbnQob2JqZWN0KToKKyAgICAiIiIgVGhpcyBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgZXZlbnQsIGZvciB3aGljaCBub3JtYWwgZXZlbnQtcHJvY2Vzc2luZyBtZXRob2RzIGNhbgorICAgICAgICBiZSB1c2VkLCBvdXQgb2YgZGF0YSB0aGF0IGlzIG5vdCBjb21pbmcgdmlhIGFuIGFjdHVhbCBldmVudAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tc2cgPSBOb25lCisgICAgICAgIHNlbGYubGV2ZWxubyA9IE5vbmUKKyAgICAgICAgc2VsZi50YXNrbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi50YXNraGFzaCA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXRobmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBOb25lCisKKworY2xhc3MgQnVpbGRJbmZvSGVscGVyKG9iamVjdCk6CisgICAgIiIiIFRoaXMgY2xhc3MgZ2F0aGVycyB0aGUgYnVpbGQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyIGFuZCBzZW5kcyBpdAorICAgICAgICB0b3dhcmRzIHRoZSBPUk0gd3JhcHBlciBmb3Igc3RvcmluZyBpbiB0aGUgZGF0YWJhc2UKKyAgICAgICAgSXQgaXMgaW5zdGFudGlhdGVkIG9uY2UgcGVyIGJ1aWxkCisgICAgICAgIEtlZXBzIGluIG1lbW9yeSBhbGwgZGF0YSB0aGF0IG5lZWRzIG1hdGNoaW5nIGJlZm9yZSB3cml0aW5nIGl0IHRvIHRoZSBkYXRhYmFzZQorICAgICIiIgorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICMgdGhlIGNvZGUgd2lsbCBsb29rIGludG8gdGhlIHByb3RlY3RlZCB2YXJpYWJsZXMgb2YgdGhlIGV2ZW50OyBubyBlYXN5IHdheSBhcm91bmQgdGhpcworICAgICMgcHlsaW50OiBkaXNhYmxlPWJhZC1jb250aW51YXRpb24KKyAgICAjIHdlIGRvIG5vdCBmb2xsb3cgdGhlIHB5dGhvbiBjb252ZW50aW9ucyBmb3IgY29udGludWF0aW9uIGluZGVudGF0aW9uIGR1ZSB0byBsb25nIGxpbmVzIGhlcmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIGhhc19idWlsZF9oaXN0b3J5ID0gRmFsc2UpOgorICAgICAgICBzZWxmLmludGVybmFsX3N0YXRlID0ge30KKyAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXSA9IHt9CisgICAgICAgIHNlbGYudGFza19vcmRlciA9IDAKKyAgICAgICAgc2VsZi5hdXRvY29tbWl0X3N0ZXAgPSAxCisgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgICMgd2UgdXNlIG1hbnVhbCB0cmFuc2FjdGlvbnMgaWYgdGhlIGRhdGFiYXNlIGRvZXNuJ3QgYXV0b2NvbW1pdCBvbiB1cworICAgICAgICBpZiBub3QgY29ubmVjdGlvbi5mZWF0dXJlcy5hdXRvY29tbWl0c193aGVuX2F1dG9jb21taXRfaXNfb2ZmOgorICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoRmFsc2UpCisgICAgICAgIHNlbGYub3JtX3dyYXBwZXIgPSBPUk1XcmFwcGVyKCkKKyAgICAgICAgc2VsZi5oYXNfYnVpbGRfaGlzdG9yeSA9IGhhc19idWlsZF9oaXN0b3J5CisgICAgICAgIHNlbGYudG1wX2RpciA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUTVBESVIiXSlbMF0KKyAgICAgICAgc2VsZi5icmJlICAgID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlRPQVNURVJfQlJCRSJdKVswXQorICAgICAgICBzZWxmLnByb2plY3QgPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVE9BU1RFUl9QUk9KRUNUIl0pWzBdCisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiYnVpbGRpbmZvaGVscGVyOiBCdWlsZCBpbmZvIGhlbHBlciBpbml0ZWQgJXMiICUgdmFycyhzZWxmKSkKKworCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMjIG1ldGhvZHMgdG8gY29udmVydCBldmVudC9leHRlcm5hbCBpbmZvIGludG8gb2JqZWN0cyB0aGF0IHRoZSBPUk0gbGF5ZXIgdXNlcworCisKKyAgICBkZWYgX2dldF9idWlsZF9pbmZvcm1hdGlvbihzZWxmKToKKyAgICAgICAgYnVpbGRfaW5mbyA9IHt9CisgICAgICAgICMgR2VuZXJhdGUgYW4gaWRlbnRpZmllciBmb3IgZWFjaCBuZXcgYnVpbGQKKworICAgICAgICBidWlsZF9pbmZvWydtYWNoaW5lJ10gPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiTUFDSElORSJdKVswXQorICAgICAgICBidWlsZF9pbmZvWydkaXN0cm8nXSA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJESVNUUk8iXSlbMF0KKyAgICAgICAgYnVpbGRfaW5mb1snZGlzdHJvX3ZlcnNpb24nXSA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJESVNUUk9fVkVSU0lPTiJdKVswXQorICAgICAgICBidWlsZF9pbmZvWydzdGFydGVkX29uJ10gPSB0aW1lem9uZS5ub3coKQorICAgICAgICBidWlsZF9pbmZvWydjb21wbGV0ZWRfb24nXSA9IHRpbWV6b25lLm5vdygpCisgICAgICAgIGJ1aWxkX2luZm9bJ2Nvb2tlcl9sb2dfcGF0aCddID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX0NPTlNPTEVMT0ciXSlbMF0KKyAgICAgICAgYnVpbGRfaW5mb1snYnVpbGRfbmFtZSddID0gc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJVSUxETkFNRSJdKVswXQorICAgICAgICBidWlsZF9pbmZvWydiaXRiYWtlX3ZlcnNpb24nXSA9IHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQl9WRVJTSU9OIl0pWzBdCisKKyAgICAgICAgcmV0dXJuIGJ1aWxkX2luZm8KKworICAgIGRlZiBfZ2V0X3Rhc2tfaW5mb3JtYXRpb24oc2VsZiwgZXZlbnQsIHJlY2lwZSk6CisgICAgICAgIGFzc2VydCAndGFza25hbWUnIGluIHZhcnMoZXZlbnQpCisKKyAgICAgICAgdGFza19pbmZvcm1hdGlvbiA9IHt9CisgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ2J1aWxkJ10gPSBzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddCisgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IFRhc2suT1VUQ09NRV9OQQorICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydyZWNpcGUnXSA9IHJlY2lwZQorICAgICAgICB0YXNrX2luZm9ybWF0aW9uWyd0YXNrX25hbWUnXSA9IGV2ZW50LnRhc2tuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgc29tZSB0YXNrcyBkb24ndCBjb21lIHdpdGggYSBoYXNoLiBhbmQgdGhhdCdzIG9rCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzc3RhdGVfY2hlY2tzdW0nXSA9IGV2ZW50LnRhc2toYXNoCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHRhc2tfaW5mb3JtYXRpb24KKworICAgIGRlZiBfZ2V0X2xheWVyX3ZlcnNpb25fZm9yX3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIGFzc2VydCBwYXRoLnN0YXJ0c3dpdGgoIi8iKQorICAgICAgICBhc3NlcnQgJ2J1aWxkJyBpbiBzZWxmLmludGVybmFsX3N0YXRlCisKKyAgICAgICAgaWYgc2VsZi5icmJlIGlzIE5vbmU6CisgICAgICAgICAgICBkZWYgX3Nsa2V5X2ludGVyYWN0aXZlKGxheWVyX3ZlcnNpb24pOgorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGxheWVyX3ZlcnNpb24sIExheWVyX1ZlcnNpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihsYXllcl92ZXJzaW9uLmxvY2FsX3BhdGgpCisKKyAgICAgICAgICAgICMgSGV1cmlzdGljczogd2UgYWx3YXlzIG1hdGNoIHJlY2lwZSB0byB0aGUgZGVlcGVzdCBsYXllciBwYXRoIGluIHRoZSBkaXNjb3ZlcmVkIGxheWVycworICAgICAgICAgICAgZm9yIGx2byBpbiBzb3J0ZWQoc2VsZi5vcm1fd3JhcHBlci5sYXllcl92ZXJzaW9uX29iamVjdHMsIHJldmVyc2U9VHJ1ZSwga2V5PV9zbGtleV9pbnRlcmFjdGl2ZSk6CisgICAgICAgICAgICAgICAgIyB3ZSBjYW4gbWF0Y2ggdG8gdGhlIHJlY2lwZSBmaWxlIHBhdGgKKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgobHZvLmxvY2FsX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbHZvCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyX2lkLCBiZV9pZCA9IHNlbGYuYnJiZS5zcGxpdCgiOiIpCisgICAgICAgICAgICBmcm9tIGJsZGNvbnRyb2wuYmJjb250cm9sbGVyIGltcG9ydCBnZXRCdWlsZEVudmlyb25tZW50Q29udHJvbGxlcgorICAgICAgICAgICAgYmMgPSBnZXRCdWlsZEVudmlyb25tZW50Q29udHJvbGxlcihwayA9IGJlX2lkKQorCisgICAgICAgICAgICBkZWYgX3Nsa2V5X21hbmFnZWQobGF5ZXJfdmVyc2lvbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihiYy5nZXRHaXRDbG9uZURpcmVjdG9yeShsYXllcl92ZXJzaW9uLmdpdHVybCwgbGF5ZXJfdmVyc2lvbi5jb21taXQpICsgbGF5ZXJfdmVyc2lvbi5kaXJwYXRoKQorCisgICAgICAgICAgICAjIEhldXJpc3RpY3M6IHdlIG1hdGNoIHRoZSBwYXRoIHRvIHdoZXJlIHRoZSBsYXllcnMgaGF2ZSBiZWVuIGNoZWNrZWQgb3V0CisgICAgICAgICAgICBmb3IgYnJsIGluIHNvcnRlZChCdWlsZFJlcXVlc3Qub2JqZWN0cy5nZXQocGsgPSBicl9pZCkuYnJsYXllcl9zZXQuYWxsKCksIHJldmVyc2UgPSBUcnVlLCBrZXkgPSBfc2xrZXlfbWFuYWdlZCk6CisgICAgICAgICAgICAgICAgbG9jYWxkaXJuYW1lID0gb3MucGF0aC5qb2luKGJjLmdldEdpdENsb25lRGlyZWN0b3J5KGJybC5naXR1cmwsIGJybC5jb21taXQpLCBicmwuZGlycGF0aCkKKyAgICAgICAgICAgICAgICAjIHdlIGdldCBhIHJlbGF0aXZlIHBhdGgsIHVubGVzcyBydW5uaW5nIGluIEhFQUQgbW9kZSB3aGVyZSB0aGUgcGF0aCBpcyBhYnNvbHV0ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBsb2NhbGRpcm5hbWUuc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICAgICBsb2NhbGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oYmMuYmUuc291cmNlZGlyLCBsb2NhbGRpcm5hbWUpCisgICAgICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKGxvY2FsZGlybmFtZSk6CisgICAgICAgICAgICAgICAgICAgICNsb2dnZXIud2FybigiLS0gbWFuYWdlZDogbWF0Y2hlZCBwYXRoICVzIHdpdGggbGF5ZXIgJXMgIiAlIChwYXRoLCBsb2NhbGRpcm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAjIHdlIG1hdGNoZWQgdGhlIEJSTGF5ZXIsIGJ1dCB3ZSBuZWVkIHRoZSBsYXllcl92ZXJzaW9uIHRoYXQgZ2VuZXJhdGVkIHRoaXMgYnIKKyAgICAgICAgICAgICAgICAgICAgZm9yIGx2byBpbiBzZWxmLm9ybV93cmFwcGVyLmxheWVyX3ZlcnNpb25fb2JqZWN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJybC5uYW1lID09IGx2by5sYXllci5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsdm8KKworICAgICAgICAjaWYgd2UgZ2V0IGhlcmUsIHdlIGRpZG4ndCByZWFkIGxheWVycyBjb3JyZWN0bHk7IGR1bXAgd2hhdGV2ZXIgaW5mb3JtYXRpb24gd2UgaGF2ZSBvbiB0aGUgZXJyb3IgbG9nCisgICAgICAgIGxvZ2dlci53YXJuKCJDb3VsZCBub3QgbWF0Y2ggbGF5ZXIgdmVyc2lvbiBmb3IgcmVjaXBlIHBhdGggJXMgOiAlcyIsIHBhdGgsIHNlbGYub3JtX3dyYXBwZXIubGF5ZXJfdmVyc2lvbl9vYmplY3RzKQorCisgICAgICAgICNtb2NrdXAgdGhlIG5ldyBsYXllcgorICAgICAgICB1bmtub3duX2xheWVyLCBfID0gTGF5ZXIub2JqZWN0cy5nZXRfb3JfY3JlYXRlKG5hbWU9Il9fRklYTUVfX3VuaWRlbnRpZmllZF9sYXllciIsIGxheWVyX2luZGV4X3VybD0iIikKKyAgICAgICAgdW5rbm93bl9sYXllcl92ZXJzaW9uX29iaiwgXyA9IExheWVyX1ZlcnNpb24ub2JqZWN0cy5nZXRfb3JfY3JlYXRlKGxheWVyID0gdW5rbm93bl9sYXllciwgYnVpbGQgPSBzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddKQorCisgICAgICAgICMgYXBwZW5kIGl0IHNvIHdlIGRvbid0IHJ1biBpbnRvIHRoaXMgZXJyb3IgYWdhaW4gYW5kIGFnYWluCisgICAgICAgIHNlbGYub3JtX3dyYXBwZXIubGF5ZXJfdmVyc2lvbl9vYmplY3RzLmFwcGVuZCh1bmtub3duX2xheWVyX3ZlcnNpb25fb2JqKQorCisgICAgICAgIHJldHVybiB1bmtub3duX2xheWVyX3ZlcnNpb25fb2JqCisKKyAgICBkZWYgX2dldF9yZWNpcGVfaW5mb3JtYXRpb25fZnJvbV90YXNrZmlsZShzZWxmLCB0YXNrZmlsZSk6CisgICAgICAgIGxvY2FsZmlsZXBhdGggPSB0YXNrZmlsZS5zcGxpdCgiOiIpWy0xXQorICAgICAgICBmaWxlcGF0aF9mbGFncyA9ICI6Ii5qb2luKHNvcnRlZCh0YXNrZmlsZS5zcGxpdCgiOiIpWzotMV0pKQorICAgICAgICBsYXllcl92ZXJzaW9uX29iaiA9IHNlbGYuX2dldF9sYXllcl92ZXJzaW9uX2Zvcl9wYXRoKGxvY2FsZmlsZXBhdGgpCisKKworCisgICAgICAgIHJlY2lwZV9pbmZvID0ge30KKyAgICAgICAgcmVjaXBlX2luZm9bJ2xheWVyX3ZlcnNpb24nXSA9IGxheWVyX3ZlcnNpb25fb2JqCisgICAgICAgIHJlY2lwZV9pbmZvWydmaWxlX3BhdGgnXSA9IGxvY2FsZmlsZXBhdGgKKyAgICAgICAgcmVjaXBlX2luZm9bJ3BhdGhmbGFncyddID0gZmlsZXBhdGhfZmxhZ3MKKworICAgICAgICBpZiByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ10uc3RhcnRzd2l0aChyZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddLmxvY2FsX3BhdGgpOgorICAgICAgICAgICAgcmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddID0gcmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddW2xlbihyZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddLmxvY2FsX3BhdGgpOl0ubHN0cmlwKCIvIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUmVjaXBlIGZpbGUgcGF0aCAlcyBpcyBub3QgdW5kZXIgbGF5ZXIgdmVyc2lvbiBhdCAlcyIgJSAocmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddLCByZWNpcGVfaW5mb1snbGF5ZXJfdmVyc2lvbiddLmxvY2FsX3BhdGgpKQorCisgICAgICAgIHJldHVybiByZWNpcGVfaW5mbworCisgICAgZGVmIF9nZXRfcGF0aF9pbmZvcm1hdGlvbihzZWxmLCB0YXNrX29iamVjdCk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRhc2tfb2JqZWN0LCBUYXNrKQorICAgICAgICBidWlsZF9zdGF0c19mb3JtYXQgPSAie3RtcGRpcn0vYnVpbGRzdGF0cy97dGFyZ2V0fS17bWFjaGluZX0ve2J1aWxkbmFtZX0ve3BhY2thZ2V9LyIKKyAgICAgICAgYnVpbGRfc3RhdHNfcGF0aCA9IFtdCisKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFyZ2V0cyddOgorICAgICAgICAgICAgdGFyZ2V0ID0gdC50YXJnZXQKKyAgICAgICAgICAgIG1hY2hpbmUgPSBzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddLm1hY2hpbmUKKyAgICAgICAgICAgIGJ1aWxkbmFtZSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10uYnVpbGRfbmFtZQorICAgICAgICAgICAgcGUsIHB2ID0gdGFza19vYmplY3QucmVjaXBlLnZlcnNpb24uc3BsaXQoIjoiLDEpCisgICAgICAgICAgICBpZiBsZW4ocGUpID4gMDoKKyAgICAgICAgICAgICAgICBwYWNrYWdlID0gdGFza19vYmplY3QucmVjaXBlLm5hbWUgKyAiLSIgKyBwZSArICJfIiArIHB2CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhY2thZ2UgPSB0YXNrX29iamVjdC5yZWNpcGUubmFtZSArICItIiArIHB2CisKKyAgICAgICAgICAgIGJ1aWxkX3N0YXRzX3BhdGguYXBwZW5kKGJ1aWxkX3N0YXRzX2Zvcm1hdC5mb3JtYXQodG1wZGlyPXNlbGYudG1wX2RpciwgdGFyZ2V0PXRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZT1tYWNoaW5lLCBidWlsZG5hbWU9YnVpbGRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPXBhY2thZ2UpKQorCisgICAgICAgIHJldHVybiBidWlsZF9zdGF0c19wYXRoCisKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMgZXh0ZXJuYWwgYXZhaWxhYmxlIG1ldGhvZHMgdG8gc3RvcmUgaW5mb3JtYXRpb24KKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KToKKyAgICAgICAgZXZkYXRhID0gTm9uZQorICAgICAgICBpZiAnX2xvY2FsZGF0YScgaW4gdmFycyhldmVudCk6CisgICAgICAgICAgICBldmRhdGEgPSBldmVudC5fbG9jYWxkYXRhCisgICAgICAgIGVsaWYgJ2RhdGEnIGluIHZhcnMoZXZlbnQpOgorICAgICAgICAgICAgZXZkYXRhID0gZXZlbnQuZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFdmVudCB3aXRoIG5laXRoZXIgX2xvY2FsZGF0YSBvciBkYXRhIHByb3BlcnRpZXMiKQorICAgICAgICByZXR1cm4gZXZkYXRhCisKKyAgICBkZWYgc3RvcmVfbGF5ZXJfaW5mbyhzZWxmLCBldmVudCk6CisgICAgICAgIGxheWVyaW5mb3MgPSBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpCisgICAgICAgIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2x2cyddID0ge30KKyAgICAgICAgZm9yIGxheWVyIGluIGxheWVyaW5mb3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnbHZzJ11bc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX2xheWVyX29iamVjdChsYXllcmluZm9zW2xheWVyXSwgc2VsZi5icmJlKV0gPSBsYXllcmluZm9zW2xheWVyXVsndmVyc2lvbiddCisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnbHZzJ11bc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX2xheWVyX29iamVjdChsYXllcmluZm9zW2xheWVyXSwgc2VsZi5icmJlKV1bJ2xvY2FsX3BhdGgnXSA9IGxheWVyaW5mb3NbbGF5ZXJdWydsb2NhbF9wYXRoJ10KKyAgICAgICAgICAgIGV4Y2VwdCBOb3RFeGlzdGluZyBhcyBuZWU6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oImJ1aWxkaW5mb2hlbHBlcjogY2Fubm90IGlkZW50aWZ5IGxheWVyIGV4Y2VwdGlvbjolcyAiLCBuZWUpCisKKworICAgIGRlZiBzdG9yZV9zdGFydGVkX2J1aWxkKHNlbGYsIGV2ZW50KToKKyAgICAgICAgYXNzZXJ0ICdfcGtncycgaW4gdmFycyhldmVudCkKKyAgICAgICAgYnVpbGRfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfYnVpbGRfaW5mb3JtYXRpb24oKQorCisgICAgICAgIGJ1aWxkX29iaiA9IHNlbGYub3JtX3dyYXBwZXIuY3JlYXRlX2J1aWxkX29iamVjdChidWlsZF9pbmZvcm1hdGlvbiwgc2VsZi5icmJlLCBzZWxmLnByb2plY3QpCisKKyAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXSA9IGJ1aWxkX29iagorCisgICAgICAgICMgc2F2ZSBsYXllciB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGJ1aWxkCisgICAgICAgIGlmIG5vdCAnbHZzJyBpbiBzZWxmLmludGVybmFsX3N0YXRlOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJMYXllciB2ZXJzaW9uIGluZm9ybWF0aW9uIG5vdCBmb3VuZDsgQ2hlY2sgaWYgdGhlIGJpdGJha2Ugc2VydmVyIHdhcyBjb25maWd1cmVkIHRvIGluaGVyaXQgdG9hc3Rlci5iYmNsYXNzLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgbGF5ZXJfb2JqIGluIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2x2cyddOgorICAgICAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV9sYXllcl92ZXJzaW9uX29iamVjdChidWlsZF9vYmosIGxheWVyX29iaiwgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnbHZzJ11bbGF5ZXJfb2JqXSkKKworICAgICAgICAgICAgZGVsIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2x2cyddCisKKyAgICAgICAgIyBjcmVhdGUgdGFyZ2V0IGluZm9ybWF0aW9uCisgICAgICAgIHRhcmdldF9pbmZvcm1hdGlvbiA9IHt9CisgICAgICAgIHRhcmdldF9pbmZvcm1hdGlvblsndGFyZ2V0cyddID0gZXZlbnQuX3BrZ3MKKyAgICAgICAgdGFyZ2V0X2luZm9ybWF0aW9uWydidWlsZCddID0gYnVpbGRfb2JqCisKKyAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFyZ2V0cyddID0gc2VsZi5vcm1fd3JhcHBlci5jcmVhdGVfdGFyZ2V0X29iamVjdHModGFyZ2V0X2luZm9ybWF0aW9uKQorCisgICAgICAgICMgU2F2ZSBidWlsZCBjb25maWd1cmF0aW9uCisgICAgICAgIGRhdGEgPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0QWxsS2V5c1dpdGhGbGFncyIsIFsiZG9jIiwgImZ1bmMiXV0pWzBdCisKKyAgICAgICAgIyBjb252ZXJ0IHRoZSBwYXRocyBmcm9tIGFic29sdXRlIHRvIHJlbGF0aXZlIHRvIGVpdGhlciB0aGUgYnVpbGQgZGlyZWN0b3J5IG9yIGxheWVyIGNoZWNrb3V0cworICAgICAgICBwYXRoX3ByZWZpeGVzID0gW10KKworICAgICAgICBpZiBzZWxmLmJyYmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfLCBiZV9pZCA9IHNlbGYuYnJiZS5zcGxpdCgiOiIpCisgICAgICAgICAgICBiZSA9IEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5nZXQocGsgPSBiZV9pZCkKKyAgICAgICAgICAgIHBhdGhfcHJlZml4ZXMuYXBwZW5kKGJlLmJ1aWxkZGlyKQorCisgICAgICAgIGZvciBsYXllciBpbiBzb3J0ZWQoc2VsZi5vcm1fd3JhcHBlci5sYXllcl92ZXJzaW9uX29iamVjdHMsIGtleSA9IGxhbWJkYSB4Omxlbih4LmxvY2FsX3BhdGgpLCByZXZlcnNlPVRydWUpOgorICAgICAgICAgICAgcGF0aF9wcmVmaXhlcy5hcHBlbmQobGF5ZXIubG9jYWxfcGF0aCkKKworICAgICAgICAjIHdlIHN0cmlwIHRoZSBwcmVmaXhlcworICAgICAgICBmb3IgayBpbiBkYXRhOgorICAgICAgICAgICAgaWYgbm90IGJvb2woZGF0YVtrXVsnZnVuYyddKToKKyAgICAgICAgICAgICAgICBmb3IgdmggaW4gZGF0YVtrXVsnaGlzdG9yeSddOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgJ2RvY3VtZW50YXRpb24uY29uZicgaW4gdmhbJ2ZpbGUnXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFic19maWxlX25hbWUgPSB2aFsnZmlsZSddCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHAgaW4gcGF0aF9wcmVmaXhlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhYnNfZmlsZV9uYW1lLnN0YXJ0c3dpdGgocHAgKyAiLyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aFsnZmlsZSddPWFic19maWxlX25hbWVbbGVuKHBwICsgIi8iKTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBzYXZlIHRoZSB2YXJpYWJsZXMKKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5zYXZlX2J1aWxkX3ZhcmlhYmxlcyhidWlsZF9vYmosIGRhdGEpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuYnJiZQorCisKKyAgICBkZWYgdXBkYXRlX3RhcmdldF9pbWFnZV9maWxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZXZkYXRhID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KQorCisgICAgICAgIGZvciB0IGluIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3RhcmdldHMnXToKKyAgICAgICAgICAgIGlmIHQuaXNfaW1hZ2UgPT0gVHJ1ZToKKyAgICAgICAgICAgICAgICBvdXRwdXRfZmlsZXMgPSBsaXN0KGV2ZGF0YS52aWV3a2V5cygpKQorICAgICAgICAgICAgICAgIGZvciBvdXRwdXQgaW4gb3V0cHV0X2ZpbGVzOgorICAgICAgICAgICAgICAgICAgICBpZiB0LnRhcmdldCBpbiBvdXRwdXQgYW5kICdyb290ZnMnIGluIG91dHB1dCBhbmQgbm90IG91dHB1dC5lbmRzd2l0aCgiLm1hbmlmZXN0Iik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9ybV93cmFwcGVyLnNhdmVfdGFyZ2V0X2ltYWdlX2ZpbGVfaW5mb3JtYXRpb24odCwgb3V0cHV0LCBldmRhdGFbb3V0cHV0XSkKKworICAgIGRlZiB1cGRhdGVfYXJ0aWZhY3RfaW1hZ2VfZmlsZShzZWxmLCBldmVudCk6CisgICAgICAgIGV2ZGF0YSA9IEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudCkKKyAgICAgICAgZm9yIGFydGlmYWN0X3BhdGggaW4gZXZkYXRhLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuc2F2ZV9hcnRpZmFjdF9pbmZvcm1hdGlvbihzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddLCBhcnRpZmFjdF9wYXRoLCBldmRhdGFbYXJ0aWZhY3RfcGF0aF0pCisKKyAgICBkZWYgdXBkYXRlX2J1aWxkX2luZm9ybWF0aW9uKHNlbGYsIGV2ZW50LCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrZmFpbHVyZXMpOgorICAgICAgICBpZiAnYnVpbGQnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICBzZWxmLm9ybV93cmFwcGVyLnVwZGF0ZV9idWlsZF9vYmplY3Qoc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXSwgZXJyb3JzLCB3YXJuaW5ncywgdGFza2ZhaWx1cmVzKQorCisKKyAgICBkZWYgc3RvcmVfbGljZW5zZV9tYW5pZmVzdF9wYXRoKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZGVwbG95X2RpciA9IEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudClbJ2RlcGxveV9kaXInXQorICAgICAgICBpbWFnZV9uYW1lID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KVsnaW1hZ2VfbmFtZSddCisgICAgICAgIHBhdGggPSBkZXBsb3lfZGlyICsgIi9saWNlbnNlcy8iICsgaW1hZ2VfbmFtZSArICIvbGljZW5zZS5tYW5pZmVzdCIKKyAgICAgICAgZm9yIHRhcmdldCBpbiBzZWxmLmludGVybmFsX3N0YXRlWyd0YXJnZXRzJ106CisgICAgICAgICAgICBpZiB0YXJnZXQudGFyZ2V0IGluIGltYWdlX25hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci51cGRhdGVfdGFyZ2V0X3NldF9saWNlbnNlX21hbmlmZXN0KHRhcmdldCwgcGF0aCkKKworCisgICAgZGVmIHN0b3JlX3N0YXJ0ZWRfdGFzayhzZWxmLCBldmVudCk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGV2ZW50LCAoYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkLCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTdGFydGVkLCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTa2lwcGVkKSkKKyAgICAgICAgYXNzZXJ0ICd0YXNrZmlsZScgaW4gdmFycyhldmVudCkKKyAgICAgICAgbG9jYWxmaWxlcGF0aCA9IGV2ZW50LnRhc2tmaWxlLnNwbGl0KCI6IilbLTFdCisgICAgICAgIGFzc2VydCBsb2NhbGZpbGVwYXRoLnN0YXJ0c3dpdGgoIi8iKQorCisgICAgICAgIGlkZW50aWZpZXIgPSBldmVudC50YXNrZmlsZSArICI6IiArIGV2ZW50LnRhc2tuYW1lCisKKyAgICAgICAgcmVjaXBlX2luZm9ybWF0aW9uID0gc2VsZi5fZ2V0X3JlY2lwZV9pbmZvcm1hdGlvbl9mcm9tX3Rhc2tmaWxlKGV2ZW50LnRhc2tmaWxlKQorICAgICAgICByZWNpcGUgPSBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfcmVjaXBlX29iamVjdChyZWNpcGVfaW5mb3JtYXRpb24sIFRydWUpCisKKyAgICAgICAgdGFza19pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF90YXNrX2luZm9ybWF0aW9uKGV2ZW50LCByZWNpcGUpCisgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IFRhc2suT1VUQ09NRV9OQQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1NraXBwZWQpOgorICAgICAgICAgICAgYXNzZXJ0ICdyZWFzb24nIGluIHZhcnMoZXZlbnQpCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWyd0YXNrX2V4ZWN1dGVkJ10gPSBGYWxzZQorICAgICAgICAgICAgaWYgZXZlbnQucmVhc29uID09ICJjb3ZlcmVkIjoKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10gPSBUYXNrLk9VVENPTUVfQ09WRVJFRAorICAgICAgICAgICAgaWYgZXZlbnQucmVhc29uID09ICJleGlzdGluZyI6CisgICAgICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddID0gVGFzay5PVVRDT01FX1BSRUJVSUxUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWyd0YXNrX2V4ZWN1dGVkJ10gPSBUcnVlCisgICAgICAgICAgICBpZiAnbm9leGVjJyBpbiB2YXJzKGV2ZW50KSBhbmQgZXZlbnQubm9leGVjID09IFRydWU6CisgICAgICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsndGFza19leGVjdXRlZCddID0gRmFsc2UKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10gPSBUYXNrLk9VVENPTUVfRU1QVFkKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzY3JpcHRfdHlwZSddID0gVGFzay5DT0RJTkdfTkEKKworICAgICAgICAjIGRvIG5vdCBhc3NpZ24gb3JkZXIgbnVtYmVycyB0byBzY2VuZSB0YXNrcworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkKToKKyAgICAgICAgICAgIHNlbGYudGFza19vcmRlciArPSAxCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydvcmRlciddID0gc2VsZi50YXNrX29yZGVyCisKKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHRhc2tfaW5mb3JtYXRpb24pCisKKyAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXVtpZGVudGlmaWVyXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICdvdXRjb21lJzogdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddLAorICAgICAgICAgICAgICAgICAgICB9CisKKworICAgIGRlZiBzdG9yZV90YXNrc19zdGF0cyhzZWxmLCBldmVudCk6CisgICAgICAgIGZvciAodGFza2ZpbGUsIHRhc2tuYW1lLCB0YXNrc3RhdHMsIHJlY2lwZW5hbWUpIGluIEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudCk6CisgICAgICAgICAgICBsb2NhbGZpbGVwYXRoID0gdGFza2ZpbGUuc3BsaXQoIjoiKVstMV0KKyAgICAgICAgICAgIGFzc2VydCBsb2NhbGZpbGVwYXRoLnN0YXJ0c3dpdGgoIi8iKQorCisgICAgICAgICAgICByZWNpcGVfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfcmVjaXBlX2luZm9ybWF0aW9uX2Zyb21fdGFza2ZpbGUodGFza2ZpbGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgcmVjaXBlX2luZm9ybWF0aW9uWydmaWxlX3BhdGgnXS5zdGFydHN3aXRoKHJlY2lwZV9pbmZvcm1hdGlvblsnbGF5ZXJfdmVyc2lvbiddLmxvY2FsX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICByZWNpcGVfaW5mb3JtYXRpb25bJ2ZpbGVfcGF0aCddID0gcmVjaXBlX2luZm9ybWF0aW9uWydmaWxlX3BhdGgnXVtsZW4ocmVjaXBlX2luZm9ybWF0aW9uWydsYXllcl92ZXJzaW9uJ10ubG9jYWxfcGF0aCk6XS5sc3RyaXAoIi8iKQorCisgICAgICAgICAgICAgICAgcmVjaXBlX29iamVjdCA9IFJlY2lwZS5vYmplY3RzLmdldChsYXllcl92ZXJzaW9uID0gcmVjaXBlX2luZm9ybWF0aW9uWydsYXllcl92ZXJzaW9uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXRoX19lbmRzd2l0aCA9IHJlY2lwZV9pbmZvcm1hdGlvblsnZmlsZV9wYXRoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlY2lwZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgUmVjaXBlLkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvdWxkIG5vdCBmaW5kIHJlY2lwZSBmb3IgcmVjaXBlX2luZm9ybWF0aW9uICVzIG5hbWUgJXMiICwgcGZvcm1hdChyZWNpcGVfaW5mb3JtYXRpb24pLCByZWNpcGVuYW1lKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb24gPSB7fQorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnYnVpbGQnXSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2J1aWxkJ10KKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3JlY2lwZSddID0gcmVjaXBlX29iamVjdAorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsndGFza19uYW1lJ10gPSB0YXNrbmFtZQorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnY3B1X3VzYWdlJ10gPSB0YXNrc3RhdHNbJ2NwdV91c2FnZSddCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydkaXNrX2lvJ10gPSB0YXNrc3RhdHNbJ2Rpc2tfaW8nXQorICAgICAgICAgICAgaWYgJ2VsYXBzZWRfdGltZScgaW4gdGFza3N0YXRzOgorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ2VsYXBzZWRfdGltZSddID0gdGFza3N0YXRzWydlbGFwc2VkX3RpbWUnXQorICAgICAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHRhc2tfaW5mb3JtYXRpb24sIFRydWUpICAjIG11c3QgZXhpc3QKKworICAgIGRlZiB1cGRhdGVfYW5kX3N0b3JlX3Rhc2soc2VsZiwgZXZlbnQpOgorICAgICAgICBhc3NlcnQgJ3Rhc2tmaWxlJyBpbiB2YXJzKGV2ZW50KQorICAgICAgICBsb2NhbGZpbGVwYXRoID0gZXZlbnQudGFza2ZpbGUuc3BsaXQoIjoiKVstMV0KKyAgICAgICAgYXNzZXJ0IGxvY2FsZmlsZXBhdGguc3RhcnRzd2l0aCgiLyIpCisKKyAgICAgICAgaWRlbnRpZmllciA9IGV2ZW50LnRhc2tmaWxlICsgIjoiICsgZXZlbnQudGFza25hbWUKKyAgICAgICAgaWYgbm90IGlkZW50aWZpZXIgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tCYXNlKToKKyAgICAgICAgICAgICAgICAjIHdlIGRvIGEgYml0IG9mIGd1ZXNzaW5nCisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IFt4IGZvciB4IGluIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3Rhc2tkYXRhJ10ua2V5cygpIGlmIHguZW5kc3dpdGgoaWRlbnRpZmllcildCisgICAgICAgICAgICAgICAgaWYgbGVuKGNhbmRpZGF0ZXMpID09IDE6CisgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgPSBjYW5kaWRhdGVzWzBdCisKKyAgICAgICAgYXNzZXJ0IGlkZW50aWZpZXIgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXQorICAgICAgICBpZGVudGlmaWVybGlzdCA9IGlkZW50aWZpZXIuc3BsaXQoIjoiKQorICAgICAgICByZWFsdGFza2ZpbGUgPSAiOiIuam9pbihpZGVudGlmaWVybGlzdFswOmxlbihpZGVudGlmaWVybGlzdCktMV0pCisgICAgICAgIHJlY2lwZV9pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF9yZWNpcGVfaW5mb3JtYXRpb25fZnJvbV90YXNrZmlsZShyZWFsdGFza2ZpbGUpCisgICAgICAgIHJlY2lwZSA9IHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV9yZWNpcGVfb2JqZWN0KHJlY2lwZV9pbmZvcm1hdGlvbiwgVHJ1ZSkKKyAgICAgICAgdGFza19pbmZvcm1hdGlvbiA9IHNlbGYuX2dldF90YXNrX2luZm9ybWF0aW9uKGV2ZW50LHJlY2lwZSkKKworICAgICAgICBpZiAndGltZScgaW4gdmFycyhldmVudCk6CisgICAgICAgICAgICBpZiBub3QgJ3N0YXJ0X3RpbWUnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3Rhc2tkYXRhJ11baWRlbnRpZmllcl06CisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFza2RhdGEnXVtpZGVudGlmaWVyXVsnc3RhcnRfdGltZSddID0gZXZlbnQudGltZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydlbmRfdGltZSddID0gZXZlbnQudGltZQorICAgICAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ3N0YXJ0X3RpbWUnXSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3Rhc2tkYXRhJ11baWRlbnRpZmllcl1bJ3N0YXJ0X3RpbWUnXQorCisgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3Rhc2tkYXRhJ11baWRlbnRpZmllcl1bJ291dGNvbWUnXQorCisgICAgICAgIGlmICdsb2dmaWxlJyBpbiB2YXJzKGV2ZW50KToKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ2xvZ2ZpbGUnXSA9IGV2ZW50LmxvZ2ZpbGUKKworICAgICAgICBpZiAnX21lc3NhZ2UnIGluIHZhcnMoZXZlbnQpOgorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnbWVzc2FnZSddID0gZXZlbnQuX21lc3NhZ2UKKworICAgICAgICBpZiAndGFza2ZsYWdzJyBpbiB2YXJzKGV2ZW50KToKKyAgICAgICAgICAgICMgd2l0aCBUYXNrU3RhcnRlZCwgd2UgZ2V0IGV2ZW4gbW9yZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgaWYgJ3B5dGhvbicgaW4gZXZlbnQudGFza2ZsYWdzLmtleXMoKSBhbmQgZXZlbnQudGFza2ZsYWdzWydweXRob24nXSA9PSAnMSc6CisgICAgICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnc2NyaXB0X3R5cGUnXSA9IFRhc2suQ09ESU5HX1BZVEhPTgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydzY3JpcHRfdHlwZSddID0gVGFzay5DT0RJTkdfU0hFTEwKKworICAgICAgICBpZiB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10gPT0gVGFzay5PVVRDT01FX05BOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza0NvbXBsZXRlZCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tDb21wbGV0ZWQpKToKKyAgICAgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uWydvdXRjb21lJ10gPSBUYXNrLk9VVENPTUVfU1VDQ0VTUworICAgICAgICAgICAgICAgIGRlbCBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddW2lkZW50aWZpZXJdCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tGYWlsZWQsIGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkKSk6CisgICAgICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnb3V0Y29tZSddID0gVGFzay5PVVRDT01FX0ZBSUxFRAorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmludGVybmFsX3N0YXRlWyd0YXNrZGF0YSddW2lkZW50aWZpZXJdCisKKyAgICAgICAgaWYgbm90IGNvbm5lY3Rpb24uZmVhdHVyZXMuYXV0b2NvbW1pdHNfd2hlbl9hdXRvY29tbWl0X2lzX29mZjoKKyAgICAgICAgICAgICMgd2UgZm9yY2UgYSBzeW5jIHBvaW50IGhlcmUsIHRvIGdldCB0aGUgcHJvZ3Jlc3MgYmFyIHRvIHNob3cKKyAgICAgICAgICAgIGlmIHNlbGYuYXV0b2NvbW1pdF9zdGVwICUgMyA9PSAwOgorICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLnNldF9hdXRvY29tbWl0KFRydWUpCisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uc2V0X2F1dG9jb21taXQoRmFsc2UpCisgICAgICAgICAgICBzZWxmLmF1dG9jb21taXRfc3RlcCArPSAxCisKKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3Rhc2tfb2JqZWN0KHRhc2tfaW5mb3JtYXRpb24sIFRydWUpICMgbXVzdCBleGlzdAorCisKKyAgICBkZWYgc3RvcmVfbWlzc2VkX3N0YXRlX3Rhc2tzKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZm9yIChmbiwgdGFza25hbWUsIHRhc2toYXNoLCBzc3RhdGVmaWxlKSBpbiBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpWydtaXNzZWQnXToKKworICAgICAgICAgICAgIyBpZGVudGlmaWVyID0gZm4gKyB0YXNrbmFtZSArICJfc2V0c2NlbmUiCisgICAgICAgICAgICByZWNpcGVfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfcmVjaXBlX2luZm9ybWF0aW9uX2Zyb21fdGFza2ZpbGUoZm4pCisgICAgICAgICAgICByZWNpcGUgPSBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfcmVjaXBlX29iamVjdChyZWNpcGVfaW5mb3JtYXRpb24pCisgICAgICAgICAgICBtZXZlbnQgPSBNb2NrRXZlbnQoKQorICAgICAgICAgICAgbWV2ZW50LnRhc2tuYW1lID0gdGFza25hbWUKKyAgICAgICAgICAgIG1ldmVudC50YXNraGFzaCA9IHRhc2toYXNoCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uID0gc2VsZi5fZ2V0X3Rhc2tfaW5mb3JtYXRpb24obWV2ZW50LHJlY2lwZSkKKworICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnc3RhcnRfdGltZSddID0gdGltZXpvbmUubm93KCkKKyAgICAgICAgICAgIHRhc2tfaW5mb3JtYXRpb25bJ291dGNvbWUnXSA9IFRhc2suT1VUQ09NRV9OQQorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnc3N0YXRlX2NoZWNrc3VtJ10gPSB0YXNraGFzaAorICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsnc3N0YXRlX3Jlc3VsdCddID0gVGFzay5TU1RBVEVfTUlTUworICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsncGF0aF90b19zc3RhdGVfb2JqJ10gPSBzc3RhdGVmaWxlCisKKyAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV90YXNrX29iamVjdCh0YXNrX2luZm9ybWF0aW9uKQorCisgICAgICAgIGZvciAoZm4sIHRhc2tuYW1lLCB0YXNraGFzaCwgc3N0YXRlZmlsZSkgaW4gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KVsnZm91bmQnXToKKworICAgICAgICAgICAgIyBpZGVudGlmaWVyID0gZm4gKyB0YXNrbmFtZSArICJfc2V0c2NlbmUiCisgICAgICAgICAgICByZWNpcGVfaW5mb3JtYXRpb24gPSBzZWxmLl9nZXRfcmVjaXBlX2luZm9ybWF0aW9uX2Zyb21fdGFza2ZpbGUoZm4pCisgICAgICAgICAgICByZWNpcGUgPSBzZWxmLm9ybV93cmFwcGVyLmdldF91cGRhdGVfcmVjaXBlX29iamVjdChyZWNpcGVfaW5mb3JtYXRpb24pCisgICAgICAgICAgICBtZXZlbnQgPSBNb2NrRXZlbnQoKQorICAgICAgICAgICAgbWV2ZW50LnRhc2tuYW1lID0gdGFza25hbWUKKyAgICAgICAgICAgIG1ldmVudC50YXNraGFzaCA9IHRhc2toYXNoCisgICAgICAgICAgICB0YXNrX2luZm9ybWF0aW9uID0gc2VsZi5fZ2V0X3Rhc2tfaW5mb3JtYXRpb24obWV2ZW50LHJlY2lwZSkKKworICAgICAgICAgICAgdGFza19pbmZvcm1hdGlvblsncGF0aF90b19zc3RhdGVfb2JqJ10gPSBzc3RhdGVmaWxlCisKKyAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV90YXNrX29iamVjdCh0YXNrX2luZm9ybWF0aW9uKQorCisKKyAgICBkZWYgc3RvcmVfdGFyZ2V0X3BhY2thZ2VfZGF0YShzZWxmLCBldmVudCk6CisgICAgICAgICMgZm9yIGFsbCBpbWFnZSB0YXJnZXRzCisgICAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFyZ2V0cyddOgorICAgICAgICAgICAgaWYgdGFyZ2V0LmlzX2ltYWdlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGtnZGF0YSA9IEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudClbJ3BrZ2RhdGEnXQorICAgICAgICAgICAgICAgICAgICBpbWdkYXRhID0gQnVpbGRJbmZvSGVscGVyLl9nZXRfZGF0YV9mcm9tX2V2ZW50KGV2ZW50KVsnaW1nZGF0YSddW3RhcmdldC50YXJnZXRdCisgICAgICAgICAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuc2F2ZV90YXJnZXRfcGFja2FnZV9pbmZvcm1hdGlvbihzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddLCB0YXJnZXQsIGltZ2RhdGEsIHBrZ2RhdGEsIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3JlY2lwZXMnXSkKKyAgICAgICAgICAgICAgICAgICAgZmlsZWRhdGEgPSBCdWlsZEluZm9IZWxwZXIuX2dldF9kYXRhX2Zyb21fZXZlbnQoZXZlbnQpWydmaWxlZGF0YSddW3RhcmdldC50YXJnZXRdCisgICAgICAgICAgICAgICAgICAgIHNlbGYub3JtX3dyYXBwZXIuc2F2ZV90YXJnZXRfZmlsZV9pbmZvcm1hdGlvbihzZWxmLmludGVybmFsX3N0YXRlWydidWlsZCddLCB0YXJnZXQsIGZpbGVkYXRhKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBtdXN0IGhhdmUgbm90IGdvdCB0aGUgZGF0YSBmb3IgdGhpcyBpbWFnZSwgbm90aGluZyB0byBzYXZlCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworCisKKyAgICBkZWYgc3RvcmVfZGVwZW5kZW5jeV9pbmZvcm1hdGlvbihzZWxmLCBldmVudCk6CisgICAgICAgIGFzc2VydCAnX2RlcGdyYXBoJyBpbiB2YXJzKGV2ZW50KQorICAgICAgICBhc3NlcnQgJ2xheWVyLXByaW9yaXRpZXMnIGluIGV2ZW50Ll9kZXBncmFwaAorICAgICAgICBhc3NlcnQgJ3BuJyBpbiBldmVudC5fZGVwZ3JhcGgKKyAgICAgICAgYXNzZXJ0ICd0ZGVwZW5kcycgaW4gZXZlbnQuX2RlcGdyYXBoCisKKyAgICAgICAgZXJyb3Jtc2cgPSAiIgorCisgICAgICAgICMgc2F2ZSBsYXllciB2ZXJzaW9uIHByaW9yaXRpZXMKKyAgICAgICAgaWYgJ2xheWVyLXByaW9yaXRpZXMnIGluIGV2ZW50Ll9kZXBncmFwaC5rZXlzKCk6CisgICAgICAgICAgICBmb3IgbHYgaW4gZXZlbnQuX2RlcGdyYXBoWydsYXllci1wcmlvcml0aWVzJ106CisgICAgICAgICAgICAgICAgKF8sIHBhdGgsIF8sIHByaW9yaXR5KSA9IGx2CisgICAgICAgICAgICAgICAgbGF5ZXJfdmVyc2lvbl9vYmogPSBzZWxmLl9nZXRfbGF5ZXJfdmVyc2lvbl9mb3JfcGF0aChwYXRoWzE6XSkgIyBwYXRocyBzdGFydCB3aXRoIGEgXgorICAgICAgICAgICAgICAgIGFzc2VydCBsYXllcl92ZXJzaW9uX29iaiBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgIGxheWVyX3ZlcnNpb25fb2JqLnByaW9yaXR5ID0gcHJpb3JpdHkKKyAgICAgICAgICAgICAgICBsYXllcl92ZXJzaW9uX29iai5zYXZlKCkKKworICAgICAgICAjIHNhdmUgcmVjaXBlIGluZm9ybWF0aW9uCisgICAgICAgIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3JlY2lwZXMnXSA9IHt9CisgICAgICAgIGZvciBwbiBpbiBldmVudC5fZGVwZ3JhcGhbJ3BuJ106CisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ2ZpbGVuYW1lJ10uc3BsaXQoIjoiKVstMV0KKyAgICAgICAgICAgIHBhdGhmbGFncyA9ICI6Ii5qb2luKHNvcnRlZChldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dWydmaWxlbmFtZSddLnNwbGl0KCI6IilbOi0xXSkpCisgICAgICAgICAgICBsYXllcl92ZXJzaW9uX29iaiA9IHNlbGYuX2dldF9sYXllcl92ZXJzaW9uX2Zvcl9wYXRoKGZpbGVfbmFtZSkKKworICAgICAgICAgICAgYXNzZXJ0IGxheWVyX3ZlcnNpb25fb2JqIGlzIG5vdCBOb25lCisKKyAgICAgICAgICAgIHJlY2lwZV9pbmZvID0ge30KKyAgICAgICAgICAgIHJlY2lwZV9pbmZvWyduYW1lJ10gPSBwbgorICAgICAgICAgICAgcmVjaXBlX2luZm9bJ2xheWVyX3ZlcnNpb24nXSA9IGxheWVyX3ZlcnNpb25fb2JqCisKKyAgICAgICAgICAgIGlmICd2ZXJzaW9uJyBpbiBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dOgorICAgICAgICAgICAgICAgIHJlY2lwZV9pbmZvWyd2ZXJzaW9uJ10gPSBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dWyd2ZXJzaW9uJ10ubHN0cmlwKCI6IikKKworICAgICAgICAgICAgaWYgJ3N1bW1hcnknIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl06CisgICAgICAgICAgICAgICAgcmVjaXBlX2luZm9bJ3N1bW1hcnknXSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ3N1bW1hcnknXQorCisgICAgICAgICAgICBpZiAnbGljZW5zZScgaW4gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXToKKyAgICAgICAgICAgICAgICByZWNpcGVfaW5mb1snbGljZW5zZSddID0gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXVsnbGljZW5zZSddCisKKyAgICAgICAgICAgIGlmICdkZXNjcmlwdGlvbicgaW4gZXZlbnQuX2RlcGdyYXBoWydwbiddW3BuXToKKyAgICAgICAgICAgICAgICByZWNpcGVfaW5mb1snZGVzY3JpcHRpb24nXSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ2Rlc2NyaXB0aW9uJ10KKworICAgICAgICAgICAgaWYgJ3NlY3Rpb24nIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl06CisgICAgICAgICAgICAgICAgcmVjaXBlX2luZm9bJ3NlY3Rpb24nXSA9IGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ3NlY3Rpb24nXQorCisgICAgICAgICAgICBpZiAnaG9tZXBhZ2UnIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl06CisgICAgICAgICAgICAgICAgcmVjaXBlX2luZm9bJ2hvbWVwYWdlJ10gPSBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dWydob21lcGFnZSddCisKKyAgICAgICAgICAgIGlmICdidWd0cmFja2VyJyBpbiBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dOgorICAgICAgICAgICAgICAgIHJlY2lwZV9pbmZvWydidWd0cmFja2VyJ10gPSBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dWydidWd0cmFja2VyJ10KKworICAgICAgICAgICAgcmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddID0gZmlsZV9uYW1lCisgICAgICAgICAgICByZWNpcGVfaW5mb1sncGF0aGZsYWdzJ10gPSBwYXRoZmxhZ3MKKworICAgICAgICAgICAgaWYgcmVjaXBlX2luZm9bJ2ZpbGVfcGF0aCddLnN0YXJ0c3dpdGgocmVjaXBlX2luZm9bJ2xheWVyX3ZlcnNpb24nXS5sb2NhbF9wYXRoKToKKyAgICAgICAgICAgICAgICByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ10gPSByZWNpcGVfaW5mb1snZmlsZV9wYXRoJ11bbGVuKHJlY2lwZV9pbmZvWydsYXllcl92ZXJzaW9uJ10ubG9jYWxfcGF0aCk6XS5sc3RyaXAoIi8iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlJlY2lwZSBmaWxlIHBhdGggJXMgaXMgbm90IHVuZGVyIGxheWVyIHZlcnNpb24gYXQgJXMiICUgKHJlY2lwZV9pbmZvWydmaWxlX3BhdGgnXSwgcmVjaXBlX2luZm9bJ2xheWVyX3ZlcnNpb24nXS5sb2NhbF9wYXRoKSkKKworICAgICAgICAgICAgcmVjaXBlID0gc2VsZi5vcm1fd3JhcHBlci5nZXRfdXBkYXRlX3JlY2lwZV9vYmplY3QocmVjaXBlX2luZm8pCisgICAgICAgICAgICByZWNpcGUuaXNfaW1hZ2UgPSBGYWxzZQorICAgICAgICAgICAgaWYgJ2luaGVyaXRzJyBpbiBldmVudC5fZGVwZ3JhcGhbJ3BuJ11bcG5dLmtleXMoKToKKyAgICAgICAgICAgICAgICBmb3IgY2xzIGluIGV2ZW50Ll9kZXBncmFwaFsncG4nXVtwbl1bJ2luaGVyaXRzJ106CisgICAgICAgICAgICAgICAgICAgIGlmIGNscy5lbmRzd2l0aCgnL2ltYWdlLmJiY2xhc3MnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwZS5pc19pbWFnZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiByZWNpcGUuaXNfaW1hZ2U6CisgICAgICAgICAgICAgICAgZm9yIHQgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZVsndGFyZ2V0cyddOgorICAgICAgICAgICAgICAgICAgICBpZiBwbiA9PSB0LnRhcmdldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuaXNfaW1hZ2UgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICB0LnNhdmUoKQorICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsncmVjaXBlcyddW3BuXSA9IHJlY2lwZQorCisgICAgICAgICMgd2UnbGwgbm90IGdldCByZWNpcGVzIGZvciBrZXkgdy8gdmFsdWVzIGxpc3RlZCBpbiBBU1NVTUVfUFJPVklERUQKKworICAgICAgICBhc3N1bWVfcHJvdmlkZWQgPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQVNTVU1FX1BST1ZJREVEIl0pWzBdLnNwbGl0KCkKKworICAgICAgICAjIHNhdmUgcmVjaXBlIGRlcGVuZGVuY3kKKyAgICAgICAgIyBidWlsZHRpbWUKKyAgICAgICAgcmVjaXBlZGVwc19vYmplY3RzID0gW10KKyAgICAgICAgZm9yIHJlY2lwZSBpbiBldmVudC5fZGVwZ3JhcGhbJ2RlcGVuZHMnXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBzZWxmLmludGVybmFsX3N0YXRlWydyZWNpcGVzJ11bcmVjaXBlXQorICAgICAgICAgICAgICAgIGZvciBkZXAgaW4gZXZlbnQuX2RlcGdyYXBoWydkZXBlbmRzJ11bcmVjaXBlXToKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeSA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ3JlY2lwZXMnXVtkZXBdCisgICAgICAgICAgICAgICAgICAgIHJlY2lwZWRlcHNfb2JqZWN0cy5hcHBlbmQoUmVjaXBlX0RlcGVuZGVuY3koIHJlY2lwZSA9IHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzX29uID0gZGVwZW5kZW5jeSwgZGVwX3R5cGUgPSBSZWNpcGVfRGVwZW5kZW5jeS5UWVBFX0RFUEVORFMpKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZSBub3QgaW4gYXNzdW1lX3Byb3ZpZGVkIGFuZCBub3Qgc3RyKGUpLnN0YXJ0c3dpdGgoInZpcnR1YWwvIik6CisgICAgICAgICAgICAgICAgICAgIGVycm9ybXNnICs9ICIgIHN0cGQ6IEtleUVycm9yIHNhdmluZyByZWNpcGUgZGVwZW5kZW5jeSBmb3IgJXMsICVzIFxuIiAlIChyZWNpcGUsIGUpCisgICAgICAgIFJlY2lwZV9EZXBlbmRlbmN5Lm9iamVjdHMuYnVsa19jcmVhdGUocmVjaXBlZGVwc19vYmplY3RzKQorCisgICAgICAgICMgc2F2ZSBhbGwgdGFzayBpbmZvcm1hdGlvbgorICAgICAgICBkZWYgX3NhdmVfYV90YXNrKHRhc2tkZXNjKToKKyAgICAgICAgICAgIHNwZWMgPSByZS5zcGxpdChyJ1wuJywgdGFza2Rlc2MpCisgICAgICAgICAgICBwbiA9ICIuIi5qb2luKHNwZWNbMDotMV0pCisgICAgICAgICAgICB0YXNrbmFtZSA9IHNwZWNbLTFdCisgICAgICAgICAgICBlID0gZXZlbnQKKyAgICAgICAgICAgIGUudGFza25hbWUgPSBwbgorICAgICAgICAgICAgcmVjaXBlID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsncmVjaXBlcyddW3BuXQorICAgICAgICAgICAgdGFza19pbmZvID0gc2VsZi5fZ2V0X3Rhc2tfaW5mb3JtYXRpb24oZSwgcmVjaXBlKQorICAgICAgICAgICAgdGFza19pbmZvWyd0YXNrX25hbWUnXSA9IHRhc2tuYW1lCisgICAgICAgICAgICB0YXNrX29iaiA9IHNlbGYub3JtX3dyYXBwZXIuZ2V0X3VwZGF0ZV90YXNrX29iamVjdCh0YXNrX2luZm8pCisgICAgICAgICAgICByZXR1cm4gdGFza19vYmoKKworICAgICAgICAjIGNyZWF0ZSB0YXNrcworICAgICAgICB0YXNrcyA9IHt9CisgICAgICAgIGZvciB0YXNrZGVzYyBpbiBldmVudC5fZGVwZ3JhcGhbJ3RkZXBlbmRzJ106CisgICAgICAgICAgICB0YXNrc1t0YXNrZGVzY10gPSBfc2F2ZV9hX3Rhc2sodGFza2Rlc2MpCisKKyAgICAgICAgIyBjcmVhdGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGFza3MKKyAgICAgICAgdGFza2RlcHNfb2JqZWN0cyA9IFtdCisgICAgICAgIGZvciB0YXNrZGVzYyBpbiBldmVudC5fZGVwZ3JhcGhbJ3RkZXBlbmRzJ106CisgICAgICAgICAgICB0YXJnZXQgPSB0YXNrc1t0YXNrZGVzY10KKyAgICAgICAgICAgIGZvciB0YXNrZGVwIGluIGV2ZW50Ll9kZXBncmFwaFsndGRlcGVuZHMnXVt0YXNrZGVzY106CisgICAgICAgICAgICAgICAgaWYgdGFza2RlcCBub3QgaW4gdGFza3M6CisgICAgICAgICAgICAgICAgICAgICMgRmV0Y2ggdGFza3MgaW5mbyBpcyBub3QgY29sbGVjdGVkIHByZXZpb3VzbHkKKyAgICAgICAgICAgICAgICAgICAgZGVwID0gX3NhdmVfYV90YXNrKHRhc2tkZXApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVwID0gdGFza3NbdGFza2RlcF0KKyAgICAgICAgICAgICAgICB0YXNrZGVwc19vYmplY3RzLmFwcGVuZChUYXNrX0RlcGVuZGVuY3koIHRhc2sgPSB0YXJnZXQsIGRlcGVuZHNfb24gPSBkZXAgKSkKKyAgICAgICAgVGFza19EZXBlbmRlbmN5Lm9iamVjdHMuYnVsa19jcmVhdGUodGFza2RlcHNfb2JqZWN0cykKKworICAgICAgICBpZiBsZW4oZXJyb3Jtc2cpID4gMDoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJidWlsZGluZm9oZWxwZXI6IGRlcGVuZGVuY3kgaW5mbyBub3QgaWRlbnRpZnkgcmVjaXBlczogXG4lcyIsIGVycm9ybXNnKQorCisKKyAgICBkZWYgc3RvcmVfYnVpbGRfcGFja2FnZV9pbmZvcm1hdGlvbihzZWxmLCBldmVudCk6CisgICAgICAgIHBhY2thZ2VfaW5mbyA9IEJ1aWxkSW5mb0hlbHBlci5fZ2V0X2RhdGFfZnJvbV9ldmVudChldmVudCkKKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5zYXZlX2J1aWxkX3BhY2thZ2VfaW5mb3JtYXRpb24oc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsncmVjaXBlcyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBfc3RvcmVfYnVpbGRfZG9uZShzZWxmLCBlcnJvcmNvZGUpOgorICAgICAgICBsb2dnZXIuaW5mbygiQnVpbGQgZXhpdGVkIHdpdGggZXJyb3Jjb2RlICVkIiwgZXJyb3Jjb2RlKQorICAgICAgICBicl9pZCwgYmVfaWQgPSBzZWxmLmJyYmUuc3BsaXQoIjoiKQorICAgICAgICBiZSA9IEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5nZXQocGsgPSBiZV9pZCkKKyAgICAgICAgYmUubG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19MT0NLCisgICAgICAgIGJlLnNhdmUoKQorICAgICAgICBiciA9IEJ1aWxkUmVxdWVzdC5vYmplY3RzLmdldChwayA9IGJyX2lkKQorICAgICAgICBpZiBlcnJvcmNvZGUgPT0gMDoKKyAgICAgICAgICAgICMgcmVxdWVzdCBhcmNoaXZhbCBvZiB0aGUgcHJvamVjdCBhcnRpZmFjdHMKKyAgICAgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9BUkNISVZFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBici5zdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfRkFJTEVECisgICAgICAgIGJyLnNhdmUoKQorCisKKyAgICBkZWYgc3RvcmVfbG9nX2Vycm9yKHNlbGYsIHRleHQpOgorICAgICAgICBtb2NrZXZlbnQgPSBNb2NrRXZlbnQoKQorICAgICAgICBtb2NrZXZlbnQubGV2ZWxubyA9IGZvcm1hdHRlci5FUlJPUgorICAgICAgICBtb2NrZXZlbnQubXNnID0gdGV4dAorICAgICAgICBtb2NrZXZlbnQucGF0aG5hbWUgPSAnLS0gTm9uZScKKyAgICAgICAgbW9ja2V2ZW50LmxpbmVubyA9IExvZ01lc3NhZ2UuRVJST1IKKyAgICAgICAgc2VsZi5zdG9yZV9sb2dfZXZlbnQobW9ja2V2ZW50KQorCisgICAgZGVmIHN0b3JlX2xvZ19leGNlcHRpb24oc2VsZiwgdGV4dCwgYmFja3RyYWNlID0gIiIpOgorICAgICAgICBtb2NrZXZlbnQgPSBNb2NrRXZlbnQoKQorICAgICAgICBtb2NrZXZlbnQubGV2ZWxubyA9IC0xCisgICAgICAgIG1vY2tldmVudC5tc2cgPSB0ZXh0CisgICAgICAgIG1vY2tldmVudC5wYXRobmFtZSA9IGJhY2t0cmFjZQorICAgICAgICBtb2NrZXZlbnQubGluZW5vID0gLTEKKyAgICAgICAgc2VsZi5zdG9yZV9sb2dfZXZlbnQobW9ja2V2ZW50KQorCisKKyAgICBkZWYgc3RvcmVfbG9nX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA8IGZvcm1hdHRlci5XQVJOSU5HOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgJ2FyZ3MnIGluIHZhcnMoZXZlbnQpOgorICAgICAgICAgICAgZXZlbnQubXNnID0gZXZlbnQubXNnICUgZXZlbnQuYXJncworCisgICAgICAgIGlmIG5vdCAnYnVpbGQnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICBpZiBzZWxmLmJyYmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBub3QgJ2JhY2tsb2cnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2JhY2tsb2cnXSA9IFtdCisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYmFja2xvZyddLmFwcGVuZChldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6ICAgIyB3ZSdyZSB1bmRlciBUb2FzdGVyIGNvbnRyb2wsIHRoZSBidWlsZCBpcyBhbHJlYWR5IGNyZWF0ZWQKKyAgICAgICAgICAgICAgICBiciwgXyA9IHNlbGYuYnJiZS5zcGxpdCgiOiIpCisgICAgICAgICAgICAgICAgYnVpbGRyZXF1ZXN0ID0gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZ2V0KHBrID0gYnIpCisgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXSA9IGJ1aWxkcmVxdWVzdC5idWlsZAorCisgICAgICAgIGlmICdidWlsZCcgaW4gc2VsZi5pbnRlcm5hbF9zdGF0ZSBhbmQgJ2JhY2tsb2cnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICAjIGlmIHdlIGhhdmUgYSBiYWNrbG9nIG9mIGV2ZW50cywgZG8gb3VyIGJlc3QgdG8gc2F2ZSB0aGVtIGhlcmUKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmludGVybmFsX3N0YXRlWydiYWNrbG9nJ10pOgorICAgICAgICAgICAgICAgIHRlbXBldmVudCA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2JhY2tsb2cnXS5wb3AoKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiYnVpbGRpbmZvaGVscGVyOiBTYXZpbmcgc3RvcmVkIGV2ZW50ICVzICIgJSB0ZW1wZXZlbnQpCisgICAgICAgICAgICAgICAgc2VsZi5zdG9yZV9sb2dfZXZlbnQodGVtcGV2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiYnVpbGRpbmZvaGVscGVyOiBBbGwgZXZlbnRzIHNhdmVkIikKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYmFja2xvZyddCisKKyAgICAgICAgbG9nX2luZm9ybWF0aW9uID0ge30KKyAgICAgICAgbG9nX2luZm9ybWF0aW9uWydidWlsZCddID0gc2VsZi5pbnRlcm5hbF9zdGF0ZVsnYnVpbGQnXQorICAgICAgICBpZiBldmVudC5sZXZlbG5vID09IGZvcm1hdHRlci5FUlJPUjoKKyAgICAgICAgICAgIGxvZ19pbmZvcm1hdGlvblsnbGV2ZWwnXSA9IExvZ01lc3NhZ2UuRVJST1IKKyAgICAgICAgZWxpZiBldmVudC5sZXZlbG5vID09IGZvcm1hdHRlci5XQVJOSU5HOgorICAgICAgICAgICAgbG9nX2luZm9ybWF0aW9uWydsZXZlbCddID0gTG9nTWVzc2FnZS5XQVJOSU5HCisgICAgICAgIGVsaWYgZXZlbnQubGV2ZWxubyA9PSAtMjogICAjIHRvYXN0ZXIgc2VsZi1sb2dnaW5nCisgICAgICAgICAgICBsb2dfaW5mb3JtYXRpb25bJ2xldmVsJ10gPSAtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nX2luZm9ybWF0aW9uWydsZXZlbCddID0gTG9nTWVzc2FnZS5JTkZPCisKKyAgICAgICAgbG9nX2luZm9ybWF0aW9uWydtZXNzYWdlJ10gPSBldmVudC5tc2cKKyAgICAgICAgbG9nX2luZm9ybWF0aW9uWydwYXRobmFtZSddID0gZXZlbnQucGF0aG5hbWUKKyAgICAgICAgbG9nX2luZm9ybWF0aW9uWydsaW5lbm8nXSA9IGV2ZW50LmxpbmVubworICAgICAgICBsb2dnZXIuaW5mbygiTG9nZ2luZyBlcnJvciAyOiAlcyIsIGxvZ19pbmZvcm1hdGlvbikKKyAgICAgICAgc2VsZi5vcm1fd3JhcHBlci5jcmVhdGVfbG9nbWVzc2FnZShsb2dfaW5mb3JtYXRpb24pCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZXJyb3Jjb2RlKToKKyAgICAgICAgaWYgc2VsZi5icmJlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fc3RvcmVfYnVpbGRfZG9uZShlcnJvcmNvZGUpCisKKyAgICAgICAgaWYgJ2JhY2tsb2cnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICBpZiAnYnVpbGQnIGluIHNlbGYuaW50ZXJuYWxfc3RhdGU6CisgICAgICAgICAgICAgICAgIyB3ZSBzYXZlIG1pc3NlZCBldmVudHMgaW4gdGhlIGRhdGFiYXNlIGZvciB0aGUgY3VycmVudCBidWlsZAorICAgICAgICAgICAgICAgIHRlbXBldmVudCA9IHNlbGYuaW50ZXJuYWxfc3RhdGVbJ2JhY2tsb2cnXS5wb3AoKQorICAgICAgICAgICAgICAgIHNlbGYuc3RvcmVfbG9nX2V2ZW50KHRlbXBldmVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIG5vIGJ1aWxkLCBhbmQgd2Ugc3RpbGwgaGF2ZSBldmVudHM7IHNvbWV0aGluZyBhbWF6aW5nbHkgd3JvbmcgaGFwcGVuZAorICAgICAgICAgICAgICAgIGZvciBldmVudCBpbiBzZWxmLmludGVybmFsX3N0YXRlWydiYWNrbG9nJ106CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVU5TQVZFRCBsb2c6ICVzIiwgZXZlbnQubXNnKQorCisgICAgICAgIGlmIG5vdCBjb25uZWN0aW9uLmZlYXR1cmVzLmF1dG9jb21taXRzX3doZW5fYXV0b2NvbW1pdF9pc19vZmY6CisgICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRfYXV0b2NvbW1pdChUcnVlKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2JlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNyBAQAorIworIyBHdGsrIFVJIHBpZWNlcyBmb3IgQml0QmFrZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZGRldGFpbHNwYWdlLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkZGV0YWlsc3BhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZjNjkwZQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZGRldGFpbHNwYWdlLnB5CkBAIC0wLDAgKzEsNDM3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgcGFuZ28KK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgYmIucHJvY2VzcworZnJvbSBiYi51aS5jcnVtYnMucHJvZ3Jlc3NiYXIgaW1wb3J0IEhvYlByb2dyZXNzQmFyCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IGhpYywgSG9iTm90ZWJvb2ssIEhvYkFsdEJ1dHRvbiwgSG9iV2FycENlbGxSZW5kZXJlclRleHQsIEhvYkJ1dHRvbiwgSG9iSW5mb0J1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMucnVubmluZ2J1aWxkIGltcG9ydCBSdW5uaW5nQnVpbGRUcmVlVmlldworZnJvbSBiYi51aS5jcnVtYnMucnVubmluZ2J1aWxkIGltcG9ydCBCdWlsZEZhaWx1cmVUcmVlVmlldworZnJvbSBiYi51aS5jcnVtYnMuaG9icGFnZXMgaW1wb3J0IEhvYlBhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKKworY2xhc3MgQnVpbGRDb25maWd1cmF0aW9uVHJlZVZpZXcoZ3RrLlRyZWVWaWV3KToKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBndGsuVHJlZVZpZXcuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zZXRfcnVsZXNfaGludChGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfaGVhZGVyc192aXNpYmxlKEZhbHNlKQorICAgICAgICBzZWxmLnNldF9wcm9wZXJ0eSgiaG92ZXItZXhwYW5kIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5nZXRfc2VsZWN0aW9uKCkuc2V0X21vZGUoZ3RrLlNFTEVDVElPTl9TSU5HTEUpCisKKyAgICAgICAgIyBUaGUgaWNvbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlJ3JlIGJ1aWxkaW5nIG9yIGZhaWxlZC4KKyAgICAgICAgcmVuZGVyZXIwID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICByZW5kZXJlcjAuc2V0X3Byb3BlcnR5KCdmb250LWRlc2MnLCBwYW5nby5Gb250RGVzY3JpcHRpb24oJ2NvdXJpZXIgYm9sZCAxMicpKQorICAgICAgICBjb2wwID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiTmFtZSIsIHJlbmRlcmVyMCwgdGV4dD0wKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4gKGNvbDApCisKKyAgICAgICAgIyBUaGUgbWVzc2FnZSBvZiBjb25maWd1cmF0aW9uLgorICAgICAgICByZW5kZXJlcjEgPSBIb2JXYXJwQ2VsbFJlbmRlcmVyVGV4dChjb2xfbnVtYmVyPTEpCisgICAgICAgIGNvbDEgPSBndGsuVHJlZVZpZXdDb2x1bW4gKCJWYWx1ZXMiLCByZW5kZXJlcjEsIHRleHQ9MSkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wxKQorCisgICAgZGVmIHNldF92YXJzKHNlbGYsIGtleT0iIiwgdmFyPVsiIl0pOgorICAgICAgICBkID0ge30KKyAgICAgICAgaWYgdHlwZSh2YXIpID09IHN0cjoKKyAgICAgICAgICAgIGQgPSB7a2V5OiBbdmFyXX0KKyAgICAgICAgZWxpZiB0eXBlKHZhcikgPT0gbGlzdCBhbmQgbGVuKHZhcikgPiAxOgorICAgICAgICAgICAgI2NyZWF0ZSB0aGUgc3ViIGl0ZW0gbGluZQorICAgICAgICAgICAgbCA9IFtdCisgICAgICAgICAgICB0ZXh0ID0gIiIKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHZhcjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gIiAtICIgKyBpdGVtCisgICAgICAgICAgICAgICAgbC5hcHBlbmQodGV4dCkKKyAgICAgICAgICAgIGQgPSB7a2V5OiB2YXJ9CisKKyAgICAgICAgcmV0dXJuIGQKKworICAgIGRlZiBzZXRfY29uZmlnX21vZGVsKHNlbGYsIHNob3dfdmFycyk6CisgICAgICAgIGxpc3Rtb2RlbCA9IGd0ay5UcmVlU3RvcmUoZ29iamVjdC5UWVBFX1NUUklORywgZ29iamVjdC5UWVBFX1NUUklORykKKyAgICAgICAgcGFyZW50ID0gTm9uZQorICAgICAgICBmb3IgdmFyIGluIHNob3dfdmFyczoKKyAgICAgICAgICAgIGZvciBzdWJpdGVtIGluIHZhci5pdGVtcygpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBzdWJpdGVtWzBdCisgICAgICAgICAgICAgICAgaXNfcGFyZW50ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBzdWJpdGVtWzFdOgorICAgICAgICAgICAgICAgICAgICBpZiBpc19wYXJlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBsaXN0bW9kZWwuYXBwZW5kKHBhcmVudCwgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BhcmVudCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0bW9kZWwuYXBwZW5kKHBhcmVudCwgKE5vbmUsIHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIgICAgIC0gIgorICAgICAgICAgICAgICAgIHBhcmVudCA9IE5vbmUKKyAgICAgICAgIyByZW5ldyB0aGUgdHJlZSBtb2RlbCBhZnRlciBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gbWVzc2FnZXMKKyAgICAgICAgc2VsZi5zZXRfbW9kZWwobGlzdG1vZGVsKQorCisgICAgZGVmIHNob3coc2VsZiwgc3JjX2NvbmZpZ19pbmZvLCBzcmNfcGFyYW1zKToKKyAgICAgICAgdmFycyA9IFtdCisgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIkJCIHZlcnNpb246Iiwgc3JjX3BhcmFtcy5iYl92ZXJzaW9uKSkKKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiVGFyZ2V0IGFyY2g6Iiwgc3JjX3BhcmFtcy50YXJnZXRfYXJjaCkpCisgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIlRhcmdldCBPUzoiLCBzcmNfcGFyYW1zLnRhcmdldF9vcykpCisgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIk1hY2hpbmU6Iiwgc3JjX2NvbmZpZ19pbmZvLmN1cnJfbWFjaCkpCisgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIkRpc3RybzoiLCBzcmNfY29uZmlnX2luZm8uY3Vycl9kaXN0cm8pKQorICAgICAgICB2YXJzLmFwcGVuZChzZWxmLnNldF92YXJzKCJEaXN0cm8gdmVyc2lvbjoiLCBzcmNfcGFyYW1zLmRpc3Ryb192ZXJzaW9uKSkKKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiU0RLIG1hY2hpbmU6Iiwgc3JjX2NvbmZpZ19pbmZvLmN1cnJfc2RrX21hY2hpbmUpKQorICAgICAgICB2YXJzLmFwcGVuZChzZWxmLnNldF92YXJzKCJUdW5lIGZlYXR1cmVzOiIsIHNyY19wYXJhbXMudHVuZV9wa2dhcmNoKSkKKyAgICAgICAgdmFycy5hcHBlbmQoc2VsZi5zZXRfdmFycygiTGF5ZXJzOiIsIHNyY19jb25maWdfaW5mby5sYXllcnMpKQorCisgICAgICAgIGZvciBwYXRoIGluIHNyY19jb25maWdfaW5mby5sYXllcnM6CisgICAgICAgICAgICBpbXBvcnQgb3MsIG9zLnBhdGgKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgIGJyYW5jaCA9IGJiLnByb2Nlc3MucnVuKCdjZCAlczsgZ2l0IGJyYW5jaCB8IGdyZXAgIl4qICIgfCB0ciAtZCAiKiAiJyAlIHBhdGgpWzBdCisgICAgICAgICAgICAgICAgaWYgYnJhbmNoLnN0YXJ0c3dpdGgoImZhdGFsOiIpOgorICAgICAgICAgICAgICAgICAgICBicmFuY2ggPSAiKHVua25vd24pIgorICAgICAgICAgICAgICAgIGlmIGJyYW5jaDoKKyAgICAgICAgICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoLnN0cmlwKCdcbicpCisgICAgICAgICAgICAgICAgICAgIHZhcnMuYXBwZW5kKHNlbGYuc2V0X3ZhcnMoIkJyYW5jaDoiLCBicmFuY2gpKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgc2VsZi5zZXRfY29uZmlnX21vZGVsKHZhcnMpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X21vZGVsKE5vbmUpCisKKyMKKyMgQnVpbGREZXRhaWxzUGFnZQorIworCitjbGFzcyBCdWlsZERldGFpbHNQYWdlIChIb2JQYWdlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgc3VwZXIoQnVpbGREZXRhaWxzUGFnZSwgc2VsZikuX19pbml0X18oYnVpbGRlciwgIkJ1aWxkaW5nIC4uLiIpCisKKyAgICAgICAgc2VsZi5udW1fb2ZfaXNzdWVzID0gMAorICAgICAgICBzZWxmLmVuZHBhdGggPSAoMCwpCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cworICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cworICAgICAgICBzZWxmLnZib3ggPSBndGsuVkJveChGYWxzZSwgMTIpCisKKyAgICAgICAgc2VsZi5wcm9ncmVzc19ib3ggPSBndGsuVkJveChGYWxzZSwgMTIpCisgICAgICAgIHNlbGYudGFza19zdGF0dXMgPSBndGsuTGFiZWwoIlxuIikgIyB0byBlbnN1cmUgbGF5b3V0IGlzIGNvcnJlY3QKKyAgICAgICAgc2VsZi50YXNrX3N0YXR1cy5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBzZWxmLnByb2dyZXNzX2JveC5wYWNrX3N0YXJ0KHNlbGYudGFza19zdGF0dXMsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19oYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYm94LnBhY2tfZW5kKHNlbGYucHJvZ3Jlc3NfaGJveCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIgPSBIb2JQcm9ncmVzc0JhcigpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfaGJveC5wYWNrX3N0YXJ0KHNlbGYucHJvZ3Jlc3NfYmFyLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJTdG9wIikKKyAgICAgICAgc2VsZi5zdG9wX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5zdG9wX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfaGJveC5wYWNrX2VuZChzZWxmLnN0b3BfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5ub3RlYm9vayA9IEhvYk5vdGVib29rKCkKKyAgICAgICAgc2VsZi5jb25maWdfdHYgPSBCdWlsZENvbmZpZ3VyYXRpb25UcmVlVmlldygpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19jb25maWcgPSBndGsuU2Nyb2xsZWRXaW5kb3cgKCkKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2NvbmZpZy5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfTkVWRVIsIGd0ay5QT0xJQ1lfQUxXQVlTKQorICAgICAgICBzZWxmLnNjcm9sbGVkX3ZpZXdfY29uZmlnLmFkZChzZWxmLmNvbmZpZ190dikKKyAgICAgICAgc2VsZi5ub3RlYm9vay5hcHBlbmRfcGFnZShzZWxmLnNjcm9sbGVkX3ZpZXdfY29uZmlnLCAiQnVpbGQgY29uZmlndXJhdGlvbiIpCisKKyAgICAgICAgc2VsZi5mYWlsdXJlX3R2ID0gQnVpbGRGYWlsdXJlVHJlZVZpZXcoKQorICAgICAgICBzZWxmLmZhaWx1cmVfbW9kZWwgPSBzZWxmLmJ1aWxkZXIuaGFuZGxlci5idWlsZC5tb2RlbC5mYWlsdXJlX21vZGVsKCkKKyAgICAgICAgc2VsZi5mYWlsdXJlX3R2LnNldF9tb2RlbChzZWxmLmZhaWx1cmVfbW9kZWwpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19mYWlsdXJlID0gZ3RrLlNjcm9sbGVkV2luZG93ICgpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19mYWlsdXJlLnNldF9wb2xpY3koZ3RrLlBPTElDWV9ORVZFUiwgZ3RrLlBPTElDWV9BTFdBWVMpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19mYWlsdXJlLmFkZChzZWxmLmZhaWx1cmVfdHYpCisgICAgICAgIHNlbGYubm90ZWJvb2suYXBwZW5kX3BhZ2Uoc2VsZi5zY3JvbGxlZF92aWV3X2ZhaWx1cmUsICJJc3N1ZXMiKQorCisgICAgICAgIHNlbGYuYnVpbGRfdHYgPSBSdW5uaW5nQnVpbGRUcmVlVmlldyhyZWFkb25seT1UcnVlLCBob2I9VHJ1ZSkKKyAgICAgICAgc2VsZi5idWlsZF90di5zZXRfbW9kZWwoc2VsZi5idWlsZGVyLmhhbmRsZXIuYnVpbGQubW9kZWwpCisgICAgICAgIHNlbGYuc2Nyb2xsZWRfdmlld19idWlsZCA9IGd0ay5TY3JvbGxlZFdpbmRvdyAoKQorICAgICAgICBzZWxmLnNjcm9sbGVkX3ZpZXdfYnVpbGQuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLCBndGsuUE9MSUNZX0FMV0FZUykKKyAgICAgICAgc2VsZi5zY3JvbGxlZF92aWV3X2J1aWxkLmFkZChzZWxmLmJ1aWxkX3R2KQorICAgICAgICBzZWxmLm5vdGVib29rLmFwcGVuZF9wYWdlKHNlbGYuc2Nyb2xsZWRfdmlld19idWlsZCwgIkxvZyIpCisKKyAgICAgICAgc2VsZi5idWlsZGVyLmhhbmRsZXIuYnVpbGQubW9kZWwuY29ubmVjdF9hZnRlcigicm93LWNoYW5nZWQiLCBzZWxmLnNjcm9sbF90b19wcmVzZW50X3Jvdywgc2VsZi5zY3JvbGxlZF92aWV3X2J1aWxkLmdldF92YWRqdXN0bWVudCgpLCBzZWxmLmJ1aWxkX3R2KQorCisgICAgICAgIHNlbGYuYnV0dG9uX2JveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorICAgICAgICBzZWxmLmJhY2tfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCcmbHQ7Jmx0OyBCYWNrJykKKyAgICAgICAgc2VsZi5iYWNrX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5iYWNrX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBzZWxmLmJ1dHRvbl9ib3gucGFja19zdGFydChzZWxmLmJhY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICBkZWYgdXBkYXRlX2J1aWxkX3N0YXR1cyhzZWxmLCBjdXJyZW50LCB0b3RhbCwgdGFzayk6CisgICAgICAgIHJlY2lwZV9wYXRoLCByZWNpcGVfdGFzayA9IHRhc2suc3BsaXQoIiwgIikKKyAgICAgICAgcmVjaXBlID0gb3MucGF0aC5iYXNlbmFtZShyZWNpcGVfcGF0aCkucnN0cmlwKCIuYmIiKQorICAgICAgICB0c2tfbXNnID0gIjxiPlJ1bm5pbmcgdGFzayAlcyBvZiAlczo8L2I+ICVzXG48Yj5SZWNpcGU6PC9iPiAlcyIgJSAoY3VycmVudCwgdG90YWwsIHJlY2lwZV90YXNrLCByZWNpcGUpCisgICAgICAgIHNlbGYudGFza19zdGF0dXMuc2V0X21hcmt1cCh0c2tfbXNnKQorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKworICAgIGRlZiByZXNldF9idWlsZF9zdGF0dXMoc2VsZik6CisgICAgICAgIHNlbGYudGFza19zdGF0dXMuc2V0X21hcmt1cCgiXG4iKSAjIHRvIGVuc3VyZSBsYXlvdXQgaXMgY29ycmVjdAorICAgICAgICBzZWxmLmVuZHBhdGggPSAoMCwpCisKKyAgICBkZWYgc2hvd19pc3N1ZXMoc2VsZik6CisgICAgICAgIHNlbGYubnVtX29mX2lzc3VlcyArPSAxCisgICAgICAgIHNlbGYubm90ZWJvb2suc2hvd19pbmRpY2F0b3JfaWNvbigiSXNzdWVzIiwgc2VsZi5udW1fb2ZfaXNzdWVzKQorICAgICAgICBzZWxmLm5vdGVib29rLnF1ZXVlX2RyYXcoKQorCisgICAgZGVmIHJlc2V0X2lzc3VlcyhzZWxmKToKKyAgICAgICAgc2VsZi5udW1fb2ZfaXNzdWVzID0gMAorICAgICAgICBzZWxmLm5vdGVib29rLmhpZGVfaW5kaWNhdG9yX2ljb24oIklzc3VlcyIpCisKKyAgICBkZWYgX3JlbW92ZV9hbGxfd2lkZ2V0KHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IHNlbGYudmJveC5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLnZib3gucmVtb3ZlKGNoaWxkKQorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuYm94X2dyb3VwX2FyZWEuZ2V0X2NoaWxkcmVuKCkgb3IgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5yZW1vdmUoY2hpbGQpCisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLnJlbW92ZShjaGlsZCkKKworICAgIGRlZiBhZGRfYnVpbGRfZmFpbF90b3BfYmFyKHNlbGYsIGFjdGlvbnMsIGxvZ19maWxlPU5vbmUpOgorICAgICAgICBwcmltYXJ5X2FjdGlvbiA9ICJFZGl0ICVzIiAlIGFjdGlvbnMKKworICAgICAgICBjb2xvciA9IEhvYkNvbG9ycy5FUlJPUgorICAgICAgICBidWlsZF9mYWlsX3RvcCA9IGd0ay5FdmVudEJveCgpCisgICAgICAgICNidWlsZF9mYWlsX3RvcC5zZXRfc2l6ZV9yZXF1ZXN0KC0xLCAyMDApCisgICAgICAgIGJ1aWxkX2ZhaWxfdG9wLm1vZGlmeV9iZyhndGsuU1RBVEVfTk9STUFMLCBndGsuZ2RrLmNvbG9yX3BhcnNlKGNvbG9yKSkKKworICAgICAgICBidWlsZF9mYWlsX3RhYiA9IGd0ay5UYWJsZSgxNCwgNDYsIFRydWUpCisgICAgICAgIGJ1aWxkX2ZhaWxfdG9wLmFkZChidWlsZF9mYWlsX3RhYikKKworICAgICAgICBpY29uID0gZ3RrLkltYWdlKCkKKyAgICAgICAgaWNvbl9waXhfYnVmZmVyID0gZ3RrLmdkay5waXhidWZfbmV3X2Zyb21fZmlsZShoaWMuSUNPTl9JTkRJX0VSUk9SX0ZJTEUpCisgICAgICAgIGljb24uc2V0X2Zyb21fcGl4YnVmKGljb25fcGl4X2J1ZmZlcikKKyAgICAgICAgYnVpbGRfZmFpbF90YWIuYXR0YWNoKGljb24sIDEsIDQsIDAsIDYpCisKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBzaXplPSd4LWxhcmdlJz48Yj4lczwvYj48L3NwYW4+IiAlIHNlbGYudGl0bGUpCisgICAgICAgIGJ1aWxkX2ZhaWxfdGFiLmF0dGFjaChsYWJlbCwgNCwgMjYsIDAsIDYpCisKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICAjIEVuc3VyZSB2YXJpYWJsZSBkaXNrX2Z1bGwgaXMgZGVmaW5lZAorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLmJ1aWxkZXIsICdkaXNrX2Z1bGwnKToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5kaXNrX2Z1bGwgPSBGYWxzZQorCisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5kaXNrX2Z1bGw6CisgICAgICAgICAgICBtYXJrdXAgPSAiPHNwYW4gc2l6ZT0nbWVkaXVtJz5UaGVyZSBpcyBubyBkaXNrIHNwYWNlIGxlZnQsIHNvIEhvYiBjYW5ub3QgZmluaXNoIGJ1aWxkaW5nIHlvdXIgaW1hZ2UuIEZyZWUgdXAgc29tZSBkaXNrIHNwYWNlXG4iCisgICAgICAgICAgICBtYXJrdXAgKz0gImFuZCByZXN0YXJ0IHRoZSBidWlsZC4gQ2hlY2sgdGhlIFwiSXNzdWVzXCIgdGFiIGZvciBtb3JlIGRldGFpbHM8L3NwYW4+IgorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cChtYXJrdXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBzaXplPSdtZWRpdW0nPkNoZWNrIHRoZSBcIklzc3Vlc1wiIGluZm9ybWF0aW9uIGZvciBtb3JlIGRldGFpbHM8L3NwYW4+IikKKyAgICAgICAgYnVpbGRfZmFpbF90YWIuYXR0YWNoKGxhYmVsLCA0LCA0MCwgNCwgOSkKKworICAgICAgICAjIGNyZWF0ZSBidXR0b24gJ0VkaXQgcGFja2FnZXMnCisgICAgICAgIGFjdGlvbl9idXR0b24gPSBIb2JCdXR0b24ocHJpbWFyeV9hY3Rpb24pCisgICAgICAgICNhY3Rpb25fYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoLTEsIDQwKQorICAgICAgICBhY3Rpb25fYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkVkaXQgdGhlICVzIHBhcmFtZXRlcnMiICUgYWN0aW9ucykKKyAgICAgICAgYWN0aW9uX2J1dHRvbi5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5mYWlsdXJlX3ByaW1hcnlfYWN0aW9uX2J1dHRvbl9jbGlja2VkX2NiLCBwcmltYXJ5X2FjdGlvbikKKworICAgICAgICBpZiBsb2dfZmlsZToKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiT3BlbiBsb2ciKQorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9IQUxGKQorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIk9wZW4gdGhlIGJ1aWxkJ3MgbG9nIGZpbGUiKQorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLm9wZW5fbG9nX2J1dHRvbl9jbGlja2VkX2NiLCBsb2dfZmlsZSkKKworICAgICAgICBhdHRhY2hfcG9zID0gKDI0IGlmIGxvZ19maWxlIGVsc2UgMTQpCisgICAgICAgIGZpbGVfYnVnX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbignRmlsZSBhIGJ1ZycpCisgICAgICAgIGZpbGVfYnVnX2J1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfSEFMRikKKyAgICAgICAgZmlsZV9idWdfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIk9wZW4gdGhlIFlvY3RvIFByb2plY3QgYnVnIHRyYWNraW5nIHdlYnNpdGUiKQorICAgICAgICBmaWxlX2J1Z19idXR0b24uY29ubmVjdCgnY2xpY2tlZCcsIHNlbGYuZmFpbHVyZV9hY3RpdmF0ZV9maWxlX2J1Z19saW5rX2NiKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1aWxkZXIuZGlza19mdWxsOgorICAgICAgICAgICAgYnVpbGRfZmFpbF90YWIuYXR0YWNoKGFjdGlvbl9idXR0b24sIDQsIDEzLCA5LCAxMikKKyAgICAgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgICAgIGJ1aWxkX2ZhaWxfdGFiLmF0dGFjaChvcGVuX2xvZ19idXR0b24sIDE0LCAyMywgOSwgMTIpCisgICAgICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2goZmlsZV9idWdfYnV0dG9uLCBhdHRhY2hfcG9zLCBhdHRhY2hfcG9zICsgOSwgOSwgMTIpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3RhcnRfYnVpbGQgPSBIb2JCdXR0b24oIlJlc3RhcnQgdGhlIGJ1aWxkIikKKyAgICAgICAgICAgIHJlc3RhcnRfYnVpbGQuc2V0X3Rvb2x0aXBfdGV4dCgiUmVzdGFydCB0aGUgYnVpbGQiKQorICAgICAgICAgICAgcmVzdGFydF9idWlsZC5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5yZXN0YXJ0X2J1aWxkX2J1dHRvbl9jbGlja2VkX2NiKQorCisgICAgICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2gocmVzdGFydF9idWlsZCwgNCwgMTMsIDksIDEyKQorICAgICAgICAgICAgYnVpbGRfZmFpbF90YWIuYXR0YWNoKGFjdGlvbl9idXR0b24sIDE0LCAyMywgOSwgMTIpCisgICAgICAgICAgICBpZiBsb2dfZmlsZToKKyAgICAgICAgICAgICAgICBidWlsZF9mYWlsX3RhYi5hdHRhY2gob3Blbl9sb2dfYnV0dG9uLCBhdHRhY2hfcG9zLCBhdHRhY2hfcG9zICsgOSwgOSwgMTIpCisKKyAgICAgICAgc2VsZi5idWlsZGVyLmRpc2tfZnVsbCA9IEZhbHNlCisgICAgICAgIHJldHVybiBidWlsZF9mYWlsX3RvcAorCisgICAgZGVmIHNob3dfZmFpbF9wYWdlKHNlbGYsIHRpdGxlKToKKyAgICAgICAgc2VsZi5fcmVtb3ZlX2FsbF93aWRnZXQoKQorICAgICAgICBzZWxmLnRpdGxlID0gIkhvYiBjYW5ub3QgYnVpbGQgeW91ciAlcyIgJSB0aXRsZQorCisgICAgICAgIHNlbGYuYnVpbGRfZmFpbF9iYXIgPSBzZWxmLmFkZF9idWlsZF9mYWlsX3RvcF9iYXIodGl0bGUsIHNlbGYuYnVpbGRlci5jdXJyZW50X2xvZ2ZpbGUpCisKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZ3JvdXBfYWxpZ24sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmJ1aWxkX2ZhaWxfYmFyLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLnZib3gsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5ub3RlYm9vaywgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIHNlbGYubm90ZWJvb2suc2V0X3BhZ2UoIklzc3VlcyIpCisgICAgICAgIHNlbGYuYmFja19idXR0b24uaGlkZSgpCisKKyAgICBkZWYgYWRkX2J1aWxkX3N0b3BfdG9wX2JhcihzZWxmLCBhY3Rpb24sIGxvZ19maWxlPU5vbmUpOgorICAgICAgICBjb2xvciA9IEhvYkNvbG9ycy5MSUdIVF9HUkFZCisgICAgICAgIGJ1aWxkX3N0b3BfdG9wID0gZ3RrLkV2ZW50Qm94KCkKKyAgICAgICAgI2J1aWxkX3N0b3BfdG9wLnNldF9zaXplX3JlcXVlc3QoLTEsIDIwMCkKKyAgICAgICAgYnVpbGRfc3RvcF90b3AubW9kaWZ5X2JnKGd0ay5TVEFURV9OT1JNQUwsIGd0ay5nZGsuY29sb3JfcGFyc2UoY29sb3IpKQorICAgICAgICBidWlsZF9zdG9wX3RvcC5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICBidWlsZF9zdG9wX3RvcC5ncmFiX2RlZmF1bHQoKQorCisgICAgICAgIGJ1aWxkX3N0b3BfdGFiID0gZ3RrLlRhYmxlKDExLCA0NiwgVHJ1ZSkKKyAgICAgICAgYnVpbGRfc3RvcF90b3AuYWRkKGJ1aWxkX3N0b3BfdGFiKQorCisgICAgICAgIGljb24gPSBndGsuSW1hZ2UoKQorICAgICAgICBpY29uX3BpeF9idWZmZXIgPSBndGsuZ2RrLnBpeGJ1Zl9uZXdfZnJvbV9maWxlKGhpYy5JQ09OX0lORk9fSE9WRVJfRklMRSkKKyAgICAgICAgaWNvbi5zZXRfZnJvbV9waXhidWYoaWNvbl9waXhfYnVmZmVyKQorICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2goaWNvbiwgMSwgNCwgMCwgNikKKworICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxzcGFuIHNpemU9J3gtbGFyZ2UnPjxiPiVzPC9iPjwvc3Bhbj4iICUgc2VsZi50aXRsZSkKKyAgICAgICAgYnVpbGRfc3RvcF90YWIuYXR0YWNoKGxhYmVsLCA0LCAyNiwgMCwgNikKKworICAgICAgICBhY3Rpb25fYnV0dG9uID0gSG9iQnV0dG9uKCJFZGl0ICVzIiAlIGFjdGlvbikKKyAgICAgICAgYWN0aW9uX2J1dHRvbi5zZXRfc2l6ZV9yZXF1ZXN0KC0xLCA0MCkKKyAgICAgICAgaWYgYWN0aW9uID09ICJpbWFnZSI6CisgICAgICAgICAgICBhY3Rpb25fYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkVkaXQgdGhlIGltYWdlIHBhcmFtZXRlcnMiKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAicmVjaXBlcyI6CisgICAgICAgICAgICBhY3Rpb25fYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkVkaXQgdGhlIGluY2x1ZGVkIHJlY2lwZXMiKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAicGFja2FnZXMiOgorICAgICAgICAgICAgYWN0aW9uX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJFZGl0IHRoZSBpbmNsdWRlZCBwYWNrYWdlcyIpCisgICAgICAgIGFjdGlvbl9idXR0b24uY29ubmVjdCgnY2xpY2tlZCcsIHNlbGYuc3RvcF9wcmltYXJ5X2FjdGlvbl9idXR0b25fY2xpY2tlZF9jYiwgYWN0aW9uKQorICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2goYWN0aW9uX2J1dHRvbiwgNCwgMTMsIDYsIDkpCisKKyAgICAgICAgaWYgbG9nX2ZpbGU6CisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24gPSBIb2JBbHRCdXR0b24oIk9wZW4gbG9nIikKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfSEFMRikKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJPcGVuIHRoZSBidWlsZCdzIGxvZyBmaWxlIikKKyAgICAgICAgICAgIG9wZW5fbG9nX2J1dHRvbi5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5vcGVuX2xvZ19idXR0b25fY2xpY2tlZF9jYiwgbG9nX2ZpbGUpCisgICAgICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2gob3Blbl9sb2dfYnV0dG9uLCAxNCwgMjMsIDYsIDkpCisKKyAgICAgICAgYXR0YWNoX3BvcyA9ICgyNCBpZiBsb2dfZmlsZSBlbHNlIDE0KQorICAgICAgICBidWlsZF9idXR0b24gPSBIb2JBbHRCdXR0b24oIkJ1aWxkIG5ldyBpbWFnZSIpCisgICAgICAgICNidWlsZF9idXR0b24uc2V0X3NpemVfcmVxdWVzdCgtMSwgNDApCisgICAgICAgIGJ1aWxkX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJDcmVhdGUgYSBuZXcgaW1hZ2UgZnJvbSBzY3JhdGNoIikKKyAgICAgICAgYnVpbGRfYnV0dG9uLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLm5ld19pbWFnZV9idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgYnVpbGRfc3RvcF90YWIuYXR0YWNoKGJ1aWxkX2J1dHRvbiwgYXR0YWNoX3BvcywgYXR0YWNoX3BvcyArIDksIDYsIDkpCisKKyAgICAgICAgcmV0dXJuIGJ1aWxkX3N0b3BfdG9wLCBhY3Rpb25fYnV0dG9uCisKKyAgICBkZWYgc2hvd19zdG9wX3BhZ2Uoc2VsZiwgYWN0aW9uKToKKyAgICAgICAgc2VsZi5fcmVtb3ZlX2FsbF93aWRnZXQoKQorICAgICAgICBzZWxmLnRpdGxlID0gIkJ1aWxkIHN0b3BwZWQiCisgICAgICAgIHNlbGYuYnVpbGRfc3RvcF9iYXIsIGFjdGlvbl9idXR0b24gPSBzZWxmLmFkZF9idWlsZF9zdG9wX3RvcF9iYXIoYWN0aW9uLCBzZWxmLmJ1aWxkZXIuY3VycmVudF9sb2dmaWxlKQorCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLmdyb3VwX2FsaWduLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5idWlsZF9zdG9wX2JhciwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi52Ym94LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYubm90ZWJvb2ssIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorICAgICAgICBzZWxmLmJhY2tfYnV0dG9uLmhpZGUoKQorICAgICAgICByZXR1cm4gYWN0aW9uX2J1dHRvbgorCisgICAgZGVmIHNob3dfcGFnZShzZWxmLCBzdGVwKToKKyAgICAgICAgc2VsZi5fcmVtb3ZlX2FsbF93aWRnZXQoKQorICAgICAgICBpZiBzdGVwID09IHNlbGYuYnVpbGRlci5QQUNLQUdFX0dFTkVSQVRJTkcgb3Igc3RlcCA9PSBzZWxmLmJ1aWxkZXIuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgc2VsZi50aXRsZSA9ICJCdWlsZGluZyBwYWNrYWdlcyAuLi4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRpdGxlID0gIkJ1aWxkaW5nIGltYWdlIC4uLiIKKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3RvcCA9IHNlbGYuYWRkX29udG9fdG9wX2JhcihOb25lKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5idWlsZF9kZXRhaWxzX3RvcCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ncm91cF9hbGlnbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi52Ym94LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5jb25maWdfdHYucmVzZXQoKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLnByb2dyZXNzX2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYubm90ZWJvb2ssIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX2VuZChzZWxmLmJ1dHRvbl9ib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIHNlbGYubm90ZWJvb2suc2V0X3BhZ2UoIkxvZyIpCisgICAgICAgIHNlbGYuYmFja19idXR0b24uaGlkZSgpCisKKyAgICAgICAgc2VsZi5yZXNldF9idWlsZF9zdGF0dXMoKQorICAgICAgICBzZWxmLnJlc2V0X2lzc3VlcygpCisKKyAgICBkZWYgdXBkYXRlX3Byb2dyZXNzX2JhcihzZWxmLCB0aXRsZSwgZnJhY3Rpb24sIHN0YXR1cz1Ob25lKToKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIudXBkYXRlKGZyYWN0aW9uKQorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRfdGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF9yY3N0eWxlKHN0YXR1cykKKworICAgIGRlZiBiYWNrX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2NvbmZpZ3VyYXRpb24oKQorCisgICAgZGVmIG5ld19pbWFnZV9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIucmVzZXQoKQorCisgICAgZGVmIHNob3dfYmFja19idXR0b24oc2VsZik6CisgICAgICAgIHNlbGYuYmFja19idXR0b24uc2hvdygpCisKKyAgICBkZWYgc3RvcF9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIuc3RvcF9idWlsZCgpCisKKyAgICBkZWYgaGlkZV9zdG9wX2J1dHRvbihzZWxmKToKKyAgICAgICAgc2VsZi5zdG9wX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICBzZWxmLnN0b3BfYnV0dG9uLmhpZGUoKQorCisgICAgZGVmIHNjcm9sbF90b19wcmVzZW50X3JvdyhzZWxmLCBtb2RlbCwgcGF0aCwgaXRlciwgdl9hZGosIHRyZWV2aWV3KToKKyAgICAgICAgaWYgdHJlZXZpZXcgYW5kIHZfYWRqOgorICAgICAgICAgICAgaWYgcGF0aFswXSA+IHNlbGYuZW5kcGF0aFswXTogIyBjaGVjayB0aGUgZXZlbnQgaXMgYSBuZXcgcm93IGFwcGVuZCBvciBub3QKKyAgICAgICAgICAgICAgICBzZWxmLmVuZHBhdGggPSBwYXRoCisgICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgZ3RrLmFkanVzdG1lbnQgcG9zaXRpb24gaXMgYXQgZW5kIGJvdW5kYXJ5IG9yIG5vdAorICAgICAgICAgICAgICAgIGlmICh2X2Fkai51cHBlciA8PSB2X2Fkai5wYWdlX3NpemUpIG9yICh2X2Fkai52YWx1ZSA9PSB2X2Fkai51cHBlciAtIHZfYWRqLnBhZ2Vfc2l6ZSk6CisgICAgICAgICAgICAgICAgICAgIHRyZWV2aWV3LnNjcm9sbF90b19jZWxsKHBhdGgpCisKKyAgICBkZWYgc2hvd19jb25maWd1cmF0aW9ucyhzZWxmLCBjb25maWd1cmF0aW9ucywgcGFyYW1zKToKKyAgICAgICAgc2VsZi5jb25maWdfdHYuc2hvdyhjb25maWd1cmF0aW9ucywgcGFyYW1zKQorCisgICAgZGVmIGZhaWx1cmVfcHJpbWFyeV9hY3Rpb25fYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uLCBhY3Rpb24pOgorICAgICAgICBpZiAiRWRpdCByZWNpcGVzIiBpbiBhY3Rpb246CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19yZWNpcGVzKCkKKyAgICAgICAgZWxpZiAiRWRpdCBwYWNrYWdlcyIgaW4gYWN0aW9uOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfcGFja2FnZXMoKQorICAgICAgICBlbGlmICJFZGl0IGltYWdlIiBpbiBhY3Rpb246CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19jb25maWd1cmF0aW9uKCkKKworICAgIGRlZiByZXN0YXJ0X2J1aWxkX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5qdXN0X2Jha2UoKQorCisgICAgZGVmIHN0b3BfcHJpbWFyeV9hY3Rpb25fYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uLCBhY3Rpb24pOgorICAgICAgICBpZiAicmVjaXBlcyIgaW4gYWN0aW9uOgorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfcmVjaXBlcygpCisgICAgICAgIGVsaWYgInBhY2thZ2VzIiBpbiBhY3Rpb246CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19wYWNrYWdlcygpCisgICAgICAgIGVsaWYgImltYWdlIiBpbiBhY3Rpb246CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19jb25maWd1cmF0aW9uKCkKKworICAgIGRlZiBvcGVuX2xvZ19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24sIGxvZ19maWxlKToKKyAgICAgICAgaWYgbG9nX2ZpbGU6CisgICAgICAgICAgICBsb2dfZmlsZSA9ICJmaWxlOi8vLyIgKyBsb2dfZmlsZQorICAgICAgICAgICAgZ3RrLnNob3dfdXJpKHNjcmVlbj1idXR0b24uZ2V0X3NjcmVlbigpLCB1cmk9bG9nX2ZpbGUsIHRpbWVzdGFtcD0wKQorCisgICAgZGVmIGZhaWx1cmVfYWN0aXZhdGVfZmlsZV9idWdfbGlua19jYihzZWxmLCBidXR0b24pOgorICAgICAgICBidXR0b24uY2hpbGQuZW1pdCgnYWN0aXZhdGUtbGluaycsICJodHRwOi8vYnVnemlsbGEueW9jdG9wcm9qZWN0Lm9yZyIpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvYnVpbGRlci5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRjYzQxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvYnVpbGRlci5weQpAQCAtMCwwICsxLDE0NzUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGdsaWIKK2ltcG9ydCBndGssIGdvYmplY3QKK2ltcG9ydCBjb3B5CitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc2hsZXgKK2ltcG9ydCByZQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCB0aW1lCitmcm9tIGJiLnVpLmNydW1icy5pbWFnZWNvbmZpZ3VyYXRpb25wYWdlIGltcG9ydCBJbWFnZUNvbmZpZ3VyYXRpb25QYWdlCitmcm9tIGJiLnVpLmNydW1icy5yZWNpcGVzZWxlY3Rpb25wYWdlIGltcG9ydCBSZWNpcGVTZWxlY3Rpb25QYWdlCitmcm9tIGJiLnVpLmNydW1icy5wYWNrYWdlc2VsZWN0aW9ucGFnZSBpbXBvcnQgUGFja2FnZVNlbGVjdGlvblBhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLmJ1aWxkZGV0YWlsc3BhZ2UgaW1wb3J0IEJ1aWxkRGV0YWlsc1BhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLmltYWdlZGV0YWlsc3BhZ2UgaW1wb3J0IEltYWdlRGV0YWlsc1BhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLnNhbml0eWNoZWNrcGFnZSBpbXBvcnQgU2FuaXR5Q2hlY2tQYWdlCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IGh3YywgSG9iQnV0dG9uLCBIb2JBbHRCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLnBlcnNpc3RlbnR0b29sdGlwIGltcG9ydCBQZXJzaXN0ZW50VG9vbHRpcAoraW1wb3J0IGJiLnVpLmNydW1icy51dGlscworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic21lc3NhZ2VkaWFsb2cgaW1wb3J0IENydW1ic01lc3NhZ2VEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5zaW1wbGVzZXR0aW5nc2RpYWxvZyBpbXBvcnQgU2ltcGxlU2V0dGluZ3NEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5hZHZhbmNlZHNldHRpbmdzZGlhbG9nIGltcG9ydCBBZHZhbmNlZFNldHRpbmdzRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuZGVwbG95aW1hZ2VkaWFsb2cgaW1wb3J0IERlcGxveUltYWdlRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcubGF5ZXJzZWxlY3Rpb25kaWFsb2cgaW1wb3J0IExheWVyU2VsZWN0aW9uRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuaW1hZ2VzZWxlY3Rpb25kaWFsb2cgaW1wb3J0IEltYWdlU2VsZWN0aW9uRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcucGFyc2luZ3dhcm5pbmdzZGlhbG9nIGltcG9ydCBQYXJzaW5nV2FybmluZ3NEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5wcm9wZXJ0eWRpYWxvZyBpbXBvcnQgUHJvcGVydHlEaWFsb2cKKworaG9iVmVyID0gMjAxMjA4MDgKKworY2xhc3MgQ29uZmlndXJhdGlvbjoKKyAgICAnJydSZXByZXNlbnRzIHRoZSBkYXRhIHN0cnVjdHVyZSBvZiBjb25maWd1cmF0aW9uLicnJworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHBhcnNlX3Byb3h5X3N0cmluZyhjbHMsIHByb3h5KToKKyAgICAgICAgcGF0dGVybiA9ICJeXHMqKChodHRwfGh0dHBzfGZ0cHxzb2Nrc3xjdnMpOi8vKT8oKFxTKyk6KFxTKylAKT8oW15cczpdKykoOihcZCspKT8vPyIKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2gocGF0dGVybiwgcHJveHkpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDIpLCBtYXRjaC5ncm91cCg0KSwgbWF0Y2guZ3JvdXAoNSksIG1hdGNoLmdyb3VwKDYpLCBtYXRjaC5ncm91cCg4KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUsICIiLCAiIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG1ha2VfaG9zdF9zdHJpbmcoY2xzLCBwcm90LCB1c2VyLCBwYXNzd2QsIGhvc3QsIGRlZmF1bHRfcHJvdD0iIik6CisgICAgICAgIGlmIGhvc3QgPT0gTm9uZSBvciBob3N0ID09ICIiOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICAgICAgcGFzc3dkID0gcGFzc3dkIG9yICIiCisKKyAgICAgICAgaWYgdXNlciAhPSBOb25lIGFuZCB1c2VyICE9ICIiOgorICAgICAgICAgICAgaWYgcHJvdCA9PSBOb25lIG9yIHByb3QgPT0gIiI6CisgICAgICAgICAgICAgICAgcHJvdCA9IGRlZmF1bHRfcHJvdAorICAgICAgICAgICAgcmV0dXJuIHByb3QgKyAiOi8vIiArIHVzZXIgKyAiOiIgKyBwYXNzd2QgKyAiQCIgKyBob3N0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwcm90ID09IE5vbmUgb3IgcHJvdCA9PSAiIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gaG9zdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdCArICI6Ly8iICsgaG9zdAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG1ha2VfcG9ydF9zdHJpbmcoY2xzLCBwb3J0KToKKyAgICAgICAgcG9ydCA9IHBvcnQgb3IgIiIKKyAgICAgICAgcmV0dXJuIHBvcnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBtYWtlX3Byb3h5X3N0cmluZyhjbHMsIHByb3QsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGVmYXVsdF9wcm90PSIiKToKKyAgICAgICAgaWYgaG9zdCA9PSBOb25lIG9yIGhvc3QgPT0gIiI6IyBvciBwb3J0ID09IE5vbmUgb3IgcG9ydCA9PSAiIjoKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uLm1ha2VfaG9zdF9zdHJpbmcocHJvdCwgdXNlciwgcGFzc3dkLCBob3N0LCBkZWZhdWx0X3Byb3QpICsgKCI6IiArIENvbmZpZ3VyYXRpb24ubWFrZV9wb3J0X3N0cmluZyhwb3J0KSBpZiBwb3J0IGVsc2UgIiIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3Vycl9tYWNoID0gIiIKKyAgICAgICAgc2VsZi5zZWxlY3RlZF9pbWFnZSA9IE5vbmUKKyAgICAgICAgIyBzZXR0aW5ncworICAgICAgICBzZWxmLmN1cnJfZGlzdHJvID0gIiIKKyAgICAgICAgc2VsZi5kbGRpciA9IHNlbGYuc3N0YXRlZGlyID0gc2VsZi5zc3RhdGVtaXJyb3IgPSAiIgorICAgICAgICBzZWxmLnBtYWtlID0gc2VsZi5iYnRocmVhZCA9IDAKKyAgICAgICAgc2VsZi5jdXJyX3BhY2thZ2VfZm9ybWF0ID0gIiIKKyAgICAgICAgc2VsZi5pbWFnZV9yb290ZnNfc2l6ZSA9IHNlbGYuaW1hZ2VfZXh0cmFfc2l6ZSA9IDAKKyAgICAgICAgc2VsZi5pbWFnZV9vdmVyaGVhZF9mYWN0b3IgPSAxCisgICAgICAgIHNlbGYuaW5jb21wYXRfbGljZW5zZSA9ICIiCisgICAgICAgIHNlbGYuY3Vycl9zZGtfbWFjaGluZSA9ICIiCisgICAgICAgIHNlbGYuY29uZl92ZXJzaW9uID0gc2VsZi5sY29uZl92ZXJzaW9uID0gIiIKKyAgICAgICAgc2VsZi5leHRyYV9zZXR0aW5nID0ge30KKyAgICAgICAgc2VsZi50b29sY2hhaW5fYnVpbGQgPSBGYWxzZQorICAgICAgICBzZWxmLmltYWdlX2ZzdHlwZXMgPSAiIgorICAgICAgICBzZWxmLmltYWdlX3NpemUgPSBOb25lCisgICAgICAgIHNlbGYuaW1hZ2VfcGFja2FnZXMgPSBbXQorICAgICAgICAjIGJibGF5ZXJzLmNvbmYKKyAgICAgICAgc2VsZi5sYXllcnMgPSBbXQorICAgICAgICAjIGltYWdlL3JlY2lwZXMvcGFja2FnZXMKKyAgICAgICAgc2VsZi5jbGVhcl9zZWxlY3Rpb24oKQorCisgICAgICAgIHNlbGYudXNlcl9zZWxlY3RlZF9wYWNrYWdlcyA9IFtdCisKKyAgICAgICAgc2VsZi5kZWZhdWx0X3Rhc2sgPSAiYnVpbGQiCisKKyAgICAgICAgIyBwcm94eSBzZXR0aW5ncworICAgICAgICBzZWxmLmVuYWJsZV9wcm94eSA9IE5vbmUKKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm94aWVzID0geworICAgICAgICAgICAgImh0dHAiICA6IFtOb25lLCBOb25lLCBOb25lLCAiIiwgIiJdLCAgIyBwcm90b2NvbCA6IFtwcm90LCB1c2VyLCBwYXNzd2QsIGhvc3QsIHBvcnRdCisgICAgICAgICAgICAiaHR0cHMiIDogW05vbmUsIE5vbmUsIE5vbmUsICIiLCAiIl0sCisgICAgICAgICAgICAiZnRwIiAgIDogW05vbmUsIE5vbmUsIE5vbmUsICIiLCAiIl0sCisgICAgICAgICAgICAic29ja3MiIDogW05vbmUsIE5vbmUsIE5vbmUsICIiLCAiIl0sCisgICAgICAgICAgICAiY3ZzIiAgIDogW05vbmUsIE5vbmUsIE5vbmUsICIiLCAiIl0sCisgICAgICAgIH0KKworICAgIGRlZiBjbGVhcl9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuc2VsZWN0ZWRfcmVjaXBlcyA9IFtdCisgICAgICAgIHNlbGYuc2VsZWN0ZWRfcGFja2FnZXMgPSBbXQorICAgICAgICBzZWxmLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UgPSBOb25lCisgICAgICAgIHNlbGYuaW5pdGlhbF9zZWxlY3RlZF9wYWNrYWdlcyA9IFtdCisgICAgICAgIHNlbGYuaW5pdGlhbF91c2VyX3NlbGVjdGVkX3BhY2thZ2VzID0gW10KKworICAgIGRlZiBzcGxpdF9wcm94eShzZWxmLCBwcm90b2NvbCwgcHJveHkpOgorICAgICAgICBlbnRyeSA9IFtdCisgICAgICAgIHByb3QsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCA9IENvbmZpZ3VyYXRpb24ucGFyc2VfcHJveHlfc3RyaW5nKHByb3h5KQorICAgICAgICBlbnRyeS5hcHBlbmQocHJvdCkKKyAgICAgICAgZW50cnkuYXBwZW5kKHVzZXIpCisgICAgICAgIGVudHJ5LmFwcGVuZChwYXNzd2QpCisgICAgICAgIGVudHJ5LmFwcGVuZChob3N0KQorICAgICAgICBlbnRyeS5hcHBlbmQocG9ydCkKKyAgICAgICAgc2VsZi5wcm94aWVzW3Byb3RvY29sXSA9IGVudHJ5CisKKyAgICBkZWYgY29tYmluZV9wcm94eShzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIGVudHJ5ID0gc2VsZi5wcm94aWVzW3Byb3RvY29sXQorICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbi5tYWtlX3Byb3h5X3N0cmluZyhlbnRyeVswXSwgZW50cnlbMV0sIGVudHJ5WzJdLCBlbnRyeVszXSwgZW50cnlbNF0sIHByb3RvY29sKQorCisgICAgZGVmIGNvbWJpbmVfaG9zdF9vbmx5KHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgZW50cnkgPSBzZWxmLnByb3hpZXNbcHJvdG9jb2xdCisgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uLm1ha2VfaG9zdF9zdHJpbmcoZW50cnlbMF0sIGVudHJ5WzFdLCBlbnRyeVsyXSwgZW50cnlbM10sIHByb3RvY29sKQorCisgICAgZGVmIGNvbWJpbmVfcG9ydF9vbmx5KHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgZW50cnkgPSBzZWxmLnByb3hpZXNbcHJvdG9jb2xdCisgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uLm1ha2VfcG9ydF9zdHJpbmcoZW50cnlbNF0pCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBhcmFtcyk6CisgICAgICAgICMgc2V0dGluZ3MKKyAgICAgICAgc2VsZi5jdXJyX2Rpc3RybyA9IHBhcmFtc1siZGlzdHJvIl0KKyAgICAgICAgc2VsZi5kbGRpciA9IHBhcmFtc1siZGxkaXIiXQorICAgICAgICBzZWxmLnNzdGF0ZWRpciA9IHBhcmFtc1sic3N0YXRlZGlyIl0KKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3IgPSBwYXJhbXNbInNzdGF0ZW1pcnJvciJdCisgICAgICAgIHNlbGYucG1ha2UgPSBpbnQocGFyYW1zWyJwbWFrZSJdLnNwbGl0KClbMV0pCisgICAgICAgIHNlbGYuYmJ0aHJlYWQgPSBwYXJhbXNbImJidGhyZWFkIl0KKyAgICAgICAgc2VsZi5jdXJyX3BhY2thZ2VfZm9ybWF0ID0gIiAiLmpvaW4ocGFyYW1zWyJwY2xhc3MiXS5zcGxpdCgicGFja2FnZV8iKSkuc3RyaXAoKQorICAgICAgICBzZWxmLmltYWdlX3Jvb3Rmc19zaXplID0gcGFyYW1zWyJpbWFnZV9yb290ZnNfc2l6ZSJdCisgICAgICAgIHNlbGYuaW1hZ2VfZXh0cmFfc2l6ZSA9IHBhcmFtc1siaW1hZ2VfZXh0cmFfc2l6ZSJdCisgICAgICAgIHNlbGYuaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yID0gcGFyYW1zWydpbWFnZV9vdmVyaGVhZF9mYWN0b3InXQorICAgICAgICBzZWxmLmluY29tcGF0X2xpY2Vuc2UgPSBwYXJhbXNbImluY29tcGF0X2xpY2Vuc2UiXQorICAgICAgICBzZWxmLmN1cnJfc2RrX21hY2hpbmUgPSBwYXJhbXNbInNka19tYWNoaW5lIl0KKyAgICAgICAgc2VsZi5jb25mX3ZlcnNpb24gPSBwYXJhbXNbImNvbmZfdmVyc2lvbiJdCisgICAgICAgIHNlbGYubGNvbmZfdmVyc2lvbiA9IHBhcmFtc1sibGNvbmZfdmVyc2lvbiJdCisgICAgICAgIHNlbGYuaW1hZ2VfZnN0eXBlcyA9IHBhcmFtc1siaW1hZ2VfZnN0eXBlcyJdCisgICAgICAgICMgc2VsZi5leHRyYV9zZXR0aW5nL3NlbGYudG9vbGNoYWluX2J1aWxkCisgICAgICAgICMgYmJsYXllcnMuY29uZgorICAgICAgICBzZWxmLmxheWVycyA9IHBhcmFtc1sibGF5ZXIiXS5zcGxpdCgpCisgICAgICAgIHNlbGYubGF5ZXJzX25vbl9yZW1vdmFibGUgPSBwYXJhbXNbImxheWVyc19ub25fcmVtb3ZhYmxlIl0uc3BsaXQoKQorICAgICAgICBzZWxmLmRlZmF1bHRfdGFzayA9IHBhcmFtc1siZGVmYXVsdF90YXNrIl0KKworICAgICAgICAjIHByb3h5IHNldHRpbmdzCisgICAgICAgIHNlbGYuZW5hYmxlX3Byb3h5ID0gcGFyYW1zWyJodHRwX3Byb3h5Il0gIT0gIiIgb3IgcGFyYW1zWyJodHRwc19wcm94eSJdICE9ICIiIFwKKyAgICAgICAgICAgIG9yIHBhcmFtc1siZnRwX3Byb3h5Il0gIT0gIiIgb3IgcGFyYW1zWyJzb2Nrc19wcm94eSJdICE9ICIiIFwKKyAgICAgICAgICAgIG9yIHBhcmFtc1siY3ZzX3Byb3h5X2hvc3QiXSAhPSAiIiBvciBwYXJhbXNbImN2c19wcm94eV9wb3J0Il0gIT0gIiIKKyAgICAgICAgc2VsZi5zcGxpdF9wcm94eSgiaHR0cCIsIHBhcmFtc1siaHR0cF9wcm94eSJdKQorICAgICAgICBzZWxmLnNwbGl0X3Byb3h5KCJodHRwcyIsIHBhcmFtc1siaHR0cHNfcHJveHkiXSkKKyAgICAgICAgc2VsZi5zcGxpdF9wcm94eSgiZnRwIiwgcGFyYW1zWyJmdHBfcHJveHkiXSkKKyAgICAgICAgc2VsZi5zcGxpdF9wcm94eSgic29ja3MiLCBwYXJhbXNbInNvY2tzX3Byb3h5Il0pCisgICAgICAgIHNlbGYuc3BsaXRfcHJveHkoImN2cyIsIHBhcmFtc1siY3ZzX3Byb3h5X2hvc3QiXSArICI6IiArIHBhcmFtc1siY3ZzX3Byb3h5X3BvcnQiXSkKKworICAgIGRlZiBzYXZlKHNlbGYsIGhhbmRsZXIsIGRlZmF1bHRzPUZhbHNlKToKKyAgICAgICAgIyBiYmxheWVycy5jb25mCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJCQkxBWUVSUyIsIHNlbGYubGF5ZXJzLCAiYmJsYXllcnMuY29uZiIpCisgICAgICAgICMgbG9jYWwuY29uZgorICAgICAgICBpZiBub3QgZGVmYXVsdHM6CisgICAgICAgICAgICBoYW5kbGVyLmVhcmx5X2Fzc2lnbl92YXJfaW5fZmlsZSgiTUFDSElORSIsIHNlbGYuY3Vycl9tYWNoLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJESVNUUk8iLCBzZWxmLmN1cnJfZGlzdHJvLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJETF9ESVIiLCBzZWxmLmRsZGlyLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJTU1RBVEVfRElSIiwgc2VsZi5zc3RhdGVkaXIsICJsb2NhbC5jb25mIikKKyAgICAgICAgc3N0YXRlX21pcnJvcl9saXN0ID0gc2VsZi5zc3RhdGVtaXJyb3Iuc3BsaXQoIlxcbiAiKQorICAgICAgICBzc3RhdGVfbWlycm9yX2xpc3RfbW9kaWZpZWQgPSBbXQorICAgICAgICBmb3IgbWlycm9yIGluIHNzdGF0ZV9taXJyb3JfbGlzdDoKKyAgICAgICAgICAgIGlmIG1pcnJvciAhPSAiIjoKKyAgICAgICAgICAgICAgICBtaXJyb3IgPSBtaXJyb3IgKyAiXFxuIgorICAgICAgICAgICAgICAgIHNzdGF0ZV9taXJyb3JfbGlzdF9tb2RpZmllZC5hcHBlbmQobWlycm9yKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiU1NUQVRFX01JUlJPUlMiLCBzc3RhdGVfbWlycm9yX2xpc3RfbW9kaWZpZWQsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIlBBUkFMTEVMX01BS0UiLCAiLWogJXMiICUgc2VsZi5wbWFrZSwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiQkJfTlVNQkVSX1RIUkVBRFMiLCBzZWxmLmJidGhyZWFkLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJQQUNLQUdFX0NMQVNTRVMiLCAiICIuam9pbihbInBhY2thZ2VfIiArIGkgZm9yIGkgaW4gc2VsZi5jdXJyX3BhY2thZ2VfZm9ybWF0LnNwbGl0KCldKSwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiSU1BR0VfUk9PVEZTX1NJWkUiLCBzZWxmLmltYWdlX3Jvb3Rmc19zaXplLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJJTUFHRV9FWFRSQV9TUEFDRSIsIHNlbGYuaW1hZ2VfZXh0cmFfc2l6ZSwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiSU5DT01QQVRJQkxFX0xJQ0VOU0UiLCBzZWxmLmluY29tcGF0X2xpY2Vuc2UsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIlNES01BQ0hJTkUiLCBzZWxmLmN1cnJfc2RrX21hY2hpbmUsICJsb2NhbC5jb25mIikKKyAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkNPTkZfVkVSU0lPTiIsIHNlbGYuY29uZl92ZXJzaW9uLCAibG9jYWwuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJMQ09ORl9WRVJTSU9OIiwgc2VsZi5sY29uZl92ZXJzaW9uLCAiYmJsYXllcnMuY29uZiIpCisgICAgICAgIGhhbmRsZXIuc2V0X2V4dHJhX2NvbmZpZyhzZWxmLmV4dHJhX3NldHRpbmcpCisgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJUT09MQ0hBSU5fQlVJTEQiLCBzZWxmLnRvb2xjaGFpbl9idWlsZCwgImxvY2FsLmNvbmYiKQorICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiSU1BR0VfRlNUWVBFUyIsIHNlbGYuaW1hZ2VfZnN0eXBlcywgImxvY2FsLmNvbmYiKQorICAgICAgICBpZiBub3QgZGVmYXVsdHM6CisgICAgICAgICAgICAjIGltYWdlL3JlY2lwZXMvcGFja2FnZXMKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJfX1NFTEVDVEVEX0lNQUdFX18iLCBzZWxmLnNlbGVjdGVkX2ltYWdlLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiREVQRU5EUyIsIHNlbGYuc2VsZWN0ZWRfcmVjaXBlcywgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIklNQUdFX0lOU1RBTEwiLCBzZWxmLnVzZXJfc2VsZWN0ZWRfcGFja2FnZXMsICJsb2NhbC5jb25mIikKKyAgICAgICAgIyBwcm94eQorICAgICAgICBpZiBzZWxmLmVuYWJsZV9wcm94eSA9PSBUcnVlOgorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoImh0dHBfcHJveHkiLCBzZWxmLmNvbWJpbmVfcHJveHkoImh0dHAiKSwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoImh0dHBzX3Byb3h5Iiwgc2VsZi5jb21iaW5lX3Byb3h5KCJodHRwcyIpLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiZnRwX3Byb3h5Iiwgc2VsZi5jb21iaW5lX3Byb3h5KCJmdHAiKSwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoImFsbF9wcm94eSIsIHNlbGYuY29tYmluZV9wcm94eSgic29ja3MiKSwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoIkNWU19QUk9YWV9IT1NUIiwgc2VsZi5jb21iaW5lX2hvc3Rfb25seSgiY3ZzIiksICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJDVlNfUFJPWFlfUE9SVCIsIHNlbGYuY29tYmluZV9wb3J0X29ubHkoImN2cyIpLCAibG9jYWwuY29uZiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiaHR0cF9wcm94eSIsICIiLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiaHR0cHNfcHJveHkiLCAiIiwgImxvY2FsLmNvbmYiKQorICAgICAgICAgICAgaGFuZGxlci5zZXRfdmFyX2luX2ZpbGUoImZ0cF9wcm94eSIsICIiLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiYWxsX3Byb3h5IiwgIiIsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0X3Zhcl9pbl9maWxlKCJDVlNfUFJPWFlfSE9TVCIsICIiLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICBoYW5kbGVyLnNldF92YXJfaW5fZmlsZSgiQ1ZTX1BST1hZX1BPUlQiLCAiIiwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHMgPSAiVkVSU0lPTjogJyVzJywgQkJMQVlFUlM6ICclcycsIE1BQ0hJTkU6ICclcycsIERJU1RSTzogJyVzJywgRExfRElSOiAnJXMnLCIgJSBcCisgICAgICAgICAgICAoaG9iVmVyLCAiICIuam9pbihzZWxmLmxheWVycyksIHNlbGYuY3Vycl9tYWNoLCBzZWxmLmN1cnJfZGlzdHJvLCBzZWxmLmRsZGlyICkKKyAgICAgICAgcyArPSAiU1NUQVRFX0RJUjogJyVzJywgU1NUQVRFX01JUlJPUjogJyVzJywgUEFSQUxMRUxfTUFLRTogJy1qICVzJywgQkJfTlVNQkVSX1RIUkVBRFM6ICclcycsIFBBQ0tBR0VfQ0xBU1NFUzogJyVzJywgIiAlIFwKKyAgICAgICAgICAgIChzZWxmLnNzdGF0ZWRpciwgc2VsZi5zc3RhdGVtaXJyb3IsIHNlbGYucG1ha2UsIHNlbGYuYmJ0aHJlYWQsICIgIi5qb2luKFsicGFja2FnZV8iICsgaSBmb3IgaSBpbiBzZWxmLmN1cnJfcGFja2FnZV9mb3JtYXQuc3BsaXQoKV0pKQorICAgICAgICBzICs9ICJJTUFHRV9ST09URlNfU0laRTogJyVzJywgSU1BR0VfRVhUUkFfU1BBQ0U6ICclcycsIElOQ09NUEFUSUJMRV9MSUNFTlNFOiAnJXMnLCBTREtNQUNISU5FOiAnJXMnLCBDT05GX1ZFUlNJT046ICclcycsICIgJSBcCisgICAgICAgICAgICAoc2VsZi5pbWFnZV9yb290ZnNfc2l6ZSwgc2VsZi5pbWFnZV9leHRyYV9zaXplLCBzZWxmLmluY29tcGF0X2xpY2Vuc2UsIHNlbGYuY3Vycl9zZGtfbWFjaGluZSwgc2VsZi5jb25mX3ZlcnNpb24pCisgICAgICAgIHMgKz0gIkxDT05GX1ZFUlNJT046ICclcycsIEVYVFJBX1NFVFRJTkc6ICclcycsIFRPT0xDSEFJTl9CVUlMRDogJyVzJywgSU1BR0VfRlNUWVBFUzogJyVzJywgX19TRUxFQ1RFRF9JTUFHRV9fOiAnJXMnLCAiICUgXAorICAgICAgICAgICAgKHNlbGYubGNvbmZfdmVyc2lvbiwgc2VsZi5leHRyYV9zZXR0aW5nLCBzZWxmLnRvb2xjaGFpbl9idWlsZCwgc2VsZi5pbWFnZV9mc3R5cGVzLCBzZWxmLnNlbGVjdGVkX2ltYWdlKQorICAgICAgICBzICs9ICJERVBFTkRTOiAnJXMnLCBJTUFHRV9JTlNUQUxMOiAnJXMnLCBlbmFibGVfcHJveHk6ICclcycsIHVzZV9zYW1lX3Byb3h5OiAnJXMnLCBodHRwX3Byb3h5OiAnJXMnLCAiICUgXAorICAgICAgICAgICAgKHNlbGYuc2VsZWN0ZWRfcmVjaXBlcywgc2VsZi51c2VyX3NlbGVjdGVkX3BhY2thZ2VzLCBzZWxmLmVuYWJsZV9wcm94eSwgc2VsZi5zYW1lX3Byb3h5LCBzZWxmLmNvbWJpbmVfcHJveHkoImh0dHAiKSkKKyAgICAgICAgcyArPSAiaHR0cHNfcHJveHk6ICclcycsIGZ0cF9wcm94eTogJyVzJywgYWxsX3Byb3h5OiAnJXMnLCBDVlNfUFJPWFlfSE9TVDogJyVzJywgQ1ZTX1BST1hZX1BPUlQ6ICclcyciICUgXAorICAgICAgICAgICAgKHNlbGYuY29tYmluZV9wcm94eSgiaHR0cHMiKSwgc2VsZi5jb21iaW5lX3Byb3h5KCJmdHAiKSwgc2VsZi5jb21iaW5lX3Byb3h5KCJzb2NrcyIpLAorICAgICAgICAgICAgIHNlbGYuY29tYmluZV9ob3N0X29ubHkoImN2cyIpLCBzZWxmLmNvbWJpbmVfcG9ydF9vbmx5KCJjdnMiKSkKKyAgICAgICAgcmV0dXJuIHMKKworY2xhc3MgUGFyYW1ldGVyczoKKyAgICAnJydSZXByZXNlbnRzIG90aGVyIHZhcmlhYmxlcyBsaWtlIGF2YWlsYWJsZSBtYWNoaW5lcywgZXRjLicnJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIFZhcmlhYmxlcworICAgICAgICBzZWxmLm1heF90aHJlYWRzID0gNjU1MzUKKyAgICAgICAgc2VsZi5jb3JlX2Jhc2UgPSAiIgorICAgICAgICBzZWxmLmltYWdlX2FkZHIgPSAiIgorICAgICAgICBzZWxmLmltYWdlX3R5cGVzID0gW10KKyAgICAgICAgc2VsZi5ydW5uYWJsZV9pbWFnZV90eXBlcyA9IFtdCisgICAgICAgIHNlbGYucnVubmFibGVfbWFjaGluZV9wYXR0ZXJucyA9IFtdCisgICAgICAgIHNlbGYuZGVwbG95YWJsZV9pbWFnZV90eXBlcyA9IFtdCisgICAgICAgIHNlbGYudG1wZGlyID0gIiIKKworICAgICAgICBzZWxmLmFsbF9tYWNoaW5lcyA9IFtdCisgICAgICAgIHNlbGYuYWxsX3BhY2thZ2VfZm9ybWF0cyA9IFtdCisgICAgICAgIHNlbGYuYWxsX2Rpc3Ryb3MgPSBbXQorICAgICAgICBzZWxmLmFsbF9zZGtfbWFjaGluZXMgPSBbXQorICAgICAgICBzZWxmLmFsbF9sYXllcnMgPSBbXQorICAgICAgICBzZWxmLmltYWdlX25hbWVzID0gW10KKyAgICAgICAgc2VsZi5pbWFnZV93aGl0ZV9wYXR0ZXJuID0gIiIKKyAgICAgICAgc2VsZi5pbWFnZV9ibGFja19wYXR0ZXJuID0gIiIKKworICAgICAgICAjIGZvciBidWlsZCBsb2cgdG8gc2hvdworICAgICAgICBzZWxmLmJiX3ZlcnNpb24gPSAiIgorICAgICAgICBzZWxmLnRhcmdldF9hcmNoID0gIiIKKyAgICAgICAgc2VsZi50YXJnZXRfb3MgPSAiIgorICAgICAgICBzZWxmLmRpc3Ryb192ZXJzaW9uID0gIiIKKyAgICAgICAgc2VsZi50dW5lX3BrZ2FyY2ggPSAiIgorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYXJhbXMpOgorICAgICAgICBzZWxmLm1heF90aHJlYWRzID0gcGFyYW1zWyJtYXhfdGhyZWFkcyJdCisgICAgICAgIHNlbGYuY29yZV9iYXNlID0gcGFyYW1zWyJjb3JlX2Jhc2UiXQorICAgICAgICBzZWxmLmltYWdlX2FkZHIgPSBwYXJhbXNbImltYWdlX2FkZHIiXQorICAgICAgICBzZWxmLmltYWdlX3R5cGVzID0gcGFyYW1zWyJpbWFnZV90eXBlcyJdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5ydW5uYWJsZV9pbWFnZV90eXBlcyA9IHBhcmFtc1sicnVubmFibGVfaW1hZ2VfdHlwZXMiXS5zcGxpdCgpCisgICAgICAgIHNlbGYucnVubmFibGVfbWFjaGluZV9wYXR0ZXJucyA9IHBhcmFtc1sicnVubmFibGVfbWFjaGluZV9wYXR0ZXJucyJdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5kZXBsb3lhYmxlX2ltYWdlX3R5cGVzID0gcGFyYW1zWyJkZXBsb3lhYmxlX2ltYWdlX3R5cGVzIl0uc3BsaXQoKQorICAgICAgICBzZWxmLnRtcGRpciA9IHBhcmFtc1sidG1wZGlyIl0KKyAgICAgICAgc2VsZi5pbWFnZV93aGl0ZV9wYXR0ZXJuID0gcGFyYW1zWyJpbWFnZV93aGl0ZV9wYXR0ZXJuIl0KKyAgICAgICAgc2VsZi5pbWFnZV9ibGFja19wYXR0ZXJuID0gcGFyYW1zWyJpbWFnZV9ibGFja19wYXR0ZXJuIl0KKyAgICAgICAgc2VsZi5rZXJuZWxfaW1hZ2VfdHlwZSA9IHBhcmFtc1sia2VybmVsX2ltYWdlX3R5cGUiXQorICAgICAgICAjIGZvciBidWlsZCBsb2cgdG8gc2hvdworICAgICAgICBzZWxmLmJiX3ZlcnNpb24gPSBwYXJhbXNbImJiX3ZlcnNpb24iXQorICAgICAgICBzZWxmLnRhcmdldF9hcmNoID0gcGFyYW1zWyJ0YXJnZXRfYXJjaCJdCisgICAgICAgIHNlbGYudGFyZ2V0X29zID0gcGFyYW1zWyJ0YXJnZXRfb3MiXQorICAgICAgICBzZWxmLmRpc3Ryb192ZXJzaW9uID0gcGFyYW1zWyJkaXN0cm9fdmVyc2lvbiJdCisgICAgICAgIHNlbGYudHVuZV9wa2dhcmNoID0gcGFyYW1zWyJ0dW5lX3BrZ2FyY2giXQorCitkZWYgaG9iX2NvbmZfZmlsdGVyKGZuLCBkYXRhKToKKyAgICBpZiBmbi5lbmRzd2l0aCgiL2xvY2FsLmNvbmYiKToKKyAgICAgICAgZGlzdHJvID0gZGF0YS5nZXRWYXIoIkRJU1RST19IT0IiLCBGYWxzZSkKKyAgICAgICAgaWYgZGlzdHJvOgorICAgICAgICAgICAgaWYgZGlzdHJvICE9ICJkZWZhdWx0c2V0dXAiOgorICAgICAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJESVNUUk8iLCBkaXN0cm8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEuZGVsVmFyKCJESVNUUk8iKQorCisgICAgICAgIGtleXMgPSBbIk1BQ0hJTkVfSE9CIiwgIlNES01BQ0hJTkVfSE9CIiwgIlBBQ0tBR0VfQ0xBU1NFU19IT0IiLCBcCisgICAgICAgICAgICAgICAgIkJCX05VTUJFUl9USFJFQURTX0hPQiIsICJQQVJBTExFTF9NQUtFX0hPQiIsICJETF9ESVJfSE9CIiwgXAorICAgICAgICAgICAgICAgICJTU1RBVEVfRElSX0hPQiIsICJTU1RBVEVfTUlSUk9SU19IT0IiLCAiSU5DT01QQVRJQkxFX0xJQ0VOU0VfSE9CIl0KKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgdmFyX2hvYiA9IGRhdGEuZ2V0VmFyKGtleSwgRmFsc2UpCisgICAgICAgICAgICBpZiB2YXJfaG9iOgorICAgICAgICAgICAgICAgIGRhdGEuc2V0VmFyKGtleS5zcGxpdCgiX0hPQiIpWzBdLCB2YXJfaG9iKQorICAgICAgICByZXR1cm4KKworICAgIGlmIGZuLmVuZHN3aXRoKCIvYmJsYXllcnMuY29uZiIpOgorICAgICAgICBsYXllcnMgPSBkYXRhLmdldFZhcigiQkJMQVlFUlNfSE9CIiwgRmFsc2UpCisgICAgICAgIGlmIGxheWVyczoKKyAgICAgICAgICAgIGRhdGEuc2V0VmFyKCJCQkxBWUVSUyIsIGxheWVycykKKyAgICAgICAgcmV0dXJuCisKK2NsYXNzIEJ1aWxkZXIoZ3RrLldpbmRvdyk6CisKKyAgICAoSU5JVElBTF9DSEVDS1MsCisgICAgIE1BQ0hJTkVfU0VMRUNUSU9OLAorICAgICBSQ1BQS0dJTkZPX1BPUFVMQVRJTkcsCisgICAgIFJDUFBLR0lORk9fUE9QVUxBVEVELAorICAgICBCQVNFSU1HX1NFTEVDVEVELAorICAgICBSRUNJUEVfU0VMRUNUSU9OLAorICAgICBQQUNLQUdFX0dFTkVSQVRJTkcsCisgICAgIFBBQ0tBR0VfR0VORVJBVEVELAorICAgICBQQUNLQUdFX1NFTEVDVElPTiwKKyAgICAgRkFTVF9JTUFHRV9HRU5FUkFUSU5HLAorICAgICBJTUFHRV9HRU5FUkFUSU5HLAorICAgICBJTUFHRV9HRU5FUkFURUQsCisgICAgIE1ZX0lNQUdFX09QRU5FRCwKKyAgICAgQkFDSywKKyAgICAgRU5EX05PT1ApID0gcmFuZ2UoMTUpCisKKyAgICAoU0FOSVRZX0NIRUNLLAorICAgICBJTUFHRV9DT05GSUdVUkFUSU9OLAorICAgICBSRUNJUEVfREVUQUlMUywKKyAgICAgQlVJTERfREVUQUlMUywKKyAgICAgUEFDS0FHRV9ERVRBSUxTLAorICAgICBJTUFHRV9ERVRBSUxTLAorICAgICBFTkRfVEFCKSA9IHJhbmdlKDcpCisKKyAgICBfX3N0ZXAycGFnZV9fID0geworICAgICAgICBJTklUSUFMX0NIRUNLUyAgICAgICAgOiBTQU5JVFlfQ0hFQ0ssCisgICAgICAgIE1BQ0hJTkVfU0VMRUNUSU9OICAgICA6IElNQUdFX0NPTkZJR1VSQVRJT04sCisgICAgICAgIFJDUFBLR0lORk9fUE9QVUxBVElORyA6IElNQUdFX0NPTkZJR1VSQVRJT04sCisgICAgICAgIFJDUFBLR0lORk9fUE9QVUxBVEVEICA6IElNQUdFX0NPTkZJR1VSQVRJT04sCisgICAgICAgIEJBU0VJTUdfU0VMRUNURUQgICAgICA6IElNQUdFX0NPTkZJR1VSQVRJT04sCisgICAgICAgIFJFQ0lQRV9TRUxFQ1RJT04gICAgICA6IFJFQ0lQRV9ERVRBSUxTLAorICAgICAgICBQQUNLQUdFX0dFTkVSQVRJTkcgICAgOiBCVUlMRF9ERVRBSUxTLAorICAgICAgICBQQUNLQUdFX0dFTkVSQVRFRCAgICAgOiBQQUNLQUdFX0RFVEFJTFMsCisgICAgICAgIFBBQ0tBR0VfU0VMRUNUSU9OICAgICA6IFBBQ0tBR0VfREVUQUlMUywKKyAgICAgICAgRkFTVF9JTUFHRV9HRU5FUkFUSU5HIDogQlVJTERfREVUQUlMUywKKyAgICAgICAgSU1BR0VfR0VORVJBVElORyAgICAgIDogQlVJTERfREVUQUlMUywKKyAgICAgICAgSU1BR0VfR0VORVJBVEVEICAgICAgIDogSU1BR0VfREVUQUlMUywKKyAgICAgICAgTVlfSU1BR0VfT1BFTkVEICAgICAgIDogSU1BR0VfREVUQUlMUywKKyAgICAgICAgRU5EX05PT1AgICAgICAgICAgICAgIDogTm9uZSwKKyAgICB9CisKKyAgICBTQU5JVFlfQ0hFQ0tfTUlOX0RJU1BMQVlfVElNRSA9IDUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob2JIYW5kbGVyLCByZWNpcGVfbW9kZWwsIHBhY2thZ2VfbW9kZWwpOgorICAgICAgICBzdXBlcihCdWlsZGVyLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICAgICAgc2VsZi5ob2JfaW1hZ2UgPSAiaG9iLWltYWdlIgorCisgICAgICAgICMgaGFuZGxlcgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBob2JIYW5kbGVyCisKKyAgICAgICAgIyBsb2dnZXIKKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZSIpCisgICAgICAgIHNlbGYuY29uc29sZWxvZyA9IE5vbmUKKyAgICAgICAgc2VsZi5jdXJyZW50X2xvZ2ZpbGUgPSBOb25lCisKKyAgICAgICAgIyBjb25maWd1cmF0aW9uIGFuZCBwYXJhbWV0ZXJzCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24oKQorICAgICAgICBzZWxmLnBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzKCkKKworICAgICAgICAjIGJ1aWxkIHN0ZXAKKyAgICAgICAgc2VsZi5jdXJyZW50X3N0ZXAgPSBOb25lCisgICAgICAgIHNlbGYucHJldmlvdXNfc3RlcCA9IE5vbmUKKworICAgICAgICBzZWxmLnN0b3BwaW5nID0gRmFsc2UKKworICAgICAgICAjIHJlY2lwZSBtb2RlbCBhbmQgcGFja2FnZSBtb2RlbAorICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbCA9IHJlY2lwZV9tb2RlbAorICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwgPSBwYWNrYWdlX21vZGVsCisKKyAgICAgICAgIyBJbmRpY2F0ZSB3aGV0aGVyIHVzZXIgaGFzIGN1c3RvbWl6ZWQgdGhlIGltYWdlCisgICAgICAgIHNlbGYuY3VzdG9taXplZCA9IEZhbHNlCisKKyAgICAgICAgIyBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBVSSBpcyB3b3JraW5nCisgICAgICAgIHNlbGYuc2Vuc2l0aXZlID0gVHJ1ZQorCisgICAgICAgICMgSW5kaWNhdGUgd2hldGhlciB0aGUgc2FuaXR5IGNoZWNrIHJhbgorICAgICAgICBzZWxmLnNhbml0eV9jaGVja2VkID0gRmFsc2UKKworICAgICAgICAjIHNhdmUgcGFyc2luZyB3YXJuaW5ncworICAgICAgICBzZWxmLnBhcnNpbmdfd2FybmluZ3MgPSBbXQorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cworICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorCisgICAgICAgICMgY29ubmVjdCB0aGUgc2lnbmFscyB0byBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5jb25uZWN0KCJkZWxldGUtZXZlbnQiLCBzZWxmLmRlc3Ryb3lfd2luZG93X2NiKQorICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5jb25uZWN0ICgicmVjaXBlLXNlbGVjdGlvbi1jaGFuZ2VkIiwgIHNlbGYucmVjaXBlbGlzdF9jaGFuZ2VkX2NiKQorICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwuY29ubmVjdCgicGFja2FnZS1zZWxlY3Rpb24tY2hhbmdlZCIsIHNlbGYucGFja2FnZWxpc3RfY2hhbmdlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoImNvbmZpZy11cGRhdGVkIiwgICAgICAgICAgIHNlbGYuaGFuZGxlcl9jb25maWdfdXBkYXRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoInBhY2thZ2UtZm9ybWF0cy11cGRhdGVkIiwgIHNlbGYuaGFuZGxlcl9wYWNrYWdlX2Zvcm1hdHNfdXBkYXRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoInBhcnNpbmctc3RhcnRlZCIsICAgICAgICAgIHNlbGYuaGFuZGxlcl9wYXJzaW5nX3N0YXJ0ZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJwYXJzaW5nIiwgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXJfcGFyc2luZ19jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoInBhcnNpbmctY29tcGxldGVkIiwgICAgICAgIHNlbGYuaGFuZGxlcl9wYXJzaW5nX2NvbXBsZXRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoImJ1aWxkLXN0YXJ0ZWQiLCAgICAgIHNlbGYuaGFuZGxlcl9idWlsZF9zdGFydGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGQuY29ubmVjdCgiYnVpbGQtc3VjY2VlZGVkIiwgICAgc2VsZi5oYW5kbGVyX2J1aWxkX3N1Y2NlZWRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoImJ1aWxkLWZhaWxlZCIsICAgICAgIHNlbGYuaGFuZGxlcl9idWlsZF9mYWlsZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZC5jb25uZWN0KCJidWlsZC1hYm9ydGVkIiwgICAgICBzZWxmLmhhbmRsZXJfYnVpbGRfYWJvcnRlZF9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoInRhc2stc3RhcnRlZCIsICAgICAgIHNlbGYuaGFuZGxlcl90YXNrX3N0YXJ0ZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZC5jb25uZWN0KCJkaXNrLWZ1bGwiLCAgICAgICAgICBzZWxmLmhhbmRsZXJfZGlza19mdWxsX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGQuY29ubmVjdCgibG9nLWVycm9yIiwgICAgICAgICAgc2VsZi5oYW5kbGVyX2J1aWxkX2ZhaWx1cmVfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZC5jb25uZWN0KCJsb2ctd2FybmluZyIsICAgICAgICBzZWxmLmhhbmRsZXJfYnVpbGRfZmFpbHVyZV9jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmJ1aWxkLmNvbm5lY3QoImxvZyIsICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlcl9idWlsZF9sb2dfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZC5jb25uZWN0KCJuby1wcm92aWRlciIsICAgICAgICBzZWxmLmhhbmRsZXJfbm9fcHJvdmlkZXJfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJnZW5lcmF0aW5nLWRhdGEiLCAgICAgICAgICBzZWxmLmhhbmRsZXJfZ2VuZXJhdGluZ19kYXRhX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgiZGF0YS1nZW5lcmF0ZWQiLCAgICAgICAgICAgc2VsZi5oYW5kbGVyX2RhdGFfZ2VuZXJhdGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgiY29tbWFuZC1zdWNjZWVkZWQiLCAgICAgICAgc2VsZi5oYW5kbGVyX2NvbW1hbmRfc3VjY2VlZGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgiY29tbWFuZC1mYWlsZWQiLCAgICAgICAgICAgc2VsZi5oYW5kbGVyX2NvbW1hbmRfZmFpbGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgicGFyc2luZy13YXJuaW5nIiwgICAgICAgICAgc2VsZi5oYW5kbGVyX3BhcnNpbmdfd2FybmluZ19jYikKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNvbm5lY3QoInNhbml0eS1mYWlsZWQiLCAgICAgICAgICAgIHNlbGYuaGFuZGxlcl9zYW5pdHlfZmFpbGVkX2NiKQorICAgICAgICBzZWxmLmhhbmRsZXIuY29ubmVjdCgicmVjaXBlLXBvcHVsYXRlZCIsICAgICAgICAgc2VsZi5oYW5kbGVyX3JlY2lwZV9wb3B1bGF0ZWRfY2IpCisgICAgICAgIHNlbGYuaGFuZGxlci5jb25uZWN0KCJwYWNrYWdlLXBvcHVsYXRlZCIsICAgICAgICBzZWxmLmhhbmRsZXJfcGFja2FnZV9wb3B1bGF0ZWRfY2IpCisKKyAgICAgICAgc2VsZi5oYW5kbGVyLmFwcGVuZF90b19iYmZpbGVzKCIke1RPUERJUn0vcmVjaXBlcy9pbWFnZXMvY3VzdG9tLyouYmIiKQorICAgICAgICBzZWxmLmhhbmRsZXIuYXBwZW5kX3RvX2JiZmlsZXMoIiR7VE9QRElSfS9yZWNpcGVzL2ltYWdlcy8qLmJiIikKKyAgICAgICAgc2VsZi5pbml0aWF0ZV9uZXdfYnVpbGRfYXN5bmMoKQorCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgc2VsZi5ldmVudF9oYW5kbGVfU0lHSU5UKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3RpdGxlKCJIb2IiKQorICAgICAgICBzZWxmLnNldF9pY29uX25hbWUoImFwcGxpY2F0aW9ucy1kZXZlbG9wbWVudCIpCisgICAgICAgIHNlbGYuc2V0X3Jlc2l6YWJsZShUcnVlKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpbmRvd193aWR0aCA9IHNlbGYuZ2V0X3NjcmVlbigpLmdldF93aWR0aCgpCisgICAgICAgICAgICB3aW5kb3dfaGVpZ2h0ID0gc2VsZi5nZXRfc2NyZWVuKCkuZ2V0X2hlaWdodCgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJQbGVhc2Ugc2V0IERJU1BMQVkgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgSG9iLiIKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgaWYgd2luZG93X3dpZHRoID49IGh3Yy5NQUlOX1dJTl9XSURUSDoKKyAgICAgICAgICAgIHdpbmRvd193aWR0aCA9IGh3Yy5NQUlOX1dJTl9XSURUSAorICAgICAgICAgICAgd2luZG93X2hlaWdodCA9IGh3Yy5NQUlOX1dJTl9IRUlHSFQKKyAgICAgICAgc2VsZi5zZXRfc2l6ZV9yZXF1ZXN0KHdpbmRvd193aWR0aCwgd2luZG93X2hlaWdodCkKKworICAgICAgICBzZWxmLnZib3ggPSBndGsuVkJveChGYWxzZSwgMCkKKyAgICAgICAgc2VsZi52Ym94LnNldF9ib3JkZXJfd2lkdGgoMCkKKyAgICAgICAgc2VsZi5hZGQoc2VsZi52Ym94KQorCisgICAgICAgICMgY3JlYXRlIHBhZ2VzCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlID0gSW1hZ2VDb25maWd1cmF0aW9uUGFnZShzZWxmKQorICAgICAgICBzZWxmLnJlY2lwZV9kZXRhaWxzX3BhZ2UgICAgICA9IFJlY2lwZVNlbGVjdGlvblBhZ2Uoc2VsZikKKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UgICAgICAgPSBCdWlsZERldGFpbHNQYWdlKHNlbGYpCisgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2UgICAgID0gUGFja2FnZVNlbGVjdGlvblBhZ2Uoc2VsZikKKyAgICAgICAgc2VsZi5pbWFnZV9kZXRhaWxzX3BhZ2UgICAgICAgPSBJbWFnZURldGFpbHNQYWdlKHNlbGYpCisgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrX3BhZ2UgICAgICAgID0gU2FuaXR5Q2hlY2tQYWdlKHNlbGYpCisgICAgICAgIHNlbGYuZGlzcGxheV9zYW5pdHlfY2hlY2sgPSBGYWxzZQorICAgICAgICBzZWxmLnNhbml0eV9jaGVja19wb3N0X2Z1bmMgPSBGYWxzZQorICAgICAgICBzZWxmLmhhZF9uZXR3b3JrX2Vycm9yID0gRmFsc2UKKworICAgICAgICBzZWxmLm5iID0gZ3RrLk5vdGVib29rKCkKKyAgICAgICAgc2VsZi5uYi5zZXRfc2hvd190YWJzKEZhbHNlKQorICAgICAgICBzZWxmLm5iLmluc2VydF9wYWdlKHNlbGYuc2FuaXR5X2NoZWNrX3BhZ2UsICAgICAgICBOb25lLCBzZWxmLlNBTklUWV9DSEVDSykKKyAgICAgICAgc2VsZi5uYi5pbnNlcnRfcGFnZShzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZSwgTm9uZSwgc2VsZi5JTUFHRV9DT05GSUdVUkFUSU9OKQorICAgICAgICBzZWxmLm5iLmluc2VydF9wYWdlKHNlbGYucmVjaXBlX2RldGFpbHNfcGFnZSwgICAgICBOb25lLCBzZWxmLlJFQ0lQRV9ERVRBSUxTKQorICAgICAgICBzZWxmLm5iLmluc2VydF9wYWdlKHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLCAgICAgICBOb25lLCBzZWxmLkJVSUxEX0RFVEFJTFMpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0X3BhZ2Uoc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZSwgICAgIE5vbmUsIHNlbGYuUEFDS0FHRV9ERVRBSUxTKQorICAgICAgICBzZWxmLm5iLmluc2VydF9wYWdlKHNlbGYuaW1hZ2VfZGV0YWlsc19wYWdlLCAgICAgICBOb25lLCBzZWxmLklNQUdFX0RFVEFJTFMpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYubmIsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIHNlbGYubmIuc2V0X2N1cnJlbnRfcGFnZSgwKQorCisgICAgZGVmIHNhbml0eV9jaGVja190aW1lb3V0KHNlbGYpOgorICAgICAgICAjIFRoZSBtaW5pbXVtIHRpbWUgZm9yIHNob3dpbmcgdGhlICdzYW5pdHkgY2hlY2snIHBhZ2UgaGFzIHBhc3NlCisgICAgICAgICMgSWYgc29tZW9uZSBzZXQgdGhlICdzYW5pdHlfY2hlY2tfcG9zdF9zdGVwJyBtZWFud2hpbGUsIGV4ZWN1dGUgaXQgbm93CisgICAgICAgIHNlbGYuZGlzcGxheV9zYW5pdHlfY2hlY2sgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLnNhbml0eV9jaGVja19wb3N0X2Z1bmM6CisgICAgICAgICAgdGVtcCA9IHNlbGYuc2FuaXR5X2NoZWNrX3Bvc3RfZnVuYworICAgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrX3Bvc3RfZnVuYyA9IE5vbmUKKyAgICAgICAgICB0ZW1wKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgc2hvd19zYW5pdHlfY2hlY2tfcGFnZShzZWxmKToKKyAgICAgICAgIyBUaGlzIHdpbmRvdyBtdXN0IHN0YXkgb24gc2NyZWVuIGZvciBhdCBsZWFzdCA1IHNlY29uZHMsIGFjY29yZGluZyB0byB0aGUgZGVzaWduIGRvY3VtZW50CisgICAgICAgIHNlbGYubmIuc2V0X2N1cnJlbnRfcGFnZShzZWxmLlNBTklUWV9DSEVDSykKKyAgICAgICAgc2VsZi5zYW5pdHlfY2hlY2tfcG9zdF9zdGVwID0gTm9uZQorICAgICAgICBzZWxmLmRpc3BsYXlfc2FuaXR5X2NoZWNrID0gVHJ1ZQorICAgICAgICBzZWxmLnNhbml0eV9jaGVja19wYWdlLnN0YXJ0KCkKKyAgICAgICAgZ29iamVjdC50aW1lb3V0X2FkZChzZWxmLlNBTklUWV9DSEVDS19NSU5fRElTUExBWV9USU1FICogMTAwMCwgc2VsZi5zYW5pdHlfY2hlY2tfdGltZW91dCkKKworICAgIGRlZiBleGVjdXRlX2FmdGVyX3Nhbml0eV9jaGVjayhzZWxmLCBmdW5jKToKKyAgICAgICAgaWYgbm90IHNlbGYuZGlzcGxheV9zYW5pdHlfY2hlY2s6CisgICAgICAgICAgZnVuYygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgc2VsZi5zYW5pdHlfY2hlY2tfcG9zdF9mdW5jID0gZnVuYworCisgICAgZGVmIGdlbmVyYXRlX2NvbmZpZ3VyYXRpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNhbml0eV9jaGVja2VkOgorICAgICAgICAgICAgc2VsZi5zaG93X3Nhbml0eV9jaGVja19wYWdlKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLmdlbmVyYXRlX2NvbmZpZ3VyYXRpb24oKQorCisgICAgZGVmIGluaXRpYXRlX25ld19idWlsZF9hc3luYyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlID0gTm9uZQorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuTUFDSElORV9TRUxFQ1RJT04pCisgICAgICAgIHNlbGYuaGFuZGxlci5pbml0X2Nvb2tlcigpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZXh0cmFfaW5oZXJpdCgiaW1hZ2VfdHlwZXMiKQorICAgICAgICBzZWxmLmdlbmVyYXRlX2NvbmZpZ3VyYXRpb24oKQorCisgICAgZGVmIHVwZGF0ZV9jb25maWdfYXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VzZXJfY29uZmlnKCkKKyAgICAgICAgc2VsZi5nZW5lcmF0ZV9jb25maWd1cmF0aW9uKCkKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLk1BQ0hJTkVfU0VMRUNUSU9OKQorCisgICAgZGVmIHNhbml0eV9jaGVjayhzZWxmKToKKyAgICAgICAgc2VsZi5oYW5kbGVyLnRyaWdnZXJfc2FuaXR5X2NoZWNrKCkKKworICAgIGRlZiBwb3B1bGF0ZV9yZWNpcGVfcGFja2FnZV9pbmZvX2FzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuUkNQUEtHSU5GT19QT1BVTEFUSU5HKQorICAgICAgICAjIFBhcnNlIHJlY2lwZXMKKyAgICAgICAgc2VsZi5zZXRfdXNlcl9jb25maWcoKQorICAgICAgICBzZWxmLmhhbmRsZXIuZ2VuZXJhdGVfcmVjaXBlcygpCisKKyAgICBkZWYgZ2VuZXJhdGVfcGFja2FnZXNfYXN5bmMoc2VsZiwgbG9nID0gRmFsc2UpOgorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuUEFDS0FHRV9HRU5FUkFUSU5HKQorICAgICAgICBpZiBsb2c6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfbG9nZmlsZSA9IHNlbGYuaGFuZGxlci5nZXRfbG9nZmlsZSgpCisgICAgICAgICAgICBzZWxmLmRvX2xvZyhzZWxmLmN1cnJlbnRfbG9nZmlsZSkKKyAgICAgICAgIyBCdWlsZCBwYWNrYWdlcworICAgICAgICBfLCBhbGxfcmVjaXBlcyA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9yZWNpcGVzKCkKKyAgICAgICAgc2VsZi5zZXRfdXNlcl9jb25maWcoKQorICAgICAgICBzZWxmLmhhbmRsZXIucmVzZXRfYnVpbGQoKQorICAgICAgICBzZWxmLmhhbmRsZXIuZ2VuZXJhdGVfcGFja2FnZXMoYWxsX3JlY2lwZXMsIHNlbGYuY29uZmlndXJhdGlvbi5kZWZhdWx0X3Rhc2spCisKKyAgICBkZWYgcmVzdG9yZV9pbml0aWFsX3NlbGVjdGVkX3BhY2thZ2VzKHNlbGYpOgorICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwuc2V0X3NlbGVjdGVkX3BhY2thZ2VzKHNlbGYuY29uZmlndXJhdGlvbi5pbml0aWFsX3VzZXJfc2VsZWN0ZWRfcGFja2FnZXMsIFRydWUpCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5zZXRfc2VsZWN0ZWRfcGFja2FnZXMoc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfcGFja2FnZXMpCisgICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlczoKKyAgICAgICAgICAgIGlmIHBhY2thZ2Ugbm90IGluIHNlbGYuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX3BhY2thZ2VzOgorICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5leGNsdWRlX2l0ZW0oc2VsZi5wYWNrYWdlX21vZGVsLmZpbmRfcGF0aF9mb3JfaXRlbShwYWNrYWdlKSkKKworICAgIGRlZiBmYXN0X2dlbmVyYXRlX2ltYWdlX2FzeW5jKHNlbGYsIGxvZyA9IEZhbHNlKToKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORykKKyAgICAgICAgaWYgbG9nOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xvZ2ZpbGUgPSBzZWxmLmhhbmRsZXIuZ2V0X2xvZ2ZpbGUoKQorICAgICAgICAgICAgc2VsZi5kb19sb2coc2VsZi5jdXJyZW50X2xvZ2ZpbGUpCisgICAgICAgICMgQnVpbGQgcGFja2FnZXMKKyAgICAgICAgXywgYWxsX3JlY2lwZXMgPSBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcmVjaXBlcygpCisgICAgICAgIHNlbGYuc2V0X3VzZXJfY29uZmlnKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnJlc2V0X2J1aWxkKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLmdlbmVyYXRlX3BhY2thZ2VzKGFsbF9yZWNpcGVzLCBzZWxmLmNvbmZpZ3VyYXRpb24uZGVmYXVsdF90YXNrKQorCisgICAgZGVmIGdlbmVyYXRlX2ltYWdlX2FzeW5jKHNlbGYsIGNvbnQgPSBGYWxzZSk6CisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5JTUFHRV9HRU5FUkFUSU5HKQorICAgICAgICBzZWxmLmhhbmRsZXIucmVzZXRfYnVpbGQoKQorICAgICAgICBpZiBub3QgY29udDoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9sb2dmaWxlID0gc2VsZi5oYW5kbGVyLmdldF9sb2dmaWxlKCkKKyAgICAgICAgICAgIHNlbGYuZG9fbG9nKHNlbGYuY3VycmVudF9sb2dmaWxlKQorICAgICAgICAjIEJ1aWxkIGltYWdlCisgICAgICAgIHNlbGYuc2V0X3VzZXJfY29uZmlnKCkKKyAgICAgICAgdG9vbGNoYWluX3BhY2thZ2VzID0gW10KKyAgICAgICAgYmFzZV9pbWFnZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLnRvb2xjaGFpbl9idWlsZDoKKyAgICAgICAgICAgIHRvb2xjaGFpbl9wYWNrYWdlcyA9IHNlbGYucGFja2FnZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcGFja2FnZXNfdG9vbGNoYWluKCkKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlID09IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYucGFja2FnZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcGFja2FnZXMoKQorICAgICAgICAgICAgaW1hZ2UgPSBzZWxmLmhvYl9pbWFnZQorICAgICAgICAgICAgYmFzZV9pbWFnZSA9IHNlbGYuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX2ltYWdlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYWNrYWdlcyA9IFtdCisgICAgICAgICAgICBpbWFnZSA9IHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9pbWFnZQorICAgICAgICBzZWxmLmhhbmRsZXIuZ2VuZXJhdGVfaW1hZ2UoaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sY2hhaW5fcGFja2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uZGVmYXVsdF90YXNrKQorCisgICAgZGVmIGdlbmVyYXRlX25ld19pbWFnZShzZWxmLCBpbWFnZSwgZGVzY3JpcHRpb24pOgorICAgICAgICBiYXNlX2ltYWdlID0gc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UKKyAgICAgICAgaWYgYmFzZV9pbWFnZSA9PSBzZWxmLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgYmFzZV9pbWFnZSA9IE5vbmUKKyAgICAgICAgcGFja2FnZXMgPSBzZWxmLnBhY2thZ2VfbW9kZWwuZ2V0X3NlbGVjdGVkX3BhY2thZ2VzKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLmdlbmVyYXRlX25ld19pbWFnZShpbWFnZSwgYmFzZV9pbWFnZSwgcGFja2FnZXMsIGRlc2NyaXB0aW9uKQorCisgICAgZGVmIGVuc3VyZV9kaXIoc2VsZiwgZGlyZWN0b3J5KToKKyAgICAgICAgc2VsZi5oYW5kbGVyLmVuc3VyZV9kaXIoZGlyZWN0b3J5KQorCisgICAgZGVmIGdldF9wYXJhbWV0ZXJzX3N5bmMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZXIuZ2V0X3BhcmFtZXRlcnMoKQorCisgICAgZGVmIHJlcXVlc3RfcGFja2FnZV9pbmZvX2FzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLmhhbmRsZXIucmVxdWVzdF9wYWNrYWdlX2luZm8oKQorCisgICAgZGVmIGNhbmNlbF9idWlsZF9zeW5jKHNlbGYsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNhbmNlbF9idWlsZChmb3JjZSkKKworICAgIGRlZiBjYW5jZWxfcGFyc2Vfc3luYyhzZWxmKToKKyAgICAgICAgc2VsZi5oYW5kbGVyLmNhbmNlbF9wYXJzZSgpCisKKyAgICBkZWYgc3dpdGNoX3BhZ2Uoc2VsZiwgbmV4dF9zdGVwKToKKyAgICAgICAgIyBNYWluIFdvcmtmbG93IChCdXNpbmVzcyBMb2dpYykKKyAgICAgICAgc2VsZi5uYi5zZXRfY3VycmVudF9wYWdlKHNlbGYuX19zdGVwMnBhZ2VfX1tuZXh0X3N0ZXBdKQorCisgICAgICAgIGlmIG5leHRfc3RlcCA9PSBzZWxmLk1BQ0hJTkVfU0VMRUNUSU9OOiAjIGluaXQgc3RlcAorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uuc2hvd19tYWNoaW5lKCkKKworICAgICAgICBlbGlmIG5leHRfc3RlcCA9PSBzZWxmLlJDUFBLR0lORk9fUE9QVUxBVElORzoKKyAgICAgICAgICAgICMgTUFDSElORSBDSEFOR0VEIGFjdGlvbiBvciBTRVRUSU5HUyBDSEFOR0VECisgICAgICAgICAgICAjIHNob3cgdGhlIHByb2dyZXNzIGJhcgorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uuc2hvd19pbmZvX3BvcHVsYXRpbmcoKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuUkNQUEtHSU5GT19QT1BVTEFURUQ6CisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5zaG93X2luZm9fcG9wdWxhdGVkKCkKKworICAgICAgICBlbGlmIG5leHRfc3RlcCA9PSBzZWxmLkJBU0VJTUdfU0VMRUNURUQ6CisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5zaG93X2Jhc2VpbWdfc2VsZWN0ZWQoKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuUkVDSVBFX1NFTEVDVElPTjoKKyAgICAgICAgICAgIGlmIHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpID09IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICAgICAgc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLnNldF9yZWNpcGVfY3Vycl90YWIoc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLkFMTCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLnNldF9yZWNpcGVfY3Vycl90YWIoc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLklOQ0xVREVEKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuUEFDS0FHRV9TRUxFQ1RJT046CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF9zZWxlY3RlZF9wYWNrYWdlcyA9IHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlcworICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfdXNlcl9zZWxlY3RlZF9wYWNrYWdlcyA9IHNlbGYuY29uZmlndXJhdGlvbi51c2VyX3NlbGVjdGVkX3BhY2thZ2VzCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNldF90aXRsZSgiRWRpdCBwYWNrYWdlcyIpCisgICAgICAgICAgICBpZiBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfc2VsZWN0ZWRfaW1hZ2UoKSA9PSBzZWxmLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2Uuc2V0X3BhY2thZ2VzX2N1cnJfdGFiKHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2UuQUxMKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNldF9wYWNrYWdlc19jdXJyX3RhYihzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLklOQ0xVREVEKQorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5zaG93X3BhZ2Uoc2VsZi5jdXJyZW50X2xvZ2ZpbGUpCisKKworICAgICAgICBlbGlmIG5leHRfc3RlcCA9PSBzZWxmLlBBQ0tBR0VfR0VORVJBVElORyBvciBuZXh0X3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAjIGJvdGggUEFDS0FHRV9HRU5FUkFUSU5HIGFuZCBGQVNUX0lNQUdFX0dFTkVSQVRJTkcgc2hhcmUgdGhlIHNhbWUgcGFnZQorICAgICAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2Uuc2hvd19wYWdlKG5leHRfc3RlcCkKKworICAgICAgICBlbGlmIG5leHRfc3RlcCA9PSBzZWxmLlBBQ0tBR0VfR0VORVJBVEVEOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5zZXRfdGl0bGUoIlN0ZXAgMiBvZiAyOiBFZGl0IHBhY2thZ2VzIikKKyAgICAgICAgICAgIGlmIHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpID09IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5zZXRfcGFja2FnZXNfY3Vycl90YWIoc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5BTEwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2Uuc2V0X3BhY2thZ2VzX2N1cnJfdGFiKHNlbGYucGFja2FnZV9kZXRhaWxzX3BhZ2UuSU5DTFVERUQpCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNob3dfcGFnZShzZWxmLmN1cnJlbnRfbG9nZmlsZSkKKworICAgICAgICBlbGlmIG5leHRfc3RlcCA9PSBzZWxmLklNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAjIGFmdGVyIHBhY2thZ2VzIGFyZSBnZW5lcmF0ZWQsIHNlbGVjdGVkX3BhY2thZ2VzIG5lZWQgdG8KKyAgICAgICAgICAgICMgYmUgdXBkYXRlZCBpbiBwYWNrYWdlX21vZGVsIHBlciBzZWxlY3RlZF9pbWFnZSBpbiByZWNpcGVfbW9kZWwKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnNob3dfcGFnZShuZXh0X3N0ZXApCisKKyAgICAgICAgZWxpZiBuZXh0X3N0ZXAgPT0gc2VsZi5JTUFHRV9HRU5FUkFURUQ6CisgICAgICAgICAgICBzZWxmLmltYWdlX2RldGFpbHNfcGFnZS5zaG93X3BhZ2UobmV4dF9zdGVwKQorCisgICAgICAgIGVsaWYgbmV4dF9zdGVwID09IHNlbGYuTVlfSU1BR0VfT1BFTkVEOgorICAgICAgICAgICAgc2VsZi5pbWFnZV9kZXRhaWxzX3BhZ2Uuc2hvd19wYWdlKG5leHRfc3RlcCkKKworICAgICAgICBzZWxmLnByZXZpb3VzX3N0ZXAgPSBzZWxmLmN1cnJlbnRfc3RlcAorICAgICAgICBzZWxmLmN1cnJlbnRfc3RlcCA9IG5leHRfc3RlcAorCisgICAgZGVmIHNldF91c2VyX2NvbmZpZ19wcm94aWVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5ID09IFRydWU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2h0dHBfcHJveHkoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcHJveHkoImh0dHAiKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaHR0cHNfcHJveHkoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcHJveHkoImh0dHBzIikpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2Z0cF9wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eSgiZnRwIikpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X3NvY2tzX3Byb3h5KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3Byb3h5KCJzb2NrcyIpKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9jdnNfcHJveHkoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfaG9zdF9vbmx5KCJjdnMiKSwgc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcG9ydF9vbmx5KCJjdnMiKSkKKyAgICAgICAgZWxpZiBzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5ID09IEZhbHNlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9odHRwX3Byb3h5KCIiKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9odHRwc19wcm94eSgiIikKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZnRwX3Byb3h5KCIiKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9zb2Nrc19wcm94eSgiIikKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfY3ZzX3Byb3h5KCIiLCAiIikKKworICAgIGRlZiBzZXRfdXNlcl9jb25maWdfZXh0cmEoc2VsZik6CisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfcm9vdGZzX3NpemUoc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX3Jvb3Rmc19zaXplKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2V4dHJhX3NpemUoc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX2V4dHJhX3NpemUpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaW5jb21wYXRpYmxlX2xpY2Vuc2Uoc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2UpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfc2RrX21hY2hpbmUoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfc2RrX21hY2hpbmUpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaW1hZ2VfZnN0eXBlcyhzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZnN0eXBlcykKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9leHRyYV9jb25maWcoc2VsZi5jb25maWd1cmF0aW9uLmV4dHJhX3NldHRpbmcpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZXh0cmFfaW5oZXJpdCgicGFja2FnZWluZm8gaW1hZ2VfdHlwZXMiKQorICAgICAgICBzZWxmLnNldF91c2VyX2NvbmZpZ19wcm94aWVzKCkKKworICAgIGRlZiBzZXRfdXNlcl9jb25maWcoc2VsZik6CisgICAgICAgICMgc2V0IGJiIGxheWVycworICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2JibGF5ZXJzKHNlbGYuY29uZmlndXJhdGlvbi5sYXllcnMpCisgICAgICAgICMgc2V0IGxvY2FsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9tYWNoaW5lKHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX21hY2gpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfcGFja2FnZV9mb3JtYXQoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfcGFja2FnZV9mb3JtYXQpCisgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZGlzdHJvKHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX2Rpc3RybykKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9kbF9kaXIoc2VsZi5jb25maWd1cmF0aW9uLmRsZGlyKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X3NzdGF0ZV9kaXIoc2VsZi5jb25maWd1cmF0aW9uLnNzdGF0ZWRpcikKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9zc3RhdGVfbWlycm9ycyhzZWxmLmNvbmZpZ3VyYXRpb24uc3N0YXRlbWlycm9yKQorICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X3BtYWtlKHNlbGYuY29uZmlndXJhdGlvbi5wbWFrZSkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9iYnRocmVhZHMoc2VsZi5jb25maWd1cmF0aW9uLmJidGhyZWFkKQorICAgICAgICBzZWxmLnNldF91c2VyX2NvbmZpZ19leHRyYSgpCisKKyAgICBkZWYgdXBkYXRlX3JlY2lwZV9tb2RlbChzZWxmLCBzZWxlY3RlZF9pbWFnZSwgc2VsZWN0ZWRfcmVjaXBlcyk6CisgICAgICAgIHNlbGYucmVjaXBlX21vZGVsLnNldF9zZWxlY3RlZF9pbWFnZShzZWxlY3RlZF9pbWFnZSkKKyAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwuc2V0X3NlbGVjdGVkX3JlY2lwZXMoc2VsZWN0ZWRfcmVjaXBlcykKKworICAgIGRlZiB1cGRhdGVfcGFja2FnZV9tb2RlbChzZWxmLCBzZWxlY3RlZF9wYWNrYWdlcywgdXNlcl9zZWxlY3RlZF9wYWNrYWdlcz1Ob25lKToKKyAgICAgICAgaWYgdXNlcl9zZWxlY3RlZF9wYWNrYWdlczoKKyAgICAgICAgICAgIGxlZnQgPSBzZWxmLnBhY2thZ2VfbW9kZWwuc2V0X3NlbGVjdGVkX3BhY2thZ2VzKHVzZXJfc2VsZWN0ZWRfcGFja2FnZXMsIFRydWUpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24udXNlcl9zZWxlY3RlZF9wYWNrYWdlcyArPSBsZWZ0CisgICAgICAgIGxlZnQgPSBzZWxmLnBhY2thZ2VfbW9kZWwuc2V0X3NlbGVjdGVkX3BhY2thZ2VzKHNlbGVjdGVkX3BhY2thZ2VzKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcGFja2FnZXMgKz0gbGVmdAorCisgICAgZGVmIHVwZGF0ZV9jb25maWd1cmF0aW9uX3BhcmFtZXRlcnMoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgaWYgcGFyYW1zOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnVwZGF0ZShwYXJhbXMpCisgICAgICAgICAgICBzZWxmLnBhcmFtZXRlcnMudXBkYXRlKHBhcmFtcykKKworICAgIGRlZiBzZXRfYmFzZV9pbWFnZShzZWxmKToKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlICE9IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICBzZWxmLmhvYl9pbWFnZSA9IHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9pbWFnZSArICItZWRpdGVkIgorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9tYWNoID0gIiIKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmNsZWFyX3NlbGVjdGlvbigpCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnN3aXRjaF9tYWNoaW5lX2NvbWJvKCkKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLk1BQ0hJTkVfU0VMRUNUSU9OKQorCisgICAgIyBDYWxsYmFjayBGdW5jdGlvbnMKKyAgICBkZWYgaGFuZGxlcl9jb25maWdfdXBkYXRlZF9jYihzZWxmLCBoYW5kbGVyLCB3aGljaCwgdmFsdWVzKToKKyAgICAgICAgaWYgd2hpY2ggPT0gImRpc3RybyI6CisgICAgICAgICAgICBzZWxmLnBhcmFtZXRlcnMuYWxsX2Rpc3Ryb3MgPSB2YWx1ZXMKKyAgICAgICAgZWxpZiB3aGljaCA9PSAibWFjaGluZSI6CisgICAgICAgICAgICBzZWxmLnBhcmFtZXRlcnMuYWxsX21hY2hpbmVzID0gdmFsdWVzCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfbWFjaGluZV9jb21ibygpCisgICAgICAgIGVsaWYgd2hpY2ggPT0gIm1hY2hpbmUtc2RrIjoKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5hbGxfc2RrX21hY2hpbmVzID0gdmFsdWVzCisKKyAgICBkZWYgaGFuZGxlcl9wYWNrYWdlX2Zvcm1hdHNfdXBkYXRlZF9jYihzZWxmLCBoYW5kbGVyLCBmb3JtYXRzKToKKyAgICAgICAgc2VsZi5wYXJhbWV0ZXJzLmFsbF9wYWNrYWdlX2Zvcm1hdHMgPSBmb3JtYXRzCisKKyAgICBkZWYgc3dpdGNoX3RvX2ltYWdlX2NvbmZpZ3VyYXRpb25faGVscGVyKHNlbGYpOgorICAgICAgICBzZWxmLnNhbml0eV9jaGVja19wYWdlLnN0b3AoKQorICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuSU1BR0VfQ09ORklHVVJBVElPTikKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uuc3dpdGNoX21hY2hpbmVfY29tYm8oKQorCisgICAgZGVmIHNob3dfbmV0d29ya19lcnJvcl9kaWFsb2dfaGVscGVyKHNlbGYpOgorICAgICAgICBzZWxmLnNhbml0eV9jaGVja19wYWdlLnN0b3AoKQorICAgICAgICBzZWxmLnNob3dfbmV0d29ya19lcnJvcl9kaWFsb2coKQorCisgICAgZGVmIGhhbmRsZXJfY29tbWFuZF9zdWNjZWVkZWRfY2Ioc2VsZiwgaGFuZGxlciwgaW5pdGNtZCk6CisgICAgICAgIGlmIGluaXRjbWQgPT0gc2VsZi5oYW5kbGVyLkdFTkVSQVRFX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfbWFjaDoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9tYWNoID0gc2VsZi5oYW5kbGVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJIT0JfTUFDSElORSJdKSBvciAiIgorICAgICAgICAgICAgc2VsZi51cGRhdGVfY29uZmlndXJhdGlvbl9wYXJhbWV0ZXJzKHNlbGYuZ2V0X3BhcmFtZXRlcnNfc3luYygpKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuc2FuaXR5X2NoZWNrZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5zYW5pdHlfY2hlY2soKQorICAgICAgICAgICAgICAgIHNlbGYuc2FuaXR5X2NoZWNrZWQgPSBUcnVlCisgICAgICAgIGVsaWYgaW5pdGNtZCA9PSBzZWxmLmhhbmRsZXIuU0FOSVRZX0NIRUNLOgorICAgICAgICAgICAgaWYgc2VsZi5oYWRfbmV0d29ya19lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmhhZF9uZXR3b3JrX2Vycm9yID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGVfYWZ0ZXJfc2FuaXR5X2NoZWNrKHNlbGYuc2hvd19uZXR3b3JrX2Vycm9yX2RpYWxvZ19oZWxwZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgU3dpdGNoIHRvIHRoZSAnaW1hZ2UgY29uZmlndXJhdGlvbicgcGFnZSBub3csIGJ1dCB3ZSBtaWdodCBuZWVkCisgICAgICAgICAgICAgICAgIyB0byB3YWl0IGZvciB0aGUgbWluaW11bSBkaXNwbGF5IHRpbWUgb2YgdGhlIHNhbml0eSBjaGVjayBwYWdlCisgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlX2FmdGVyX3Nhbml0eV9jaGVjayhzZWxmLnN3aXRjaF90b19pbWFnZV9jb25maWd1cmF0aW9uX2hlbHBlcikKKyAgICAgICAgZWxpZiBpbml0Y21kIGluIFtzZWxmLmhhbmRsZXIuR0VORVJBVEVfUkVDSVBFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXIuR0VORVJBVEVfUEFDS0FHRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyLkdFTkVSQVRFX0lNQUdFXToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlX2NvbmZpZ3VyYXRpb25fcGFyYW1ldGVycyhzZWxmLmdldF9wYXJhbWV0ZXJzX3N5bmMoKSkKKyAgICAgICAgICAgIHNlbGYucmVxdWVzdF9wYWNrYWdlX2luZm9fYXN5bmMoKQorICAgICAgICBlbGlmIGluaXRjbWQgPT0gc2VsZi5oYW5kbGVyLlBPUFVMQVRFX1BBQ0tBR0VJTkZPOgorICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5SQ1BQS0dJTkZPX1BPUFVMQVRJTkc6CisgICAgICAgICAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLlJDUFBLR0lORk9fUE9QVUxBVEVEKQorICAgICAgICAgICAgICAgIHNlbGYucmNwcGtnbGlzdF9wb3B1bGF0ZWQoKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBzZWxmLnJjcHBrZ2xpc3RfcG9wdWxhdGVkKCkKKyAgICAgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVfaW1hZ2VfYXN5bmMoVHJ1ZSkKKworICAgIGRlZiBzaG93X2Vycm9yX2RpYWxvZyhzZWxmLCBtc2cpOgorICAgICAgICBsYmwgPSAiPGI+SG9iIGZvdW5kIGFuIGVycm9yPC9iPiIKKyAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX0VSUk9SLCBtc2cpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBzaG93X3dhcm5pbmdfZGlhbG9nKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBQYXJzaW5nV2FybmluZ3NEaWFsb2codGl0bGUgPSAiVmlldyB3YXJuaW5ncyIsCisgICAgICAgICAgICAgICAgd2FybmluZ3MgPSBzZWxmLnBhcnNpbmdfd2FybmluZ3MsCisgICAgICAgICAgICAgICAgcGFyZW50ID0gTm9uZSwKKyAgICAgICAgICAgICAgICBmbGFncyA9IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgc2hvd19uZXR3b3JrX2Vycm9yX2RpYWxvZyhzZWxmKToKKyAgICAgICAgbGJsID0gIjxiPkhvYiBjYW5ub3QgY29ubmVjdCB0byB0aGUgbmV0d29yazwvYj4iCisgICAgICAgIG1zZyA9IG1zZyArICJQbGVhc2UgY2hlY2sgeW91ciBuZXR3b3JrIGNvbm5lY3Rpb24uIElmIHlvdSBhcmUgdXNpbmcgYSBwcm94eSBzZXJ2ZXIsIHBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuIgorICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfRVJST1IsIG1zZykKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIlByb3h5IHNldHRpbmdzIiwgZ3RrLlJFU1BPTlNFX0NBTkNFTCkKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIHJlcyA9IGRpYWxvZy5ydW4oKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgIGlmIHJlcyA9PSBndGsuUkVTUE9OU0VfQ0FOQ0VMOgorICAgICAgICAgICAgcmVzLCBzZXR0aW5nc19jaGFuZ2VkID0gc2VsZi5zaG93X3NpbXBsZV9zZXR0aW5nc19kaWFsb2coU2ltcGxlU2V0dGluZ3NEaWFsb2cuUFJPWElFU19QQUdFX0lEKQorICAgICAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNldHRpbmdzX2NoYW5nZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBhcnNlX3Bvc3RfYWR2X3NldHRpbmdzKCkKKworICAgIGRlZiBoYW5kbGVyX2NvbW1hbmRfZmFpbGVkX2NiKHNlbGYsIGhhbmRsZXIsIG1zZyk6CisgICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgIHNlbGYuc2hvd19lcnJvcl9kaWFsb2cobXNnKQorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBoYW5kbGVyX3BhcnNpbmdfd2FybmluZ19jYihzZWxmLCBoYW5kbGVyLCB3YXJuX21zZyk6CisgICAgICAgIHNlbGYucGFyc2luZ193YXJuaW5ncy5hcHBlbmQod2Fybl9tc2cpCisKKyAgICBkZWYgaGFuZGxlcl9zYW5pdHlfZmFpbGVkX2NiKHNlbGYsIGhhbmRsZXIsIG1zZywgbmV0d29ya19lcnJvcik6CisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBpZiBuZXR3b3JrX2Vycm9yOgorICAgICAgICAgICAgIyBNYXJrIHRoaXMgaW4gYW4gaW50ZXJuYWwgZmllbGQuIFRoZSAibmV0d29yayBlcnJvciIgZGlhbG9nIHdpbGwgYmUKKyAgICAgICAgICAgICMgc2hvd24gbGF0ZXIsIHdoZW4gYSBTYW5pdHlDaGVja1Bhc3NlZCBldmVudCB3aWxsIGJlIGhhbmRsZWQKKyAgICAgICAgICAgICMgKGFzIHNlbnQgYnkgc2FuaXR5LmJiY2xhc3MpCisgICAgICAgICAgICBzZWxmLmhhZF9uZXR3b3JrX2Vycm9yID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoInlvdXIgbG9jYWwuY29uZiIsICJTZXR0aW5ncyIpCisgICAgICAgICAgICBzZWxmLnNob3dfZXJyb3JfZGlhbG9nKG1zZykKKyAgICAgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIHdpbmRvd19zZW5zaXRpdmUoc2VsZiwgc2Vuc2l0aXZlKToKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UubWFjaGluZV9jb21iby5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UubWFjaGluZV9jb21iby5jaGlsZC5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UuaW1hZ2VfY29tYm8uc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLmltYWdlX2NvbWJvLmNoaWxkLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5sYXllcl9idXR0b24uc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLmxheWVyX2luZm9faWNvbi5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudG9vbGJhci5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uudmlld19hZHZfY29uZmlndXJhdGlvbl9idXR0b24uc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLmNvbmZpZ19idWlsZF9idXR0b24uc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisKKyAgICAgICAgc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnNldF9zZW5zaXRpdmUoc2Vuc2l0aXZlKQorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zZXRfc2Vuc2l0aXZlKHNlbnNpdGl2ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9kZXRhaWxzX3BhZ2Uuc2V0X3NlbnNpdGl2ZShzZW5zaXRpdmUpCisKKyAgICAgICAgaWYgc2Vuc2l0aXZlOgorICAgICAgICAgICAgc2VsZi53aW5kb3cuc2V0X2N1cnNvcihOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53aW5kb3cuc2V0X2N1cnNvcihndGsuZ2RrLkN1cnNvcihndGsuZ2RrLldBVENIKSkKKyAgICAgICAgc2VsZi5zZW5zaXRpdmUgPSBzZW5zaXRpdmUKKworCisgICAgZGVmIGhhbmRsZXJfZ2VuZXJhdGluZ19kYXRhX2NiKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBzZWxmLndpbmRvd19zZW5zaXRpdmUoRmFsc2UpCisKKyAgICBkZWYgaGFuZGxlcl9kYXRhX2dlbmVyYXRlZF9jYihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgc2VsZi53aW5kb3dfc2Vuc2l0aXZlKFRydWUpCisKKyAgICBkZWYgcmNwcGtnbGlzdF9wb3B1bGF0ZWQoc2VsZik6CisgICAgICAgIHNlbGVjdGVkX2ltYWdlID0gc2VsZi5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlCisgICAgICAgIHNlbGVjdGVkX3JlY2lwZXMgPSBzZWxmLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcmVjaXBlc1s6XQorICAgICAgICBzZWxlY3RlZF9wYWNrYWdlcyA9IHNlbGYuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlc1s6XQorICAgICAgICB1c2VyX3NlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5jb25maWd1cmF0aW9uLnVzZXJfc2VsZWN0ZWRfcGFja2FnZXNbOl0KKworICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfaW1hZ2VfY29tYm8oc2VsZi5yZWNpcGVfbW9kZWwsIHNlbGVjdGVkX2ltYWdlKQorICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfaW1hZ2VfZGVzYygpCisgICAgICAgIHNlbGYudXBkYXRlX3JlY2lwZV9tb2RlbChzZWxlY3RlZF9pbWFnZSwgc2VsZWN0ZWRfcmVjaXBlcykKKyAgICAgICAgc2VsZi51cGRhdGVfcGFja2FnZV9tb2RlbChzZWxlY3RlZF9wYWNrYWdlcywgdXNlcl9zZWxlY3RlZF9wYWNrYWdlcykKKworICAgIGRlZiByZWNpcGVsaXN0X2NoYW5nZWRfY2Ioc2VsZiwgcmVjaXBlX21vZGVsKToKKyAgICAgICAgc2VsZi5yZWNpcGVfZGV0YWlsc19wYWdlLnJlZnJlc2hfc2VsZWN0aW9uKCkKKworICAgIGRlZiBwYWNrYWdlbGlzdF9jaGFuZ2VkX2NiKHNlbGYsIHBhY2thZ2VfbW9kZWwpOgorICAgICAgICBzZWxmLnBhY2thZ2VfZGV0YWlsc19wYWdlLnJlZnJlc2hfc2VsZWN0aW9uKCkKKworICAgIGRlZiBoYW5kbGVyX3JlY2lwZV9wb3B1bGF0ZWRfY2Ioc2VsZiwgaGFuZGxlcik6CisgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9wcm9ncmVzc19iYXIoIlBvcHVsYXRpbmcgcmVjaXBlcyIsIDAuOTkpCisKKyAgICBkZWYgaGFuZGxlcl9wYWNrYWdlX3BvcHVsYXRlZF9jYihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcigiUG9wdWxhdGluZyBwYWNrYWdlcyIsIDEuMCkKKworICAgIGRlZiBoYW5kbGVyX3BhcnNpbmdfc3RhcnRlZF9jYihzZWxmLCBoYW5kbGVyLCBtZXNzYWdlKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgIT0gc2VsZi5SQ1BQS0dJTkZPX1BPUFVMQVRJTkc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmcmFjdGlvbiA9IDAKKyAgICAgICAgaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gIlRyZWVEYXRhUHJlcGFyYXRpb25TdGFydGVkIjoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gMC42ICsgZnJhY3Rpb24KKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnN0b3BfYnV0dG9uLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKCJHZW5lcmF0aW5nIGRlcGVuZGVuY3kgdHJlZSIsIGZyYWN0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2Uuc3RvcF9idXR0b24uc2V0X3NlbnNpdGl2ZShUcnVlKQorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcihtZXNzYWdlWyJ0aXRsZSJdLCBmcmFjdGlvbikKKworICAgIGRlZiBoYW5kbGVyX3BhcnNpbmdfY2Ioc2VsZiwgaGFuZGxlciwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwICE9IHNlbGYuUkNQUEtHSU5GT19QT1BVTEFUSU5HOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnJhY3Rpb24gPSBtZXNzYWdlWyJjdXJyZW50Il0gKiAxLjAvbWVzc2FnZVsidG90YWwiXQorICAgICAgICBpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAiVHJlZURhdGFQcmVwYXJhdGlvblByb2dyZXNzIjoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gMC42ICsgMC4zOCAqIGZyYWN0aW9uCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKCJHZW5lcmF0aW5nIGRlcGVuZGVuY3kgdHJlZSIsIGZyYWN0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjYgKiBmcmFjdGlvbgorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcihtZXNzYWdlWyJ0aXRsZSJdLCBmcmFjdGlvbikKKworICAgIGRlZiBoYW5kbGVyX3BhcnNpbmdfY29tcGxldGVkX2NiKHNlbGYsIGhhbmRsZXIsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCAhPSBzZWxmLlJDUFBLR0lORk9fUE9QVUxBVElORzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJUcmVlRGF0YVByZXBhcmF0aW9uQ29tcGxldGVkIjoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gMC45OAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjYKKyAgICAgICAgc2VsZi5pbWFnZV9jb25maWd1cmF0aW9uX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcigiR2VuZXJhdGluZyBkZXBlbmRlbmN5IHRyZWUiLCBmcmFjdGlvbikKKworICAgIGRlZiBoYW5kbGVyX2J1aWxkX3N0YXJ0ZWRfY2Ioc2VsZiwgcnVubmluZ19idWlsZCk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwCisgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgaWYgc2VsZi5wcmV2aW91c19zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC45CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMAorICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuUEFDS0FHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAwCisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnVwZGF0ZV9wcm9ncmVzc19iYXIoIkJ1aWxkIFN0YXJ0ZWQ6ICIsIGZyYWN0aW9uKQorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zaG93X2NvbmZpZ3VyYXRpb25zKHNlbGYuY29uZmlndXJhdGlvbiwgc2VsZi5wYXJhbWV0ZXJzKQorCisgICAgZGVmIGJ1aWxkX3N1Y2NlZWRlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBmcmFjdGlvbiA9IDAuOQorICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gMS4wCisgICAgICAgICAgICB2ZXJzaW9uID0gIiIKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5pbWFnZV9uYW1lcyA9IFtdCisgICAgICAgICAgICBzZWxlY3RlZF9pbWFnZSA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpCisgICAgICAgICAgICBpZiBzZWxlY3RlZF9pbWFnZSA9PSBzZWxmLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX2ltYWdlICE9IHNlbGVjdGVkX2ltYWdlOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X2N1c3RvbV9pbWFnZV92ZXJzaW9uKCkKKyAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IHNlbGYuaG9iX2ltYWdlICsgdmVyc2lvbiArICItIiArIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX21hY2gKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGlua25hbWUgPSBzZWxlY3RlZF9pbWFnZSArICctJyArIHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX21hY2gKKyAgICAgICAgICAgIGltYWdlX2V4dGVuc2lvbiA9IHNlbGYuZ2V0X2ltYWdlX2V4dGVuc2lvbigpCisgICAgICAgICAgICBmb3IgaW1hZ2VfdHlwZSBpbiBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfdHlwZXM6CisgICAgICAgICAgICAgICAgaWYgaW1hZ2VfdHlwZSBpbiBpbWFnZV9leHRlbnNpb246CisgICAgICAgICAgICAgICAgICAgIHJlYWxfdHlwZXMgPSBpbWFnZV9leHRlbnNpb25baW1hZ2VfdHlwZV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWFsX3R5cGVzID0gW2ltYWdlX3R5cGVdCisgICAgICAgICAgICAgICAgZm9yIHJlYWxfaW1hZ2VfdHlwZSBpbiByZWFsX3R5cGVzOgorICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IHNlbGYucGFyYW1ldGVycy5pbWFnZV9hZGRyICsgJy8nICsgbGlua25hbWUgKyAnLicgKyByZWFsX2ltYWdlX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobGlua3BhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJhbWV0ZXJzLmltYWdlX25hbWVzLmFwcGVuZChvcy5yZWFkbGluayhsaW5rcGF0aCkpCisgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBmcmFjdGlvbiA9IDEuMAorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS51cGRhdGVfcHJvZ3Jlc3NfYmFyKCJCdWlsZCBDb21wbGV0ZWQ6ICIsIGZyYWN0aW9uKQorICAgICAgICBzZWxmLmhhbmRsZXIuYnVpbGRfc3VjY2VlZGVkX2FzeW5jKCkKKyAgICAgICAgc2VsZi5zdG9wcGluZyA9IEZhbHNlCisKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBzZWxmLnN3aXRjaF9wYWdlKHNlbGYuUEFDS0FHRV9HRU5FUkFURUQpCisgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLklNQUdFX0dFTkVSQVRFRCkKKworICAgIGRlZiBidWlsZF9mYWlsZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RvcHBpbmc6CisgICAgICAgICAgICBzdGF0dXMgPSAic3RvcCIKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiQnVpbGQgc3RvcHBlZDogIgorICAgICAgICAgICAgZnJhY3Rpb24gPSBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5wcm9ncmVzc19iYXIuZ2V0X2ZyYWN0aW9uKCkKKyAgICAgICAgICAgIHN0b3BfdG9fbmV4dF9lZGl0ID0gIiIKKyAgICAgICAgICAgIGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuRkFTVF9JTUFHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIHN0b3BfdG9fbmV4dF9lZGl0ID0gImltYWdlIGNvbmZpZ3VyYXRpb24iCisgICAgICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnByZXZpb3VzX3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgICAgIHN0b3BfdG9fbmV4dF9lZGl0ID0gImltYWdlIGNvbmZpZ3VyYXRpb24iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RvcF90b19uZXh0X2VkaXQgPSAicGFja2FnZXMiCisgICAgICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuUEFDS0FHRV9HRU5FUkFUSU5HOgorICAgICAgICAgICAgICAgIHN0b3BfdG9fbmV4dF9lZGl0ID0gInJlY2lwZXMiCisgICAgICAgICAgICBidXR0b24gPSBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zaG93X3N0b3BfcGFnZShzdG9wX3RvX25leHRfZWRpdC5zcGxpdCgnICcpWzBdKQorICAgICAgICAgICAgc2VsZi5zZXRfZGVmYXVsdChidXR0b24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmYWlsX3RvX25leHRfZWRpdCA9ICIiCisgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICBmYWlsX3RvX25leHRfZWRpdCA9ICJpbWFnZSBjb25maWd1cmF0aW9uIgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC45CisgICAgICAgICAgICBlbGlmIHNlbGYuY3VycmVudF9zdGVwID09IHNlbGYuSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnByZXZpb3VzX3N0ZXAgPT0gc2VsZi5GQVNUX0lNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgICAgIGZhaWxfdG9fbmV4dF9lZGl0ID0gImltYWdlIGNvbmZpZ3VyYXRpb24iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmFpbF90b19uZXh0X2VkaXQgPSAicGFja2FnZXMiCisgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAxLjAKKyAgICAgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICAgICAgZmFpbF90b19uZXh0X2VkaXQgPSAicmVjaXBlcyIKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDEuMAorICAgICAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2Uuc2hvd19mYWlsX3BhZ2UoZmFpbF90b19uZXh0X2VkaXQuc3BsaXQoJyAnKVswXSkKKyAgICAgICAgICAgIHN0YXR1cyA9ICJmYWlsIgorICAgICAgICAgICAgbWVzc2FnZSA9ICJCdWlsZCBmYWlsZWQ6ICIKKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UudXBkYXRlX3Byb2dyZXNzX2JhcihtZXNzYWdlLCBmcmFjdGlvbiwgc3RhdHVzKQorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zaG93X2JhY2tfYnV0dG9uKCkKKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UuaGlkZV9zdG9wX2J1dHRvbigpCisgICAgICAgIHNlbGYuaGFuZGxlci5idWlsZF9mYWlsZWRfYXN5bmMoKQorICAgICAgICBzZWxmLnN0b3BwaW5nID0gRmFsc2UKKworICAgIGRlZiBoYW5kbGVyX2J1aWxkX3N1Y2NlZWRlZF9jYihzZWxmLCBydW5uaW5nX2J1aWxkKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RvcHBpbmc6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX3N1Y2NlZWRlZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX2ZhaWxlZCgpCisKKworICAgIGRlZiBoYW5kbGVyX2J1aWxkX2ZhaWxlZF9jYihzZWxmLCBydW5uaW5nX2J1aWxkKToKKyAgICAgICAgc2VsZi5idWlsZF9mYWlsZWQoKQorCisgICAgZGVmIGhhbmRsZXJfYnVpbGRfYWJvcnRlZF9jYihzZWxmLCBydW5uaW5nX2J1aWxkKToKKyAgICAgICAgc2VsZi5idWlsZF9mYWlsZWQoKQorCisgICAgZGVmIGhhbmRsZXJfbm9fcHJvdmlkZXJfY2Ioc2VsZiwgcnVubmluZ19idWlsZCwgbXNnKToKKyAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBnbGliLm1hcmt1cF9lc2NhcGVfdGV4dChtc2cpLCBndGsuTUVTU0FHRV9JTkZPKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBkaWFsb2cucnVuKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICBzZWxmLmJ1aWxkX2ZhaWxlZCgpCisKKyAgICBkZWYgaGFuZGxlcl90YXNrX3N0YXJ0ZWRfY2Ioc2VsZiwgcnVubmluZ19idWlsZCwgbWVzc2FnZSk6IAorICAgICAgICBmcmFjdGlvbiA9IG1lc3NhZ2VbImN1cnJlbnQiXSAqIDEuMC9tZXNzYWdlWyJ0b3RhbCJdCisgICAgICAgIHRpdGxlID0gIkJ1aWxkIHBhY2thZ2VzIgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgIGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJzY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgIGZyYWN0aW9uID0gMC4yNyAqIGZyYWN0aW9uCisgICAgICAgICAgICBlbGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJydW5RdWV1ZVRhc2tTdGFydGVkIjoKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMjcgKyAwLjYzICogZnJhY3Rpb24KKyAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc3RlcCA9PSBzZWxmLklNQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICB0aXRsZSA9ICJCdWlsZCBpbWFnZSIKKyAgICAgICAgICAgIGlmIHNlbGYucHJldmlvdXNfc3RlcCA9PSBzZWxmLkZBU1RfSU1BR0VfR0VORVJBVElORzoKKyAgICAgICAgICAgICAgICBpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAic2NlbmVRdWV1ZVRhc2tTdGFydGVkIjoKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjI3ICsgMC42MyArIDAuMDMgKiBmcmFjdGlvbgorICAgICAgICAgICAgICAgIGVsaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gInJ1blF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMjcgKyAwLjYzICsgMC4wMyArIDAuMDcgKiBmcmFjdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAic2NlbmVRdWV1ZVRhc2tTdGFydGVkIjoKKyAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb24gPSAwLjIgKiBmcmFjdGlvbgorICAgICAgICAgICAgICAgIGVsaWYgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPT0gInJ1blF1ZXVlVGFza1N0YXJ0ZWQiOgorICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMiArIDAuOCAqIGZyYWN0aW9uCisgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3N0ZXAgPT0gc2VsZi5QQUNLQUdFX0dFTkVSQVRJTkc6CisgICAgICAgICAgICBpZiBtZXNzYWdlWyJldmVudG5hbWUiXSA9PSAic2NlbmVRdWV1ZVRhc2tTdGFydGVkIjoKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMiAqIGZyYWN0aW9uCisgICAgICAgICAgICBlbGlmIG1lc3NhZ2VbImV2ZW50bmFtZSJdID09ICJydW5RdWV1ZVRhc2tTdGFydGVkIjoKKyAgICAgICAgICAgICAgICBmcmFjdGlvbiA9IDAuMiArIDAuOCAqIGZyYWN0aW9uCisgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnVwZGF0ZV9wcm9ncmVzc19iYXIodGl0bGUgKyAiOiAiLCBmcmFjdGlvbikKKyAgICAgICAgc2VsZi5idWlsZF9kZXRhaWxzX3BhZ2UudXBkYXRlX2J1aWxkX3N0YXR1cyhtZXNzYWdlWyJjdXJyZW50Il0sIG1lc3NhZ2VbInRvdGFsIl0sIG1lc3NhZ2VbInRhc2siXSkKKworICAgIGRlZiBoYW5kbGVyX2Rpc2tfZnVsbF9jYihzZWxmLCBydW5uaW5nX2J1aWxkKToKKyAgICAgICAgc2VsZi5kaXNrX2Z1bGwgPSBUcnVlCisKKyAgICBkZWYgaGFuZGxlcl9idWlsZF9mYWlsdXJlX2NiKHNlbGYsIHJ1bm5pbmdfYnVpbGQpOgorICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5zaG93X2lzc3VlcygpCisKKyAgICBkZWYgaGFuZGxlcl9idWlsZF9sb2dfY2Ioc2VsZiwgcnVubmluZ19idWlsZCwgZnVuYywgb2JqKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmxvZ2dlciwgZnVuYyk6CisgICAgICAgICAgICBnZXRhdHRyKHNlbGYubG9nZ2VyLCBmdW5jKShvYmopCisKKyAgICBkZWYgZGVzdHJveV93aW5kb3dfY2Ioc2VsZiwgd2lkZ2V0LCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLnNlbnNpdGl2ZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsaWYgc2VsZi5oYW5kbGVyLmJ1aWxkaW5nOgorICAgICAgICAgICAgc2VsZi5zdG9wX2J1aWxkKCkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBndGsubWFpbl9xdWl0KCkKKworICAgIGRlZiBldmVudF9oYW5kbGVfU0lHSU5UKHNlbGYsIHNpZ25hbCwgZnJhbWUpOgorICAgICAgICBmb3IgdyBpbiBndGsud2luZG93X2xpc3RfdG9wbGV2ZWxzKCk6CisgICAgICAgICAgICBpZiB3LmdldF9tb2RhbCgpOgorICAgICAgICAgICAgICAgIHcucmVzcG9uc2UoZ3RrLlJFU1BPTlNFX0RFTEVURV9FVkVOVCkKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIGRlZiBidWlsZF9wYWNrYWdlcyhzZWxmKToKKyAgICAgICAgXywgYWxsX3JlY2lwZXMgPSBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcmVjaXBlcygpCisgICAgICAgIGlmIG5vdCBhbGxfcmVjaXBlczoKKyAgICAgICAgICAgIGxibCA9ICI8Yj5ObyBzZWxlY3Rpb25zIG1hZGU8L2I+IgorICAgICAgICAgICAgbXNnID0gIllvdSBoYXZlIG5vdCBtYWRlIGFueSBzZWxlY3Rpb25zIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiBzbyB0aGVyZSBpc24ndCBhbnl0aGluZyB0byBiYWtlIGF0IHRoaXMgdGltZS4iCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfSU5GTywgbXNnKQorICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICBkaWFsb2cucnVuKCkKKyAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmdlbmVyYXRlX3BhY2thZ2VzX2FzeW5jKFRydWUpCisKKyAgICBkZWYgYnVpbGRfaW1hZ2Uoc2VsZik6CisgICAgICAgIHNlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5wYWNrYWdlX21vZGVsLmdldF9zZWxlY3RlZF9wYWNrYWdlcygpCisgICAgICAgIGlmIG5vdCBzZWxlY3RlZF9wYWNrYWdlczogICAgICAKKyAgICAgICAgICAgIGxibCA9ICI8Yj5ObyBzZWxlY3Rpb25zIG1hZGU8L2I+IgorICAgICAgICAgICAgbXNnID0gIllvdSBoYXZlIG5vdCBtYWRlIGFueSBzZWxlY3Rpb25zIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiBzbyB0aGVyZSBpc24ndCBhbnl0aGluZyB0byBiYWtlIGF0IHRoaXMgdGltZS4iCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfSU5GTywgbXNnKQorICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICBkaWFsb2cucnVuKCkKKyAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmdlbmVyYXRlX2ltYWdlX2FzeW5jKFRydWUpCisKKyAgICBkZWYganVzdF9iYWtlKHNlbGYpOgorICAgICAgICBzZWxlY3RlZF9pbWFnZSA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpCisgICAgICAgIHNlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5wYWNrYWdlX21vZGVsLmdldF9zZWxlY3RlZF9wYWNrYWdlcygpIG9yIFtdCisKKyAgICAgICAgIyBJZiBubyBiYXNlIGltYWdlIGFuZCBubyBzZWxlY3RlZCBwYWNrYWdlcyBkb24ndCBidWlsZCBhbnl0aGluZworICAgICAgICBpZiBub3QgKHNlbGVjdGVkX3BhY2thZ2VzIG9yIHNlbGVjdGVkX2ltYWdlICE9IHNlbGYucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX18pOgorICAgICAgICAgICAgbGJsID0gIjxiPk5vIHNlbGVjdGlvbnMgbWFkZTwvYj4iCisgICAgICAgICAgICBtc2cgPSAiWW91IGhhdmUgbm90IG1hZGUgYW55IHNlbGVjdGlvbnMiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHNvIHRoZXJlIGlzbid0IGFueXRoaW5nIHRvIGJha2UgYXQgdGhpcyB0aW1lLiIKKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9JTkZPLCBtc2cpCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5mYXN0X2dlbmVyYXRlX2ltYWdlX2FzeW5jKFRydWUpCisKKyAgICBkZWYgc2hvd19yZWNpcGVfcHJvcGVydHlfZGlhbG9nKHNlbGYsIHByb3BlcnRpZXMpOgorICAgICAgICBpbmZvcm1hdGlvbiA9IHt9CisgICAgICAgIGRpYWxvZyA9IFByb3BlcnR5RGlhbG9nKHRpdGxlID0gcHJvcGVydGllc1sibmFtZSJdICsnICcrICJwcm9wZXJ0aWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uID0gcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorCisgICAgICAgIGRpYWxvZy5zZXRfbW9kYWwoRmFsc2UpCisKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBsYW1iZGEgdzogZGlhbG9nLmRlc3Ryb3koKSkKKworICAgICAgICBkaWFsb2cucnVuKCkKKworICAgIGRlZiBzaG93X3BhY2thZ2VzX3Byb3BlcnR5X2RpYWxvZyhzZWxmLCBwcm9wZXJ0aWVzKToKKyAgICAgICAgaW5mb3JtYXRpb24gPSB7fQorICAgICAgICBkaWFsb2cgPSBQcm9wZXJ0eURpYWxvZyh0aXRsZSA9IHByb3BlcnRpZXNbIm5hbWUiXSArJyAnKyAicHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiA9IHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX05PX1NFUEFSQVRPUikKKworICAgICAgICBkaWFsb2cuc2V0X21vZGFsKEZhbHNlKQorCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgbGFtYmRhIHc6IGRpYWxvZy5kZXN0cm95KCkpCisKKyAgICAgICAgZGlhbG9nLnJ1bigpCisKKyAgICBkZWYgc2hvd19sYXllcl9zZWxlY3Rpb25fZGlhbG9nKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBMYXllclNlbGVjdGlvbkRpYWxvZyh0aXRsZSA9ICJMYXllcnMiLAorICAgICAgICAgICAgICAgICAgICAgbGF5ZXJzID0gY29weS5kZWVwY29weShzZWxmLmNvbmZpZ3VyYXRpb24ubGF5ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgIGxheWVyc19ub25fcmVtb3ZhYmxlID0gY29weS5kZWVwY29weShzZWxmLmNvbmZpZ3VyYXRpb24ubGF5ZXJzX25vbl9yZW1vdmFibGUpLAorICAgICAgICAgICAgICAgICAgICAgYWxsX2xheWVycyA9IHNlbGYucGFyYW1ldGVycy5hbGxfbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19NT0RBTAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX05PX1NFUEFSQVRPUikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNhbmNlbCIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJPSyIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmxheWVycyA9IGRpYWxvZy5sYXllcnMKKyAgICAgICAgICAgICMgRE8gcmVmcmVzaCBsYXllcnMKKyAgICAgICAgICAgIGlmIGRpYWxvZy5sYXllcnNfY2hhbmdlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9jb25maWdfYXN5bmMoKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgZ2V0X2ltYWdlX2V4dGVuc2lvbihzZWxmKToKKyAgICAgICAgaW1hZ2VfZXh0ZW5zaW9uID0ge30KKyAgICAgICAgZm9yIHR5cGUgaW4gc2VsZi5wYXJhbWV0ZXJzLmltYWdlX3R5cGVzOgorICAgICAgICAgICAgZXh0ID0gc2VsZi5oYW5kbGVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJJTUFHRV9FWFRFTlNJT05fJXMiICUgdHlwZV0pCisgICAgICAgICAgICBpZiBleHQ6CisgICAgICAgICAgICAgICAgaW1hZ2VfZXh0ZW5zaW9uW3R5cGVdID0gZXh0LnNwbGl0KCcgJykKKworICAgICAgICByZXR1cm4gaW1hZ2VfZXh0ZW5zaW9uCisKKyAgICBkZWYgc2hvd19sb2FkX215X2ltYWdlc19kaWFsb2coc2VsZik6CisgICAgICAgIGltYWdlX2V4dGVuc2lvbiA9IHNlbGYuZ2V0X2ltYWdlX2V4dGVuc2lvbigpCisgICAgICAgIGRpYWxvZyA9IEltYWdlU2VsZWN0aW9uRGlhbG9nKHNlbGYucGFyYW1ldGVycy5pbWFnZV9hZGRyLCBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcGVuIE15IEltYWdlcyIsIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuRklMRV9DSE9PU0VSX0FDVElPTl9TQVZFLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZXh0ZW5zaW9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIk9wZW4iLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIGlmIG5vdCBkaWFsb2cuaW1hZ2VfbmFtZXM6CisgICAgICAgICAgICAgICAgbGJsID0gIjxiPk5vIHNlbGVjdGlvbnMgbWFkZTwvYj4iCisgICAgICAgICAgICAgICAgbXNnID0gIllvdSBoYXZlIG5vdCBtYWRlIGFueSBzZWxlY3Rpb25zIgorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfSU5GTywgbXNnKQorICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGNydW1ic19kaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5ydW4oKQorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cuZGVzdHJveSgpCisgICAgICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfYWRkciA9IGRpYWxvZy5pbWFnZV9mb2xkZXIKKyAgICAgICAgICAgIHNlbGYucGFyYW1ldGVycy5pbWFnZV9uYW1lcyA9IGRpYWxvZy5pbWFnZV9uYW1lc1s6XQorICAgICAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLk1ZX0lNQUdFX09QRU5FRCkKKworICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgc2hvd19hZHZfc2V0dGluZ3NfZGlhbG9nKHNlbGYsIHRhYj1Ob25lKToKKyAgICAgICAgZGlhbG9nID0gQWR2YW5jZWRTZXR0aW5nc0RpYWxvZyh0aXRsZSA9ICJBZHZhbmNlZCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBjb3B5LmRlZXBjb3B5KHNlbGYuY29uZmlndXJhdGlvbiksCisgICAgICAgICAgICBhbGxfaW1hZ2VfdHlwZXMgPSBzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfdHlwZXMsCisgICAgICAgICAgICBhbGxfcGFja2FnZV9mb3JtYXRzID0gc2VsZi5wYXJhbWV0ZXJzLmFsbF9wYWNrYWdlX2Zvcm1hdHMsCisgICAgICAgICAgICBhbGxfZGlzdHJvcyA9IHNlbGYucGFyYW1ldGVycy5hbGxfZGlzdHJvcywKKyAgICAgICAgICAgIGFsbF9zZGtfbWFjaGluZXMgPSBzZWxmLnBhcmFtZXRlcnMuYWxsX3Nka19tYWNoaW5lcywKKyAgICAgICAgICAgIG1heF90aHJlYWRzID0gc2VsZi5wYXJhbWV0ZXJzLm1heF90aHJlYWRzLAorICAgICAgICAgICAgcGFyZW50ID0gc2VsZiwKKyAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIlNhdmUiLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgZGlhbG9nLnNldF9zYXZlX2J1dHRvbihidXR0b24pCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIHNldHRpbmdzX2NoYW5nZWQgPSBGYWxzZQorICAgICAgICBpZiByZXNwb25zZSA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gZGlhbG9nLmNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zYXZlKHNlbGYuaGFuZGxlciwgVHJ1ZSkgIyByZW1lbWJlciBzZXR0aW5ncworICAgICAgICAgICAgc2V0dGluZ3NfY2hhbmdlZCA9IGRpYWxvZy5zZXR0aW5nc19jaGFuZ2VkCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9ZRVMsIHNldHRpbmdzX2NoYW5nZWQKKworICAgIGRlZiBzaG93X3NpbXBsZV9zZXR0aW5nc19kaWFsb2coc2VsZiwgdGFiPU5vbmUpOgorICAgICAgICBkaWFsb2cgPSBTaW1wbGVTZXR0aW5nc0RpYWxvZyh0aXRsZSA9ICJTZXR0aW5ncyIsCisgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gY29weS5kZWVwY29weShzZWxmLmNvbmZpZ3VyYXRpb24pLAorICAgICAgICAgICAgYWxsX2ltYWdlX3R5cGVzID0gc2VsZi5wYXJhbWV0ZXJzLmltYWdlX3R5cGVzLAorICAgICAgICAgICAgYWxsX3BhY2thZ2VfZm9ybWF0cyA9IHNlbGYucGFyYW1ldGVycy5hbGxfcGFja2FnZV9mb3JtYXRzLAorICAgICAgICAgICAgYWxsX2Rpc3Ryb3MgPSBzZWxmLnBhcmFtZXRlcnMuYWxsX2Rpc3Ryb3MsCisgICAgICAgICAgICBhbGxfc2RrX21hY2hpbmVzID0gc2VsZi5wYXJhbWV0ZXJzLmFsbF9zZGtfbWFjaGluZXMsCisgICAgICAgICAgICBtYXhfdGhyZWFkcyA9IHNlbGYucGFyYW1ldGVycy5tYXhfdGhyZWFkcywKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYsCisgICAgICAgICAgICBmbGFncyA9IGd0ay5ESUFMT0dfTU9EQUwKKyAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQKKyAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX05PX1NFUEFSQVRPUiwKKyAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmhhbmRsZXIpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiU2F2ZSIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBpZiB0YWI6CisgICAgICAgICAgICBkaWFsb2cuc3dpdGNoX3RvX3BhZ2UodGFiKQorICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICBzZXR0aW5nc19jaGFuZ2VkID0gRmFsc2UKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbiA9IGRpYWxvZy5jb25maWd1cmF0aW9uCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2F2ZShzZWxmLmhhbmRsZXIsIFRydWUpICMgcmVtZW1iZXIgc2V0dGluZ3MKKyAgICAgICAgICAgIHNldHRpbmdzX2NoYW5nZWQgPSBkaWFsb2cuc2V0dGluZ3NfY2hhbmdlZAorICAgICAgICAgICAgaWYgZGlhbG9nLnByb3h5X3NldHRpbmdzX2NoYW5nZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfdXNlcl9jb25maWdfcHJveGllcygpCisgICAgICAgIGVsaWYgZGlhbG9nLnByb3h5X3Rlc3RfcmFuOgorICAgICAgICAgICAgIyBUaGUgdXNlciBtaWdodCBoYXZlIG1vZGlmaWVkIHRoZSBwcm94aWVzIGluIHRoZSAiUHJveHkiCisgICAgICAgICAgICAjIHRhYiwgd2hpY2ggaW4gdHVybiBtYWRlIHRoZSBwcm94eSBzZXR0aW5ncyBtb2RpZnkgaW4gYmIuCisgICAgICAgICAgICAjIElmICJDYW5jZWwiIHdhcyBwcmVzc2VkLCByZXN0b3JlIHRoZSBwcmV2aW91cyBwcm94eQorICAgICAgICAgICAgIyBzZXR0aW5ncyBpbnNpZGUgYmIuCisgICAgICAgICAgICBzZWxmLnNldF91c2VyX2NvbmZpZ19wcm94aWVzKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICByZXR1cm4gcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUywgc2V0dGluZ3NfY2hhbmdlZAorCisgICAgZGVmIHJlcGFyc2VfcG9zdF9hZHZfc2V0dGluZ3Moc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9tYWNoOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfY29uZmlnX2FzeW5jKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5jbGVhcl9zZWxlY3Rpb24oKQorICAgICAgICAgICAgIyBETyByZXBhcnNlIHJlY2lwZXMKKyAgICAgICAgICAgIHNlbGYucG9wdWxhdGVfcmVjaXBlX3BhY2thZ2VfaW5mb19hc3luYygpCisKKyAgICBkZWYgZGVwbG95X2ltYWdlKHNlbGYsIGltYWdlX25hbWUpOgorICAgICAgICBpZiBub3QgaW1hZ2VfbmFtZToKKyAgICAgICAgICAgIGxibCA9ICI8Yj5QbGVhc2Ugc2VsZWN0IGFuIGltYWdlIHRvIGRlcGxveS48L2I+IgorICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX0lORk8pCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1hZ2VfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhcmFtZXRlcnMuaW1hZ2VfYWRkciwgaW1hZ2VfbmFtZSkKKyAgICAgICAgZGlhbG9nID0gRGVwbG95SW1hZ2VEaWFsb2codGl0bGUgPSAiVXNiIEltYWdlIE1ha2VyIiwKKyAgICAgICAgICAgIGltYWdlX3BhdGggPSBpbWFnZV9wYXRoLAorICAgICAgICAgICAgcGFyZW50ID0gc2VsZiwKKyAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiTWFrZSB1c2IgaW1hZ2UiLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIHNob3dfbG9hZF9rZXJuZWxfZGlhbG9nKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBndGsuRmlsZUNob29zZXJEaWFsb2coIkxvYWQgS2VybmVsIEZpbGVzIiwgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5GSUxFX0NIT09TRVJfQUNUSU9OX1NBVkUpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfTk8pCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiT3BlbiIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBmaWx0ZXIgPSBndGsuRmlsZUZpbHRlcigpCisgICAgICAgIGZpbHRlci5zZXRfbmFtZSgiS2VybmVsIEZpbGVzIikKKyAgICAgICAgZmlsdGVyLmFkZF9wYXR0ZXJuKCIqLmJpbiIpCisgICAgICAgIGRpYWxvZy5hZGRfZmlsdGVyKGZpbHRlcikKKworICAgICAgICBkaWFsb2cuc2V0X2N1cnJlbnRfZm9sZGVyKHNlbGYucGFyYW1ldGVycy5pbWFnZV9hZGRyKQorCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGtlcm5lbF9wYXRoID0gIiIKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIGtlcm5lbF9wYXRoID0gZGlhbG9nLmdldF9maWxlbmFtZSgpCisKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgICAgIHJldHVybiBrZXJuZWxfcGF0aAorCisgICAgZGVmIHJ1bnFlbXVfaW1hZ2Uoc2VsZiwgaW1hZ2VfbmFtZSwga2VybmVsX25hbWUpOgorICAgICAgICBpZiBub3QgaW1hZ2VfbmFtZSBvciBub3Qga2VybmVsX25hbWU6CisgICAgICAgICAgICBsYmwgPSAiPGI+UGxlYXNlIHNlbGVjdCAlcyB0byBsYXVuY2ggaW4gUUVNVS48L2I+IiAlICgiYSBrZXJuZWwiIGlmIGltYWdlX25hbWUgZWxzZSAiYW4gaW1hZ2UiKQorICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX0lORk8pCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAga2VybmVsX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXJhbWV0ZXJzLmltYWdlX2FkZHIsIGtlcm5lbF9uYW1lKQorICAgICAgICBpbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGFyYW1ldGVycy5pbWFnZV9hZGRyLCBpbWFnZV9uYW1lKQorCisgICAgICAgIHNvdXJjZV9lbnZfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhcmFtZXRlcnMuY29yZV9iYXNlLCAib2UtaW5pdC1idWlsZC1lbnYiKQorICAgICAgICB0bXBfcGF0aCA9IHNlbGYucGFyYW1ldGVycy50bXBkaXIKKyAgICAgICAgY21kbGluZSA9IGJiLnVpLmNydW1icy51dGlscy53aGljaF90ZXJtaW5hbCgpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGltYWdlX3BhdGgpIGFuZCBvcy5wYXRoLmV4aXN0cyhrZXJuZWxfcGF0aCkgXAorICAgICAgICAgICBhbmQgb3MucGF0aC5leGlzdHMoc291cmNlX2Vudl9wYXRoKSBhbmQgb3MucGF0aC5leGlzdHModG1wX3BhdGgpIFwKKyAgICAgICAgICAgYW5kIGNtZGxpbmU6CisgICAgICAgICAgICBjbWRsaW5lICs9ICJcJyBiYXNoIC1jIFwiZXhwb3J0IE9FX1RNUERJUj0iICsgdG1wX3BhdGggKyAiOyAiCisgICAgICAgICAgICBjbWRsaW5lICs9ICJzb3VyY2UgIiArIHNvdXJjZV9lbnZfcGF0aCArICIgIiArIG9zLmdldGN3ZCgpICsgIjsgIgorICAgICAgICAgICAgY21kbGluZSArPSAicnVucWVtdSAiICsga2VybmVsX3BhdGggKyAiICIgKyBpbWFnZV9wYXRoICsgIlwiXCciCisgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuKHNobGV4LnNwbGl0KGNtZGxpbmUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGJsID0gIjxiPlBhdGggZXJyb3I8L2I+IgorICAgICAgICAgICAgbXNnID0gIk9uZSBvZiB5b3VyIHBhdGhzIGlzIHdyb25nLCIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgcGxlYXNlIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHBhdGhzIGV4aXN0OlxuIgorICAgICAgICAgICAgbXNnID0gbXNnICsgImltYWdlIHBhdGg6IiArIGltYWdlX3BhdGggKyAiXG4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAia2VybmVsIHBhdGg6IiArIGtlcm5lbF9wYXRoICsgIlxuIgorICAgICAgICAgICAgbXNnID0gbXNnICsgInNvdXJjZSBlbnZpcm9ubWVudCBwYXRoOiIgKyBzb3VyY2VfZW52X3BhdGggKyAiXG4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAidG1wIHBhdGg6ICIgKyB0bXBfcGF0aCArICIuIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIllvdSBtYXkgYmUgbWlzc2luZyBlaXRoZXIgeHRlcm0gb3IgdnRlIGZvciB0ZXJtaW5hbCBzZXJ2aWNlcy4iCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfRVJST1IsIG1zZykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgc2hvd19wYWNrYWdlcyhzZWxmKToKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbHNfcGFnZS5yZWZyZXNoX3RhYmxlcygpCisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5QQUNLQUdFX1NFTEVDVElPTikKKworICAgIGRlZiBzaG93X3JlY2lwZXMoc2VsZik6CisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5SRUNJUEVfU0VMRUNUSU9OKQorCisgICAgZGVmIHNob3dfaW1hZ2VfZGV0YWlscyhzZWxmKToKKyAgICAgICAgc2VsZi5zd2l0Y2hfcGFnZShzZWxmLklNQUdFX0dFTkVSQVRFRCkKKworICAgIGRlZiBzaG93X2NvbmZpZ3VyYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuc3dpdGNoX3BhZ2Uoc2VsZi5CQVNFSU1HX1NFTEVDVEVEKQorCisgICAgZGVmIHN0b3BfYnVpbGQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RvcHBpbmc6CisgICAgICAgICAgICBsYmwgPSAiPGI+Rm9yY2UgU3RvcCBidWlsZD88L2I+IgorICAgICAgICAgICAgbXNnID0gIllvdSd2ZSBhbHJlYWR5IHNlbGVjdGVkIFN0b3Agb25jZSwiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHdvdWxkIHlvdSBsaWtlIHRvICdGb3JjZSBTdG9wJyB0aGUgYnVpbGQ/XG5cbiIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICJUaGlzIHdpbGwgc3RvcCB0aGUgYnVpbGQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSBidXQgbWF5IgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiB3ZWxsIGxlYXZlIHlvdXIgYnVpbGQgZGlyZWN0b3J5IGluIGFuICB1bnVzYWJsZSBzdGF0ZSIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgdGhhdCByZXF1aXJlcyBtYW51YWwgc3RlcHMgdG8gZml4LiIKKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9XQVJOSU5HLCBtc2cpCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX0NBTkNFTCkKKyAgICAgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkZvcmNlIFN0b3AiLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYmwgPSAiPGI+U3RvcCBidWlsZD88L2I+IgorICAgICAgICAgICAgbXNnID0gIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBzdG9wIHRoaXMiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIGJ1aWxkP1xuXG4nU3RvcCcgd2lsbCBzdG9wIHRoZSBidWlsZCBhcyBzb29uIGFzIGFsbCBpbiIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgcHJvZ3Jlc3MgYnVpbGQgdGFza3MgYXJlIGZpbmlzaGVkLiBIb3dldmVyIGlmIGEiCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIGxlbmd0aHkgY29tcGlsYXRpb24gcGhhc2UgaXMgaW4gcHJvZ3Jlc3MgdGhpcyBtYXkgdGFrZSIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgc29tZSB0aW1lLlxuXG4iCisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiJ0ZvcmNlIFN0b3AnIHdpbGwgc3RvcCB0aGUgYnVpbGQgYXMgcXVpY2tseSBhcyIKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgcG9zc2libGUgYnV0IG1heSB3ZWxsIGxlYXZlIHlvdXIgYnVpbGQgZGlyZWN0b3J5IGluIGFuIgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiB1bnVzYWJsZSBzdGF0ZSB0aGF0IHJlcXVpcmVzIG1hbnVhbCBzdGVwcyB0byBmaXguIgorICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX1dBUk5JTkcsIG1zZykKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDYW5jZWwiLCBndGsuUkVTUE9OU0VfQ0FOQ0VMKQorICAgICAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiRm9yY2Ugc3RvcCIsIGd0ay5SRVNQT05TRV9ZRVMpCisgICAgICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJTdG9wIiwgZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgaWYgcmVzcG9uc2UgIT0gZ3RrLlJFU1BPTlNFX0NBTkNFTDoKKyAgICAgICAgICAgIHNlbGYuc3RvcHBpbmcgPSBUcnVlCisgICAgICAgIGlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9PSzoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZGV0YWlsc19wYWdlLnByb2dyZXNzX2Jhci5zZXRfc3RvcF90aXRsZSgiU3RvcHBpbmcgdGhlIGJ1aWxkLi4uLiIpCisgICAgICAgICAgICBzZWxmLmJ1aWxkX2RldGFpbHNfcGFnZS5wcm9ncmVzc19iYXIuc2V0X3Jjc3R5bGUoInN0b3AiKQorICAgICAgICAgICAgc2VsZi5jYW5jZWxfYnVpbGRfc3luYygpCisgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIHNlbGYuY2FuY2VsX2J1aWxkX3N5bmMoVHJ1ZSkKKworICAgIGRlZiBkb19sb2coc2VsZiwgY29uc29sZWxvZ2ZpbGUgPSBOb25lKToKKyAgICAgICAgaWYgY29uc29sZWxvZ2ZpbGU6CisgICAgICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKGNvbnNvbGVsb2dmaWxlKSkKKyAgICAgICAgICAgIGlmIHNlbGYuY29uc29sZWxvZzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5yZW1vdmVIYW5kbGVyKHNlbGYuY29uc29sZWxvZykKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnNvbGVsb2cgPSBOb25lCisgICAgICAgICAgICBzZWxmLmNvbnNvbGVsb2cgPSBsb2dnaW5nLkZpbGVIYW5kbGVyKGNvbnNvbGVsb2dmaWxlKQorICAgICAgICAgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoc2VsZi5jb25zb2xlbG9nKQorICAgICAgICAgICAgZm9ybWF0ID0gYmIubXNnLkJCTG9nRm9ybWF0dGVyKCIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpCisgICAgICAgICAgICBzZWxmLmNvbnNvbGVsb2cuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKKworICAgICAgICAgICAgc2VsZi5sb2dnZXIuYWRkSGFuZGxlcihzZWxmLmNvbnNvbGVsb2cpCisKKyAgICBkZWYgZ2V0X3RvcGRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlci5nZXRfdG9wZGlyKCkKKworICAgIGRlZiB3YWl0KHNlbGYsIGRlbGF5KToKKyAgICAgICAgdGltZV9zdGFydCA9IHRpbWUudGltZSgpCisgICAgICAgIHRpbWVfZW5kID0gdGltZV9zdGFydCArIGRlbGF5CisgICAgICAgIHdoaWxlIHRpbWVfZW5kID4gdGltZS50aW1lKCk6CisgICAgICAgICAgICB3aGlsZSBndGsuZXZlbnRzX3BlbmRpbmcoKToKKyAgICAgICAgICAgICAgICBndGsubWFpbl9pdGVyYXRpb24oKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2J1aWxkbWFuYWdlci5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZG1hbmFnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1OGQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9idWlsZG1hbmFnZXIucHkKQEAgLTAsMCArMSw0NTUgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAwOCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgUm9iIEJyYWRmb3JkIDxyb2JAbGludXguaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBvcworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgdGltZQorCitjbGFzcyBCdWlsZENvbmZpZ3VyYXRpb246CisgICAgIiIiIFJlcHJlc2VudHMgYSBwb3RlbnRpYWwgKm9yKiBoaXN0b3JpYyAqb3IqIGNvbmNyZXRlIGJ1aWxkLiBJdAorICAgIGVuY29tcGFzc2VzIGFsbCB0aGUgdGhpbmdzIHRoYXQgd2UgbmVlZCB0byB0ZWxsIGJpdGJha2UgdG8gZG8gdG8gbWFrZSBpdAorICAgIGJ1aWxkIHdoYXQgd2Ugd2FudCBpdCB0byBidWlsZC4KKworICAgIEl0IGFsc28gc3RvcmVkIHRoZSBtZXRhZGF0YSBVUkwgYW5kIHRoZSBzZXQgb2YgcG9zc2libGUgbWFjaGluZXMgKGFuZCB0aGUKKyAgICBkaXN0cm9zIC8gaW1hZ2VzIC8gdXJpcyBmb3IgdGhlc2UuIEFwYXJ0IGZyb20gdGhlIG1ldGRhdGEgVVJMIHRoZXNlIGFyZQorICAgIG5vdCBzZXJpYWxpc2VkIHRvIGZpbGUgKHNpbmNlIHRoZXkgbWF5IGJlIHRyYW5zaWVudCkuIEluIHNvbWUgd2F5cyB0aGlzCisgICAgZnVuY3Rpb25hbGl0eSBtaWdodCBiZSBzaGlmdGVkIHRvIHRoZSBsb2FkZXIgY2xhc3MuIiIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBzZWxmLm1ldGFkYXRhX3VybCA9IE5vbmUKKworICAgICAgICAjIFR1cGxlIG9mIChkaXN0cm9zLCBpbWFnZSwgdXJscykKKyAgICAgICAgc2VsZi5tYWNoaW5lX29wdGlvbnMgPSB7fQorCisgICAgICAgIHNlbGYubWFjaGluZSA9IE5vbmUKKyAgICAgICAgc2VsZi5kaXN0cm8gPSBOb25lCisgICAgICAgIHNlbGYuaW1hZ2UgPSBOb25lCisgICAgICAgIHNlbGYudXJscyA9IFtdCisgICAgICAgIHNlbGYuZXh0cmFfdXJscyA9IFtdCisgICAgICAgIHNlbGYuZXh0cmFfcGtncyA9IFtdCisKKyAgICBkZWYgZ2V0X21hY2hpbmVzX21vZGVsIChzZWxmKToKKyAgICAgICAgbW9kZWwgPSBndGsuTGlzdFN0b3JlIChnb2JqZWN0LlRZUEVfU1RSSU5HKQorICAgICAgICBmb3IgbWFjaGluZSBpbiBzZWxmLm1hY2hpbmVfb3B0aW9ucy5rZXlzKCk6CisgICAgICAgICAgICBtb2RlbC5hcHBlbmQgKFttYWNoaW5lXSkKKworICAgICAgICByZXR1cm4gbW9kZWwKKworICAgIGRlZiBnZXRfZGlzdHJvX2FuZF9pbWFnZXNfbW9kZWxzIChzZWxmLCBtYWNoaW5lKToKKyAgICAgICAgZGlzdHJvX21vZGVsID0gZ3RrLkxpc3RTdG9yZSAoZ29iamVjdC5UWVBFX1NUUklORykKKworICAgICAgICBmb3IgZGlzdHJvIGluIHNlbGYubWFjaGluZV9vcHRpb25zW21hY2hpbmVdWzBdOgorICAgICAgICAgICAgZGlzdHJvX21vZGVsLmFwcGVuZCAoW2Rpc3Ryb10pCisKKyAgICAgICAgaW1hZ2VfbW9kZWwgPSBndGsuTGlzdFN0b3JlIChnb2JqZWN0LlRZUEVfU1RSSU5HKQorCisgICAgICAgIGZvciBpbWFnZSBpbiBzZWxmLm1hY2hpbmVfb3B0aW9uc1ttYWNoaW5lXVsxXToKKyAgICAgICAgICAgIGltYWdlX21vZGVsLmFwcGVuZCAoW2ltYWdlXSkKKworICAgICAgICByZXR1cm4gKGRpc3Ryb19tb2RlbCwgaW1hZ2VfbW9kZWwpCisKKyAgICBkZWYgZ2V0X3JlcG9zIChzZWxmKToKKyAgICAgICAgc2VsZi51cmxzID0gc2VsZi5tYWNoaW5lX29wdGlvbnNbc2VsZi5tYWNoaW5lXVsyXQorICAgICAgICByZXR1cm4gc2VsZi51cmxzCisKKyAgICAjIEl0IG1pZ2h0IGJlIGEgbG90IGxvdCBiZXR0ZXIgaWYgd2Ugc3RvcmVkIHRoZXNlIGluIGxpa2UsIGJpdGJha2UgY29uZgorICAgICMgZmlsZSBmb3JtYXQuCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBsb2FkX2Zyb21fZmlsZSAoZmlsZW5hbWUpOgorCisgICAgICAgIGNvbmYgPSBCdWlsZENvbmZpZ3VyYXRpb24oKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyIikgYXMgZjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgZGF0YSA9IGxpbmUuc3BsaXQgKCI7IilbMV0KKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoICgibWV0YWRhdGEtdXJsOyIpKToKKyAgICAgICAgICAgICAgICAgICAgY29uZi5tZXRhZGF0YV91cmwgPSBkYXRhLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHN3aXRoICgidXJsOyIpKToKKyAgICAgICAgICAgICAgICAgICAgY29uZi51cmxzICs9IFtkYXRhLnN0cmlwKCldCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzd2l0aCAoImV4dHJhLXVybDsiKSk6CisgICAgICAgICAgICAgICAgICAgIGNvbmYuZXh0cmFfdXJscyArPSBbZGF0YS5zdHJpcCgpXQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c3dpdGggKCJtYWNoaW5lOyIpKToKKyAgICAgICAgICAgICAgICAgICAgY29uZi5tYWNoaW5lID0gZGF0YS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzd2l0aCAoImRpc3RyaWJ1dGlvbjsiKSk6CisgICAgICAgICAgICAgICAgICAgIGNvbmYuZGlzdHJvID0gZGF0YS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzd2l0aCAoImltYWdlOyIpKToKKyAgICAgICAgICAgICAgICAgICAgY29uZi5pbWFnZSA9IGRhdGEuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHJldHVybiBjb25mCisKKyAgICAjIFNlcmlhbGlzZSB0byBhIGZpbGUuIFRoaXMgaXMgcGFydCBvZiB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgd2UgdXNlIHRoaXMKKyAgICAjIHRvIGJlIGFibGUgdG8gcmVwZWF0IGEgZ2l2ZW4gYnVpbGQgKHVzaW5nIHRoZSBzYW1lIHNldCBvZiBwYXJhbWV0ZXJzKQorICAgICMgYnV0IGFsc28gc28gdGhhdCB3ZSBjYW4gaW5jbHVkZSB0aGUgZGV0YWlscyBvZiB0aGUgaW1hZ2UgLyBtYWNoaW5lIC8KKyAgICAjIGRpc3RybyBpbiB0aGUgYnVpbGQgbWFuYWdlciB0cmVlIHZpZXcuCisgICAgZGVmIHdyaXRlX3RvX2ZpbGUgKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZiA9IG9wZW4gKGZpbGVuYW1lLCAidyIpCisKKyAgICAgICAgbGluZXMgPSBbXQorCisgICAgICAgIGlmIChzZWxmLm1ldGFkYXRhX3VybCk6CisgICAgICAgICAgICBsaW5lcyArPSBbIm1ldGFkYXRhLXVybDslc1xuIiAlIChzZWxmLm1ldGFkYXRhX3VybCldCisKKyAgICAgICAgZm9yIHVybCBpbiBzZWxmLnVybHM6CisgICAgICAgICAgICBsaW5lcyArPSBbInVybDslc1xuIiAlICh1cmwpXQorCisgICAgICAgIGZvciB1cmwgaW4gc2VsZi5leHRyYV91cmxzOgorICAgICAgICAgICAgbGluZXMgKz0gWyJleHRyYS11cmw7JXNcbiIgJSAodXJsKV0KKworICAgICAgICBpZiAoc2VsZi5tYWNoaW5lKToKKyAgICAgICAgICAgIGxpbmVzICs9IFsibWFjaGluZTslc1xuIiAlIChzZWxmLm1hY2hpbmUpXQorCisgICAgICAgIGlmIChzZWxmLmRpc3Rybyk6CisgICAgICAgICAgICBsaW5lcyArPSBbImRpc3RyaWJ1dGlvbjslc1xuIiAlIChzZWxmLmRpc3RybyldCisKKyAgICAgICAgaWYgKHNlbGYuaW1hZ2UpOgorICAgICAgICAgICAgbGluZXMgKz0gWyJpbWFnZTslc1xuIiAlIChzZWxmLmltYWdlKV0KKworICAgICAgICBmLndyaXRlbGluZXMgKGxpbmVzKQorICAgICAgICBmLmNsb3NlICgpCisKK2NsYXNzIEJ1aWxkUmVzdWx0KGdvYmplY3QuR09iamVjdCk6CisgICAgIiIiIFJlcHJlc2VudHMgYW4gaGlzdG9yaWMgYnVpbGQuIFBlcmhhcHMgbm90IHN1Y2Nlc3NmdWwuIEJ1dCBpdCBpbmNsdWRlcworICAgIHRoaW5ncyBzdWNoIGFzIHRoZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgZGlyZWN0b3J5ICh0aGUgb3V0cHV0IGZyb20gdGhlCisgICAgYnVpbGQpIGFzIHdlbGwgYXMgYSBkZXNlcmlhbGlzZWQgQnVpbGRDb25maWd1cmF0aW9uIGZpbGUgdGhhdCBpcyBzdG9yZWQgaW4KKyAgICAiLmNvbmYiIGluIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBidWlsZC4KKworICAgIFRoaXMgaXMgR09iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgVHJlZVN0b3JlLiIiIgorCisgICAgKFNUQVRFX0NPTVBMRVRFLCBTVEFURV9GQUlMRUQsIFNUQVRFX09OR09JTkcpID0gXAorICAgICAgICAoMCwgMSwgMikKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgcGFyZW50LCBpZGVudGlmaWVyKToKKyAgICAgICAgZ29iamVjdC5HT2JqZWN0Ll9faW5pdF9fIChzZWxmKQorICAgICAgICBzZWxmLmRhdGUgPSBOb25lCisKKyAgICAgICAgc2VsZi5maWxlcyA9IFtdCisgICAgICAgIHNlbGYuc3RhdHVzID0gTm9uZQorICAgICAgICBzZWxmLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyCisgICAgICAgIHNlbGYucGF0aCA9IG9zLnBhdGguam9pbiAocGFyZW50LCBpZGVudGlmaWVyKQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgZGF0ZSwgc2luY2UgdGhlIGRpcmVjdG9yeSBuYW1lIGlzIG9mIHRoZQorICAgICAgICAjIGZvcm1hdCBidWlsZC08eWVhcj48bW9udGg+PGRheT4tPG9yZGluYWw+IHdlIGNhbiBlYXNpbHkKKyAgICAgICAgIyBwdWxsIGl0IG91dC4KKyAgICAgICAgIyBUT0RPOiBCZXR0ZXIgdG8gc3RhdCBhIGZpbGU/CisgICAgICAgIChfLCBkYXRlLCByZXZpc2lvbikgPSBpZGVudGlmaWVyLnNwbGl0ICgiLSIpCisgICAgICAgIHByaW50KGRhdGUpCisKKyAgICAgICAgeWVhciA9IGludCAoZGF0ZVswOjRdKQorICAgICAgICBtb250aCA9IGludCAoZGF0ZVs0OjZdKQorICAgICAgICBkYXkgPSBpbnQgKGRhdGVbNjo4XSkKKworICAgICAgICBzZWxmLmRhdGUgPSBkYXRldGltZS5kYXRlICh5ZWFyLCBtb250aCwgZGF5KQorCisgICAgICAgIHNlbGYuY29uZiA9IE5vbmUKKworICAgICAgICAjIEJ5IGRlZmF1bHQgYnVpbGRzIGFyZSBTVEFURV9GQUlMRUQgdW5sZXNzIHdlIGZpbmQgYSAiY29tcGxldGUiIGZpbGUKKyAgICAgICAgIyBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIFNUQVRFX0NPTVBMRVRFCisgICAgICAgIHNlbGYuc3RhdGUgPSBCdWlsZFJlc3VsdC5TVEFURV9GQUlMRUQKKyAgICAgICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpciAoc2VsZi5wYXRoKToKKyAgICAgICAgICAgIGlmIChmaWxlLnN0YXJ0c3dpdGggKCIuY29uZiIpKToKKyAgICAgICAgICAgICAgICBjb25mZmlsZSA9IG9zLnBhdGguam9pbiAoc2VsZi5wYXRoLCBmaWxlKQorICAgICAgICAgICAgICAgIHNlbGYuY29uZiA9IEJ1aWxkQ29uZmlndXJhdGlvbi5sb2FkX2Zyb21fZmlsZSAoY29uZmZpbGUpCisgICAgICAgICAgICBlbGlmIChmaWxlLnN0YXJ0c3dpdGggKCJjb21wbGV0ZSIpKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gQnVpbGRSZXN1bHQuU1RBVEVfQ09NUExFVEUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfZmlsZSAoZmlsZSkKKworICAgIGRlZiBhZGRfZmlsZSAoc2VsZiwgZmlsZSk6CisgICAgICAgICMgSnVzdCBhZGQgdGhlIGZpbGUgZm9yIG5vdy4gRG9uJ3QgY2FyZSBhYm91dCB0aGUgdHlwZS4KKyAgICAgICAgc2VsZi5maWxlcyArPSBbKGZpbGUsIE5vbmUpXQorCitjbGFzcyBCdWlsZE1hbmFnZXJNb2RlbCAoZ3RrLlRyZWVTdG9yZSk6CisgICAgIiIiIE1vZGVsIGZvciB0aGUgQnVpbGRNYW5hZ2VyVHJlZVZpZXcuIFRoaXMgZGVyaXZlcyBmcm9tIGd0ay5UcmVlU3RvcmUKKyAgICBidXQgaXQgYWJzdHJhY3RzIG5pY2VseSB3aGF0IHRoZSBjb2x1bW5zIG1lYW4gYW5kIHRoZSBzZXR1cCBvZiB0aGUgY29sdW1ucworICAgIGluIHRoZSBtb2RlbC4gIiIiCisKKyAgICAoQ09MX0lERU5ULCBDT0xfREVTQywgQ09MX01BQ0hJTkUsIENPTF9ESVNUUk8sIENPTF9CVUlMRF9SRVNVTFQsIENPTF9EQVRFLCBDT0xfU1RBVEUpID0gXAorICAgICAgICAoMCwgMSwgMiwgMywgNCwgNSwgNikKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGd0ay5UcmVlU3RvcmUuX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgZ29iamVjdC5UWVBFX09CSkVDVCwKKyAgICAgICAgICAgIGdvYmplY3QuVFlQRV9JTlQ2NCwKKyAgICAgICAgICAgIGdvYmplY3QuVFlQRV9JTlQpCisKK2NsYXNzIEJ1aWxkTWFuYWdlciAoZ29iamVjdC5HT2JqZWN0KToKKyAgICAiIiIgVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBoaXN0b3JpYyBidWlsZHMgdGhhdCBoYXZlIGJlZW4gZm91bmQgaW4gdGhlCisgICAgInJlc3VsdHMiIGRpcmVjdG9yeSBidXQgaXMgYWxzbyB1c2VkIGZvciBzdGFydGluZyBhIG5ldyBidWlsZC4iIiIKKworICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgJ3BvcHVsYXRpb24tZmluaXNoZWQnIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICdwb3B1bGF0ZS1lcnJvcicgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpCisgICAgfQorCisgICAgZGVmIHVwZGF0ZV9idWlsZF9yZXN1bHQgKHNlbGYsIHJlc3VsdCwgaXRlcik6CisgICAgICAgICMgQ29udmVydCB0aGUgZGF0ZSBpbnRvIHNvbWV0aGluZyB3ZSBjYW4gc29ydCBieS4KKyAgICAgICAgZGF0ZSA9IGxvbmcgKHRpbWUubWt0aW1lIChyZXN1bHQuZGF0ZS50aW1ldHVwbGUoKSkpCisKKyAgICAgICAgIyBBZGQgYSB0b3AgbGV2ZWwgZW50cnkgZm9yIHRoZSBidWlsZAorCisgICAgICAgIHNlbGYubW9kZWwuc2V0IChpdGVyLAorICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0lERU5ULCByZXN1bHQuaWRlbnRpZmllciwKKyAgICAgICAgICAgIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9ERVNDLCByZXN1bHQuY29uZi5pbWFnZSwKKyAgICAgICAgICAgIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9NQUNISU5FLCByZXN1bHQuY29uZi5tYWNoaW5lLAorICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0RJU1RSTywgcmVzdWx0LmNvbmYuZGlzdHJvLAorICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0JVSUxEX1JFU1VMVCwgcmVzdWx0LAorICAgICAgICAgICAgQnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0RBVEUsIGRhdGUsCisgICAgICAgICAgICBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfU1RBVEUsIHJlc3VsdC5zdGF0ZSkKKworICAgICAgICAjIEFuZCB0aGVuIHdlIHVzZSB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBhcyB0aGUgY2hpbGRyZW4gZm9yIHRoZQorICAgICAgICAjIHRvcCBsZXZlbCBpdGVyLgorICAgICAgICBmb3IgZmlsZSBpbiByZXN1bHQuZmlsZXM6CisgICAgICAgICAgICBzZWxmLm1vZGVsLmFwcGVuZCAoaXRlciwgKE5vbmUsIGZpbGVbMF0sIE5vbmUsIE5vbmUsIE5vbmUsIGRhdGUsIC0xKSkKKworICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXMgYW4gaWRsZSBieSB0aGUgQnVpbGRNYW5hZ2VyUG9wdWxhdGVyVGhyZWFkCisgICAgZGVmIGFkZF9idWlsZF9yZXN1bHQgKHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgIHNlbGYua25vd25fYnVpbGRzICs9IFtyZXN1bHRdCisKKyAgICAgICAgc2VsZi51cGRhdGVfYnVpbGRfcmVzdWx0IChyZXN1bHQsIHNlbGYubW9kZWwuYXBwZW5kIChOb25lKSkKKworICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgZGVmIG5vdGlmeV9idWlsZF9maW5pc2hlZCAoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suIElmIHdlIGhhdmUgYSBydW5uaW5nIGJ1aWxkIHJ1bm5pbmcgdGhlbiB3ZQorICAgICAgICAjIHdpbGwgaGF2ZSBhIHJvdyBpbiB0aGUgbW9kZWwgaW4gU1RBVEVfT05HT0lORy4gRmluZCBpdCBhbmQgbWFrZSBpdAorICAgICAgICAjIGFzIGlmIGl0IHdhcyBhIHByb3BlciBoaXN0b3JpYyBidWlsZCAod2VsbCwgaXQgaXMgY29tcGxldGVkIG5vdy4uLi4pCisKKyAgICAgICAgIyBXZSBuZWVkIHRvIHVzZSB0aGUgaXRlcnMgaGVyZSByYXRoZXIgdGhhbiB0aGUgUHl0aG9uIGl0ZXJhdG9yCisgICAgICAgICMgaW50ZXJmYWNlIHRvIHRoZSBtb2RlbCBzaW5jZSB3ZSBuZWVkIHRvIHBhc3MgaXQgaW50bworICAgICAgICAjIHVwZGF0ZV9idWlsZF9yZXN1bHQKKworICAgICAgICBpdGVyID0gc2VsZi5tb2RlbC5nZXRfaXRlcl9maXJzdCgpCisKKyAgICAgICAgd2hpbGUgKGl0ZXIpOgorICAgICAgICAgICAgKGlkZW50LCBzdGF0ZSkgPSBzZWxmLm1vZGVsLmdldChpdGVyLAorICAgICAgICAgICAgICAgIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9JREVOVCwKKyAgICAgICAgICAgICAgICBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfU1RBVEUpCisKKyAgICAgICAgICAgIGlmIHN0YXRlID09IEJ1aWxkUmVzdWx0LlNUQVRFX09OR09JTkc6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQnVpbGRSZXN1bHQgKHNlbGYucmVzdWx0c19kaXJlY3RvcnksIGlkZW50KQorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2J1aWxkX3Jlc3VsdCAocmVzdWx0LCBpdGVyKQorICAgICAgICAgICAgaXRlciA9IHNlbGYubW9kZWwuaXRlcl9uZXh0KGl0ZXIpCisKKyAgICBkZWYgbm90aWZ5X2J1aWxkX3N1Y2NlZWRlZCAoc2VsZik6CisgICAgICAgICMgV3JpdGUgdGhlICJjb21wbGV0ZSIgZmlsZSBzbyB0aGF0IHdoZW4gd2UgY3JlYXRlIHRoZSBCdWlsZFJlc3VsdAorICAgICAgICAjIG9iamVjdCB3ZSBwdXQgaW50byB0aGUgbW9kZWwKKworICAgICAgICBjb21wbGV0ZV9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4gKHNlbGYuY3VyX2J1aWxkX2RpcmVjdG9yeSwgImNvbXBsZXRlIikKKyAgICAgICAgZiA9IGZpbGUgKGNvbXBsZXRlX2ZpbGVfcGF0aCwgInciKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5ub3RpZnlfYnVpbGRfZmluaXNoZWQoKQorCisgICAgZGVmIG5vdGlmeV9idWlsZF9mYWlsZWQgKHNlbGYpOgorICAgICAgICAjIFdpdGhvdXQgYSAiY29tcGxldGUiIGZpbGUgdGhlbiB0aGlzIHdpbGwgbWFyayB0aGUgYnVpbGQgYXMgZmFpbGVkOgorICAgICAgICBzZWxmLm5vdGlmeV9idWlsZF9maW5pc2hlZCgpCisKKyAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIGFuIGlkbGUKKyAgICBkZWYgZW1pdF9wb3B1bGF0aW9uX2ZpbmlzaGVkX3NpZ25hbCAoc2VsZik6CisgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgIHNlbGYuZW1pdCAoInBvcHVsYXRpb24tZmluaXNoZWQiKQorICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgY2xhc3MgQnVpbGRNYW5hZ2VyUG9wdWxhdGVyVGhyZWFkICh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBtYW5hZ2VyLCBkaXJlY3RvcnkpOgorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyAoc2VsZikKKyAgICAgICAgICAgIHNlbGYubWFuYWdlciA9IG1hbmFnZXIKKyAgICAgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyZWN0b3J5CisKKyAgICAgICAgZGVmIHJ1biAoc2VsZik6CisgICAgICAgICAgICAjIEZvciBlYWNoIG9mIHRoZSAiYnVpbGQtPC4uLj4iIGRpcmVjdG9yaWVzIC4uCisKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzIChzZWxmLmRpcmVjdG9yeSk6CisgICAgICAgICAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBvcy5saXN0ZGlyIChzZWxmLmRpcmVjdG9yeSk6CisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRpcmVjdG9yeS5zdGFydHN3aXRoICgiYnVpbGQtIik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdCA9IEJ1aWxkUmVzdWx0IChzZWxmLmRpcmVjdG9yeSwgZGlyZWN0b3J5KQorICAgICAgICAgICAgICAgICAgICBzZWxmLm1hbmFnZXIuYWRkX2J1aWxkX3Jlc3VsdCAoYnVpbGRfcmVzdWx0KQorCisgICAgICAgICAgICBnb2JqZWN0LmlkbGVfYWRkIChCdWlsZE1hbmFnZXIuZW1pdF9wb3B1bGF0aW9uX2ZpbmlzaGVkX3NpZ25hbCwKKyAgICAgICAgICAgICAgICBzZWxmLm1hbmFnZXIpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHNlcnZlciwgcmVzdWx0c19kaXJlY3RvcnkpOgorICAgICAgICBnb2JqZWN0LkdPYmplY3QuX19pbml0X18gKHNlbGYpCisKKyAgICAgICAgIyBUaGUgYnVpbGRzIHRoYXQgd2UndmUgZm91bmQgZnJvbSB3YWxraW5nIHRoZSByZXN1bHQgZGlyZWN0b3J5CisgICAgICAgIHNlbGYua25vd25fYnVpbGRzID0gW10KKworICAgICAgICAjIFNhdmUgb3V0IHRoZSBiaXRiYWtlIHNlcnZlciwgd2UgbmVlZCB0aGlzIGZvciBpc3N1aW5nIGNvbW1hbmRzIHRvCisgICAgICAgICMgdGhlIGNvb2tlcjoKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKworICAgICAgICAjIFRoZSBUcmVlU3RvcmUgdGhhdCB3ZSB1c2UKKyAgICAgICAgc2VsZi5tb2RlbCA9IEJ1aWxkTWFuYWdlck1vZGVsICgpCisKKyAgICAgICAgIyBUaGUgcmVzdWx0cyBkaXJlY3RvcnkgaXMgd2hlcmUgd2UgY3JlYXRlIChhbmQgbG9vayBmb3IpIHRoZQorICAgICAgICAjIGJ1aWxkLTx4eXo+LTxuPiBkaXJlY3Rvcmllcy4gV2UgbmVlZCB0byBwb3B1bGF0ZSBvdXJzZWx2ZXMgZnJvbQorICAgICAgICAjIGRpcmVjdG9yeQorICAgICAgICBzZWxmLnJlc3VsdHNfZGlyZWN0b3J5ID0gcmVzdWx0c19kaXJlY3RvcnkKKyAgICAgICAgc2VsZi5wb3B1bGF0ZV9mcm9tX2RpcmVjdG9yeSAoc2VsZi5yZXN1bHRzX2RpcmVjdG9yeSkKKworICAgIGRlZiBwb3B1bGF0ZV9mcm9tX2RpcmVjdG9yeSAoc2VsZiwgZGlyZWN0b3J5KToKKyAgICAgICAgdGhyZWFkID0gQnVpbGRNYW5hZ2VyLkJ1aWxkTWFuYWdlclBvcHVsYXRlclRocmVhZCAoc2VsZiwgZGlyZWN0b3J5KQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorCisgICAgIyBDb21lIHVwIHdpdGggdGhlIG5hbWUgZm9yIHRoZSBuZXh0IGJ1aWxkIGlkZW50IGJ5IGNvbWJpbmluZyAiYnVpbGQtIgorICAgICMgd2l0aCB0aGUgZGF0ZSBmb3JtYXR0ZWQgYXMgeXl5eW1tZGQgYW5kIHRoZW4gYW4gb3JkaW5hbC4gV2UgZG8gdGhpcyBieQorICAgICMgYW4gb3B0aW1pc3RpYyBhbGdvcml0aG0gaW5jcmVtZW50aW5nIHRoZSBvcmRpbmFsIGlmIHdlIGZpbmQgdGhhdCBpdAorICAgICMgYWxyZWFkeSBleGlzdHMuCisgICAgZGVmIGdldF9uZXh0X2J1aWxkX2lkZW50IChzZWxmKToKKyAgICAgICAgdG9kYXkgPSBkYXRldGltZS5kYXRlLnRvZGF5ICgpCisgICAgICAgIGRhdGVzdHIgPSBzdHIgKHRvZGF5LnllYXIpICsgc3RyICh0b2RheS5tb250aCkgKyBzdHIgKHRvZGF5LmRheSkKKworICAgICAgICByZXZpc2lvbiA9IDAKKyAgICAgICAgdGVzdF9uYW1lID0gImJ1aWxkLSVzLSVkIiAlIChkYXRlc3RyLCByZXZpc2lvbikKKyAgICAgICAgdGVzdF9wYXRoID0gb3MucGF0aC5qb2luIChzZWxmLnJlc3VsdHNfZGlyZWN0b3J5LCB0ZXN0X25hbWUpCisKKyAgICAgICAgd2hpbGUgKG9zLnBhdGguZXhpc3RzICh0ZXN0X3BhdGgpKToKKyAgICAgICAgICAgIHJldmlzaW9uICs9IDEKKyAgICAgICAgICAgIHRlc3RfbmFtZSA9ICJidWlsZC0lcy0lZCIgJSAoZGF0ZXN0ciwgcmV2aXNpb24pCisgICAgICAgICAgICB0ZXN0X3BhdGggPSBvcy5wYXRoLmpvaW4gKHNlbGYucmVzdWx0c19kaXJlY3RvcnksIHRlc3RfbmFtZSkKKworICAgICAgICByZXR1cm4gdGVzdF9uYW1lCisKKyAgICAjIFRha2UgYSBCdWlsZENvbmZpZ3VyYXRpb24gYW5kIHRoZW4gdHJ5IGFuZCBidWlsZCBpdCBiYXNlZCBvbiB0aGUKKyAgICAjIHBhcmFtZXRlcnMgb2YgdGhhdCBjb25maWd1cmF0aW9uLiBTCisgICAgZGVmIGRvX2J1aWxkIChzZWxmLCBjb25mKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXIKKworICAgICAgICAjIFdvcmsgb3V0IHRoZSBidWlsZCBkaXJlY3RvcnkuIE5vdGUgd2UgYWN0dWFsbHkgY3JlYXRlIHRoZQorICAgICAgICAjIGRpcmVjdG9yaWVzIGhlcmUgc2luY2Ugd2UgbmVlZCB0byB3cml0ZSB0aGUgIi5jb25mIiBmaWxlLiBPdGhlcndpc2UKKyAgICAgICAgIyB3ZSBjb3VsZCBoYXZlIHJlbGllZCBvbiBiaXRiYWtlJ3MgYnVpbGRlciB0aHJlYWQgdG8gYWN0dWFsbHkgbWFrZQorICAgICAgICAjIHRoZSBkaXJlY3RvcmllcyBhcyBpdCBwcm9jZWVkcyB3aXRoIHRoZSBidWlsZC4KKyAgICAgICAgaWRlbnQgPSBzZWxmLmdldF9uZXh0X2J1aWxkX2lkZW50ICgpCisgICAgICAgIGJ1aWxkX2RpcmVjdG9yeSA9IG9zLnBhdGguam9pbiAoc2VsZi5yZXN1bHRzX2RpcmVjdG9yeSwKKyAgICAgICAgICAgIGlkZW50KQorICAgICAgICBzZWxmLmN1cl9idWlsZF9kaXJlY3RvcnkgPSBidWlsZF9kaXJlY3RvcnkKKyAgICAgICAgb3MubWFrZWRpcnMgKGJ1aWxkX2RpcmVjdG9yeSkKKworICAgICAgICBjb25mZmlsZSA9IG9zLnBhdGguam9pbiAoYnVpbGRfZGlyZWN0b3J5LCAiLmNvbmYiKQorICAgICAgICBjb25mLndyaXRlX3RvX2ZpbGUgKGNvbmZmaWxlKQorCisgICAgICAgICMgQWRkIGEgcm93IHRvIHRoZSBtb2RlbCByZXByZXNlbnRpbmcgdGhpcyBvbmdvaW5nIGJ1aWxkLiBJdCdzIGtpbmRhIGEKKyAgICAgICAgIyBmYWtlIGVudHJ5LiBJZiB0aGlzIGJ1aWxkIGNvbXBsZXRlcyBvciBmYWlscyB0aGVuIHRoaXMgZ2V0cyB1cGRhdGVkCisgICAgICAgICMgd2l0aCB0aGUgcmVhbCBzdHVmZiBsaWtlIHRoZSBoaXN0b3JpYyBidWlsZHMKKyAgICAgICAgZGF0ZSA9IGxvbmcgKHRpbWUudGltZSgpKQorICAgICAgICBzZWxmLm1vZGVsLmFwcGVuZCAoTm9uZSwgKGlkZW50LCBjb25mLmltYWdlLCBjb25mLm1hY2hpbmUsIGNvbmYuZGlzdHJvLAorICAgICAgICAgICAgTm9uZSwgZGF0ZSwgQnVpbGRSZXN1bHQuU1RBVEVfT05HT0lORykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiQlVJTERfSU1BR0VTX0ZST01fRkVFRFMiLCAxXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiTUFDSElORSIsIGNvbmYubWFjaGluZV0pCisgICAgICAgICAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInNldFZhcmlhYmxlIiwgIkRJU1RSTyIsIGNvbmYuZGlzdHJvXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiUEFDS0FHRV9DTEFTU0VTIiwgInBhY2thZ2VfaXBrIl0pCisgICAgICAgICAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInNldFZhcmlhYmxlIiwgIkJCRklMRVMiLCBcCisgICAgICAgICAgICAgICIiIiR7T0VST09UfS9tZXRhL3BhY2thZ2VzLyovKi5iYiAke09FUk9PVH0vbWV0YS1tb2JsaW4vcGFja2FnZXMvKi8qLmJiIiIiXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiVE1QRElSIiwgIiR7T0VST09UfS9idWlsZC90bXAiXSkKKyAgICAgICAgICAgIHNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyaWFibGUiLCAiSVBLX0ZFRURfVVJJUyIsIFwKKyAgICAgICAgICAgICAgICAiICIuam9pbihjb25mLmdldF9yZXBvcygpKV0pCisgICAgICAgICAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInNldFZhcmlhYmxlIiwgIkRFUExPWV9ESVJfSU1BR0UiLAorICAgICAgICAgICAgICAgIGJ1aWxkX2RpcmVjdG9yeV0pCisgICAgICAgICAgICBzZXJ2ZXIucnVuQ29tbWFuZChbImJ1aWxkVGFyZ2V0cyIsIFtjb25mLmltYWdlXSwgInJvb3RmcyJdKQorCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHByaW50KGUpCisKK2NsYXNzIEJ1aWxkTWFuYWdlclRyZWVWaWV3IChndGsuVHJlZVZpZXcpOgorICAgICIiIiBUaGUgdHJlZSB2aWV3IGZvciB0aGUgYnVpbGQgbWFuYWdlci4gVGhpcyBzaG93cyB0aGUgaGlzdG9yaWMgYnVpbGRzCisgICAgYW5kIHNvIGZvcnRoLiAiIiIKKworICAgICMgV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gY29udHJvbCB3aGF0IGdvZXMgaW4gdGhlIGNlbGwgc2luY2Ugd2Ugc3RvcmUKKyAgICAjIHRoZSBkYXRlIGluIHRoZSBtb2RlbCBhcyBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoZm9yIHNvcnRpbmcpIGFuZCBzbyB3ZQorICAgICMgbmVlZCB0byBtYWtlIGl0IGh1bWFuIHJlYWRhYmxlLgorICAgIGRlZiBkYXRlX2Zvcm1hdF9jdXN0b21fY2VsbF9kYXRhX2Z1bmMgKHNlbGYsIGNvbCwgY2VsbCwgbW9kZWwsIGl0ZXIpOgorICAgICAgICBkYXRlID0gbW9kZWwuZ2V0IChpdGVyLCBCdWlsZE1hbmFnZXJNb2RlbC5DT0xfREFURSlbMF0KKyAgICAgICAgZGF0ZXN0ciA9IHRpbWUuc3RyZnRpbWUoIiVBICVkICVCICVZIiwgdGltZS5sb2NhbHRpbWUoZGF0ZSkpCisgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5ICgidGV4dCIsIGRhdGVzdHIpCisKKyAgICAjIFRoaXMgZm9ybWF0IGZ1bmN0aW9uIGNvbnRyb2xzIHdoYXQgZ29lcyBpbiB0aGUgY2VsbC4gV2UgdXNlIHRoaXMgdG8gbWFwCisgICAgIyB0aGUgaW50ZWdlciBzdGF0ZSB0byBhIHN0cmluZyBhbmQgYWxzbyB0byBjb2xvdXJpc2UgdGhlIHRleHQKKyAgICBkZWYgc3RhdGVfZm9ybWF0X2N1c3RvbV9jZWxsX2RhdGFfZnVuIChzZWxmLCBjb2wsIGNlbGwsIG1vZGVsLCBpdGVyKToKKyAgICAgICAgc3RhdGUgPSBtb2RlbC5nZXQgKGl0ZXIsIEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9TVEFURSlbMF0KKworICAgICAgICBpZiAoc3RhdGUgPT0gQnVpbGRSZXN1bHQuU1RBVEVfT05HT0lORyk6CisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSAoInRleHQiLCAiQWN0aXZlIikKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5ICgiZm9yZWdyb3VuZCIsICIjMDAwMDAwIikKKyAgICAgICAgZWxpZiAoc3RhdGUgPT0gQnVpbGRSZXN1bHQuU1RBVEVfRkFJTEVEKToKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5ICgidGV4dCIsICJGYWlsZWQiKQorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkgKCJmb3JlZ3JvdW5kIiwgIiNmZjAwMDAiKQorICAgICAgICBlbGlmIChzdGF0ZSA9PSBCdWlsZFJlc3VsdC5TVEFURV9DT01QTEVURSk6CisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSAoInRleHQiLCAiQ29tcGxldGUiKQorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkgKCJmb3JlZ3JvdW5kIiwgIiMwMGZmMDAiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkgKCJ0ZXh0IiwgIiIpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBndGsuVHJlZVZpZXcuX19pbml0X18oc2VsZikKKworICAgICAgICAjIE1pc2MgZGVzY3JpcHRpb255IHRoaW5nCisgICAgICAgIHJlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclRleHQgKCkKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uIChOb25lLCByZW5kZXJlciwKKyAgICAgICAgICAgIHRleHQ9QnVpbGRNYW5hZ2VyTW9kZWwuQ09MX0RFU0MpCisgICAgICAgIHNlbGYuYXBwZW5kX2NvbHVtbiAoY29sKQorCisgICAgICAgICMgTWFjaGluZQorICAgICAgICByZW5kZXJlciA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0ICgpCisgICAgICAgIGNvbCA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIk1hY2hpbmUiLCByZW5kZXJlciwKKyAgICAgICAgICAgIHRleHQ9QnVpbGRNYW5hZ2VyTW9kZWwuQ09MX01BQ0hJTkUpCisgICAgICAgIHNlbGYuYXBwZW5kX2NvbHVtbiAoY29sKQorCisgICAgICAgICMgZGlzdHJvCisgICAgICAgIHJlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclRleHQgKCkKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiRGlzdHJpYnV0aW9uIiwgcmVuZGVyZXIsCisgICAgICAgICAgICB0ZXh0PUJ1aWxkTWFuYWdlck1vZGVsLkNPTF9ESVNUUk8pCisgICAgICAgIHNlbGYuYXBwZW5kX2NvbHVtbiAoY29sKQorCisgICAgICAgICMgZGF0ZSAodXNpbmcgYSBjdXN0b20gZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgdGhlIGNlbGwgY29udGVudHMgaXQKKyAgICAgICAgIyB0YWtlcyBlcG9jaCAtPiBodW1hbiByZWFkYWJsZSBzdHJpbmcpCisgICAgICAgIHJlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclRleHQgKCkKKyAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uICgiRGF0ZSIsIHJlbmRlcmVyLAorICAgICAgICAgICAgdGV4dD1CdWlsZE1hbmFnZXJNb2RlbC5DT0xfREFURSkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisgICAgICAgIGNvbC5zZXRfY2VsbF9kYXRhX2Z1bmMgKHJlbmRlcmVyLAorICAgICAgICAgICAgc2VsZi5kYXRlX2Zvcm1hdF9jdXN0b21fY2VsbF9kYXRhX2Z1bmMpCisKKyAgICAgICAgIyBGb3Igc3RhdHVzLgorICAgICAgICByZW5kZXJlciA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0ICgpCisgICAgICAgIGNvbCA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIlN0YXR1cyIsIHJlbmRlcmVyLAorICAgICAgICAgICAgdGV4dCA9IEJ1aWxkTWFuYWdlck1vZGVsLkNPTF9TVEFURSkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisgICAgICAgIGNvbC5zZXRfY2VsbF9kYXRhX2Z1bmMgKHJlbmRlcmVyLAorICAgICAgICAgICAgc2VsZi5zdGF0ZV9mb3JtYXRfY3VzdG9tX2NlbGxfZGF0YV9mdW4pCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9hZHZhbmNlZHNldHRpbmdzZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9hZHZhbmNlZHNldHRpbmdzZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjM1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2FkdmFuY2Vkc2V0dGluZ3NkaWFsb2cucHkKQEAgLTAsMCArMSwzNDEgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBoYXNobGliCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IEhvYkluZm9CdXR0b24sIEhvYkJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMucHJvZ3Jlc3NiYXIgaW1wb3J0IEhvYlByb2dyZXNzQmFyCitmcm9tIGJiLnVpLmNydW1icy5oaWcuc2V0dGluZ3N1aWhlbHBlciBpbXBvcnQgU2V0dGluZ3NVSUhlbHBlcgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic2RpYWxvZyBpbXBvcnQgQ3J1bWJzRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzbWVzc2FnZWRpYWxvZyBpbXBvcnQgQ3J1bWJzTWVzc2FnZURpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLnByb3h5ZGV0YWlsc2RpYWxvZyBpbXBvcnQgUHJveHlEZXRhaWxzRGlhbG9nCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBBZHZhbmNlZFNldHRpbmdzRGlhbG9nIChDcnVtYnNEaWFsb2csIFNldHRpbmdzVUlIZWxwZXIpOgorICAgIAorICAgIGRlZiBkZXRhaWxzX2NiKHNlbGYsIGJ1dHRvbiwgcGFyZW50LCBwcm90b2NvbCk6CisgICAgICAgIGRpYWxvZyA9IFByb3h5RGV0YWlsc0RpYWxvZyh0aXRsZSA9IHByb3RvY29sLnVwcGVyKCkgKyAiIFByb3h5IERldGFpbHMiLAorICAgICAgICAgICAgdXNlciA9IHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzW3Byb3RvY29sXVsxXSwKKyAgICAgICAgICAgIHBhc3N3ZCA9IHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzW3Byb3RvY29sXVsyXSwKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudCwKKyAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorICAgICAgICBkaWFsb2cuYWRkX2J1dHRvbihndGsuU1RPQ0tfQ0xPU0UsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX09LOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzFdID0gZGlhbG9nLnVzZXIKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzW3Byb3RvY29sXVsyXSA9IGRpYWxvZy5wYXNzd2QKKyAgICAgICAgICAgIHNlbGYucmVmcmVzaF9wcm94eV9jb21wb25lbnRzKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIHNldF9zYXZlX2J1dHRvbihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLnNhdmVfYnV0dG9uID0gYnV0dG9uCisKKyAgICBkZWYgcm9vdGZzX2NvbWJvX2NoYW5nZWRfY2Ioc2VsZiwgcm9vdGZzX2NvbWJvLCBhbGxfcGFja2FnZV9mb3JtYXQsIGNoZWNrX2hib3gpOgorICAgICAgICBjb21ib19pdGVtID0gc2VsZi5yb290ZnNfY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkKKyAgICAgICAgbW9kaWZpZWQgPSBGYWxzZQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hlY2tfaGJveC5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIGd0ay5DaGVja0J1dHRvbik6CisgICAgICAgICAgICAgICAgY2hlY2tfaGJveC5yZW1vdmUoY2hpbGQpCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSBUcnVlCisgICAgICAgIGZvciBmb3JtYXQgaW4gYWxsX3BhY2thZ2VfZm9ybWF0OgorICAgICAgICAgICAgaWYgZm9ybWF0ICE9IGNvbWJvX2l0ZW06CisgICAgICAgICAgICAgICAgY2hlY2tfYnV0dG9uID0gZ3RrLkNoZWNrQnV0dG9uKGZvcm1hdCkKKyAgICAgICAgICAgICAgICBjaGVja19oYm94LnBhY2tfc3RhcnQoY2hlY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSBUcnVlCisgICAgICAgIGlmIG1vZGlmaWVkOgorICAgICAgICAgICAgY2hlY2tfaGJveC5yZW1vdmUoc2VsZi5wa2dmbXRfaW5mbykKKyAgICAgICAgICAgIGNoZWNrX2hib3gucGFja19zdGFydChzZWxmLnBrZ2ZtdF9pbmZvLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGNoZWNrX2hib3guc2hvd19hbGwoKQorCisgICAgZGVmIGdlbl9wa2dmbXRfd2lkZ2V0KHNlbGYsIGN1cnJfcGFja2FnZV9mb3JtYXQsIGFsbF9wYWNrYWdlX2Zvcm1hdCwgdG9vbHRpcF9jb21ibz0iIiwgdG9vbHRpcF9leHRyYT0iIik6CisgICAgICAgIHBrZ2ZtdF92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIlJvb3QgZmlsZSBzeXN0ZW0gcGFja2FnZSBmb3JtYXQiKQorICAgICAgICBwa2dmbXRfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgcm9vdGZzX2Zvcm1hdCA9ICIiCisgICAgICAgIGlmIGN1cnJfcGFja2FnZV9mb3JtYXQ6CisgICAgICAgICAgICByb290ZnNfZm9ybWF0ID0gY3Vycl9wYWNrYWdlX2Zvcm1hdC5zcGxpdCgpWzBdCisKKyAgICAgICAgcm9vdGZzX2Zvcm1hdF93aWRnZXQsIHJvb3Rmc19jb21ibyA9IHNlbGYuZ2VuX2NvbWJvX3dpZGdldChyb290ZnNfZm9ybWF0LCBhbGxfcGFja2FnZV9mb3JtYXQsIHRvb2x0aXBfY29tYm8pCisgICAgICAgIHBrZ2ZtdF92Ym94LnBhY2tfc3RhcnQocm9vdGZzX2Zvcm1hdF93aWRnZXQsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiQWRkaXRpb25hbCBwYWNrYWdlIGZvcm1hdHMiKQorICAgICAgICBwa2dmbXRfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgY2hlY2tfaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgcGtnZm10X3Zib3gucGFja19zdGFydChjaGVja19oYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGZvciBmb3JtYXQgaW4gYWxsX3BhY2thZ2VfZm9ybWF0OgorICAgICAgICAgICAgaWYgZm9ybWF0ICE9IHJvb3Rmc19mb3JtYXQ6CisgICAgICAgICAgICAgICAgY2hlY2tfYnV0dG9uID0gZ3RrLkNoZWNrQnV0dG9uKGZvcm1hdCkKKyAgICAgICAgICAgICAgICBpc19hY3RpdmUgPSAoZm9ybWF0IGluIGN1cnJfcGFja2FnZV9mb3JtYXQuc3BsaXQoKSkKKyAgICAgICAgICAgICAgICBjaGVja19idXR0b24uc2V0X2FjdGl2ZShpc19hY3RpdmUpCisgICAgICAgICAgICAgICAgY2hlY2tfaGJveC5wYWNrX3N0YXJ0KGNoZWNrX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYucGtnZm10X2luZm8gPSBIb2JJbmZvQnV0dG9uKHRvb2x0aXBfZXh0cmEsIHNlbGYpCisgICAgICAgIGNoZWNrX2hib3gucGFja19zdGFydChzZWxmLnBrZ2ZtdF9pbmZvLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgcm9vdGZzX2NvbWJvLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLnJvb3Rmc19jb21ib19jaGFuZ2VkX2NiLCBhbGxfcGFja2FnZV9mb3JtYXQsIGNoZWNrX2hib3gpCisKKyAgICAgICAgcGtnZm10X3Zib3guc2hvd19hbGwoKQorCisgICAgICAgIHJldHVybiBwa2dmbXRfdmJveCwgcm9vdGZzX2NvbWJvLCBjaGVja19oYm94CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGUsIGNvbmZpZ3VyYXRpb24sIGFsbF9pbWFnZV90eXBlcywKKyAgICAgICAgICAgIGFsbF9wYWNrYWdlX2Zvcm1hdHMsIGFsbF9kaXN0cm9zLCBhbGxfc2RrX21hY2hpbmVzLAorICAgICAgICAgICAgbWF4X3RocmVhZHMsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSk6CisgICAgICAgIHN1cGVyKEFkdmFuY2VkU2V0dGluZ3NEaWFsb2csIHNlbGYpLl9faW5pdF9fKHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zKQorCisgICAgICAgICMgY2xhc3MgbWVtYmVycyBmcm9tIG90aGVyIG9iamVjdHMKKyAgICAgICAgIyBiaXRiYWtlIHNldHRpbmdzIGZyb20gQnVpbGRlci5Db25maWd1cmF0aW9uCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgc2VsZi5pbWFnZV90eXBlcyA9IGFsbF9pbWFnZV90eXBlcworICAgICAgICBzZWxmLmFsbF9wYWNrYWdlX2Zvcm1hdHMgPSBhbGxfcGFja2FnZV9mb3JtYXRzCisgICAgICAgIHNlbGYuYWxsX2Rpc3Ryb3MgPSBhbGxfZGlzdHJvc1s6XQorICAgICAgICBzZWxmLmFsbF9zZGtfbWFjaGluZXMgPSBhbGxfc2RrX21hY2hpbmVzCisgICAgICAgIHNlbGYubWF4X3RocmVhZHMgPSBtYXhfdGhyZWFkcworCisgICAgICAgICMgY2xhc3MgbWVtYmVycyBmb3IgaW50ZXJuYWwgdXNlCisgICAgICAgIHNlbGYuZGlzdHJvX2NvbWJvID0gTm9uZQorICAgICAgICBzZWxmLmRsZGlyX3RleHQgPSBOb25lCisgICAgICAgIHNlbGYuc3N0YXRlZGlyX3RleHQgPSBOb25lCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yX3RleHQgPSBOb25lCisgICAgICAgIHNlbGYuYmJfc3Bpbm5lciA9IE5vbmUKKyAgICAgICAgc2VsZi5wbWFrZV9zcGlubmVyID0gTm9uZQorICAgICAgICBzZWxmLnJvb3Rmc19zaXplX3NwaW5uZXIgPSBOb25lCisgICAgICAgIHNlbGYuZXh0cmFfc2l6ZV9zcGlubmVyID0gTm9uZQorICAgICAgICBzZWxmLmdwbHYzX2NoZWNrYm94ID0gTm9uZQorICAgICAgICBzZWxmLnNka19jaGVja2JveCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnMgPSB7fQorCisgICAgICAgIHNlbGYubWQ1ID0gc2VsZi5jb25maWdfbWQ1KCkKKyAgICAgICAgc2VsZi5zZXR0aW5nc19jaGFuZ2VkID0gRmFsc2UKKworICAgICAgICAjIGNyZWF0ZSB2aXN1YWwgZWxlbWVudHMgb24gdGhlIGRpYWxvZworICAgICAgICBzZWxmLnNhdmVfYnV0dG9uID0gTm9uZQorICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorICAgICAgICBzZWxmLmNvbm5lY3QoInJlc3BvbnNlIiwgc2VsZi5yZXNwb25zZV9jYikKKworICAgIGRlZiBfZ2V0X3NvcnRlZF92YWx1ZShzZWxmLCB2YXIpOgorICAgICAgICByZXR1cm4gIiAiLmpvaW4oc29ydGVkKHN0cih2YXIpLnNwbGl0KCkpKSArICJcbiIKKworICAgIGRlZiBjb25maWdfbWQ1KHNlbGYpOgorICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgZGF0YSArPSAoIlBBQ0tBR0VfQ0xBU1NFUzogIiAgICAgICsgc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfcGFja2FnZV9mb3JtYXQgKyAnXG4nKQorICAgICAgICBkYXRhICs9ICgiRElTVFJPOiAiICAgICAgICAgICAgICAgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX2Rpc3RybykpCisgICAgICAgIGRhdGEgKz0gKCJJTUFHRV9ST09URlNfU0laRTogIiAgICArIHNlbGYuX2dldF9zb3J0ZWRfdmFsdWUoc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX3Jvb3Rmc19zaXplKSkKKyAgICAgICAgZGF0YSArPSAoIklNQUdFX0VYVFJBX1NJWkU6ICIgICAgICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZXh0cmFfc2l6ZSkpCisgICAgICAgIGRhdGEgKz0gKCJJTkNPTVBBVElCTEVfTElDRU5TRTogIiArIHNlbGYuX2dldF9zb3J0ZWRfdmFsdWUoc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2UpKQorICAgICAgICBkYXRhICs9ICgiU0RLX01BQ0hJTkU6ICIgICAgICAgICAgKyBzZWxmLl9nZXRfc29ydGVkX3ZhbHVlKHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX3Nka19tYWNoaW5lKSkKKyAgICAgICAgZGF0YSArPSAoIlRPT0xDSEFJTl9CVUlMRDogIiAgICAgICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24udG9vbGNoYWluX2J1aWxkKSkKKyAgICAgICAgZGF0YSArPSAoIklNQUdFX0ZTVFlQRVM6ICIgICAgICAgICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZnN0eXBlcykpCisgICAgICAgIHJldHVybiBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYubmIgPSBndGsuTm90ZWJvb2soKQorICAgICAgICBzZWxmLm5iLnNldF9zaG93X3RhYnMoVHJ1ZSkKKyAgICAgICAgc2VsZi5uYi5hcHBlbmRfcGFnZShzZWxmLmNyZWF0ZV9pbWFnZV90eXBlc19wYWdlKCksIGd0ay5MYWJlbCgiSW1hZ2UgdHlwZXMiKSkKKyAgICAgICAgc2VsZi5uYi5hcHBlbmRfcGFnZShzZWxmLmNyZWF0ZV9vdXRwdXRfcGFnZSgpLCBndGsuTGFiZWwoIk91dHB1dCIpKQorICAgICAgICBzZWxmLm5iLnNldF9jdXJyZW50X3BhZ2UoMCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5uYiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfZW5kKGd0ay5IU2VwYXJhdG9yKCksIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgZ2V0X251bV9jaGVja2VkX2ltYWdlX3R5cGVzKHNlbGYpOgorICAgICAgICB0b3RhbCA9IDAKKyAgICAgICAgZm9yIGIgaW4gc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnMudmFsdWVzKCk6CisgICAgICAgICAgICBpZiBiLmdldF9hY3RpdmUoKToKKyAgICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIDEKKyAgICAgICAgcmV0dXJuIHRvdGFsCisKKyAgICBkZWYgc2V0X3NhdmVfYnV0dG9uX3N0YXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNhdmVfYnV0dG9uOgorICAgICAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKHNlbGYuZ2V0X251bV9jaGVja2VkX2ltYWdlX3R5cGVzKCkgPiAwKQorCisgICAgZGVmIGltYWdlX3R5cGVfY2hlY2tidXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLnNldF9zYXZlX2J1dHRvbl9zdGF0ZSgpCisgICAgICAgIGlmIHNlbGYuZ2V0X251bV9jaGVja2VkX2ltYWdlX3R5cGVzKCkgPT0gMDoKKyAgICAgICAgICAgICMgU2hvdyBhbiBlcnJvciBkaWFsb2cKKyAgICAgICAgICAgIGxibCA9ICI8Yj5TZWxlY3QgYW4gaW1hZ2UgdHlwZTwvYj4iCisgICAgICAgICAgICBtc2cgPSAiWW91IG5lZWQgdG8gc2VsZWN0IGF0IGxlYXN0IG9uZSBpbWFnZSB0eXBlLiIKKyAgICAgICAgICAgIGRpYWxvZyA9IENydW1ic01lc3NhZ2VEaWFsb2coc2VsZiwgbGJsLCBndGsuTUVTU0FHRV9XQVJOSU5HLCBtc2cpCisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiT0siLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgY3JlYXRlX2ltYWdlX3R5cGVzX3BhZ2Uoc2VsZik6CisgICAgICAgIG1haW5fdmJveCA9IGd0ay5WQm94KEZhbHNlLCAxNikKKyAgICAgICAgbWFpbl92Ym94LnNldF9ib3JkZXJfd2lkdGgoNikKKworICAgICAgICBhZHZhbmNlZF92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3guc2V0X2JvcmRlcl93aWR0aCg2KQorCisgICAgICAgIGRpc3Ryb192Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpICAgICAgICAKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIkRpc3RybzoiKQorICAgICAgICB0b29sdGlwID0gIlNlbGVjdHMgdGhlIFlvY3RvIFByb2plY3QgZGlzdHJpYnV0aW9uIHlvdSB3YW50IgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpID0gc2VsZi5hbGxfZGlzdHJvcy5pbmRleCggImRlZmF1bHRzZXR1cCIgKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGkgPSAtMQorICAgICAgICBpZiBpICE9IC0xOgorICAgICAgICAgICAgc2VsZi5hbGxfZGlzdHJvc1sgaSBdID0gIkRlZmF1bHQiCisgICAgICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9kaXN0cm8gPT0gImRlZmF1bHRzZXR1cCI6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfZGlzdHJvID0gIkRlZmF1bHQiCisgICAgICAgIGRpc3Ryb193aWRnZXQsIHNlbGYuZGlzdHJvX2NvbWJvID0gc2VsZi5nZW5fY29tYm9fd2lkZ2V0KHNlbGYuY29uZmlndXJhdGlvbi5jdXJyX2Rpc3Rybywgc2VsZi5hbGxfZGlzdHJvcywiPGI+RGlzdHJvPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBkaXN0cm9fdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGRpc3Ryb192Ym94LnBhY2tfc3RhcnQoZGlzdHJvX3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBtYWluX3Zib3gucGFja19zdGFydChkaXN0cm9fdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisKKyAgICAgICAgcm93cyA9IChsZW4oc2VsZi5pbWFnZV90eXBlcykrMSkvMworICAgICAgICB0YWJsZSA9IGd0ay5UYWJsZShyb3dzICsgMSwgMTAsIFRydWUpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydCh0YWJsZSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHRvb2x0aXAgPSAiSW1hZ2UgZmlsZSBzeXN0ZW0gdHlwZXMgeW91IHdhbnQuIgorICAgICAgICBpbmZvID0gSG9iSW5mb0J1dHRvbigiPGI+SW1hZ2UgdHlwZXM8L2I+IiArICIqIiArIHRvb2x0aXAsIHNlbGYpCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCJJbWFnZSB0eXBlczoiKQorICAgICAgICBhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMCwgMC41LCAwLCAwKQorICAgICAgICB0YWJsZS5hdHRhY2goYWxpZ24sIDAsIDQsIDAsIDEpCisgICAgICAgIGFsaWduLmFkZChsYWJlbCkKKyAgICAgICAgdGFibGUuYXR0YWNoKGluZm8sIDQsIDUsIDAsIDEpCisKKyAgICAgICAgaSA9IDEKKyAgICAgICAgaiA9IDEKKyAgICAgICAgZm9yIGltYWdlX3R5cGUgaW4gc29ydGVkKHNlbGYuaW1hZ2VfdHlwZXMpOgorICAgICAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0gPSBndGsuQ2hlY2tCdXR0b24oaW1hZ2VfdHlwZSkKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXNfY2hlY2tidXR0b25zW2ltYWdlX3R5cGVdLmNvbm5lY3QoInRvZ2dsZWQiLCBzZWxmLmltYWdlX3R5cGVfY2hlY2tidXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgICAgIGFydGljbGUgPSAiIgorICAgICAgICAgICAgaWYgaW1hZ2VfdHlwZS5zdGFydHN3aXRoKCgiYSIsICJlIiwgImkiLCAibyIsICJ1IikpOgorICAgICAgICAgICAgICAgIGFydGljbGUgPSAibiIKKyAgICAgICAgICAgIGlmIGltYWdlX3R5cGUgPT0gImxpdmUiOgorICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXNfY2hlY2tidXR0b25zW2ltYWdlX3R5cGVdLnNldF90b29sdGlwX3RleHQoIkJ1aWxkIGlzbyBhbmQgaGRkaW1nIGltYWdlcyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXNfY2hlY2tidXR0b25zW2ltYWdlX3R5cGVdLnNldF90b29sdGlwX3RleHQoIkJ1aWxkIGElcyAlcyBpbWFnZSIgJSAoYXJ0aWNsZSwgaW1hZ2VfdHlwZSkpCisgICAgICAgICAgICB0YWJsZS5hdHRhY2goc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0sIGogLSAxLCBqICsgMywgaSwgaSArIDEpCisgICAgICAgICAgICBpZiBpbWFnZV90eXBlIGluIHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9mc3R5cGVzLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0uc2V0X2FjdGl2ZShUcnVlKQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBpZiBpID4gcm93czoKKyAgICAgICAgICAgICAgICBpID0gMQorICAgICAgICAgICAgICAgIGogPSBqICsgNAorCisgICAgICAgIG1haW5fdmJveC5wYWNrX3N0YXJ0KGFkdmFuY2VkX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfc2F2ZV9idXR0b25fc3RhdGUoKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1haW5fdmJveAorCisgICAgZGVmIGNyZWF0ZV9vdXRwdXRfcGFnZShzZWxmKToKKyAgICAgICAgYWR2YW5jZWRfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnNldF9ib3JkZXJfd2lkdGgoNikKKworICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCc8c3BhbiB3ZWlnaHQ9ImJvbGQiPlBhY2thZ2UgZm9ybWF0PC9zcGFuPicpLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICB0b29sdGlwX2NvbWJvID0gIlNlbGVjdHMgdGhlIHBhY2thZ2UgZm9ybWF0IHVzZWQgdG8gZ2VuZXJhdGUgcm9vdGZzLiIKKyAgICAgICAgdG9vbHRpcF9leHRyYSA9ICJTZWxlY3RzIGV4dHJhIHBhY2thZ2UgZm9ybWF0cyB0byBidWlsZCIKKyAgICAgICAgcGtnZm10X3dpZGdldCwgc2VsZi5yb290ZnNfY29tYm8sIHNlbGYuY2hlY2tfaGJveCA9IHNlbGYuZ2VuX3BrZ2ZtdF93aWRnZXQoc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfcGFja2FnZV9mb3JtYXQsIHNlbGYuYWxsX3BhY2thZ2VfZm9ybWF0cywiPGI+Um9vdCBmaWxlIHN5c3RlbSBwYWNrYWdlIGZvcm1hdDwvYj4iICsgIioiICsgdG9vbHRpcF9jb21ibywiPGI+QWRkaXRpb25hbCBwYWNrYWdlIGZvcm1hdHM8L2I+IiArICIqIiArIHRvb2x0aXBfZXh0cmEpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQocGtnZm10X3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdlbl9sYWJlbF93aWRnZXQoJzxzcGFuIHdlaWdodD0iYm9sZCI+SW1hZ2Ugc2l6ZTwvc3Bhbj4nKSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIkltYWdlIGJhc2ljIHNpemUgKGluIE1CKSIpCisgICAgICAgIHRvb2x0aXAgPSAiRGVmaW5lcyB0aGUgc2l6ZSBmb3IgdGhlIGdlbmVyYXRlZCBpbWFnZS4gVGhlIE9wZW5FbWJlZGRlZCBidWlsZCBzeXN0ZW0gZGV0ZXJtaW5lcyB0aGUgZmluYWwgc2l6ZSBmb3IgdGhlIGdlbmVyYXRlZCBpbWFnZSB1c2luZyBhbiBhbGdvcml0aG0gdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGluaXRpYWwgZGlzayBzcGFjZSB1c2VkIGZvciB0aGUgZ2VuZXJhdGVkIGltYWdlLCB0aGUgSW1hZ2UgYmFzaWMgc2l6ZSB2YWx1ZSwgYW5kIHRoZSBBZGRpdGlvbmFsIGZyZWUgc3BhY2UgdmFsdWUuXG5cbkZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgPGEgaHJlZj1cImh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2N1cnJlbnQvcG9reS1yZWYtbWFudWFsL3Bva3ktcmVmLW1hbnVhbC5odG1sI3Zhci1JTUFHRV9ST09URlNfU0laRVwiPllvY3RvIFByb2plY3QgUmVmZXJlbmNlIE1hbnVhbDwvYT4uIgorICAgICAgICByb290ZnNfc2l6ZV93aWRnZXQsIHNlbGYucm9vdGZzX3NpemVfc3Bpbm5lciA9IHNlbGYuZ2VuX3NwaW5uZXJfd2lkZ2V0KGludChzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfcm9vdGZzX3NpemUqMS4wLzEwMjQpLCAwLCA2NTUzNiwiPGI+SW1hZ2UgYmFzaWMgc2l6ZTwvYj4iICsgIioiICsgdG9vbHRpcCkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KHJvb3Rmc19zaXplX3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiQWRkaXRpb25hbCBmcmVlIHNwYWNlIChpbiBNQikiKQorICAgICAgICB0b29sdGlwID0gIlNldHMgZXh0cmEgZnJlZSBkaXNrIHNwYWNlIHRvIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuIFVzZSB0aGlzIHZhcmlhYmxlIHdoZW4geW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBzcGVjaWZpYyBhbW91bnQgb2YgZnJlZSBkaXNrIHNwYWNlIGlzIGF2YWlsYWJsZSBvbiBhIGRldmljZSBhZnRlciBhbiBpbWFnZSBpcyBpbnN0YWxsZWQgYW5kIHJ1bm5pbmcuIgorICAgICAgICBleHRyYV9zaXplX3dpZGdldCwgc2VsZi5leHRyYV9zaXplX3NwaW5uZXIgPSBzZWxmLmdlbl9zcGlubmVyX3dpZGdldChpbnQoc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX2V4dHJhX3NpemUqMS4wLzEwMjQpLCAwLCA2NTUzNiwiPGI+QWRkaXRpb25hbCBmcmVlIHNwYWNlPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoZXh0cmFfc2l6ZV93aWRnZXQsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCc8c3BhbiB3ZWlnaHQ9ImJvbGQiPkxpY2Vuc2luZzwvc3Bhbj4nKSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLmdwbHYzX2NoZWNrYm94ID0gZ3RrLkNoZWNrQnV0dG9uKCJFeGNsdWRlIEdQTHYzIHBhY2thZ2VzIikKKyAgICAgICAgc2VsZi5ncGx2M19jaGVja2JveC5zZXRfdG9vbHRpcF90ZXh0KCJDaGVjayB0aGlzIGJveCB0byBwcmV2ZW50IEdQTHYzIHBhY2thZ2VzIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4geW91ciBpbWFnZSIpCisgICAgICAgIGlmICJHUEx2MyIgaW4gc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2Uuc3BsaXQoKToKKyAgICAgICAgICAgIHNlbGYuZ3BsdjNfY2hlY2tib3guc2V0X2FjdGl2ZShUcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ncGx2M19jaGVja2JveC5zZXRfYWN0aXZlKEZhbHNlKQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc2VsZi5ncGx2M19jaGVja2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdlbl9sYWJlbF93aWRnZXQoJzxzcGFuIHdlaWdodD0iYm9sZCI+U0RLPC9zcGFuPicpLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl9oYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfaGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnNka19jaGVja2JveCA9IGd0ay5DaGVja0J1dHRvbigiUG9wdWxhdGUgU0RLIikKKyAgICAgICAgdG9vbHRpcCA9ICJDaGVjayB0aGlzIGJveCB0byBnZW5lcmF0ZSBhbiBTREsgdGFyYmFsbCB0aGF0IGNvbnNpc3RzIG9mIHRoZSBjcm9zcy10b29sY2hhaW4gYW5kIGEgc3lzcm9vdCB0aGF0IGNvbnRhaW5zIGRldmVsb3BtZW50IHBhY2thZ2VzIGZvciB5b3VyIGltYWdlLiIKKyAgICAgICAgc2VsZi5zZGtfY2hlY2tib3guc2V0X3Rvb2x0aXBfdGV4dCh0b29sdGlwKQorICAgICAgICBzZWxmLnNka19jaGVja2JveC5zZXRfYWN0aXZlKHNlbGYuY29uZmlndXJhdGlvbi50b29sY2hhaW5fYnVpbGQpCisgICAgICAgIHN1Yl9oYm94LnBhY2tfc3RhcnQoc2VsZi5zZGtfY2hlY2tib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICB0b29sdGlwID0gIlNlbGVjdCB0aGUgaG9zdCBwbGF0Zm9ybSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gcnVuIHRoZSB0b29sY2hhaW4gY29udGFpbmVkIGluIHRoZSBTREsgdGFyYmFsbC4iCisgICAgICAgIHNka19tYWNoaW5lX3dpZGdldCwgc2VsZi5zZGtfbWFjaGluZV9jb21ibyA9IHNlbGYuZ2VuX2NvbWJvX3dpZGdldChzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9zZGtfbWFjaGluZSwgc2VsZi5hbGxfc2RrX21hY2hpbmVzLCI8Yj5Qb3B1bGF0ZSBTREs8L2I+IiArICIqIiArIHRvb2x0aXApCisgICAgICAgIHN1Yl9oYm94LnBhY2tfc3RhcnQoc2RrX21hY2hpbmVfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgcmV0dXJuIGFkdmFuY2VkX3Zib3gKKworICAgIGRlZiByZXNwb25zZV9jYihzZWxmLCBkaWFsb2csIHJlc3BvbnNlX2lkKToKKyAgICAgICAgcGFja2FnZV9mb3JtYXQgPSBbXQorICAgICAgICBwYWNrYWdlX2Zvcm1hdC5hcHBlbmQoc2VsZi5yb290ZnNfY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoZWNrX2hib3g6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCBndGsuQ2hlY2tCdXR0b24pIGFuZCBjaGlsZC5nZXRfYWN0aXZlKCk6CisgICAgICAgICAgICAgICAgcGFja2FnZV9mb3JtYXQuYXBwZW5kKGNoaWxkLmdldF9sYWJlbCgpKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9wYWNrYWdlX2Zvcm1hdCA9ICIgIi5qb2luKHBhY2thZ2VfZm9ybWF0KQorCisgICAgICAgIGRpc3RybyA9IHNlbGYuZGlzdHJvX2NvbWJvLmdldF9hY3RpdmVfdGV4dCgpCisgICAgICAgIGlmIGRpc3RybyA9PSAiRGVmYXVsdCI6CisgICAgICAgICAgICBkaXN0cm8gPSAiZGVmYXVsdHNldHVwIgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uY3Vycl9kaXN0cm8gPSBkaXN0cm8KKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX3Jvb3Rmc19zaXplID0gc2VsZi5yb290ZnNfc2l6ZV9zcGlubmVyLmdldF92YWx1ZV9hc19pbnQoKSAqIDEwMjQKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX2V4dHJhX3NpemUgPSBzZWxmLmV4dHJhX3NpemVfc3Bpbm5lci5nZXRfdmFsdWVfYXNfaW50KCkgKiAxMDI0CisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmltYWdlX2ZzdHlwZXMgPSAiIgorICAgICAgICBmb3IgaW1hZ2VfdHlwZSBpbiBzZWxmLmltYWdlX3R5cGVzOgorICAgICAgICAgICAgaWYgc2VsZi5pbWFnZV90eXBlc19jaGVja2J1dHRvbnNbaW1hZ2VfdHlwZV0uZ2V0X2FjdGl2ZSgpOgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5pbWFnZV9mc3R5cGVzICs9ICgiICIgKyBpbWFnZV90eXBlKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZnN0eXBlcy5zdHJpcCgpCisKKyAgICAgICAgaWYgc2VsZi5ncGx2M19jaGVja2JveC5nZXRfYWN0aXZlKCk6CisgICAgICAgICAgICBpZiAiR1BMdjMiIG5vdCBpbiBzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZS5zcGxpdCgpOgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5pbmNvbXBhdF9saWNlbnNlICs9ICIgR1BMdjMiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAiR1BMdjMiIGluIHNlbGYuY29uZmlndXJhdGlvbi5pbmNvbXBhdF9saWNlbnNlLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2UgPSBzZWxmLmNvbmZpZ3VyYXRpb24uaW5jb21wYXRfbGljZW5zZS5zcGxpdCgpLnJlbW92ZSgiR1BMdjMiKQorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5pbmNvbXBhdF9saWNlbnNlID0gIiAiLmpvaW4oc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2Ugb3IgW10pCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5pbmNvbXBhdF9saWNlbnNlID0gc2VsZi5jb25maWd1cmF0aW9uLmluY29tcGF0X2xpY2Vuc2Uuc3RyaXAoKQorCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi50b29sY2hhaW5fYnVpbGQgPSBzZWxmLnNka19jaGVja2JveC5nZXRfYWN0aXZlKCkKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmN1cnJfc2RrX21hY2hpbmUgPSBzZWxmLnNka19tYWNoaW5lX2NvbWJvLmdldF9hY3RpdmVfdGV4dCgpCisgICAgICAgIG1kNSA9IHNlbGYuY29uZmlnX21kNSgpCisgICAgICAgIHNlbGYuc2V0dGluZ3NfY2hhbmdlZCA9IChzZWxmLm1kNSAhPSBtZDUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2NydW1ic2RpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvY3J1bWJzZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzlmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2NydW1ic2RpYWxvZy5weQpAQCAtMCwwICsxLDQ0IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBDcnVtYnNEaWFsb2coZ3RrLkRpYWxvZyk6CisgICAgIiIiCisgICAgQSBHTk9NRSBISUcgY29tcGxpYW50IGRpYWxvZyB3aWRnZXQuCisgICAgQWRkIGJ1dHRvbnMgd2l0aCBndGsuRGlhbG9nLmFkZF9idXR0b24gb3IgZ3RrLkRpYWxvZy5hZGRfYnV0dG9ucworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZT0iIiwgcGFyZW50PU5vbmUsIGZsYWdzPTAsIGJ1dHRvbnM9Tm9uZSk6CisgICAgICAgIHN1cGVyKENydW1ic0RpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisKKyAgICAgICAgc2VsZi5zZXRfcHJvcGVydHkoImhhcy1zZXBhcmF0b3IiLCBGYWxzZSkgIyBub3RlOiBkZXByZWNhdGVkIGluIDIuMjIKKworICAgICAgICBzZWxmLnNldF9ib3JkZXJfd2lkdGgoNikKKyAgICAgICAgc2VsZi52Ym94LnNldF9wcm9wZXJ0eSgic3BhY2luZyIsIDEyKQorICAgICAgICBzZWxmLmFjdGlvbl9hcmVhLnNldF9wcm9wZXJ0eSgic3BhY2luZyIsIDEyKQorICAgICAgICBzZWxmLmFjdGlvbl9hcmVhLnNldF9wcm9wZXJ0eSgiYm9yZGVyLXdpZHRoIiwgNikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvY3J1bWJzbWVzc2FnZWRpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvY3J1bWJzbWVzc2FnZWRpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk5OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9jcnVtYnNtZXNzYWdlZGlhbG9nLnB5CkBAIC0wLDAgKzEsNzAgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBnbGliCitpbXBvcnQgZ3RrCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IEhvYkljb25DaGVja2VyCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIENydW1ic01lc3NhZ2VEaWFsb2coZ3RrLk1lc3NhZ2VEaWFsb2cpOgorICAgICIiIgorICAgIEEgR05PTUUgSElHIGNvbXBsaWFudCBkaWFsb2cgd2lkZ2V0LgorICAgIEFkZCBidXR0b25zIHdpdGggZ3RrLkRpYWxvZy5hZGRfYnV0dG9uIG9yIGd0ay5EaWFsb2cuYWRkX2J1dHRvbnMKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50ID0gTm9uZSwgbGFiZWw9IiIsIGRpYWxvZ190eXBlID0gZ3RrLk1FU1NBR0VfUVVFU1RJT04sIG1zZz0iIik6CisgICAgICAgIHN1cGVyKENydW1ic01lc3NhZ2VEaWFsb2csIHNlbGYpLl9faW5pdF9fKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5ESUFMT0dfTU9EQUwgfCBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuQlVUVE9OU19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lKQorCisgICAgICAgIHNlbGYuc2V0X3NraXBfdGFza2Jhcl9oaW50KEZhbHNlKQorCisgICAgICAgIHNlbGYuc2V0X21hcmt1cChsYWJlbCkKKworICAgICAgICBpZiAwIDw9IGxlbihtc2cpIDwgMzAwOgorICAgICAgICAgICAgc2VsZi5mb3JtYXRfc2Vjb25kYXJ5X21hcmt1cChtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2Ym94ID0gc2VsZi5nZXRfbWVzc2FnZV9hcmVhKCkKKyAgICAgICAgICAgIHZib3guc2V0X2JvcmRlcl93aWR0aCgxKQorICAgICAgICAgICAgdmJveC5zZXRfcHJvcGVydHkoInNwYWNpbmciLCAxMikKKyAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdyA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcgPSBndGsuVGV4dFZpZXcoKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF9lZGl0YWJsZShGYWxzZSkKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zZXRfd3JhcF9tb2RlKGd0ay5XUkFQX1dPUkQpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2V0X2N1cnNvcl92aXNpYmxlKEZhbHNlKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF9zaXplX3JlcXVlc3QoMzAwLCAzMDApCisgICAgICAgICAgICBzZWxmLmJ1ZiA9IGd0ay5UZXh0QnVmZmVyKCkKKyAgICAgICAgICAgIHNlbGYuYnVmLnNldF90ZXh0KG1zZykKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zZXRfYnVmZmVyKHNlbGYuYnVmKQorICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LmFkZChzZWxmLm1zZ1ZpZXcpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2hvdygpCisgICAgICAgICAgICB2Ym94LmFkZChzZWxmLnRleHRXaW5kb3cpCisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuc2hvdygpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2RlcGxveWltYWdlZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9kZXBsb3lpbWFnZWRpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTNmZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9kZXBsb3lpbWFnZWRpYWxvZy5weQpAQCAtMCwwICsxLDIxOSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGdsb2IKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNobGV4CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRlbXBmaWxlCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IGhpYywgSG9iQnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5wcm9ncmVzc2JhciBpbXBvcnQgSG9iUHJvZ3Jlc3NCYXIKK2ltcG9ydCBiYi51aS5jcnVtYnMudXRpbHMKK2ltcG9ydCBiYi5wcm9jZXNzCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNtZXNzYWdlZGlhbG9nIGltcG9ydCBDcnVtYnNNZXNzYWdlRGlhbG9nCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBEZXBsb3lJbWFnZURpYWxvZyAoQ3J1bWJzRGlhbG9nKToKKworICAgIF9fZHVtbXlfdXNiX18gPSAiLS1zZWxlY3QgYSB1c2IgZHJpdmUtLSIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgaW1hZ2VfcGF0aCwgcGFyZW50LCBmbGFncywgYnV0dG9ucz1Ob25lLCBzdGFuZGFsb25lPUZhbHNlKToKKyAgICAgICAgc3VwZXIoRGVwbG95SW1hZ2VEaWFsb2csIHNlbGYpLl9faW5pdF9fKHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zKQorCisgICAgICAgIHNlbGYuaW1hZ2VfcGF0aCA9IGltYWdlX3BhdGgKKyAgICAgICAgc2VsZi5zdGFuZGFsb25lID0gc3RhbmRhbG9uZQorCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgIHNlbGYuY29ubmVjdCgicmVzcG9uc2UiLCBzZWxmLnJlc3BvbnNlX2NiKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3NpemVfcmVxdWVzdCg2MDAsIDQwMCkKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBtYXJrdXAgPSAiPHNwYW4gZm9udF9kZXNjPScxMic+VGhlIGltYWdlIHRvIGJlIHdyaXR0ZW4gaW50byB1c2IgZHJpdmU6PC9zcGFuPiIKKyAgICAgICAgbGFiZWwuc2V0X21hcmt1cChtYXJrdXApCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MikKKworICAgICAgICB0YWJsZSA9IGd0ay5UYWJsZSgyLCAxMCwgRmFsc2UpCisgICAgICAgIHRhYmxlLnNldF9jb2xfc3BhY2luZ3MoNSkKKyAgICAgICAgdGFibGUuc2V0X3Jvd19zcGFjaW5ncyg1KQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydCh0YWJsZSwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzY3JvbGwgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICBzY3JvbGwuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgc2Nyb2xsLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICB0diA9IGd0ay5UZXh0VmlldygpCisgICAgICAgIHR2LnNldF9lZGl0YWJsZShGYWxzZSkKKyAgICAgICAgdHYuc2V0X3dyYXBfbW9kZShndGsuV1JBUF9XT1JEKQorICAgICAgICB0di5zZXRfY3Vyc29yX3Zpc2libGUoRmFsc2UpCisgICAgICAgIHNlbGYuYnVmID0gZ3RrLlRleHRCdWZmZXIoKQorICAgICAgICBzZWxmLmJ1Zi5zZXRfdGV4dChzZWxmLmltYWdlX3BhdGgpCisgICAgICAgIHR2LnNldF9idWZmZXIoc2VsZi5idWYpCisgICAgICAgIHNjcm9sbC5hZGQodHYpCisgICAgICAgIHRhYmxlLmF0dGFjaChzY3JvbGwsIDAsIDEwLCAwLCAxKQorCisgICAgICAgICMgVGhlcmUgYXJlIDIgd2F5cyB0byB1c2UgRGVwbG95SW1hZ2VEaWFsb2cKKyAgICAgICAgIyBPbmUgd2F5IGlzIHRoYXQgY2FsbGVkIGJ5IEhPQiB3aGVuIHRoZSAnRGVwbG95IEltYWdlJyBidXR0b24gaXMgY2xpY2tlZAorICAgICAgICAjIFRoZSBvdGhlciB3YXkgaXMgdGhhdCBjYWxsZWQgYnkgYSBzdGFuZGFsb25lIHNjcmlwdC4KKyAgICAgICAgIyBGb2xsb3dpbmcgYmxvY2sgb2YgY29kZXMgaGFuZGxlcyB0aGUgbGF0dGVyIHdheS4gSXQgYWRkcyBhICdTZWxlY3QgSW1hZ2UnIGJ1dHRvbiBhbmQKKyAgICAgICAgIyBlbWl0IGEgc2lnbmFsIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLgorICAgICAgICBpZiBzZWxmLnN0YW5kYWxvbmU6CisgICAgICAgICAgICAgICAgZ29iamVjdC5zaWduYWxfbmV3KCJzZWxlY3RfaW1hZ2VfY2xpY2tlZCIsIHNlbGYsIGdvYmplY3QuU0lHTkFMX1JVTl9GSVJTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsICgpKQorICAgICAgICAgICAgICAgIGljb24gPSBndGsuSW1hZ2UoKQorICAgICAgICAgICAgICAgIHBpeF9idWZmZXIgPSBndGsuZ2RrLnBpeGJ1Zl9uZXdfZnJvbV9maWxlKGhpYy5JQ09OX0lNQUdFU19ESVNQTEFZX0ZJTEUpCisgICAgICAgICAgICAgICAgaWNvbi5zZXRfZnJvbV9waXhidWYocGl4X2J1ZmZlcikKKyAgICAgICAgICAgICAgICBidXR0b24gPSBndGsuQnV0dG9uKCJTZWxlY3QgSW1hZ2UiKQorICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRfaW1hZ2UoaWNvbikKKyAgICAgICAgICAgICAgICAjYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTQwLCA1MCkKKyAgICAgICAgICAgICAgICB0YWJsZS5hdHRhY2goYnV0dG9uLCA5LCAxMCwgMSwgMiwgZ3RrLkZJTEwsIDAsIDAsIDApCisgICAgICAgICAgICAgICAgYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLnNlbGVjdF9pbWFnZV9idXR0b25fY2xpY2tlZF9jYikKKworICAgICAgICBzZXBhcmF0b3IgPSBndGsuSFNlcGFyYXRvcigpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlcGFyYXRvciwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTEwKQorCisgICAgICAgIHNlbGYudXNiX2Rlc2MgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLnVzYl9kZXNjLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIG1hcmt1cCA9ICI8c3BhbiBmb250X2Rlc2M9JzEyJz5Zb3UgaGF2ZW4ndCBjaG9zZW4gYW55IFVTQiBkcml2ZS48L3NwYW4+IgorICAgICAgICBzZWxmLnVzYl9kZXNjLnNldF9tYXJrdXAobWFya3VwKQorCisgICAgICAgIHNlbGYudXNiX2NvbWJvID0gZ3RrLmNvbWJvX2JveF9uZXdfdGV4dCgpCisgICAgICAgIHNlbGYudXNiX2NvbWJvLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLnVzYl9jb21ib19jaGFuZ2VkX2NiKQorICAgICAgICBtb2RlbCA9IHNlbGYudXNiX2NvbWJvLmdldF9tb2RlbCgpCisgICAgICAgIG1vZGVsLmNsZWFyKCkKKyAgICAgICAgc2VsZi51c2JfY29tYm8uYXBwZW5kX3RleHQoc2VsZi5fX2R1bW15X3VzYl9fKQorICAgICAgICBmb3IgdXNiIGluIHNlbGYuZmluZF9hbGxfdXNiX2RldmljZXMoKToKKyAgICAgICAgICAgIHNlbGYudXNiX2NvbWJvLmFwcGVuZF90ZXh0KCIvZGV2LyIgKyB1c2IpCisgICAgICAgIHNlbGYudXNiX2NvbWJvLnNldF9hY3RpdmUoMCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi51c2JfY29tYm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi51c2JfZGVzYywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTIpCisKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIgPSBIb2JQcm9ncmVzc0JhcigpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYucHJvZ3Jlc3NfYmFyLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlcGFyYXRvciA9IGd0ay5IU2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VwYXJhdG9yLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSwgcGFkZGluZz0xMCkKKworICAgICAgICBzZWxmLnZib3guc2hvd19hbGwoKQorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5oaWRlKCkKKworICAgIGRlZiBzZXRfaW1hZ2VfdGV4dF9idWZmZXIoc2VsZiwgaW1hZ2VfcGF0aCk6CisgICAgICAgIHNlbGYuYnVmLnNldF90ZXh0KGltYWdlX3BhdGgpCisKKyAgICBkZWYgc2V0X2ltYWdlX3BhdGgoc2VsZiwgaW1hZ2VfcGF0aCk6CisgICAgICAgIHNlbGYuaW1hZ2VfcGF0aCA9IGltYWdlX3BhdGgKKworICAgIGRlZiBwb3Blbl9yZWFkKHNlbGYsIGNtZCk6CisgICAgICAgIHRtcG91dCwgZXJyb3JzID0gYmIucHJvY2Vzcy5ydW4oIiVzIiAlIGNtZCkKKyAgICAgICAgcmV0dXJuIHRtcG91dC5zdHJpcCgpCisKKyAgICBkZWYgZmluZF9hbGxfdXNiX2RldmljZXMoc2VsZik6CisgICAgICAgIHVzYl9kZXZzID0gWyBvcy5yZWFkbGluayh1KQorICAgICAgICAgICAgZm9yIHUgaW4gZ2xvYi5nbG9iKCcvZGV2L2Rpc2svYnktaWQvdXNiKicpCisgICAgICAgICAgICBpZiBub3QgcmUuc2VhcmNoKHIncGFydFxkKycsIHUpIF0KKyAgICAgICAgcmV0dXJuIFsgJyVzJyAlIHVbdS5yZmluZCgnLycpKzE6XSBmb3IgdSBpbiB1c2JfZGV2cyBdCisKKyAgICBkZWYgZ2V0X3VzYl9pbmZvKHNlbGYsIGRldik6CisgICAgICAgIHJldHVybiAiJXMgJXMiICUgXAorICAgICAgICAgICAgKHNlbGYucG9wZW5fcmVhZCgnY2F0IC9zeXMvY2xhc3MvYmxvY2svJXMvZGV2aWNlL3ZlbmRvcicgJSBkZXYpLAorICAgICAgICAgICAgc2VsZi5wb3Blbl9yZWFkKCdjYXQgL3N5cy9jbGFzcy9ibG9jay8lcy9kZXZpY2UvbW9kZWwnICUgZGV2KSkKKworICAgIGRlZiBzZWxlY3RfaW1hZ2VfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnc2VsZWN0X2ltYWdlX2NsaWNrZWQnKQorCisgICAgZGVmIHVzYl9jb21ib19jaGFuZ2VkX2NiKHNlbGYsIHVzYl9jb21ibyk6CisgICAgICAgIGNvbWJvX2l0ZW0gPSBzZWxmLnVzYl9jb21iby5nZXRfYWN0aXZlX3RleHQoKQorICAgICAgICBpZiBub3QgY29tYm9faXRlbSBvciBjb21ib19pdGVtID09IHNlbGYuX19kdW1teV91c2JfXzoKKyAgICAgICAgICAgIG1hcmt1cCA9ICI8c3BhbiBmb250X2Rlc2M9JzEyJz5Zb3UgaGF2ZW4ndCBjaG9zZW4gYW55IFVTQiBkcml2ZS48L3NwYW4+IgorICAgICAgICAgICAgc2VsZi51c2JfZGVzYy5zZXRfbWFya3VwKG1hcmt1cCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcmt1cCA9ICI8c3BhbiBmb250X2Rlc2M9JzEyJz4iICsgc2VsZi5nZXRfdXNiX2luZm8oY29tYm9faXRlbS5sc3RyaXAoIi9kZXYvIikpICsgIjwvc3Bhbj4iCisgICAgICAgICAgICBzZWxmLnVzYl9kZXNjLnNldF9tYXJrdXAobWFya3VwKQorCisgICAgZGVmIHJlc3BvbnNlX2NiKHNlbGYsIGRpYWxvZywgcmVzcG9uc2VfaWQpOgorICAgICAgICBpZiByZXNwb25zZV9pZCA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgbGJsID0gJycKKyAgICAgICAgICAgIG1zZyA9ICcnCisgICAgICAgICAgICBjb21ib19pdGVtID0gc2VsZi51c2JfY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkKKyAgICAgICAgICAgIGlmIGNvbWJvX2l0ZW0gYW5kIGNvbWJvX2l0ZW0gIT0gc2VsZi5fX2R1bW15X3VzYl9fIGFuZCBzZWxmLmltYWdlX3BhdGg6CisgICAgICAgICAgICAgICAgY21kbGluZSA9IGJiLnVpLmNydW1icy51dGlscy53aGljaF90ZXJtaW5hbCgpCisgICAgICAgICAgICAgICAgaWYgY21kbGluZToKKyAgICAgICAgICAgICAgICAgICAgdG1wZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgICAgICAgICAgICAgIGNtZGxpbmUgKz0gIlwic3VkbyBkZCBpZj0iICsgc2VsZi5pbWFnZV9wYXRoICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mPSIgKyBjb21ib19pdGVtICsgIiAmJiBzeW5jOyBlY2hvICQ/ID4gIiArIHRtcGZpbGUubmFtZSArICJcIiIKKyAgICAgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5jYWxsKHNobGV4LnNwbGl0KGNtZGxpbmUpKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGludCh0bXBmaWxlLnJlYWRsaW5lKCkuc3RyaXAoKSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxibCA9ICI8Yj5EZXBsb3kgaW1hZ2Ugc3VjY2Vzc2Z1bGx5LjwvYj4iCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsYmwgPSAiPGI+RmFpbGVkIHRvIGRlcGxveSBpbWFnZS48L2I+IgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gIlBsZWFzZSBjaGVjayBpbWFnZSA8Yj4lczwvYj4gZXhpc3RzIGFuZCBVU0IgZGV2aWNlIDxiPiVzPC9iPiBpcyB3cml0YWJsZS4iICUgKHNlbGYuaW1hZ2VfcGF0aCwgY29tYm9faXRlbSkKKyAgICAgICAgICAgICAgICAgICAgdG1wZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmltYWdlX3BhdGg6CisgICAgICAgICAgICAgICAgICAgIGxibCA9ICI8Yj5ObyBzZWxlY3Rpb24gbWFkZS48L2I+IgorICAgICAgICAgICAgICAgICAgICBtc2cgPSAiWW91IGhhdmUgbm90IHNlbGVjdGVkIGFuIGltYWdlIHRvIGRlcGxveS4iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGJsID0gIjxiPk5vIHNlbGVjdGlvbiBtYWRlLjwvYj4iCisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJZb3UgaGF2ZSBub3Qgc2VsZWN0ZWQgYSBVU0IgZGV2aWNlLiIKKyAgICAgICAgICAgIGlmIGxlbihsYmwpOgorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHNlbGYsIGxibCwgZ3RrLk1FU1NBR0VfSU5GTywgbXNnKQorICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGNydW1ic19kaWFsb2cuYWRkX2J1dHRvbigiQ2xvc2UiLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgICAgICAgICAgY3J1bWJzX2RpYWxvZy5ydW4oKQorICAgICAgICAgICAgICAgIGNydW1ic19kaWFsb2cuZGVzdHJveSgpCisKKyAgICBkZWYgdXBkYXRlX3Byb2dyZXNzX2JhcihzZWxmLCB0aXRsZSwgZnJhY3Rpb24sIHN0YXR1cz1Ob25lKToKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIudXBkYXRlKGZyYWN0aW9uKQorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRfdGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF9yY3N0eWxlKHN0YXR1cykKKworICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIGlmaWxlLCBvZmlsZSk6CisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuc2hvdygpCisKKyAgICAgICAgZl9mcm9tID0gb3Mub3BlbihpZmlsZSwgb3MuT19SRE9OTFkpCisgICAgICAgIGZfdG8gPSBvcy5vcGVuKG9maWxlLCBvcy5PX1dST05MWSkKKworICAgICAgICB0b3RhbF9zaXplID0gb3Muc3RhdChpZmlsZSkuc3Rfc2l6ZQorICAgICAgICB3cml0dGVuX3NpemUgPSAwCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGJ1ZiA9IG9zLnJlYWQoZl9mcm9tLCAxMDI0KjEwMjQpCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvcy53cml0ZShmX3RvLCBidWYpCisgICAgICAgICAgICB3cml0dGVuX3NpemUgKz0gMTAyNCoxMDI0CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9wcm9ncmVzc19iYXIoIldyaXRpbmcgdG8gdXNiOiIsIHdyaXR0ZW5fc2l6ZSAqIDEuMC90b3RhbF9zaXplKQorCisgICAgICAgIHNlbGYudXBkYXRlX3Byb2dyZXNzX2JhcigiV3JpdGluZyBjb21wbGV0ZWQ6IiwgMS4wKQorICAgICAgICBvcy5jbG9zZShmX2Zyb20pCisgICAgICAgIG9zLmNsb3NlKGZfdG8pCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLmhpZGUoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9pbWFnZXNlbGVjdGlvbmRpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvaW1hZ2VzZWxlY3Rpb25kaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyMTZhZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvaW1hZ2VzZWxlY3Rpb25kaWFsb2cucHkKQEAgLTAsMCArMSwxNzIgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgb3MKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iVmlld1RhYmxlLCBIb2JJbmZvQnV0dG9uLCBIb2JCdXR0b24sIEhvYkFsdEJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic2RpYWxvZyBpbXBvcnQgQ3J1bWJzRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcubGF5ZXJzZWxlY3Rpb25kaWFsb2cgaW1wb3J0IExheWVyU2VsZWN0aW9uRGlhbG9nCisKKyIiIgorVGhlIGZvbGxvd2luZyBhcmUgY29udmVuaWVuY2UgY2xhc3NlcyBmb3IgaW1wbGVtZW50aW5nIEdOT01FIEhJRyBjb21wbGlhbnQKK0JpdEJha2UgR1VJJ3MKK0luIHN1bW1hcnk6IHNwYWNpbmcgPSAxMnB4LCBib3JkZXItd2lkdGggPSA2cHgKKyIiIgorCitjbGFzcyBJbWFnZVNlbGVjdGlvbkRpYWxvZyAoQ3J1bWJzRGlhbG9nKToKKworICAgIF9fY29sdW1uc19fID0gW3sKKyAgICAgICAgICAgICdjb2xfbmFtZScgOiAnSW1hZ2UgbmFtZScsCisgICAgICAgICAgICAnY29sX2lkJyAgIDogMCwKKyAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAnY29sX21pbicgIDogNDAwLAorICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDQwMAorICAgICAgICB9LCB7CisgICAgICAgICAgICAnY29sX25hbWUnIDogJ1NlbGVjdCcsCisgICAgICAgICAgICAnY29sX2lkJyAgIDogMSwKKyAgICAgICAgICAgICdjb2xfc3R5bGUnOiAncmFkaW8gdG9nZ2xlJywKKyAgICAgICAgICAgICdjb2xfbWluJyAgOiAxNjAsCisgICAgICAgICAgICAnY29sX21heCcgIDogMTYwCisgICAgfV0KKworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGltYWdlX2ZvbGRlciwgaW1hZ2VfdHlwZXMsIHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zPU5vbmUsIGltYWdlX2V4dGVuc2lvbiA9IHt9KToKKyAgICAgICAgc3VwZXIoSW1hZ2VTZWxlY3Rpb25EaWFsb2csIHNlbGYpLl9faW5pdF9fKHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zKQorICAgICAgICBzZWxmLmNvbm5lY3QoInJlc3BvbnNlIiwgc2VsZi5yZXNwb25zZV9jYikKKworICAgICAgICBzZWxmLmltYWdlX2ZvbGRlciA9IGltYWdlX2ZvbGRlcgorICAgICAgICBzZWxmLmltYWdlX3R5cGVzICA9IGltYWdlX3R5cGVzCisgICAgICAgIHNlbGYuaW1hZ2VfbGlzdCA9IFtdCisgICAgICAgIHNlbGYuaW1hZ2VfbmFtZXMgPSBbXQorICAgICAgICBzZWxmLmltYWdlX2V4dGVuc2lvbiA9IGltYWdlX2V4dGVuc2lvbgorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICAgICAgc2VsZi5pbWFnZV9zdG9yZSA9IGd0ay5MaXN0U3RvcmUoZ29iamVjdC5UWVBFX1NUUklORywgZ29iamVjdC5UWVBFX0JPT0xFQU4pCisgICAgICAgIHNlbGYuZmlsbF9pbWFnZV9zdG9yZSgpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KGhib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBlbnRyeSA9IGd0ay5FbnRyeSgpCisgICAgICAgIGVudHJ5LnNldF90ZXh0KHNlbGYuaW1hZ2VfZm9sZGVyKQorICAgICAgICB0YWJsZSA9IGd0ay5UYWJsZSgxLCAxMCwgVHJ1ZSkKKyAgICAgICAgdGFibGUuc2V0X3NpemVfcmVxdWVzdCg1NjAsIC0xKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQodGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgdGFibGUuYXR0YWNoKGVudHJ5LCAwLCA5LCAwLCAxKQorICAgICAgICBpbWFnZSA9IGd0ay5JbWFnZSgpCisgICAgICAgIGltYWdlLnNldF9mcm9tX3N0b2NrKGd0ay5TVE9DS19PUEVOLCBndGsuSUNPTl9TSVpFX0JVVFRPTikKKyAgICAgICAgb3Blbl9idXR0b24gPSBndGsuQnV0dG9uKCkKKyAgICAgICAgb3Blbl9idXR0b24uc2V0X2ltYWdlKGltYWdlKQorICAgICAgICBvcGVuX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5zZWxlY3RfcGF0aF9jYiwgc2VsZiwgZW50cnkpCisgICAgICAgIHRhYmxlLmF0dGFjaChvcGVuX2J1dHRvbiwgOSwgMTAsIDAsIDEpCisKKyAgICAgICAgc2VsZi5pbWFnZV90YWJsZSA9IEhvYlZpZXdUYWJsZShzZWxmLl9fY29sdW1uc19fLCAiSW1hZ2VzIikKKyAgICAgICAgc2VsZi5pbWFnZV90YWJsZS5zZXRfc2l6ZV9yZXF1ZXN0KC0xLCAzMDApCisgICAgICAgIHNlbGYuaW1hZ2VfdGFibGUuY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYudG9nZ2xlZF9jYikKKyAgICAgICAgc2VsZi5pbWFnZV90YWJsZS5jb25uZWN0X2dyb3VwX3NlbGVjdGlvbihzZWxmLnRhYmxlX3NlbGVjdGVkX2NiKQorICAgICAgICBzZWxmLmltYWdlX3RhYmxlLmNvbm5lY3QoInJvdy1hY3RpdmF0ZWQiLCBzZWxmLnJvd19hY3RpdmVkX2NiKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLmltYWdlX3RhYmxlLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIGNoYW5nZV9pbWFnZV9jYihzZWxmLCBtb2RlbCwgcGF0aCwgY29sdW1uaWQpOgorICAgICAgICBpZiBub3QgbW9kZWw6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaXRlciA9IG1vZGVsLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXRlcjoKKyAgICAgICAgICAgIHJvd3BhdGggPSBtb2RlbC5nZXRfcGF0aChpdGVyKQorICAgICAgICAgICAgbW9kZWxbcm93cGF0aF1bY29sdW1uaWRdID0gRmFsc2UKKyAgICAgICAgICAgIGl0ZXIgPSBtb2RlbC5pdGVyX25leHQoaXRlcikKKworICAgICAgICBtb2RlbFtwYXRoXVtjb2x1bW5pZF0gPSBUcnVlCisKKyAgICBkZWYgdG9nZ2xlZF9jYihzZWxmLCB0YWJsZSwgY2VsbCwgcGF0aCwgY29sdW1uaWQsIHRyZWUpOgorICAgICAgICBtb2RlbCA9IHRyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VfaW1hZ2VfY2IobW9kZWwsIHBhdGgsIGNvbHVtbmlkKQorCisgICAgZGVmIHRhYmxlX3NlbGVjdGVkX2NiKHNlbGYsIHNlbGVjdGlvbik6CisgICAgICAgIG1vZGVsLCBwYXRocyA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWRfcm93cygpCisgICAgICAgIGlmIHBhdGhzOgorICAgICAgICAgICAgc2VsZi5jaGFuZ2VfaW1hZ2VfY2IobW9kZWwsIHBhdGhzWzBdLCAxKQorCisgICAgZGVmIHJvd19hY3RpdmVkX2NiKHNlbGYsIHRhYiwgbW9kZWwsIHBhdGgpOgorICAgICAgICBzZWxmLmNoYW5nZV9pbWFnZV9jYihtb2RlbCwgcGF0aCwgMSkKKyAgICAgICAgc2VsZi5lbWl0KCdyZXNwb25zZScsIGd0ay5SRVNQT05TRV9ZRVMpCisKKyAgICBkZWYgc2VsZWN0X3BhdGhfY2Ioc2VsZiwgYWN0aW9uLCBwYXJlbnQsIGVudHJ5KToKKyAgICAgICAgZGlhbG9nID0gZ3RrLkZpbGVDaG9vc2VyRGlhbG9nKCIiLCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuRklMRV9DSE9PU0VSX0FDVElPTl9TRUxFQ1RfRk9MREVSKQorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBkaWFsb2cuc2V0X2N1cnJlbnRfZm9sZGVyKHRleHQgaWYgbGVuKHRleHQpID4gMCBlbHNlIG9zLmdldGN3ZCgpKQorICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX05PKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIk9wZW4iLCBndGsuUkVTUE9OU0VfWUVTKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKGJ1dHRvbikKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIHBhdGggPSBkaWFsb2cuZ2V0X2ZpbGVuYW1lKCkKKyAgICAgICAgICAgIGVudHJ5LnNldF90ZXh0KHBhdGgpCisgICAgICAgICAgICBzZWxmLmltYWdlX2ZvbGRlciA9IHBhdGgKKyAgICAgICAgICAgIHNlbGYuZmlsbF9pbWFnZV9zdG9yZSgpCisKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIGZpbGxfaW1hZ2Vfc3RvcmUoc2VsZik6CisgICAgICAgIHNlbGYuaW1hZ2VfbGlzdCA9IFtdCisgICAgICAgIHNlbGYuaW1hZ2Vfc3RvcmUuY2xlYXIoKQorICAgICAgICBpbWFnZXNldCA9IHNldCgpCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuaW1hZ2VfZm9sZGVyKToKKyAgICAgICAgICAgICMgaWdub3JlIHRoZSBzdWIgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgIGRpcnNbOl0gPSBbXQorICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgZm9yIGltYWdlX3R5cGUgaW4gc2VsZi5pbWFnZV90eXBlczoKKyAgICAgICAgICAgICAgICAgICAgaWYgaW1hZ2VfdHlwZSBpbiBzZWxmLmltYWdlX2V4dGVuc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfdHlwZXMgPSBzZWxmLmltYWdlX2V4dGVuc2lvbltpbWFnZV90eXBlXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF90eXBlcyA9IFtpbWFnZV90eXBlXQorICAgICAgICAgICAgICAgICAgICBmb3IgcmVhbF9pbWFnZV90eXBlIGluIHJlYWxfdHlwZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBmLmVuZHN3aXRoKCcuJyArIHJlYWxfaW1hZ2VfdHlwZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzZXQuYWRkKGYucnNwbGl0KCcuJyArIHJlYWxfaW1hZ2VfdHlwZSlbMF0ucnNwbGl0KCcucm9vdGZzJylbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWFnZV9saXN0LmFwcGVuZChmKQorCisgICAgICAgIGZvciBpbWFnZSBpbiBpbWFnZXNldDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2Vfc3RvcmUuc2V0KHNlbGYuaW1hZ2Vfc3RvcmUuYXBwZW5kKCksIDAsIGltYWdlLCAxLCBGYWxzZSkKKworICAgICAgICBzZWxmLmltYWdlX3RhYmxlLnNldF9tb2RlbChzZWxmLmltYWdlX3N0b3JlKQorCisgICAgZGVmIHJlc3BvbnNlX2NiKHNlbGYsIGRpYWxvZywgcmVzcG9uc2VfaWQpOgorICAgICAgICBzZWxmLmltYWdlX25hbWVzID0gW10KKyAgICAgICAgaWYgcmVzcG9uc2VfaWQgPT0gZ3RrLlJFU1BPTlNFX1lFUzoKKyAgICAgICAgICAgIGl0ZXIgPSBzZWxmLmltYWdlX3N0b3JlLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgICAgIHdoaWxlIGl0ZXI6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuaW1hZ2Vfc3RvcmUuZ2V0X3BhdGgoaXRlcikKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmltYWdlX3N0b3JlW3BhdGhdWzFdOgorICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLmltYWdlX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBmLnN0YXJ0c3dpdGgoc2VsZi5pbWFnZV9zdG9yZVtwYXRoXVswXSArICcuJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWFnZV9uYW1lcy5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpdGVyID0gc2VsZi5pbWFnZV9zdG9yZS5pdGVyX25leHQoaXRlcikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvbGF5ZXJzZWxlY3Rpb25kaWFsb2cucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2xheWVyc2VsZWN0aW9uZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDU3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL2xheWVyc2VsZWN0aW9uZGlhbG9nLnB5CkBAIC0wLDAgKzEsMjk4IEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaGljLCBIb2JCdXR0b24sIEhvYkFsdEJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic2RpYWxvZyBpbXBvcnQgQ3J1bWJzRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzbWVzc2FnZWRpYWxvZyBpbXBvcnQgQ3J1bWJzTWVzc2FnZURpYWxvZworCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworY2xhc3MgQ2VsbFJlbmRlcmVyUGl4YnVmQWN0aXZhdGFibGUoZ3RrLkNlbGxSZW5kZXJlclBpeGJ1Zik6CisgICAgIiIiCisgICAgQSBjdXN0b20gQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIGFjdGl2YXRhYmxlCisgICAgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHVzZXIgY2xpY2tzCisgICAgIiIiCisgICAgX19nc2lnbmFsc19fICAgID0geyAnY2xpY2tlZCcgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9TVFJJTkcsKSksIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLkNlbGxSZW5kZXJlclBpeGJ1Zi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldF9wcm9wZXJ0eSgnbW9kZScsIGd0ay5DRUxMX1JFTkRFUkVSX01PREVfQUNUSVZBVEFCTEUpCisgICAgICAgIHNlbGYuc2V0X3Byb3BlcnR5KCdmb2xsb3ctc3RhdGUnLCBUcnVlKQorCisgICAgIiIiCisgICAgUmVzcG9uZCB0byBhIHVzZXIgY2xpY2sgb24gYSBjZWxsCisgICAgIiIiCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIGV2ZW4sIHdpZGdldCwgcGF0aCwgYmFja2dyb3VuZF9hcmVhLCBjZWxsX2FyZWEsIGZsYWdzKToKKyAgICAgICAgc2VsZi5lbWl0KCdjbGlja2VkJywgcGF0aCkKKworIworIyBMYXllclNlbGVjdGlvbkRpYWxvZworIworY2xhc3MgTGF5ZXJTZWxlY3Rpb25EaWFsb2cgKENydW1ic0RpYWxvZyk6CisKKyAgICBUQVJHRVRTID0gWworICAgICAgICAoIk1ZX1RSRUVfTU9ERUxfUk9XIiwgZ3RrLlRBUkdFVF9TQU1FX1dJREdFVCwgMCksCisgICAgICAgICgidGV4dC9wbGFpbiIsIDAsIDEpLAorICAgICAgICAoIlRFWFQiLCAwLCAyKSwKKyAgICAgICAgKCJTVFJJTkciLCAwLCAzKSwKKyAgICAgICAgXQorCisgICAgZGVmIGdlbl9sYWJlbF93aWRnZXQoc2VsZiwgY29udGVudCk6CisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKGNvbnRlbnQpCisgICAgICAgIGxhYmVsLnNob3coKQorICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBsYXllcl93aWRnZXRfdG9nZ2xlZF9jYihzZWxmLCBjZWxsLCBwYXRoLCBsYXllcl9zdG9yZSk6CisgICAgICAgIG5hbWUgPSBsYXllcl9zdG9yZVtwYXRoXVswXQorICAgICAgICB0b2dnbGUgPSBub3QgbGF5ZXJfc3RvcmVbcGF0aF1bMV0KKyAgICAgICAgbGF5ZXJfc3RvcmVbcGF0aF1bMV0gPSB0b2dnbGUKKworICAgIGRlZiBsYXllcl93aWRnZXRfYWRkX2NsaWNrZWRfY2Ioc2VsZiwgYWN0aW9uLCBsYXllcl9zdG9yZSwgcGFyZW50KToKKyAgICAgICAgZGlhbG9nID0gZ3RrLkZpbGVDaG9vc2VyRGlhbG9nKCJBZGQgbmV3IGxheWVyIiwgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLkZJTEVfQ0hPT1NFUl9BQ1RJT05fU0VMRUNUX0ZPTERFUikKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNhbmNlbCIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJPcGVuIiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCJTZWxlY3QgdGhlIGxheWVyIHlvdSB3aXNoIHRvIGFkZCIpCisgICAgICAgIGxhYmVsLnNob3coKQorICAgICAgICBkaWFsb2cuc2V0X2V4dHJhX3dpZGdldChsYWJlbCkKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgcGF0aCA9IGRpYWxvZy5nZXRfZmlsZW5hbWUoKQorICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisKKyAgICAgICAgbGJsID0gIjxiPkVycm9yPC9iPiIKKyAgICAgICAgbXNnID0gIlVuYWJsZSB0byBsb2FkIGxheWVyIDxpPiVzPC9pPiBiZWNhdXNlICIgJSBwYXRoCisgICAgICAgIGlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCBvcy5wYXRoCisgICAgICAgICAgICBsYXllcnMgPSBbXQorICAgICAgICAgICAgaXQgPSBsYXllcl9zdG9yZS5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgICAgICBsYXllcnMuYXBwZW5kKGxheWVyX3N0b3JlLmdldF92YWx1ZShpdCwgMCkpCisgICAgICAgICAgICAgICAgaXQgPSBsYXllcl9zdG9yZS5pdGVyX25leHQoaXQpCisKKyAgICAgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgICAgIG1zZyArPSAiaXQgaXMgYW4gaW52YWxpZCBwYXRoLiIKKyAgICAgICAgICAgIGVsaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgrIi9jb25mL2xheWVyLmNvbmYiKToKKyAgICAgICAgICAgICAgICBtc2cgKz0gInRoZXJlIGlzIG5vIGxheWVyLmNvbmYgaW5zaWRlIHRoZSBkaXJlY3RvcnkuIgorICAgICAgICAgICAgZWxpZiBwYXRoIGluIGxheWVyczoKKyAgICAgICAgICAgICAgICBtc2cgKz0gIml0IGlzIGFscmVhZHkgaW4gbG9hZGVkIGxheWVycy4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxheWVyX3N0b3JlLmFwcGVuZChbcGF0aF0pCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBkaWFsb2cgPSBDcnVtYnNNZXNzYWdlRGlhbG9nKHBhcmVudCwgbGJsLCBndGsuTUVTU0FHRV9FUlJPUiwgbXNnKQorICAgICAgICAgICAgZGlhbG9nLmFkZF9idXR0b24oZ3RrLlNUT0NLX0NMT1NFLCBndGsuUkVTUE9OU0VfT0spCisgICAgICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIGxheWVyX3dpZGdldF9kZWxfY2xpY2tlZF9jYihzZWxmLCBhY3Rpb24sIHRyZWVfc2VsZWN0aW9uLCBsYXllcl9zdG9yZSk6CisgICAgICAgIG1vZGVsLCBpdGVyID0gdHJlZV9zZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgaWYgaXRlcjoKKyAgICAgICAgICAgIGxheWVyX3N0b3JlLnJlbW92ZShpdGVyKQorCisKKyAgICBkZWYgZ2VuX2xheWVyX3dpZGdldChzZWxmLCBsYXllcnMsIGxheWVyc19hdmFpbCwgd2luZG93LCB0b29sdGlwPSIiKToKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorCisgICAgICAgIGxheWVyX3R2ID0gZ3RrLlRyZWVWaWV3KCkKKyAgICAgICAgbGF5ZXJfdHYuc2V0X3J1bGVzX2hpbnQoVHJ1ZSkKKyAgICAgICAgbGF5ZXJfdHYuc2V0X2hlYWRlcnNfdmlzaWJsZShGYWxzZSkKKyAgICAgICAgdHJlZV9zZWxlY3Rpb24gPSBsYXllcl90di5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgdHJlZV9zZWxlY3Rpb24uc2V0X21vZGUoZ3RrLlNFTEVDVElPTl9TSU5HTEUpCisKKyAgICAgICAgIyBBbGxvdyBlbmFibGUgZHJhZyBhbmQgZHJvcCBvZiByb3dzIGluY2x1ZGluZyByb3cgbW92ZQorICAgICAgICBkbmRfaW50ZXJuYWxfdGFyZ2V0ID0gJycKKyAgICAgICAgZG5kX3RhcmdldHMgPSBbKGRuZF9pbnRlcm5hbF90YXJnZXQsIGd0ay5UQVJHRVRfU0FNRV9XSURHRVQsIDApXQorICAgICAgICBsYXllcl90di5lbmFibGVfbW9kZWxfZHJhZ19zb3VyY2UoIGd0ay5nZGsuQlVUVE9OMV9NQVNLLAorICAgICAgICAgICAgZG5kX3RhcmdldHMsCisgICAgICAgICAgICBndGsuZ2RrLkFDVElPTl9NT1ZFKQorICAgICAgICBsYXllcl90di5lbmFibGVfbW9kZWxfZHJhZ19kZXN0KGRuZF90YXJnZXRzLAorICAgICAgICAgICAgZ3RrLmdkay5BQ1RJT05fTU9WRSkKKyAgICAgICAgbGF5ZXJfdHYuY29ubmVjdCgiZHJhZ19kYXRhX2dldCIsIHNlbGYuZHJhZ19kYXRhX2dldF9jYikKKyAgICAgICAgbGF5ZXJfdHYuY29ubmVjdCgiZHJhZ19kYXRhX3JlY2VpdmVkIiwgc2VsZi5kcmFnX2RhdGFfcmVjZWl2ZWRfY2IpCisKKyAgICAgICAgY29sMD0gZ3RrLlRyZWVWaWV3Q29sdW1uKCdQYXRoJykKKyAgICAgICAgY2VsbDAgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIGNlbGwwLnNldF9wYWRkaW5nKDUsMikKKyAgICAgICAgY29sMC5wYWNrX3N0YXJ0KGNlbGwwLCBUcnVlKQorICAgICAgICBjb2wwLnNldF9jZWxsX2RhdGFfZnVuYyhjZWxsMCwgc2VsZi5kcmF3X2xheWVyX3BhdGhfY2IpCisgICAgICAgIGxheWVyX3R2LmFwcGVuZF9jb2x1bW4oY29sMCkKKworICAgICAgICBzY3JvbGwgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICBzY3JvbGwuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgc2Nyb2xsLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICBzY3JvbGwuYWRkKGxheWVyX3R2KQorCisgICAgICAgIHRhYmxlX2xheWVyID0gZ3RrLlRhYmxlKDIsIDEwLCBGYWxzZSkKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHRhYmxlX2xheWVyLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHRhYmxlX2xheWVyLmF0dGFjaChzY3JvbGwsIDAsIDEwLCAwLCAxKQorCisgICAgICAgIGxheWVyX3N0b3JlID0gZ3RrLkxpc3RTdG9yZShnb2JqZWN0LlRZUEVfU1RSSU5HKQorICAgICAgICBmb3IgbGF5ZXIgaW4gbGF5ZXJzOgorICAgICAgICAgICAgbGF5ZXJfc3RvcmUuYXBwZW5kKFtsYXllcl0pCisKKyAgICAgICAgY29sMSA9IGd0ay5UcmVlVmlld0NvbHVtbignRW5hYmxlZCcpCisgICAgICAgIGxheWVyX3R2LmFwcGVuZF9jb2x1bW4oY29sMSkKKworICAgICAgICBjZWxsMSA9IENlbGxSZW5kZXJlclBpeGJ1ZkFjdGl2YXRhYmxlKCkKKyAgICAgICAgY2VsbDEuc2V0X2ZpeGVkX3NpemUoLTEsMzUpCisgICAgICAgIGNlbGwxLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmRlbF9jZWxsX2NsaWNrZWRfY2IsIGxheWVyX3N0b3JlKQorICAgICAgICBjb2wxLnBhY2tfc3RhcnQoY2VsbDEsIFRydWUpCisgICAgICAgIGNvbDEuc2V0X2NlbGxfZGF0YV9mdW5jKGNlbGwxLCBzZWxmLmRyYXdfZGVsZXRlX2J1dHRvbl9jYiwgbGF5ZXJfdHYpCisKKyAgICAgICAgYWRkX2J1dHRvbiA9IGd0ay5CdXR0b24oKQorICAgICAgICBhZGRfYnV0dG9uLnNldF9yZWxpZWYoZ3RrLlJFTElFRl9OT05FKQorICAgICAgICBib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgYm94LnNob3coKQorICAgICAgICBhZGRfYnV0dG9uLmFkZChib3gpCisgICAgICAgIGFkZF9idXR0b24uY29ubmVjdCgiZW50ZXItbm90aWZ5LWV2ZW50Iiwgc2VsZi5hZGRfaG92ZXJfY2IpCisgICAgICAgIGFkZF9idXR0b24uY29ubmVjdCgibGVhdmUtbm90aWZ5LWV2ZW50Iiwgc2VsZi5hZGRfbGVhdmVfY2IpCisgICAgICAgIHNlbGYuaW0gPSBndGsuSW1hZ2UoKQorICAgICAgICBzZWxmLmltLnNldF9mcm9tX2ZpbGUoaGljLklDT05fSU5ESV9BRERfRklMRSkKKyAgICAgICAgc2VsZi5pbS5zaG93KCkKKyAgICAgICAgYm94LnBhY2tfc3RhcnQoc2VsZi5pbSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTYpCisgICAgICAgIGxibCA9IGd0ay5MYWJlbCgiQWRkIGxheWVyIikKKyAgICAgICAgbGJsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIGxibC5zaG93KCkKKyAgICAgICAgYm94LnBhY2tfc3RhcnQobGJsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlLCBwYWRkaW5nPTYpCisgICAgICAgIGFkZF9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYubGF5ZXJfd2lkZ2V0X2FkZF9jbGlja2VkX2NiLCBsYXllcl9zdG9yZSwgd2luZG93KQorICAgICAgICB0YWJsZV9sYXllci5hdHRhY2goYWRkX2J1dHRvbiwgMCwgMTAsIDEsIDIsIGd0ay5FWFBBTkQgfCBndGsuRklMTCwgMCwgMCwgNikKKyAgICAgICAgbGF5ZXJfdHYuc2V0X21vZGVsKGxheWVyX3N0b3JlKQorCisgICAgICAgIGhib3guc2hvd19hbGwoKQorCisgICAgICAgIHJldHVybiBoYm94LCBsYXllcl9zdG9yZQorCisgICAgZGVmIGRyYWdfZGF0YV9nZXRfY2Ioc2VsZiwgdHJlZXZpZXcsIGNvbnRleHQsIHNlbGVjdGlvbiwgdGFyZ2V0X2lkLCBldGltZSk6CisgICAgICAgIHRyZWVzZWxlY3Rpb24gPSB0cmVldmlldy5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgbW9kZWwsIGl0ZXIgPSB0cmVlc2VsZWN0aW9uLmdldF9zZWxlY3RlZCgpCisgICAgICAgIGRhdGEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlciwgMCkKKyAgICAgICAgc2VsZWN0aW9uLnNldChzZWxlY3Rpb24udGFyZ2V0LCA4LCBkYXRhKQorCisgICAgZGVmIGRyYWdfZGF0YV9yZWNlaXZlZF9jYihzZWxmLCB0cmVldmlldywgY29udGV4dCwgeCwgeSwgc2VsZWN0aW9uLCBpbmZvLCBldGltZSk6CisgICAgICAgIG1vZGVsID0gdHJlZXZpZXcuZ2V0X21vZGVsKCkKKyAgICAgICAgZGF0YSA9IHNlbGVjdGlvbi5kYXRhCisgICAgICAgIGRyb3BfaW5mbyA9IHRyZWV2aWV3LmdldF9kZXN0X3Jvd19hdF9wb3MoeCwgeSkKKyAgICAgICAgaWYgZHJvcF9pbmZvOgorICAgICAgICAgICAgcGF0aCwgcG9zaXRpb24gPSBkcm9wX2luZm8KKyAgICAgICAgICAgIGl0ZXIgPSBtb2RlbC5nZXRfaXRlcihwYXRoKQorICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IGd0ay5UUkVFX1ZJRVdfRFJPUF9CRUZPUkUgb3IgcG9zaXRpb24gPT0gZ3RrLlRSRUVfVklFV19EUk9QX0lOVE9fT1JfQkVGT1JFKToKKyAgICAgICAgICAgICAgICBtb2RlbC5pbnNlcnRfYmVmb3JlKGl0ZXIsIFtkYXRhXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbW9kZWwuaW5zZXJ0X2FmdGVyKGl0ZXIsIFtkYXRhXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZGVsLmFwcGVuZChbZGF0YV0pCisgICAgICAgIGlmIGNvbnRleHQuYWN0aW9uID09IGd0ay5nZGsuQUNUSU9OX01PVkU6CisgICAgICAgICAgICBjb250ZXh0LmZpbmlzaChUcnVlLCBUcnVlLCBldGltZSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgYWRkX2hvdmVyX2NiKHNlbGYsIGJ1dHRvbiwgZXZlbnQpOgorICAgICAgICBzZWxmLmltLnNldF9mcm9tX2ZpbGUoaGljLklDT05fSU5ESV9BRERfSE9WRVJfRklMRSkKKworICAgIGRlZiBhZGRfbGVhdmVfY2Ioc2VsZiwgYnV0dG9uLCBldmVudCk6CisgICAgICAgIHNlbGYuaW0uc2V0X2Zyb21fZmlsZShoaWMuSUNPTl9JTkRJX0FERF9GSUxFKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlLCBsYXllcnMsIGxheWVyc19ub25fcmVtb3ZhYmxlLCBhbGxfbGF5ZXJzLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zPU5vbmUpOgorICAgICAgICBzdXBlcihMYXllclNlbGVjdGlvbkRpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisKKyAgICAgICAgIyBjbGFzcyBtZW1iZXJzIGZyb20gb3RoZXIgb2JqZWN0cworICAgICAgICBzZWxmLmxheWVycyA9IGxheWVycworICAgICAgICBzZWxmLmxheWVyc19ub25fcmVtb3ZhYmxlID0gbGF5ZXJzX25vbl9yZW1vdmFibGUKKyAgICAgICAgc2VsZi5hbGxfbGF5ZXJzID0gYWxsX2xheWVycworICAgICAgICBzZWxmLmxheWVyc19jaGFuZ2VkID0gRmFsc2UKKworICAgICAgICAjIGljb24gZm9yIHJlbW92ZSBidXR0b24gaW4gVHJlZVZpZXcKKyAgICAgICAgaW0gPSBndGsuSW1hZ2UoKQorICAgICAgICBpbS5zZXRfZnJvbV9maWxlKGhpYy5JQ09OX0lORElfUkVNT1ZFX0ZJTEUpCisgICAgICAgIHNlbGYucmVtX2ljb24gPSBpbS5nZXRfcGl4YnVmKCkKKworICAgICAgICAjIGNsYXNzIG1lbWJlcnMgZm9yIGludGVybmFsIHVzZQorICAgICAgICBzZWxmLmxheWVyX3N0b3JlID0gTm9uZQorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgIHNlbGYuY29ubmVjdCgicmVzcG9uc2UiLCBzZWxmLnJlc3BvbnNlX2NiKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIGxheWVyX3dpZGdldCwgc2VsZi5sYXllcl9zdG9yZSA9IHNlbGYuZ2VuX2xheWVyX3dpZGdldChzZWxmLmxheWVycywgc2VsZi5hbGxfbGF5ZXJzLCBzZWxmLCBOb25lKQorICAgICAgICBsYXllcl93aWRnZXQuc2V0X3NpemVfcmVxdWVzdCg0NTAsIDI1MCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQobGF5ZXJfd2lkZ2V0LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiByZXNwb25zZV9jYihzZWxmLCBkaWFsb2csIHJlc3BvbnNlX2lkKToKKyAgICAgICAgbW9kZWwgPSBzZWxmLmxheWVyX3N0b3JlCisgICAgICAgIGl0ID0gbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICBsYXllcnMgPSBbXQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIGxheWVycy5hcHBlbmQobW9kZWwuZ2V0X3ZhbHVlKGl0LCAwKSkKKyAgICAgICAgICAgIGl0ID0gbW9kZWwuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIHNlbGYubGF5ZXJzX2NoYW5nZWQgPSAoc2VsZi5sYXllcnMgIT0gbGF5ZXJzKQorICAgICAgICBzZWxmLmxheWVycyA9IGxheWVycworCisgICAgIiIiCisgICAgQSBjdXN0b20gY2VsbF9kYXRhX2Z1bmMgdG8gZHJhdyBhIGRlbGV0ZSAnYnV0dG9uJyBpbiB0aGUgVHJlZVZpZXcgZm9yIGxheWVycworICAgIG90aGVyIHRoYW4gdGhlIG1ldGEgbGF5ZXIuIFRoZSBkZWxldGlvbiBvZiB3aGljaCBpcyBwcmV2ZW50ZWQgc28gdGhhdCB0aGUKKyAgICB1c2VyIGNhbid0IHNob290IHRoZW1zZWx2ZXMgaW4gdGhlIGZvb3QgdG9vIGJhZGx5LgorICAgICIiIgorICAgIGRlZiBkcmF3X2RlbGV0ZV9idXR0b25fY2Ioc2VsZiwgY29sLCBjZWxsLCBtb2RlbCwgaXQsIHR2KToKKyAgICAgICAgcGF0aCA9ICBtb2RlbC5nZXRfdmFsdWUoaXQsIDApCisgICAgICAgIGlmIHBhdGggaW4gc2VsZi5sYXllcnNfbm9uX3JlbW92YWJsZToKKyAgICAgICAgICAgIGNlbGwuc2V0X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCdwaXhidWYnLCBOb25lKQorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ21vZGUnLCBndGsuQ0VMTF9SRU5ERVJFUl9NT0RFX0lORVJUKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3BpeGJ1ZicsIHNlbGYucmVtX2ljb24pCisgICAgICAgICAgICBjZWxsLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCdtb2RlJywgZ3RrLkNFTExfUkVOREVSRVJfTU9ERV9BQ1RJVkFUQUJMRSkKKworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIiIiCisgICAgQSBjdXN0b20gY2VsbF9kYXRhX2Z1bmMgdG8gd3JpdGUgYW4gZXh0cmEgbWVzc2FnZSBpbnRvIHRoZSBsYXllciBwYXRoIGNlbGwKKyAgICBmb3IgdGhlIG1ldGEgbGF5ZXIuIFdlIHNob3VsZCBpbmZvcm0gdGhlIHVzZXIgdGhhdCB0aGV5IGNhbid0IHJlbW92ZSBpdCBmb3IKKyAgICB0aGVpciBvd24gc2FmZXR5LgorICAgICIiIgorICAgIGRlZiBkcmF3X2xheWVyX3BhdGhfY2Ioc2VsZiwgY29sLCBjZWxsLCBtb2RlbCwgaXQpOgorICAgICAgICBwYXRoID0gbW9kZWwuZ2V0X3ZhbHVlKGl0LCAwKQorICAgICAgICBpZiBwYXRoIGluIHNlbGYubGF5ZXJzX25vbl9yZW1vdmFibGU6CisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgnbWFya3VwJywgIjxiPkl0IGNhbm5vdCBiZSByZW1vdmVkPC9iPlxuJXMiICUgcGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCd0ZXh0JywgcGF0aCkKKworICAgIGRlZiBkZWxfY2VsbF9jbGlja2VkX2NiKHNlbGYsIGNlbGwsIHBhdGgsIG1vZGVsKToKKyAgICAgICAgaXQgPSBtb2RlbC5nZXRfaXRlcl9mcm9tX3N0cmluZyhwYXRoKQorICAgICAgICBtb2RlbC5yZW1vdmUoaXQpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3BhcnNpbmd3YXJuaW5nc2RpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcGFyc2luZ3dhcm5pbmdzZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmFjMzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3BhcnNpbmd3YXJuaW5nc2RpYWxvZy5weQpAQCAtMCwwICsxLDE2MyBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBDcmlzdGlhbmEgVm9pY3UgPGNyaXN0aWFuYS52b2ljdUBpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAorZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JBbHRCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworIworIyBQYXJzaW5nV2FybmluZ3NEaWFsb2cKKyMKK2NsYXNzIFBhcnNpbmdXYXJuaW5nc0RpYWxvZyAoQ3J1bWJzRGlhbG9nKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgd2FybmluZ3MsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSk6CisgICAgICAgIHN1cGVyKFBhcnNpbmdXYXJuaW5nc0RpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisKKyAgICAgICAgc2VsZi53YXJuaW5ncyA9IHdhcm5pbmdzCisgICAgICAgIHNlbGYud2FybmluZ19vbiA9IDAKKyAgICAgICAgc2VsZi53YXJuX25iID0gbGVuKHdhcm5pbmdzKQorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgY2FuY2VsX2J1dHRvbl9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgZGVmIHByZXZpb3VzX2J1dHRvbl9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLndhcm5pbmdfb24gPSBzZWxmLndhcm5pbmdfb24gLSAxCisgICAgICAgIHNlbGYucmVmcmVzaF9jb21wb25lbnRzKCkKKworICAgIGRlZiBuZXh0X2J1dHRvbl9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLndhcm5pbmdfb24gPSBzZWxmLndhcm5pbmdfb24gKyAxCisgICAgICAgIHNlbGYucmVmcmVzaF9jb21wb25lbnRzKCkKKworICAgIGRlZiByZWZyZXNoX2NvbXBvbmVudHMoc2VsZik6CisgICAgICAgIGxibCA9IHNlbGYud2FybmluZ3Nbc2VsZi53YXJuaW5nX29uXQorICAgICAgICAjd2hlbiB0aGUgd2FybmluZyB0ZXh0IGhhcyBtb3JlIHRoYW4gNDAwIGNoYXJzLCBpdCB1c2VzIGEgc2Nyb2xsIGJhcgorICAgICAgICBpZiAwPD0gbGVuKGxibCkgPCA0MDA6CisgICAgICAgICAgICBzZWxmLndhcm5pbmdfbGFiZWwuc2V0X3NpemVfcmVxdWVzdCgzMjAsIDIzMCkKKyAgICAgICAgICAgIHNlbGYud2FybmluZ19sYWJlbC5zZXRfdXNlX21hcmt1cChUcnVlKQorICAgICAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYud2FybmluZ19sYWJlbC5zZXRfbWFya3VwKGxibCkKKyAgICAgICAgICAgIHNlbGYud2FybmluZ19sYWJlbC5zZXRfcHJvcGVydHkoInlhbGlnbiIsIDAuMDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisgICAgICAgICAgICBzZWxmLnRleHRXaW5kb3cuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcgPSBndGsuVGV4dFZpZXcoKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF9lZGl0YWJsZShGYWxzZSkKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zZXRfd3JhcF9tb2RlKGd0ay5XUkFQX1dPUkQpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2V0X2N1cnNvcl92aXNpYmxlKEZhbHNlKQorICAgICAgICAgICAgc2VsZi5tc2dWaWV3LnNldF9zaXplX3JlcXVlc3QoMzIwLCAyMzApCisgICAgICAgICAgICBzZWxmLmJ1ZiA9IGd0ay5UZXh0QnVmZmVyKCkKKyAgICAgICAgICAgIHNlbGYuYnVmLnNldF90ZXh0KGxibCkKKyAgICAgICAgICAgIHNlbGYubXNnVmlldy5zZXRfYnVmZmVyKHNlbGYuYnVmKQorICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LmFkZChzZWxmLm1zZ1ZpZXcpCisgICAgICAgICAgICBzZWxmLm1zZ1ZpZXcuc2hvdygpCisKKyAgICAgICAgaWYgc2VsZi53YXJuaW5nX29uPT0wOgorICAgICAgICAgICAgc2VsZi5wcmV2aW91c19idXR0b24uc2V0X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJldmlvdXNfYnV0dG9uLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKworICAgICAgICBpZiBzZWxmLndhcm5pbmdfb249PXNlbGYud2Fybl9uYi0xOgorICAgICAgICAgICAgc2VsZi5uZXh0X2J1dHRvbi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uZXh0X2J1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisKKyAgICAgICAgaWYgc2VsZi53YXJuX25iPjE6CisgICAgICAgICAgICBzZWxmLmhlYWRpbmcgPSAiV2FybmluZyAiICsgc3RyKHNlbGYud2FybmluZ19vbiArIDEpICsgIiBvZiAiICsgc3RyKHNlbGYud2Fybl9uYikKKyAgICAgICAgICAgIHNlbGYuaGVhZGluZ19sYWJlbC5zZXRfbWFya3VwKCc8c3BhbiB3ZWlnaHQ9ImJvbGQiPiVzPC9zcGFuPicgJSBzZWxmLmhlYWRpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhlYWRpbmcgPSAiV2FybmluZyIKKyAgICAgICAgICAgIHNlbGYuaGVhZGluZ19sYWJlbC5zZXRfbWFya3VwKCc8c3BhbiB3ZWlnaHQ9ImJvbGQiPiVzPC9zcGFuPicgJSBzZWxmLmhlYWRpbmcpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICAgICAgaWYgMDw9IGxlbihsYmwpIDwgNDAwOgorICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93LmhpZGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLmhpZGUoKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3NpemVfcmVxdWVzdCgzNTAsIDM1MCkKKyAgICAgICAgc2VsZi5oZWFkaW5nX2xhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5oZWFkaW5nX2xhYmVsLnNldF9hbGlnbm1lbnQoMCwgMCkKKyAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi53YXJuaW5nX2xhYmVsLnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgIHNlbGYud2FybmluZ19sYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIHNlbGYudGV4dFdpbmRvdyA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisKKyAgICAgICAgdGFibGUgPSBndGsuVGFibGUoMSwgMTAsIEZhbHNlKQorCisgICAgICAgIGNhbmNlbF9idXR0b24gPSBndGsuQnV0dG9uKCkKKyAgICAgICAgY2FuY2VsX2J1dHRvbi5zZXRfbGFiZWwoIkNsb3NlIikKKyAgICAgICAgY2FuY2VsX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5jYW5jZWxfYnV0dG9uX2NiKQorICAgICAgICBjYW5jZWxfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTEwLCAzMCkKKworICAgICAgICBzZWxmLnByZXZpb3VzX2J1dHRvbiA9IGd0ay5CdXR0b24oKQorICAgICAgICBpbWFnZTEgPSBndGsuaW1hZ2VfbmV3X2Zyb21fc3RvY2soZ3RrLlNUT0NLX0dPX0JBQ0ssIGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorICAgICAgICBpbWFnZTEuc2hvdygpCisgICAgICAgIGJveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorICAgICAgICBib3guc2hvdygpCisgICAgICAgIHNlbGYucHJldmlvdXNfYnV0dG9uLmFkZChib3gpCisgICAgICAgIGxibCA9IGd0ay5MYWJlbCgiUHJldmlvdXMiKQorICAgICAgICBsYmwuc2hvdygpCisgICAgICAgIGJveC5wYWNrX3N0YXJ0KGltYWdlMSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTMpCisgICAgICAgIGJveC5wYWNrX3N0YXJ0KGxibCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSwgcGFkZGluZz0zKQorICAgICAgICBzZWxmLnByZXZpb3VzX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5wcmV2aW91c19idXR0b25fY2IpCisgICAgICAgIHNlbGYucHJldmlvdXNfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTEwLCAzMCkKKworICAgICAgICBzZWxmLm5leHRfYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgIGltYWdlMiA9IGd0ay5pbWFnZV9uZXdfZnJvbV9zdG9jayhndGsuU1RPQ0tfR09fRk9SV0FSRCwgZ3RrLklDT05fU0laRV9CVVRUT04pCisgICAgICAgIGltYWdlMi5zaG93KCkKKyAgICAgICAgYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIGJveC5zaG93KCkKKyAgICAgICAgc2VsZi5uZXh0X2J1dHRvbi5hZGQoYm94KQorICAgICAgICBsYmwgPSBndGsuTGFiZWwoIk5leHQiKQorICAgICAgICBsYmwuc2hvdygpCisgICAgICAgIGJveC5wYWNrX3N0YXJ0KGxibCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSwgcGFkZGluZz0zKQorICAgICAgICBib3gucGFja19zdGFydChpbWFnZTIsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSwgcGFkZGluZz0zKQorICAgICAgICBzZWxmLm5leHRfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLm5leHRfYnV0dG9uX2NiKQorICAgICAgICBzZWxmLm5leHRfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTEwLCAzMCkKKworICAgICAgICAjd2hlbiB0aGVyZSBtb3JlIHRoYW4gb25lIHdhcm5pbmcsIHdlIG5lZWQgInByZXZpb3VzIiBhbmQgIm5leHQiIGJ1dHRvbgorICAgICAgICBpZiBzZWxmLndhcm5fbmI+MToKKyAgICAgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYuaGVhZGluZ19sYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi53YXJuaW5nX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLnRleHRXaW5kb3csIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgIHRhYmxlLmF0dGFjaChjYW5jZWxfYnV0dG9uLCA2LCA3LCAwLCAxLCB4b3B0aW9ucz1ndGsuU0hSSU5LKQorICAgICAgICAgICAgdGFibGUuYXR0YWNoKHNlbGYucHJldmlvdXNfYnV0dG9uLCA3LCA4LCAwLCAxLCB4b3B0aW9ucz1ndGsuU0hSSU5LKQorICAgICAgICAgICAgdGFibGUuYXR0YWNoKHNlbGYubmV4dF9idXR0b24sIDgsIDksIDAsIDEsIHhvcHRpb25zPWd0ay5TSFJJTkspCisgICAgICAgICAgICBzZWxmLnZib3gucGFja19lbmQodGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYuaGVhZGluZ19sYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi53YXJuaW5nX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzZWxmLnRleHRXaW5kb3csIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgICAgIGNhbmNlbF9idXR0b24gPSBzZWxmLmFkZF9idXR0b24oIkNsb3NlIiwgZ3RrLlJFU1BPTlNFX0NBTkNFTCkKKyAgICAgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oY2FuY2VsX2J1dHRvbikKKworICAgICAgICBzZWxmLnJlZnJlc2hfY29tcG9uZW50cygpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3Byb3BlcnR5ZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9wcm9wZXJ0eWRpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWI5Y2U2Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9wcm9wZXJ0eWRpYWxvZy5weQpAQCAtMCwwICsxLDQzNyBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBBbmRyZWkgRGludSA8YW5kcmVpLmFkcmlhbnguZGludUBpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBnbGliCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5zZXR0aW5nc3VpaGVscGVyIGltcG9ydCBTZXR0aW5nc1VJSGVscGVyCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzbWVzc2FnZWRpYWxvZyBpbXBvcnQgQ3J1bWJzTWVzc2FnZURpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmxheWVyc2VsZWN0aW9uZGlhbG9nIGltcG9ydCBMYXllclNlbGVjdGlvbkRpYWxvZworCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworY2xhc3MgUHJvcGVydHlEaWFsb2coQ3J1bWJzRGlhbG9nKToKKwkKKwlkZWYgX19pbml0X18oc2VsZiwgdGl0bGUsIHBhcmVudCwgaW5mb3JtYXRpb24sIGZsYWdzLCBidXR0b25zPU5vbmUpOgorCQkKKwkJc3VwZXIoUHJvcGVydHlEaWFsb2csIHNlbGYpLl9faW5pdF9fKHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYucHJvcGVydGllcyA9IGluZm9ybWF0aW9uCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5wcm9wZXJ0aWVzKSA9PSAxMDoKKwkJICAgICAgICBzZWxmLmNyZWF0ZV9yZWNpcGVfdmlzdWFsX2VsZW1lbnRzKCkKKyAgICAgICAgICAgICAgICBlbGlmIGxlbihzZWxmLnByb3BlcnRpZXMpID09IDU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9wYWNrYWdlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2luZm9ybWF0aW9uX3Zpc3VhbF9lbGVtZW50cygpCisKKworICAgICAgICBkZWYgY3JlYXRlX2luZm9ybWF0aW9uX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKworICAgICAgICAgICAgICAgIEhPQl9JQ09OX0JBU0VfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpLCAoImljb25zLyIpKQorICAgICAgICAgICAgICAgIElDT05fUEFDS0FHRVNfRElTUExBWV9GSUxFICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZm8vaW5mb19kaXNwbGF5LnBuZycpKQorCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfcmVzaXphYmxlKEZhbHNlKQorCisgICAgICAgICAgICAgICAgc2VsZi50YWJsZSA9IGd0ay5UYWJsZSgxLDEsRmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmdzKDApCisgICAgICAgICAgICAgICAgc2VsZi50YWJsZS5zZXRfY29sX3NwYWNpbmdzKDApCisKKyAgICAgICAgICAgICAgICBzZWxmLmltYWdlID0gZ3RrLkltYWdlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmltYWdlLnNldF9mcm9tX2ZpbGUoSUNPTl9QQUNLQUdFU19ESVNQTEFZX0ZJTEUpCisgICAgICAgICAgICAgICAgc2VsZi5pbWFnZS5zZXRfcHJvcGVydHkoInhhbGlnbiIsMCkKKyAgICAgICAgICAgICAgICAjc2VsZi52Ym94LmFkZChzZWxmLmltYWdlKQorCisgICAgICAgICAgICAgICAgaW1hZ2VfaW5mbyA9IHNlbGYucHJvcGVydGllcy5zcGxpdCgiKiIpWzBdCisgICAgICAgICAgICAgICAgaW5mbyA9IHNlbGYucHJvcGVydGllcy5zcGxpdCgiKiIpWzFdCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmJveCA9IGd0ay5WQm94KFRydWUsIHNwYWNpbmc9MzApICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoRmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKGltYWdlX2luZm8pCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisKKyAgICAgICAgICAgICAgICBzZWxmLmluZm9fbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYuaW5mb19sYWJlbC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5pbmZvX2xhYmVsLnNldF9tYXJrdXAoaW5mbykKKyAgICAgICAgICAgICAgICBzZWxmLmluZm9fbGFiZWwuc2V0X3Byb3BlcnR5KCJ5YWxpZ24iLCAwLjUpCisKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChzZWxmLmltYWdlLCAwLDEsMCwxLCB4b3B0aW9ucz1ndGsuRklMTHxndGsuRVhQQU5ELCB5b3B0aW9ucz1ndGsuRklMTCx4cGFkZGluZz01LHlwYWRkaW5nPTUpCisgICAgICAgICAgICAgICAgc2VsZi50YWJsZS5hdHRhY2goc2VsZi5sYWJlbF9zaG9ydCwgMCwxLDAsMSwgeG9wdGlvbnM9Z3RrLkZJTEx8Z3RrLkVYUEFORCwgeW9wdGlvbnM9Z3RrLkZJTEwseHBhZGRpbmc9NDAseXBhZGRpbmc9NSkKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChzZWxmLmluZm9fbGFiZWwsIDAsMSwxLDIsIHhvcHRpb25zPWd0ay5GSUxMfGd0ay5FWFBBTkQsIHlvcHRpb25zPWd0ay5GSUxMLHhwYWRkaW5nPTQwLHlwYWRkaW5nPTEwKQorICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYudGFibGUpCisgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0KCdkZWxldGUtZXZlbnQnLCBsYW1iZGEgdywgZTogc2VsZi5kZXN0cm95KCkgb3IgVHJ1ZSkgCisKKyAgICAgICAgZGVmIHRyZWVWaWV3VG9vbHRpcCggc2VsZiwgd2lkZ2V0LCBlLCB0b29sdGlwcywgY2VsbCwgZW1wdHlUZXh0PSIiICk6CisgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRoLGNvbCx4LHkpID0gd2lkZ2V0LmdldF9wYXRoX2F0X3BvcyggaW50KGUueCksIGludChlLnkpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gd2lkZ2V0LmdldF9tb2RlbCgpLmdldF9pdGVyKHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHdpZGdldC5nZXRfbW9kZWwoKS5nZXRfdmFsdWUoaXQsY2VsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIGluIHNlbGYudG9vbHRpcF9pdGVtczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcHMuc2V0X3RpcCh3aWRnZXQsIHNlbGYudG9vbHRpcF9pdGVtc1t2YWx1ZV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBzLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcy5zZXRfdGlwKHdpZGdldCwgZW1wdHlUZXh0KQorICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwcy5zZXRfdGlwKHdpZGdldCwgZW1wdHlUZXh0KQorCisgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZiBjcmVhdGVfcGFja2FnZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisKKyAgICAgICAgICAgICAgICBpbXBvcnQganNvbgorCisgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYucHJvcGVydGllc1snbmFtZSddCisgICAgICAgICAgICAgICAgYmluYiA9IHNlbGYucHJvcGVydGllc1snYmluYiddCisgICAgICAgICAgICAgICAgc2l6ZSA9IHNlbGYucHJvcGVydGllc1snc2l6ZSddCisgICAgICAgICAgICAgICAgcmVjaXBlID0gc2VsZi5wcm9wZXJ0aWVzWydyZWNpcGUnXQorICAgICAgICAgICAgICAgIGZpbGVfbGlzdCA9IGpzb24ubG9hZHMoc2VsZi5wcm9wZXJ0aWVzWydmaWxlc19saXN0J10pCisKKyAgICAgICAgICAgICAgICBmaWxlc190ZW1wID0gJycKKyAgICAgICAgICAgICAgICBwYXRoc190ZW1wID0gJycKKyAgICAgICAgICAgICAgICBmaWxlc19iaW5iID0gW10KKyAgICAgICAgICAgICAgICBwYXRoc19iaW5iID0gW10KKworICAgICAgICAgICAgICAgIHNlbGYudG9vbHRpcF9pdGVtcyA9IHt9CisKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9yZXNpemFibGUoRmFsc2UpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgI2NsZWFuaW5nIG91dCB0aGUgcmVjaXBlIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgcmVjaXBlID0gcmVjaXBlLnNwbGl0KCIrIilbMF0KKworICAgICAgICAgICAgICAgIHZib3ggPSBndGsuVkJveChUcnVlLHNwYWNpbmcgPSAwKQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTkFNRSBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zaXplX3JlcXVlc3QoMzAwLC0xKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5OYW1lOiA8L3NwYW4+IiArIG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNJWkUgUk9XICsgQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zaXplX3JlcXVlc3QoMzAwLC0xKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5TaXplOiA8L3NwYW4+IiArIHNpemUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSRUNJUEUgUk9XICsgQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zaXplX3JlcXVlc3QoMzAwLC0xKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5SZWNpcGU6IDwvc3Bhbj4iICsgcmVjaXBlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCSU5CIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBiaW5iICE9ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPkJyb3VnaHQgaW4gYnk6IDwvc3Bhbj4iKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8gPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9zaXplX3JlcXVlc3QoMzAwLC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAoYmluYikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX2luZm8pCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRklMRVMgQlJPVUdIVCBCWSBQQUNLQUdFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgICAgICAgICAgICAgaWYgZmlsZV9saXN0OgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0V2luZG93ID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5zZXRfc2l6ZV9yZXF1ZXN0KDEwMCwgMTcwKQorCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlZmlsZXNfc3RvcmUgPSBndGsuTGlzdFN0b3JlKHN0cikKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlZmlsZXNfdHYgPSBndGsuVHJlZVZpZXcoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlZmlsZXNfdHYuc2V0X3J1bGVzX2hpbnQoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZWZpbGVzX3R2LnNldF9oZWFkZXJzX3Zpc2libGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dFdpbmRvdy5hZGQoc2VsZi5wYWNrYWdlZmlsZXNfdHYpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2VsbDEgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb2wxID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCdQYWNrYWdlIGZpbGVzJywgc2VsZi5jZWxsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbDEuc2V0X2NlbGxfZGF0YV9mdW5jKHNlbGYuY2VsbDEsIHNlbGYucmVnZXhfZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VmaWxlc190di5hcHBlbmRfY29sdW1uKGNvbDEpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gZmlsZV9saXN0LmtleXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuc29ydCgpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGggPSBpdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlbihpdGVtKSA+IDM1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtWzpsZW4oaXRlbSkvMl0gKyAiIiArIGl0ZW1bbGVuKGl0ZW0pLzIrMTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihpdGVtKSA9PSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbVs6bGVuKGl0ZW0pLzJdICsgIi4uLiIgKyBpdGVtW2xlbihpdGVtKS8yKzM6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9vbHRpcF9pdGVtc1tpdGVtXSA9IGZ1bGxwYXRoCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZWZpbGVzX3N0b3JlLmFwcGVuZChbc3RyKGl0ZW0pXSkKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlZmlsZXNfdHYuc2V0X21vZGVsKHBhY2thZ2VmaWxlc19zdG9yZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgdGlwcyA9IGd0ay5Ub29sdGlwcygpCisgICAgICAgICAgICAgICAgICAgICAgICB0aXBzLnNldF90aXAoc2VsZi5wYWNrYWdlZmlsZXNfdHYsICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlZmlsZXNfdHYuY29ubmVjdCgibW90aW9uLW5vdGlmeS1ldmVudCIsIHNlbGYudHJlZVZpZXdUb29sdGlwLCB0aXBzLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlZmlsZXNfdHYuc2V0X2V2ZW50cyhndGsuZ2RrLlBPSU5URVJfTU9USU9OX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi50ZXh0V2luZG93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICBzZWxmLnZib3guc2hvd19hbGwoKQorCisKKyAgICAgICAgZGVmIHJlZ2V4X2ZpZWxkKHNlbGYsIGNvbHVtbiwgY2VsbCwgbW9kZWwsIGl0ZXIpOgorICAgICAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCd0ZXh0JywgbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIsIDApKQorICAgICAgICAgICAgICAgIHJldHVybgorCisKKwlkZWYgY3JlYXRlX3JlY2lwZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisKKyAgICAgICAgICAgICAgICBzdW1tYXJ5ID0gc2VsZi5wcm9wZXJ0aWVzWydzdW1tYXJ5J10KKwkJbmFtZSA9IHNlbGYucHJvcGVydGllc1snbmFtZSddCisJCXZlcnNpb24gPSBzZWxmLnByb3BlcnRpZXNbJ3ZlcnNpb24nXQorCQlyZXZpc2lvbiA9IHNlbGYucHJvcGVydGllc1sncmV2aXNpb24nXQorCQliaW5iID0gc2VsZi5wcm9wZXJ0aWVzWydiaW5iJ10KKwkJZ3JvdXAgPSBzZWxmLnByb3BlcnRpZXNbJ2dyb3VwJ10KKwkJbGljZW5zZSA9IHNlbGYucHJvcGVydGllc1snbGljZW5zZSddCisJCWhvbWVwYWdlID0gc2VsZi5wcm9wZXJ0aWVzWydob21lcGFnZSddCisJCWJ1Z3RyYWNrZXIgPSBzZWxmLnByb3BlcnRpZXNbJ2J1Z3RyYWNrZXInXQorCQlkZXNjcmlwdGlvbiA9IHNlbGYucHJvcGVydGllc1snZGVzY3JpcHRpb24nXQorCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfcmVzaXphYmxlKEZhbHNlKQorCQkKKyAgICAgICAgICAgICAgICAjY2xlYW5pbmcgb3V0IHRoZSB2ZXJzaW9uIHZhcmlhYmxlIGFuZCBhbHNvIHRoZSBzdW1tYXJ5CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24uc3BsaXQoIjoiKVsxXQorICAgICAgICAgICAgICAgIGlmIGxlbih2ZXJzaW9uKSA+IDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24uc3BsaXQoIisiKVswXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5zcGxpdCgiLSIpWzBdCisgICAgICAgICAgICAgICAgbGljZW5zZSA9IGxpY2Vuc2UucmVwbGFjZSgiJiIgLCAiYW5kIikKKyAgICAgICAgICAgICAgICBpZiAoaG9tZXBhZ2UgPT0gJycpOgorICAgICAgICAgICAgICAgICAgICAgICAgaG9tZXBhZ2UgPSAndW5rbm93bicKKyAgICAgICAgICAgICAgICBpZiAoYnVndHJhY2tlciA9PSAnJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBidWd0cmFja2VyID0gJ3Vua25vd24nCisgICAgICAgICAgICAgICAgc3VtbWFyeSA9IHN1bW1hcnkuc3BsaXQoIisiKVswXQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICNjYWxjdWxhdGluZyB0aGUgcm93cyBuZWVkZWQgZm9yIHRoZSB0YWJsZQorICAgICAgICAgICAgICAgIGJpbmJfaXRlbXNfY291bnQgPSBsZW4oYmluYi5zcGxpdCgnLCcpKQorICAgICAgICAgICAgICAgIGJpbmJfaXRlbXMgPSBiaW5iLnNwbGl0KCcsJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQorCQl2Ym94ID0gZ3RrLlZCb3goRmFsc2Usc3BhY2luZyA9IDApCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFNVTU1BUlkgTEFCRUwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBzdW1tYXJ5ICE9ICcnOiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfd2lkdGhfY2hhcnMoMzcpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zZWxlY3RhYmxlKFRydWUpICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxiPiIgKyBzdW1tYXJ5ICsgIjwvYj4iKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTkFNRSBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5OYW1lOiA8L3NwYW4+IiArIG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWRVJTSU9OIFJPVyArIENPTCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+VmVyc2lvbjogPC9zcGFuPiIgKyB2ZXJzaW9uKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkVWSVNJT04gUk9XICsgQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9tYXJrdXAoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5SZXZpc2lvbjogPC9zcGFuPiIgKyByZXZpc2lvbikKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBHUk9VUCBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+R3JvdXA6IDwvc3Bhbj4iICsgZ3JvdXApCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBIT01FUEFHRSBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBob21lcGFnZSAhPSAndW5rbm93bic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8gPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGhvbWVwYWdlKSA+IDM1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X21hcmt1cCgiPGEgaHJlZj1cIiIgKyBob21lcGFnZSArICJcIj4iICsgaG9tZXBhZ2VbMDozNV0gKyAiLi4uIiArICI8L2E+IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbWFya3VwKCI8YSBocmVmPVwiIiArIGhvbWVwYWdlICsgIlwiPiIgKyBob21lcGFnZVswOjYwXSArICI8L2E+IikKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8Yj5Ib21lcGFnZTogPC9iPiIpICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9pbmZvKQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJVR1RSQUNLRVIgUk9XICsgQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiBidWd0cmFja2VyICE9ICd1bmtub3duJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mbyA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYnVndHJhY2tlcikgPiAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAoIjxhIGhyZWY9XCIiICsgYnVndHJhY2tlciArICJcIj4iICsgYnVndHJhY2tlclswOjM1XSArICIuLi4iICsgIjwvYT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAoIjxhIGhyZWY9XCIiICsgYnVndHJhY2tlciArICJcIj4iICsgYnVndHJhY2tlclswOjYwXSArICI8L2E+IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApICAKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zZWxlY3RhYmxlKFRydWUpICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8Yj5CdWd0cmFja2VyOiA8L2I+IikgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX2luZm8pCisKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTElDRU5TRSBST1cgKyBDT0wgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8gPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfc2VsZWN0YWJsZShUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAobGljZW5zZSkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydCA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfc2VsZWN0YWJsZShUcnVlKSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9saW5lX3dyYXAoVHJ1ZSkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+TGljZW5zZTogPC9zcGFuPiIpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfcHJvcGVydHkoInhhbGlnbiIsIDApCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9pbmZvKQorCisgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQklOQiBST1crQ09MICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIGJpbmIgIT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+QnJvdWdodCBpbiBieTogPC9zcGFuPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mbyA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfd2lkdGhfY2hhcnMoMzYpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYmluYikgPiAyMDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93ID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxlZF93aW5kb3cuc2V0X3BvbGljeShndGsuUE9MSUNZX05FVkVSLGd0ay5QT0xJQ1lfQUxXQVlTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkX3dpbmRvdy5zZXRfc2l6ZV9yZXF1ZXN0KDEwMCwxMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9tYXJrdXAoYmluYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X3BhZGRpbmcoNiw2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfYWxpZ25tZW50KDAsMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkX3dpbmRvdy5hZGRfd2l0aF92aWV3cG9ydChzZWxmLmxhYmVsX2luZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52Ym94LmFkZChzY3JvbGxlZF93aW5kb3cpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfaW5mby5zZXRfbWFya3VwKGJpbmIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX2luZm8uc2V0X2xpbmVfd3JhcChUcnVlKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNlbGYubGFiZWxfaW5mbykKKworICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERFU0NSSVBUSU9OIFRBRyBST1cgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X2xpbmVfd3JhcChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X21hcmt1cCgiPHNwYW4gd2VpZ2h0PVwiYm9sZFwiPkRlc2NyaXB0aW9uIDwvc3Bhbj4iKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWxfc2hvcnQuc2V0X3Byb3BlcnR5KCJ4YWxpZ24iLCAwKQorICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBERVNDUklQVElPTiBJTkZPUk1BVElPTiBST1cgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaGJveCA9IGd0ay5IQm94KFRydWUsc3BhY2luZyA9IDApCisKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0ID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9zZWxlY3RhYmxlKFRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfd2lkdGhfY2hhcnMoMzYpCisgICAgICAgICAgICAgICAgaWYgbGVuKGRlc2NyaXB0aW9uKSA+IDIwMDoKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93ID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93LnNldF9wb2xpY3koZ3RrLlBPTElDWV9ORVZFUixndGsuUE9MSUNZX0FMV0FZUykKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWRfd2luZG93LnNldF9zaXplX3JlcXVlc3QoMTAwLDEwMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wYWRkaW5nKDYsNikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfYWxpZ25tZW50KDAsMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkX3dpbmRvdy5hZGRfd2l0aF92aWV3cG9ydChzZWxmLmxhYmVsX3Nob3J0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLnZib3guYWRkKHNjcm9sbGVkX3dpbmRvdykKKyAgICAgICAgICAgICAgICBlbHNlOiAgICAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbWFya3VwKGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxhYmVsX3Nob3J0LnNldF9wcm9wZXJ0eSgieGFsaWduIiwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYWJlbF9zaG9ydC5zZXRfbGluZV93cmFwKFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudmJveC5hZGQoc2VsZi5sYWJlbF9zaG9ydCkKKworICAgICAgICAgICAgICAgIHNlbGYudmJveC5zaG93X2FsbCgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3Byb3h5ZGV0YWlsc2RpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcHJveHlkZXRhaWxzZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTdkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3Byb3h5ZGV0YWlsc2RpYWxvZy5weQpAQCAtMCwwICsxLDkwIEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIFByb3h5RGV0YWlsc0RpYWxvZyAoQ3J1bWJzRGlhbG9nKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgdXNlciwgcGFzc3dkLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zPU5vbmUpOgorICAgICAgICBzdXBlcihQcm94eURldGFpbHNEaWFsb2csIHNlbGYpLl9faW5pdF9fKHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zKQorICAgICAgICBzZWxmLmNvbm5lY3QoInJlc3BvbnNlIiwgc2VsZi5yZXNwb25zZV9jYikKKworICAgICAgICBzZWxmLmF1dGggPSBub3QgKHVzZXIgPT0gTm9uZSBvciBwYXNzd2QgPT0gTm9uZSBvciB1c2VyID09ICIiKQorICAgICAgICBzZWxmLnVzZXIgPSB1c2VyIG9yICIiCisgICAgICAgIHNlbGYucGFzc3dkID0gcGFzc3dkIG9yICIiCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzIG9uIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5jcmVhdGVfdmlzdWFsX2VsZW1lbnRzKCkKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmF1dGhfY2hlY2tib3ggPSBndGsuQ2hlY2tCdXR0b24oIlVzZSBhdXRoZW50aWNhdGlvbiIpCisgICAgICAgIHNlbGYuYXV0aF9jaGVja2JveC5zZXRfdG9vbHRpcF90ZXh0KCJDaGVjayB0aGlzIGJveCB0byBzZXQgdGhlIHVzZXJuYW1lIGFuZCB0aGUgcGFzc3dvcmQiKQorICAgICAgICBzZWxmLmF1dGhfY2hlY2tib3guc2V0X2FjdGl2ZShzZWxmLmF1dGgpCisgICAgICAgIHNlbGYuYXV0aF9jaGVja2JveC5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi5hdXRoX2NoZWNrYm94X3RvZ2dsZWRfY2IpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYuYXV0aF9jaGVja2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGhib3ggPSBndGsuSEJveChGYWxzZSwgNikKKyAgICAgICAgc2VsZi51c2VyX2xhYmVsID0gZ3RrLkxhYmVsKCJVc2VybmFtZToiKQorICAgICAgICBzZWxmLnVzZXJfdGV4dCA9IGd0ay5FbnRyeSgpCisgICAgICAgIHNlbGYudXNlcl90ZXh0LnNldF90ZXh0KHNlbGYudXNlcikKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHNlbGYudXNlcl9sYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBoYm94LnBhY2tfZW5kKHNlbGYudXNlcl90ZXh0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KGhib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIHNlbGYucGFzc3dkX2xhYmVsID0gZ3RrLkxhYmVsKCJQYXNzd29yZDoiKQorICAgICAgICBzZWxmLnBhc3N3ZF90ZXh0ID0gZ3RrLkVudHJ5KCkKKyAgICAgICAgc2VsZi5wYXNzd2RfdGV4dC5zZXRfdGV4dChzZWxmLnBhc3N3ZCkKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHNlbGYucGFzc3dkX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGhib3gucGFja19lbmQoc2VsZi5wYXNzd2RfdGV4dCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChoYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5yZWZyZXNoX2F1dGhfY29tcG9uZW50cygpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIHJlZnJlc2hfYXV0aF9jb21wb25lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLnVzZXJfbGFiZWwuc2V0X3NlbnNpdGl2ZShzZWxmLmF1dGgpCisgICAgICAgIHNlbGYudXNlcl90ZXh0LnNldF9lZGl0YWJsZShzZWxmLmF1dGgpCisgICAgICAgIHNlbGYudXNlcl90ZXh0LnNldF9zZW5zaXRpdmUoc2VsZi5hdXRoKQorICAgICAgICBzZWxmLnBhc3N3ZF9sYWJlbC5zZXRfc2Vuc2l0aXZlKHNlbGYuYXV0aCkKKyAgICAgICAgc2VsZi5wYXNzd2RfdGV4dC5zZXRfZWRpdGFibGUoc2VsZi5hdXRoKQorICAgICAgICBzZWxmLnBhc3N3ZF90ZXh0LnNldF9zZW5zaXRpdmUoc2VsZi5hdXRoKQorCisgICAgZGVmIGF1dGhfY2hlY2tib3hfdG9nZ2xlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmF1dGggPSBzZWxmLmF1dGhfY2hlY2tib3guZ2V0X2FjdGl2ZSgpCisgICAgICAgIHNlbGYucmVmcmVzaF9hdXRoX2NvbXBvbmVudHMoKQorCisgICAgZGVmIHJlc3BvbnNlX2NiKHNlbGYsIGRpYWxvZywgcmVzcG9uc2VfaWQpOgorICAgICAgICBpZiByZXNwb25zZV9pZCA9PSBndGsuUkVTUE9OU0VfT0s6CisgICAgICAgICAgICBpZiBzZWxmLmF1dGg6CisgICAgICAgICAgICAgICAgc2VsZi51c2VyID0gc2VsZi51c2VyX3RleHQuZ2V0X3RleHQoKQorICAgICAgICAgICAgICAgIHNlbGYucGFzc3dkID0gc2VsZi5wYXNzd2RfdGV4dC5nZXRfdGV4dCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudXNlciA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3N3ZCA9IE5vbmUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcmV0cmlldmVpbWFnZWRpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvcmV0cmlldmVpbWFnZWRpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDE3MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9yZXRyaWV2ZWltYWdlZGlhbG9nLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMyAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IENyaXN0aWFuYSBWb2ljdSA8Y3Jpc3RpYW5hLnZvaWN1QGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKKworY2xhc3MgUmV0cmlldmVJbWFnZURpYWxvZyAoZ3RrLkZpbGVDaG9vc2VyRGlhbG9nKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGEgZGlhbG9nIHRoYXQgcGVybWl0cyB0byByZXRyaWV2ZQorICAgIGEgY3VzdG9tIGltYWdlIHNhdmVkIHByZXZpb3VzbHkgZnJvbSBIb2IuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcmVjdG9yeSx0aXRsZSwgcGFyZW50LCBmbGFncywgYnV0dG9ucz1Ob25lKToKKyAgICAgICAgc3VwZXIoUmV0cmlldmVJbWFnZURpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIE5vbmUsIGd0ay5GSUxFX0NIT09TRVJfQUNUSU9OX09QRU4sCisgICAgICAgICAgICAoZ3RrLlNUT0NLX0NBTkNFTCwgZ3RrLlJFU1BPTlNFX0NBTkNFTCxndGsuU1RPQ0tfT1BFTiwgZ3RrLlJFU1BPTlNFX09LKSkKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBkaXJlY3RvcnkKKworICAgICAgICAjIGNyZWF0ZSB2aXN1YWwgZWxlbWVudHMgb24gdGhlIGRpYWxvZworICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3Nob3dfaGlkZGVuKFRydWUpCisgICAgICAgIHNlbGYuc2V0X2RlZmF1bHRfcmVzcG9uc2UoZ3RrLlJFU1BPTlNFX09LKQorICAgICAgICBzZWxmLnNldF9jdXJyZW50X2ZvbGRlcihzZWxmLmRpcmVjdG9yeSkKKworICAgICAgICB2Ym94ID0gc2VsZi5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXQorICAgICAgICBmb3IgY2hpbGQgaW4gdmJveC5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIHZib3guZ2V0X2NoaWxkcmVuKClbMF0uZ2V0X2NoaWxkcmVuKClbMF0uZ2V0X2NoaWxkcmVuKClbMF0ucmVtb3ZlKGNoaWxkKQorCisgICAgICAgIGxhYmVsMSA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsMS5zZXRfdGV4dCgiRmlsZSBzeXN0ZW0iICsgc2VsZi5kaXJlY3RvcnkpCisgICAgICAgIGxhYmVsMS5zaG93KCkKKyAgICAgICAgdmJveC5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVswXS5wYWNrX3N0YXJ0KGxhYmVsMSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTApCisgICAgICAgIHZib3guZ2V0X2NoaWxkcmVuKClbMF0uZ2V0X2NoaWxkcmVuKClbMV0uZ2V0X2NoaWxkcmVuKClbMF0uaGlkZSgpCisKKyAgICAgICAgc2VsZi5nZXRfY2hpbGRyZW4oKVswXS5nZXRfY2hpbGRyZW4oKVsxXS5nZXRfY2hpbGRyZW4oKVswXS5zZXRfbGFiZWwoIlNlbGVjdCIpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NhdmVpbWFnZWRpYWxvZy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9oaWcvc2F2ZWltYWdlZGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTVmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NhdmVpbWFnZWRpYWxvZy5weQpAQCAtMCwwICsxLDE1OSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEzICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgQ3Jpc3RpYW5hIFZvaWN1IDxjcmlzdGlhbmEudm9pY3VAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdsaWIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNkaWFsb2cgaW1wb3J0IENydW1ic0RpYWxvZworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic21lc3NhZ2VkaWFsb2cgaW1wb3J0IENydW1ic01lc3NhZ2VEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iQnV0dG9uCisKK2NsYXNzIFNhdmVJbWFnZURpYWxvZyAoQ3J1bWJzRGlhbG9nKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGEgZGlhbG9nIHRoYXQgcGVybWl0cyB0byBzYXZlCisgICAgYSBjdXN0b20gaW1hZ2UgaW4gYSBwcmVkZWZpbmVkIGRpcmVjdG9yeS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5LCBuYW1lLCBkZXNjcmlwdGlvbiwgdGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnM9Tm9uZSk6CisgICAgICAgIHN1cGVyKFNhdmVJbWFnZURpYWxvZywgc2VsZikuX19pbml0X18odGl0bGUsIHBhcmVudCwgZmxhZ3MsIGJ1dHRvbnMpCisgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyZWN0b3J5CisgICAgICAgIHNlbGYuYnVpbGRlciA9IHBhcmVudAorICAgICAgICBzZWxmLm5hbWVfZmllbGQgPSBuYW1lCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25fZmllbGQgPSBkZXNjcmlwdGlvbgorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfZGVmYXVsdF9yZXNwb25zZShndGsuUkVTUE9OU0VfT0spCisgICAgICAgIHNlbGYudmJveC5zZXRfYm9yZGVyX3dpZHRoKDYpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgMTIpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8Yj5OYW1lPC9iPiIpCisgICAgICAgIHN1Yl9sYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIHN1Yl9sYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIGNvbnRlbnQgPSAiSW1hZ2UgcmVjaXBlIG5hbWVzIHNob3VsZCBiZSBhbGwgbG93ZXJjYXNlIGFuZCBpbmNsdWRlIG9ubHkgYWxwaGFudW1lcmljXG4iCisgICAgICAgIGNvbnRlbnQgKz0gImNoYXJhY3RlcnMuIFRoZSBvbmx5IHNwZWNpYWwgY2hhcmFjdGVyIHlvdSBjYW4gdXNlIGlzIHRoZSBBU0NJSSBoeXBoZW4gKC0pLiIKKyAgICAgICAgc3ViX2xhYmVsLnNldF9tYXJrdXAoY29udGVudCkKKyAgICAgICAgc2VsZi5uYW1lX2VudHJ5ID0gZ3RrLkVudHJ5KCkKKyAgICAgICAgc2VsZi5uYW1lX2VudHJ5LnNldF90ZXh0KHNlbGYubmFtZV9maWVsZCkKKyAgICAgICAgc2VsZi5uYW1lX2VudHJ5LnNldF9zaXplX3JlcXVlc3QoMzUwLDMwKQorICAgICAgICBzZWxmLm5hbWVfZW50cnkuY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYubmFtZV9lbnRyeV9jaGFuZ2VkKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc3ViX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc2VsZi5uYW1lX2VudHJ5LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgMTIpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8Yj5EZXNjcmlwdGlvbjwvYj4gKG9wdGlvbmFsKSIpCisgICAgICAgIHN1Yl9sYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIHN1Yl9sYWJlbC5zZXRfYWxpZ25tZW50KDAsIDApCisgICAgICAgIHN1Yl9sYWJlbC5zZXRfbWFya3VwKCJUaGUgZGVzY3JpcHRpb24gc2hvdWxkIGJlIGxlc3MgdGhhbiAxNTAgY2hhcmFjdGVycyBsb25nLiIpCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25fZW50cnkgPSBndGsuVGV4dFZpZXcoKQorICAgICAgICBkZXNjcmlwdGlvbl9idWZmZXIgPSBzZWxmLmRlc2NyaXB0aW9uX2VudHJ5LmdldF9idWZmZXIoKQorICAgICAgICBkZXNjcmlwdGlvbl9idWZmZXIuc2V0X3RleHQoc2VsZi5kZXNjcmlwdGlvbl9maWVsZCkKKyAgICAgICAgZGVzY3JpcHRpb25fYnVmZmVyLmNvbm5lY3QoImluc2VydC10ZXh0Iiwgc2VsZi5saW1pdF9kZXNjcmlwdGlvbl9sZW5ndGgpCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25fZW50cnkuc2V0X3dyYXBfbW9kZShndGsuV1JBUF9XT1JEKQorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uX2VudHJ5LnNldF9zaXplX3JlcXVlc3QoMzUwLDUwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc3ViX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc2VsZi5kZXNjcmlwdGlvbl9lbnRyeSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDEyKQorICAgICAgICBzZWxmLnZib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMCwgMCkKKyAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiWW91ciBpbWFnZSByZWNpcGUgd2lsbCBiZSBzYXZlZCB0bzoiKQorICAgICAgICBzdWJfbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBzdWJfbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBzdWJfbGFiZWwuc2V0X21hcmt1cChzZWxmLmRpcmVjdG9yeSkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KHN1Yl9sYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKDEsIDQsIFRydWUpCisKKyAgICAgICAgY2FuY2VsX2J1dHRvbiA9IGd0ay5CdXR0b24oKQorICAgICAgICBjYW5jZWxfYnV0dG9uLnNldF9sYWJlbCgiQ2FuY2VsIikKKyAgICAgICAgY2FuY2VsX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5jYW5jZWxfYnV0dG9uX2NiKQorICAgICAgICBjYW5jZWxfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTEwLCAzMCkKKworICAgICAgICBzZWxmLnNhdmVfYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgIHNlbGYuc2F2ZV9idXR0b24uc2V0X2xhYmVsKCJTYXZlIikKKyAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5zYXZlX2J1dHRvbl9jYikKKyAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5zZXRfc2l6ZV9yZXF1ZXN0KDExMCwgMzApCisgICAgICAgIGlmIHNlbGYubmFtZV9lbnRyeS5nZXRfdGV4dCgpID09ICcnOgorICAgICAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorCisgICAgICAgIHRhYmxlLmF0dGFjaChjYW5jZWxfYnV0dG9uLCAyLCAzLCAwLCAxKQorICAgICAgICB0YWJsZS5hdHRhY2goc2VsZi5zYXZlX2J1dHRvbiwgMywgNCwgMCwgMSkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfZW5kKHRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgbGltaXRfZGVzY3JpcHRpb25fbGVuZ3RoKHNlbGYsIHRleHRidWZmZXIsIGl0ZXIsIHRleHQsIGxlbmd0aCk6CisgICAgICAgIGJ1ZmZlcl9ib3VuZHMgPSB0ZXh0YnVmZmVyLmdldF9ib3VuZHMoKQorICAgICAgICBlbnRpcmVfdGV4dCA9IHRleHRidWZmZXIuZ2V0X3RleHQoKmJ1ZmZlcl9ib3VuZHMpCisgICAgICAgIGVudGlyZV90ZXh0ICs9IHRleHQKKyAgICAgICAgaWYgbGVuKGVudGlyZV90ZXh0KT4xNTAgb3IgdGV4dD09IlxuIjoKKyAgICAgICAgICAgIHRleHRidWZmZXIuZW1pdF9zdG9wX2J5X25hbWUoImluc2VydC10ZXh0IikKKworICAgIGRlZiBuYW1lX2VudHJ5X2NoYW5nZWQoc2VsZiwgZW50cnkpOgorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBpZiB0ZXh0ID09ICcnOgorICAgICAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zYXZlX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisKKyAgICBkZWYgY2FuY2VsX2J1dHRvbl9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgZGVmIHNhdmVfYnV0dG9uX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHRleHQgPSBzZWxmLm5hbWVfZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBuZXdfdGV4dCA9IHRleHQucmVwbGFjZSgiLSIsIiIpCisgICAgICAgIGRlc2NyaXB0aW9uX2J1ZmZlciA9IHNlbGYuZGVzY3JpcHRpb25fZW50cnkuZ2V0X2J1ZmZlcigpCisgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25fYnVmZmVyLmdldF90ZXh0KGRlc2NyaXB0aW9uX2J1ZmZlci5nZXRfc3RhcnRfaXRlcigpLGRlc2NyaXB0aW9uX2J1ZmZlci5nZXRfZW5kX2l0ZXIoKSkKKyAgICAgICAgaWYgbmV3X3RleHQuaXNsb3dlcigpIGFuZCBuZXdfdGV4dC5pc2FsbnVtKCk6CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuaW1hZ2VfZGV0YWlsc19wYWdlLmltYWdlX3NhdmVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmN1c3RvbWl6ZWQgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmdlbmVyYXRlX25ld19pbWFnZShzZWxmLmRpcmVjdG9yeSt0ZXh0LCBkZXNjcmlwdGlvbikKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuc2V0X2luX2xpc3QodGV4dCwgZGVzY3JpcHRpb24pCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLnNldF9zZWxlY3RlZF9pbWFnZSh0ZXh0KQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmltYWdlX2RldGFpbHNfcGFnZS5zaG93X3BhZ2Uoc2VsZi5idWlsZGVyLklNQUdFX0dFTkVSQVRFRCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5pbWFnZV9kZXRhaWxzX3BhZ2UubmFtZV9maWVsZF90ZW1wbGF0ZSA9IHRleHQKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5pbWFnZV9kZXRhaWxzX3BhZ2UuZGVzY3JpcHRpb25fZmllbGRfdGVtcGxhdGUgPSBkZXNjcmlwdGlvbgorICAgICAgICAgICAgc2VsZi5kZXN0cm95KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2hvd19pbnZhbGlkX2lucHV0X2Vycm9yX2RpYWxvZygpCisKKyAgICBkZWYgc2hvd19pbnZhbGlkX2lucHV0X2Vycm9yX2RpYWxvZyhzZWxmKToKKyAgICAgICAgbGJsID0gIjxiPkludmFsaWQgY2hhcmFjdGVycyBpbiBpbWFnZSByZWNpcGUgbmFtZTwvYj4iCisgICAgICAgIG1zZyA9ICJJbWFnZSByZWNpcGUgbmFtZXMgc2hvdWxkIGJlIGFsbCBsb3dlcmNhc2UgYW5kXG4iCisgICAgICAgIG1zZyArPSAiaW5jbHVkZSBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGUgb25seVxuIgorICAgICAgICBtc2cgKz0gInNwZWNpYWwgY2hhcmFjdGVyIHlvdSBjYW4gdXNlIGlzIHRoZSBBU0NJSSBoeXBoZW4gKC0pLiIKKyAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX0VSUk9SLCBtc2cpCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisKKyAgICAgICAgcmVzID0gZGlhbG9nLnJ1bigpCisgICAgICAgIHNlbGYubmFtZV9lbnRyeS5ncmFiX2ZvY3VzKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9zZXR0aW5nc3VpaGVscGVyLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9zZXR0aW5nc3VpaGVscGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjg1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NldHRpbmdzdWloZWxwZXIucHkKQEAgLTAsMCArMSwxMjIgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBvcworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JJbmZvQnV0dG9uLCBIb2JCdXR0b24sIEhvYkFsdEJ1dHRvbgorCisiIiIKK1RoZSBmb2xsb3dpbmcgYXJlIGNvbnZlbmllbmNlIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBHTk9NRSBISUcgY29tcGxpYW50CitCaXRCYWtlIEdVSSdzCitJbiBzdW1tYXJ5OiBzcGFjaW5nID0gMTJweCwgYm9yZGVyLXdpZHRoID0gNnB4CisiIiIKKworY2xhc3MgU2V0dGluZ3NVSUhlbHBlcigpOgorCisgICAgZGVmIGdlbl9sYWJlbF93aWRnZXQoc2VsZiwgY29udGVudCk6CisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLCAwKQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKGNvbnRlbnQpCisgICAgICAgIGxhYmVsLnNob3coKQorICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBnZW5fbGFiZWxfaW5mb193aWRnZXQoc2VsZiwgY29udGVudCwgdG9vbHRpcCk6CisgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKDEsIDEwLCBGYWxzZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoY29udGVudCkKKyAgICAgICAgaW5mbyA9IEhvYkluZm9CdXR0b24odG9vbHRpcCwgc2VsZikKKyAgICAgICAgdGFibGUuYXR0YWNoKGxhYmVsLCAwLCAxLCAwLCAxLCB4b3B0aW9ucz1ndGsuRklMTCkKKyAgICAgICAgdGFibGUuYXR0YWNoKGluZm8sIDEsIDIsIDAsIDEsIHhvcHRpb25zPWd0ay5GSUxMLCB4cGFkZGluZz0xMCkKKyAgICAgICAgcmV0dXJuIHRhYmxlCisKKyAgICBkZWYgZ2VuX3NwaW5uZXJfd2lkZ2V0KHNlbGYsIGNvbnRlbnQsIGxvd2VyLCB1cHBlciwgdG9vbHRpcD0iIik6CisgICAgICAgIGhib3ggPSBndGsuSEJveChGYWxzZSwgMTIpCisgICAgICAgIGFkanVzdCA9IGd0ay5BZGp1c3RtZW50KHZhbHVlPWNvbnRlbnQsIGxvd2VyPWxvd2VyLCB1cHBlcj11cHBlciwgc3RlcF9pbmNyPTEpCisgICAgICAgIHNwaW5uZXIgPSBndGsuU3BpbkJ1dHRvbihhZGp1c3RtZW50PWFkanVzdCwgY2xpbWJfcmF0ZT0xLCBkaWdpdHM9MCkKKworICAgICAgICBzcGlubmVyLnNldF92YWx1ZShjb250ZW50KQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoc3Bpbm5lciwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGluZm8gPSBIb2JJbmZvQnV0dG9uKHRvb2x0aXAsIHNlbGYpCisgICAgICAgIGhib3gucGFja19zdGFydChpbmZvLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgaGJveC5zaG93X2FsbCgpCisgICAgICAgIHJldHVybiBoYm94LCBzcGlubmVyCisKKyAgICBkZWYgZ2VuX2NvbWJvX3dpZGdldChzZWxmLCBjdXJyX2l0ZW0sIGFsbF9pdGVtLCB0b29sdGlwPSIiKToKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgY29tYm8gPSBndGsuY29tYm9fYm94X25ld190ZXh0KCkKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGNvbWJvLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgIGZvciBpdGVtIGluIGFsbF9pdGVtIG9yIFtdOgorICAgICAgICAgICAgY29tYm8uYXBwZW5kX3RleHQoaXRlbSkKKyAgICAgICAgICAgIGlmIGl0ZW0gPT0gY3Vycl9pdGVtOgorICAgICAgICAgICAgICAgIGNvbWJvLnNldF9hY3RpdmUoaW5kZXgpCisgICAgICAgICAgICBpbmRleCArPSAxCisKKyAgICAgICAgaW5mbyA9IEhvYkluZm9CdXR0b24odG9vbHRpcCwgc2VsZikKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGluZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBoYm94LnNob3dfYWxsKCkKKyAgICAgICAgcmV0dXJuIGhib3gsIGNvbWJvCisKKyAgICBkZWYgZW50cnlfd2lkZ2V0X3NlbGVjdF9wYXRoX2NiKHNlbGYsIGFjdGlvbiwgcGFyZW50LCBlbnRyeSk6CisgICAgICAgIGRpYWxvZyA9IGd0ay5GaWxlQ2hvb3NlckRpYWxvZygiIiwgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLkZJTEVfQ0hPT1NFUl9BQ1RJT05fU0VMRUNUX0ZPTERFUikKKyAgICAgICAgdGV4dCA9IGVudHJ5LmdldF90ZXh0KCkKKyAgICAgICAgZGlhbG9nLnNldF9jdXJyZW50X2ZvbGRlcih0ZXh0IGlmIGxlbih0ZXh0KSA+IDAgZWxzZSBvcy5nZXRjd2QoKSkKKyAgICAgICAgYnV0dG9uID0gZGlhbG9nLmFkZF9idXR0b24oIkNhbmNlbCIsIGd0ay5SRVNQT05TRV9OTykKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJPcGVuIiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgSG9iQnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisgICAgICAgIHJlc3BvbnNlID0gZGlhbG9nLnJ1bigpCisgICAgICAgIGlmIHJlc3BvbnNlID09IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICBwYXRoID0gZGlhbG9nLmdldF9maWxlbmFtZSgpCisgICAgICAgICAgICBlbnRyeS5zZXRfdGV4dChwYXRoKQorCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgIGRlZiBnZW5fZW50cnlfd2lkZ2V0KHNlbGYsIGNvbnRlbnQsIHBhcmVudCwgdG9vbHRpcD0iIiwgbmVlZF9idXR0b249VHJ1ZSk6CisgICAgICAgIGhib3ggPSBndGsuSEJveChGYWxzZSwgMTIpCisgICAgICAgIGVudHJ5ID0gZ3RrLkVudHJ5KCkKKyAgICAgICAgZW50cnkuc2V0X3RleHQoY29udGVudCkKKyAgICAgICAgZW50cnkuc2V0X3NpemVfcmVxdWVzdCgzNTAsMzApCisKKyAgICAgICAgaWYgbmVlZF9idXR0b246CisgICAgICAgICAgICB0YWJsZSA9IGd0ay5UYWJsZSgxLCAxMCwgRmFsc2UpCisgICAgICAgICAgICBoYm94LnBhY2tfc3RhcnQodGFibGUsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisgICAgICAgICAgICB0YWJsZS5hdHRhY2goZW50cnksIDAsIDksIDAsIDEsIHhvcHRpb25zPWd0ay5TSFJJTkspCisgICAgICAgICAgICBpbWFnZSA9IGd0ay5JbWFnZSgpCisgICAgICAgICAgICBpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfT1BFTixndGsuSUNPTl9TSVpFX0JVVFRPTikKKyAgICAgICAgICAgIG9wZW5fYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgICAgICBvcGVuX2J1dHRvbi5zZXRfaW1hZ2UoaW1hZ2UpCisgICAgICAgICAgICBvcGVuX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5lbnRyeV93aWRnZXRfc2VsZWN0X3BhdGhfY2IsIHBhcmVudCwgZW50cnkpCisgICAgICAgICAgICB0YWJsZS5hdHRhY2gob3Blbl9idXR0b24sIDksIDEwLCAwLCAxLCB4b3B0aW9ucz1ndGsuU0hSSU5LKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGVudHJ5LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIGlmIHRvb2x0aXAgIT0gIiI6CisgICAgICAgICAgICBpbmZvID0gSG9iSW5mb0J1dHRvbih0b29sdGlwLCBzZWxmKQorICAgICAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGluZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBoYm94LnNob3dfYWxsKCkKKyAgICAgICAgcmV0dXJuIGhib3gsIGVudHJ5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaGlnL3NpbXBsZXNldHRpbmdzZGlhbG9nLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9zaW1wbGVzZXR0aW5nc2RpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWViM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hpZy9zaW1wbGVzZXR0aW5nc2RpYWxvZy5weQpAQCAtMCwwICsxLDg5MSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBoYXNobGliCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IGhpYywgSG9iSW5mb0J1dHRvbiwgSG9iQnV0dG9uLCBIb2JBbHRCdXR0b24gCitmcm9tIGJiLnVpLmNydW1icy5wcm9ncmVzc2JhciBpbXBvcnQgSG9iUHJvZ3Jlc3NCYXIKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5zZXR0aW5nc3VpaGVscGVyIGltcG9ydCBTZXR0aW5nc1VJSGVscGVyCitmcm9tIGJiLnVpLmNydW1icy5oaWcuY3J1bWJzZGlhbG9nIGltcG9ydCBDcnVtYnNEaWFsb2cKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5jcnVtYnNtZXNzYWdlZGlhbG9nIGltcG9ydCBDcnVtYnNNZXNzYWdlRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcucHJveHlkZXRhaWxzZGlhbG9nIGltcG9ydCBQcm94eURldGFpbHNEaWFsb2cKKworIiIiCitUaGUgZm9sbG93aW5nIGFyZSBjb252ZW5pZW5jZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgR05PTUUgSElHIGNvbXBsaWFudAorQml0QmFrZSBHVUkncworSW4gc3VtbWFyeTogc3BhY2luZyA9IDEycHgsIGJvcmRlci13aWR0aCA9IDZweAorIiIiCisKK2NsYXNzIFNpbXBsZVNldHRpbmdzRGlhbG9nIChDcnVtYnNEaWFsb2csIFNldHRpbmdzVUlIZWxwZXIpOgorCisgICAgKEJVSUxEX0VOVl9QQUdFX0lELAorICAgICBTSEFSRURfU1RBVEVfUEFHRV9JRCwKKyAgICAgUFJPWElFU19QQUdFX0lELAorICAgICBPVEhFUlNfUEFHRV9JRCkgPSByYW5nZSg0KQorCisgICAgKFRFU1RfTkVUV09SS19OT05FLAorICAgICBURVNUX05FVFdPUktfSU5JVElBTCwKKyAgICAgVEVTVF9ORVRXT1JLX1JVTk5JTkcsCisgICAgIFRFU1RfTkVUV09SS19QQVNTRUQsCisgICAgIFRFU1RfTkVUV09SS19GQUlMRUQsCisgICAgIFRFU1RfTkVUV09SS19DQU5DRUxFRCkgPSByYW5nZSg2KQorCisgICAgVEFSR0VUUyA9IFsKKyAgICAgICAgKCJNWV9UUkVFX01PREVMX1JPVyIsIGd0ay5UQVJHRVRfU0FNRV9XSURHRVQsIDApLAorICAgICAgICAoInRleHQvcGxhaW4iLCAwLCAxKSwKKyAgICAgICAgKCJURVhUIiwgMCwgMiksCisgICAgICAgICgiU1RSSU5HIiwgMCwgMyksCisgICAgICAgIF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgY29uZmlndXJhdGlvbiwgYWxsX2ltYWdlX3R5cGVzLAorICAgICAgICAgICAgYWxsX3BhY2thZ2VfZm9ybWF0cywgYWxsX2Rpc3Ryb3MsIGFsbF9zZGtfbWFjaGluZXMsCisgICAgICAgICAgICBtYXhfdGhyZWFkcywgcGFyZW50LCBmbGFncywgaGFuZGxlciwgYnV0dG9ucz1Ob25lKToKKyAgICAgICAgc3VwZXIoU2ltcGxlU2V0dGluZ3NEaWFsb2csIHNlbGYpLl9faW5pdF9fKHRpdGxlLCBwYXJlbnQsIGZsYWdzLCBidXR0b25zKQorCisgICAgICAgICMgY2xhc3MgbWVtYmVycyBmcm9tIG90aGVyIG9iamVjdHMKKyAgICAgICAgIyBiaXRiYWtlIHNldHRpbmdzIGZyb20gQnVpbGRlci5Db25maWd1cmF0aW9uCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgc2VsZi5pbWFnZV90eXBlcyA9IGFsbF9pbWFnZV90eXBlcworICAgICAgICBzZWxmLmFsbF9wYWNrYWdlX2Zvcm1hdHMgPSBhbGxfcGFja2FnZV9mb3JtYXRzCisgICAgICAgIHNlbGYuYWxsX2Rpc3Ryb3MgPSBhbGxfZGlzdHJvcworICAgICAgICBzZWxmLmFsbF9zZGtfbWFjaGluZXMgPSBhbGxfc2RrX21hY2hpbmVzCisgICAgICAgIHNlbGYubWF4X3RocmVhZHMgPSBtYXhfdGhyZWFkcworCisgICAgICAgICMgY2xhc3MgbWVtYmVycyBmb3IgaW50ZXJuYWwgdXNlCisgICAgICAgIHNlbGYuZGxkaXJfdGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zc3RhdGVkaXJfdGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3QgPSBbXQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfY2hhbmdlZCA9IDAKKyAgICAgICAgc2VsZi5iYl9zcGlubmVyID0gTm9uZQorICAgICAgICBzZWxmLnBtYWtlX3NwaW5uZXIgPSBOb25lCisgICAgICAgIHNlbGYucm9vdGZzX3NpemVfc3Bpbm5lciA9IE5vbmUKKyAgICAgICAgc2VsZi5leHRyYV9zaXplX3NwaW5uZXIgPSBOb25lCisgICAgICAgIHNlbGYuZ3BsdjNfY2hlY2tib3ggPSBOb25lCisgICAgICAgIHNlbGYudG9vbGNoYWluX2NoZWNrYm94ID0gTm9uZQorICAgICAgICBzZWxmLnNldHRpbmdfc3RvcmUgPSBOb25lCisgICAgICAgIHNlbGYuaW1hZ2VfdHlwZXNfY2hlY2tidXR0b25zID0ge30KKworICAgICAgICBzZWxmLm1kNSA9IHNlbGYuY29uZmlnX21kNSgpCisgICAgICAgIHNlbGYucHJveHlfbWQ1ID0gc2VsZi5jb25maWdfcHJveHlfbWQ1KCkKKyAgICAgICAgc2VsZi5zZXR0aW5nc19jaGFuZ2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm94eV9zZXR0aW5nc19jaGFuZ2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gaGFuZGxlcgorICAgICAgICBzZWxmLnByb3h5X3Rlc3RfcmFuID0gRmFsc2UKKyAgICAgICAgc2VsZi5zZWxlY3RlZF9taXJyb3Jfcm93ID0gMAorICAgICAgICBzZWxmLm5ld19taXJyb3IgPSBGYWxzZQorCisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cyBvbiB0aGUgZGlhbG9nCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisgICAgICAgIHNlbGYuY29ubmVjdCgicmVzcG9uc2UiLCBzZWxmLnJlc3BvbnNlX2NiKQorCisgICAgZGVmIF9nZXRfc29ydGVkX3ZhbHVlKHNlbGYsIHZhcik6CisgICAgICAgIHJldHVybiAiICIuam9pbihzb3J0ZWQoc3RyKHZhcikuc3BsaXQoKSkpICsgIlxuIgorCisgICAgZGVmIGNvbmZpZ19wcm94eV9tZDUoc2VsZik6CisgICAgICAgIGRhdGEgPSAoIkVOQUJMRV9QUk9YWTogIiAgICAgICAgICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5KSkKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eToKKyAgICAgICAgICAgIGZvciBwcm90b2NvbCBpbiBzZWxmLmNvbmZpZ3VyYXRpb24ucHJveGllcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgZGF0YSArPSAocHJvdG9jb2wgKyAiOiAiICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eShwcm90b2NvbCkpKQorICAgICAgICByZXR1cm4gaGFzaGxpYi5tZDUoZGF0YSkuaGV4ZGlnZXN0KCkKKworICAgIGRlZiBjb25maWdfbWQ1KHNlbGYpOgorICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmNvbmZpZ3VyYXRpb24uZXh0cmFfc2V0dGluZy5rZXlzKCk6CisgICAgICAgICAgICBkYXRhICs9IChrZXkgKyAiOiAiICsgc2VsZi5fZ2V0X3NvcnRlZF92YWx1ZShzZWxmLmNvbmZpZ3VyYXRpb24uZXh0cmFfc2V0dGluZ1trZXldKSkKKyAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KGRhdGEpLmhleGRpZ2VzdCgpCisKKyAgICBkZWYgZ2VuX3Byb3h5X2VudHJ5X3dpZGdldChzZWxmLCBwcm90b2NvbCwgcGFyZW50LCBuZWVkX2J1dHRvbj1UcnVlLCBsaW5lPTApOgorICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbChwcm90b2NvbC51cHBlcigpICsgIiBwcm94eSIpCisgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKGxhYmVsLCAwLCAxLCBsaW5lLCBsaW5lKzEsIHhwYWRkaW5nPTI0KQorCisgICAgICAgIHByb3h5X2VudHJ5ID0gZ3RrLkVudHJ5KCkKKyAgICAgICAgcHJveHlfZW50cnkuc2V0X3NpemVfcmVxdWVzdCgzMDAsIC0xKQorICAgICAgICBzZWxmLnByb3h5X3RhYmxlLmF0dGFjaChwcm94eV9lbnRyeSwgMSwgMiwgbGluZSwgbGluZSsxLCB5cGFkZGluZz00KQorCisgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKGd0ay5MYWJlbCgiOiIpLCAyLCAzLCBsaW5lLCBsaW5lKzEsIHhwYWRkaW5nPTEyLCB5cGFkZGluZz00KQorCisgICAgICAgIHBvcnRfZW50cnkgPSBndGsuRW50cnkoKQorICAgICAgICBwb3J0X2VudHJ5LnNldF9zaXplX3JlcXVlc3QoNjAsIC0xKQorICAgICAgICBzZWxmLnByb3h5X3RhYmxlLmF0dGFjaChwb3J0X2VudHJ5LCAzLCA0LCBsaW5lLCBsaW5lKzEsIHlwYWRkaW5nPTQpCisKKyAgICAgICAgZGV0YWlsc19idXR0b24gPSBIb2JBbHRCdXR0b24oIkRldGFpbHMiKQorICAgICAgICBkZXRhaWxzX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5kZXRhaWxzX2NiLCBwYXJlbnQsIHByb3RvY29sKQorICAgICAgICBzZWxmLnByb3h5X3RhYmxlLmF0dGFjaChkZXRhaWxzX2J1dHRvbiwgNCwgNSwgbGluZSwgbGluZSsxLCB4cGFkZGluZz00LCB5b3B0aW9ucz1ndGsuRVhQQU5EKQorCisgICAgICAgIHJldHVybiBwcm94eV9lbnRyeSwgcG9ydF9lbnRyeSwgZGV0YWlsc19idXR0b24KKworICAgIGRlZiByZWZyZXNoX3Byb3h5X2NvbXBvbmVudHMoc2VsZik6CisgICAgICAgIHNlbGYuc2FtZV9jaGVja2JveC5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisKKyAgICAgICAgc2VsZi5odHRwX3Byb3h5LnNldF90ZXh0KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX2hvc3Rfb25seSgiaHR0cCIpKQorICAgICAgICBzZWxmLmh0dHBfcHJveHkuc2V0X2VkaXRhYmxlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisgICAgICAgIHNlbGYuaHR0cF9wcm94eS5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisgICAgICAgIHNlbGYuaHR0cF9wcm94eV9wb3J0LnNldF90ZXh0KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3BvcnRfb25seSgiaHR0cCIpKQorICAgICAgICBzZWxmLmh0dHBfcHJveHlfcG9ydC5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSkKKyAgICAgICAgc2VsZi5odHRwX3Byb3h5X3BvcnQuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5KQorICAgICAgICBzZWxmLmh0dHBfcHJveHlfZGV0YWlscy5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisKKyAgICAgICAgc2VsZi5odHRwc19wcm94eS5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9ob3N0X29ubHkoImh0dHBzIikpCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHkuc2V0X2VkaXRhYmxlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLmh0dHBzX3Byb3h5LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHlfcG9ydC5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wb3J0X29ubHkoImh0dHBzIikpCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHlfcG9ydC5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHlfcG9ydC5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLmh0dHBzX3Byb3h5X2RldGFpbHMuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKworICAgICAgICBzZWxmLmZ0cF9wcm94eS5zZXRfdGV4dChzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9ob3N0X29ubHkoImZ0cCIpKQorICAgICAgICBzZWxmLmZ0cF9wcm94eS5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuZnRwX3Byb3h5LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuZnRwX3Byb3h5X3BvcnQuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcG9ydF9vbmx5KCJmdHAiKSkKKyAgICAgICAgc2VsZi5mdHBfcHJveHlfcG9ydC5zZXRfZWRpdGFibGUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuZnRwX3Byb3h5X3BvcnQuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5mdHBfcHJveHlfZGV0YWlscy5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorCisgICAgICAgIHNlbGYuc29ja3NfcHJveHkuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfaG9zdF9vbmx5KCJzb2NrcyIpKQorICAgICAgICBzZWxmLnNvY2tzX3Byb3h5LnNldF9lZGl0YWJsZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5zb2Nrc19wcm94eS5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLnNvY2tzX3Byb3h5X3BvcnQuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcG9ydF9vbmx5KCJzb2NrcyIpKQorICAgICAgICBzZWxmLnNvY2tzX3Byb3h5X3BvcnQuc2V0X2VkaXRhYmxlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLnNvY2tzX3Byb3h5X3BvcnQuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKyAgICAgICAgc2VsZi5zb2Nrc19wcm94eV9kZXRhaWxzLnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisKKyAgICAgICAgc2VsZi5jdnNfcHJveHkuc2V0X3RleHQoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfaG9zdF9vbmx5KCJjdnMiKSkKKyAgICAgICAgc2VsZi5jdnNfcHJveHkuc2V0X2VkaXRhYmxlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLmN2c19wcm94eS5zZXRfc2Vuc2l0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLmN2c19wcm94eV9wb3J0LnNldF90ZXh0KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3BvcnRfb25seSgiY3ZzIikpCisgICAgICAgIHNlbGYuY3ZzX3Byb3h5X3BvcnQuc2V0X2VkaXRhYmxlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgYW5kIChub3Qgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpKQorICAgICAgICBzZWxmLmN2c19wcm94eV9wb3J0LnNldF9zZW5zaXRpdmUoc2VsZi5jb25maWd1cmF0aW9uLmVuYWJsZV9wcm94eSBhbmQgKG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkpCisgICAgICAgIHNlbGYuY3ZzX3Byb3h5X2RldGFpbHMuc2V0X3NlbnNpdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5IGFuZCAobm90IHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5KSkKKworICAgICAgICBpZiBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eToKKyAgICAgICAgICAgIGlmIHNlbGYuaHR0cF9wcm94eS5nZXRfdGV4dCgpOgorICAgICAgICAgICAgICAgIFt3LnNldF90ZXh0KHNlbGYuaHR0cF9wcm94eS5nZXRfdGV4dCgpKSBmb3IgdyBpbiBzZWxmLnNhbWVfcHJveHlfYWRkcmVzc2VzXQorICAgICAgICAgICAgaWYgc2VsZi5odHRwX3Byb3h5X3BvcnQuZ2V0X3RleHQoKToKKyAgICAgICAgICAgICAgICBbdy5zZXRfdGV4dChzZWxmLmh0dHBfcHJveHlfcG9ydC5nZXRfdGV4dCgpKSBmb3IgdyBpbiBzZWxmLnNhbWVfcHJveHlfcG9ydHNdCisKKyAgICBkZWYgcHJveHlfY2hlY2tib3hfdG9nZ2xlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uZW5hYmxlX3Byb3h5ID0gc2VsZi5wcm94eV9jaGVja2JveC5nZXRfYWN0aXZlKCkKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHk6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLnNhbWVfY2hlY2tib3guc2V0X2FjdGl2ZShzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eSkKKyAgICAgICAgc2VsZi5zYXZlX3Byb3h5X2RhdGEoKQorICAgICAgICBzZWxmLnJlZnJlc2hfcHJveHlfY29tcG9uZW50cygpCisKKyAgICBkZWYgc2FtZV9jaGVja2JveF90b2dnbGVkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zYW1lX3Byb3h5ID0gc2VsZi5zYW1lX2NoZWNrYm94LmdldF9hY3RpdmUoKQorICAgICAgICBzZWxmLnNhdmVfcHJveHlfZGF0YSgpCisgICAgICAgIHNlbGYucmVmcmVzaF9wcm94eV9jb21wb25lbnRzKCkKKworICAgIGRlZiBzYXZlX3Byb3h5X2RhdGEoc2VsZik6CisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zcGxpdF9wcm94eSgiaHR0cCIsIHNlbGYuaHR0cF9wcm94eS5nZXRfdGV4dCgpICsgIjoiICsgc2VsZi5odHRwX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkKKyAgICAgICAgaWYgc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHk6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoImh0dHBzIiwgc2VsZi5odHRwX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLmh0dHBfcHJveHlfcG9ydC5nZXRfdGV4dCgpKQorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNwbGl0X3Byb3h5KCJmdHAiLCBzZWxmLmh0dHBfcHJveHkuZ2V0X3RleHQoKSArICI6IiArIHNlbGYuaHR0cF9wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoInNvY2tzIiwgc2VsZi5odHRwX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLmh0dHBfcHJveHlfcG9ydC5nZXRfdGV4dCgpKQorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNwbGl0X3Byb3h5KCJjdnMiLCBzZWxmLmh0dHBfcHJveHkuZ2V0X3RleHQoKSArICI6IiArIHNlbGYuaHR0cF9wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoImh0dHBzIiwgc2VsZi5odHRwc19wcm94eS5nZXRfdGV4dCgpICsgIjoiICsgc2VsZi5odHRwc19wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoImZ0cCIsIHNlbGYuZnRwX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLmZ0cF9wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoInNvY2tzIiwgc2VsZi5zb2Nrc19wcm94eS5nZXRfdGV4dCgpICsgIjoiICsgc2VsZi5zb2Nrc19wcm94eV9wb3J0LmdldF90ZXh0KCkpCisgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3BsaXRfcHJveHkoImN2cyIsIHNlbGYuY3ZzX3Byb3h5LmdldF90ZXh0KCkgKyAiOiIgKyBzZWxmLmN2c19wcm94eV9wb3J0LmdldF90ZXh0KCkpICAgICAgIAorCisgICAgZGVmIHJlc3BvbnNlX2NiKHNlbGYsIGRpYWxvZywgcmVzcG9uc2VfaWQpOgorICAgICAgICBpZiByZXNwb25zZV9pZCA9PSBndGsuUkVTUE9OU0VfWUVTOgorICAgICAgICAgICAgaWYgc2VsZi5wcm94eV9jaGVja2JveC5nZXRfYWN0aXZlKCk6CisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IGFsbCBwcm94eSBlbnRyaWVzIGhhdmUgYSBjb3JyZXNwb25kaW5nIHBvcnQKKyAgICAgICAgICAgICAgICBmb3IgcHJveHksIHBvcnQgaW4gemlwKHNlbGYuYWxsX3Byb3h5X2FkZHJlc3Nlcywgc2VsZi5hbGxfcHJveHlfcG9ydHMpOgorICAgICAgICAgICAgICAgICAgICBpZiBwcm94eS5nZXRfdGV4dCgpIGFuZCBub3QgcG9ydC5nZXRfdGV4dCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgbGJsID0gIjxiPkVudGVyIGFsbCBwb3J0IG51bWJlcnM8L2I+IgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gIlByb3h5IHNlcnZlcnMgcmVxdWlyZSBhIHBvcnQgbnVtYmVyLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGVudGVyZWQgYSBwb3J0IG51bWJlciBmb3IgZWFjaCBwcm94eSBzZXJ2ZXIuIgorICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nID0gQ3J1bWJzTWVzc2FnZURpYWxvZyhzZWxmLCBsYmwsIGd0ay5NRVNTQUdFX1dBUk5JTkcsIG1zZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdF9zdG9wX2J5X25hbWUoInJlc3BvbnNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5kbGRpciA9IHNlbGYuZGxkaXJfdGV4dC5nZXRfdGV4dCgpCisgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5zc3RhdGVkaXIgPSBzZWxmLnNzdGF0ZWRpcl90ZXh0LmdldF90ZXh0KCkKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnNzdGF0ZW1pcnJvciA9ICIiCisgICAgICAgIGZvciBtaXJyb3IgaW4gc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3Q6CisgICAgICAgICAgICBpZiBtaXJyb3JbMV0gIT0gIiIgYW5kIG1pcnJvclsyXS5zdGFydHN3aXRoKCJmaWxlOi8vIik6CisgICAgICAgICAgICAgICAgc21pcnJvciA9IG1pcnJvclsyXSArICIgIiArIG1pcnJvclsxXSArICIgXFxuICIKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24uc3N0YXRlbWlycm9yICs9IHNtaXJyb3IKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmJidGhyZWFkID0gc2VsZi5iYl9zcGlubmVyLmdldF92YWx1ZV9hc19pbnQoKQorICAgICAgICBzZWxmLmNvbmZpZ3VyYXRpb24ucG1ha2UgPSBzZWxmLnBtYWtlX3NwaW5uZXIuZ2V0X3ZhbHVlX2FzX2ludCgpCisgICAgICAgIHNlbGYuc2F2ZV9wcm94eV9kYXRhKCkKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmV4dHJhX3NldHRpbmcgPSB7fQorICAgICAgICBpdCA9IHNlbGYuc2V0dGluZ19zdG9yZS5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAga2V5ID0gc2VsZi5zZXR0aW5nX3N0b3JlLmdldF92YWx1ZShpdCwgMCkKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5zZXR0aW5nX3N0b3JlLmdldF92YWx1ZShpdCwgMSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5leHRyYV9zZXR0aW5nW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgaXQgPSBzZWxmLnNldHRpbmdfc3RvcmUuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIG1kNSA9IHNlbGYuY29uZmlnX21kNSgpCisgICAgICAgIHNlbGYuc2V0dGluZ3NfY2hhbmdlZCA9IChzZWxmLm1kNSAhPSBtZDUpCisgICAgICAgIHNlbGYucHJveHlfc2V0dGluZ3NfY2hhbmdlZCA9IChzZWxmLnByb3h5X21kNSAhPSBzZWxmLmNvbmZpZ19wcm94eV9tZDUoKSkKKworICAgIGRlZiBjcmVhdGVfYnVpbGRfZW52aXJvbm1lbnRfcGFnZShzZWxmKToKKyAgICAgICAgYWR2YW5jZWRfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnNldF9ib3JkZXJfd2lkdGgoNikKKworICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCc8c3BhbiB3ZWlnaHQ9ImJvbGQiPlBhcmFsbGVsIHRocmVhZHM8L3NwYW4+JyksIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCJCaXRCYWtlIHBhcmFsbGVsIHRocmVhZHMiKQorICAgICAgICB0b29sdGlwID0gIlNldHMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRoYXQgQml0QmFrZSB0YXNrcyBjYW4gc2ltdWx0YW5lb3VzbHkgcnVuLiBTZWUgdGhlIDxhIGhyZWY9XCIiCisgICAgICAgIHRvb2x0aXAgKz0gImh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2N1cnJlbnQvcG9reS1yZWYtbWFudWFsLyIKKyAgICAgICAgdG9vbHRpcCArPSAicG9reS1yZWYtbWFudWFsLmh0bWwjdmFyLUJCX05VTUJFUl9USFJFQURTXCI+UG9reSByZWZlcmVuY2UgbWFudWFsPC9hPiBmb3IgaW5mb3JtYXRpb24iCisgICAgICAgIGJidGhyZWFkX3dpZGdldCwgc2VsZi5iYl9zcGlubmVyID0gc2VsZi5nZW5fc3Bpbm5lcl93aWRnZXQoc2VsZi5jb25maWd1cmF0aW9uLmJidGhyZWFkLCAxLCBzZWxmLm1heF90aHJlYWRzLCI8Yj5CaXRCYWtlIHByYWxsYWxlbCB0aHJlYWRzPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoYmJ0aHJlYWRfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCJNYWtlIHBhcmFsbGVsIHRocmVhZHMiKQorICAgICAgICB0b29sdGlwID0gIlNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdGhlIGhvc3QgY2FuIHVzZSBkdXJpbmcgdGhlIGJ1aWxkLiBTZWUgdGhlIDxhIGhyZWY9XCIiCisgICAgICAgIHRvb2x0aXAgKz0gImh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2N1cnJlbnQvcG9reS1yZWYtbWFudWFsLyIKKyAgICAgICAgdG9vbHRpcCArPSAicG9reS1yZWYtbWFudWFsLmh0bWwjdmFyLVBBUkFMTEVMX01BS0VcIj5Qb2t5IHJlZmVyZW5jZSBtYW51YWw8L2E+IGZvciBpbmZvcm1hdGlvbiIKKyAgICAgICAgcG1ha2Vfd2lkZ2V0LCBzZWxmLnBtYWtlX3NwaW5uZXIgPSBzZWxmLmdlbl9zcGlubmVyX3dpZGdldChzZWxmLmNvbmZpZ3VyYXRpb24ucG1ha2UsIDEsIHNlbGYubWF4X3RocmVhZHMsIjxiPk1ha2UgcGFyYWxsZWwgdGhyZWFkczwvYj4iICsgIioiICsgdG9vbHRpcCkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KHBtYWtlX3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzZWxmLmdlbl9sYWJlbF93aWRnZXQoJzxzcGFuIHdlaWdodD0iYm9sZCI+RG93bmxvYWRlZCBzb3VyY2UgY29kZTwvc3Bhbj4nKSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveCA9IGd0ay5WQm94KEZhbHNlLCA2KQorICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQoc3ViX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIkRvd25sb2FkcyBkaXJlY3RvcnkiKQorICAgICAgICB0b29sdGlwID0gIlNlbGVjdCBhIGZvbGRlciB0aGF0IGNhY2hlcyB0aGUgdXBzdHJlYW0gcHJvamVjdCBzb3VyY2UgY29kZSIKKyAgICAgICAgZGxkaXJfd2lkZ2V0LCBzZWxmLmRsZGlyX3RleHQgPSBzZWxmLmdlbl9lbnRyeV93aWRnZXQoc2VsZi5jb25maWd1cmF0aW9uLmRsZGlyLCBzZWxmLCI8Yj5Eb3dubG9hZGVkIHNvdXJjZSBjb2RlPC9iPiIgKyAiKiIgKyB0b29sdGlwKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoZGxkaXJfd2lkZ2V0LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgcmV0dXJuIGFkdmFuY2VkX3Zib3gKKworICAgIGRlZiBjcmVhdGVfc2hhcmVkX3N0YXRlX3BhZ2Uoc2VsZik6CisgICAgICAgIGFkdmFuY2VkX3Zib3ggPSBndGsuVkJveChGYWxzZSkKKyAgICAgICAgYWR2YW5jZWRfdmJveC5zZXRfYm9yZGVyX3dpZHRoKDEyKQorCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTI0KQorICAgICAgICBjb250ZW50ID0gIjxzcGFuPlNoYXJlZCBzdGF0ZSBkaXJlY3Rvcnk8L3NwYW4+IgorICAgICAgICB0b29sdGlwID0gIlNlbGVjdCBhIGZvbGRlciB0aGF0IGNhY2hlcyB5b3VyIHByZWJ1aWx0IHJlc3VsdHMiCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfaW5mb193aWRnZXQoY29udGVudCwiPGI+U2hhcmVkIHN0YXRlIGRpcmVjdG9yeTwvYj4iICsgIioiICsgdG9vbHRpcCkKKyAgICAgICAgc3N0YXRlZGlyX3dpZGdldCwgc2VsZi5zc3RhdGVkaXJfdGV4dCA9IHNlbGYuZ2VuX2VudHJ5X3dpZGdldChzZWxmLmNvbmZpZ3VyYXRpb24uc3N0YXRlZGlyLCBzZWxmKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc3N0YXRlZGlyX3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTYpCisKKyAgICAgICAgY29udGVudCA9ICI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+U2hhcmVkIHN0YXRlIG1pcnJvcnM8L3NwYW4+IgorICAgICAgICB0b29sdGlwID0gIlVSTHMgcG9pbnRpbmcgdG8gcHJlLWJ1aWx0IG1pcnJvcnMgdGhhdCB3aWxsIHNwZWVkIHlvdXIgYnVpbGQuICIKKyAgICAgICAgdG9vbHRpcCArPSAiU2VsZWN0IHRoZSBcJ1N0YW5kYXJkXCcgY29uZmlndXJhdGlvbiBpZiB0aGUgc3RydWN0dXJlIG9mIHlvdXIgIgorICAgICAgICB0b29sdGlwICs9ICJtaXJyb3IgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHlvdXIgbG9jYWwgc2hhcmVkIHN0YXRlIGRpcmVjdG9yeS4gIgorICAgICAgICB0b29sdGlwICs9ICJGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzaGFyZWQgc3RhdGUgbWlycm9ycywgY2hlY2sgdGhlIDxhIGhyZWY9XCIiCisgICAgICAgIHRvb2x0aXAgKz0gImh0dHA6Ly93d3cueW9jdG9wcm9qZWN0Lm9yZy9kb2NzL2N1cnJlbnQvcG9reS1yZWYtbWFudWFsLyIKKyAgICAgICAgdG9vbHRpcCArPSAicG9reS1yZWYtbWFudWFsLmh0bWwjc2hhcmVkLXN0YXRlXCI+WW9jdG8gUHJvamVjdCBSZWZlcmVuY2UgTWFudWFsPC9hPi4iCisgICAgICAgIHRhYmxlID0gc2VsZi5nZW5fbGFiZWxfaW5mb193aWRnZXQoY29udGVudCwiPGI+U2hhcmVkIHN0YXRlIG1pcnJvcnM8L2I+IiArICIqIiArIHRvb2x0aXApCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydCh0YWJsZSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPTYpCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSkKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBndGsuVFJVRSwgZ3RrLlRSVUUsIDApCisKKyAgICAgICAgaWYgc2VsZi5zc3RhdGVtaXJyb3JzX2NoYW5nZWQgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19jaGFuZ2VkID0gMQorICAgICAgICAgICAgc3N0YXRlbWlycm9ycyA9IHNlbGYuY29uZmlndXJhdGlvbi5zc3RhdGVtaXJyb3IKKyAgICAgICAgICAgIGlmIHNzdGF0ZW1pcnJvcnMgPT0gIiI6CisgICAgICAgICAgICAgICAgc21fbGlzdCA9IFsiU3RhbmRhcmQiLCAiIiwgImZpbGU6Ly8oLiopIl0KKyAgICAgICAgICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdC5hcHBlbmQoc21fbGlzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3N0YXRlbWlycm9ycyA9IFt4IGZvciB4IGluIHNzdGF0ZW1pcnJvcnMuc3BsaXQoJ1xcbicpXQorICAgICAgICAgICAgICAgIGZvciBzc3RhdGVtaXJyb3IgaW4gc3N0YXRlbWlycm9yczoKKyAgICAgICAgICAgICAgICAgICAgc3N0YXRlbWlycm9yX2ZpZWxkcyA9IFt4IGZvciB4IGluIHNzdGF0ZW1pcnJvci5zcGxpdCgnICcpIGlmIHguc3RyaXAoKV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHNzdGF0ZW1pcnJvcl9maWVsZHMpID09IDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzc3RhdGVtaXJyb3JfZmllbGRzWzBdID09ICJmaWxlOi8vKC4qKSIgb3Igc3N0YXRlbWlycm9yX2ZpZWxkc1swXSA9PSAiZmlsZTovLy4qIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbV9saXN0ID0gWyJTdGFuZGFyZCIsIHNzdGF0ZW1pcnJvcl9maWVsZHNbMV0sIHNzdGF0ZW1pcnJvcl9maWVsZHNbMF1dCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtX2xpc3QgPSBbIkN1c3RvbSIsIHNzdGF0ZW1pcnJvcl9maWVsZHNbMV0sIHNzdGF0ZW1pcnJvcl9maWVsZHNbMF1dCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdC5hcHBlbmQoc21fbGlzdCkKKworICAgICAgICBzc3RhdGVtaXJyb3JzX3dpZGdldCwgc3N0YXRlbWlycm9yc19zdG9yZSA9IHNlbGYuZ2VuX3NoYXJlZF9zc3RhdGVfd2lkZ2V0KHNlbGYuc3N0YXRlbWlycm9yc19saXN0LCBzZWxmKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KHNzdGF0ZW1pcnJvcnNfd2lkZ2V0LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHRhYmxlID0gZ3RrLlRhYmxlKDEsIDEwLCBGYWxzZSkKKyAgICAgICAgdGFibGUuc2V0X2NvbF9zcGFjaW5ncyg2KQorICAgICAgICBhZGRfbWlycm9yX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiQWRkIG1pcnJvciIpCisgICAgICAgIGFkZF9taXJyb3JfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmFkZF9taXJyb3IpCisgICAgICAgIGFkZF9taXJyb3JfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTIwLDMwKQorICAgICAgICB0YWJsZS5hdHRhY2goYWRkX21pcnJvcl9idXR0b24sIDEsIDIsIDAsIDEsIHhvcHRpb25zPWd0ay5TSFJJTkspCisKKyAgICAgICAgc2VsZi5kZWxldGVfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJEZWxldGUgbWlycm9yIikKKyAgICAgICAgc2VsZi5kZWxldGVfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmRlbGV0ZV9jYikKKyAgICAgICAgc2VsZi5kZWxldGVfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMTIwLCAzMCkKKyAgICAgICAgdGFibGUuYXR0YWNoKHNlbGYuZGVsZXRlX2J1dHRvbiwgMywgNCwgMCwgMSwgeG9wdGlvbnM9Z3RrLlNIUklOSykKKworICAgICAgICBhZHZhbmNlZF92Ym94LnBhY2tfc3RhcnQodGFibGUsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSwgcGFkZGluZz02KQorCisgICAgICAgIHJldHVybiBhZHZhbmNlZF92Ym94CisKKyAgICBkZWYgZ2VuX3NoYXJlZF9zc3RhdGVfd2lkZ2V0KHNlbGYsIHNzdGF0ZW1pcnJvcnNfbGlzdCwgd2luZG93KToKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlKQorCisgICAgICAgIHNzdGF0ZW1pcnJvcnNfc3RvcmUgPSBndGsuTGlzdFN0b3JlKHN0ciwgc3RyLCBzdHIpCisgICAgICAgIGZvciBzc3RhdGVtaXJyb3IgaW4gc3N0YXRlbWlycm9yc19saXN0OgorICAgICAgICAgICAgc3N0YXRlbWlycm9yc19zdG9yZS5hcHBlbmQoc3N0YXRlbWlycm9yKQorCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190diA9IGd0ay5UcmVlVmlldygpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5zZXRfcnVsZXNfaGludChUcnVlKQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuc2V0X2hlYWRlcnNfdmlzaWJsZShUcnVlKQorICAgICAgICB0cmVlX3NlbGVjdGlvbiA9IHNlbGYuc3N0YXRlbWlycm9yc190di5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgdHJlZV9zZWxlY3Rpb24uc2V0X21vZGUoZ3RrLlNFTEVDVElPTl9TSU5HTEUpCisKKyAgICAgICAgIyBBbGxvdyBlbmFibGUgZHJhZyBhbmQgZHJvcCBvZiByb3dzIGluY2x1ZGluZyByb3cgbW92ZQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuZW5hYmxlX21vZGVsX2RyYWdfc291cmNlKCBndGsuZ2RrLkJVVFRPTjFfTUFTSywKKyAgICAgICAgICAgIHNlbGYuVEFSR0VUUywKKyAgICAgICAgICAgIGd0ay5nZGsuQUNUSU9OX0RFRkFVTFR8CisgICAgICAgICAgICBndGsuZ2RrLkFDVElPTl9NT1ZFKQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuZW5hYmxlX21vZGVsX2RyYWdfZGVzdChzZWxmLlRBUkdFVFMsCisgICAgICAgICAgICBndGsuZ2RrLkFDVElPTl9ERUZBVUxUKQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuY29ubmVjdCgiZHJhZ19kYXRhX2dldCIsIHNlbGYuZHJhZ19kYXRhX2dldF9jYikKKyAgICAgICAgc2VsZi5zc3RhdGVtaXJyb3JzX3R2LmNvbm5lY3QoImRyYWdfZGF0YV9yZWNlaXZlZCIsIHNlbGYuZHJhZ19kYXRhX3JlY2VpdmVkX2NiKQorCisKKyAgICAgICAgc2VsZi5zY3JvbGwgPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorICAgICAgICBzZWxmLnNjcm9sbC5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfTkVWRVIsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorICAgICAgICBzZWxmLnNjcm9sbC5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKyAgICAgICAgc2VsZi5zY3JvbGwuY29ubmVjdCgnc2l6ZS1hbGxvY2F0ZScsIHNlbGYuc2Nyb2xsX2NoYW5nZWQpCisgICAgICAgIHNlbGYuc2Nyb2xsLmFkZChzZWxmLnNzdGF0ZW1pcnJvcnNfdHYpCisKKyAgICAgICAgI2xpc3Qgc3RvcmUgZm9yIGNlbGwgcmVuZGVyZXIKKyAgICAgICAgbSA9IGd0ay5MaXN0U3RvcmUoZ29iamVjdC5UWVBFX1NUUklORykKKyAgICAgICAgbS5hcHBlbmQoWyJTdGFuZGFyZCJdKQorICAgICAgICBtLmFwcGVuZChbIkN1c3RvbSJdKQorCisgICAgICAgIGNlbGwwID0gZ3RrLkNlbGxSZW5kZXJlckNvbWJvKCkKKyAgICAgICAgY2VsbDAuc2V0X3Byb3BlcnR5KCJtb2RlbCIsbSkKKyAgICAgICAgY2VsbDAuc2V0X3Byb3BlcnR5KCJ0ZXh0LWNvbHVtbiIsIDApCisgICAgICAgIGNlbGwwLnNldF9wcm9wZXJ0eSgiZWRpdGFibGUiLCBUcnVlKQorICAgICAgICBjZWxsMC5zZXRfcHJvcGVydHkoImhhcy1lbnRyeSIsIEZhbHNlKQorICAgICAgICBjb2wwID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCJDb25maWd1cmF0aW9uIikKKyAgICAgICAgY29sMC5wYWNrX3N0YXJ0KGNlbGwwLCBGYWxzZSkKKyAgICAgICAgY29sMC5hZGRfYXR0cmlidXRlKGNlbGwwLCAidGV4dCIsIDApCisgICAgICAgIGNvbDAuc2V0X2NlbGxfZGF0YV9mdW5jKGNlbGwwLCBzZWxmLmNvbmZpZ3VyYXRpb25fZmllbGQpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5hcHBlbmRfY29sdW1uKGNvbDApCisKKyAgICAgICAgY2VsbDAuY29ubmVjdCgiZWRpdGVkIiwgc2VsZi5jb21ib19jaGFuZ2VkLCBzc3RhdGVtaXJyb3JzX3N0b3JlKQorCisgICAgICAgIHNlbGYuY2VsbDEgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIHNlbGYuY2VsbDEuc2V0X3BhZGRpbmcoNSwyKQorICAgICAgICBjb2wxID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCdSZWdleCcsIHNlbGYuY2VsbDEpCisgICAgICAgIGNvbDEuc2V0X2NlbGxfZGF0YV9mdW5jKHNlbGYuY2VsbDEsIHNlbGYucmVnZXhfZmllbGQpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5hcHBlbmRfY29sdW1uKGNvbDEpCisKKyAgICAgICAgc2VsZi5jZWxsMS5jb25uZWN0KCJlZGl0ZWQiLCBzZWxmLnJlZ2V4X2NoYW5nZWQsIHNzdGF0ZW1pcnJvcnNfc3RvcmUpCisKKyAgICAgICAgY2VsbDIgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIGNlbGwyLnNldF9wYWRkaW5nKDUsMikKKyAgICAgICAgY2VsbDIuc2V0X3Byb3BlcnR5KCJlZGl0YWJsZSIsIFRydWUpCisgICAgICAgIGNvbDIgPSBndGsuVHJlZVZpZXdDb2x1bW4oJ1VSTCcsIGNlbGwyKQorICAgICAgICBjb2wyLnNldF9jZWxsX2RhdGFfZnVuYyhjZWxsMiwgc2VsZi51cmxfZmllbGQpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5hcHBlbmRfY29sdW1uKGNvbDIpCisKKyAgICAgICAgY2VsbDIuY29ubmVjdCgiZWRpdGVkIiwgc2VsZi51cmxfY2hhbmdlZCwgc3N0YXRlbWlycm9yc19zdG9yZSkKKworICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuc2V0X21vZGVsKHNzdGF0ZW1pcnJvcnNfc3RvcmUpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc190di5zZXRfY3Vyc29yKHNlbGYuc2VsZWN0ZWRfbWlycm9yX3JvdykKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHNlbGYuc2Nyb2xsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBoYm94LnNob3dfYWxsKCkKKworICAgICAgICByZXR1cm4gaGJveCwgc3N0YXRlbWlycm9yc19zdG9yZQorCisgICAgZGVmIGRyYWdfZGF0YV9nZXRfY2Ioc2VsZiwgdHJlZXZpZXcsIGNvbnRleHQsIHNlbGVjdGlvbiwgdGFyZ2V0X2lkLCBldGltZSk6CisgICAgICAgIHRyZWVzZWxlY3Rpb24gPSB0cmVldmlldy5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgbW9kZWwsIGl0ZXIgPSB0cmVlc2VsZWN0aW9uLmdldF9zZWxlY3RlZCgpCisgICAgICAgIGRhdGEgPSBtb2RlbC5nZXRfc3RyaW5nX2Zyb21faXRlcihpdGVyKQorICAgICAgICBzZWxlY3Rpb24uc2V0KHNlbGVjdGlvbi50YXJnZXQsIDgsIGRhdGEpCisKKyAgICBkZWYgZHJhZ19kYXRhX3JlY2VpdmVkX2NiKHNlbGYsIHRyZWV2aWV3LCBjb250ZXh0LCB4LCB5LCBzZWxlY3Rpb24sIGluZm8sIGV0aW1lKToKKyAgICAgICAgbW9kZWwgPSB0cmVldmlldy5nZXRfbW9kZWwoKQorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgdHJlZV9pdGVyID0gbW9kZWwuZ2V0X2l0ZXJfZnJvbV9zdHJpbmcoc2VsZWN0aW9uLmRhdGEpCisgICAgICAgIGRhdGEuYXBwZW5kKG1vZGVsLmdldF92YWx1ZSh0cmVlX2l0ZXIsIDApKQorICAgICAgICBkYXRhLmFwcGVuZChtb2RlbC5nZXRfdmFsdWUodHJlZV9pdGVyLCAxKSkKKyAgICAgICAgZGF0YS5hcHBlbmQobW9kZWwuZ2V0X3ZhbHVlKHRyZWVfaXRlciwgMikpCisKKyAgICAgICAgZHJvcF9pbmZvID0gdHJlZXZpZXcuZ2V0X2Rlc3Rfcm93X2F0X3Bvcyh4LCB5KQorICAgICAgICBpZiBkcm9wX2luZm86CisgICAgICAgICAgICBwYXRoLCBwb3NpdGlvbiA9IGRyb3BfaW5mbworICAgICAgICAgICAgaXRlciA9IG1vZGVsLmdldF9pdGVyKHBhdGgpCisgICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gZ3RrLlRSRUVfVklFV19EUk9QX0JFRk9SRSBvciBwb3NpdGlvbiA9PSBndGsuVFJFRV9WSUVXX0RST1BfSU5UT19PUl9CRUZPUkUpOgorICAgICAgICAgICAgICAgIG1vZGVsLmluc2VydF9iZWZvcmUoaXRlciwgZGF0YSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbW9kZWwuaW5zZXJ0X2FmdGVyKGl0ZXIsIGRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlbC5hcHBlbmQoZGF0YSkKKyAgICAgICAgaWYgY29udGV4dC5hY3Rpb24gPT0gZ3RrLmdkay5BQ1RJT05fTU9WRToKKyAgICAgICAgICAgIGNvbnRleHQuZmluaXNoKFRydWUsIFRydWUsIGV0aW1lKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBkZWxldGVfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZWN0aW9uID0gc2VsZi5zc3RhdGVtaXJyb3JzX3R2LmdldF9zZWxlY3Rpb24oKQorICAgICAgICB0cmVlX21vZGVsLCB0cmVlX2l0ZXIgPSBzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgaW5kZXggPSBpbnQodHJlZV9tb2RlbC5nZXRfc3RyaW5nX2Zyb21faXRlcih0cmVlX2l0ZXIpKQorICAgICAgICBpZiBpbmRleCA9PSAwOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZF9taXJyb3Jfcm93ID0gaW5kZXgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRfbWlycm9yX3JvdyA9IGluZGV4IC0gMQorICAgICAgICBzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdC5wb3AoaW5kZXgpCisgICAgICAgIHNlbGYucmVmcmVzaF9zaGFyZWRfc3RhdGVfcGFnZSgpCisgICAgICAgIGlmIG5vdCBzZWxmLnNzdGF0ZW1pcnJvcnNfbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZGVsZXRlX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorCisgICAgZGVmIGFkZF9taXJyb3Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5uZXdfbWlycm9yID0gVHJ1ZQorICAgICAgICB0b29sdGlwID0gIlNlbGVjdCB0aGUgcHJlLWJ1aWx0IG1pcnJvciB0aGF0IHdpbGwgc3BlZWQgeW91ciBidWlsZCIKKyAgICAgICAgaW5kZXggPSBsZW4oc2VsZi5zc3RhdGVtaXJyb3JzX2xpc3QpCisgICAgICAgIHNlbGYuc2VsZWN0ZWRfbWlycm9yX3JvdyA9IGluZGV4CisgICAgICAgIHNtX2xpc3QgPSBbIlN0YW5kYXJkIiwgIiIsICJmaWxlOi8vKC4qKSJdCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0LmFwcGVuZChzbV9saXN0KQorICAgICAgICBzZWxmLnJlZnJlc2hfc2hhcmVkX3N0YXRlX3BhZ2UoKQorCisgICAgZGVmIHNjcm9sbF9jaGFuZ2VkKHNlbGYsIHdpZGdldCwgZXZlbnQsIGRhdGE9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYubmV3X21pcnJvciA9PSBUcnVlOgorICAgICAgICAgICAgYWRqID0gd2lkZ2V0LmdldF92YWRqdXN0bWVudCgpCisgICAgICAgICAgICBhZGouc2V0X3ZhbHVlKGFkai51cHBlciAtIGFkai5wYWdlX3NpemUpCisgICAgICAgICAgICBzZWxmLm5ld19taXJyb3IgPSBGYWxzZQorCisgICAgZGVmIGNvbWJvX2NoYW5nZWQoc2VsZiwgd2lkZ2V0LCBwYXRoLCB0ZXh0LCBtb2RlbCk6CisgICAgICAgIG1vZGVsW3BhdGhdWzBdID0gdGV4dAorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgIHRyZWVfbW9kZWwsIHRyZWVfaXRlciA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorICAgICAgICBpbmRleCA9IGludCh0cmVlX21vZGVsLmdldF9zdHJpbmdfZnJvbV9pdGVyKHRyZWVfaXRlcikpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0W2luZGV4XVswXSA9IHRleHQKKworICAgIGRlZiByZWdleF9jaGFuZ2VkKHNlbGYsIGNlbGwsIHBhdGgsIG5ld190ZXh0LCB1c2VyX2RhdGEpOgorICAgICAgICB1c2VyX2RhdGFbcGF0aF1bMl0gPSBuZXdfdGV4dAorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgIHRyZWVfbW9kZWwsIHRyZWVfaXRlciA9IHNlbGVjdGlvbi5nZXRfc2VsZWN0ZWQoKQorICAgICAgICBpbmRleCA9IGludCh0cmVlX21vZGVsLmdldF9zdHJpbmdfZnJvbV9pdGVyKHRyZWVfaXRlcikpCisgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0W2luZGV4XVsyXSA9IG5ld190ZXh0CisgICAgICAgIHJldHVybgorCisgICAgZGVmIHVybF9jaGFuZ2VkKHNlbGYsIGNlbGwsIHBhdGgsIG5ld190ZXh0LCB1c2VyX2RhdGEpOgorICAgICAgICBpZiBuZXdfdGV4dCE9IkVudGVyIHRoZSBtaXJyb3IgVVJMIiBhbmQgbmV3X3RleHQhPSJNYXRjaCByZWdleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoaXMgVVJMIjoKKyAgICAgICAgICAgIHVzZXJfZGF0YVtwYXRoXVsxXSA9IG5ld190ZXh0CisgICAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnNzdGF0ZW1pcnJvcnNfdHYuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgICAgICB0cmVlX21vZGVsLCB0cmVlX2l0ZXIgPSBzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgICAgIGluZGV4ID0gaW50KHRyZWVfbW9kZWwuZ2V0X3N0cmluZ19mcm9tX2l0ZXIodHJlZV9pdGVyKSkKKyAgICAgICAgICAgIHNlbGYuc3N0YXRlbWlycm9yc19saXN0W2luZGV4XVsxXSA9IG5ld190ZXh0CisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNvbmZpZ3VyYXRpb25fZmllbGQoc2VsZiwgY29sdW1uLCBjZWxsLCBtb2RlbCwgaXRlcik6CisgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCd0ZXh0JywgbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIsIDApKQorICAgICAgICBpZiBtb2RlbC5nZXRfdmFsdWUoaXRlciwgMCkgPT0gIlN0YW5kYXJkIjoKKyAgICAgICAgICAgIHNlbGYuY2VsbDEuc2V0X3Byb3BlcnR5KCJzZW5zaXRpdmUiLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuY2VsbDEuc2V0X3Byb3BlcnR5KCJlZGl0YWJsZSIsIEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jZWxsMS5zZXRfcHJvcGVydHkoInNlbnNpdGl2ZSIsIFRydWUpCisgICAgICAgICAgICBzZWxmLmNlbGwxLnNldF9wcm9wZXJ0eSgiZWRpdGFibGUiLCBUcnVlKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiByZWdleF9maWVsZChzZWxmLCBjb2x1bW4sIGNlbGwsIG1vZGVsLCBpdGVyKToKKyAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3RleHQnLCBtb2RlbC5nZXRfdmFsdWUoaXRlciwgMikpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHVybF9maWVsZChzZWxmLCBjb2x1bW4sIGNlbGwsIG1vZGVsLCBpdGVyKToKKyAgICAgICAgdGV4dCA9IG1vZGVsLmdldF92YWx1ZShpdGVyLCAxKQorICAgICAgICBpZiB0ZXh0ID09ICIiOgorICAgICAgICAgICAgaWYgbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIsIDApID09ICJTdGFuZGFyZCI6CisgICAgICAgICAgICAgICAgdGV4dCA9ICJFbnRlciB0aGUgbWlycm9yIFVSTCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGV4dCA9ICJNYXRjaCByZWdleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoaXMgVVJMIgorICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgndGV4dCcsIHRleHQpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHJlZnJlc2hfc2hhcmVkX3N0YXRlX3BhZ2Uoc2VsZik6CisgICAgICAgIHBhZ2VfbnVtID0gc2VsZi5uYi5nZXRfY3VycmVudF9wYWdlKCkKKyAgICAgICAgc2VsZi5uYi5yZW1vdmVfcGFnZShwYWdlX251bSk7CisgICAgICAgIHNlbGYubmIuaW5zZXJ0X3BhZ2Uoc2VsZi5jcmVhdGVfc2hhcmVkX3N0YXRlX3BhZ2UoKSwgZ3RrLkxhYmVsKCJTaGFyZWQgc3RhdGUiKSxwYWdlX251bSkKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisgICAgICAgIHNlbGYubmIuc2V0X2N1cnJlbnRfcGFnZShwYWdlX251bSkKKworICAgIGRlZiB0ZXN0X3Byb3h5X2VuZGVkKHNlbGYsIHBhc3NlZCk6CisgICAgICAgIHNlbGYucHJveHlfdGVzdF9ydW5uaW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5zZXRfdGVzdF9wcm94eV9zdGF0ZShzZWxmLlRFU1RfTkVUV09SS19QQVNTRUQgaWYgcGFzc2VkIGVsc2Ugc2VsZi5URVNUX05FVFdPUktfRkFJTEVEKQorICAgICAgICBzZWxmLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKyAgICAgICAgc2VsZi5yZWZyZXNoX3Byb3h5X2NvbXBvbmVudHMoKQorCisgICAgZGVmIHRpbWVyX2Z1bmMoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9wcm94eV9wcm9ncmVzcy5wdWxzZSgpCisgICAgICAgIHJldHVybiBzZWxmLnByb3h5X3Rlc3RfcnVubmluZworCisgICAgZGVmIHRlc3RfbmV0d29ya19idXR0b25fY2Ioc2VsZiwgYik6CisgICAgICAgIHNlbGYuc2V0X3Rlc3RfcHJveHlfc3RhdGUoc2VsZi5URVNUX05FVFdPUktfUlVOTklORykKKyAgICAgICAgc2VsZi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICBzZWxmLnNhdmVfcHJveHlfZGF0YSgpCisgICAgICAgIGlmIHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgPT0gVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfaHR0cF9wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eSgiaHR0cCIpKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9odHRwc19wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wcm94eSgiaHR0cHMiKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfZnRwX3Byb3h5KHNlbGYuY29uZmlndXJhdGlvbi5jb21iaW5lX3Byb3h5KCJmdHAiKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci5zZXRfc29ja3NfcHJveHkoc2VsZi5jb25maWd1cmF0aW9uLmNvbWJpbmVfcHJveHkoInNvY2tzIikpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2N2c19wcm94eShzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9ob3N0X29ubHkoImN2cyIpLCBzZWxmLmNvbmZpZ3VyYXRpb24uY29tYmluZV9wb3J0X29ubHkoImN2cyIpKQorICAgICAgICBlbGlmIHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkgPT0gRmFsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2h0dHBfcHJveHkoIiIpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X2h0dHBzX3Byb3h5KCIiKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9mdHBfcHJveHkoIiIpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuc2V0X3NvY2tzX3Byb3h5KCIiKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLnNldF9jdnNfcHJveHkoIiIsICIiKQorICAgICAgICBzZWxmLnByb3h5X3Rlc3RfcmFuID0gVHJ1ZQorICAgICAgICBzZWxmLnByb3h5X3Rlc3RfcnVubmluZyA9IFRydWUKKyAgICAgICAgZ29iamVjdC50aW1lb3V0X2FkZCgxMDAsIHNlbGYudGltZXJfZnVuYykKKyAgICAgICAgc2VsZi5oYW5kbGVyLnRyaWdnZXJfbmV0d29ya190ZXN0KCkKKworICAgIGRlZiB0ZXN0X3Byb3h5X2ZvY3VzX2V2ZW50KHNlbGYsIHcsIGRpcmVjdGlvbik6CisgICAgICAgIGlmIHNlbGYudGVzdF9wcm94eV9zdGF0ZSBpbiBbc2VsZi5URVNUX05FVFdPUktfUEFTU0VELCBzZWxmLlRFU1RfTkVUV09SS19GQUlMRURdOgorICAgICAgICAgICAgc2VsZi5zZXRfdGVzdF9wcm94eV9zdGF0ZShzZWxmLlRFU1RfTkVUV09SS19JTklUSUFMKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBodHRwX3Byb3h5X2NoYW5nZWQoc2VsZiwgZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmNvbmZpZ3VyYXRpb24uc2FtZV9wcm94eToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBlID09IHNlbGYuaHR0cF9wcm94eToKKyAgICAgICAgICAgIFt3LnNldF90ZXh0KHNlbGYuaHR0cF9wcm94eS5nZXRfdGV4dCgpKSBmb3IgdyBpbiBzZWxmLnNhbWVfcHJveHlfYWRkcmVzc2VzXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgW3cuc2V0X3RleHQoc2VsZi5odHRwX3Byb3h5X3BvcnQuZ2V0X3RleHQoKSkgZm9yIHcgaW4gc2VsZi5zYW1lX3Byb3h5X3BvcnRzXQorCisgICAgZGVmIHByb3h5X2FkZHJlc3NfZm9jdXNfb3V0X2V2ZW50KHNlbGYsIHcsIGRpcmVjdGlvbik6CisgICAgICAgIHRleHQgPSB3LmdldF90ZXh0KCkKKyAgICAgICAgaWYgbm90IHRleHQ6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgdGV4dC5maW5kKCIvLyIpID09IC0xOgorICAgICAgICAgICAgdy5zZXRfdGV4dCgiaHR0cDovLyIgKyB0ZXh0KQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBzZXRfdGVzdF9wcm94eV9zdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgIGlmIHNlbGYudGVzdF9wcm94eV9zdGF0ZSA9PSBzdGF0ZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBbc2VsZi5wcm94eV90YWJsZS5yZW1vdmUodykgZm9yIHcgaW4gc2VsZi50ZXN0X2d1aV9lbGVtZW50c10KKyAgICAgICAgaWYgc3RhdGUgPT0gc2VsZi5URVNUX05FVFdPUktfSU5JVElBTDoKKyAgICAgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKHNlbGYudGVzdF9uZXR3b3JrX2J1dHRvbiwgMSwgMiwgNSwgNikKKyAgICAgICAgICAgIHNlbGYudGVzdF9uZXR3b3JrX2J1dHRvbi5zaG93KCkKKyAgICAgICAgZWxpZiBzdGF0ZSA9PSBzZWxmLlRFU1RfTkVUV09SS19SVU5OSU5HOgorICAgICAgICAgICAgc2VsZi50ZXN0X3Byb3h5X3Byb2dyZXNzLnNldF9yY3N0eWxlKCJydW5uaW5nIikKKyAgICAgICAgICAgIHNlbGYudGVzdF9wcm94eV9wcm9ncmVzcy5zZXRfdGV4dCgiVGVzdGluZyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24iKQorICAgICAgICAgICAgc2VsZi5wcm94eV90YWJsZS5hdHRhY2goc2VsZi50ZXN0X3Byb3h5X3Byb2dyZXNzLCAwLCA1LCA1LCA2LCB4cGFkZGluZz00KQorICAgICAgICAgICAgc2VsZi50ZXN0X3Byb3h5X3Byb2dyZXNzLnNob3coKQorICAgICAgICBlbHNlOiAjIHBhc3NlZCBvciBmYWlsZWQKKyAgICAgICAgICAgIHNlbGYuZHVtbXlfcHJvZ3Jlc3MudXBkYXRlKDEuMCkKKyAgICAgICAgICAgIGlmIHN0YXRlID09IHNlbGYuVEVTVF9ORVRXT1JLX1BBU1NFRDoKKyAgICAgICAgICAgICAgICBzZWxmLmR1bW15X3Byb2dyZXNzLnNldF90ZXh0KCJZb3VyIG5ldHdvcmsgaXMgcHJvcGVybHkgY29uZmlndXJlZCIpCisgICAgICAgICAgICAgICAgc2VsZi5kdW1teV9wcm9ncmVzcy5zZXRfcmNzdHlsZSgicnVubmluZyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZHVtbXlfcHJvZ3Jlc3Muc2V0X3RleHQoIk5ldHdvcmsgdGVzdCBmYWlsZWQiKQorICAgICAgICAgICAgICAgIHNlbGYuZHVtbXlfcHJvZ3Jlc3Muc2V0X3Jjc3R5bGUoImZhaWwiKQorICAgICAgICAgICAgc2VsZi5wcm94eV90YWJsZS5hdHRhY2goc2VsZi5kdW1teV9wcm9ncmVzcywgMCwgNCwgNSwgNikKKyAgICAgICAgICAgIHNlbGYucHJveHlfdGFibGUuYXR0YWNoKHNlbGYucmV0ZXN0X25ldHdvcmtfYnV0dG9uLCA0LCA1LCA1LCA2LCB4cGFkZGluZz00KQorICAgICAgICAgICAgc2VsZi5kdW1teV9wcm9ncmVzcy5zaG93KCkKKyAgICAgICAgICAgIHNlbGYucmV0ZXN0X25ldHdvcmtfYnV0dG9uLnNob3coKQorICAgICAgICBzZWxmLnRlc3RfcHJveHlfc3RhdGUgPSBzdGF0ZQorCisgICAgZGVmIGNyZWF0ZV9uZXR3b3JrX3BhZ2Uoc2VsZik6CisgICAgICAgIGFkdmFuY2VkX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5zZXRfYm9yZGVyX3dpZHRoKDYpCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9hZGRyZXNzZXMgPSBbXQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfcG9ydHMgPSBbXQorICAgICAgICBzZWxmLmFsbF9wcm94eV9wb3J0cyA9IFtdCisgICAgICAgIHNlbGYuYWxsX3Byb3h5X2FkZHJlc3NlcyA9IFtdCisKKyAgICAgICAgc3ViX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgYWR2YW5jZWRfdmJveC5wYWNrX3N0YXJ0KHN1Yl92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGxhYmVsID0gc2VsZi5nZW5fbGFiZWxfd2lkZ2V0KCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+U2V0IHRoZSBwcm94aWVzIHVzZWQgd2hlbiBmZXRjaGluZyBzb3VyY2UgY29kZTwvc3Bhbj4iKQorICAgICAgICB0b29sdGlwID0gIlNldCB0aGUgcHJveGllcyB1c2VkIHdoZW4gZmV0Y2hpbmcgc291cmNlIGNvZGUuICBBIGJsYW5rIGZpZWxkIHVzZXMgYSBkaXJlY3QgaW50ZXJuZXQgY29ubmVjdGlvbi4iCisgICAgICAgIGluZm8gPSBIb2JJbmZvQnV0dG9uKCI8c3BhbiB3ZWlnaHQ9XCJib2xkXCI+U2V0IHRoZSBwcm94aWVzIHVzZWQgd2hlbiBmZXRjaGluZyBzb3VyY2UgY29kZTwvc3Bhbj4iICsgIioiICsgdG9vbHRpcCwgc2VsZikKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgaGJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoaW5mbywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KGhib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBwcm94eV90ZXN0X2ZvY3VzID0gW10KKyAgICAgICAgc2VsZi5kaXJlY3RfY2hlY2tib3ggPSBndGsuUmFkaW9CdXR0b24oTm9uZSwgIkRpcmVjdCBuZXR3b3JrIGNvbm5lY3Rpb24iKQorICAgICAgICBwcm94eV90ZXN0X2ZvY3VzLmFwcGVuZChzZWxmLmRpcmVjdF9jaGVja2JveCkKKyAgICAgICAgc2VsZi5kaXJlY3RfY2hlY2tib3guc2V0X3Rvb2x0aXBfdGV4dCgiQ2hlY2sgdGhpcyBib3ggdG8gdXNlIGEgZGlyZWN0IGludGVybmV0IGNvbm5lY3Rpb24gd2l0aCBubyBwcm94eSIpCisgICAgICAgIHNlbGYuZGlyZWN0X2NoZWNrYm94LnNldF9hY3RpdmUobm90IHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc2VsZi5kaXJlY3RfY2hlY2tib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLnByb3h5X2NoZWNrYm94ID0gZ3RrLlJhZGlvQnV0dG9uKHNlbGYuZGlyZWN0X2NoZWNrYm94LCAiTWFudWFsIHByb3h5IGNvbmZpZ3VyYXRpb24iKQorICAgICAgICBwcm94eV90ZXN0X2ZvY3VzLmFwcGVuZChzZWxmLnByb3h5X2NoZWNrYm94KQorICAgICAgICBzZWxmLnByb3h5X2NoZWNrYm94LnNldF90b29sdGlwX3RleHQoIkNoZWNrIHRoaXMgYm94IHRvIG1hbnVhbGx5IHNldCB1cCBhIHNwZWNpZmljIHByb3h5IikKKyAgICAgICAgc2VsZi5wcm94eV9jaGVja2JveC5zZXRfYWN0aXZlKHNlbGYuY29uZmlndXJhdGlvbi5lbmFibGVfcHJveHkpCisgICAgICAgIHN1Yl92Ym94LnBhY2tfc3RhcnQoc2VsZi5wcm94eV9jaGVja2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYuc2FtZV9jaGVja2JveCA9IGd0ay5DaGVja0J1dHRvbigiVXNlIHRoZSBIVFRQIHByb3h5IGZvciBhbGwgcHJvdG9jb2xzIikKKyAgICAgICAgcHJveHlfdGVzdF9mb2N1cy5hcHBlbmQoc2VsZi5zYW1lX2NoZWNrYm94KQorICAgICAgICBzZWxmLnNhbWVfY2hlY2tib3guc2V0X3Rvb2x0aXBfdGV4dCgiQ2hlY2sgdGhpcyBib3ggdG8gdXNlIHRoZSBIVFRQIHByb3h5IGZvciBhbGwgZml2ZSBwcm94aWVzIikKKyAgICAgICAgc2VsZi5zYW1lX2NoZWNrYm94LnNldF9hY3RpdmUoc2VsZi5jb25maWd1cmF0aW9uLnNhbWVfcHJveHkpCisgICAgICAgIGhib3ggPSBndGsuSEJveChGYWxzZSwgMTIpCisgICAgICAgIGhib3gucGFja19zdGFydChzZWxmLnNhbWVfY2hlY2tib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSwgcGFkZGluZz0yNCkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChoYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5wcm94eV90YWJsZSA9IGd0ay5UYWJsZSg2LCA1LCBGYWxzZSkKKyAgICAgICAgc2VsZi5odHRwX3Byb3h5LCBzZWxmLmh0dHBfcHJveHlfcG9ydCwgc2VsZi5odHRwX3Byb3h5X2RldGFpbHMgPSBzZWxmLmdlbl9wcm94eV9lbnRyeV93aWRnZXQoCisgICAgICAgICAgICAiaHR0cCIsIHNlbGYsIFRydWUsIDApCisgICAgICAgIHByb3h5X3Rlc3RfZm9jdXMgKz1bc2VsZi5odHRwX3Byb3h5LCBzZWxmLmh0dHBfcHJveHlfcG9ydF0KKyAgICAgICAgc2VsZi5odHRwX3Byb3h5LmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLmh0dHBfcHJveHlfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5odHRwX3Byb3h5X3BvcnQuY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYuaHR0cF9wcm94eV9jaGFuZ2VkKQorCisgICAgICAgIHNlbGYuaHR0cHNfcHJveHksIHNlbGYuaHR0cHNfcHJveHlfcG9ydCwgc2VsZi5odHRwc19wcm94eV9kZXRhaWxzID0gc2VsZi5nZW5fcHJveHlfZW50cnlfd2lkZ2V0KAorICAgICAgICAgICAgImh0dHBzIiwgc2VsZiwgVHJ1ZSwgMSkKKyAgICAgICAgcHJveHlfdGVzdF9mb2N1cyArPSBbc2VsZi5odHRwc19wcm94eSwgc2VsZi5odHRwc19wcm94eV9wb3J0XQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfYWRkcmVzc2VzLmFwcGVuZChzZWxmLmh0dHBzX3Byb3h5KQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfcG9ydHMuYXBwZW5kKHNlbGYuaHR0cHNfcHJveHlfcG9ydCkKKworICAgICAgICBzZWxmLmZ0cF9wcm94eSwgc2VsZi5mdHBfcHJveHlfcG9ydCwgc2VsZi5mdHBfcHJveHlfZGV0YWlscyA9IHNlbGYuZ2VuX3Byb3h5X2VudHJ5X3dpZGdldCgKKyAgICAgICAgICAgICJmdHAiLCBzZWxmLCBUcnVlLCAyKQorICAgICAgICBwcm94eV90ZXN0X2ZvY3VzICs9IFtzZWxmLmZ0cF9wcm94eSwgc2VsZi5mdHBfcHJveHlfcG9ydF0KKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5X2FkZHJlc3Nlcy5hcHBlbmQoc2VsZi5mdHBfcHJveHkpCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9wb3J0cy5hcHBlbmQoc2VsZi5mdHBfcHJveHlfcG9ydCkKKworICAgICAgICBzZWxmLnNvY2tzX3Byb3h5LCBzZWxmLnNvY2tzX3Byb3h5X3BvcnQsIHNlbGYuc29ja3NfcHJveHlfZGV0YWlscyA9IHNlbGYuZ2VuX3Byb3h5X2VudHJ5X3dpZGdldCgKKyAgICAgICAgICAgICJzb2NrcyIsIHNlbGYsIFRydWUsIDMpCisgICAgICAgIHByb3h5X3Rlc3RfZm9jdXMgKz0gW3NlbGYuc29ja3NfcHJveHksIHNlbGYuc29ja3NfcHJveHlfcG9ydF0KKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5X2FkZHJlc3Nlcy5hcHBlbmQoc2VsZi5zb2Nrc19wcm94eSkKKyAgICAgICAgc2VsZi5zYW1lX3Byb3h5X3BvcnRzLmFwcGVuZChzZWxmLnNvY2tzX3Byb3h5X3BvcnQpCisKKyAgICAgICAgc2VsZi5jdnNfcHJveHksIHNlbGYuY3ZzX3Byb3h5X3BvcnQsIHNlbGYuY3ZzX3Byb3h5X2RldGFpbHMgPSBzZWxmLmdlbl9wcm94eV9lbnRyeV93aWRnZXQoCisgICAgICAgICAgICAiY3ZzIiwgc2VsZiwgVHJ1ZSwgNCkKKyAgICAgICAgcHJveHlfdGVzdF9mb2N1cyArPSBbc2VsZi5jdnNfcHJveHksIHNlbGYuY3ZzX3Byb3h5X3BvcnRdCisgICAgICAgIHNlbGYuc2FtZV9wcm94eV9hZGRyZXNzZXMuYXBwZW5kKHNlbGYuY3ZzX3Byb3h5KQorICAgICAgICBzZWxmLnNhbWVfcHJveHlfcG9ydHMuYXBwZW5kKHNlbGYuY3ZzX3Byb3h5X3BvcnQpCisgICAgICAgIHNlbGYuYWxsX3Byb3h5X3BvcnRzID0gc2VsZi5zYW1lX3Byb3h5X3BvcnRzICsgW3NlbGYuaHR0cF9wcm94eV9wb3J0XQorICAgICAgICBzZWxmLmFsbF9wcm94eV9hZGRyZXNzZXMgPSBzZWxmLnNhbWVfcHJveHlfYWRkcmVzc2VzICsgW3NlbGYuaHR0cF9wcm94eV0KKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChzZWxmLnByb3h5X3RhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYucHJveHlfdGFibGUuc2hvd19hbGwoKQorCisgICAgICAgICMgQ3JlYXRlIHRoZSBncmFwaGljYWwgZWxlbWVudHMgZm9yIHRoZSBuZXR3b3JrIHRlc3QgZmVhdHVyZSwgYnV0IGRvbid0IGRpc3BsYXkgdGhlbSB5ZXQKKyAgICAgICAgc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJUZXN0IG5ldHdvcmsgY29uZmlndXJhdGlvbiIpCisgICAgICAgIHNlbGYudGVzdF9uZXR3b3JrX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uX2NiKQorICAgICAgICBzZWxmLnRlc3RfcHJveHlfcHJvZ3Jlc3MgPSBIb2JQcm9ncmVzc0JhcigpCisgICAgICAgIHNlbGYuZHVtbXlfcHJvZ3Jlc3MgPSBIb2JQcm9ncmVzc0JhcigpCisgICAgICAgIHNlbGYucmV0ZXN0X25ldHdvcmtfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJSZXRlc3QiKQorICAgICAgICBzZWxmLnJldGVzdF9uZXR3b3JrX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi50ZXN0X25ldHdvcmtfYnV0dG9uX2NiKQorICAgICAgICBzZWxmLnRlc3RfZ3VpX2VsZW1lbnRzID0gW3NlbGYudGVzdF9uZXR3b3JrX2J1dHRvbiwgc2VsZi50ZXN0X3Byb3h5X3Byb2dyZXNzLCBzZWxmLmR1bW15X3Byb2dyZXNzLCBzZWxmLnJldGVzdF9uZXR3b3JrX2J1dHRvbl0KKyAgICAgICAgIyBJbml0aWFsaXplIHRoZSBuZXR3b3JrIHRlc3RlcgorICAgICAgICBzZWxmLnRlc3RfcHJveHlfc3RhdGUgPSBzZWxmLlRFU1RfTkVUV09SS19OT05FCisgICAgICAgIHNlbGYuc2V0X3Rlc3RfcHJveHlfc3RhdGUoc2VsZi5URVNUX05FVFdPUktfSU5JVElBTCkKKyAgICAgICAgc2VsZi5wcm94eV90ZXN0X3Bhc3NlZF9pZCA9IHNlbGYuaGFuZGxlci5jb25uZWN0KCJuZXR3b3JrLXBhc3NlZCIsIGxhbWJkYSBoOnNlbGYudGVzdF9wcm94eV9lbmRlZChUcnVlKSkKKyAgICAgICAgc2VsZi5wcm94eV90ZXN0X2ZhaWxlZF9pZCA9IHNlbGYuaGFuZGxlci5jb25uZWN0KCJuZXR3b3JrLWZhaWxlZCIsIGxhbWJkYSBoOnNlbGYudGVzdF9wcm94eV9lbmRlZChGYWxzZSkpCisgICAgICAgIFt3LmNvbm5lY3QoImZvY3VzLWluLWV2ZW50Iiwgc2VsZi50ZXN0X3Byb3h5X2ZvY3VzX2V2ZW50KSBmb3IgdyBpbiBwcm94eV90ZXN0X2ZvY3VzXQorICAgICAgICBbdy5jb25uZWN0KCJmb2N1cy1vdXQtZXZlbnQiLCBzZWxmLnByb3h5X2FkZHJlc3NfZm9jdXNfb3V0X2V2ZW50KSBmb3IgdyBpbiBzZWxmLmFsbF9wcm94eV9hZGRyZXNzZXNdCisKKyAgICAgICAgc2VsZi5kaXJlY3RfY2hlY2tib3guY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYucHJveHlfY2hlY2tib3hfdG9nZ2xlZF9jYikKKyAgICAgICAgc2VsZi5wcm94eV9jaGVja2JveC5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi5wcm94eV9jaGVja2JveF90b2dnbGVkX2NiKQorICAgICAgICBzZWxmLnNhbWVfY2hlY2tib3guY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYuc2FtZV9jaGVja2JveF90b2dnbGVkX2NiKQorCisgICAgICAgIHNlbGYucmVmcmVzaF9wcm94eV9jb21wb25lbnRzKCkKKyAgICAgICAgcmV0dXJuIGFkdmFuY2VkX3Zib3gKKworICAgIGRlZiBzd2l0Y2hfdG9fcGFnZShzZWxmLCBwYWdlX2lkKToKKyAgICAgICAgc2VsZi5uYi5zZXRfY3VycmVudF9wYWdlKHBhZ2VfaWQpCisKKyAgICBkZWYgZGV0YWlsc19jYihzZWxmLCBidXR0b24sIHBhcmVudCwgcHJvdG9jb2wpOgorICAgICAgICBzZWxmLnNhdmVfcHJveHlfZGF0YSgpCisgICAgICAgIGRpYWxvZyA9IFByb3h5RGV0YWlsc0RpYWxvZyh0aXRsZSA9IHByb3RvY29sLnVwcGVyKCkgKyAiIFByb3h5IERldGFpbHMiLAorICAgICAgICAgICAgdXNlciA9IHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzW3Byb3RvY29sXVsxXSwKKyAgICAgICAgICAgIHBhc3N3ZCA9IHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzW3Byb3RvY29sXVsyXSwKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudCwKKyAgICAgICAgICAgIGZsYWdzID0gZ3RrLkRJQUxPR19NT0RBTAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICB8IGd0ay5ESUFMT0dfTk9fU0VQQVJBVE9SKQorICAgICAgICBkaWFsb2cuYWRkX2J1dHRvbihndGsuU1RPQ0tfQ0xPU0UsIGd0ay5SRVNQT05TRV9PSykKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX09LOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLnByb3hpZXNbcHJvdG9jb2xdWzFdID0gZGlhbG9nLnVzZXIKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5wcm94aWVzW3Byb3RvY29sXVsyXSA9IGRpYWxvZy5wYXNzd2QKKyAgICAgICAgICAgIHNlbGYucmVmcmVzaF9wcm94eV9jb21wb25lbnRzKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKSAgICAKKworICAgIGRlZiByb290ZnNfY29tYm9fY2hhbmdlZF9jYihzZWxmLCByb290ZnNfY29tYm8sIGFsbF9wYWNrYWdlX2Zvcm1hdCwgY2hlY2tfaGJveCk6CisgICAgICAgIGNvbWJvX2l0ZW0gPSBzZWxmLnJvb3Rmc19jb21iby5nZXRfYWN0aXZlX3RleHQoKQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hlY2tfaGJveC5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIGd0ay5DaGVja0J1dHRvbik6CisgICAgICAgICAgICAgICAgY2hlY2tfaGJveC5yZW1vdmUoY2hpbGQpCisgICAgICAgIGZvciBmb3JtYXQgaW4gYWxsX3BhY2thZ2VfZm9ybWF0OgorICAgICAgICAgICAgaWYgZm9ybWF0ICE9IGNvbWJvX2l0ZW06CisgICAgICAgICAgICAgICAgY2hlY2tfYnV0dG9uID0gZ3RrLkNoZWNrQnV0dG9uKGZvcm1hdCkKKyAgICAgICAgICAgICAgICBjaGVja19oYm94LnBhY2tfc3RhcnQoY2hlY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGNoZWNrX2hib3guc2hvd19hbGwoKQorCisgICAgZGVmIGdlbl9wa2dmbXRfd2lkZ2V0KHNlbGYsIGN1cnJfcGFja2FnZV9mb3JtYXQsIGFsbF9wYWNrYWdlX2Zvcm1hdCwgdG9vbHRpcF9jb21ibz0iIiwgdG9vbHRpcF9leHRyYT0iIik6CisgICAgICAgIHBrZ2ZtdF9oYm94ID0gZ3RrLkhCb3goRmFsc2UsIDI0KQorCisgICAgICAgIHJvb3Rmc192Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIHBrZ2ZtdF9oYm94LnBhY2tfc3RhcnQocm9vdGZzX3Zib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBsYWJlbCA9IHNlbGYuZ2VuX2xhYmVsX3dpZGdldCgiUm9vdCBmaWxlIHN5c3RlbSBwYWNrYWdlIGZvcm1hdCIpCisgICAgICAgIHJvb3Rmc192Ym94LnBhY2tfc3RhcnQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByb290ZnNfZm9ybWF0ID0gIiIKKyAgICAgICAgaWYgY3Vycl9wYWNrYWdlX2Zvcm1hdDoKKyAgICAgICAgICAgIHJvb3Rmc19mb3JtYXQgPSBjdXJyX3BhY2thZ2VfZm9ybWF0LnNwbGl0KClbMF0KKworICAgICAgICByb290ZnNfZm9ybWF0X3dpZGdldCwgcm9vdGZzX2NvbWJvID0gc2VsZi5nZW5fY29tYm9fd2lkZ2V0KHJvb3Rmc19mb3JtYXQsIGFsbF9wYWNrYWdlX2Zvcm1hdCwgdG9vbHRpcF9jb21ibykKKyAgICAgICAgcm9vdGZzX3Zib3gucGFja19zdGFydChyb290ZnNfZm9ybWF0X3dpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIGV4dHJhX3Zib3ggPSBndGsuVkJveChGYWxzZSwgNikKKyAgICAgICAgcGtnZm10X2hib3gucGFja19zdGFydChleHRyYV92Ym94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIkFkZGl0aW9uYWwgcGFja2FnZSBmb3JtYXRzIikKKyAgICAgICAgZXh0cmFfdmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgY2hlY2tfaGJveCA9IGd0ay5IQm94KEZhbHNlLCAxMikKKyAgICAgICAgZXh0cmFfdmJveC5wYWNrX3N0YXJ0KGNoZWNrX2hib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgZm9yIGZvcm1hdCBpbiBhbGxfcGFja2FnZV9mb3JtYXQ6CisgICAgICAgICAgICBpZiBmb3JtYXQgIT0gcm9vdGZzX2Zvcm1hdDoKKyAgICAgICAgICAgICAgICBjaGVja19idXR0b24gPSBndGsuQ2hlY2tCdXR0b24oZm9ybWF0KQorICAgICAgICAgICAgICAgIGlzX2FjdGl2ZSA9IChmb3JtYXQgaW4gY3Vycl9wYWNrYWdlX2Zvcm1hdC5zcGxpdCgpKQorICAgICAgICAgICAgICAgIGNoZWNrX2J1dHRvbi5zZXRfYWN0aXZlKGlzX2FjdGl2ZSkKKyAgICAgICAgICAgICAgICBjaGVja19oYm94LnBhY2tfc3RhcnQoY2hlY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgaW5mbyA9IEhvYkluZm9CdXR0b24odG9vbHRpcF9leHRyYSwgc2VsZikKKyAgICAgICAgY2hlY2tfaGJveC5wYWNrX2VuZChpbmZvLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgcm9vdGZzX2NvbWJvLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLnJvb3Rmc19jb21ib19jaGFuZ2VkX2NiLCBhbGxfcGFja2FnZV9mb3JtYXQsIGNoZWNrX2hib3gpCisKKyAgICAgICAgcGtnZm10X2hib3guc2hvd19hbGwoKQorCisgICAgICAgIHJldHVybiBwa2dmbXRfaGJveCwgcm9vdGZzX2NvbWJvLCBjaGVja19oYm94CisKKyAgICBkZWYgZWRpdGFibGVfc2V0dGluZ3NfY2VsbF9lZGl0ZWQoc2VsZiwgY2VsbCwgcGF0aF9zdHJpbmcsIG5ld190ZXh0LCBtb2RlbCk6CisgICAgICAgIGl0ID0gbW9kZWwuZ2V0X2l0ZXJfZnJvbV9zdHJpbmcocGF0aF9zdHJpbmcpCisgICAgICAgIGNvbHVtbiA9IGNlbGwuZ2V0X2RhdGEoImNvbHVtbiIpCisgICAgICAgIG1vZGVsLnNldChpdCwgY29sdW1uLCBuZXdfdGV4dCkKKworICAgIGRlZiBlZGl0YWJsZV9zZXR0aW5nc19hZGRfaXRlbV9jbGlja2VkKHNlbGYsIGJ1dHRvbiwgbW9kZWwpOgorICAgICAgICBuZXdfaXRlbSA9IFsiIyNLRVkjIyIsICIjI1ZBTFVFIyMiXQorCisgICAgICAgIGl0ZXIgPSBtb2RlbC5hcHBlbmQoKQorICAgICAgICBtb2RlbC5zZXQgKGl0ZXIsCisgICAgICAgICAgICAwLCBuZXdfaXRlbVswXSwKKyAgICAgICAgICAgIDEsIG5ld19pdGVtWzFdLAorICAgICAgICkKKworICAgIGRlZiBlZGl0YWJsZV9zZXR0aW5nc19yZW1vdmVfaXRlbV9jbGlja2VkKHNlbGYsIGJ1dHRvbiwgdHJlZXZpZXcpOgorICAgICAgICBzZWxlY3Rpb24gPSB0cmVldmlldy5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgbW9kZWwsIGl0ZXIgPSBzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKworICAgICAgICBpZiBpdGVyOgorICAgICAgICAgICAgcGF0aCA9IG1vZGVsLmdldF9wYXRoKGl0ZXIpWzBdCisgICAgICAgICAgICBtb2RlbC5yZW1vdmUoaXRlcikKKyAKKyAgICBkZWYgZ2VuX2VkaXRhYmxlX3NldHRpbmdzKHNlbGYsIHNldHRpbmcsIHRvb2x0aXA9IiIpOgorICAgICAgICBzZXR0aW5nX2hib3ggPSBndGsuSEJveChGYWxzZSwgMTIpCisKKyAgICAgICAgdmJveCA9IGd0ay5WQm94KEZhbHNlLCAxMikKKyAgICAgICAgc2V0dGluZ19oYm94LnBhY2tfc3RhcnQodmJveCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBzZXR0aW5nX3N0b3JlID0gZ3RrLkxpc3RTdG9yZShnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfU1RSSU5HKQorICAgICAgICBmb3Iga2V5IGluIHNldHRpbmcua2V5cygpOgorICAgICAgICAgICAgc2V0dGluZ19zdG9yZS5zZXQoc2V0dGluZ19zdG9yZS5hcHBlbmQoKSwgMCwga2V5LCAxLCBzZXR0aW5nW2tleV0pCisKKyAgICAgICAgc2V0dGluZ190cmVlID0gZ3RrLlRyZWVWaWV3KHNldHRpbmdfc3RvcmUpCisgICAgICAgIHNldHRpbmdfdHJlZS5zZXRfaGVhZGVyc192aXNpYmxlKFRydWUpCisgICAgICAgIHNldHRpbmdfdHJlZS5zZXRfc2l6ZV9yZXF1ZXN0KDMwMCwgMTAwKQorCisgICAgICAgIGNvbCA9IGd0ay5UcmVlVmlld0NvbHVtbignS2V5JykKKyAgICAgICAgY29sLnNldF9taW5fd2lkdGgoMTAwKQorICAgICAgICBjb2wuc2V0X21heF93aWR0aCgxNTApCisgICAgICAgIGNvbC5zZXRfcmVzaXphYmxlKFRydWUpCisgICAgICAgIGNvbDEgPSBndGsuVHJlZVZpZXdDb2x1bW4oJ1ZhbHVlJykKKyAgICAgICAgY29sMS5zZXRfbWluX3dpZHRoKDEwMCkKKyAgICAgICAgY29sMS5zZXRfbWF4X3dpZHRoKDE1MCkKKyAgICAgICAgY29sMS5zZXRfcmVzaXphYmxlKFRydWUpCisgICAgICAgIHNldHRpbmdfdHJlZS5hcHBlbmRfY29sdW1uKGNvbCkKKyAgICAgICAgc2V0dGluZ190cmVlLmFwcGVuZF9jb2x1bW4oY29sMSkKKyAgICAgICAgY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ3dpZHRoLWNoYXJzJywgMTApCisgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCdlZGl0YWJsZScsIFRydWUpCisgICAgICAgIGNlbGwuc2V0X2RhdGEoImNvbHVtbiIsIDApCisgICAgICAgIGNlbGwuY29ubmVjdCgiZWRpdGVkIiwgc2VsZi5lZGl0YWJsZV9zZXR0aW5nc19jZWxsX2VkaXRlZCwgc2V0dGluZ19zdG9yZSkKKyAgICAgICAgY2VsbDEgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisgICAgICAgIGNlbGwxLnNldF9wcm9wZXJ0eSgnd2lkdGgtY2hhcnMnLCAxMCkKKyAgICAgICAgY2VsbDEuc2V0X3Byb3BlcnR5KCdlZGl0YWJsZScsIFRydWUpCisgICAgICAgIGNlbGwxLnNldF9kYXRhKCJjb2x1bW4iLCAxKQorICAgICAgICBjZWxsMS5jb25uZWN0KCJlZGl0ZWQiLCBzZWxmLmVkaXRhYmxlX3NldHRpbmdzX2NlbGxfZWRpdGVkLCBzZXR0aW5nX3N0b3JlKQorICAgICAgICBjb2wucGFja19zdGFydChjZWxsLCBUcnVlKQorICAgICAgICBjb2wxLnBhY2tfZW5kKGNlbGwxLCBUcnVlKQorICAgICAgICBjb2wuc2V0X2F0dHJpYnV0ZXMoY2VsbCwgdGV4dD0wKQorICAgICAgICBjb2wxLnNldF9hdHRyaWJ1dGVzKGNlbGwxLCB0ZXh0PTEpCisKKyAgICAgICAgc2Nyb2xsID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgc2Nyb2xsLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICBzY3JvbGwuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNjcm9sbC5hZGQoc2V0dGluZ190cmVlKQorICAgICAgICB2Ym94LnBhY2tfc3RhcnQoc2Nyb2xsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgICMgc29tZSBidXR0b25zCisgICAgICAgIGhib3ggPSBndGsuSEJveChUcnVlLCA2KQorICAgICAgICB2Ym94LnBhY2tfc3RhcnQoaGJveCwgRmFsc2UsIEZhbHNlKQorCisgICAgICAgIGJ1dHRvbiA9IGd0ay5CdXR0b24oc3RvY2s9Z3RrLlNUT0NLX0FERCkKKyAgICAgICAgYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmVkaXRhYmxlX3NldHRpbmdzX2FkZF9pdGVtX2NsaWNrZWQsIHNldHRpbmdfc3RvcmUpCisgICAgICAgIGhib3gucGFja19zdGFydChidXR0b24pCisKKyAgICAgICAgYnV0dG9uID0gZ3RrLkJ1dHRvbihzdG9jaz1ndGsuU1RPQ0tfUkVNT1ZFKQorICAgICAgICBidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZWRpdGFibGVfc2V0dGluZ3NfcmVtb3ZlX2l0ZW1fY2xpY2tlZCwgc2V0dGluZ190cmVlKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQoYnV0dG9uKQorCisgICAgICAgIGluZm8gPSBIb2JJbmZvQnV0dG9uKHRvb2x0aXAsIHNlbGYpCisgICAgICAgIHNldHRpbmdfaGJveC5wYWNrX3N0YXJ0KGluZm8sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICByZXR1cm4gc2V0dGluZ19oYm94LCBzZXR0aW5nX3N0b3JlCisKKyAgICBkZWYgY3JlYXRlX290aGVyc19wYWdlKHNlbGYpOgorICAgICAgICBhZHZhbmNlZF92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3guc2V0X2JvcmRlcl93aWR0aCg2KQorCisgICAgICAgIHN1Yl92Ym94ID0gZ3RrLlZCb3goRmFsc2UsIDYpCisgICAgICAgIGFkdmFuY2VkX3Zib3gucGFja19zdGFydChzdWJfdmJveCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgbGFiZWwgPSBzZWxmLmdlbl9sYWJlbF93aWRnZXQoIjxzcGFuIHdlaWdodD1cImJvbGRcIj5BZGQgeW91ciBvd24gdmFyaWFibGVzOjwvc3Bhbj4iKQorICAgICAgICB0b29sdGlwID0gIlRoZXNlIGFyZSBrZXkvdmFsdWUgcGFpcnMgZm9yIHlvdXIgZXh0cmEgc2V0dGluZ3MuIENsaWNrIFwnQWRkXCcgYW5kIHRoZW4gZGlyZWN0bHkgZWRpdCB0aGUga2V5IGFuZCB0aGUgdmFsdWUiCisgICAgICAgIHNldHRpbmdfd2lkZ2V0LCBzZWxmLnNldHRpbmdfc3RvcmUgPSBzZWxmLmdlbl9lZGl0YWJsZV9zZXR0aW5ncyhzZWxmLmNvbmZpZ3VyYXRpb24uZXh0cmFfc2V0dGluZywiPGI+QWRkIHlvdXIgb3duIHZhcmlhYmxlczwvYj4iICsgIioiICsgdG9vbHRpcCkKKyAgICAgICAgc3ViX3Zib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzdWJfdmJveC5wYWNrX3N0YXJ0KHNldHRpbmdfd2lkZ2V0LCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHJldHVybiBhZHZhbmNlZF92Ym94CisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5uYiA9IGd0ay5Ob3RlYm9vaygpCisgICAgICAgIHNlbGYubmIuc2V0X3Nob3dfdGFicyhUcnVlKSAgICAgICAgCisgICAgICAgIHNlbGYubmIuYXBwZW5kX3BhZ2Uoc2VsZi5jcmVhdGVfYnVpbGRfZW52aXJvbm1lbnRfcGFnZSgpLCBndGsuTGFiZWwoIkJ1aWxkIGVudmlyb25tZW50IikpCisgICAgICAgIHNlbGYubmIuYXBwZW5kX3BhZ2Uoc2VsZi5jcmVhdGVfc2hhcmVkX3N0YXRlX3BhZ2UoKSwgZ3RrLkxhYmVsKCJTaGFyZWQgc3RhdGUiKSkKKyAgICAgICAgc2VsZi5uYi5hcHBlbmRfcGFnZShzZWxmLmNyZWF0ZV9uZXR3b3JrX3BhZ2UoKSwgZ3RrLkxhYmVsKCJOZXR3b3JrIikpICAgICAgICAKKyAgICAgICAgc2VsZi5uYi5hcHBlbmRfcGFnZShzZWxmLmNyZWF0ZV9vdGhlcnNfcGFnZSgpLCBndGsuTGFiZWwoIk90aGVycyIpKQorICAgICAgICBzZWxmLm5iLnNldF9jdXJyZW50X3BhZ2UoMCkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQoc2VsZi5uYiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfZW5kKGd0ay5IU2VwYXJhdG9yKCksIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgc2VsZi5oYW5kbGVyLmRpc2Nvbm5lY3Qoc2VsZi5wcm94eV90ZXN0X3Bhc3NlZF9pZCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLmRpc2Nvbm5lY3Qoc2VsZi5wcm94eV90ZXN0X2ZhaWxlZF9pZCkKKyAgICAgICAgc3VwZXIoU2ltcGxlU2V0dGluZ3NEaWFsb2csIHNlbGYpLmRlc3Ryb3koKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmNvbG9yLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmNvbG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTY1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9iY29sb3IucHkKQEAgLTAsMCArMSwzOCBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2NsYXNzIEhvYkNvbG9yczoKKyAgICBXSElURSAgICAgICAgPSAiI2ZmZmZmZiIKKyAgICBQQUxFX0dSRUVOICAgPSAiI2FhZmZhYSIKKyAgICBPUkFOR0UgICAgICAgPSAiI2ViOGU2OCIKKyAgICBQQUxFX1JFRCAgICAgPSAiI2ZmYWFhYSIKKyAgICBHUkFZICAgICAgICAgPSAiI2FhYWFhYSIKKyAgICBMSUdIVF9HUkFZICAgPSAiI2RkZGRkZCIKKyAgICBTTElHSFRfREFSSyAgPSAiIzVmNWY1ZiIKKyAgICBEQVJLICAgICAgICAgPSAiIzNjM2IzNyIKKyAgICBCTEFDSyAgICAgICAgPSAiIzAwMDAwMCIKKyAgICBQQUxFX0JMVUUgICAgPSAiIzUzYjhmZiIKKyAgICBERUVQX1JFRCAgICAgPSAiI2FhM2UzZSIKKyAgICBLSEFLSSAgICAgICAgPSAiI2ZmZjY4ZiIKKworICAgIE9LID0gV0hJVEUKKyAgICBSVU5OSU5HID0gUEFMRV9HUkVFTgorICAgIFdBUk5JTkcgPSBPUkFOR0UKKyAgICBFUlJPUiA9IFBBTEVfUkVECmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9iZXZlbnRoYW5kbGVyLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmV2ZW50aGFuZGxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzFmYjMzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmV2ZW50aGFuZGxlci5weQpAQCAtMCwwICsxLDY0NSBAQAorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBKb3NodWEgTG9jayA8am9zaEBsaW51eC5pbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBhc3QKK2Zyb20gYmIudWkuY3J1bWJzLnJ1bm5pbmdidWlsZCBpbXBvcnQgUnVubmluZ0J1aWxkCisKK2NsYXNzIEhvYkhhbmRsZXIoZ29iamVjdC5HT2JqZWN0KToKKworICAgICIiIgorICAgIFRoaXMgb2JqZWN0IGRvZXMgQml0QmFrZSBldmVudCBoYW5kbGluZyBmb3IgdGhlIGhvYiBndWkuCisgICAgIiIiCisgICAgX19nc2lnbmFsc19fID0geworICAgICAgICAgInBhY2thZ2UtZm9ybWF0cy11cGRhdGVkIiA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICJjb25maWctdXBkYXRlZCIgICAgICAgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgICAgICAiY29tbWFuZC1zdWNjZWVkZWQiICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX0lOVCwpKSwKKyAgICAgICAgICJjb21tYW5kLWZhaWxlZCIgICAgICAgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfU1RSSU5HLCkpLAorICAgICAgICAgInBhcnNpbmctd2FybmluZyIgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9TVFJJTkcsKSksCisgICAgICAgICAic2FuaXR5LWZhaWxlZCIgICAgICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1NUUklORywgZ29iamVjdC5UWVBFX0lOVCkpLAorICAgICAgICAgImdlbmVyYXRpbmctZGF0YSIgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgImRhdGEtZ2VuZXJhdGVkIiAgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgInBhcnNpbmctc3RhcnRlZCIgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICJwYXJzaW5nIiAgICAgICAgICAgICAgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgICAgICAicGFyc2luZy1jb21wbGV0ZWQiICAgICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgInJlY2lwZS1wb3B1bGF0ZWQiICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgInBhY2thZ2UtcG9wdWxhdGVkIiAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgIm5ldHdvcmstcGFzc2VkIiAgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgIm5ldHdvcmstZmFpbGVkIiAgICAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgIH0KKworICAgIChHRU5FUkFURV9DT05GSUdVUkFUSU9OLCBHRU5FUkFURV9SRUNJUEVTLCBHRU5FUkFURV9QQUNLQUdFUywgR0VORVJBVEVfSU1BR0UsIFBPUFVMQVRFX1BBQ0tBR0VJTkZPLCBTQU5JVFlfQ0hFQ0ssIE5FVFdPUktfVEVTVCkgPSByYW5nZSg3KQorICAgIChTVUJfUEFUSF9MQVlFUlMsIFNVQl9GSUxFU19ESVNUUk8sIFNVQl9GSUxFU19NQUNILCBTVUJfRklMRVNfU0RLTUFDSCwgU1VCX01BVENIX0NMQVNTLCBTVUJfUEFSU0VfQ09ORklHLCBTVUJfU0FOSVRZX0NIRUNLLAorICAgICBTVUJfR05FUkFURV9UR1RTLCBTVUJfR0VORVJBVEVfUEtHSU5GTywgU1VCX0JVSUxEX1JFQ0lQRVMsIFNVQl9CVUlMRF9JTUFHRSwgU1VCX05FVFdPUktfVEVTVCkgPSByYW5nZSgxMikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIHJlY2lwZV9tb2RlbCwgcGFja2FnZV9tb2RlbCk6CisgICAgICAgIHN1cGVyKEhvYkhhbmRsZXIsIHNlbGYpLl9faW5pdF9fKCkKKworICAgICAgICBzZWxmLmJ1aWxkID0gUnVubmluZ0J1aWxkKHNlcXVlbnRpYWw9VHJ1ZSkKKworICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbCA9IHJlY2lwZV9tb2RlbAorICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwgPSBwYWNrYWdlX21vZGVsCisKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYyA9IFtdCisgICAgICAgIHNlbGYuZ2VuZXJhdGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuY3VycmVudF9waGFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYucmVjaXBlX3F1ZXVlID0gW10KKyAgICAgICAgc2VsZi5wYWNrYWdlX3F1ZXVlID0gW10KKworICAgICAgICBzZWxmLnNlcnZlciA9IHNlcnZlcgorICAgICAgICBzZWxmLmVycm9yX21zZyA9ICIiCisgICAgICAgIHNlbGYuaW5pdGNtZCA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJzaW5nID0gRmFsc2UKKworICAgIGRlZiBzZXRfYnVzeShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZ2VuZXJhdGluZzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgiZ2VuZXJhdGluZy1kYXRhIikKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGluZyA9IFRydWUKKworICAgIGRlZiBjbGVhcl9idXN5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmdlbmVyYXRpbmc6CisgICAgICAgICAgICBzZWxmLmVtaXQoImRhdGEtZ2VuZXJhdGVkIikKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGluZyA9IEZhbHNlCisKKyAgICBkZWYgcnVuQ29tbWFuZChzZWxmLCBjb21tYW5kbGluZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCwgZXJyb3IgPSBzZWxmLnNlcnZlci5ydW5Db21tYW5kKGNvbW1hbmRsaW5lKQorICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFcnJvciBydW5uaW5nIGNvbW1hbmQgJyVzJzogJXMiICUgKGNvbW1hbmRsaW5lLCBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMgPSBbXQorICAgICAgICAgICAgc2VsZi5jbGVhcl9idXN5KCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgiY29tbWFuZC1mYWlsZWQiLCAiSG9iIEV4Y2VwdGlvbiAtICVzIiAlIChzdHIoZSkpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBydW5fbmV4dF9jb21tYW5kKHNlbGYsIGluaXRjbWQ9Tm9uZSk6CisgICAgICAgIGlmIGluaXRjbWQgIT0gTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5pdGNtZCA9IGluaXRjbWQKKworICAgICAgICBpZiBzZWxmLmNvbW1hbmRzX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5zZXRfYnVzeSgpCisgICAgICAgICAgICBuZXh0X2NvbW1hbmQgPSBzZWxmLmNvbW1hbmRzX2FzeW5jLnBvcCgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jbGVhcl9idXN5KCkKKyAgICAgICAgICAgIGlmIHNlbGYuaW5pdGNtZCAhPSBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgiY29tbWFuZC1zdWNjZWVkZWQiLCBzZWxmLmluaXRjbWQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfUEFUSF9MQVlFUlM6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJmaW5kQ29uZmlnRmlsZVBhdGgiLCAiYmJsYXllcnMuY29uZiJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9GSUxFU19ESVNUUk86CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJmaW5kQ29uZmlnRmlsZXMiLCAiRElTVFJPIl0pCisgICAgICAgIGVsaWYgbmV4dF9jb21tYW5kID09IHNlbGYuU1VCX0ZJTEVTX01BQ0g6CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJmaW5kQ29uZmlnRmlsZXMiLCAiTUFDSElORSJdKQorICAgICAgICBlbGlmIG5leHRfY29tbWFuZCA9PSBzZWxmLlNVQl9GSUxFU19TREtNQUNIOgorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZmluZENvbmZpZ0ZpbGVzIiwgIk1BQ0hJTkUtU0RLIl0pCisgICAgICAgIGVsaWYgbmV4dF9jb21tYW5kID09IHNlbGYuU1VCX01BVENIX0NMQVNTOgorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZmluZEZpbGVzTWF0Y2hpbmdJbkRpciIsICJyb290ZnNfIiwgImNsYXNzZXMiXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfUEFSU0VfQ09ORklHOgorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsicmVzZXRDb29rZXIiXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfR05FUkFURV9UR1RTOgorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZ2VuZXJhdGVUYXJnZXRzVHJlZSIsICJjbGFzc2VzL2ltYWdlLmJiY2xhc3MiLCBbXV0pCisgICAgICAgIGVsaWYgbmV4dF9jb21tYW5kID09IHNlbGYuU1VCX0dFTkVSQVRFX1BLR0lORk86CisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJ0cmlnZ2VyRXZlbnQiLCAiYmIuZXZlbnQuUmVxdWVzdFBhY2thZ2VJbmZvKCkiXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfU0FOSVRZX0NIRUNLOgorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsidHJpZ2dlckV2ZW50IiwgImJiLmV2ZW50LlNhbml0eUNoZWNrKCkiXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfTkVUV09SS19URVNUOgorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsidHJpZ2dlckV2ZW50IiwgImJiLmV2ZW50Lk5ldHdvcmtUZXN0KCkiXSkKKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfQlVJTERfUkVDSVBFUzoKKyAgICAgICAgICAgIHNlbGYuY2xlYXJfYnVzeSgpCisgICAgICAgICAgICBzZWxmLmJ1aWxkaW5nID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiYnVpbGRUYXJnZXRzIiwgc2VsZi5yZWNpcGVfcXVldWUsIHNlbGYuZGVmYXVsdF90YXNrXSkKKyAgICAgICAgICAgIHNlbGYucmVjaXBlX3F1ZXVlID0gW10KKyAgICAgICAgZWxpZiBuZXh0X2NvbW1hbmQgPT0gc2VsZi5TVUJfQlVJTERfSU1BR0U6CisgICAgICAgICAgICBzZWxmLmNsZWFyX2J1c3koKQorICAgICAgICAgICAgc2VsZi5idWlsZGluZyA9IFRydWUKKyAgICAgICAgICAgIHRhcmdldCA9IHNlbGYuaW1hZ2UKKworICAgICAgICAgICAgaWYgc2VsZi5iYXNlX2ltYWdlOgorICAgICAgICAgICAgICAgICMgUmVxdWVzdCB0aGUgYnVpbGQgb2YgYSBjdXN0b20gaW1hZ2UKKyAgICAgICAgICAgICAgICBzZWxmLmdlbmVyYXRlX2hvYl9iYXNlX2ltYWdlKHRhcmdldCkKKyAgICAgICAgICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiTElOR1VBU19JTlNUQUxMIiwgIiIsICJsb2NhbC5jb25mIikKKyAgICAgICAgICAgICAgICBob2JJbWFnZSA9IHNlbGYucnVuQ29tbWFuZChbIm1hdGNoRmlsZSIsIHRhcmdldCArICIuYmIiXSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmJhc2VfaW1hZ2UgIT0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgICAgICAgICAgYmFzZUltYWdlID0gc2VsZi5ydW5Db21tYW5kKFsibWF0Y2hGaWxlIiwgc2VsZi5iYXNlX2ltYWdlICsgIi5iYiJdKQorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc2VsZi5ydW5Db21tYW5kKFsiZ2VuZXJhdGVOZXdJbWFnZSIsIGhvYkltYWdlLCBiYXNlSW1hZ2UsIHNlbGYucGFja2FnZV9xdWV1ZSwgVHJ1ZSwgIiJdKQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5zZXRfY3VzdG9tX2ltYWdlX3ZlcnNpb24odmVyc2lvbikKKworICAgICAgICAgICAgdGFyZ2V0cyA9IFt0YXJnZXRdCisgICAgICAgICAgICBpZiBzZWxmLnRvb2xjaGFpbl9wYWNrYWdlczoKKyAgICAgICAgICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiVE9PTENIQUlOX1RBUkdFVF9UQVNLIiwgIiAiLmpvaW4oc2VsZi50b29sY2hhaW5fcGFja2FnZXMpLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICAgICAgdGFyZ2V0cy5hcHBlbmQodGFyZ2V0ICsgIjpkb19wb3B1bGF0ZV9zZGsiKQorCisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJidWlsZFRhcmdldHMiLCB0YXJnZXRzLCBzZWxmLmRlZmF1bHRfdGFza10pCisKKyAgICBkZWYgZGlzcGxheV9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5jbGVhcl9idXN5KCkKKyAgICAgICAgc2VsZi5lbWl0KCJjb21tYW5kLWZhaWxlZCIsIHNlbGYuZXJyb3JfbXNnKQorICAgICAgICBzZWxmLmVycm9yX21zZyA9ICIiCisgICAgICAgIGlmIHNlbGYuYnVpbGRpbmc6CisgICAgICAgICAgICBzZWxmLmJ1aWxkaW5nID0gRmFsc2UKKworICAgIGRlZiBoYW5kbGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3QgZXZlbnQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5idWlsZGluZzoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9waGFzZSA9ICJidWlsZGluZyIKKyAgICAgICAgICAgIHNlbGYuYnVpbGQuaGFuZGxlX2V2ZW50KGV2ZW50KQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhY2thZ2VJbmZvKToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5wb3B1bGF0ZShldmVudC5fcGtnaW5mb2xpc3QpCisgICAgICAgICAgICBzZWxmLmVtaXQoInBhY2thZ2UtcG9wdWxhdGVkIikKKyAgICAgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZCgpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5TYW5pdHlDaGVja1Bhc3NlZCk6CisgICAgICAgICAgICByZXBhcnNlID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJfSU5WQUxJRENPTkYiXSkgb3IgTm9uZQorICAgICAgICAgICAgaWYgcmVwYXJzZSBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJCQl9JTlZBTElEQ09ORiIsIEZhbHNlLCAibG9jYWwuY29uZiIpCisgICAgICAgICAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic2V0UHJlUG9zdENvbmZGaWxlcyIsICJjb25mLy5ob2IuY29uZiIsICIiXSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLnByZXBlbmQoc2VsZi5TVUJfUEFSU0VfQ09ORklHKQorICAgICAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKCkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlNhbml0eUNoZWNrRmFpbGVkKToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgic2FuaXR5LWZhaWxlZCIsIGV2ZW50Ll9tc2csIGV2ZW50Ll9uZXR3b3JrX2Vycm9yKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgbG9nZ2luZy5Mb2dSZWNvcmQpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuYnVpbGRpbmc6CisgICAgICAgICAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA+PSBsb2dnaW5nLkVSUk9SOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoKQorICAgICAgICAgICAgICAgICAgICBtc2cgPSBmb3JtYXR0ZXIuZm9ybWF0KGV2ZW50KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yX21zZyArPSBtc2cgKyAnXG4nCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC5sZXZlbG5vID49IGxvZ2dpbmcuV0FSTklORyBhbmQgc2VsZi5wYXJzaW5nID09IFRydWU6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcigpCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGZvcm1hdHRlci5mb3JtYXQoZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIHdhcm5fbXNnID0gbXNnICsgJ1xuJworICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoInBhcnNpbmctd2FybmluZyIsIHdhcm5fbXNnKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuVGFyZ2V0c1RyZWVHZW5lcmF0ZWQpOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3BoYXNlID0gImRhdGEgZ2VuZXJhdGlvbiIKKyAgICAgICAgICAgIGlmIGV2ZW50Ll9tb2RlbDoKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5wb3B1bGF0ZShldmVudC5fbW9kZWwpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJyZWNpcGUtcG9wdWxhdGVkIikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Db25maWdGaWxlc0ZvdW5kKToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9waGFzZSA9ICJjb25maWd1cmF0aW9uIGxvb2t1cCIKKyAgICAgICAgICAgIHZhciA9IGV2ZW50Ll92YXJpYWJsZQorICAgICAgICAgICAgdmFsdWVzID0gZXZlbnQuX3ZhbHVlcworICAgICAgICAgICAgdmFsdWVzLnNvcnQoKQorICAgICAgICAgICAgc2VsZi5lbWl0KCJjb25maWctdXBkYXRlZCIsIHZhciwgdmFsdWVzKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNvbmZpZ0ZpbGVQYXRoRm91bmQpOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3BoYXNlID0gImNvbmZpZ3VyYXRpb24gbG9va3VwIgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkZpbGVzTWF0Y2hpbmdGb3VuZCk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfcGhhc2UgPSAiY29uZmlndXJhdGlvbiBsb29rdXAiCisgICAgICAgICAgICAjIEZJWE1FOiBoYXJkIGNvZGluZywgc2hvdWxkIGF0IGxlYXN0IGJlIGEgdmFyaWFibGUgc2hhcmVkIGJldHdlZW4KKyAgICAgICAgICAgICMgaGVyZSBhbmQgdGhlIGNhbGxlcgorICAgICAgICAgICAgaWYgZXZlbnQuX3BhdHRlcm4gPT0gInJvb3Rmc18iOgorICAgICAgICAgICAgICAgIGZvcm1hdHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBtYXRjaCBpbiBldmVudC5fbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lLCBzZXAsIGNscyA9IG1hdGNoLnJwYXJ0aXRpb24oIi4iKQorICAgICAgICAgICAgICAgICAgICBmcywgc2VwLCBmb3JtYXQgPSBjbGFzc25hbWUucnBhcnRpdGlvbigiXyIpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuYXBwZW5kKGZvcm1hdCkKKyAgICAgICAgICAgICAgICBmb3JtYXRzLnNvcnQoKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgicGFja2FnZS1mb3JtYXRzLXVwZGF0ZWQiLCBmb3JtYXRzKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfcGhhc2UgPSBOb25lCisgICAgICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCk6CisgICAgICAgICAgICBpZiBldmVudC5lcnJvciBub3QgaW4gKCJGb3JjZWQgc2h1dGRvd24iLCAiU3RvcHBlZCBidWlsZCIpOgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfbXNnICs9IGV2ZW50LmVycm9yCisgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jID0gW10KKyAgICAgICAgICAgIHNlbGYuZGlzcGxheV9lcnJvcigpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLmV2ZW50LlBhcnNlU3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCwKKyAgICAgICAgICAgICAgICAgYmIuZXZlbnQuVHJlZURhdGFQcmVwYXJhdGlvblN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICkpOgorICAgICAgICAgICAgbWVzc2FnZSA9IHt9CisgICAgICAgICAgICBtZXNzYWdlWyJldmVudG5hbWUiXSA9IGJiLmV2ZW50LmdldE5hbWUoZXZlbnQpCisgICAgICAgICAgICBtZXNzYWdlWyJjdXJyZW50Il0gPSAwCisgICAgICAgICAgICBtZXNzYWdlWyJ0b3RhbCJdID0gTm9uZQorICAgICAgICAgICAgbWVzc2FnZVsidGl0bGUiXSA9ICJQYXJzaW5nIHJlY2lwZXMiCisgICAgICAgICAgICBzZWxmLmVtaXQoInBhcnNpbmctc3RhcnRlZCIsIG1lc3NhZ2UpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVN0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2luZyA9IFRydWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuUGFyc2VQcm9ncmVzcywKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcywKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uUHJvZ3Jlc3MpKToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSB7fQorICAgICAgICAgICAgbWVzc2FnZVsiZXZlbnRuYW1lIl0gPSBiYi5ldmVudC5nZXROYW1lKGV2ZW50KQorICAgICAgICAgICAgbWVzc2FnZVsiY3VycmVudCJdID0gZXZlbnQuY3VycmVudAorICAgICAgICAgICAgbWVzc2FnZVsidG90YWwiXSA9IGV2ZW50LnRvdGFsCisgICAgICAgICAgICBtZXNzYWdlWyJ0aXRsZSJdID0gIlBhcnNpbmcgcmVjaXBlcyIKKyAgICAgICAgICAgIHNlbGYuZW1pdCgicGFyc2luZyIsIG1lc3NhZ2UpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkLAorICAgICAgICAgICAgICAgIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCwKKyAgICAgICAgICAgICAgICBiYi5ldmVudC5UcmVlRGF0YVByZXBhcmF0aW9uQ29tcGxldGVkKSk6CisgICAgICAgICAgICBtZXNzYWdlID0ge30KKyAgICAgICAgICAgIG1lc3NhZ2VbImV2ZW50bmFtZSJdID0gYmIuZXZlbnQuZ2V0TmFtZShldmVudCkKKyAgICAgICAgICAgIG1lc3NhZ2VbImN1cnJlbnQiXSA9IGV2ZW50LnRvdGFsCisgICAgICAgICAgICBtZXNzYWdlWyJ0b3RhbCJdID0gZXZlbnQudG90YWwKKyAgICAgICAgICAgIG1lc3NhZ2VbInRpdGxlIl0gPSAiUGFyc2luZyByZWNpcGVzIgorICAgICAgICAgICAgc2VsZi5lbWl0KCJwYXJzaW5nLWNvbXBsZXRlZCIsIG1lc3NhZ2UpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZUNvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzaW5nID0gRmFsc2UKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5OZXR3b3JrVGVzdEZhaWxlZCk6CisgICAgICAgICAgICBzZWxmLmVtaXQoIm5ldHdvcmstZmFpbGVkIikKKyAgICAgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZCgpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTmV0d29ya1Rlc3RQYXNzZWQpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJuZXR3b3JrLXBhc3NlZCIpCisgICAgICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoKQorCisgICAgICAgIGlmIHNlbGYuZXJyb3JfbXNnIGFuZCBub3Qgc2VsZi5jb21tYW5kc19hc3luYzoKKyAgICAgICAgICAgIHNlbGYuZGlzcGxheV9lcnJvcigpCisKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgaW5pdF9jb29rZXIoc2VsZik6CisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImNyZWF0ZUNvbmZpZ0ZpbGUiLCAiLmhvYi5jb25mIl0pCisKKyAgICBkZWYgc2V0X2V4dHJhX2luaGVyaXQoc2VsZiwgYmJjbGFzcyk6CisgICAgICAgIHNlbGYuYXBwZW5kX3Zhcl9pbl9maWxlKCJJTkhFUklUIiwgYmJjbGFzcywgIi5ob2IuY29uZiIpCisKKyAgICBkZWYgc2V0X2JibGF5ZXJzKHNlbGYsIGJibGF5ZXJzKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkJCTEFZRVJTIiwgIiAiLmpvaW4oYmJsYXllcnMpLCAiYmJsYXllcnMuY29uZiIpCisKKyAgICBkZWYgc2V0X21hY2hpbmUoc2VsZiwgbWFjaGluZSk6CisgICAgICAgIGlmIG1hY2hpbmU6CisgICAgICAgICAgICBzZWxmLmVhcmx5X2Fzc2lnbl92YXJfaW5fZmlsZSgiTUFDSElORSIsIG1hY2hpbmUsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfc2RrX21hY2hpbmUoc2VsZiwgc2RrX21hY2hpbmUpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiU0RLTUFDSElORSIsIHNka19tYWNoaW5lLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X2ltYWdlX2ZzdHlwZXMoc2VsZiwgaW1hZ2VfZnN0eXBlcyk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJJTUFHRV9GU1RZUEVTIiwgaW1hZ2VfZnN0eXBlcywgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9kaXN0cm8oc2VsZiwgZGlzdHJvKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkRJU1RSTyIsIGRpc3RybywgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9wYWNrYWdlX2Zvcm1hdChzZWxmLCBmb3JtYXQpOgorICAgICAgICBwYWNrYWdlX2NsYXNzZXMgPSAiIgorICAgICAgICBmb3IgcGtnZm10IGluIGZvcm1hdC5zcGxpdCgpOgorICAgICAgICAgICAgcGFja2FnZV9jbGFzc2VzICs9ICgicGFja2FnZV8lcyIgJSBwa2dmbXQgKyAiICIpCisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJQQUNLQUdFX0NMQVNTRVMiLCBwYWNrYWdlX2NsYXNzZXMsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfYmJ0aHJlYWRzKHNlbGYsIHRocmVhZHMpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiQkJfTlVNQkVSX1RIUkVBRFMiLCB0aHJlYWRzLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X3BtYWtlKHNlbGYsIHRocmVhZHMpOgorICAgICAgICBwbWFrZSA9ICItaiAlcyIgJSB0aHJlYWRzCisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJQQVJBTExFTF9NQUtFIiwgcG1ha2UsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfZGxfZGlyKHNlbGYsIGRpcmVjdG9yeSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJETF9ESVIiLCBkaXJlY3RvcnksICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfc3N0YXRlX2RpcihzZWxmLCBkaXJlY3RvcnkpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiU1NUQVRFX0RJUiIsIGRpcmVjdG9yeSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9zc3RhdGVfbWlycm9ycyhzZWxmLCB1cmwpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiU1NUQVRFX01JUlJPUlMiLCB1cmwsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfZXh0cmFfc2l6ZShzZWxmLCBpbWFnZV9leHRyYV9zaXplKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIklNQUdFX1JPT1RGU19FWFRSQV9TUEFDRSIsIHN0cihpbWFnZV9leHRyYV9zaXplKSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9yb290ZnNfc2l6ZShzZWxmLCBpbWFnZV9yb290ZnNfc2l6ZSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJJTUFHRV9ST09URlNfU0laRSIsIHN0cihpbWFnZV9yb290ZnNfc2l6ZSksICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfaW5jb21wYXRpYmxlX2xpY2Vuc2Uoc2VsZiwgaW5jb21wYXRfbGljZW5zZSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJJTkNPTVBBVElCTEVfTElDRU5TRSIsIGluY29tcGF0X2xpY2Vuc2UsICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfZXh0cmFfc2V0dGluZyhzZWxmLCBleHRyYV9zZXR0aW5nKToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkVYVFJBX1NFVFRJTkciLCBleHRyYV9zZXR0aW5nLCAibG9jYWwuY29uZiIpCisKKyAgICBkZWYgc2V0X2V4dHJhX2NvbmZpZyhzZWxmLCBleHRyYV9zZXR0aW5nKToKKyAgICAgICAgb2xkX2V4dHJhX3NldHRpbmcgPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJFWFRSQV9TRVRUSU5HIl0pIG9yIHt9CisgICAgICAgIG9sZF9leHRyYV9zZXR0aW5nID0gc3RyKG9sZF9leHRyYV9zZXR0aW5nKQorCisgICAgICAgIG9sZF9leHRyYV9zZXR0aW5nID0gYXN0LmxpdGVyYWxfZXZhbChvbGRfZXh0cmFfc2V0dGluZykKKyAgICAgICAgaWYgbm90IHR5cGUob2xkX2V4dHJhX3NldHRpbmcpID09IGRpY3Q6CisgICAgICAgICAgICBvbGRfZXh0cmFfc2V0dGluZyA9IHt9CisKKyAgICAgICAgIyBzZXR0aW5ncyBub3QgY2hhbmdlZAorICAgICAgICBpZiBvbGRfZXh0cmFfc2V0dGluZyA9PSBleHRyYV9zZXR0aW5nOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyByZW1vdmUgdGhlIG9sZCBFWFRSQSBTRVRUSU5HIHZhcmlhYmxlCisgICAgICAgIHNlbGYucmVtb3ZlX3Zhcl9mcm9tX2ZpbGUoIkVYVFJBX1NFVFRJTkciKQorCisgICAgICAgICMgcmVtb3ZlIG9sZCBzZXR0aW5ncyBmcm9tIGNvbmYKKyAgICAgICAgZm9yIGtleSBpbiBvbGRfZXh0cmFfc2V0dGluZy5rZXlzKCk6CisgICAgICAgICAgICBpZiBrZXkgbm90IGluIGV4dHJhX3NldHRpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVfdmFyX2Zyb21fZmlsZShrZXkpCisKKyAgICAgICAgIyBhZGQgbmV3IHNldHRpbmdzCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGV4dHJhX3NldHRpbmcuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZShrZXksIHZhbHVlLCAibG9jYWwuY29uZiIpCisKKyAgICAgICAgaWYgZXh0cmFfc2V0dGluZzoKKyAgICAgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJFWFRSQV9TRVRUSU5HIiwgZXh0cmFfc2V0dGluZywgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9odHRwX3Byb3h5KHNlbGYsIGh0dHBfcHJveHkpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiaHR0cF9wcm94eSIsIGh0dHBfcHJveHksICJsb2NhbC5jb25mIikKKworICAgIGRlZiBzZXRfaHR0cHNfcHJveHkoc2VsZiwgaHR0cHNfcHJveHkpOgorICAgICAgICBzZWxmLnNldF92YXJfaW5fZmlsZSgiaHR0cHNfcHJveHkiLCBodHRwc19wcm94eSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9mdHBfcHJveHkoc2VsZiwgZnRwX3Byb3h5KToKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoImZ0cF9wcm94eSIsIGZ0cF9wcm94eSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9zb2Nrc19wcm94eShzZWxmLCBzb2Nrc19wcm94eSk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJhbGxfcHJveHkiLCBzb2Nrc19wcm94eSwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHNldF9jdnNfcHJveHkoc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgIHNlbGYuc2V0X3Zhcl9pbl9maWxlKCJDVlNfUFJPWFlfSE9TVCIsIGhvc3QsICJsb2NhbC5jb25mIikKKyAgICAgICAgc2VsZi5zZXRfdmFyX2luX2ZpbGUoIkNWU19QUk9YWV9QT1JUIiwgcG9ydCwgImxvY2FsLmNvbmYiKQorCisgICAgZGVmIHJlcXVlc3RfcGFja2FnZV9pbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9HRU5FUkFURV9QS0dJTkZPKQorICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoc2VsZi5QT1BVTEFURV9QQUNLQUdFSU5GTykKKworICAgIGRlZiB0cmlnZ2VyX3Nhbml0eV9jaGVjayhzZWxmKToKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfU0FOSVRZX0NIRUNLKQorICAgICAgICBzZWxmLnJ1bl9uZXh0X2NvbW1hbmQoc2VsZi5TQU5JVFlfQ0hFQ0spCisKKyAgICBkZWYgdHJpZ2dlcl9uZXR3b3JrX3Rlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX05FVFdPUktfVEVTVCkKKyAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKHNlbGYuTkVUV09SS19URVNUKQorCisgICAgZGVmIGdlbmVyYXRlX2NvbmZpZ3VyYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInNldFByZVBvc3RDb25mRmlsZXMiLCAiY29uZi8uaG9iLmNvbmYiLCAiIl0pCisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX1BBUlNFX0NPTkZJRykKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfUEFUSF9MQVlFUlMpCisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX0ZJTEVTX0RJU1RSTykKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfRklMRVNfTUFDSCkKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfRklMRVNfU0RLTUFDSCkKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfTUFUQ0hfQ0xBU1MpCisgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZChzZWxmLkdFTkVSQVRFX0NPTkZJR1VSQVRJT04pCisKKyAgICBkZWYgZ2VuZXJhdGVfcmVjaXBlcyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic2V0UHJlUG9zdENvbmZGaWxlcyIsICJjb25mLy5ob2IuY29uZiIsICIiXSkKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfUEFSU0VfQ09ORklHKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2FzeW5jLmFwcGVuZChzZWxmLlNVQl9HTkVSQVRFX1RHVFMpCisgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZChzZWxmLkdFTkVSQVRFX1JFQ0lQRVMpCisKKyAgICBkZWYgZ2VuZXJhdGVfcGFja2FnZXMoc2VsZiwgdGd0cywgZGVmYXVsdF90YXNrPSJidWlsZCIpOgorICAgICAgICB0YXJnZXRzID0gW10KKyAgICAgICAgdGFyZ2V0cy5leHRlbmQodGd0cykKKyAgICAgICAgc2VsZi5yZWNpcGVfcXVldWUgPSB0YXJnZXRzCisgICAgICAgIHNlbGYuZGVmYXVsdF90YXNrID0gZGVmYXVsdF90YXNrCisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInNldFByZVBvc3RDb25mRmlsZXMiLCAiY29uZi8uaG9iLmNvbmYiLCAiIl0pCisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX1BBUlNFX0NPTkZJRykKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfQlVJTERfUkVDSVBFUykKKyAgICAgICAgc2VsZi5ydW5fbmV4dF9jb21tYW5kKHNlbGYuR0VORVJBVEVfUEFDS0FHRVMpCisKKyAgICBkZWYgZ2VuZXJhdGVfaW1hZ2Uoc2VsZiwgaW1hZ2UsIGJhc2VfaW1hZ2UsIGltYWdlX3BhY2thZ2VzPU5vbmUsIHRvb2xjaGFpbl9wYWNrYWdlcz1Ob25lLCBkZWZhdWx0X3Rhc2s9ImJ1aWxkIik6CisgICAgICAgIHNlbGYuaW1hZ2UgPSBpbWFnZQorICAgICAgICBzZWxmLmJhc2VfaW1hZ2UgPSBiYXNlX2ltYWdlCisgICAgICAgIGlmIGltYWdlX3BhY2thZ2VzOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX3F1ZXVlID0gaW1hZ2VfcGFja2FnZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9xdWV1ZSA9IFtdCisgICAgICAgIGlmIHRvb2xjaGFpbl9wYWNrYWdlczoKKyAgICAgICAgICAgIHNlbGYudG9vbGNoYWluX3BhY2thZ2VzID0gdG9vbGNoYWluX3BhY2thZ2VzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRvb2xjaGFpbl9wYWNrYWdlcyA9IFtdCisgICAgICAgIHNlbGYuZGVmYXVsdF90YXNrID0gZGVmYXVsdF90YXNrCisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInNldFByZVBvc3RDb25mRmlsZXMiLCAiY29uZi8uaG9iLmNvbmYiLCAiIl0pCisgICAgICAgIHNlbGYuY29tbWFuZHNfYXN5bmMuYXBwZW5kKHNlbGYuU1VCX1BBUlNFX0NPTkZJRykKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYy5hcHBlbmQoc2VsZi5TVUJfQlVJTERfSU1BR0UpCisgICAgICAgIHNlbGYucnVuX25leHRfY29tbWFuZChzZWxmLkdFTkVSQVRFX0lNQUdFKQorCisgICAgZGVmIGdlbmVyYXRlX25ld19pbWFnZShzZWxmLCBpbWFnZSwgYmFzZV9pbWFnZSwgcGFja2FnZV9xdWV1ZSwgZGVzY3JpcHRpb24pOgorICAgICAgICBpZiBiYXNlX2ltYWdlOgorICAgICAgICAgICAgYmFzZV9pbWFnZSA9IHNlbGYucnVuQ29tbWFuZChbIm1hdGNoRmlsZSIsIHNlbGYuYmFzZV9pbWFnZSArICIuYmIiXSkKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZ2VuZXJhdGVOZXdJbWFnZSIsIGltYWdlLCBiYXNlX2ltYWdlLCBwYWNrYWdlX3F1ZXVlLCBGYWxzZSwgZGVzY3JpcHRpb25dKQorCisgICAgZGVmIGdlbmVyYXRlX2hvYl9iYXNlX2ltYWdlKHNlbGYsIGhvYl9pbWFnZSk6CisgICAgICAgIGltYWdlX2RpciA9IHNlbGYuZ2V0X3RvcGRpcigpICsgIi9yZWNpcGVzL2ltYWdlcy8iCisgICAgICAgIHJlY2lwZV9uYW1lID0gaG9iX2ltYWdlICsgIi5iYiIKKyAgICAgICAgc2VsZi5lbnN1cmVfZGlyKGltYWdlX2RpcikKKyAgICAgICAgc2VsZi5nZW5lcmF0ZV9uZXdfaW1hZ2UoaW1hZ2VfZGlyICsgcmVjaXBlX25hbWUsIE5vbmUsIFtdLCAiIikKKworICAgIGRlZiBlbnN1cmVfZGlyKHNlbGYsIGRpcmVjdG9yeSk6CisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImVuc3VyZURpciIsIGRpcmVjdG9yeV0pCisKKyAgICBkZWYgYnVpbGRfc3VjY2VlZGVkX2FzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkaW5nID0gRmFsc2UKKworICAgIGRlZiBidWlsZF9mYWlsZWRfYXN5bmMoc2VsZik6CisgICAgICAgIHNlbGYuaW5pdGNtZCA9IE5vbmUKKyAgICAgICAgc2VsZi5jb21tYW5kc19hc3luYyA9IFtdCisgICAgICAgIHNlbGYuYnVpbGRpbmcgPSBGYWxzZQorCisgICAgZGVmIGNhbmNlbF9wYXJzZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3duIl0pCisKKyAgICBkZWYgY2FuY2VsX2J1aWxkKHNlbGYsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgaWYgZm9yY2U6CisgICAgICAgICAgICAjIEZvcmNlIHRoZSBjb29rZXIgdG8gc3RvcCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCisgICAgICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2FpdCBmb3IgdGFza3MgdG8gY29tcGxldGUgYmVmb3JlIHNodXR0aW5nIGRvd24sIHRoaXMgaGVscHMKKyAgICAgICAgICAgICMgbGVhdmUgdGhlIHdvcmtkaXIgaW4gYSB1c2FibGUgc3RhdGUKKyAgICAgICAgICAgIHNlbGYucnVuQ29tbWFuZChbInN0YXRlU2h1dGRvd24iXSkKKworICAgIGRlZiByZXNldF9idWlsZChzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZC5yZXNldCgpCisKKyAgICBkZWYgZ2V0X2xvZ2ZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJfQ09OU09MRUxPRyJdKVswXQorCisgICAgZGVmIGdldF90b3BkaXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUT1BESVIiXSkgb3IgIiIKKworICAgIGRlZiBfcmVtb3ZlX3JlZHVuZGFudChzZWxmLCBzdHJpbmcpOgorICAgICAgICByZXQgPSBbXQorICAgICAgICBmb3IgaSBpbiBzdHJpbmcuc3BsaXQoKToKKyAgICAgICAgICAgIGlmIGkgbm90IGluIHJldDoKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGkpCisgICAgICAgIHJldHVybiAiICIuam9pbihyZXQpCisKKyAgICBkZWYgc2V0X3Zhcl9pbl9maWxlKHNlbGYsIHZhciwgdmFsLCBkZWZhdWx0X2ZpbGU9Tm9uZSk6CisgICAgICAgIHNlbGYucnVuQ29tbWFuZChbImVuYWJsZURhdGFUcmFja2luZyJdKQorICAgICAgICBzZWxmLnNlcnZlci5ydW5Db21tYW5kKFsic2V0VmFyRmlsZSIsIHZhciwgdmFsLCBkZWZhdWx0X2ZpbGUsICJzZXQiXSkKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZGlzYWJsZURhdGFUcmFja2luZyJdKQorCisgICAgZGVmIGVhcmx5X2Fzc2lnbl92YXJfaW5fZmlsZShzZWxmLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlPU5vbmUpOgorICAgICAgICBzZWxmLnJ1bkNvbW1hbmQoWyJlbmFibGVEYXRhVHJhY2tpbmciXSkKKyAgICAgICAgc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbInNldFZhckZpbGUiLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlLCAiZWFybHlBc3NpZ24iXSkKKyAgICAgICAgc2VsZi5ydW5Db21tYW5kKFsiZGlzYWJsZURhdGFUcmFja2luZyJdKQorCisgICAgZGVmIHJlbW92ZV92YXJfZnJvbV9maWxlKHNlbGYsIHZhcik6CisgICAgICAgIHNlbGYuc2VydmVyLnJ1bkNvbW1hbmQoWyJyZW1vdmVWYXJGaWxlIiwgdmFyXSkKKworICAgIGRlZiBhcHBlbmRfdmFyX2luX2ZpbGUoc2VsZiwgdmFyLCB2YWwsIGRlZmF1bHRfZmlsZT1Ob25lKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIucnVuQ29tbWFuZChbInNldFZhckZpbGUiLCB2YXIsIHZhbCwgZGVmYXVsdF9maWxlLCAiYXBwZW5kIl0pCisKKyAgICBkZWYgYXBwZW5kX3RvX2JiZmlsZXMoc2VsZiwgdmFsKToKKyAgICAgICAgYmJmaWxlcyA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCRklMRVMiLCAiRmFsc2UiXSkgb3IgIiIKKyAgICAgICAgYmJmaWxlcyA9IGJiZmlsZXMuc3BsaXQoKQorICAgICAgICBpZiB2YWwgbm90IGluIGJiZmlsZXM6CisgICAgICAgICAgICBzZWxmLmFwcGVuZF92YXJfaW5fZmlsZSgiQkJGSUxFUyIsIHZhbCwgImJibGF5ZXJzLmNvbmYiKQorCisgICAgZGVmIGdldF9wYXJhbWV0ZXJzKHNlbGYpOgorICAgICAgICAjIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIGZyb20gYml0YmFrZQorICAgICAgICBwYXJhbXMgPSB7fQorICAgICAgICBwYXJhbXNbImNvcmVfYmFzZSJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQ09SRUJBU0UiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJsYXllciJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJMQVlFUlMiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJsYXllcnNfbm9uX3JlbW92YWJsZSJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJMQVlFUlNfTk9OX1JFTU9WQUJMRSJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImRsZGlyIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJETF9ESVIiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJtYWNoaW5lIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJNQUNISU5FIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1siZGlzdHJvIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJESVNUUk8iXSkgb3IgImRlZmF1bHRzZXR1cCIKKyAgICAgICAgcGFyYW1zWyJwY2xhc3MiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlBBQ0tBR0VfQ0xBU1NFUyJdKSBvciAiIgorICAgICAgICBwYXJhbXNbInNzdGF0ZWRpciJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiU1NUQVRFX0RJUiJdKSBvciAiIgorICAgICAgICBwYXJhbXNbInNzdGF0ZW1pcnJvciJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiU1NUQVRFX01JUlJPUlMiXSkgb3IgIiIKKworICAgICAgICBudW1fdGhyZWFkcyA9IHNlbGYucnVuQ29tbWFuZChbImdldENwdUNvdW50Il0pCisgICAgICAgIGlmIG5vdCBudW1fdGhyZWFkczoKKyAgICAgICAgICAgIG51bV90aHJlYWRzID0gMQorICAgICAgICAgICAgbWF4X3RocmVhZHMgPSA2NTUzNgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG51bV90aHJlYWRzID0gaW50KG51bV90aHJlYWRzKQorICAgICAgICAgICAgICAgIG1heF90aHJlYWRzID0gMTYgKiBudW1fdGhyZWFkcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG51bV90aHJlYWRzID0gMQorICAgICAgICAgICAgICAgIG1heF90aHJlYWRzID0gNjU1MzYKKyAgICAgICAgcGFyYW1zWyJtYXhfdGhyZWFkcyJdID0gbWF4X3RocmVhZHMKKworICAgICAgICBiYnRocmVhZCA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX05VTUJFUl9USFJFQURTIl0pCisgICAgICAgIGlmIG5vdCBiYnRocmVhZDoKKyAgICAgICAgICAgIGJidGhyZWFkID0gbnVtX3RocmVhZHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiYnRocmVhZCA9IGludChiYnRocmVhZCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBiYnRocmVhZCA9IG51bV90aHJlYWRzCisgICAgICAgIHBhcmFtc1siYmJ0aHJlYWQiXSA9IGJidGhyZWFkCisKKyAgICAgICAgcG1ha2UgPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJQQVJBTExFTF9NQUtFIl0pCisgICAgICAgIGlmIG5vdCBwbWFrZToKKyAgICAgICAgICAgIHBtYWtlID0gbnVtX3RocmVhZHMKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBtYWtlLCBpbnQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBtYWtlID0gaW50KHBtYWtlLmxzdHJpcCgiLWogIikpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcG1ha2UgPSBudW1fdGhyZWFkcworICAgICAgICBwYXJhbXNbInBtYWtlIl0gPSAiLWogJXMiICUgcG1ha2UKKworICAgICAgICBwYXJhbXNbImltYWdlX2FkZHIiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkRFUExPWV9ESVJfSU1BR0UiXSkgb3IgIiIKKworICAgICAgICBpbWFnZV9leHRyYV9zaXplID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiSU1BR0VfUk9PVEZTX0VYVFJBX1NQQUNFIl0pCisgICAgICAgIGlmIG5vdCBpbWFnZV9leHRyYV9zaXplOgorICAgICAgICAgICAgaW1hZ2VfZXh0cmFfc2l6ZSA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbWFnZV9leHRyYV9zaXplID0gaW50KGltYWdlX2V4dHJhX3NpemUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaW1hZ2VfZXh0cmFfc2l6ZSA9IDAKKyAgICAgICAgcGFyYW1zWyJpbWFnZV9leHRyYV9zaXplIl0gPSBpbWFnZV9leHRyYV9zaXplCisKKyAgICAgICAgaW1hZ2Vfcm9vdGZzX3NpemUgPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJJTUFHRV9ST09URlNfU0laRSJdKQorICAgICAgICBpZiBub3QgaW1hZ2Vfcm9vdGZzX3NpemU6CisgICAgICAgICAgICBpbWFnZV9yb290ZnNfc2l6ZSA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbWFnZV9yb290ZnNfc2l6ZSA9IGludChpbWFnZV9yb290ZnNfc2l6ZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBpbWFnZV9yb290ZnNfc2l6ZSA9IDAKKyAgICAgICAgcGFyYW1zWyJpbWFnZV9yb290ZnNfc2l6ZSJdID0gaW1hZ2Vfcm9vdGZzX3NpemUKKworICAgICAgICBpbWFnZV9vdmVyaGVhZF9mYWN0b3IgPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJJTUFHRV9PVkVSSEVBRF9GQUNUT1IiXSkKKyAgICAgICAgaWYgbm90IGltYWdlX292ZXJoZWFkX2ZhY3RvcjoKKyAgICAgICAgICAgIGltYWdlX292ZXJoZWFkX2ZhY3RvciA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbWFnZV9vdmVyaGVhZF9mYWN0b3IgPSBmbG9hdChpbWFnZV9vdmVyaGVhZF9mYWN0b3IpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yID0gMQorICAgICAgICBwYXJhbXNbJ2ltYWdlX292ZXJoZWFkX2ZhY3RvciddID0gaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yCisKKyAgICAgICAgcGFyYW1zWyJpbmNvbXBhdF9saWNlbnNlIl0gPSBzZWxmLl9yZW1vdmVfcmVkdW5kYW50KHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIklOQ09NUEFUSUJMRV9MSUNFTlNFIl0pIG9yICIiKQorICAgICAgICBwYXJhbXNbInNka19tYWNoaW5lIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJTREtNQUNISU5FIl0pIG9yIHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlNES19BUkNIIl0pIG9yICIiCisKKyAgICAgICAgcGFyYW1zWyJpbWFnZV9mc3R5cGVzIl0gPSBzZWxmLl9yZW1vdmVfcmVkdW5kYW50KHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIklNQUdFX0ZTVFlQRVMiXSkgb3IgIiIpCisKKyAgICAgICAgcGFyYW1zWyJpbWFnZV90eXBlcyJdID0gc2VsZi5fcmVtb3ZlX3JlZHVuZGFudChzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJJTUFHRV9UWVBFUyJdKSBvciAiIikKKworICAgICAgICBwYXJhbXNbImNvbmZfdmVyc2lvbiJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQ09ORl9WRVJTSU9OIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1sibGNvbmZfdmVyc2lvbiJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiTENPTkZfVkVSU0lPTiJdKSBvciAiIgorCisgICAgICAgIHBhcmFtc1sicnVubmFibGVfaW1hZ2VfdHlwZXMiXSA9IHNlbGYuX3JlbW92ZV9yZWR1bmRhbnQoc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiUlVOTkFCTEVfSU1BR0VfVFlQRVMiXSkgb3IgIiIpCisgICAgICAgIHBhcmFtc1sicnVubmFibGVfbWFjaGluZV9wYXR0ZXJucyJdID0gc2VsZi5fcmVtb3ZlX3JlZHVuZGFudChzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJSVU5OQUJMRV9NQUNISU5FX1BBVFRFUk5TIl0pIG9yICIiKQorICAgICAgICBwYXJhbXNbImRlcGxveWFibGVfaW1hZ2VfdHlwZXMiXSA9IHNlbGYuX3JlbW92ZV9yZWR1bmRhbnQoc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiREVQTE9ZQUJMRV9JTUFHRV9UWVBFUyJdKSBvciAiIikKKyAgICAgICAgcGFyYW1zWyJrZXJuZWxfaW1hZ2VfdHlwZSJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiS0VSTkVMX0lNQUdFVFlQRSJdKSBvciAiIgorICAgICAgICBwYXJhbXNbInRtcGRpciJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVE1QRElSIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1siZGlzdHJvX3ZlcnNpb24iXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkRJU1RST19WRVJTSU9OIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1sidGFyZ2V0X29zIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJUQVJHRVRfT1MiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJ0YXJnZXRfYXJjaCJdID0gc2VsZi5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiVEFSR0VUX0FSQ0giXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJ0dW5lX3BrZ2FyY2giXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIlRVTkVfUEtHQVJDSCJdKSAgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJiYl92ZXJzaW9uIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQl9NSU5fVkVSU0lPTiJdKSBvciAiIgorCisgICAgICAgIHBhcmFtc1siZGVmYXVsdF90YXNrIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQl9ERUZBVUxUX1RBU0siXSkgb3IgImJ1aWxkIgorCisgICAgICAgIHBhcmFtc1sic29ja3NfcHJveHkiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgImFsbF9wcm94eSJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImh0dHBfcHJveHkiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgImh0dHBfcHJveHkiXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJmdHBfcHJveHkiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgImZ0cF9wcm94eSJdKSBvciAiIgorICAgICAgICBwYXJhbXNbImh0dHBzX3Byb3h5Il0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJodHRwc19wcm94eSJdKSBvciAiIgorCisgICAgICAgIHBhcmFtc1siY3ZzX3Byb3h5X2hvc3QiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkNWU19QUk9YWV9IT1NUIl0pIG9yICIiCisgICAgICAgIHBhcmFtc1siY3ZzX3Byb3h5X3BvcnQiXSA9IHNlbGYucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkNWU19QUk9YWV9QT1JUIl0pIG9yICIiCisKKyAgICAgICAgcGFyYW1zWyJpbWFnZV93aGl0ZV9wYXR0ZXJuIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQlVJX0lNQUdFX1dISVRFX1BBVFRFUk4iXSkgb3IgIiIKKyAgICAgICAgcGFyYW1zWyJpbWFnZV9ibGFja19wYXR0ZXJuIl0gPSBzZWxmLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQlVJX0lNQUdFX0JMQUNLX1BBVFRFUk4iXSkgb3IgIiIKKyAgICAgICAgcmV0dXJuIHBhcmFtcwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYmxpc3Rtb2RlbC5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2JsaXN0bW9kZWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkZjE1NgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2JsaXN0bW9kZWwucHkKQEAgLTAsMCArMSw5MDMgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMSAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgSm9zaHVhIExvY2sgPGpvc2hAbGludXguaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0Citmcm9tIGJiLnVpLmNydW1icy5ob2JwYWdlcyBpbXBvcnQgSG9iUGFnZQorCisjCisjIFBhY2thZ2VMaXN0TW9kZWwKKyMKK2NsYXNzIFBhY2thZ2VMaXN0TW9kZWwoZ3RrLkxpc3RTdG9yZSk6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBkZWZpbmVzIGFuIGd0ay5MaXN0U3RvcmUgc3ViY2xhc3Mgd2hpY2ggd2lsbCBjb252ZXJ0IHRoZSBvdXRwdXQKKyAgICBvZiB0aGUgYmIuZXZlbnQuVGFyZ2V0c1RyZWVHZW5lcmF0ZWQgZXZlbnQgaW50byBhIGd0ay5MaXN0U3RvcmUgd2hpbHN0IGFsc28KKyAgICBwcm92aWRpbmcgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGFjY2VzcyBndGsuVHJlZU1vZGVsIHN1YmNsYXNzZXMgd2hpY2gKKyAgICBwcm92aWRlIGZpbHRlcmVkIHZpZXdzIG9mIHRoZSBkYXRhLgorICAgICIiIgorCisgICAgKENPTF9OQU1FLCBDT0xfVkVSLCBDT0xfUkVWLCBDT0xfUk5NLCBDT0xfU0VDLCBDT0xfU1VNLCBDT0xfUkRFUCwgQ09MX1JQUk9WLCBDT0xfU0laRSwgQ09MX1JDUCwgQ09MX0JJTkIsIENPTF9JTkMsIENPTF9GQURFX0lOQywgQ09MX0ZPTlQsIENPTF9GTElTVCkgPSByYW5nZSgxNSkKKworICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgInBhY2thZ2Utc2VsZWN0aW9uLWNoYW5nZWQiIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgIH0KKworICAgIF9fdG9vbGNoYWluX3JlcXVpcmVkX3BhY2thZ2VzX18gPSBbInBhY2thZ2Vncm91cC1jb3JlLXN0YW5kYWxvbmUtc2RrLXRhcmdldCIsICJwYWNrYWdlZ3JvdXAtY29yZS1zdGFuZGFsb25lLXNkay10YXJnZXQtZGJnIl0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5ycHJvdl9wa2cgPSB7fQorICAgICAgICBndGsuTGlzdFN0b3JlLl9faW5pdF9fIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX0JPT0xFQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIHNlbGYuc29ydF9jb2x1bW5faWQsIHNlbGYuc29ydF9vcmRlciA9IFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUsIGd0ay5TT1JUX0FTQ0VORElORworCisgICAgIiIiCisgICAgRmluZCB0aGUgbW9kZWwgcGF0aCBmb3IgdGhlIGl0ZW1fbmFtZQorICAgIFJldHVybnMgdGhlIHBhdGggaW4gdGhlIG1vZGVsIG9yIE5vbmUKKyAgICAiIiIKKyAgICBkZWYgZmluZF9wYXRoX2Zvcl9pdGVtKHNlbGYsIGl0ZW1fbmFtZSk6CisgICAgICAgIHBrZyA9IGl0ZW1fbmFtZQorICAgICAgICBpZiBpdGVtX25hbWUgbm90IGluIHNlbGYucG5fcGF0aC5rZXlzKCk6CisgICAgICAgICAgICBpZiBpdGVtX25hbWUgbm90IGluIHNlbGYucnByb3ZfcGtnLmtleXMoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcGtnID0gc2VsZi5ycHJvdl9wa2dbaXRlbV9uYW1lXQorICAgICAgICAgICAgaWYgcGtnIG5vdCBpbiBzZWxmLnBuX3BhdGgua2V5cygpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmV0dXJuIHNlbGYucG5fcGF0aFtwa2ddCisKKyAgICBkZWYgZmluZF9pdGVtX2Zvcl9wYXRoKHNlbGYsIGl0ZW1fcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfTkFNRV0KKworICAgICIiIgorICAgIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBpdGVtIGlzIGFuIGl0ZW0gc3BlY2lmaWVkIGJ5IGZpbHRlcgorICAgICIiIgorICAgIGRlZiB0cmVlX21vZGVsX2ZpbHRlcihzZWxmLCBtb2RlbCwgaXQsIGZpbHRlcik6CisgICAgICAgIG5hbWUgPSBtb2RlbC5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX05BTUUpCisKKyAgICAgICAgZm9yIGtleSBpbiBmaWx0ZXIua2V5cygpOgorICAgICAgICAgICAgaWYga2V5ID09IHNlbGYuQ09MX05BTUU6CisgICAgICAgICAgICAgICAgaWYgZmlsdGVyW2tleV0gIT0gJ1NlYXJjaCBwYWNrYWdlcyBieSBuYW1lJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBhbmQgZmlsdGVyW2tleV0gbm90IGluIG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbW9kZWwuZ2V0X3ZhbHVlKGl0LCBrZXkpIG5vdCBpbiBmaWx0ZXJba2V5XToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYuZmlsdGVyZWRfbmIgKz0gMQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIiIiCisgICAgQ3JlYXRlLCBpZiByZXF1aXJlZCwgYW5kIHJldHVybiBhIGZpbHRlcmVkIGd0ay5UcmVlTW9kZWxTb3J0CisgICAgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyBzcGVjaWZpZWQgYnkgZmlsdGVyCisgICAgIiIiCisgICAgZGVmIHRyZWVfbW9kZWwoc2VsZiwgZmlsdGVyLCBleGNsdWRlZF9pdGVtc19haGVhZD1GYWxzZSwgaW5jbHVkZWRfaXRlbXNfYWhlYWQ9RmFsc2UsIHNlYXJjaF9kYXRhPU5vbmUsIGluaXRpYWw9RmFsc2UpOgorICAgICAgICBtb2RlbCA9IHNlbGYuZmlsdGVyX25ldygpCisgICAgICAgIHNlbGYuZmlsdGVyZWRfbmIgPSAwCisgICAgICAgIG1vZGVsLnNldF92aXNpYmxlX2Z1bmMoc2VsZi50cmVlX21vZGVsX2ZpbHRlciwgZmlsdGVyKQorCisgICAgICAgIHNvcnQgPSBndGsuVHJlZU1vZGVsU29ydChtb2RlbCkKKyAgICAgICAgc29ydC5jb25uZWN0ICgnc29ydC1jb2x1bW4tY2hhbmdlZCcsIHNlbGYuc29ydF9jb2x1bW5fY2hhbmdlZF9jYikKKyAgICAgICAgaWYgaW5pdGlhbDoKKyAgICAgICAgICAgIHNvcnQuc2V0X3NvcnRfY29sdW1uX2lkKFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUsIGd0ay5TT1JUX0FTQ0VORElORykKKyAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKE5vbmUpCisgICAgICAgIGVsaWYgZXhjbHVkZWRfaXRlbXNfYWhlYWQ6CisgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhzZWxmLmV4Y2x1ZGVfaXRlbV9zb3J0X2Z1bmMsIHNlYXJjaF9kYXRhKQorICAgICAgICBlbGlmIGluY2x1ZGVkX2l0ZW1zX2FoZWFkOgorICAgICAgICAgICAgc29ydC5zZXRfZGVmYXVsdF9zb3J0X2Z1bmMoc2VsZi5pbmNsdWRlX2l0ZW1fc29ydF9mdW5jLCBzZWFyY2hfZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlYXJjaF9kYXRhIGFuZCBzZWFyY2hfZGF0YSE9J1NlYXJjaCByZWNpcGVzIGJ5IG5hbWUnIGFuZCBzZWFyY2hfZGF0YSE9J1NlYXJjaCBwYWNrYWdlIGdyb3VwcyBieSBuYW1lJzoKKyAgICAgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhzZWxmLnNvcnRfZnVuYywgc2VhcmNoX2RhdGEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNvcnQuc2V0X3NvcnRfY29sdW1uX2lkKHNlbGYuc29ydF9jb2x1bW5faWQsIHNlbGYuc29ydF9vcmRlcikKKyAgICAgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhOb25lKQorCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhQYWNrYWdlTGlzdE1vZGVsLkNPTF9JTkMsIHNlbGYuc29ydF9jb2x1bW4sIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQykKKyAgICAgICAgc29ydC5zZXRfc29ydF9mdW5jKFBhY2thZ2VMaXN0TW9kZWwuQ09MX1NJWkUsIHNlbGYuc29ydF9jb2x1bW4sIFBhY2thZ2VMaXN0TW9kZWwuQ09MX1NJWkUpCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhQYWNrYWdlTGlzdE1vZGVsLkNPTF9CSU5CLCBzZWxmLnNvcnRfYmluYl9jb2x1bW4pCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhQYWNrYWdlTGlzdE1vZGVsLkNPTF9SQ1AsIHNlbGYuc29ydF9jb2x1bW4sIFBhY2thZ2VMaXN0TW9kZWwuQ09MX1JDUCkKKyAgICAgICAgcmV0dXJuIHNvcnQKKworICAgIGRlZiBzb3J0X2NvbHVtbl9jaGFuZ2VkX2NiIChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5zb3J0X2NvbHVtbl9pZCwgc2VsZi5zb3J0X29yZGVyID0gZGF0YS5nZXRfc29ydF9jb2x1bW5faWQgKCkKKworICAgIGRlZiBzb3J0X2NvbHVtbihzZWxmLCBtb2RlbCwgcm93MSwgcm93MiwgY29sKToKKyAgICAgICAgdmFsdWUxID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzEsIGNvbCkKKyAgICAgICAgdmFsdWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIGNvbCkKKyAgICAgICAgaWYgY29sPT1QYWNrYWdlTGlzdE1vZGVsLkNPTF9TSVpFOgorICAgICAgICAgICAgdmFsdWUxID0gSG9iUGFnZS5fc3RyaW5nX3RvX3NpemUodmFsdWUxKQorICAgICAgICAgICAgdmFsdWUyID0gSG9iUGFnZS5fc3RyaW5nX3RvX3NpemUodmFsdWUyKQorCisgICAgICAgIGNtcF9yZXMgPSBjbXAodmFsdWUxLCB2YWx1ZTIpCisgICAgICAgIGlmIGNtcF9yZXMhPTA6CisgICAgICAgICAgICBpZiBjb2w9PVBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gLWNtcF9yZXMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcF9yZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUxID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICBuYW1lMiA9IG1vZGVsLmdldF92YWx1ZShyb3cyLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgcmV0dXJuIGNtcChuYW1lMSxuYW1lMikKKworICAgIGRlZiBzb3J0X2JpbmJfY29sdW1uKHNlbGYsIG1vZGVsLCByb3cxLCByb3cyKToKKyAgICAgICAgdmFsdWUxID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0JJTkIpCisgICAgICAgIHZhbHVlMiA9IG1vZGVsLmdldF92YWx1ZShyb3cyLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9CSU5CKQorICAgICAgICB2YWx1ZTFfbGlzdCA9IHZhbHVlMS5zcGxpdCgnLCAnKQorICAgICAgICB2YWx1ZTJfbGlzdCA9IHZhbHVlMi5zcGxpdCgnLCAnKQorCisgICAgICAgIHZhbHVlMSA9IHZhbHVlMV9saXN0WzBdCisgICAgICAgIHZhbHVlMiA9IHZhbHVlMl9saXN0WzBdCisKKyAgICAgICAgY21wX3JlcyA9IGNtcCh2YWx1ZTEsIHZhbHVlMikKKyAgICAgICAgaWYgY21wX3Jlcz09MDoKKyAgICAgICAgICAgIGNtcF9zaXplID0gY21wKGxlbih2YWx1ZTFfbGlzdCksIGxlbih2YWx1ZTJfbGlzdCkpCisgICAgICAgICAgICBpZiBjbXBfc2l6ZT09MDoKKyAgICAgICAgICAgICAgICBuYW1lMSA9IG1vZGVsLmdldF92YWx1ZShyb3cxLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgICAgIG5hbWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChuYW1lMSxuYW1lMikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcF9zaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY21wX3JlcworCisgICAgZGVmIGV4Y2x1ZGVfaXRlbV9zb3J0X2Z1bmMoc2VsZiwgbW9kZWwsIGl0ZXIxLCBpdGVyMiwgdXNlcl9kYXRhPU5vbmUpOgorICAgICAgICBpZiB1c2VyX2RhdGE6CisgICAgICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNtcF92YWxzKHZhbDEsIHZhbDIsIHVzZXJfZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0ZBREVfSU5DKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgcmV0dXJuICgodmFsMSA9PSBUcnVlKSBhbmQgKHZhbDIgPT0gRmFsc2UpKQorCisgICAgZGVmIGluY2x1ZGVfaXRlbV9zb3J0X2Z1bmMoc2VsZiwgbW9kZWwsIGl0ZXIxLCBpdGVyMiwgdXNlcl9kYXRhPU5vbmUpOgorICAgICAgICBpZiB1c2VyX2RhdGE6CisgICAgICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNtcF92YWxzKHZhbDEsIHZhbDIsIHVzZXJfZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbDEgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjEsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQykKKyAgICAgICAgICAgIHZhbDIgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjIsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQykKKyAgICAgICAgICAgIHJldHVybiAoKHZhbDEgPT0gRmFsc2UpIGFuZCAodmFsMiA9PSBUcnVlKSkKKworICAgIGRlZiBzb3J0X2Z1bmMoc2VsZiwgbW9kZWwsIGl0ZXIxLCBpdGVyMiwgdXNlcl9kYXRhKToKKyAgICAgICAgdmFsMSA9IG1vZGVsLmdldF92YWx1ZShpdGVyMSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUGFja2FnZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY21wX3ZhbHModmFsMSwgdmFsMiwgdXNlcl9kYXRhKQorCisgICAgZGVmIGNtcF92YWxzKHNlbGYsIHZhbDEsIHZhbDIsIHVzZXJfZGF0YSk6CisgICAgICAgIGlmIHZhbDEgaXMgTm9uZSBvciB2YWwyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbGlmIHZhbDEuc3RhcnRzd2l0aCh1c2VyX2RhdGEpIGFuZCBub3QgdmFsMi5zdGFydHN3aXRoKHVzZXJfZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBub3QgdmFsMS5zdGFydHN3aXRoKHVzZXJfZGF0YSkgYW5kIHZhbDIuc3RhcnRzd2l0aCh1c2VyX2RhdGEpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAodmFsMSwgdmFsMikKKworICAgIGRlZiBjb252ZXJ0X3ZwYXRoX3RvX3BhdGgoc2VsZiwgdmlld19tb2RlbCwgdmlld19wYXRoKToKKyAgICAgICAgIyB2aWV3X21vZGVsIGlzIHRoZSBtb2RlbCBzb3J0ZWQKKyAgICAgICAgIyBnZXQgdGhlIHBhdGggb2YgdGhlIG1vZGVsIGZpbHRlcmVkCisgICAgICAgIGZpbHRlcmVkX21vZGVsX3BhdGggPSB2aWV3X21vZGVsLmNvbnZlcnRfcGF0aF90b19jaGlsZF9wYXRoKHZpZXdfcGF0aCkKKyAgICAgICAgIyBnZXQgdGhlIG1vZGVsIGZpbHRlcmVkCisgICAgICAgIGZpbHRlcmVkX21vZGVsID0gdmlld19tb2RlbC5nZXRfbW9kZWwoKQorICAgICAgICAjIGdldCB0aGUgcGF0aCBvZiB0aGUgb3JpZ2luYWwgbW9kZWwKKyAgICAgICAgcGF0aCA9IGZpbHRlcmVkX21vZGVsLmNvbnZlcnRfcGF0aF90b19jaGlsZF9wYXRoKGZpbHRlcmVkX21vZGVsX3BhdGgpCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgY29udmVydF9wYXRoX3RvX3ZwYXRoKHNlbGYsIHZpZXdfbW9kZWwsIHBhdGgpOgorICAgICAgICBpdCA9IHZpZXdfbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLmZpbmRfaXRlbV9mb3JfcGF0aChwYXRoKQorICAgICAgICAgICAgdmlld19uYW1lID0gdmlld19tb2RlbC5nZXRfdmFsdWUoaXQsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICBpZiB2aWV3X25hbWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICB2aWV3X3BhdGggPSB2aWV3X21vZGVsLmdldF9wYXRoKGl0KQorICAgICAgICAgICAgICAgIHJldHVybiB2aWV3X3BhdGgKKyAgICAgICAgICAgIGl0ID0gdmlld19tb2RlbC5pdGVyX25leHQoaXQpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAiIiIKKyAgICBUaGUgcG9wdWxhdGUoKSBmdW5jdGlvbiB0YWtlcyBhcyBpbnB1dCB0aGUgZGF0YSBmcm9tIGEKKyAgICBiYi5ldmVudC5QYWNrYWdlSW5mbyBldmVudCBhbmQgcG9wdWxhdGVzIHRoZSBwYWNrYWdlIGxpc3QuCisgICAgIiIiCisgICAgZGVmIHBvcHVsYXRlKHNlbGYsIHBrZ2luZm9saXN0KToKKyAgICAgICAgIyBGaXJzdCBjbGVhciB0aGUgbW9kZWwsIGluIGNhc2UgcmVwb3B1bGF0aW5nCisgICAgICAgIHNlbGYuY2xlYXIoKQorCisgICAgICAgIGRlZiBnZXRwa2d2YWx1ZShwa2dkaWN0LCBrZXksIHBrZ25hbWUsIGRlZmF1bHR2YWwgPSBOb25lKToKKyAgICAgICAgICAgIHZhbHVlID0gcGtnZGljdC5nZXQoJyVzXyVzJyAlIChrZXksIHBrZ25hbWUpLCBOb25lKQorICAgICAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gcGtnZGljdC5nZXQoa2V5LCBkZWZhdWx0dmFsKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgZm9yIHBrZ2luZm8gaW4gcGtnaW5mb2xpc3Q6CisgICAgICAgICAgICBwbiA9IHBrZ2luZm9bJ1BOJ10KKyAgICAgICAgICAgIHB2ID0gcGtnaW5mb1snUFYnXQorICAgICAgICAgICAgcHIgPSBwa2dpbmZvWydQUiddCisgICAgICAgICAgICBwa2cgPSBwa2dpbmZvWydQS0cnXQorICAgICAgICAgICAgcGtndiA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdQS0dWJywgcGtnKQorICAgICAgICAgICAgcGtnciA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdQS0dSJywgcGtnKQorICAgICAgICAgICAgIyBQS0dTSVpFIGlzIGFydGlmaWNpYWwsIHdpbGwgYWx3YXlzIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgcGFja2FnZSBuYW1lIGlmIHByZXNlbnQKKyAgICAgICAgICAgIHBrZ3NpemUgPSBpbnQocGtnaW5mby5nZXQoJ1BLR1NJWkVfJXMnICUgcGtnLCAiMCIpKQorICAgICAgICAgICAgIyBQS0dfJXMgaXMgdGhlIHJlbmFtZWQgdmVyc2lvbgorICAgICAgICAgICAgcGtnX3JlbmFtZSA9IHBrZ2luZm8uZ2V0KCdQS0dfJXMnICUgcGtnLCAiIikKKyAgICAgICAgICAgICMgVGhlIHJlc3QgbWF5IGJlIG92ZXJyaWRkZW4gb3Igbm90CisgICAgICAgICAgICBzZWN0aW9uID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ1NFQ1RJT04nLCBwa2csICIiKQorICAgICAgICAgICAgc3VtbWFyeSA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdTVU1NQVJZJywgcGtnLCAiIikKKyAgICAgICAgICAgIHJkZXAgPSBnZXRwa2d2YWx1ZShwa2dpbmZvLCAnUkRFUEVORFMnLCBwa2csICIiKQorICAgICAgICAgICAgcnJlYyA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdSUkVDT01NRU5EUycsIHBrZywgIiIpCisgICAgICAgICAgICBycHJvdiA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdSUFJPVklERVMnLCBwa2csICIiKQorICAgICAgICAgICAgZmlsZXNfbGlzdCA9IGdldHBrZ3ZhbHVlKHBrZ2luZm8sICdGSUxFU19JTkZPJywgcGtnLCAiIikKKyAgICAgICAgICAgIGZvciBpIGluIHJwcm92LnNwbGl0KCk6CisgICAgICAgICAgICAgICAgc2VsZi5ycHJvdl9wa2dbaV0gPSBwa2cKKworICAgICAgICAgICAgcmVjaXBlID0gcG4gKyAnLScgKyBwdiArICctJyArIHByCisKKyAgICAgICAgICAgIGFsbG93X2VtcHR5ID0gZ2V0cGtndmFsdWUocGtnaW5mbywgJ0FMTE9XX0VNUFRZJywgcGtnLCAiIikKKworICAgICAgICAgICAgaWYgcGtnc2l6ZSA9PSAwIGFuZCBub3QgYWxsb3dfZW1wdHk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgc2l6ZSA9IEhvYlBhZ2UuX3NpemVfdG9fc3RyaW5nKHBrZ3NpemUpCisgICAgICAgICAgICBzZWxmLnNldChzZWxmLmFwcGVuZCgpLCBzZWxmLkNPTF9OQU1FLCBwa2csIHNlbGYuQ09MX1ZFUiwgcGtndiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX1JFViwgcGtnciwgc2VsZi5DT0xfUk5NLCBwa2dfcmVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfU0VDLCBzZWN0aW9uLCBzZWxmLkNPTF9TVU0sIHN1bW1hcnksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9SREVQLCByZGVwICsgJyAnICsgcnJlYywKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX1JQUk9WLCBycHJvdiwgc2VsZi5DT0xfU0laRSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX1JDUCwgcmVjaXBlLCBzZWxmLkNPTF9CSU5CLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0lOQywgRmFsc2UsIHNlbGYuQ09MX0ZPTlQsICcxMCcsIHNlbGYuQ09MX0ZMSVNULCBmaWxlc19saXN0KQorCisgICAgICAgIHNlbGYucG5fcGF0aCA9IHt9CisgICAgICAgIGl0ID0gc2VsZi5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgcG4gPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfTkFNRSkKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLmdldF9wYXRoKGl0KQorICAgICAgICAgICAgc2VsZi5wbl9wYXRoW3BuXSA9IHBhdGgKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisKKyAgICAiIiIKKyAgICBVcGRhdGUgdGhlIG1vZGVsLCBzZW5kIG91dCB0aGUgbm90aWZpY2F0aW9uLgorICAgICIiIgorICAgIGRlZiBzZWxlY3Rpb25fY2hhbmdlX25vdGlmaWNhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5lbWl0KCJwYWNrYWdlLXNlbGVjdGlvbi1jaGFuZ2VkIikKKworICAgICIiIgorICAgIENoZWNrIHdoZXRoZXIgdGhlIGl0ZW0gYXQgaXRlbV9wYXRoIGlzIGluY2x1ZGVkIG9yIG5vdAorICAgICIiIgorICAgIGRlZiBwYXRoX2luY2x1ZGVkKHNlbGYsIGl0ZW1fcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfSU5DXQorCisgICAgIiIiCisgICAgQWRkIHRoaXMgaXRlbSwgYW5kIGFueSBvZiBpdHMgZGVwZW5kZW5jaWVzLCB0byB0aGUgaW1hZ2UgY29udGVudHMKKyAgICAiIiIKKyAgICBkZWYgaW5jbHVkZV9pdGVtKHNlbGYsIGl0ZW1fcGF0aCwgYmluYj0iIik6CisgICAgICAgIGlmIHNlbGYucGF0aF9pbmNsdWRlZChpdGVtX3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaXRlbV9uYW1lID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX05BTUVdCisgICAgICAgIGl0ZW1fZGVwcyA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9SREVQXQorCisgICAgICAgIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9JTkNdID0gVHJ1ZQorCisgICAgICAgIGl0ZW1fYmluID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0JJTkJdLnNwbGl0KCcsICcpCisgICAgICAgIGlmIGJpbmIgYW5kIG5vdCBiaW5iIGluIGl0ZW1fYmluOgorICAgICAgICAgICAgaXRlbV9iaW4uYXBwZW5kKGJpbmIpCisgICAgICAgICAgICBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfQklOQl0gPSAnLCAnLmpvaW4oaXRlbV9iaW4pLmxzdHJpcCgnLCAnKQorCisgICAgICAgIGlmIGl0ZW1fZGVwczoKKyAgICAgICAgICAgICMgRW5zdXJlIGFsbCBvZiB0aGUgaXRlbXMgZGVwcyBhcmUgaW5jbHVkZWQgYW5kLCB3aGVyZSBhcHByb3ByaWF0ZSwKKyAgICAgICAgICAgICMgYWRkIHRoaXMgaXRlbSB0byB0aGVpciBDT0xfQklOQgorICAgICAgICAgICAgZm9yIGRlcCBpbiBpdGVtX2RlcHMuc3BsaXQoIiAiKToKKyAgICAgICAgICAgICAgICBpZiBkZXAuc3RhcnRzd2l0aCgnKCcpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgSWYgdGhlIGNvbnRlbnRzIG1vZGVsIGRvZXNuJ3QgYWxyZWFkeSBjb250YWluIGRlcCwgYWRkIGl0CisgICAgICAgICAgICAgICAgZGVwX3BhdGggPSBzZWxmLmZpbmRfcGF0aF9mb3JfaXRlbShkZXApCisgICAgICAgICAgICAgICAgaWYgbm90IGRlcF9wYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlcF9pbmNsdWRlZCA9IHNlbGYucGF0aF9pbmNsdWRlZChkZXBfcGF0aCkKKworICAgICAgICAgICAgICAgIGlmIGRlcF9pbmNsdWRlZCBhbmQgbm90IGRlcCBpbiBpdGVtX2JpbjoKKyAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBzZXQgdGhlIENPTF9CSU5CIHRvIHRoaXMgaXRlbSBpZiB0aGUgdGFyZ2V0IGlzIGFuCisgICAgICAgICAgICAgICAgICAgICMgaXRlbSBpbiBvdXIgb3duIENPTF9CSU5CCisgICAgICAgICAgICAgICAgICAgIGRlcF9iaW4gPSBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXS5zcGxpdCgnLCAnKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXRlbV9uYW1lIGluIGRlcF9iaW46CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBfYmluLmFwcGVuZChpdGVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXSA9ICcsICcuam9pbihkZXBfYmluKS5sc3RyaXAoJywgJykKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBkZXBfaW5jbHVkZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9pdGVtKGRlcF9wYXRoLCBiaW5iPWl0ZW1fbmFtZSkKKworICAgIGRlZiBleGNsdWRlX2l0ZW0oc2VsZiwgaXRlbV9wYXRoKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0aF9pbmNsdWRlZChpdGVtX3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0lOQ10gPSBGYWxzZQorCisgICAgICAgIGl0ZW1fbmFtZSA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9OQU1FXQorICAgICAgICBpdGVtX2RlcHMgPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfUkRFUF0KKyAgICAgICAgaWYgaXRlbV9kZXBzOgorICAgICAgICAgICAgZm9yIGRlcCBpbiBpdGVtX2RlcHMuc3BsaXQoIiAiKToKKyAgICAgICAgICAgICAgICBpZiBkZXAuc3RhcnRzd2l0aCgnKCcpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlcF9wYXRoID0gc2VsZi5maW5kX3BhdGhfZm9yX2l0ZW0oZGVwKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkZXBfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBkZXBfYmluID0gc2VsZltkZXBfcGF0aF1bc2VsZi5DT0xfQklOQl0uc3BsaXQoJywgJykKKyAgICAgICAgICAgICAgICBpZiBpdGVtX25hbWUgaW4gZGVwX2JpbjoKKyAgICAgICAgICAgICAgICAgICAgZGVwX2Jpbi5yZW1vdmUoaXRlbV9uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXSA9ICcsICcuam9pbihkZXBfYmluKS5sc3RyaXAoJywgJykKKworICAgICAgICBpdGVtX2JpbiA9IHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9CSU5CXS5zcGxpdCgnLCAnKQorICAgICAgICBpZiBpdGVtX2JpbjoKKyAgICAgICAgICAgIGZvciBiaW5iIGluIGl0ZW1fYmluOgorICAgICAgICAgICAgICAgIGJpbmJfcGF0aCA9IHNlbGYuZmluZF9wYXRoX2Zvcl9pdGVtKGJpbmIpCisgICAgICAgICAgICAgICAgaWYgbm90IGJpbmJfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmV4Y2x1ZGVfaXRlbShiaW5iX3BhdGgpCisKKyAgICAiIiIKKyAgICBFbXB0eSBzZWxmLmNvbnRlbnRzIGJ5IHNldHRpbmcgdGhlIGluY2x1ZGUgb2YgZWFjaCBlbnRyeSB0byBOb25lCisgICAgIiIiCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHNlbGYuc2V0KGl0LAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfSU5DLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0JJTkIsICIiKQorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworICAgICAgICBzZWxmLnNlbGVjdGlvbl9jaGFuZ2Vfbm90aWZpY2F0aW9uKCkKKworICAgIGRlZiBnZXRfc2VsZWN0ZWRfcGFja2FnZXMoc2VsZik6CisgICAgICAgIHBhY2thZ2VsaXN0ID0gW10KKworICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9JTkMpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfTkFNRSkKKyAgICAgICAgICAgICAgICBwYWNrYWdlbGlzdC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VsaXN0CisKKyAgICBkZWYgZ2V0X3VzZXJfc2VsZWN0ZWRfcGFja2FnZXMoc2VsZik6CisgICAgICAgIHBhY2thZ2VsaXN0ID0gW10KKworICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9JTkMpOgorICAgICAgICAgICAgICAgIGJpbmIgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfQklOQikKKyAgICAgICAgICAgICAgICBpZiBiaW5iID09ICJVc2VyIFNlbGVjdGVkIjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9OQU1FKQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlbGlzdC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VsaXN0CisKKyAgICBkZWYgZ2V0X3NlbGVjdGVkX3BhY2thZ2VzX3Rvb2xjaGFpbihzZWxmKToKKyAgICAgICAgcGFja2FnZWxpc3QgPSBbXQorCisgICAgICAgIGl0ID0gc2VsZi5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgaWYgc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX0lOQyk6CisgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9OQU1FKQorICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoIi1kZXYiKSBvciBuYW1lLmVuZHN3aXRoKCItZGJnIik6CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VsaXN0LmFwcGVuZChuYW1lKQorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworICAgICAgICByZXR1cm4gbGlzdChzZXQocGFja2FnZWxpc3QgKyBzZWxmLl9fdG9vbGNoYWluX3JlcXVpcmVkX3BhY2thZ2VzX18pKTsKKworICAgICIiIgorICAgIFBhY2thZ2UgbW9kZWwgbWF5IGJlIGluY29tcGxldGUsIHRoZXJlZm9yZSB3aGVuIGNhbGxpbmcgdGhlCisgICAgc2V0X3NlbGVjdGVkX3BhY2thZ2VzKCksIHNvbWUgcGFja2FnZXMgd2lsbCBub3QgYmUgc2V0IGluY2x1ZGVkLgorICAgIFJldHVybiB0aGUgdW4tc2V0IHBhY2thZ2VzIGxpc3QuCisgICAgIiIiCisgICAgZGVmIHNldF9zZWxlY3RlZF9wYWNrYWdlcyhzZWxmLCBwYWNrYWdlbGlzdCwgdXNlcl9zZWxlY3RlZD1GYWxzZSk6CisgICAgICAgIGxlZnQgPSBbXQorICAgICAgICBiaW5iID0gJ1VzZXIgU2VsZWN0ZWQnIGlmIHVzZXJfc2VsZWN0ZWQgZWxzZSAnJworICAgICAgICBmb3IgcG4gaW4gcGFja2FnZWxpc3Q6CisgICAgICAgICAgICBpZiBwbiBpbiBzZWxmLnBuX3BhdGgua2V5cygpOgorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnBuX3BhdGhbcG5dCisgICAgICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgsIGJpbmI9YmluYikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGVmdC5hcHBlbmQocG4pCisKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25fY2hhbmdlX25vdGlmaWNhdGlvbigpCisgICAgICAgIHJldHVybiBsZWZ0CisKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugc2l6ZSwgdW5pdCBpcyBCLgorICAgICIiIgorICAgIGRlZiBnZXRfcGFja2FnZXNfc2l6ZShzZWxmKToKKyAgICAgICAgcGFja2FnZXNfc2l6ZSA9IDAKKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBpZiBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfSU5DKToKKyAgICAgICAgICAgICAgICBzdHJfc2l6ZSA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9TSVpFKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzdHJfc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHBhY2thZ2VzX3NpemUgKz0gSG9iUGFnZS5fc3RyaW5nX3RvX3NpemUoc3RyX3NpemUpCisKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisgICAgICAgIHJldHVybiBwYWNrYWdlc19zaXplCisKKyAgICAiIiIKKyAgICBSZXN5bmMgdGhlIHN0YXRlIG9mIGluY2x1ZGVkIGl0ZW1zIHRvIGEgYmFja3VwIGNvbHVtbiBiZWZvcmUgcGVyZm9ybWluZyB0aGUgZmFkZW91dCB2aXNpYmxlIGVmZmVjdAorICAgICIiIgorICAgIGRlZiByZXN5bmNfZmFkZW91dF9jb2x1bW4oc2VsZiwgbW9kZWxfZmlyc3RfaXRlcj1Ob25lKToKKyAgICAgICAgaXQgPSBtb2RlbF9maXJzdF9pdGVyCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgYWN0aXZlID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX0lOQykKKyAgICAgICAgICAgIHNlbGYuc2V0KGl0LCBzZWxmLkNPTF9GQURFX0lOQywgYWN0aXZlKQorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworIworIyBSZWNpcGVMaXN0TW9kZWwKKyMKK2NsYXNzIFJlY2lwZUxpc3RNb2RlbChndGsuTGlzdFN0b3JlKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGRlZmluZXMgYW4gZ3RrLkxpc3RTdG9yZSBzdWJjbGFzcyB3aGljaCB3aWxsIGNvbnZlcnQgdGhlIG91dHB1dAorICAgIG9mIHRoZSBiYi5ldmVudC5UYXJnZXRzVHJlZUdlbmVyYXRlZCBldmVudCBpbnRvIGEgZ3RrLkxpc3RTdG9yZSB3aGlsc3QgYWxzbworICAgIHByb3ZpZGluZyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gYWNjZXNzIGd0ay5UcmVlTW9kZWwgc3ViY2xhc3NlcyB3aGljaAorICAgIHByb3ZpZGUgZmlsdGVyZWQgdmlld3Mgb2YgdGhlIGRhdGEuCisgICAgIiIiCisgICAgKENPTF9OQU1FLCBDT0xfREVTQywgQ09MX0xJQywgQ09MX0dST1VQLCBDT0xfREVQUywgQ09MX0JJTkIsIENPTF9UWVBFLCBDT0xfSU5DLCBDT0xfSU1HLCBDT0xfSU5TVEFMTCwgQ09MX1BOLCBDT0xfRkFERV9JTkMsIENPTF9TVU1NQVJZLCBDT0xfVkVSU0lPTiwKKyAgICAgQ09MX1JFVklTSU9OLCBDT0xfSE9NRVBBR0UsIENPTF9CVUdUUkFDS0VSLCBDT0xfRklMRSkgPSByYW5nZSgxOCkKKworICAgIF9fY3VzdG9tX2ltYWdlX18gPSAiU3RhcnQgd2l0aCBhbiBlbXB0eSBpbWFnZSByZWNpcGUiCisKKyAgICBfX2dzaWduYWxzX18gPSB7CisgICAgICAgICJyZWNpcGUtc2VsZWN0aW9uLWNoYW5nZWQiIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICB9CisKKyAgICAiIiIKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGd0ay5MaXN0U3RvcmUuX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9CT09MRUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfQk9PTEVBTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX0JPT0xFQU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIHNlbGYuc29ydF9jb2x1bW5faWQsIHNlbGYuc29ydF9vcmRlciA9IFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSwgZ3RrLlNPUlRfQVNDRU5ESU5HCisKKyAgICAiIiIKKyAgICBGaW5kIHRoZSBtb2RlbCBwYXRoIGZvciB0aGUgaXRlbV9uYW1lCisgICAgUmV0dXJucyB0aGUgcGF0aCBpbiB0aGUgbW9kZWwgb3IgTm9uZQorICAgICIiIgorICAgIGRlZiBmaW5kX3BhdGhfZm9yX2l0ZW0oc2VsZiwgaXRlbV9uYW1lKToKKyAgICAgICAgaWYgc2VsZi5ub25fdGFyZ2V0X25hbWUoaXRlbV9uYW1lKSBvciBpdGVtX25hbWUgbm90IGluIHNlbGYucG5fcGF0aC5rZXlzKCk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG5fcGF0aFtpdGVtX25hbWVdCisKKyAgICBkZWYgZmluZF9pdGVtX2Zvcl9wYXRoKHNlbGYsIGl0ZW1fcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfTkFNRV0KKworICAgICIiIgorICAgIEhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgbmFtZSBpcyBhIHRhcmdldCBwbgorICAgICIiIgorICAgIGRlZiBub25fdGFyZ2V0X25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgYW5kICgnLW5hdGl2ZScgaW4gbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICIiIgorICAgIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBpdGVtIGlzIGFuIGl0ZW0gc3BlY2lmaWVkIGJ5IGZpbHRlcgorICAgICIiIgorICAgIGRlZiB0cmVlX21vZGVsX2ZpbHRlcihzZWxmLCBtb2RlbCwgaXQsIGZpbHRlcik6CisgICAgICAgIG5hbWUgPSBtb2RlbC5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX05BTUUpCisgICAgICAgIGlmIHNlbGYubm9uX3RhcmdldF9uYW1lKG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZm9yIGtleSBpbiBmaWx0ZXIua2V5cygpOgorICAgICAgICAgICAgaWYga2V5ID09IHNlbGYuQ09MX05BTUU6CisgICAgICAgICAgICAgICAgaWYgZmlsdGVyW2tleV0gIT0gJ1NlYXJjaCByZWNpcGVzIGJ5IG5hbWUnIGFuZCBmaWx0ZXJba2V5XSAhPSAnU2VhcmNoIHBhY2thZ2UgZ3JvdXBzIGJ5IG5hbWUnOgorICAgICAgICAgICAgICAgICAgICBpZiBmaWx0ZXJba2V5XSBub3QgaW4gbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBtb2RlbC5nZXRfdmFsdWUoaXQsIGtleSkgbm90IGluIGZpbHRlcltrZXldOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5maWx0ZXJlZF9uYiArPSAxCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBleGNsdWRlX2l0ZW1fc29ydF9mdW5jKHNlbGYsIG1vZGVsLCBpdGVyMSwgaXRlcjIsIHVzZXJfZGF0YT1Ob25lKToKKyAgICAgICAgaWYgdXNlcl9kYXRhOgorICAgICAgICAgICAgdmFsMSA9IG1vZGVsLmdldF92YWx1ZShpdGVyMSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgdmFsMiA9IG1vZGVsLmdldF92YWx1ZShpdGVyMiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21wX3ZhbHModmFsMSwgdmFsMiwgdXNlcl9kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsMSA9IG1vZGVsLmdldF92YWx1ZShpdGVyMSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9GQURFX0lOQykKKyAgICAgICAgICAgIHZhbDIgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjIsIFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgcmV0dXJuICgodmFsMSA9PSBUcnVlKSBhbmQgKHZhbDIgPT0gRmFsc2UpKQorCisgICAgZGVmIGluY2x1ZGVfaXRlbV9zb3J0X2Z1bmMoc2VsZiwgbW9kZWwsIGl0ZXIxLCBpdGVyMiwgdXNlcl9kYXRhPU5vbmUpOgorICAgICAgICBpZiB1c2VyX2RhdGE6CisgICAgICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICB2YWwyID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIyLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5jbXBfdmFscyh2YWwxLCB2YWwyLCB1c2VyX2RhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQykKKyAgICAgICAgICAgIHZhbDIgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjIsIFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgcmV0dXJuICgodmFsMSA9PSBGYWxzZSkgYW5kICh2YWwyID09IFRydWUpKQorCisgICAgZGVmIHNvcnRfZnVuYyhzZWxmLCBtb2RlbCwgaXRlcjEsIGl0ZXIyLCB1c2VyX2RhdGEpOgorICAgICAgICB2YWwxID0gbW9kZWwuZ2V0X3ZhbHVlKGl0ZXIxLCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgIHZhbDIgPSBtb2RlbC5nZXRfdmFsdWUoaXRlcjIsIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY21wX3ZhbHModmFsMSwgdmFsMiwgdXNlcl9kYXRhKQorCisgICAgZGVmIGNtcF92YWxzKHNlbGYsIHZhbDEsIHZhbDIsIHVzZXJfZGF0YSk6CisgICAgICAgIGlmIHZhbDEgaXMgTm9uZSBvciB2YWwyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbGlmIHZhbDEuc3RhcnRzd2l0aCh1c2VyX2RhdGEpIGFuZCBub3QgdmFsMi5zdGFydHN3aXRoKHVzZXJfZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBub3QgdmFsMS5zdGFydHN3aXRoKHVzZXJfZGF0YSkgYW5kIHZhbDIuc3RhcnRzd2l0aCh1c2VyX2RhdGEpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAodmFsMSwgdmFsMikKKworICAgICIiIgorICAgIENyZWF0ZSwgaWYgcmVxdWlyZWQsIGFuZCByZXR1cm4gYSBmaWx0ZXJlZCBndGsuVHJlZU1vZGVsU29ydAorICAgIGNvbnRhaW5pbmcgb25seSB0aGUgaXRlbXMgc3BlY2lmaWVkIGJ5IGZpbHRlcgorICAgICIiIgorICAgIGRlZiB0cmVlX21vZGVsKHNlbGYsIGZpbHRlciwgZXhjbHVkZWRfaXRlbXNfYWhlYWQ9RmFsc2UsIGluY2x1ZGVkX2l0ZW1zX2FoZWFkPUZhbHNlLCBzZWFyY2hfZGF0YT1Ob25lLCBpbml0aWFsPUZhbHNlKToKKyAgICAgICAgbW9kZWwgPSBzZWxmLmZpbHRlcl9uZXcoKQorICAgICAgICBzZWxmLmZpbHRlcmVkX25iID0gMAorICAgICAgICBtb2RlbC5zZXRfdmlzaWJsZV9mdW5jKHNlbGYudHJlZV9tb2RlbF9maWx0ZXIsIGZpbHRlcikKKworICAgICAgICBzb3J0ID0gZ3RrLlRyZWVNb2RlbFNvcnQobW9kZWwpCisgICAgICAgIHNvcnQuY29ubmVjdCAoJ3NvcnQtY29sdW1uLWNoYW5nZWQnLCBzZWxmLnNvcnRfY29sdW1uX2NoYW5nZWRfY2IpCisgICAgICAgIGlmIGluaXRpYWw6CisgICAgICAgICAgICBzb3J0LnNldF9zb3J0X2NvbHVtbl9pZChSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUsIGd0ay5TT1JUX0FTQ0VORElORykKKyAgICAgICAgICAgIHNvcnQuc2V0X2RlZmF1bHRfc29ydF9mdW5jKE5vbmUpCisgICAgICAgIGVsaWYgZXhjbHVkZWRfaXRlbXNfYWhlYWQ6CisgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhzZWxmLmV4Y2x1ZGVfaXRlbV9zb3J0X2Z1bmMsIHNlYXJjaF9kYXRhKQorICAgICAgICBlbGlmIGluY2x1ZGVkX2l0ZW1zX2FoZWFkOgorICAgICAgICAgICAgc29ydC5zZXRfZGVmYXVsdF9zb3J0X2Z1bmMoc2VsZi5pbmNsdWRlX2l0ZW1fc29ydF9mdW5jLCBzZWFyY2hfZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlYXJjaF9kYXRhIGFuZCBzZWFyY2hfZGF0YSE9J1NlYXJjaCByZWNpcGVzIGJ5IG5hbWUnIGFuZCBzZWFyY2hfZGF0YSE9J1NlYXJjaCBwYWNrYWdlIGdyb3VwcyBieSBuYW1lJzoKKyAgICAgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhzZWxmLnNvcnRfZnVuYywgc2VhcmNoX2RhdGEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNvcnQuc2V0X3NvcnRfY29sdW1uX2lkKHNlbGYuc29ydF9jb2x1bW5faWQsIHNlbGYuc29ydF9vcmRlcikKKyAgICAgICAgICAgICAgICBzb3J0LnNldF9kZWZhdWx0X3NvcnRfZnVuYyhOb25lKQorCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQywgc2VsZi5zb3J0X2NvbHVtbiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9JTkMpCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhSZWNpcGVMaXN0TW9kZWwuQ09MX0dST1VQLCBzZWxmLnNvcnRfY29sdW1uLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0dST1VQKQorICAgICAgICBzb3J0LnNldF9zb3J0X2Z1bmMoUmVjaXBlTGlzdE1vZGVsLkNPTF9CSU5CLCBzZWxmLnNvcnRfYmluYl9jb2x1bW4pCisgICAgICAgIHNvcnQuc2V0X3NvcnRfZnVuYyhSZWNpcGVMaXN0TW9kZWwuQ09MX0xJQywgc2VsZi5zb3J0X2NvbHVtbiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9MSUMpCisgICAgICAgIHJldHVybiBzb3J0CisKKyAgICBkZWYgc29ydF9jb2x1bW5fY2hhbmdlZF9jYiAoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc29ydF9jb2x1bW5faWQsIHNlbGYuc29ydF9vcmRlciA9IGRhdGEuZ2V0X3NvcnRfY29sdW1uX2lkICgpCisKKyAgICBkZWYgc29ydF9jb2x1bW4oc2VsZiwgbW9kZWwsIHJvdzEsIHJvdzIsIGNvbCk6CisgICAgICAgIHZhbHVlMSA9IG1vZGVsLmdldF92YWx1ZShyb3cxLCBjb2wpCisgICAgICAgIHZhbHVlMiA9IG1vZGVsLmdldF92YWx1ZShyb3cyLCBjb2wpCisgICAgICAgIGNtcF9yZXMgPSBjbXAodmFsdWUxLCB2YWx1ZTIpCisgICAgICAgIGlmIGNtcF9yZXMhPTA6CisgICAgICAgICAgICBpZiBjb2w9PVJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DOgorICAgICAgICAgICAgICAgIHJldHVybiAtY21wX3JlcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wX3JlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZTEgPSBtb2RlbC5nZXRfdmFsdWUocm93MSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgbmFtZTIgPSBtb2RlbC5nZXRfdmFsdWUocm93MiwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgcmV0dXJuIGNtcChuYW1lMSxuYW1lMikKKworICAgIGRlZiBzb3J0X2JpbmJfY29sdW1uKHNlbGYsIG1vZGVsLCByb3cxLCByb3cyKToKKyAgICAgICAgdmFsdWUxID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzEsIFJlY2lwZUxpc3RNb2RlbC5DT0xfQklOQikKKyAgICAgICAgdmFsdWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIFJlY2lwZUxpc3RNb2RlbC5DT0xfQklOQikKKyAgICAgICAgdmFsdWUxX2xpc3QgPSB2YWx1ZTEuc3BsaXQoJywgJykKKyAgICAgICAgdmFsdWUyX2xpc3QgPSB2YWx1ZTIuc3BsaXQoJywgJykKKworICAgICAgICB2YWx1ZTEgPSB2YWx1ZTFfbGlzdFswXQorICAgICAgICB2YWx1ZTIgPSB2YWx1ZTJfbGlzdFswXQorCisgICAgICAgIGNtcF9yZXMgPSBjbXAodmFsdWUxLCB2YWx1ZTIpCisgICAgICAgIGlmIGNtcF9yZXM9PTA6CisgICAgICAgICAgICBjbXBfc2l6ZSA9IGNtcChsZW4odmFsdWUxX2xpc3QpLCBsZW4odmFsdWUyX2xpc3QpKQorICAgICAgICAgICAgaWYgY21wX3NpemU9PTA6CisgICAgICAgICAgICAgICAgbmFtZTEgPSBtb2RlbC5nZXRfdmFsdWUocm93MSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FKQorICAgICAgICAgICAgICAgIG5hbWUyID0gbW9kZWwuZ2V0X3ZhbHVlKHJvdzIsIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKG5hbWUxLG5hbWUyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wX3NpemUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXBfcmVzCisKKyAgICBkZWYgY29udmVydF92cGF0aF90b19wYXRoKHNlbGYsIHZpZXdfbW9kZWwsIHZpZXdfcGF0aCk6CisgICAgICAgIGZpbHRlcmVkX21vZGVsX3BhdGggPSB2aWV3X21vZGVsLmNvbnZlcnRfcGF0aF90b19jaGlsZF9wYXRoKHZpZXdfcGF0aCkKKyAgICAgICAgZmlsdGVyZWRfbW9kZWwgPSB2aWV3X21vZGVsLmdldF9tb2RlbCgpCisKKyAgICAgICAgIyBnZXQgdGhlIHBhdGggb2YgdGhlIG9yaWdpbmFsIG1vZGVsCisgICAgICAgIHBhdGggPSBmaWx0ZXJlZF9tb2RlbC5jb252ZXJ0X3BhdGhfdG9fY2hpbGRfcGF0aChmaWx0ZXJlZF9tb2RlbF9wYXRoKQorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgZGVmIGNvbnZlcnRfcGF0aF90b192cGF0aChzZWxmLCB2aWV3X21vZGVsLCBwYXRoKToKKyAgICAgICAgaXQgPSB2aWV3X21vZGVsLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBuYW1lID0gc2VsZi5maW5kX2l0ZW1fZm9yX3BhdGgocGF0aCkKKyAgICAgICAgICAgIHZpZXdfbmFtZSA9IHZpZXdfbW9kZWwuZ2V0X3ZhbHVlKGl0LCBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICBpZiB2aWV3X25hbWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICB2aWV3X3BhdGggPSB2aWV3X21vZGVsLmdldF9wYXRoKGl0KQorICAgICAgICAgICAgICAgIHJldHVybiB2aWV3X3BhdGgKKyAgICAgICAgICAgIGl0ID0gdmlld19tb2RlbC5pdGVyX25leHQoaXQpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAiIiIKKyAgICBUaGUgcG9wdWxhdGUoKSBmdW5jdGlvbiB0YWtlcyBhcyBpbnB1dCB0aGUgZGF0YSBmcm9tIGEKKyAgICBiYi5ldmVudC5UYXJnZXRzVHJlZUdlbmVyYXRlZCBldmVudCBhbmQgcG9wdWxhdGVzIHRoZSBSZWNpcGVMaXN0LgorICAgICIiIgorICAgIGRlZiBwb3B1bGF0ZShzZWxmLCBldmVudF9tb2RlbCk6CisgICAgICAgICMgRmlyc3QgY2xlYXIgdGhlIG1vZGVsLCBpbiBjYXNlIHJlcG9wdWxhdGluZworICAgICAgICBzZWxmLmNsZWFyKCkKKworICAgICAgICAjIGR1bW15IGltYWdlIGZvciBwcm9tcHQKKyAgICAgICAgc2VsZi5zZXRfaW5fbGlzdChzZWxmLl9fY3VzdG9tX2ltYWdlX18sICAiVXNlICdFZGl0IGltYWdlIHJlY2lwZScgdG8gY3VzdG9taXplIHJlY2lwZXMgYW5kIHBhY2thZ2VzICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYmUgaW5jbHVkZWQgaW4geW91ciBpbWFnZSAiKQorCisgICAgICAgIGZvciBpdGVtIGluIGV2ZW50X21vZGVsWyJwbiJdOgorICAgICAgICAgICAgbmFtZSA9IGl0ZW0KKyAgICAgICAgICAgIGRlc2MgPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsiZGVzY3JpcHRpb24iXQorICAgICAgICAgICAgbGljID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bImxpY2Vuc2UiXQorICAgICAgICAgICAgZ3JvdXAgPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsic2VjdGlvbiJdCisgICAgICAgICAgICBpbmhlcml0cyA9IGV2ZW50X21vZGVsWyJwbiJdW2l0ZW1dWyJpbmhlcml0cyJdCisgICAgICAgICAgICBzdW1tYXJ5ID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bInN1bW1hcnkiXQorICAgICAgICAgICAgdmVyc2lvbiA9IGV2ZW50X21vZGVsWyJwbiJdW2l0ZW1dWyJ2ZXJzaW9uIl0KKyAgICAgICAgICAgIHJldmlzaW9uID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bInByZXZpc2lvbiJdCisgICAgICAgICAgICBob21lcGFnZSA9IGV2ZW50X21vZGVsWyJwbiJdW2l0ZW1dWyJob21lcGFnZSJdCisgICAgICAgICAgICBidWd0cmFja2VyID0gZXZlbnRfbW9kZWxbInBuIl1baXRlbV1bImJ1Z3RyYWNrZXIiXQorICAgICAgICAgICAgZmlsZW5hbWUgPSBldmVudF9tb2RlbFsicG4iXVtpdGVtXVsiZmlsZW5hbWUiXQorICAgICAgICAgICAgaW5zdGFsbCA9IFtdCisKKyAgICAgICAgICAgIGRlcGVuZHMgPSBldmVudF9tb2RlbFsiZGVwZW5kcyJdLmdldChpdGVtLCBbXSkgKyBldmVudF9tb2RlbFsicmRlcGVuZHMtcG4iXS5nZXQoaXRlbSwgW10pCisKKyAgICAgICAgICAgIGlmICgncGFja2FnZWdyb3VwLmJiY2xhc3MnIGluICIgIi5qb2luKGluaGVyaXRzKSk6CisgICAgICAgICAgICAgICAgYXR5cGUgPSAncGFja2FnZWdyb3VwJworICAgICAgICAgICAgZWxpZiAoJy9pbWFnZS5iYmNsYXNzJyBpbiAiICIuam9pbihpbmhlcml0cykpOgorICAgICAgICAgICAgICAgIGlmICJlZGl0ZWQiIG5vdCBpbiBuYW1lOgorICAgICAgICAgICAgICAgICAgICBhdHlwZSA9ICdpbWFnZScKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCA9IGV2ZW50X21vZGVsWyJyZGVwZW5kcy1wa2ciXS5nZXQoaXRlbSwgW10pICsgZXZlbnRfbW9kZWxbInJyZWNzLXBrZyJdLmdldChpdGVtLCBbXSkKKyAgICAgICAgICAgIGVsaWYgKCdtZXRhLScgaW4gbmFtZSk6CisgICAgICAgICAgICAgICAgYXR5cGUgPSAndG9vbGNoYWluJworICAgICAgICAgICAgZWxpZiAobmFtZSA9PSAnZHVtbXktaW1hZ2UnIG9yIG5hbWUgPT0gJ2R1bW15LXRvb2xjaGFpbicpOgorICAgICAgICAgICAgICAgIGF0eXBlID0gJ2R1bW15JworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhdHlwZSA9ICdyZWNpcGUnCisKKyAgICAgICAgICAgIHNlbGYuc2V0KHNlbGYuYXBwZW5kKCksIHNlbGYuQ09MX05BTUUsIGl0ZW0sIHNlbGYuQ09MX0RFU0MsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9MSUMsIGxpYywgc2VsZi5DT0xfR1JPVVAsIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfREVQUywgIiAiLmpvaW4oZGVwZW5kcyksIHNlbGYuQ09MX0JJTkIsICIiLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5DT0xfVFlQRSwgYXR5cGUsIHNlbGYuQ09MX0lOQywgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9JTUcsIEZhbHNlLCBzZWxmLkNPTF9JTlNUQUxMLCAiICIuam9pbihpbnN0YWxsKSwgc2VsZi5DT0xfUE4sIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9TVU1NQVJZLCBzdW1tYXJ5LCBzZWxmLkNPTF9WRVJTSU9OLCB2ZXJzaW9uLCBzZWxmLkNPTF9SRVZJU0lPTiwgcmV2aXNpb24sCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9IT01FUEFHRSwgaG9tZXBhZ2UsIHNlbGYuQ09MX0JVR1RSQUNLRVIsIGJ1Z3RyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9GSUxFLCBmaWxlbmFtZSkKKworICAgICAgICBzZWxmLnBuX3BhdGggPSB7fQorICAgICAgICBpdCA9IHNlbGYuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHBuID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX05BTUUpCisgICAgICAgICAgICBwYXRoID0gc2VsZi5nZXRfcGF0aChpdCkKKyAgICAgICAgICAgIHNlbGYucG5fcGF0aFtwbl0gPSBwYXRoCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisgICAgZGVmIHNldF9pbl9saXN0KHNlbGYsIGl0ZW0sIGRlc2MpOgorICAgICAgICBzZWxmLnNldChzZWxmLmFwcGVuZCgpLCBzZWxmLkNPTF9OQU1FLCBpdGVtLAorICAgICAgICAgICAgICAgICBzZWxmLkNPTF9ERVNDLCBkZXNjLAorICAgICAgICAgICAgICAgICBzZWxmLkNPTF9MSUMsICIiLCBzZWxmLkNPTF9HUk9VUCwgIiIsCisgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0RFUFMsICIiLCBzZWxmLkNPTF9CSU5CLCAiIiwKKyAgICAgICAgICAgICAgICAgc2VsZi5DT0xfVFlQRSwgImltYWdlIiwgc2VsZi5DT0xfSU5DLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgc2VsZi5DT0xfSU1HLCBGYWxzZSwgc2VsZi5DT0xfSU5TVEFMTCwgIiIsIHNlbGYuQ09MX1BOLCBpdGVtLAorICAgICAgICAgICAgICAgICBzZWxmLkNPTF9TVU1NQVJZLCAiIiwgc2VsZi5DT0xfVkVSU0lPTiwgIiIsIHNlbGYuQ09MX1JFVklTSU9OLCAiIiwKKyAgICAgICAgICAgICAgICAgc2VsZi5DT0xfSE9NRVBBR0UsICIiLCBzZWxmLkNPTF9CVUdUUkFDS0VSLCAiIikKKyAgICAgICAgc2VsZi5wbl9wYXRoID0ge30KKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBwbiA9IHNlbGYuZ2V0X3ZhbHVlKGl0LCBzZWxmLkNPTF9OQU1FKQorICAgICAgICAgICAgcGF0aCA9IHNlbGYuZ2V0X3BhdGgoaXQpCisgICAgICAgICAgICBzZWxmLnBuX3BhdGhbcG5dID0gcGF0aAorICAgICAgICAgICAgaXQgPSBzZWxmLml0ZXJfbmV4dChpdCkKKworICAgICIiIgorICAgIFVwZGF0ZSB0aGUgbW9kZWwsIHNlbmQgb3V0IHRoZSBub3RpZmljYXRpb24uCisgICAgIiIiCisgICAgZGVmIHNlbGVjdGlvbl9jaGFuZ2Vfbm90aWZpY2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmVtaXQoInJlY2lwZS1zZWxlY3Rpb24tY2hhbmdlZCIpCisKKyAgICBkZWYgcGF0aF9pbmNsdWRlZChzZWxmLCBpdGVtX3BhdGgpOgorICAgICAgICByZXR1cm4gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0lOQ10KKworICAgICIiIgorICAgIEFkZCB0aGlzIGl0ZW0sIGFuZCBhbnkgb2YgaXRzIGRlcGVuZGVuY2llcywgdG8gdGhlIGltYWdlIGNvbnRlbnRzCisgICAgIiIiCisgICAgZGVmIGluY2x1ZGVfaXRlbShzZWxmLCBpdGVtX3BhdGgsIGJpbmI9IiIsIGltYWdlX2NvbnRlbnRzPUZhbHNlKToKKyAgICAgICAgaWYgc2VsZi5wYXRoX2luY2x1ZGVkKGl0ZW1fcGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpdGVtX25hbWUgPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfTkFNRV0KKyAgICAgICAgaXRlbV9kZXBzID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0RFUFNdCisKKyAgICAgICAgc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0lOQ10gPSBUcnVlCisKKyAgICAgICAgaXRlbV9iaW4gPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfQklOQl0uc3BsaXQoJywgJykKKyAgICAgICAgaWYgYmluYiBhbmQgbm90IGJpbmIgaW4gaXRlbV9iaW46CisgICAgICAgICAgICBpdGVtX2Jpbi5hcHBlbmQoYmluYikKKyAgICAgICAgICAgIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9CSU5CXSA9ICcsICcuam9pbihpdGVtX2JpbikubHN0cmlwKCcsICcpCisKKyAgICAgICAgIyBXZSB3YW50IHRvIGRvIHNvbWUgbWFnaWMgd2l0aCB0aGluZ3Mgd2hpY2ggYXJlIGJyb3VnaHQgaW4gYnkgdGhlCisgICAgICAgICMgYmFzZSBpbWFnZSBzbyB0YWcgdGhlbSBhcyBzbworICAgICAgICBpZiBpbWFnZV9jb250ZW50czoKKyAgICAgICAgICAgIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9JTUddID0gVHJ1ZQorCisgICAgICAgIGlmIGl0ZW1fZGVwczoKKyAgICAgICAgICAgICMgRW5zdXJlIGFsbCBvZiB0aGUgaXRlbXMgZGVwcyBhcmUgaW5jbHVkZWQgYW5kLCB3aGVyZSBhcHByb3ByaWF0ZSwKKyAgICAgICAgICAgICMgYWRkIHRoaXMgaXRlbSB0byB0aGVpciBDT0xfQklOQgorICAgICAgICAgICAgZm9yIGRlcCBpbiBpdGVtX2RlcHMuc3BsaXQoIiAiKToKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBjb250ZW50cyBtb2RlbCBkb2Vzbid0IGFscmVhZHkgY29udGFpbiBkZXAsIGFkZCBpdAorICAgICAgICAgICAgICAgIGRlcF9wYXRoID0gc2VsZi5maW5kX3BhdGhfZm9yX2l0ZW0oZGVwKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkZXBfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBkZXBfaW5jbHVkZWQgPSBzZWxmLnBhdGhfaW5jbHVkZWQoZGVwX3BhdGgpCisKKyAgICAgICAgICAgICAgICBpZiBkZXBfaW5jbHVkZWQgYW5kIG5vdCBkZXAgaW4gaXRlbV9iaW46CisgICAgICAgICAgICAgICAgICAgICMgZG9uJ3Qgc2V0IHRoZSBDT0xfQklOQiB0byB0aGlzIGl0ZW0gaWYgdGhlIHRhcmdldCBpcyBhbgorICAgICAgICAgICAgICAgICAgICAjIGl0ZW0gaW4gb3VyIG93biBDT0xfQklOQgorICAgICAgICAgICAgICAgICAgICBkZXBfYmluID0gc2VsZltkZXBfcGF0aF1bc2VsZi5DT0xfQklOQl0uc3BsaXQoJywgJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGl0ZW1fbmFtZSBpbiBkZXBfYmluOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwX2Jpbi5hcHBlbmQoaXRlbV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltkZXBfcGF0aF1bc2VsZi5DT0xfQklOQl0gPSAnLCAnLmpvaW4oZGVwX2JpbikubHN0cmlwKCcsICcpCisgICAgICAgICAgICAgICAgZWxpZiBub3QgZGVwX2luY2x1ZGVkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVfaXRlbShkZXBfcGF0aCwgYmluYj1pdGVtX25hbWUsIGltYWdlX2NvbnRlbnRzPWltYWdlX2NvbnRlbnRzKQorICAgICAgICBkZXBfYmluID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0JJTkJdLnNwbGl0KCcsICcpCisgICAgICAgIGlmIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9OQU1FXSBpbiBkZXBfYmluOgorICAgICAgICAgICAgZGVwX2Jpbi5yZW1vdmUoc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX05BTUVdKQorICAgICAgICBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfQklOQl0gPSAnLCAnLmpvaW4oZGVwX2JpbikubHN0cmlwKCcsICcpCisKKyAgICBkZWYgZXhjbHVkZV9pdGVtKHNlbGYsIGl0ZW1fcGF0aCk6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhfaW5jbHVkZWQoaXRlbV9wYXRoKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGZbaXRlbV9wYXRoXVtzZWxmLkNPTF9JTkNdID0gRmFsc2UKKworICAgICAgICBpdGVtX25hbWUgPSBzZWxmW2l0ZW1fcGF0aF1bc2VsZi5DT0xfTkFNRV0KKyAgICAgICAgaXRlbV9kZXBzID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0RFUFNdCisgICAgICAgIGlmIGl0ZW1fZGVwczoKKyAgICAgICAgICAgIGZvciBkZXAgaW4gaXRlbV9kZXBzLnNwbGl0KCIgIik6CisgICAgICAgICAgICAgICAgZGVwX3BhdGggPSBzZWxmLmZpbmRfcGF0aF9mb3JfaXRlbShkZXApCisgICAgICAgICAgICAgICAgaWYgbm90IGRlcF9wYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRlcF9iaW4gPSBzZWxmW2RlcF9wYXRoXVtzZWxmLkNPTF9CSU5CXS5zcGxpdCgnLCAnKQorICAgICAgICAgICAgICAgIGlmIGl0ZW1fbmFtZSBpbiBkZXBfYmluOgorICAgICAgICAgICAgICAgICAgICBkZXBfYmluLnJlbW92ZShpdGVtX25hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGZbZGVwX3BhdGhdW3NlbGYuQ09MX0JJTkJdID0gJywgJy5qb2luKGRlcF9iaW4pLmxzdHJpcCgnLCAnKQorCisgICAgICAgIGl0ZW1fYmluID0gc2VsZltpdGVtX3BhdGhdW3NlbGYuQ09MX0JJTkJdLnNwbGl0KCcsICcpCisgICAgICAgIGlmIGl0ZW1fYmluOgorICAgICAgICAgICAgZm9yIGJpbmIgaW4gaXRlbV9iaW46CisgICAgICAgICAgICAgICAgYmluYl9wYXRoID0gc2VsZi5maW5kX3BhdGhfZm9yX2l0ZW0oYmluYikKKyAgICAgICAgICAgICAgICBpZiBub3QgYmluYl9wYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuZXhjbHVkZV9pdGVtKGJpbmJfcGF0aCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBzZWxmLnNldChpdCwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0lOQywgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLkNPTF9CSU5CLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuQ09MX0lNRywgRmFsc2UpCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIHNlbGYuc2VsZWN0aW9uX2NoYW5nZV9ub3RpZmljYXRpb24oKQorCisgICAgIiIiCisgICAgUmV0dXJucyB0d28gbGlzdHMuIE9uZSBvZiB1c2VyIHNlbGVjdGVkIHJlY2lwZXMgYW5kIHRoZSBvdGhlciBjb250YWluaW5nCisgICAgYWxsIHNlbGVjdGVkIHJlY2lwZXMKKyAgICAiIiIKKyAgICBkZWYgZ2V0X3NlbGVjdGVkX3JlY2lwZXMoc2VsZik6CisgICAgICAgIGFsbHJlY2lwZXMgPSBbXQorICAgICAgICB1c2VycmVjaXBlcyA9IFtdCisKKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBpZiBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfSU5DKToKKyAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX1BOKQorICAgICAgICAgICAgICAgIHR5cGUgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfVFlQRSkKKyAgICAgICAgICAgICAgICBpZiB0eXBlICE9ICJpbWFnZSI6CisgICAgICAgICAgICAgICAgICAgIGFsbHJlY2lwZXMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbCA9ICJVc2VyIFNlbGVjdGVkIiBpbiBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfQklOQikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsOgorICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnJlY2lwZXMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICBpdCA9IHNlbGYuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIHJldHVybiBsaXN0KHNldCh1c2VycmVjaXBlcykpLCBsaXN0KHNldChhbGxyZWNpcGVzKSkKKworICAgIGRlZiBzZXRfc2VsZWN0ZWRfcmVjaXBlcyhzZWxmLCByZWNpcGVsaXN0KToKKyAgICAgICAgZm9yIHBuIGluIHJlY2lwZWxpc3Q6CisgICAgICAgICAgICBpZiBwbiBpbiBzZWxmLnBuX3BhdGgua2V5cygpOgorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnBuX3BhdGhbcG5dCisgICAgICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYj0iVXNlciBTZWxlY3RlZCIpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uX2NoYW5nZV9ub3RpZmljYXRpb24oKQorCisgICAgZGVmIGdldF9zZWxlY3RlZF9pbWFnZShzZWxmKToKKyAgICAgICAgaXQgPSBzZWxmLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBpZiBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfSU5DKToKKyAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5nZXRfdmFsdWUoaXQsIHNlbGYuQ09MX1BOKQorICAgICAgICAgICAgICAgIHR5cGUgPSBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfVFlQRSkKKyAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJpbWFnZSI6CisgICAgICAgICAgICAgICAgICAgIHNlbCA9ICJVc2VyIFNlbGVjdGVkIiBpbiBzZWxmLmdldF92YWx1ZShpdCwgc2VsZi5DT0xfQklOQikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUKKyAgICAgICAgICAgIGl0ID0gc2VsZi5pdGVyX25leHQoaXQpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2V0X3NlbGVjdGVkX2ltYWdlKHNlbGYsIGltZyk6CisgICAgICAgIGlmIG5vdCBpbWc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHBhdGggPSBzZWxmLmZpbmRfcGF0aF9mb3JfaXRlbShpbWcpCisgICAgICAgIHNlbGYuaW5jbHVkZV9pdGVtKGl0ZW1fcGF0aD1wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5iPSJVc2VyIFNlbGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfY29udGVudHM9VHJ1ZSkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25fY2hhbmdlX25vdGlmaWNhdGlvbigpCisKKyAgICBkZWYgc2V0X2N1c3RvbV9pbWFnZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBzZWxmLmN1c3RvbV9pbWFnZV92ZXJzaW9uID0gdmVyc2lvbgorCisgICAgZGVmIGdldF9jdXN0b21faW1hZ2VfdmVyc2lvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VzdG9tX2ltYWdlX3ZlcnNpb24KKworICAgIGRlZiBpc19jdXN0b21faW1hZ2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldF9zZWxlY3RlZF9pbWFnZSgpID09IHNlbGYuX19jdXN0b21faW1hZ2VfXwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYnBhZ2VzLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYnBhZ2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmZDM1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaG9icGFnZXMucHkKQEAgLTAsMCArMSwxMjggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBCaXRCYWtlIEdyYXBoaWNhbCBHVEsgVXNlciBJbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyICAgICAgICBJbnRlbCBDb3Jwb3JhdGlvbgorIworIyBBdXRob3JlZCBieSBEb25neGlhbyBYdSA8ZG9uZ3hpYW8ueHVAaW50ZWwuY29tPgorIyBBdXRob3JlZCBieSBTaGFuZSBXYW5nIDxzaGFuZS53YW5nQGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaHdjCisKKyMKKyMgSG9iUGFnZTogdGhlIHN1cGVyIGNsYXNzIGZvciBhbGwgSG9iLXJlbGF0ZWQgcGFnZXMKKyMgICAgCitjbGFzcyBIb2JQYWdlIChndGsuVkJveCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlciwgdGl0bGUgPSBOb25lKToKKyAgICAgICAgc3VwZXIoSG9iUGFnZSwgc2VsZikuX19pbml0X18oRmFsc2UsIDApCisgICAgICAgIHNlbGYuYnVpbGRlciA9IGJ1aWxkZXIKKyAgICAgICAgc2VsZi5idWlsZGVyX3dpZHRoLCBzZWxmLmJ1aWxkZXJfaGVpZ2h0ID0gc2VsZi5idWlsZGVyLnNpemVfcmVxdWVzdCgpCisKKyAgICAgICAgaWYgbm90IHRpdGxlOgorICAgICAgICAgICAgc2VsZi50aXRsZSA9ICJIb2IgLS0gSW1hZ2UgQ3JlYXRvciIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLnRpdGxlX2xhYmVsID0gZ3RrLkxhYmVsKCkKKworICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhID0gZ3RrLlZCb3goRmFsc2UsIDEyKQorICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnNldF9zaXplX3JlcXVlc3Qoc2VsZi5idWlsZGVyX3dpZHRoIC0gNzMgLSA3Mywgc2VsZi5idWlsZGVyX2hlaWdodCAtIDg4IC0gMTUgLSAxNSkKKyAgICAgICAgc2VsZi5ncm91cF9hbGlnbiA9IGd0ay5BbGlnbm1lbnQoeGFsaWduID0gMCwgeWFsaWduPTAuNSwgeHNjYWxlPTEsIHlzY2FsZT0xKQorICAgICAgICBzZWxmLmdyb3VwX2FsaWduLnNldF9wYWRkaW5nKDE1LCAxNSwgNzMsIDczKQorICAgICAgICBzZWxmLmdyb3VwX2FsaWduLmFkZChzZWxmLmJveF9ncm91cF9hcmVhKQorICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnNldF9ob21vZ2VuZW91cyhGYWxzZSkKKworICAgIGRlZiBzZXRfdGl0bGUoc2VsZiwgdGl0bGUpOgorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi50aXRsZV9sYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBzaXplPSd4LWxhcmdlJz4lczwvc3Bhbj4iICUgc2VsZi50aXRsZSkKKworICAgIGRlZiBhZGRfb250b190b3BfYmFyKHNlbGYsIHdpZGdldCA9IE5vbmUsIHBhZGRpbmcgPSAwKToKKyAgICAgICAgIyB0aGUgdG9wIGJ1dHRvbiBvY2N1cGllcyAxLzcgb2YgdGhlIHBhZ2UgaGVpZ2h0CisgICAgICAgICMgc2V0dXAgYW4gZXZlbnQgYm94CisgICAgICAgIGV2ZW50Ym94ID0gZ3RrLkV2ZW50Qm94KCkKKyAgICAgICAgc3R5bGUgPSBldmVudGJveC5nZXRfc3R5bGUoKS5jb3B5KCkKKyAgICAgICAgc3R5bGUuYmdbZ3RrLlNUQVRFX05PUk1BTF0gPSBldmVudGJveC5nZXRfY29sb3JtYXAoKS5hbGxvY19jb2xvcihIb2JDb2xvcnMuTElHSFRfR1JBWSwgRmFsc2UsIEZhbHNlKQorICAgICAgICBldmVudGJveC5zZXRfc3R5bGUoc3R5bGUpCisgICAgICAgIGV2ZW50Ym94LnNldF9zaXplX3JlcXVlc3QoLTEsIDg4KQorCisgICAgICAgIGhib3ggPSBndGsuSEJveCgpCisKKyAgICAgICAgc2VsZi50aXRsZV9sYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIHNlbGYudGl0bGVfbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gc2l6ZT0neC1sYXJnZSc+JXM8L3NwYW4+IiAlIHNlbGYudGl0bGUpCisgICAgICAgIGhib3gucGFja19zdGFydChzZWxmLnRpdGxlX2xhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9MjApCisKKyAgICAgICAgaWYgd2lkZ2V0OgorICAgICAgICAgICAgIyBhZGQgdGhlIHdpZGdldCBpbiB0aGUgZXZlbnQgYm94CisgICAgICAgICAgICBoYm94LnBhY2tfZW5kKHdpZGdldCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlLCBwYWRkaW5nPXBhZGRpbmcpCisgICAgICAgIGV2ZW50Ym94LmFkZChoYm94KQorCisgICAgICAgIHJldHVybiBldmVudGJveAorCisgICAgZGVmIHNwYW5fdGFnKHNlbGYsIHNpemU9Im1lZGl1bSIsIHdlaWdodD0ibm9ybWFsIiwgZm9yZ3JvdW5kPSIjMWMxYzFjIik6CisgICAgICAgIHNwYW5fdGFnID0gIndlaWdodD0nJXMnIGZvcmVncm91bmQ9JyVzJyBzaXplPSclcyciICUgKHdlaWdodCwgZm9yZ3JvdW5kLCBzaXplKQorICAgICAgICByZXR1cm4gc3Bhbl90YWcKKworICAgIGRlZiBhcHBlbmRfdG9vbGJhcl9idXR0b24oc2VsZiwgdG9vbGJhciwgYnV0dG9ubmFtZSwgaWNvbl9kaXNwLCBpY29uX2hvdm9yLCB0aXAsIGNiKToKKyAgICAgICAgIyBDcmVhdGUgYSBidXR0b24gYW5kIGFwcGVuZCBpdCBvbiB0aGUgdG9vbGJhciBhY2NvcmRpbmcgdG8gYnV0dG9uIG5hbWUKKyAgICAgICAgaWNvbiA9IGd0ay5JbWFnZSgpCisgICAgICAgIGljb25fZGlzcGxheSA9IGljb25fZGlzcAorICAgICAgICBpY29uX2hvdmVyID0gaWNvbl9ob3ZvcgorICAgICAgICBwaXhfYnVmZmVyID0gZ3RrLmdkay5waXhidWZfbmV3X2Zyb21fZmlsZShpY29uX2Rpc3BsYXkpCisgICAgICAgIGljb24uc2V0X2Zyb21fcGl4YnVmKHBpeF9idWZmZXIpCisgICAgICAgIHRpcF90ZXh0ID0gdGlwCisgICAgICAgIGJ1dHRvbiA9IHRvb2xiYXIuYXBwZW5kX2l0ZW0oYnV0dG9ubmFtZSwgdGlwLCBOb25lLCBpY29uLCBjYikKKyAgICAgICAgcmV0dXJuIGJ1dHRvbgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfc2l6ZV90b19zdHJpbmcoc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzaXplOgorICAgICAgICAgICAgICAgIHNpemVfc3RyID0gIjAgQiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGVuKHN0cihpbnQoc2l6ZSkpKSA+IDY6CisgICAgICAgICAgICAgICAgICAgIHNpemVfc3RyID0gJyUuMWYnICUgKHNpemUqMS4wLygxMDI0KjEwMjQpKSArICcgTUInCisgICAgICAgICAgICAgICAgZWxpZiBsZW4oc3RyKGludChzaXplKSkpID4gMzoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV9zdHIgPSAnJS4xZicgJSAoc2l6ZSoxLjAvMTAyNCkgKyAnIEtCJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNpemVfc3RyID0gc3RyKHNpemUpICsgJyBCJworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzaXplX3N0ciA9ICIwIEIiCisgICAgICAgIHJldHVybiBzaXplX3N0cgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfc3RyaW5nX3RvX3NpemUoc3RyX3NpemUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc3RyX3NpemU6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdW5pdCA9IHN0cl9zaXplLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBpZiBsZW4odW5pdCkgPiAxOgorICAgICAgICAgICAgICAgICAgICBpZiB1bml0WzFdID09ICdNQic6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gZmxvYXQodW5pdFswXSkqMTAyNCoxMDI0CisgICAgICAgICAgICAgICAgICAgIGVsaWYgdW5pdFsxXSA9PSAnS0InOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGZsb2F0KHVuaXRbMF0pKjEwMjQKKyAgICAgICAgICAgICAgICAgICAgZWxpZiB1bml0WzFdID09ICdCJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBmbG9hdCh1bml0WzBdKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzaXplID0gZmxvYXQodW5pdFswXSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2l6ZSA9IDAKKyAgICAgICAgcmV0dXJuIHNpemUKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2hvYndpZGdldC5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2J3aWRnZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NjljMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9ob2J3aWRnZXQucHkKQEAgLTAsMCArMSw5MDQgQEAKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMS0yMDEyICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgoraW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKK2ltcG9ydCBwYW5nbywgcGFuZ29jYWlybworaW1wb3J0IGNhaXJvCitpbXBvcnQgbWF0aAorCitmcm9tIGJiLnVpLmNydW1icy5ob2Jjb2xvciBpbXBvcnQgSG9iQ29sb3JzCitmcm9tIGJiLnVpLmNydW1icy5wZXJzaXN0ZW50dG9vbHRpcCBpbXBvcnQgUGVyc2lzdGVudFRvb2x0aXAKKworY2xhc3MgaHdjOgorCisgICAgTUFJTl9XSU5fV0lEVEggICA9IDEwMjQKKyAgICBNQUlOX1dJTl9IRUlHSFQgID0gNzAwCisKK2NsYXNzIGhpYzoKKworICAgIEhPQl9JQ09OX0JBU0VfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpLCAoInVpL2ljb25zLyIpKQorCisgICAgSUNPTl9SQ0lQRV9ESVNQTEFZX0ZJTEUgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgncmVjaXBlL3JlY2lwZV9kaXNwbGF5LnBuZycpKQorICAgIElDT05fUkNJUEVfSE9WRVJfRklMRSAgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ3JlY2lwZS9yZWNpcGVfaG92ZXIucG5nJykpCisgICAgSUNPTl9QQUNLQUdFU19ESVNQTEFZX0ZJTEUgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgncGFja2FnZXMvcGFja2FnZXNfZGlzcGxheS5wbmcnKSkKKyAgICBJQ09OX1BBQ0tBR0VTX0hPVkVSX0ZJTEUgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdwYWNrYWdlcy9wYWNrYWdlc19ob3Zlci5wbmcnKSkKKyAgICBJQ09OX0xBWUVSU19ESVNQTEFZX0ZJTEUgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdsYXllcnMvbGF5ZXJzX2Rpc3BsYXkucG5nJykpCisgICAgSUNPTl9MQVlFUlNfSE9WRVJfRklMRSAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnbGF5ZXJzL2xheWVyc19ob3Zlci5wbmcnKSkKKyAgICBJQ09OX0lNQUdFU19ESVNQTEFZX0ZJTEUgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbWFnZXMvaW1hZ2VzX2Rpc3BsYXkucG5nJykpCisgICAgSUNPTl9JTUFHRVNfSE9WRVJfRklMRSAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnaW1hZ2VzL2ltYWdlc19ob3Zlci5wbmcnKSkKKyAgICBJQ09OX1NFVFRJTkdTX0RJU1BMQVlfRklMRSAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdzZXR0aW5ncy9zZXR0aW5nc19kaXNwbGF5LnBuZycpKQorICAgIElDT05fU0VUVElOR1NfSE9WRVJfRklMRSAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ3NldHRpbmdzL3NldHRpbmdzX2hvdmVyLnBuZycpKQorICAgIElDT05fSU5GT19ESVNQTEFZX0ZJTEUgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZm8vaW5mb19kaXNwbGF5LnBuZycpKQorICAgIElDT05fSU5GT19IT1ZFUl9GSUxFICAgICAgICAgID0gb3MucGF0aC5qb2luKEhPQl9JQ09OX0JBU0VfRElSLCAoJ2luZm8vaW5mb19ob3Zlci5wbmcnKSkKKyAgICBJQ09OX0lORElfQ09ORklSTV9GSUxFICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL2NvbmZpcm1hdGlvbi5wbmcnKSkKKyAgICBJQ09OX0lORElfRVJST1JfRklMRSAgICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL2RlbmllZC5wbmcnKSkKKyAgICBJQ09OX0lORElfUkVNT1ZFX0ZJTEUgICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL3JlbW92ZS5wbmcnKSkKKyAgICBJQ09OX0lORElfUkVNT1ZFX0hPVkVSX0ZJTEUgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL3JlbW92ZS1ob3Zlci5wbmcnKSkKKyAgICBJQ09OX0lORElfQUREX0ZJTEUgICAgICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL2FkZC5wbmcnKSkKKyAgICBJQ09OX0lORElfQUREX0hPVkVSX0ZJTEUgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL2FkZC1ob3Zlci5wbmcnKSkKKyAgICBJQ09OX0lORElfUkVGUkVTSF9GSUxFICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL3JlZnJlc2gucG5nJykpCisgICAgSUNPTl9JTkRJX0FMRVJUX0ZJTEUgICAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnaW5kaWNhdG9ycy9hbGVydC5wbmcnKSkKKyAgICBJQ09OX0lORElfVElDS19GSUxFICAgICAgICAgICA9IG9zLnBhdGguam9pbihIT0JfSUNPTl9CQVNFX0RJUiwgKCdpbmRpY2F0b3JzL3RpY2sucG5nJykpCisgICAgSUNPTl9JTkRJX0lORk9fRklMRSAgICAgICAgICAgPSBvcy5wYXRoLmpvaW4oSE9CX0lDT05fQkFTRV9ESVIsICgnaW5kaWNhdG9ycy9pbmZvLnBuZycpKQorCitjbGFzcyBIb2JWaWV3VGFibGUgKGd0ay5WQm94KToKKyAgICAiIiIKKyAgICBBIFZCb3ggdG8gY29udGFpbiB0aGUgdGFibGUgZm9yIGRpZmZlcmVudCByZWNpcGUgdmlld3MgYW5kIHBhY2thZ2UgdmlldworICAgICIiIgorICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgICJ0b2dnbGVkIiAgICAgICA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICJyb3ctYWN0aXZhdGVkIiA6IChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgImNlbGwtZmFkZWlub3V0LXN0b3BwZWQiIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2x1bW5zLCBuYW1lKToKKyAgICAgICAgZ3RrLlZCb3guX19pbml0X18oc2VsZiwgRmFsc2UsIDYpCisgICAgICAgIHNlbGYudGFibGVfdHJlZSA9IGd0ay5UcmVlVmlldygpCisgICAgICAgIHNlbGYudGFibGVfdHJlZS5zZXRfaGVhZGVyc192aXNpYmxlKFRydWUpCisgICAgICAgIHNlbGYudGFibGVfdHJlZS5zZXRfaGVhZGVyc19jbGlja2FibGUoVHJ1ZSkKKyAgICAgICAgc2VsZi50YWJsZV90cmVlLnNldF9ydWxlc19oaW50KFRydWUpCisgICAgICAgIHNlbGYudGFibGVfdHJlZS5zZXRfZW5hYmxlX3RyZWVfbGluZXMoVHJ1ZSkKKyAgICAgICAgc2VsZi50YWJsZV90cmVlLmdldF9zZWxlY3Rpb24oKS5zZXRfbW9kZShndGsuU0VMRUNUSU9OX1NJTkdMRSkKKyAgICAgICAgc2VsZi50b2dnbGVfY29sdW1ucyA9IFtdCisgICAgICAgIHNlbGYudGFibGVfdHJlZS5jb25uZWN0KCJyb3ctYWN0aXZhdGVkIiwgc2VsZi5yb3dfYWN0aXZhdGVkX2NiKQorICAgICAgICBzZWxmLnRvcF9iYXIgPSBOb25lCisgICAgICAgIHNlbGYudGFiX25hbWUgPSBuYW1lCisKKyAgICAgICAgZm9yIGksIGNvbHVtbiBpbiBlbnVtZXJhdGUoY29sdW1ucyk6CisgICAgICAgICAgICBjb2xfbmFtZSA9IGNvbHVtblsnY29sX25hbWUnXQorICAgICAgICAgICAgY29sID0gZ3RrLlRyZWVWaWV3Q29sdW1uKGNvbF9uYW1lKQorICAgICAgICAgICAgY29sLnNldF9jbGlja2FibGUoVHJ1ZSkKKyAgICAgICAgICAgIGNvbC5zZXRfcmVzaXphYmxlKFRydWUpCisgICAgICAgICAgICBpZiBzZWxmLnRhYl9uYW1lLnN0YXJ0c3dpdGgoJ0luY2x1ZGVkJyk6CisgICAgICAgICAgICAgICAgaWYgY29sX25hbWUhPSdJbmNsdWRlZCc6CisgICAgICAgICAgICAgICAgICAgIGNvbC5zZXRfc29ydF9jb2x1bW5faWQoY29sdW1uWydjb2xfaWQnXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29sLnNldF9zb3J0X2NvbHVtbl9pZChjb2x1bW5bJ2NvbF9pZCddKQorICAgICAgICAgICAgaWYgJ2NvbF9taW4nIGluIGNvbHVtbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgY29sLnNldF9taW5fd2lkdGgoY29sdW1uWydjb2xfbWluJ10pCisgICAgICAgICAgICBpZiAnY29sX21heCcgaW4gY29sdW1uLmtleXMoKToKKyAgICAgICAgICAgICAgICBjb2wuc2V0X21heF93aWR0aChjb2x1bW5bJ2NvbF9tYXgnXSkKKyAgICAgICAgICAgIGlmICdleHBhbmQnIGluIGNvbHVtbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgY29sLnNldF9leHBhbmQoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYudGFibGVfdHJlZS5hcHBlbmRfY29sdW1uKGNvbCkKKworICAgICAgICAgICAgaWYgKG5vdCAnY29sX3N0eWxlJyBpbiBjb2x1bW4ua2V5cygpKSBvciBjb2x1bW5bJ2NvbF9zdHlsZSddID09ICd0ZXh0JzoKKyAgICAgICAgICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICAgICAgICAgIGNvbC5wYWNrX3N0YXJ0KGNlbGwsIFRydWUpCisgICAgICAgICAgICAgICAgY29sLnNldF9hdHRyaWJ1dGVzKGNlbGwsIHRleHQ9Y29sdW1uWydjb2xfaWQnXSkKKyAgICAgICAgICAgICAgICBpZiAnY29sX3RfaWQnIGluIGNvbHVtbi5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGNvbC5hZGRfYXR0cmlidXRlKGNlbGwsICdmb250JywgY29sdW1uWydjb2xfdF9pZCddKQorICAgICAgICAgICAgZWxpZiBjb2x1bW5bJ2NvbF9zdHlsZSddID09ICdjaGVjayB0b2dnbGUnOgorICAgICAgICAgICAgICAgIGNlbGwgPSBIb2JDZWxsUmVuZGVyZXJUb2dnbGUoKQorICAgICAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCdhY3RpdmF0YWJsZScsIFRydWUpCisgICAgICAgICAgICAgICAgY2VsbC5jb25uZWN0KCJ0b2dnbGVkIiwgc2VsZi50b2dnbGVkX2NiLCBpLCBzZWxmLnRhYmxlX3RyZWUpCisgICAgICAgICAgICAgICAgY2VsbC5jb25uZWN0X3JlbmRlcl9zdGF0ZV9jaGFuZ2VkKHNlbGYuc3RvcF9jZWxsX2ZhZGVpbm91dF9jYiwgc2VsZi50YWJsZV90cmVlKQorICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlX2lkID0gaQorICAgICAgICAgICAgICAgIGNvbC5wYWNrX2VuZChjZWxsLCBUcnVlKQorICAgICAgICAgICAgICAgIGNvbC5zZXRfYXR0cmlidXRlcyhjZWxsLCBhY3RpdmU9Y29sdW1uWydjb2xfaWQnXSkKKyAgICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9jb2x1bW5zLmFwcGVuZChjb2xfbmFtZSkKKyAgICAgICAgICAgICAgICBpZiAnY29sX2dyb3VwJyBpbiBjb2x1bW4ua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBjb2wuc2V0X2NlbGxfZGF0YV9mdW5jKGNlbGwsIHNlbGYuc2V0X2dyb3VwX251bWJlcl9jYikKKyAgICAgICAgICAgIGVsaWYgY29sdW1uWydjb2xfc3R5bGUnXSA9PSAncmFkaW8gdG9nZ2xlJzoKKyAgICAgICAgICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRvZ2dsZSgpCisgICAgICAgICAgICAgICAgY2VsbC5zZXRfcHJvcGVydHkoJ2FjdGl2YXRhYmxlJywgVHJ1ZSkKKyAgICAgICAgICAgICAgICBjZWxsLnNldF9yYWRpbyhUcnVlKQorICAgICAgICAgICAgICAgIGNlbGwuY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYudG9nZ2xlZF9jYiwgaSwgc2VsZi50YWJsZV90cmVlKQorICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlX2lkID0gaQorICAgICAgICAgICAgICAgIGNvbC5wYWNrX2VuZChjZWxsLCBUcnVlKQorICAgICAgICAgICAgICAgIGNvbC5zZXRfYXR0cmlidXRlcyhjZWxsLCBhY3RpdmU9Y29sdW1uWydjb2xfaWQnXSkKKyAgICAgICAgICAgICAgICBzZWxmLnRvZ2dsZV9jb2x1bW5zLmFwcGVuZChjb2xfbmFtZSkKKyAgICAgICAgICAgIGVsaWYgY29sdW1uWydjb2xfc3R5bGUnXSA9PSAnYmluYic6CisgICAgICAgICAgICAgICAgY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgICAgICAgICBjb2wucGFja19zdGFydChjZWxsLCBUcnVlKQorICAgICAgICAgICAgICAgIGNvbC5zZXRfY2VsbF9kYXRhX2Z1bmMoY2VsbCwgc2VsZi5kaXNwbGF5X2JpbmJfY2IsIGNvbHVtblsnY29sX2lkJ10pCisgICAgICAgICAgICAgICAgaWYgJ2NvbF90X2lkJyBpbiBjb2x1bW4ua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBjb2wuYWRkX2F0dHJpYnV0ZShjZWxsLCAnZm9udCcsIGNvbHVtblsnY29sX3RfaWQnXSkKKworICAgICAgICBzZWxmLnNjcm9sbCA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgIHNlbGYuc2Nyb2xsLnNldF9wb2xpY3koZ3RrLlBPTElDWV9ORVZFUiwgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNlbGYuc2Nyb2xsLmFkZChzZWxmLnRhYmxlX3RyZWUpCisKKyAgICAgICAgc2VsZi5wYWNrX2VuZChzZWxmLnNjcm9sbCwgVHJ1ZSwgVHJ1ZSwgMCkKKworICAgIGRlZiBhZGRfbm9fcmVzdWx0X2JhcihzZWxmLCBlbnRyeSk6CisgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLktIQUtJCisgICAgICAgIHNlbGYudG9wX2JhciA9IGd0ay5FdmVudEJveCgpCisgICAgICAgIHNlbGYudG9wX2Jhci5zZXRfc2l6ZV9yZXF1ZXN0KC0xLCA3MCkKKyAgICAgICAgc2VsZi50b3BfYmFyLm1vZGlmeV9iZyhndGsuU1RBVEVfTk9STUFMLCBndGsuZ2RrLmNvbG9yX3BhcnNlKGNvbG9yKSkKKyAgICAgICAgc2VsZi50b3BfYmFyLnNldF9mbGFncyhndGsuQ0FOX0RFRkFVTFQpCisgICAgICAgIHNlbGYudG9wX2Jhci5ncmFiX2RlZmF1bHQoKQorCisgICAgICAgIG5vX3Jlc3VsdF90YWIgPSBndGsuVGFibGUoNSwgMjAsIFRydWUpCisgICAgICAgIHNlbGYudG9wX2Jhci5hZGQobm9fcmVzdWx0X3RhYikKKworICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIHRpdGxlID0gIk5vIHJlc3VsdHMgbWF0Y2hpbmcgeW91ciBzZWFyY2giCisgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxzcGFuIHNpemU9J3gtbGFyZ2UnPjxiPiVzPC9iPjwvc3Bhbj4iICUgdGl0bGUpCisgICAgICAgIG5vX3Jlc3VsdF90YWIuYXR0YWNoKGxhYmVsLCAxLCAxNCwgMSwgNCkKKworICAgICAgICBjbGVhcl9idXR0b24gPSBIb2JCdXR0b24oIkNsZWFyIHNlYXJjaCIpCisgICAgICAgIGNsZWFyX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJDbGVhciBzZWFyY2ggcXVlcnkiKQorICAgICAgICBjbGVhcl9idXR0b24uY29ubmVjdCgnY2xpY2tlZCcsIHNlbGYuc2V0X3NlYXJjaF9lbnRyeV9jbGVhcl9jYiwgZW50cnkpCisgICAgICAgIG5vX3Jlc3VsdF90YWIuYXR0YWNoKGNsZWFyX2J1dHRvbiwgMTYsIDE5LCAxLCA0KQorCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLnRvcF9iYXIsIEZhbHNlLCBUcnVlLCAxMikKKyAgICAgICAgc2VsZi50b3BfYmFyLnNob3dfYWxsKCkKKworICAgIGRlZiBzZXRfc2VhcmNoX2VudHJ5X2NsZWFyX2NiKHNlbGYsIGJ1dHRvbiwgc2VhcmNoKToKKyAgICAgICAgaWYgc2VhcmNoLmdldF9lZGl0YWJsZSgpID09IFRydWU6CisgICAgICAgICAgICBzZWFyY2guc2V0X3RleHQoIiIpCisgICAgICAgIHNlYXJjaC5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBGYWxzZSkKKyAgICAgICAgc2VhcmNoLmdyYWJfZm9jdXMoKQorCisgICAgZGVmIGRpc3BsYXlfYmluYl9jYihzZWxmLCBjb2wsIGNlbGwsIG1vZGVsLCBpdCwgY29sX2lkKToKKyAgICAgICAgYmluYiA9ICBtb2RlbC5nZXRfdmFsdWUoaXQsIGNvbF9pZCkKKyAgICAgICAgIyBKdXN0IGRpc3BsYXkgdGhlIGZpcnN0IGl0ZW0KKyAgICAgICAgaWYgYmluYjoKKyAgICAgICAgICAgIGJpbiA9IGJpbmIuc3BsaXQoJywgJykKKyAgICAgICAgICAgIHRvdGFsX25vID0gbGVuKGJpbikKKyAgICAgICAgICAgIGlmIHRvdGFsX25vID4gMSBhbmQgYmluWzBdID09ICJVc2VyIFNlbGVjdGVkIjoKKyAgICAgICAgICAgICAgICBpZiB0b3RhbF9ubyA+IDI6CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRfYmluYiA9IGJpblsxXSArICcgKCsnICsgc3RyKHRvdGFsX25vIC0gMSkgKyAnKScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmVzZW50X2JpbmIgPSBiaW5bMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgdG90YWxfbm8gPiAxOgorICAgICAgICAgICAgICAgICAgICBwcmVzZW50X2JpbmIgPSBiaW5bMF0gKyAnICgrJyArIHN0cih0b3RhbF9ubyAtIDEpICsgJyknCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJlc2VudF9iaW5iID0gYmluWzBdCisgICAgICAgICAgICBjZWxsLnNldF9wcm9wZXJ0eSgndGV4dCcsIHByZXNlbnRfYmluYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNlbGwuc2V0X3Byb3BlcnR5KCd0ZXh0JywgIiIpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X21vZGVsKHNlbGYsIHRyZWVfbW9kZWwpOgorICAgICAgICBzZWxmLnRhYmxlX3RyZWUuc2V0X21vZGVsKHRyZWVfbW9kZWwpCisKKyAgICBkZWYgdG9nZ2xlX2RlZmF1bHQoc2VsZik6CisgICAgICAgIG1vZGVsID0gc2VsZi50YWJsZV90cmVlLmdldF9tb2RlbCgpCisgICAgICAgIGlmIG5vdCBtb2RlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpdGVyID0gbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICBpZiBpdGVyOgorICAgICAgICAgICAgcm93cGF0aCA9IG1vZGVsLmdldF9wYXRoKGl0ZXIpCisgICAgICAgICAgICBtb2RlbFtyb3dwYXRoXVtzZWxmLnRvZ2dsZV9pZF0gPSBUcnVlCisKKyAgICBkZWYgdG9nZ2xlZF9jYihzZWxmLCBjZWxsLCBwYXRoLCBjb2x1bW5pZCwgdHJlZSk6CisgICAgICAgIHNlbGYuZW1pdCgidG9nZ2xlZCIsIGNlbGwsIHBhdGgsIGNvbHVtbmlkLCB0cmVlKQorCisgICAgZGVmIHJvd19hY3RpdmF0ZWRfY2Ioc2VsZiwgdHJlZSwgcGF0aCwgdmlld19jb2x1bW4pOgorICAgICAgICBpZiBub3Qgdmlld19jb2x1bW4uZ2V0X3RpdGxlKCkgaW4gc2VsZi50b2dnbGVfY29sdW1uczoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgicm93LWFjdGl2YXRlZCIsIHRyZWUuZ2V0X21vZGVsKCksIHBhdGgpCisKKyAgICBkZWYgc3RvcF9jZWxsX2ZhZGVpbm91dF9jYihzZWxmLCBjdHJsLCBjZWxsLCB0cmVlKToKKyAgICAgICAgc2VsZi5lbWl0KCJjZWxsLWZhZGVpbm91dC1zdG9wcGVkIiwgY3RybCwgY2VsbCwgdHJlZSkKKworICAgIGRlZiBzZXRfZ3JvdXBfbnVtYmVyX2NiKHNlbGYsIGNvbCwgY2VsbCwgbW9kZWwsIGl0ZXIpOgorICAgICAgICBpZiBtb2RlbCBhbmQgKG1vZGVsLml0ZXJfcGFyZW50KGl0ZXIpID09IE5vbmUpOgorICAgICAgICAgICAgY2VsbC5jZWxsX2F0dHJbIm51bWJlcl9vZl9jaGlsZHJlbiJdID0gbW9kZWwuaXRlcl9uX2NoaWxkcmVuKGl0ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjZWxsLmNlbGxfYXR0clsibnVtYmVyX29mX2NoaWxkcmVuIl0gPSAwCisKKyAgICBkZWYgY29ubmVjdF9ncm91cF9zZWxlY3Rpb24oc2VsZiwgY2JfZnVuYyk6CisgICAgICAgIHNlbGYudGFibGVfdHJlZS5nZXRfc2VsZWN0aW9uKCkuY29ubmVjdCgiY2hhbmdlZCIsIGNiX2Z1bmMpCisKKyIiIgorQSBtZXRob2QgdG8gY2FsY3VsYXRlIGEgc29mdGVuZWQgdmFsdWUgZm9yIHRoZSBjb2xvdXIgb2Ygd2lkZ2V0IHdoZW4gaW4gdGhlCitwcm92aWRlZCBzdGF0ZS4KKword2lkZ2V0OiB0aGUgd2lkZ2V0IHdob3NlIHN0eWxlIHRvIHVzZQorc3RhdGU6IHRoZSBzdGF0ZSBvZiB0aGUgd2lkZ2V0IHRvIHVzZSB0aGUgc3R5bGUgZm9yCisKK1JldHVybnMgYSBzdHJpbmcgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzb2Z0ZW5lZCBjb2xvdXIKKyIiIgorZGVmIHNvZnRlbl9jb2xvcih3aWRnZXQsIHN0YXRlPWd0ay5TVEFURV9OT1JNQUwpOgorICAgICMgdGhpcyBjb2xvdXIgbXVuZ2luZyByb3V0aW5lIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnUgZ2R1X3V0aWxfZ2V0X21peF9jb2xvcigpCisgICAgIyBmcm9tIGdub21lLWRpc2stdXRpbGl0eToKKyAgICAjIGh0dHA6Ly9naXQuZ25vbWUub3JnL2Jyb3dzZS9nbm9tZS1kaXNrLXV0aWxpdHkvdHJlZS9zcmMvZ2R1LWd0ay9nZHUtZ3RrLmM/aD1nbm9tZS0zLTAKKyAgICBibGVuZCA9IDAuNworICAgIHN0eWxlID0gd2lkZ2V0LmdldF9zdHlsZSgpCisgICAgY29sb3IgPSBzdHlsZS50ZXh0W3N0YXRlXQorICAgIGNvbG9yLnJlZCA9IGNvbG9yLnJlZCAqIGJsZW5kICsgc3R5bGUuYmFzZVtzdGF0ZV0ucmVkICogKDEuMCAtIGJsZW5kKQorICAgIGNvbG9yLmdyZWVuID0gY29sb3IuZ3JlZW4gKiBibGVuZCArIHN0eWxlLmJhc2Vbc3RhdGVdLmdyZWVuICogKDEuMCAtIGJsZW5kKQorICAgIGNvbG9yLmJsdWUgPSBjb2xvci5ibHVlICogYmxlbmQgKyBzdHlsZS5iYXNlW3N0YXRlXS5ibHVlICogKDEuMCAtIGJsZW5kKQorICAgIHJldHVybiBjb2xvci50b19zdHJpbmcoKQorCitjbGFzcyBCYXNlSG9iQnV0dG9uKGd0ay5CdXR0b24pOgorICAgICIiIgorICAgIEEgZ3RrLkJ1dHRvbiBzdWJjbGFzcyB3aGljaCBmb2xsb3dzIHRoZSB2aXN1YWwgZGVzaWduIG9mIEhvYiBmb3IgcHJpbWFyeQorICAgIGFjdGlvbiBidXR0b25zCisKKyAgICBsYWJlbDogdGhlIHRleHQgdG8gZGlzcGxheSBhcyB0aGUgYnV0dG9uJ3MgbGFiZWwKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWwpOgorICAgICAgICBndGsuQnV0dG9uLl9faW5pdF9fKHNlbGYsIGxhYmVsKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKHNlbGYpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHN0eWxlX2J1dHRvbihidXR0b24pOgorICAgICAgICBzdHlsZSA9IGJ1dHRvbi5nZXRfc3R5bGUoKQorICAgICAgICBzdHlsZSA9IGd0ay5yY19nZXRfc3R5bGVfYnlfcGF0aHMoZ3RrLnNldHRpbmdzX2dldF9kZWZhdWx0KCksICdndGstYnV0dG9uJywgJ2d0ay1idXR0b24nLCBnb2JqZWN0LlRZUEVfTk9ORSkKKworICAgICAgICBidXR0b24uc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgYnV0dG9uLmdyYWJfZGVmYXVsdCgpCisKKyMgICAgICAgIGxhYmVsID0gIjxzcGFuIHNpemU9J3gtbGFyZ2UnPjxiPiVzPC9iPjwvc3Bhbj4iICUgZ29iamVjdC5tYXJrdXBfZXNjYXBlX3RleHQoYnV0dG9uLmdldF9sYWJlbCgpKQorICAgICAgICBsYWJlbCA9IGJ1dHRvbi5nZXRfbGFiZWwoKQorICAgICAgICBidXR0b24uc2V0X2xhYmVsKGxhYmVsKQorICAgICAgICBidXR0b24uY2hpbGQuc2V0X3VzZV9tYXJrdXAoVHJ1ZSkKKworY2xhc3MgSG9iQnV0dG9uKEJhc2VIb2JCdXR0b24pOgorICAgICIiIgorICAgIEEgZ3RrLkJ1dHRvbiBzdWJjbGFzcyB3aGljaCBmb2xsb3dzIHRoZSB2aXN1YWwgZGVzaWduIG9mIEhvYiBmb3IgcHJpbWFyeQorICAgIGFjdGlvbiBidXR0b25zCisKKyAgICBsYWJlbDogdGhlIHRleHQgdG8gZGlzcGxheSBhcyB0aGUgYnV0dG9uJ3MgbGFiZWwKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWwpOgorICAgICAgICBCYXNlSG9iQnV0dG9uLl9faW5pdF9fKHNlbGYsIGxhYmVsKQorICAgICAgICBIb2JCdXR0b24uc3R5bGVfYnV0dG9uKHNlbGYpCisKK2NsYXNzIEhvYkFsdEJ1dHRvbihCYXNlSG9iQnV0dG9uKToKKyAgICAiIiIKKyAgICBBIGd0ay5CdXR0b24gc3ViY2xhc3Mgd2hpY2ggaGFzIG5vIHJlbGllZiwgYW5kIHNvIGlzIG1vcmUgZGlzY3JldGUKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWwpOgorICAgICAgICBCYXNlSG9iQnV0dG9uLl9faW5pdF9fKHNlbGYsIGxhYmVsKQorICAgICAgICBIb2JBbHRCdXR0b24uc3R5bGVfYnV0dG9uKHNlbGYpCisKKyAgICAiIiIKKyAgICBBIGNhbGxiYWNrIGZvciB0aGUgc3RhdGUtY2hhbmdlZCBldmVudCB0byBlbnN1cmUgdGhlIHRleHQgaXMgZGlzcGxheWVkCisgICAgZGlmZmVyZW50bHkgd2hlbiB0aGUgd2lkZ2V0IGlzIG5vdCBzZW5zaXRpdmUKKyAgICAiIiIKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGRlc2Vuc2l0aXNlX29uX3N0YXRlX2NoYW5nZV9jYihidXR0b24sIHN0YXRlKToKKyAgICAgICAgaWYgbm90IGJ1dHRvbi5nZXRfcHJvcGVydHkoInNlbnNpdGl2ZSIpOgorICAgICAgICAgICAgSG9iQWx0QnV0dG9uLnNldF90ZXh0KGJ1dHRvbiwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBIb2JBbHRCdXR0b24uc2V0X3RleHQoYnV0dG9uLCBUcnVlKQorCisgICAgIiIiCisgICAgU2V0IHRoZSBidXR0b24gbGFiZWwgd2l0aCBhbiBhcHByb3ByaWF0ZSBjb2xvdXIgZm9yIHRoZSBjdXJyZW50IHdpZGdldCBzdGF0ZQorICAgICIiIgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc2V0X3RleHQoYnV0dG9uLCBzZW5zaXRpdmU9VHJ1ZSk6CisgICAgICAgIGlmIHNlbnNpdGl2ZToKKyAgICAgICAgICAgIGNvbG91ciA9IEhvYkNvbG9ycy5QQUxFX0JMVUUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbG91ciA9IEhvYkNvbG9ycy5MSUdIVF9HUkFZCisgICAgICAgIGJ1dHRvbi5zZXRfbGFiZWwoIjxzcGFuIHNpemU9J2xhcmdlJyBjb2xvcj0nJXMnPjxiPiVzPC9iPjwvc3Bhbj4iICUgKGNvbG91ciwgZ29iamVjdC5tYXJrdXBfZXNjYXBlX3RleHQoYnV0dG9uLnRleHQpKSkKKyAgICAgICAgYnV0dG9uLmNoaWxkLnNldF91c2VfbWFya3VwKFRydWUpCisKK2NsYXNzIEhvYkltYWdlQnV0dG9uKGd0ay5CdXR0b24pOgorICAgICIiIgorICAgIEEgZ3RrLkJ1dHRvbiB3aXRoIGFuIGljb24gYW5kIHR3byByb3dzIG9mIHRleHQsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggaXMKKyAgICBkaXNwbGF5ZWQgaW4gYSBibGVuZGVkIGNvbG91ci4KKworICAgIHByaW1hcnlfdGV4dDogdGhlIG1haW4gYnV0dG9uIGxhYmVsCisgICAgc2Vjb25kYXJ5X3RleHQ6IG9wdGlvbmFsIHNlY29uZCBsaW5lIG9mIHRleHQKKyAgICBpY29uX3BhdGg6IHBhdGggdG8gdGhlIGljb24gZmlsZSB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJpbWFyeV90ZXh0LCBzZWNvbmRhcnlfdGV4dD0iIiwgaWNvbl9wYXRoPSIiLCBob3Zlcl9pY29uX3BhdGg9IiIpOgorICAgICAgICBndGsuQnV0dG9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuc2V0X3JlbGllZihndGsuUkVMSUVGX05PTkUpCisKKyAgICAgICAgc2VsZi5pY29uX3BhdGggPSBpY29uX3BhdGgKKyAgICAgICAgc2VsZi5ob3Zlcl9pY29uX3BhdGggPSBob3Zlcl9pY29uX3BhdGgKKworICAgICAgICBoYm94ID0gZ3RrLkhCb3goRmFsc2UsIDEwKQorICAgICAgICBoYm94LnNob3coKQorICAgICAgICBzZWxmLmFkZChoYm94KQorICAgICAgICBzZWxmLmljb24gPSBndGsuSW1hZ2UoKQorICAgICAgICBzZWxmLmljb24uc2V0X2Zyb21fZmlsZShzZWxmLmljb25fcGF0aCkKKyAgICAgICAgc2VsZi5pY29uLnNldF9hbGlnbm1lbnQoMC41LCAwLjApCisgICAgICAgIHNlbGYuaWNvbi5zaG93KCkKKyAgICAgICAgaWYgc2VsZi5ob3Zlcl9pY29uX3BhdGggYW5kIGxlbihzZWxmLmhvdmVyX2ljb25fcGF0aCk6CisgICAgICAgICAgICBzZWxmLmNvbm5lY3QoImVudGVyLW5vdGlmeS1ldmVudCIsIHNlbGYuc2V0X2hvdmVyX2ljb25fY2IpCisgICAgICAgICAgICBzZWxmLmNvbm5lY3QoImxlYXZlLW5vdGlmeS1ldmVudCIsIHNlbGYuc2V0X2ljb25fY2IpCisgICAgICAgIGhib3gucGFja19zdGFydChzZWxmLmljb24sIEZhbHNlLCBGYWxzZSwgMCkKKyAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBsYWJlbC5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBjb2xvdXIgPSBzb2Z0ZW5fY29sb3IobGFiZWwpCisgICAgICAgIG1hcmsgPSAiPHNwYW4gc2l6ZT0neC1sYXJnZSc+JXM8L3NwYW4+XG48c3BhbiBzaXplPSdtZWRpdW0nIGZnY29sb3I9JyVzJyB3ZWlnaHQ9J3VsdHJhbGlnaHQnPiVzPC9zcGFuPiIgJSAocHJpbWFyeV90ZXh0LCBjb2xvdXIsIHNlY29uZGFyeV90ZXh0KQorICAgICAgICBsYWJlbC5zZXRfbWFya3VwKG1hcmspCisgICAgICAgIGxhYmVsLnNob3coKQorICAgICAgICBoYm94LnBhY2tfc3RhcnQobGFiZWwsIFRydWUsIFRydWUsIDApCisKKyAgICBkZWYgc2V0X2hvdmVyX2ljb25fY2Ioc2VsZiwgd2lkZ2V0LCBldmVudCk6CisgICAgICAgIHNlbGYuaWNvbi5zZXRfZnJvbV9maWxlKHNlbGYuaG92ZXJfaWNvbl9wYXRoKQorCisgICAgZGVmIHNldF9pY29uX2NiKHNlbGYsIHdpZGdldCwgZXZlbnQpOgorICAgICAgICBzZWxmLmljb24uc2V0X2Zyb21fZmlsZShzZWxmLmljb25fcGF0aCkKKworY2xhc3MgSG9iSW5mb0J1dHRvbihndGsuRXZlbnRCb3gpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGJ1dHRvbi1saWtlIHdpZGdldCBwZXIgdGhlIEhvYiB2aXN1YWwgYW5kIFVYIGRlc2lnbnMKKyAgICB3aGljaCB3aWxsIGRpc3BsYXkgYSBwZXJzaXN0ZW50IHRvb2x0aXAsIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRpcF9tYXJrdXAsIHdoZW4KKyAgICBjbGlja2VkLgorCisgICAgdGlwX21hcmt1cDogdGhlIFBhbmdvIE1hcmt1cCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBlcnNpc3RlbnQgdG9vbHRpcAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXBfbWFya3VwLCBwYXJlbnQ9Tm9uZSk6CisgICAgICAgIGd0ay5FdmVudEJveC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmltYWdlID0gZ3RrLkltYWdlKCkKKyAgICAgICAgc2VsZi5pbWFnZS5zZXRfZnJvbV9maWxlKAorICAgICAgICBoaWMuSUNPTl9JTkZPX0RJU1BMQVlfRklMRSkKKyAgICAgICAgc2VsZi5pbWFnZS5zaG93KCkKKyAgICAgICAgc2VsZi5hZGQoc2VsZi5pbWFnZSkKKyAgICAgICAgc2VsZi50aXBfbWFya3VwID0gdGlwX21hcmt1cAorICAgICAgICBzZWxmLm15X3BhcmVudCA9IHBhcmVudAorCisgICAgICAgIHNlbGYuc2V0X2V2ZW50cyhndGsuZ2RrLkJVVFRPTl9SRUxFQVNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0ay5nZGsuRU5URVJfTk9USUZZX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RrLmdkay5MRUFWRV9OT1RJRllfTUFTSykKKworICAgICAgICBzZWxmLmNvbm5lY3QoImJ1dHRvbi1yZWxlYXNlLWV2ZW50Iiwgc2VsZi5idXR0b25fcmVsZWFzZV9jYikKKyAgICAgICAgc2VsZi5jb25uZWN0KCJlbnRlci1ub3RpZnktZXZlbnQiLCBzZWxmLm1vdXNlX2luX2NiKQorICAgICAgICBzZWxmLmNvbm5lY3QoImxlYXZlLW5vdGlmeS1ldmVudCIsIHNlbGYubW91c2Vfb3V0X2NiKQorCisgICAgIiIiCisgICAgV2hlbiB0aGUgbW91c2UgY2xpY2sgaXMgcmVsZWFzZWQgZW11bGF0ZSBhIGJ1dHRvbi1jbGljayBhbmQgc2hvdyB0aGUgYXNzb2NpYXRlZAorICAgIFBlcnNpc3RlbnRUb29sdGlwCisgICAgIiIiCisgICAgZGVmIGJ1dHRvbl9yZWxlYXNlX2NiKHNlbGYsIHdpZGdldCwgZXZlbnQpOgorICAgICAgICBmcm9tIGJiLnVpLmNydW1icy5oaWcucHJvcGVydHlkaWFsb2cgaW1wb3J0IFByb3BlcnR5RGlhbG9nCisgICAgICAgIHNlbGYuZGlhbG9nID0gUHJvcGVydHlEaWFsb2codGl0bGUgPSAnJywKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5teV9wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uID0gc2VsZi50aXBfbWFya3VwLAorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVAorICAgICAgICAgICAgICAgICAgICAgICAgfCBndGsuRElBTE9HX05PX1NFUEFSQVRPUikKKworICAgICAgICBidXR0b24gPSBzZWxmLmRpYWxvZy5hZGRfYnV0dG9uKCJDbG9zZSIsIGd0ay5SRVNQT05TRV9DQU5DRUwpCisgICAgICAgIEhvYkFsdEJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorICAgICAgICBidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIGxhbWJkYSB3OiBzZWxmLmRpYWxvZy5kZXN0cm95KCkpCisgICAgICAgIHNlbGYuZGlhbG9nLnNob3dfYWxsKCkKKyAgICAgICAgc2VsZi5kaWFsb2cucnVuKCkKKworICAgICIiIgorICAgIENoYW5nZSB0byB0aGUgcHJlbGlnaHQgaW1hZ2Ugd2hlbiB0aGUgbW91c2UgZW50ZXJzIHRoZSB3aWRnZXQKKyAgICAiIiIKKyAgICBkZWYgbW91c2VfaW5fY2Ioc2VsZiwgd2lkZ2V0LCBldmVudCk6CisgICAgICAgIHNlbGYuaW1hZ2Uuc2V0X2Zyb21fZmlsZShoaWMuSUNPTl9JTkZPX0hPVkVSX0ZJTEUpCisKKyAgICAiIiIKKyAgICBDaGFuZ2UgdG8gdGhlIHN0b2NrIGltYWdlIHdoZW4gdGhlIG1vdXNlIGVudGVycyB0aGUgd2lkZ2V0CisgICAgIiIiCisgICAgZGVmIG1vdXNlX291dF9jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgc2VsZi5pbWFnZS5zZXRfZnJvbV9maWxlKGhpYy5JQ09OX0lORk9fRElTUExBWV9GSUxFKQorCitjbGFzcyBIb2JJbmRpY2F0b3IoZ3RrLkRyYXdpbmdBcmVhKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY291bnQpOgorICAgICAgICBndGsuRHJhd2luZ0FyZWEuX19pbml0X18oc2VsZikKKyAgICAgICAgIyBTZXQgbm8gd2luZG93IGZvciB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCisgICAgICAgIHNlbGYuc2V0X2hhc193aW5kb3coRmFsc2UpCisgICAgICAgIHNlbGYuc2V0X3NpemVfcmVxdWVzdCgzOCwzOCkKKyAgICAgICAgIyBXZSBuZWVkIHRvIHBhc3MgdGhyb3VnaCBidXR0b24gY2xpY2tzCisgICAgICAgIHNlbGYuYWRkX2V2ZW50cyhndGsuZ2RrLkJVVFRPTl9QUkVTU19NQVNLIHwgZ3RrLmdkay5CVVRUT05fUkVMRUFTRV9NQVNLKQorCisgICAgICAgIHNlbGYuY29ubmVjdCgnZXhwb3NlLWV2ZW50Jywgc2VsZi5leHBvc2UpCisKKyAgICAgICAgc2VsZi5jb3VudCA9IGNvdW50CisgICAgICAgIHNlbGYuY29sb3IgPSBIb2JDb2xvcnMuR1JBWQorCisgICAgZGVmIGV4cG9zZShzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5jb3VudCBhbmQgc2VsZi5jb3VudCA+IDA6CisgICAgICAgICAgICBjdHggPSB3aWRnZXQud2luZG93LmNhaXJvX2NyZWF0ZSgpCisKKyAgICAgICAgICAgIHgsIHksIHcsIGggPSBzZWxmLmFsbG9jYXRpb24KKworICAgICAgICAgICAgY3R4LnNldF9vcGVyYXRvcihjYWlyby5PUEVSQVRPUl9PVkVSKQorICAgICAgICAgICAgY3R4LnNldF9zb3VyY2VfY29sb3IoZ3RrLmdkay5jb2xvcl9wYXJzZShzZWxmLmNvbG9yKSkKKyAgICAgICAgICAgIGN0eC50cmFuc2xhdGUody8yLCBoLzIpCisgICAgICAgICAgICBjdHguYXJjKHgsIHksIG1pbih3LGgpLzIgLSAyLCAwLCAyKm1hdGgucGkpCisgICAgICAgICAgICBjdHguZmlsbF9wcmVzZXJ2ZSgpCisKKyAgICAgICAgICAgIGxheW91dCA9IHNlbGYuY3JlYXRlX3BhbmdvX2xheW91dChzdHIoc2VsZi5jb3VudCkpCisgICAgICAgICAgICB0ZXh0dywgdGV4dGggPSBsYXlvdXQuZ2V0X3BpeGVsX3NpemUoKQorICAgICAgICAgICAgeCA9ICh3LzIpLSh0ZXh0dy8yKSArIHgKKyAgICAgICAgICAgIHkgPSAoaC8yKSAtICh0ZXh0aC8yKSArIHkKKyAgICAgICAgICAgIGN0eC5tb3ZlX3RvKHgsIHkpCisgICAgICAgICAgICBzZWxmLndpbmRvdy5kcmF3X2xheW91dChzZWxmLnN0eWxlLmxpZ2h0X2djW2d0ay5TVEFURV9OT1JNQUxdLCBpbnQoeCksIGludCh5KSwgbGF5b3V0KQorCisgICAgZGVmIHNldF9jb3VudChzZWxmLCBjb3VudCk6CisgICAgICAgIHNlbGYuY291bnQgPSBjb3VudAorCisgICAgZGVmIHNldF9hY3RpdmUoc2VsZiwgYWN0aXZlKToKKyAgICAgICAgaWYgYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5jb2xvciA9IEhvYkNvbG9ycy5ERUVQX1JFRAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jb2xvciA9IEhvYkNvbG9ycy5HUkFZCisKK2NsYXNzIEhvYlRhYkxhYmVsKGd0ay5IQm94KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgY291bnQ9MCk6CisgICAgICAgIGd0ay5IQm94Ll9faW5pdF9fKHNlbGYsIEZhbHNlLCAwKQorICAgICAgICBzZWxmLmluZGljYXRvciA9IEhvYkluZGljYXRvcihjb3VudCkKKyAgICAgICAgc2VsZi5pbmRpY2F0b3Iuc2hvdygpCisgICAgICAgIHNlbGYucGFja19lbmQoc2VsZi5pbmRpY2F0b3IsIEZhbHNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5sYmwgPSBndGsuTGFiZWwodGV4dCkKKyAgICAgICAgc2VsZi5sYmwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgc2VsZi5sYmwuc2hvdygpCisgICAgICAgIHNlbGYucGFja19lbmQoc2VsZi5sYmwsIFRydWUsIFRydWUsIDYpCisKKyAgICBkZWYgc2V0X2NvdW50KHNlbGYsIGNvdW50KToKKyAgICAgICAgc2VsZi5pbmRpY2F0b3Iuc2V0X2NvdW50KGNvdW50KQorCisgICAgZGVmIHNldF9hY3RpdmUoc2VsZiwgYWN0aXZlPVRydWUpOgorICAgICAgICBzZWxmLmluZGljYXRvci5zZXRfYWN0aXZlKGFjdGl2ZSkKKworY2xhc3MgSG9iTm90ZWJvb2soZ3RrLk5vdGVib29rKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGd0ay5Ob3RlYm9vay5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldF9wcm9wZXJ0eSgnaG9tb2dlbmVvdXMnLCBUcnVlKQorCisgICAgICAgIHNlbGYucGFnZXMgPSBbXQorCisgICAgICAgIHNlbGYuc2VhcmNoID0gTm9uZQorICAgICAgICBzZWxmLnNlYXJjaF9mb2N1cyA9IEZhbHNlCisgICAgICAgIHNlbGYucGFnZV9jaGFuZ2VkID0gRmFsc2UKKworICAgICAgICBzZWxmLmNvbm5lY3QoInN3aXRjaC1wYWdlIiwgc2VsZi5wYWdlX2NoYW5nZWRfY2IpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgcGFnZV9jaGFuZ2VkX2NiKHNlbGYsIG5iLCBwYWdlLCBwYWdlX251bSk6CisgICAgICAgIGZvciBwLCBsYmwgaW4gZW51bWVyYXRlKHNlbGYucGFnZXMpOgorICAgICAgICAgICAgaWYgcCA9PSBwYWdlX251bToKKyAgICAgICAgICAgICAgICBsYmwuc2V0X2FjdGl2ZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxibC5zZXRfYWN0aXZlKEZhbHNlKQorCisgICAgICAgIGlmIHNlbGYuc2VhcmNoOgorICAgICAgICAgICAgc2VsZi5wYWdlX2NoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLnJlc2V0X2VudHJ5KHNlbGYuc2VhcmNoLCBwYWdlX251bSkKKworICAgIGRlZiBhcHBlbmRfcGFnZShzZWxmLCBjaGlsZCwgdGFiX2xhYmVsLCB0YWJfdG9vbHRpcD1Ob25lKToKKyAgICAgICAgbGFiZWwgPSBIb2JUYWJMYWJlbCh0YWJfbGFiZWwpCisgICAgICAgIGlmIHRhYl90b29sdGlwOgorICAgICAgICAgICAgbGFiZWwuc2V0X3Rvb2x0aXBfdGV4dCh0YWJfdG9vbHRpcCkKKyAgICAgICAgbGFiZWwuc2V0X2FjdGl2ZShGYWxzZSkKKyAgICAgICAgc2VsZi5wYWdlcy5hcHBlbmQobGFiZWwpCisgICAgICAgIGd0ay5Ob3RlYm9vay5hcHBlbmRfcGFnZShzZWxmLCBjaGlsZCwgbGFiZWwpCisKKyAgICBkZWYgc2V0X2VudHJ5KHNlbGYsIG5hbWVzLCB0aXBzKToKKyAgICAgICAgc2VsZi5zZWFyY2ggPSBndGsuRW50cnkoKQorICAgICAgICBzZWxmLnNlYXJjaF9uYW1lcyA9IG5hbWVzCisgICAgICAgIHNlbGYuc2VhcmNoX3RpcHMgPSB0aXBzCisgICAgICAgIHN0eWxlID0gc2VsZi5zZWFyY2guZ2V0X3N0eWxlKCkKKyAgICAgICAgc3R5bGUudGV4dFtndGsuU1RBVEVfTk9STUFMXSA9IHNlbGYuZ2V0X2NvbG9ybWFwKCkuYWxsb2NfY29sb3IoSG9iQ29sb3JzLkdSQVksIEZhbHNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5zZWFyY2guc2V0X3N0eWxlKHN0eWxlKQorICAgICAgICBzZWxmLnNlYXJjaC5zZXRfdGV4dChuYW1lc1swXSkKKyAgICAgICAgc2VsZi5zZWFyY2guc2V0X3Rvb2x0aXBfdGV4dChzZWxmLnNlYXJjaF90aXBzWzBdKQorICAgICAgICBzZWxmLnNlYXJjaC5wcm9wcy5oYXNfdG9vbHRpcCA9IFRydWUKKworICAgICAgICBzZWxmLnNlYXJjaC5zZXRfZWRpdGFibGUoRmFsc2UpCisgICAgICAgIHNlbGYuc2VhcmNoLnNldF9pY29uX2Zyb21fc3RvY2soZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBndGsuU1RPQ0tfQ0xFQVIpCisgICAgICAgIHNlbGYuc2VhcmNoLnNldF9pY29uX3NlbnNpdGl2ZShndGsuRU5UUllfSUNPTl9TRUNPTkRBUlksIEZhbHNlKQorICAgICAgICBzZWxmLnNlYXJjaC5jb25uZWN0KCJpY29uLXJlbGVhc2UiLCBzZWxmLnNldF9zZWFyY2hfZW50cnlfY2xlYXJfY2IpCisgICAgICAgIHNlbGYuc2VhcmNoLnNldF93aWR0aF9jaGFycygzMCkKKyAgICAgICAgc2VsZi5zZWFyY2guc2hvdygpCisKKyAgICAgICAgc2VsZi5zZWFyY2guY29ubmVjdCgiZm9jdXMtaW4tZXZlbnQiLCBzZWxmLnNldF9zZWFyY2hfZW50cnlfZWRpdGFibGVfY2IpCisgICAgICAgIHNlbGYuc2VhcmNoLmNvbm5lY3QoImZvY3VzLW91dC1ldmVudCIsIHNlbGYuc2V0X3NlYXJjaF9lbnRyeV9yZXNldF9jYikKKyAgICAgICAgc2VsZi5zZXRfYWN0aW9uX3dpZGdldChzZWxmLnNlYXJjaCwgZ3RrLlBBQ0tfRU5EKQorCisgICAgZGVmIHNob3dfaW5kaWNhdG9yX2ljb24oc2VsZiwgdGl0bGUsIG51bWJlcik6CisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgaWYgY2hpbGQubGJsLmdldF9sYWJlbCgpID09IHRpdGxlOgorICAgICAgICAgICAgICAgIGNoaWxkLnNldF9jb3VudChudW1iZXIpCisKKyAgICBkZWYgaGlkZV9pbmRpY2F0b3JfaWNvbihzZWxmLCB0aXRsZSk6CisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgaWYgY2hpbGQubGJsLmdldF9sYWJlbCgpID09IHRpdGxlOgorICAgICAgICAgICAgICAgIGNoaWxkLnNldF9jb3VudCgwKQorCisgICAgZGVmIHNldF9zZWFyY2hfZW50cnlfZWRpdGFibGVfY2Ioc2VsZiwgc2VhcmNoLCBldmVudCk6CisgICAgICAgIHNlbGYuc2VhcmNoX2ZvY3VzID0gVHJ1ZQorICAgICAgICBzZWFyY2guc2V0X2VkaXRhYmxlKFRydWUpCisgICAgICAgIHRleHQgPSBzZWFyY2guZ2V0X3RleHQoKQorICAgICAgICBpZiB0ZXh0IGluIHNlbGYuc2VhcmNoX25hbWVzOgorICAgICAgICAgICAgc2VhcmNoLnNldF90ZXh0KCIiKQorICAgICAgICBzdHlsZSA9IHNlbGYuc2VhcmNoLmdldF9zdHlsZSgpCisgICAgICAgIHN0eWxlLnRleHRbZ3RrLlNUQVRFX05PUk1BTF0gPSBzZWxmLmdldF9jb2xvcm1hcCgpLmFsbG9jX2NvbG9yKEhvYkNvbG9ycy5CTEFDSywgRmFsc2UsIEZhbHNlKQorICAgICAgICBzZWFyY2guc2V0X3N0eWxlKHN0eWxlKQorCisgICAgZGVmIHNldF9zZWFyY2hfZW50cnlfcmVzZXRfY2Ioc2VsZiwgc2VhcmNoLCBldmVudCk6CisgICAgICAgIHBhZ2VfbnVtID0gc2VsZi5nZXRfY3VycmVudF9wYWdlKCkKKyAgICAgICAgdGV4dCA9IHNlYXJjaC5nZXRfdGV4dCgpCisgICAgICAgIGlmIG5vdCB0ZXh0OgorICAgICAgICAgICAgc2VsZi5yZXNldF9lbnRyeShzZWFyY2gsIHBhZ2VfbnVtKQorCisgICAgZGVmIHJlc2V0X2VudHJ5KHNlbGYsIGVudHJ5LCBwYWdlX251bSk6CisgICAgICAgIHN0eWxlID0gZW50cnkuZ2V0X3N0eWxlKCkKKyAgICAgICAgc3R5bGUudGV4dFtndGsuU1RBVEVfTk9STUFMXSA9IHNlbGYuZ2V0X2NvbG9ybWFwKCkuYWxsb2NfY29sb3IoSG9iQ29sb3JzLkdSQVksIEZhbHNlLCBGYWxzZSkKKyAgICAgICAgZW50cnkuc2V0X3N0eWxlKHN0eWxlKQorICAgICAgICBlbnRyeS5zZXRfdGV4dChzZWxmLnNlYXJjaF9uYW1lc1twYWdlX251bV0pCisgICAgICAgIGVudHJ5LnNldF90b29sdGlwX3RleHQoc2VsZi5zZWFyY2hfdGlwc1twYWdlX251bV0pCisgICAgICAgIGVudHJ5LnNldF9lZGl0YWJsZShGYWxzZSkKKyAgICAgICAgZW50cnkuc2V0X2ljb25fc2Vuc2l0aXZlKGd0ay5FTlRSWV9JQ09OX1NFQ09OREFSWSwgRmFsc2UpCisKKyAgICBkZWYgc2V0X3NlYXJjaF9lbnRyeV9jbGVhcl9jYihzZWxmLCBzZWFyY2gsIGljb25fcG9zLCBldmVudCk6CisgICAgICAgIGlmIHNlYXJjaC5nZXRfZWRpdGFibGUoKSA9PSBUcnVlOgorICAgICAgICAgICAgc2VhcmNoLnNldF90ZXh0KCIiKQorICAgICAgICBzZWFyY2guc2V0X2ljb25fc2Vuc2l0aXZlKGd0ay5FTlRSWV9JQ09OX1NFQ09OREFSWSwgRmFsc2UpCisgICAgICAgIHNlYXJjaC5ncmFiX2ZvY3VzKCkKKworICAgIGRlZiBzZXRfcGFnZShzZWxmLCB0aXRsZSk6CisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgaWYgY2hpbGQubGJsLmdldF9sYWJlbCgpID09IHRpdGxlOgorICAgICAgICAgICAgICAgIGNoaWxkLmdyYWJfZm9jdXMoKQorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2N1cnJlbnRfcGFnZShzZWxmLnBhZ2VzLmluZGV4KGNoaWxkKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworY2xhc3MgSG9iV2FycENlbGxSZW5kZXJlclRleHQoZ3RrLkNlbGxSZW5kZXJlclRleHQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2xfbnVtYmVyKToKKyAgICAgICAgZ3RrLkNlbGxSZW5kZXJlclRleHQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zZXRfcHJvcGVydHkoIndyYXAtbW9kZSIsIHBhbmdvLldSQVBfV09SRF9DSEFSKQorICAgICAgICBzZWxmLnNldF9wcm9wZXJ0eSgid3JhcC13aWR0aCIsIDMwMCkgIyBkZWZhdWx0IHZhbHVlIHdyYXAgd2lkdGggaXMgMzAwCisgICAgICAgIHNlbGYuY29sX24gPSBjb2xfbnVtYmVyCisKKyAgICBkZWYgZG9fcmVuZGVyKHNlbGYsIHdpbmRvdywgd2lkZ2V0LCBiYWNrZ3JvdW5kX2FyZWEsIGNlbGxfYXJlYSwgZXhwb3NlX2FyZWEsIGZsYWdzKToKKyAgICAgICAgaWYgd2lkZ2V0OgorICAgICAgICAgICAgc2VsZi5wcm9wcy53cmFwX3dpZHRoID0gc2VsZi5nZXRfcmVzaXplZF93cmFwX3dpZHRoKHdpZGdldCwgd2lkZ2V0LmdldF9jb2x1bW4oc2VsZi5jb2xfbikpCisgICAgICAgIHJldHVybiBndGsuQ2VsbFJlbmRlcmVyVGV4dC5kb19yZW5kZXIoc2VsZiwgd2luZG93LCB3aWRnZXQsIGJhY2tncm91bmRfYXJlYSwgY2VsbF9hcmVhLCBleHBvc2VfYXJlYSwgZmxhZ3MpCisKKyAgICBkZWYgZ2V0X3Jlc2l6ZWRfd3JhcF93aWR0aChzZWxmLCB0cmVldmlldywgY29sdW1uKToKKyAgICAgICAgb3RoZXJDb2xzID0gW10KKyAgICAgICAgZm9yIGNvbCBpbiB0cmVldmlldy5nZXRfY29sdW1ucygpOgorICAgICAgICAgICAgaWYgY29sICE9IGNvbHVtbjoKKyAgICAgICAgICAgICAgICBvdGhlckNvbHMuYXBwZW5kKGNvbCkKKyAgICAgICAgYWRqd2lkdGggPSB0cmVldmlldy5hbGxvY2F0aW9uLndpZHRoIC0gc3VtKGMuZ2V0X3dpZHRoKCkgZm9yIGMgaW4gb3RoZXJDb2xzKQorICAgICAgICBhZGp3aWR0aCAtPSB0cmVldmlldy5zdHlsZV9nZXRfcHJvcGVydHkoImhvcml6b250YWwtc2VwYXJhdG9yIikgKiA0CisgICAgICAgIGlmIHNlbGYucHJvcHMud3JhcF93aWR0aCA9PSBhZGp3aWR0aCBvciBhZGp3aWR0aCA8PSAwOgorICAgICAgICAgICAgICAgIGFkandpZHRoID0gc2VsZi5wcm9wcy53cmFwX3dpZHRoCisgICAgICAgIHJldHVybiBhZGp3aWR0aAorCitnb2JqZWN0LnR5cGVfcmVnaXN0ZXIoSG9iV2FycENlbGxSZW5kZXJlclRleHQpCisKK2NsYXNzIEhvYkljb25DaGVja2VyKGhpYyk6CisgICAgZGVmIHNldF9ob2JfaWNvbl90b19zdG9ja19pY29uKHNlbGYsIGZpbGVfcGF0aCwgc3RvY2tfaWQ9IiIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaXhidWYgPSBndGsuZ2RrLnBpeGJ1Zl9uZXdfZnJvbV9maWxlKGZpbGVfcGF0aCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgc3RvY2tfaWQgYW5kIChndGsuaWNvbl9mYWN0b3J5X2xvb2t1cF9kZWZhdWx0KHN0b2NrX2lkKSA9PSBOb25lKToKKyAgICAgICAgICAgIGljb25fZmFjdG9yeSA9IGd0ay5JY29uRmFjdG9yeSgpCisgICAgICAgICAgICBpY29uX2ZhY3RvcnkuYWRkX2RlZmF1bHQoKQorICAgICAgICAgICAgaWNvbl9mYWN0b3J5LmFkZChzdG9ja19pZCwgZ3RrLkljb25TZXQocGl4YnVmKSkKKyAgICAgICAgICAgIGd0ay5zdG9ja19hZGQoWyhzdG9ja19pZCwgJ19sYWJlbCcsIDAsIDAsICcnKV0pCisKKyAgICAgICAgICAgIHJldHVybiBpY29uX2ZhY3RvcnkubG9va3VwKHN0b2NrX2lkKQorCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAiIiIKKyAgICBGb3IgbWFrZSBob2IgaWNvbiBjb25zaXN0ZW50bHkgYnkgcmVxdWVzdCwgYW5kIGF2b2lkIGljb24gdmlldyBkaWZmIGJ5IHN5c3RlbSBvciBndGsgdmVyc2lvbiwgd2UgdXNlIHNvbWUgJ2hvYiBpY29uJyB0byByZXBsYWNlIHRoZSAnZ3RrIGljb24nLgorICAgIHRoaXMgZnVuY3Rpb24gY2hlY2sgdGhlIHN0b2NrX2lkIGFuZCBtYWtlIGhvYl9pZCB0byByZXBsYWNlZCB0aGUgZ3RrX2lkIHRoZW4gcmV0dXJuIGl0IG9yICIiCisgICAgIiIiCisgICAgZGVmIGNoZWNrX3N0b2NrX2ljb24oc2VsZiwgc3RvY2tfbmFtZT0iIik6CisgICAgICAgIEhPQl9DSEVDS19TVE9DS19OQU1FID0geworICAgICAgICAgICAgKCdoaWMtZGlhbG9nLWluZm8nLCAnZ3RrLWRpYWxvZy1pbmZvJywgJ2RpYWxvZy1pbmZvJykgICAgICAgICAgIDogc2VsZi5JQ09OX0lORElfSU5GT19GSUxFLAorICAgICAgICAgICAgKCdoaWMtb2snLCAgICAgICAgICAnZ3RrLW9rJywgICAgICAgICAgICdvaycpICAgICAgICAgICAgICAgICAgIDogc2VsZi5JQ09OX0lORElfVElDS19GSUxFLAorICAgICAgICAgICAgKCdoaWMtZGlhbG9nLWVycm9yJywgJ2d0ay1kaWFsb2ctZXJyb3InLCAnZGlhbG9nLWVycm9yJykgICAgICAgIDogc2VsZi5JQ09OX0lORElfRVJST1JfRklMRSwKKyAgICAgICAgICAgICgnaGljLWRpYWxvZy13YXJuaW5nJywgJ2d0ay1kaWFsb2ctd2FybmluZycsICdkaWFsb2ctd2FybmluZycpICA6IHNlbGYuSUNPTl9JTkRJX0FMRVJUX0ZJTEUsCisgICAgICAgICAgICAoJ2hpYy10YXNrLXJlZnJlc2gnLCAnZ3RrLWV4ZWN1dGUnLCAnZXhlY3V0ZScpICAgICAgICAgICAgICAgICAgOiBzZWxmLklDT05fSU5ESV9SRUZSRVNIX0ZJTEUsCisgICAgICAgIH0KKyAgICAgICAgdmFsaWRfc3RvY2tfaWQgPSBzdG9ja19uYW1lCisgICAgICAgIGlmIHN0b2NrX25hbWU6CisgICAgICAgICAgICBmb3IgbmFtZXMsIHBhdGggaW4gSE9CX0NIRUNLX1NUT0NLX05BTUUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgc3RvY2tfbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3RvY2tfaWQgPSBuYW1lc1swXQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZ3RrLmljb25fZmFjdG9yeV9sb29rdXBfZGVmYXVsdCh2YWxpZF9zdG9ja19pZCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldF9ob2JfaWNvbl90b19zdG9ja19pY29uKHBhdGgsIHZhbGlkX3N0b2NrX2lkKQorCisgICAgICAgIHJldHVybiB2YWxpZF9zdG9ja19pZAorCitjbGFzcyBIb2JDZWxsUmVuZGVyZXJDb250cm9sbGVyKGdvYmplY3QuR09iamVjdCk6CisgICAgKE1PREVfQ1lDTEVfUlVOTklORywgTU9ERV9PTkVfU0hPUlQpID0gcmFuZ2UoMikKKyAgICBfX2dzaWduYWxzX18gPSB7CisgICAgICAgICJydW4tdGltZXItc3RvcHBlZCIgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgfQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBydW5uaW5nbW9kZT1NT0RFX0NZQ0xFX1JVTk5JTkcsIGlzX2RyYXdfcm93PUZhbHNlKToKKyAgICAgICAgZ29iamVjdC5HT2JqZWN0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYudGltZW91dF9pZCA9IE5vbmUKKyAgICAgICAgc2VsZi5jdXJyZW50X2FuZ2xlX3BvcyA9IDAuMAorICAgICAgICBzZWxmLnN0ZXBfYW5nbGUgPSAwLjAKKyAgICAgICAgc2VsZi50cmVlX2hlYWRlcnNfaGVpZ2h0ID0gMAorICAgICAgICBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhcyA9IFtdCisgICAgICAgIHNlbGYucnVubmluZ19tb2RlID0gcnVubmluZ21vZGUKKyAgICAgICAgc2VsZi5pc19xdWV1ZV9kcmF3X3Jvd19hcmVhID0gaXNfZHJhd19yb3cKKyAgICAgICAgc2VsZi5mb3JjZV9zdG9wX2VuYWJsZSA9IEZhbHNlCisKKyAgICBkZWYgaXNfYWN0aXZlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRpbWVvdXRfaWQ6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcmVzZXRfcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmZvcmNlX3N0b3AoKQorICAgICAgICBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhcyA9IFtdCisgICAgICAgIHNlbGYuY3VycmVudF9hbmdsZV9wb3MgPSAwLjAKKyAgICAgICAgc2VsZi5zdGVwX2FuZ2xlID0gMC4wCisKKyAgICAnJycgdGltZV9pdGVydmFsOiAoMX4xMDAwKW1zLCB3aGljaCB3aWxsIGJlIGFzIHRoZSBiYXNpYyBpbnRlcnZhbCBjb3VudCBmb3IgdGltZXIKKyAgICAgICAgaW5pdF91c3JkYXRhOiB0aGUgY3VycmVudCBkYXRhIHdoaWNoIHJlbGF0ZWQgdGhlIHByb2dyZXNzLWJhciB3aWxsIGJlIGF0CisgICAgICAgIG1pbl91c3JkYXRhOiB0aGUgcmFuZ2Ugb2YgbWluIG9mIHVzZXIgZGF0YQorICAgICAgICBtYXhfdXNyZGF0YTogdGhlIHJhbmdlIG9mIG1heCBvZiB1c2VyIGRhdGEKKyAgICAgICAgc3RlcDogZWFjaCBzdGVwIHdoaWNoIHlvdSB3YW50IHRvIHByb2dyZXNzCisgICAgICAgIE5vdGU6IHRoZSBpbml0X3VzcmRhdGEgc2hvdWxkIGluIHRoZSByYW5nZSBvZiBmcm9tIG1pbiB0byBtYXgsIGFuZCBtYXggc2hvdWxkID4gbWluCisgICAgICAgICAgICAgc3RlcCBzaG91bGQgPCAobWF4IC0gbWluKQorICAgICcnJworICAgIGRlZiBzdGFydF9ydW4oc2VsZiwgdGltZV9pdGVydmFsLCBpbml0X3VzcmRhdGEsIG1pbl91c3JkYXRhLCBtYXhfdXNyZGF0YSwgc3RlcCwgdHJlZSk6CisgICAgICAgIGlmIChub3QgdGltZV9pdGVydmFsKSBvciAobm90IG1heF91c3JkYXRhKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB1c3JfcmFuZ2UgPSAobWF4X3VzcmRhdGEgLSBtaW5fdXNyZGF0YSkgKiAxLjAKKyAgICAgICAgc2VsZi5jdXJyZW50X2FuZ2xlX3BvcyA9IChpbml0X3VzcmRhdGEgKiAxLjApIC8gdXNyX3JhbmdlCisgICAgICAgIHNlbGYuc3RlcF9hbmdsZSA9IChzdGVwICogMSkgLyB1c3JfcmFuZ2UKKyAgICAgICAgc2VsZi50aW1lb3V0X2lkID0gZ29iamVjdC50aW1lb3V0X2FkZChpbnQodGltZV9pdGVydmFsKSwKKyAgICAgICAgc2VsZi5tYWtlX2ltYWdlX29uX3Byb2dyZXNzaW5nX2NiLCB0cmVlKQorICAgICAgICBzZWxmLnRyZWVfaGVhZGVyc19oZWlnaHQgPSBzZWxmLmdldF90cmVldmlld19oZWFkZXJzX2hlaWdodCh0cmVlKQorICAgICAgICBzZWxmLmZvcmNlX3N0b3BfZW5hYmxlID0gRmFsc2UKKworICAgIGRlZiBmb3JjZV9zdG9wKHNlbGYpOgorICAgICAgICBzZWxmLmVtaXQoInJ1bi10aW1lci1zdG9wcGVkIikKKyAgICAgICAgc2VsZi5mb3JjZV9zdG9wX2VuYWJsZSA9IFRydWUKKyAgICAgICAgaWYgc2VsZi50aW1lb3V0X2lkOgorICAgICAgICAgICAgaWYgZ29iamVjdC5zb3VyY2VfcmVtb3ZlKHNlbGYudGltZW91dF9pZCk6CisgICAgICAgICAgICAgICAgc2VsZi50aW1lb3V0X2lkID0gTm9uZQorCisgICAgZGVmIG9uX2RyYXdfcGl4YnVmX2NiKHNlbGYsIHBpeGJ1ZiwgY3IsIHgsIHksIGltZ193aWR0aCwgaW1nX2hlaWdodCwgZG9fcmVmcmVzaD1UcnVlKToKKyAgICAgICAgaWYgcGl4YnVmOgorICAgICAgICAgICAgciA9IG1heChpbWdfd2lkdGgvMiwgaW1nX2hlaWdodC8yKQorICAgICAgICAgICAgY3IudHJhbnNsYXRlKHggKyByLCB5ICsgcikKKyAgICAgICAgICAgIGlmIGRvX3JlZnJlc2g6CisgICAgICAgICAgICAgICAgY3Iucm90YXRlKDIgKiBtYXRoLnBpICogc2VsZi5jdXJyZW50X2FuZ2xlX3BvcykKKworICAgICAgICAgICAgY3Iuc2V0X3NvdXJjZV9waXhidWYocGl4YnVmLCAtaW1nX3dpZHRoLzIsIC1pbWdfaGVpZ2h0LzIpCisgICAgICAgICAgICBjci5wYWludCgpCisKKyAgICBkZWYgb25fZHJhd19mYWRlaW5vdXRfY2Ioc2VsZiwgY3IsIGNvbG9yLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBkb19mYWRlb3V0PVRydWUpOgorICAgICAgICBpZiBkb19mYWRlb3V0OgorICAgICAgICAgICAgYWxwaGEgPSBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zICogMC44CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbHBoYSA9ICgxLjAgLSBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zKSAqIDAuOAorCisgICAgICAgIGNyLnNldF9zb3VyY2VfcmdiYShjb2xvci5yZWQsIGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlLCBhbHBoYSkKKyAgICAgICAgY3IucmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpCisgICAgICAgIGNyLmZpbGwoKQorCisgICAgZGVmIGdldF90cmVldmlld19oZWFkZXJzX2hlaWdodChzZWxmLCB0cmVlKToKKyAgICAgICAgaWYgdHJlZSBhbmQgKHRyZWUuZ2V0X3Byb3BlcnR5KCJoZWFkZXJzLXZpc2libGUiKSA9PSBUcnVlKToKKyAgICAgICAgICAgIGhlaWdodCA9IHRyZWUuZ2V0X2FsbG9jYXRpb24oKS5oZWlnaHQgLSB0cmVlLmdldF9iaW5fd2luZG93KCkuZ2V0X3NpemUoKVsxXQorICAgICAgICAgICAgcmV0dXJuIGhlaWdodAorCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgbWFrZV9pbWFnZV9vbl9wcm9ncmVzc2luZ19jYihzZWxmLCB0cmVlKToKKyAgICAgICAgc2VsZi5jdXJyZW50X2FuZ2xlX3BvcyArPSBzZWxmLnN0ZXBfYW5nbGUKKyAgICAgICAgaWYgc2VsZi5ydW5uaW5nX21vZGUgPT0gc2VsZi5NT0RFX0NZQ0xFX1JVTk5JTkc6CisgICAgICAgICAgICBpZiAoc2VsZi5jdXJyZW50X2FuZ2xlX3BvcyA+PSAxKToKKyAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfYW5nbGVfcG9zID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50X2FuZ2xlX3BvcyA+IDE6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JjZV9zdG9wKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLmlzX3F1ZXVlX2RyYXdfcm93X2FyZWE6CisgICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnJ1bm5pbmdfY2VsbF9hcmVhczoKKyAgICAgICAgICAgICAgICByZWN0ID0gdHJlZS5nZXRfY2VsbF9hcmVhKHBhdGgsIHRyZWUuZ2V0X2NvbHVtbigwKSkKKyAgICAgICAgICAgICAgICByb3dfeCwgXywgcm93X3dpZHRoLCBfID0gdHJlZS5nZXRfdmlzaWJsZV9yZWN0KCkKKyAgICAgICAgICAgICAgICB0cmVlLnF1ZXVlX2RyYXdfYXJlYShyb3dfeCwgcmVjdC55ICsgc2VsZi50cmVlX2hlYWRlcnNfaGVpZ2h0LCByb3dfd2lkdGgsIHJlY3QuaGVpZ2h0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHJlY3QgaW4gc2VsZi5ydW5uaW5nX2NlbGxfYXJlYXM6CisgICAgICAgICAgICAgICAgdHJlZS5xdWV1ZV9kcmF3X2FyZWEocmVjdC54LCByZWN0LnkgKyBzZWxmLnRyZWVfaGVhZGVyc19oZWlnaHQsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KQorCisgICAgICAgIHJldHVybiAobm90IHNlbGYuZm9yY2Vfc3RvcF9lbmFibGUpCisKKyAgICBkZWYgYXBwZW5kX3J1bm5pbmdfY2VsbF9hcmVhKHNlbGYsIGNlbGxfYXJlYSk6CisgICAgICAgIGlmIGNlbGxfYXJlYSBhbmQgKGNlbGxfYXJlYSBub3QgaW4gc2VsZi5ydW5uaW5nX2NlbGxfYXJlYXMpOgorICAgICAgICAgICAgc2VsZi5ydW5uaW5nX2NlbGxfYXJlYXMuYXBwZW5kKGNlbGxfYXJlYSkKKworICAgIGRlZiByZW1vdmVfcnVubmluZ19jZWxsX2FyZWEoc2VsZiwgY2VsbF9hcmVhKToKKyAgICAgICAgaWYgY2VsbF9hcmVhIGluIHNlbGYucnVubmluZ19jZWxsX2FyZWFzOgorICAgICAgICAgICAgc2VsZi5ydW5uaW5nX2NlbGxfYXJlYXMucmVtb3ZlKGNlbGxfYXJlYSkKKyAgICAgICAgaWYgbm90IHNlbGYucnVubmluZ19jZWxsX2FyZWFzOgorICAgICAgICAgICAgc2VsZi5yZXNldF9ydW4oKQorCitnb2JqZWN0LnR5cGVfcmVnaXN0ZXIoSG9iQ2VsbFJlbmRlcmVyQ29udHJvbGxlcikKKworY2xhc3MgSG9iQ2VsbFJlbmRlcmVyUGl4YnVmKGd0ay5DZWxsUmVuZGVyZXJQaXhidWYpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLkNlbGxSZW5kZXJlclBpeGJ1Zi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNvbnRyb2wgPSBIb2JDZWxsUmVuZGVyZXJDb250cm9sbGVyKCkKKyAgICAgICAgIyBhZGQgaWNvbiBjaGVja2VyIGZvciBtYWtlIHRoZSBndGstaWNvbiB0cmFuc2ZlciB0byBob2ItaWNvbgorICAgICAgICBzZWxmLmNoZWNrZXIgPSBIb2JJY29uQ2hlY2tlcigpCisgICAgICAgIHNlbGYuc2V0X3Byb3BlcnR5KCJzdG9jay1zaXplIiwgZ3RrLklDT05fU0laRV9ETkQpCisKKyAgICBkZWYgZ2V0X3BpeGJ1Zl9mcm9tX3N0b2NrX2ljb24oc2VsZiwgd2lkZ2V0LCBzdG9ja19pZD0iIiwgc2l6ZT1ndGsuSUNPTl9TSVpFX0RJQUxPRyk6CisgICAgICAgIGlmIHdpZGdldCBhbmQgc3RvY2tfaWQgYW5kIGd0ay5pY29uX2ZhY3RvcnlfbG9va3VwX2RlZmF1bHQoc3RvY2tfaWQpOgorICAgICAgICAgICAgcmV0dXJuIHdpZGdldC5yZW5kZXJfaWNvbihzdG9ja19pZCwgc2l6ZSkKKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHNldF9pY29uX25hbWVfdG9faWQoc2VsZiwgbmV3X25hbWUpOgorICAgICAgICBpZiBuZXdfbmFtZSBhbmQgdHlwZShuZXdfbmFtZSkgPT0gc3RyOgorICAgICAgICAgICAgIyBjaGVjayB0aGUgbmFtZSBpcyBuZWVkIHRvIHRyYW5zZmVyIHRvIGhvYiBpY29uIG9yIG5vdAorICAgICAgICAgICAgbmFtZSA9IHNlbGYuY2hlY2tlci5jaGVja19zdG9ja19pY29uKG5ld19uYW1lKQorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJoaWMiKSBvciBuYW1lLnN0YXJ0c3dpdGgoImd0ayIpOgorICAgICAgICAgICAgICAgIHN0b2NrX2lkID0gbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdG9ja19pZCA9ICdndGstJyArIG5hbWUKKworICAgICAgICByZXR1cm4gc3RvY2tfaWQKKworICAgICcnJyByZW5kZXIgY2VsbCBleGFjdGx5LCAiaWNvbi1uYW1lIiBpcyBwcmlvcml0eQorICAgICAgICBpZiB1c2UgdGhlICdoaWMtdGFzay1yZWZyZXNoJyB3aWxsIG1ha2UgdGhlIHBpeCBhbmltYXRpb24KKyAgICAgICAgaWYgJ3BpeCcgd2lsbCBjaGFuZ2UgdGhlIHBpeGJ1ZiBmb3IgaXQgZnJvbSB0aGUgcGl4YnVmIG9yIGltYWdlLgorICAgICcnJworICAgIGRlZiBkb19yZW5kZXIoc2VsZiwgd2luZG93LCB0cmVlLCBiYWNrZ3JvdW5kX2FyZWEsY2VsbF9hcmVhLCBleHBvc2VfYXJlYSwgZmxhZ3MpOgorICAgICAgICBpZiAobm90IHNlbGYuY29udHJvbCkgb3IgKG5vdCB0cmVlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHgsIHksIHcsIGggPSBzZWxmLm9uX2dldF9zaXplKHRyZWUsIGNlbGxfYXJlYSkKKyAgICAgICAgeCArPSBjZWxsX2FyZWEueAorICAgICAgICB5ICs9IGNlbGxfYXJlYS55CisgICAgICAgIHcgLT0gMiAqIHNlbGYuZ2V0X3Byb3BlcnR5KCJ4cGFkIikKKyAgICAgICAgaCAtPSAyICogc2VsZi5nZXRfcHJvcGVydHkoInlwYWQiKQorCisgICAgICAgIHN0b2NrX2lkID0gIiIKKyAgICAgICAgaWYgc2VsZi5wcm9wcy5pY29uX25hbWU6CisgICAgICAgICAgICBzdG9ja19pZCA9IHNlbGYuc2V0X2ljb25fbmFtZV90b19pZChzZWxmLnByb3BzLmljb25fbmFtZSkKKyAgICAgICAgZWxpZiBzZWxmLnByb3BzLnN0b2NrX2lkOgorICAgICAgICAgICAgc3RvY2tfaWQgPSBzZWxmLnByb3BzLnN0b2NrX2lkCisgICAgICAgIGVsaWYgc2VsZi5wcm9wcy5waXhidWY6CisgICAgICAgICAgICBwaXggPSBzZWxmLnByb3BzLnBpeGJ1ZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc3RvY2tfaWQ6CisgICAgICAgICAgICBwaXggPSBzZWxmLmdldF9waXhidWZfZnJvbV9zdG9ja19pY29uKHRyZWUsIHN0b2NrX2lkLCBzZWxmLnByb3BzLnN0b2NrX3NpemUpCisgICAgICAgIGlmIHN0b2NrX2lkID09ICdoaWMtdGFzay1yZWZyZXNoJzoKKyAgICAgICAgICAgIHNlbGYuY29udHJvbC5hcHBlbmRfcnVubmluZ19jZWxsX2FyZWEoY2VsbF9hcmVhKQorICAgICAgICAgICAgaWYgc2VsZi5jb250cm9sLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgICAgIHNlbGYuY29udHJvbC5vbl9kcmF3X3BpeGJ1Zl9jYihwaXgsIHdpbmRvdy5jYWlyb19jcmVhdGUoKSwgeCwgeSwgdywgaCwgVHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sLnN0YXJ0X3J1bigyMDAsIDAsIDAsIDEwMDAsIDE1MCwgdHJlZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udHJvbC5yZW1vdmVfcnVubmluZ19jZWxsX2FyZWEoY2VsbF9hcmVhKQorICAgICAgICAgICAgc2VsZi5jb250cm9sLm9uX2RyYXdfcGl4YnVmX2NiKHBpeCwgd2luZG93LmNhaXJvX2NyZWF0ZSgpLCB4LCB5LCB3LCBoLCBGYWxzZSkKKworICAgIGRlZiBvbl9nZXRfc2l6ZShzZWxmLCB3aWRnZXQsIGNlbGxfYXJlYSk6CisgICAgICAgIGlmIHNlbGYucHJvcHMuaWNvbl9uYW1lIG9yIHNlbGYucHJvcHMucGl4YnVmIG9yIHNlbGYucHJvcHMuc3RvY2tfaWQ6CisgICAgICAgICAgICB3LCBoID0gZ3RrLmljb25fc2l6ZV9sb29rdXAoc2VsZi5wcm9wcy5zdG9ja19zaXplKQorICAgICAgICAgICAgY2FsY193aWR0aCA9IHNlbGYuZ2V0X3Byb3BlcnR5KCJ4cGFkIikgKiAyICsgdworICAgICAgICAgICAgY2FsY19oZWlnaHQgPSBzZWxmLmdldF9wcm9wZXJ0eSgieXBhZCIpICogMiArIGgKKyAgICAgICAgICAgIHhfb2Zmc2V0ID0gMAorICAgICAgICAgICAgeV9vZmZzZXQgPSAwCisgICAgICAgICAgICBpZiBjZWxsX2FyZWEgYW5kIHcgPiAwIGFuZCBoID4gMDoKKyAgICAgICAgICAgICAgICB4X29mZnNldCA9IHNlbGYuZ2V0X3Byb3BlcnR5KCJ4YWxpZ24iKSAqIChjZWxsX2FyZWEud2lkdGggLSBjYWxjX3dpZHRoIC0gc2VsZi5nZXRfcHJvcGVydHkoInhwYWQiKSkKKyAgICAgICAgICAgICAgICB5X29mZnNldCA9IHNlbGYuZ2V0X3Byb3BlcnR5KCJ5YWxpZ24iKSAqIChjZWxsX2FyZWEuaGVpZ2h0IC0gY2FsY19oZWlnaHQgLSBzZWxmLmdldF9wcm9wZXJ0eSgieXBhZCIpKQorCisgICAgICAgICAgICByZXR1cm4geF9vZmZzZXQsIHlfb2Zmc2V0LCB3LCBoCisKKyAgICAgICAgcmV0dXJuIDAsIDAsIDAsIDAKKworZ29iamVjdC50eXBlX3JlZ2lzdGVyKEhvYkNlbGxSZW5kZXJlclBpeGJ1ZikKKworY2xhc3MgSG9iQ2VsbFJlbmRlcmVyVG9nZ2xlKGd0ay5DZWxsUmVuZGVyZXJUb2dnbGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLkNlbGxSZW5kZXJlclRvZ2dsZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmN0cmwgPSBIb2JDZWxsUmVuZGVyZXJDb250cm9sbGVyKGlzX2RyYXdfcm93PVRydWUpCisgICAgICAgIHNlbGYuY3RybC5ydW5uaW5nX21vZGUgPSBzZWxmLmN0cmwuTU9ERV9PTkVfU0hPUlQKKyAgICAgICAgc2VsZi5jZWxsX2F0dHIgPSB7ImZhZGVvdXQiOiBGYWxzZSwgIm51bWJlcl9vZl9jaGlsZHJlbiI6IDB9CisKKyAgICBkZWYgZG9fcmVuZGVyKHNlbGYsIHdpbmRvdywgd2lkZ2V0LCBiYWNrZ3JvdW5kX2FyZWEsIGNlbGxfYXJlYSwgZXhwb3NlX2FyZWEsIGZsYWdzKToKKyAgICAgICAgaWYgKG5vdCBzZWxmLmN0cmwpIG9yIChub3Qgd2lkZ2V0KToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGZsYWdzICYgZ3RrLkNFTExfUkVOREVSRVJfU0VMRUNURUQ6CisgICAgICAgICAgICBzdGF0ZSA9IGd0ay5TVEFURV9TRUxFQ1RFRAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdGUgPSBndGsuU1RBVEVfTk9STUFMCisKKyAgICAgICAgaWYgc2VsZi5jdHJsLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgcGF0aCA9IHdpZGdldC5nZXRfcGF0aF9hdF9wb3MoY2VsbF9hcmVhLnggKyBjZWxsX2FyZWEud2lkdGgvMiwgY2VsbF9hcmVhLnkgKyBjZWxsX2FyZWEuaGVpZ2h0LzIpCisgICAgICAgICAgICAjIHNvbWV0aW1lcyB0aGUgcGFyYW1ldGVycyBvZiBjZWxsX2FyZWEgd2lsbCBiZSBhIG5lZ2F0aXZlIG51bWJlcixzdWNoIGFzIHB1bGwgdXAgZG93biB0aGUgc2Nyb2xsIGJhcgorICAgICAgICAgICAgIyBpdCdzIG92ZXIgdGhlIHRyZWUgY29udGFpbmVyIHJhbmdlLCBzbyB0aGUgcGF0aCB3aWxsIGJlIGJhZAorICAgICAgICAgICAgaWYgbm90IHBhdGg6IHJldHVybgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMF0KKyAgICAgICAgICAgIGlmIHBhdGggaW4gc2VsZi5jdHJsLnJ1bm5pbmdfY2VsbF9hcmVhczoKKyAgICAgICAgICAgICAgICBjciA9IHdpbmRvdy5jYWlyb19jcmVhdGUoKQorICAgICAgICAgICAgICAgIGNvbG9yID0gd2lkZ2V0LmdldF9zdHlsZSgpLmJhc2Vbc3RhdGVdCisKKyAgICAgICAgICAgICAgICByb3dfeCwgXywgcm93X3dpZHRoLCBfID0gd2lkZ2V0LmdldF92aXNpYmxlX3JlY3QoKQorICAgICAgICAgICAgICAgIGJvcmRlcl95ID0gc2VsZi5nZXRfcHJvcGVydHkoInlwYWQiKQorICAgICAgICAgICAgICAgIHNlbGYuY3RybC5vbl9kcmF3X2ZhZGVpbm91dF9jYihjciwgY29sb3IsIHJvd194LCBjZWxsX2FyZWEueSAtIGJvcmRlcl95LCByb3dfd2lkdGgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbF9hcmVhLmhlaWdodCArIGJvcmRlcl95ICogMiwgc2VsZi5jZWxsX2F0dHJbImZhZGVvdXQiXSkKKyAgICAgICAgIyBkcmF3IG51bWJlciBvZiBhIGdyb3VwCisgICAgICAgIGlmIHNlbGYuY2VsbF9hdHRyWyJudW1iZXJfb2ZfY2hpbGRyZW4iXToKKyAgICAgICAgICAgIHRleHQgPSAiJWQgcGtnIiAlIHNlbGYuY2VsbF9hdHRyWyJudW1iZXJfb2ZfY2hpbGRyZW4iXQorICAgICAgICAgICAgcGFuZ29sYXlvdXQgPSB3aWRnZXQuY3JlYXRlX3BhbmdvX2xheW91dCh0ZXh0KQorICAgICAgICAgICAgdGV4dHcsIHRleHRoID0gcGFuZ29sYXlvdXQuZ2V0X3BpeGVsX3NpemUoKQorICAgICAgICAgICAgeCA9IGNlbGxfYXJlYS54ICsgKGNlbGxfYXJlYS53aWR0aC8yKSAtICh0ZXh0dy8yKQorICAgICAgICAgICAgeSA9IGNlbGxfYXJlYS55ICsgKGNlbGxfYXJlYS5oZWlnaHQvMikgLSAodGV4dGgvMikKKworICAgICAgICAgICAgd2lkZ2V0LnN0eWxlLnBhaW50X2xheW91dCh3aW5kb3csIHN0YXRlLCBUcnVlLCBjZWxsX2FyZWEsIHdpZGdldCwgImNoZWNrYm94IiwgeCwgeSwgcGFuZ29sYXlvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZ3RrLkNlbGxSZW5kZXJlclRvZ2dsZS5kb19yZW5kZXIoc2VsZiwgd2luZG93LCB3aWRnZXQsIGJhY2tncm91bmRfYXJlYSwgY2VsbF9hcmVhLCBleHBvc2VfYXJlYSwgZmxhZ3MpCisKKyAgICAnJydkZWxheTogbm9ybWFsbHkgZGVsYXkgdGltZSBpcyAxMDAwbXMKKyAgICAgICBjZWxsX2xpc3Q6IHdoaWxjaCBjZWxscyBuZWVkIHRvIGJlIHJlbmRlcgorICAgICcnJworICAgIGRlZiBmYWRlb3V0KHNlbGYsIHRyZWUsIGRlbGF5LCBjZWxsX2xpc3Q9Tm9uZSk6CisgICAgICAgIGlmIChkZWxheSA8IDIwMCkgb3IgKG5vdCB0cmVlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNlbGxfYXR0clsiZmFkZW91dCJdID0gVHJ1ZQorICAgICAgICBzZWxmLmN0cmwucnVubmluZ19jZWxsX2FyZWFzID0gY2VsbF9saXN0CisgICAgICAgIHNlbGYuY3RybC5zdGFydF9ydW4oMjAwLCAwLCAwLCBkZWxheSwgKGRlbGF5ICogMjAwIC8gMTAwMCksIHRyZWUpCisKKyAgICBkZWYgY29ubmVjdF9yZW5kZXJfc3RhdGVfY2hhbmdlZChzZWxmLCBmdW5jLCB1c3JkYXRhPU5vbmUpOgorICAgICAgICBpZiBub3QgZnVuYzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB1c3JkYXRhOgorICAgICAgICAgICAgc2VsZi5jdHJsLmNvbm5lY3QoInJ1bi10aW1lci1zdG9wcGVkIiwgZnVuYywgc2VsZiwgdXNyZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY3RybC5jb25uZWN0KCJydW4tdGltZXItc3RvcHBlZCIsIGZ1bmMsIHNlbGYpCisKK2dvYmplY3QudHlwZV9yZWdpc3RlcihIb2JDZWxsUmVuZGVyZXJUb2dnbGUpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaW1hZ2Vjb25maWd1cmF0aW9ucGFnZS5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9pbWFnZWNvbmZpZ3VyYXRpb25wYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjZiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvaW1hZ2Vjb25maWd1cmF0aW9ucGFnZS5weQpAQCAtMCwwICsxLDU2MSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdsaWIKK2ltcG9ydCByZQorZnJvbSBiYi51aS5jcnVtYnMucHJvZ3Jlc3NiYXIgaW1wb3J0IEhvYlByb2dyZXNzQmFyCitmcm9tIGJiLnVpLmNydW1icy5ob2Jjb2xvciBpbXBvcnQgSG9iQ29sb3JzCitmcm9tIGJiLnVpLmNydW1icy5ob2J3aWRnZXQgaW1wb3J0IGhpYywgSG9iSW1hZ2VCdXR0b24sIEhvYkluZm9CdXR0b24sIEhvYkFsdEJ1dHRvbiwgSG9iQnV0dG9uCitmcm9tIGJiLnVpLmNydW1icy5ob2JsaXN0bW9kZWwgaW1wb3J0IFJlY2lwZUxpc3RNb2RlbAorZnJvbSBiYi51aS5jcnVtYnMuaG9icGFnZXMgaW1wb3J0IEhvYlBhZ2UKK2Zyb20gYmIudWkuY3J1bWJzLmhpZy5yZXRyaWV2ZWltYWdlZGlhbG9nIGltcG9ydCBSZXRyaWV2ZUltYWdlRGlhbG9nCisKKyMKKyMgSW1hZ2VDb25maWd1cmF0aW9uUGFnZQorIworY2xhc3MgSW1hZ2VDb25maWd1cmF0aW9uUGFnZSAoSG9iUGFnZSk6CisKKyAgICBfX2R1bW15X21hY2hpbmVfXyA9ICItLXNlbGVjdCBhIG1hY2hpbmUtLSIKKyAgICBfX2R1bW15X2ltYWdlX18gICA9ICItLXNlbGVjdCBhbiBpbWFnZSByZWNpcGUtLSIKKyAgICBfX2N1c3RvbV9pbWFnZV9fICA9ICJTZWxlY3QgZnJvbSBteSBpbWFnZSByZWNpcGVzIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBzdXBlcihJbWFnZUNvbmZpZ3VyYXRpb25QYWdlLCBzZWxmKS5fX2luaXRfXyhidWlsZGVyLCAiSW1hZ2UgY29uZmlndXJhdGlvbiIpCisKKyAgICAgICAgc2VsZi5pbWFnZV9jb21ib19pZCA9IE5vbmUKKyAgICAgICAgIyB3ZSB1c2UgbWFjaGluZV9jb21ib19jaGFuZ2VkX2J5X21hbnVhbCB0byBpZGVudGlmeSB0aGUgbWFjaGluZSBpcyBjaGFuZ2VkIGJ5IGNvZGUKKyAgICAgICAgIyBvciBieSBtYW51YWwuIElmIGJ5IG1hbnVhbCwgYWxsIHVzZXIncyByZWNpcGUgc2VsZWN0aW9uIGFuZCBwYWNrYWdlIHNlbGVjdGlvbiBhcmUKKyAgICAgICAgIyBjbGVhcmVkLgorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm9fY2hhbmdlZF9ieV9tYW51YWwgPSBUcnVlCisgICAgICAgIHNlbGYuc3RvcHBpbmcgPSBGYWxzZQorICAgICAgICBzZWxmLndhcm5pbmdfc2hpZnQgPSAwCisgICAgICAgIHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkID0gTm9uZQorICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorCisgICAgZGVmIGNyZWF0ZV92aXN1YWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgICMgY3JlYXRlIHZpc3VhbCBlbGVtZW50cworICAgICAgICBzZWxmLnRvb2xiYXIgPSBndGsuVG9vbGJhcigpCisgICAgICAgIHNlbGYudG9vbGJhci5zZXRfb3JpZW50YXRpb24oZ3RrLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpCisgICAgICAgIHNlbGYudG9vbGJhci5zZXRfc3R5bGUoZ3RrLlRPT0xCQVJfQk9USCkKKworICAgICAgICBteV9pbWFnZXNfYnV0dG9uID0gc2VsZi5hcHBlbmRfdG9vbGJhcl9idXR0b24oc2VsZi50b29sYmFyLAorICAgICAgICAgICAgIkltYWdlcyIsCisgICAgICAgICAgICBoaWMuSUNPTl9JTUFHRVNfRElTUExBWV9GSUxFLAorICAgICAgICAgICAgaGljLklDT05fSU1BR0VTX0hPVkVSX0ZJTEUsCisgICAgICAgICAgICAiT3BlbiBwcmV2aW91c2x5IGJ1aWx0IGltYWdlcyIsCisgICAgICAgICAgICBzZWxmLm15X2ltYWdlc19idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgc2V0dGluZ3NfYnV0dG9uID0gc2VsZi5hcHBlbmRfdG9vbGJhcl9idXR0b24oc2VsZi50b29sYmFyLAorICAgICAgICAgICAgIlNldHRpbmdzIiwKKyAgICAgICAgICAgIGhpYy5JQ09OX1NFVFRJTkdTX0RJU1BMQVlfRklMRSwKKyAgICAgICAgICAgIGhpYy5JQ09OX1NFVFRJTkdTX0hPVkVSX0ZJTEUsCisgICAgICAgICAgICAiVmlldyBhZGRpdGlvbmFsIGJ1aWxkIHNldHRpbmdzIiwKKyAgICAgICAgICAgIHNlbGYuc2V0dGluZ3NfYnV0dG9uX2NsaWNrZWRfY2IpCisKKyAgICAgICAgc2VsZi5jb25maWdfdG9wX2J1dHRvbiA9IHNlbGYuYWRkX29udG9fdG9wX2JhcihzZWxmLnRvb2xiYXIpCisKKyAgICAgICAgc2VsZi5ndGFibGUgPSBndGsuVGFibGUoNDAsIDQwLCBUcnVlKQorICAgICAgICBzZWxmLmNyZWF0ZV9jb25maWdfbWFjaGluZSgpCisgICAgICAgIHNlbGYuY3JlYXRlX2NvbmZpZ19iYXNlaW1nKCkKKyAgICAgICAgc2VsZi5jb25maWdfYnVpbGRfYnV0dG9uID0gc2VsZi5jcmVhdGVfY29uZmlnX2J1aWxkX2J1dHRvbigpCisKKyAgICBkZWYgX3JlbW92ZV9hbGxfd2lkZ2V0KHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuZ3RhYmxlLmdldF9jaGlsZHJlbigpIG9yIFtdCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYuZ3RhYmxlLnJlbW92ZShjaGlsZCkKKyAgICAgICAgY2hpbGRyZW4gPSBzZWxmLmJveF9ncm91cF9hcmVhLmdldF9jaGlsZHJlbigpIG9yIFtdCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucmVtb3ZlKGNoaWxkKQorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuZ2V0X2NoaWxkcmVuKCkgb3IgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5yZW1vdmUoY2hpbGQpCisKKyAgICBkZWYgX3BhY2tfY29tcG9uZW50cyhzZWxmLCBwYWNrX2NvbmZpZ19idWlsZF9idXR0b24gPSBGYWxzZSk6CisgICAgICAgIHNlbGYuX3JlbW92ZV9hbGxfd2lkZ2V0KCkKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuY29uZmlnX3RvcF9idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZ3JvdXBfYWxpZ24sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuZ3RhYmxlLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorICAgICAgICBpZiBwYWNrX2NvbmZpZ19idWlsZF9idXR0b246CisgICAgICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfZW5kKHNlbGYuY29uZmlnX2J1aWxkX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgICAgICBib3guc2hvdygpCisgICAgICAgICAgICBzdWJib3ggPSBndGsuSEJveChGYWxzZSwgMCkKKyAgICAgICAgICAgIHN1YmJveC5zZXRfc2l6ZV9yZXF1ZXN0KDIwNSwgNDkpCisgICAgICAgICAgICBzdWJib3guc2hvdygpCisgICAgICAgICAgICBib3guYWRkKHN1YmJveCkKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19lbmQoYm94LCBGYWxzZSwgRmFsc2UpCisKKyAgICBkZWYgc2hvd19tYWNoaW5lKHNlbGYpOgorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5yZXNldCgpCisgICAgICAgIHNlbGYuX3BhY2tfY29tcG9uZW50cyhwYWNrX2NvbmZpZ19idWlsZF9idXR0b24gPSBGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfY29uZmlnX21hY2hpbmVfbGF5b3V0KHNob3dfcHJvZ3Jlc3NfYmFyID0gRmFsc2UpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIHVwZGF0ZV9wcm9ncmVzc19iYXIoc2VsZiwgdGl0bGUsIGZyYWN0aW9uLCBzdGF0dXM9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuc3RvcHBpbmcgPT0gRmFsc2U6CisgICAgICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci51cGRhdGUoZnJhY3Rpb24pCisgICAgICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRfdGV4dCh0aXRsZSkKKyAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNldF9yY3N0eWxlKHN0YXR1cykKKworICAgIGRlZiBzaG93X2luZm9fcG9wdWxhdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fcGFja19jb21wb25lbnRzKHBhY2tfY29uZmlnX2J1aWxkX2J1dHRvbiA9IEZhbHNlKQorICAgICAgICBzZWxmLnNldF9jb25maWdfbWFjaGluZV9sYXlvdXQoc2hvd19wcm9ncmVzc19iYXIgPSBUcnVlKQorICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBzaG93X2luZm9fcG9wdWxhdGVkKHNlbGYpOgorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5yZXNldCgpCisgICAgICAgIHNlbGYuX3BhY2tfY29tcG9uZW50cyhwYWNrX2NvbmZpZ19idWlsZF9idXR0b24gPSBGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfY29uZmlnX21hY2hpbmVfbGF5b3V0KHNob3dfcHJvZ3Jlc3NfYmFyID0gRmFsc2UpCisgICAgICAgIHNlbGYuc2V0X2NvbmZpZ19iYXNlaW1nX2xheW91dCgpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIHNob3dfYmFzZWltZ19zZWxlY3RlZChzZWxmKToKKyAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIucmVzZXQoKQorICAgICAgICBzZWxmLl9wYWNrX2NvbXBvbmVudHMocGFja19jb25maWdfYnVpbGRfYnV0dG9uID0gVHJ1ZSkKKyAgICAgICAgc2VsZi5zZXRfY29uZmlnX21hY2hpbmVfbGF5b3V0KHNob3dfcHJvZ3Jlc3NfYmFyID0gRmFsc2UpCisgICAgICAgIHNlbGYuc2V0X2NvbmZpZ19iYXNlaW1nX2xheW91dCgpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorICAgICAgICBpZiBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpID09IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgIHNlbGYuanVzdF9iYWtlX2J1dHRvbi5oaWRlKCkKKworICAgIGRlZiBhZGRfd2FybmluZ3NfYmFyKHNlbGYpOgorICAgICAgICAjY3JlYXRlIHRoZSB3YXJuaW5ncyBiYXIgc2hvd24gd2hlbiByZWNpcGVzIHBhcnNpbmcgZ2VuZXJhdGVzIHdhcm5pbmdzCisgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLktIQUtJCisgICAgICAgIHdhcm5pbmdzX2JhciA9IGd0ay5FdmVudEJveCgpCisgICAgICAgIHdhcm5pbmdzX2Jhci5tb2RpZnlfYmcoZ3RrLlNUQVRFX05PUk1BTCwgZ3RrLmdkay5jb2xvcl9wYXJzZShjb2xvcikpCisgICAgICAgIHdhcm5pbmdzX2Jhci5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICB3YXJuaW5nc19iYXIuZ3JhYl9kZWZhdWx0KCkKKworICAgICAgICBidWlsZF9zdG9wX3RhYiA9IGd0ay5UYWJsZSgxMCwgMjAsIFRydWUpCisgICAgICAgIHdhcm5pbmdzX2Jhci5hZGQoYnVpbGRfc3RvcF90YWIpCisKKyAgICAgICAgaWNvbiA9IGd0ay5JbWFnZSgpCisgICAgICAgIGljb25fcGl4X2J1ZmZlciA9IGd0ay5nZGsucGl4YnVmX25ld19mcm9tX2ZpbGUoaGljLklDT05fSU5ESV9BTEVSVF9GSUxFKQorICAgICAgICBpY29uLnNldF9mcm9tX3BpeGJ1ZihpY29uX3BpeF9idWZmZXIpCisgICAgICAgIGJ1aWxkX3N0b3BfdGFiLmF0dGFjaChpY29uLCAwLCAyLCAwLCAxMCkKKworICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIHdhcm5pbmdzX25iID0gbGVuKHNlbGYuYnVpbGRlci5wYXJzaW5nX3dhcm5pbmdzKQorICAgICAgICBpZiB3YXJuaW5nc19uYiA9PSAxOgorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gc2l6ZT0neC1sYXJnZSc+PGI+MSByZWNpcGUgcGFyc2luZyB3YXJuaW5nPC9iPjwvc3Bhbj4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gc2l6ZT0neC1sYXJnZSc+PGI+JXMgcmVjaXBlIHBhcnNpbmcgd2FybmluZ3M8L2I+PC9zcGFuPiIgJSB3YXJuaW5nc19uYikKKyAgICAgICAgYnVpbGRfc3RvcF90YWIuYXR0YWNoKGxhYmVsLCAyLCAxMiwgMCwgMTApCisKKyAgICAgICAgdmlld193YXJuaW5nc19idXR0b24gPSBIb2JCdXR0b24oIlZpZXcgd2FybmluZ3MiKQorICAgICAgICB2aWV3X3dhcm5pbmdzX2J1dHRvbi5jb25uZWN0KCdjbGlja2VkJywgc2VsZi52aWV3X3dhcm5pbmdzX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBidWlsZF9zdG9wX3RhYi5hdHRhY2godmlld193YXJuaW5nc19idXR0b24sIDE1LCAxOSwgMSwgOSkKKworICAgICAgICByZXR1cm4gd2FybmluZ3NfYmFyCisKKyAgICBkZWYgZGlzYWJsZV93YXJuaW5nc19iYXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5wYXJzaW5nX3dhcm5pbmdzOgorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnd2FybmluZ3NfYmFyJyk6CisgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nc19iYXIuaGlkZV9hbGwoKQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnBhcnNpbmdfd2FybmluZ3MgPSBbXQorCisgICAgZGVmIGNyZWF0ZV9jb25maWdfbWFjaGluZShzZWxmKToKKyAgICAgICAgc2VsZi5tYWNoaW5lX3RpdGxlID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5tYWNoaW5lX3RpdGxlLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIG1hcmsgPSAiPHNwYW4gJXM+U2VsZWN0IGEgbWFjaGluZTwvc3Bhbj4iICUgc2VsZi5zcGFuX3RhZygneC1sYXJnZScsICdib2xkJykKKyAgICAgICAgc2VsZi5tYWNoaW5lX3RpdGxlLnNldF9tYXJrdXAobWFyaykKKworICAgICAgICBzZWxmLm1hY2hpbmVfdGl0bGVfZGVzYyA9IGd0ay5MYWJlbCgpCisgICAgICAgIHNlbGYubWFjaGluZV90aXRsZV9kZXNjLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIG1hcmsgPSAoIjxzcGFuICVzPllvdXIgc2VsZWN0aW9uIGlzIHRoZSBwcm9maWxlIG9mIHRoZSB0YXJnZXQgbWFjaGluZSBmb3Igd2hpY2ggeW91IgorICAgICAgICAiIGFyZSBidWlsZGluZyB0aGUgaW1hZ2UuXG48L3NwYW4+IikgJSAoc2VsZi5zcGFuX3RhZygnbWVkaXVtJykpCisgICAgICAgIHNlbGYubWFjaGluZV90aXRsZV9kZXNjLnNldF9tYXJrdXAobWFyaykKKworICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8gPSBndGsuY29tYm9fYm94X25ld190ZXh0KCkKKyAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLm1hY2hpbmVfY29tYm9fY2hhbmdlZF9jYikKKworICAgICAgICBpY29uX2ZpbGUgPSBoaWMuSUNPTl9MQVlFUlNfRElTUExBWV9GSUxFCisgICAgICAgIGhvdmVyX2ZpbGUgPSBoaWMuSUNPTl9MQVlFUlNfSE9WRVJfRklMRQorICAgICAgICBzZWxmLmxheWVyX2J1dHRvbiA9IEhvYkltYWdlQnV0dG9uKCJMYXllcnMiLCAiQWRkIHN1cHBvcnQgZm9yIG1hY2hpbmVzLCBzb2Z0d2FyZSwgZXRjLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25fZmlsZSwgaG92ZXJfZmlsZSkKKyAgICAgICAgc2VsZi5sYXllcl9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYubGF5ZXJfYnV0dG9uX2NsaWNrZWRfY2IpCisKKyAgICAgICAgbWFya3VwID0gIkxheWVycyBhcmUgYSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gZXh0ZW5kIHRoZSBZb2N0byBQcm9qZWN0ICIKKyAgICAgICAgbWFya3VwICs9ICJ3aXRoIHlvdXIgb3duIGZ1bmN0aW9uYWxpdHkuXG4iCisgICAgICAgIG1hcmt1cCArPSAiRm9yIG1vcmUgb24gbGF5ZXJzLCBjaGVjayB0aGUgPGEgaHJlZj1cIiIKKyAgICAgICAgbWFya3VwICs9ICJodHRwOi8vd3d3LnlvY3RvcHJvamVjdC5vcmcvZG9jcy9jdXJyZW50L2Rldi1tYW51YWwvIgorICAgICAgICBtYXJrdXAgKz0gImRldi1tYW51YWwuaHRtbCN1bmRlcnN0YW5kaW5nLWFuZC11c2luZy1sYXllcnNcIj5yZWZlcmVuY2UgbWFudWFsPC9hPi4iCisgICAgICAgIHNlbGYubGF5ZXJfaW5mb19pY29uID0gSG9iSW5mb0J1dHRvbigiPGI+TGF5ZXJzPC9iPiIgKyAiKiIgKyBtYXJrdXAsIHNlbGYuZ2V0X3BhcmVudCgpKQorICAgICAgICBzZWxmLnByb2dyZXNzX2JhciA9IEhvYlByb2dyZXNzQmFyKCkKKyAgICAgICAgc2VsZi5zdG9wX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiU3RvcCIpCisgICAgICAgIHNlbGYuc3RvcF9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuc3RvcF9idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgc2VsZi5tYWNoaW5lX3NlcGFyYXRvciA9IGd0ay5IU2VwYXJhdG9yKCkKKworICAgIGRlZiBzZXRfY29uZmlnX21hY2hpbmVfbGF5b3V0KHNlbGYsIHNob3dfcHJvZ3Jlc3NfYmFyID0gRmFsc2UpOgorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5tYWNoaW5lX3RpdGxlLCAwLCA0MCwgMCwgNCkKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYubWFjaGluZV90aXRsZV9kZXNjLCAwLCA0MCwgNCwgNikKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYubWFjaGluZV9jb21ibywgMCwgMTIsIDcsIDEwKQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5sYXllcl9idXR0b24sIDE0LCAzNiwgNywgMTIpCisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLmxheWVyX2luZm9faWNvbiwgMzYsIDQwLCA3LCAxMSkKKyAgICAgICAgaWYgc2hvd19wcm9ncmVzc19iYXI6CisgICAgICAgICAgICAjc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYucHJvZ3Jlc3NfYm94LCAwLCA0MCwgMTUsIDE4KQorICAgICAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYucHJvZ3Jlc3NfYmFyLCAwLCAzNywgMTUsIDE4KQorICAgICAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYuc3RvcF9idXR0b24sIDM3LCA0MCwgMTUsIDE4LCAwLCAwKQorICAgICAgICBpZiBzZWxmLmJ1aWxkZXIucGFyc2luZ193YXJuaW5nczoKKyAgICAgICAgICAgIHNlbGYud2FybmluZ3NfYmFyID0gc2VsZi5hZGRfd2FybmluZ3NfYmFyKCkKKyAgICAgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLndhcm5pbmdzX2JhciwgMCwgNDAsIDE0LCAxOCkKKyAgICAgICAgICAgIHNlbGYud2FybmluZ19zaGlmdCA9IDQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2FybmluZ19zaGlmdCA9IDAKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYubWFjaGluZV9zZXBhcmF0b3IsIDAsIDQwLCAxMywgMTQpCisKKyAgICBkZWYgY3JlYXRlX2NvbmZpZ19iYXNlaW1nKHNlbGYpOgorICAgICAgICBzZWxmLmltYWdlX3RpdGxlID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5pbWFnZV90aXRsZS5zZXRfYWxpZ25tZW50KDAsIDEuMCkKKyAgICAgICAgbWFyayA9ICI8c3BhbiAlcz5TZWxlY3QgYW4gaW1hZ2UgcmVjaXBlPC9zcGFuPiIgJSBzZWxmLnNwYW5fdGFnKCd4LWxhcmdlJywgJ2JvbGQnKQorICAgICAgICBzZWxmLmltYWdlX3RpdGxlLnNldF9tYXJrdXAobWFyaykKKworICAgICAgICBzZWxmLmltYWdlX3RpdGxlX2Rlc2MgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLmltYWdlX3RpdGxlX2Rlc2Muc2V0X2FsaWdubWVudCgwLCAwLjUpCisKKyAgICAgICAgbWFyayA9ICgiPHNwYW4gJXM+SW1hZ2UgcmVjaXBlcyBhcmUgYSBzdGFydGluZyBwb2ludCBmb3IgdGhlIHR5cGUgb2YgaW1hZ2UgeW91IHdhbnQuICIKKyAgICAgICAgICAgICAgICAiWW91IGNhbiBidWlsZCB0aGVtIGFzIFxuIgorICAgICAgICAgICAgICAgICJ0aGV5IGFyZSBvciBlZGl0IHRoZW0gdG8gc3VpdCB5b3VyIG5lZWRzLlxuPC9zcGFuPiIpICUgc2VsZi5zcGFuX3RhZygnbWVkaXVtJykKKyAgICAgICAgc2VsZi5pbWFnZV90aXRsZV9kZXNjLnNldF9tYXJrdXAobWFyaykKKworICAgICAgICBzZWxmLmltYWdlX2NvbWJvID0gZ3RrLmNvbWJvX2JveF9uZXdfdGV4dCgpCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uc2V0X3Jvd19zZXBhcmF0b3JfZnVuYyhzZWxmLmNvbWJvX3NlcGFyYXRvcl9mdW5jLCBOb25lKQorICAgICAgICBzZWxmLmltYWdlX2NvbWJvX2lkID0gc2VsZi5pbWFnZV9jb21iby5jb25uZWN0KCJjaGFuZ2VkIiwgc2VsZi5pbWFnZV9jb21ib19jaGFuZ2VkX2NiKQorCisgICAgICAgIHNlbGYuaW1hZ2VfZGVzYyA9IGd0ay5MYWJlbCgpCisgICAgICAgIHNlbGYuaW1hZ2VfZGVzYy5zZXRfYWxpZ25tZW50KDAuMCwgMC41KQorICAgICAgICBzZWxmLmltYWdlX2Rlc2Muc2V0X3NpemVfcmVxdWVzdCgyNTYsIC0xKQorICAgICAgICBzZWxmLmltYWdlX2Rlc2Muc2V0X2p1c3RpZnkoZ3RrLkpVU1RJRllfTEVGVCkKKyAgICAgICAgc2VsZi5pbWFnZV9kZXNjLnNldF9saW5lX3dyYXAoVHJ1ZSkKKworICAgICAgICAjIGJ1dHRvbiB0byB2aWV3IHJlY2lwZXMKKyAgICAgICAgaWNvbl9maWxlID0gaGljLklDT05fUkNJUEVfRElTUExBWV9GSUxFCisgICAgICAgIGhvdmVyX2ZpbGUgPSBoaWMuSUNPTl9SQ0lQRV9IT1ZFUl9GSUxFCisgICAgICAgIHNlbGYudmlld19hZHZfY29uZmlndXJhdGlvbl9idXR0b24gPSBIb2JJbWFnZUJ1dHRvbigiQWR2YW5jZWQgY29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWxlY3QgaW1hZ2UgdHlwZXMsIHBhY2thZ2UgZm9ybWF0cywgZXRjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbl9maWxlLCBob3Zlcl9maWxlKSAgICAgICAgCisgICAgICAgIHNlbGYudmlld19hZHZfY29uZmlndXJhdGlvbl9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYudmlld19hZHZfY29uZmlndXJhdGlvbl9idXR0b25fY2xpY2tlZF9jYikKKworICAgICAgICBzZWxmLmltYWdlX3NlcGFyYXRvciA9IGd0ay5IU2VwYXJhdG9yKCkKKworICAgIGRlZiBjb21ib19zZXBhcmF0b3JfZnVuYyhzZWxmLCBtb2RlbCwgaXRlciwgdXNlcl9kYXRhKToKKyAgICAgICAgbmFtZSA9IG1vZGVsLmdldF92YWx1ZShpdGVyLCAwKQorICAgICAgICBpZiBuYW1lID09ICItLVNlcGFyYXRvci0tIjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X2NvbmZpZ19iYXNlaW1nX2xheW91dChzZWxmKToKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYuaW1hZ2VfdGl0bGUsIDAsIDQwLCAxNStzZWxmLndhcm5pbmdfc2hpZnQsIDE3K3NlbGYud2FybmluZ19zaGlmdCkKKyAgICAgICAgc2VsZi5ndGFibGUuYXR0YWNoKHNlbGYuaW1hZ2VfdGl0bGVfZGVzYywgMCwgNDAsIDE4K3NlbGYud2FybmluZ19zaGlmdCwgMjIrc2VsZi53YXJuaW5nX3NoaWZ0KQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5pbWFnZV9jb21ibywgMCwgMTIsIDIzK3NlbGYud2FybmluZ19zaGlmdCwgMjYrc2VsZi53YXJuaW5nX3NoaWZ0KQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5pbWFnZV9kZXNjLCAwLCAxMiwgMjcrc2VsZi53YXJuaW5nX3NoaWZ0LCAzMytzZWxmLndhcm5pbmdfc2hpZnQpCisgICAgICAgIHNlbGYuZ3RhYmxlLmF0dGFjaChzZWxmLnZpZXdfYWR2X2NvbmZpZ3VyYXRpb25fYnV0dG9uLCAxNCwgMzYsIDIzK3NlbGYud2FybmluZ19zaGlmdCwgMjgrc2VsZi53YXJuaW5nX3NoaWZ0KQorICAgICAgICBzZWxmLmd0YWJsZS5hdHRhY2goc2VsZi5pbWFnZV9zZXBhcmF0b3IsIDAsIDQwLCAzNStzZWxmLndhcm5pbmdfc2hpZnQsIDM2K3NlbGYud2FybmluZ19zaGlmdCkKKworICAgIGRlZiBjcmVhdGVfY29uZmlnX2J1aWxkX2J1dHRvbihzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgdGhlICJCdWlsZCBwYWNrYWdlcyIgYW5kICJCdWlsZCBpbWFnZSIgYnV0dG9ucyBhdCB0aGUgYm90dG9tCisgICAgICAgIGJ1dHRvbl9ib3ggPSBndGsuSEJveChGYWxzZSwgNikKKworICAgICAgICAjIGNyZWF0ZSBidXR0b24gIkJ1aWxkIGltYWdlIgorICAgICAgICBzZWxmLmp1c3RfYmFrZV9idXR0b24gPSBIb2JCdXR0b24oIkJ1aWxkIGltYWdlIikKKyAgICAgICAgc2VsZi5qdXN0X2Jha2VfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkJ1aWxkIHRoZSBpbWFnZSByZWNpcGUgYXMgaXQgaXMiKQorICAgICAgICBzZWxmLmp1c3RfYmFrZV9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuanVzdF9iYWtlX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBidXR0b25fYm94LnBhY2tfZW5kKHNlbGYuanVzdF9iYWtlX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgICMgY3JlYXRlIGJ1dHRvbiAiRWRpdCBpbWFnZSByZWNpcGUiCisgICAgICAgIHNlbGYuZWRpdF9pbWFnZV9idXR0b24gPSBIb2JBbHRCdXR0b24oIkVkaXQgaW1hZ2UgcmVjaXBlIikKKyAgICAgICAgc2VsZi5lZGl0X2ltYWdlX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJDdXN0b21pemUgdGhlIHJlY2lwZXMgYW5kIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHlvdXIgaW1hZ2UiKQorICAgICAgICBzZWxmLmVkaXRfaW1hZ2VfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmVkaXRfaW1hZ2VfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIGJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5lZGl0X2ltYWdlX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHJldHVybiBidXR0b25fYm94CisKKyAgICBkZWYgc3RvcF9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLnN0b3BwaW5nID0gVHJ1ZQorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRfdGV4dCgiU3RvcHBpbmcgcmVjaXBlIHBhcnNpbmciKQorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRfcmNzdHlsZSgic3RvcCIpCisgICAgICAgIHNlbGYuYnVpbGRlci5jYW5jZWxfcGFyc2Vfc3luYygpCisKKyAgICBkZWYgdmlld193YXJuaW5nc19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd193YXJuaW5nX2RpYWxvZygpCisKKyAgICBkZWYgbWFjaGluZV9jb21ib19jaGFuZ2VkX2lkbGVfY2Ioc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3cuc2V0X2N1cnNvcihOb25lKQorCisgICAgZGVmIG1hY2hpbmVfY29tYm9fY2hhbmdlZF9jYihzZWxmLCBtYWNoaW5lX2NvbWJvKToKKyAgICAgICAgc2VsZi5zdG9wcGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuYnVpbGRlci5wYXJzaW5nX3dhcm5pbmdzID0gW10KKyAgICAgICAgY29tYm9faXRlbSA9IG1hY2hpbmVfY29tYm8uZ2V0X2FjdGl2ZV90ZXh0KCkKKyAgICAgICAgaWYgbm90IGNvbWJvX2l0ZW0gb3IgY29tYm9faXRlbSA9PSBzZWxmLl9fZHVtbXlfbWFjaGluZV9fOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvdy5zZXRfY3Vyc29yKGd0ay5nZGsuQ3Vyc29yKGd0ay5nZGsuV0FUQ0gpKQorICAgICAgICBzZWxmLmJ1aWxkZXIud2FpdCgwLjEpICN3YWl0IGZvciBjb21ibyBhbmQgY3Vyc29yIHRvIHVwZGF0ZQorCisgICAgICAgICMgcmVtb3ZlIF9fZHVtbXlfbWFjaGluZV9fIGl0ZW0gZnJvbSB0aGUgc3RvcmUgbGlzdCBhZnRlciBmaXJzdCB1c2VyIHNlbGVjdGlvbgorICAgICAgICAjIGJlY2F1c2UgaXQgaXMgbm8gbG9uZ2VyIHZhbGlkCisgICAgICAgIGNvbWJvX3N0b3JlID0gbWFjaGluZV9jb21iby5nZXRfbW9kZWwoKQorICAgICAgICBpZiBsZW4oY29tYm9fc3RvcmUpIGFuZCAoY29tYm9fc3RvcmVbMF1bMF0gPT0gc2VsZi5fX2R1bW15X21hY2hpbmVfXyk6CisgICAgICAgICAgICBtYWNoaW5lX2NvbWJvLnJlbW92ZV90ZXh0KDApCisKKyAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uY3Vycl9tYWNoID0gY29tYm9faXRlbQorICAgICAgICBpZiBzZWxmLm1hY2hpbmVfY29tYm9fY2hhbmdlZF9ieV9tYW51YWw6CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5jbGVhcl9zZWxlY3Rpb24oKQorICAgICAgICAjIHJlc2V0IG1hY2hpbmVfY29tYm9fY2hhbmdlZF9ieV9tYW51YWwKKyAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvX2NoYW5nZWRfYnlfbWFudWFsID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlID0gTm9uZQorCisgICAgICAgICMgRG8gcmVwYXJzZSByZWNpcGVzCisgICAgICAgIHNlbGYuYnVpbGRlci5wb3B1bGF0ZV9yZWNpcGVfcGFja2FnZV9pbmZvX2FzeW5jKCkKKworICAgICAgICBnbGliLmlkbGVfYWRkKHNlbGYubWFjaGluZV9jb21ib19jaGFuZ2VkX2lkbGVfY2IpCisKKyAgICBkZWYgdXBkYXRlX21hY2hpbmVfY29tYm8oc2VsZik6CisgICAgICAgIHNlbGYuZGlzYWJsZV93YXJuaW5nc19iYXIoKQorICAgICAgICBhbGxfbWFjaGluZXMgPSBbc2VsZi5fX2R1bW15X21hY2hpbmVfX10gKyBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5hbGxfbWFjaGluZXMKKworICAgICAgICBtb2RlbCA9IHNlbGYubWFjaGluZV9jb21iby5nZXRfbW9kZWwoKQorICAgICAgICBtb2RlbC5jbGVhcigpCisgICAgICAgIGZvciBtYWNoaW5lIGluIGFsbF9tYWNoaW5lczoKKyAgICAgICAgICAgIHNlbGYubWFjaGluZV9jb21iby5hcHBlbmRfdGV4dChtYWNoaW5lKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uc2V0X2FjdGl2ZSgwKQorCisgICAgZGVmIHN3aXRjaF9tYWNoaW5lX2NvbWJvKHNlbGYpOgorICAgICAgICBzZWxmLmRpc2FibGVfd2FybmluZ3NfYmFyKCkKKyAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvX2NoYW5nZWRfYnlfbWFudWFsID0gRmFsc2UKKyAgICAgICAgbW9kZWwgPSBzZWxmLm1hY2hpbmVfY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgYWN0aXZlID0gMAorICAgICAgICB3aGlsZSBhY3RpdmUgPCBsZW4obW9kZWwpOgorICAgICAgICAgICAgaWYgbW9kZWxbYWN0aXZlXVswXSA9PSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5jdXJyX21hY2g6CisgICAgICAgICAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLnNldF9hY3RpdmUoYWN0aXZlKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgYWN0aXZlICs9IDEKKworICAgICAgICBpZiBtb2RlbFswXVswXSAhPSBzZWxmLl9fZHVtbXlfbWFjaGluZV9fOgorICAgICAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLmluc2VydF90ZXh0KDAsIHNlbGYuX19kdW1teV9tYWNoaW5lX18pCisKKyAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLnNldF9hY3RpdmUoMCkKKworICAgIGRlZiB1cGRhdGVfaW1hZ2VfZGVzYyhzZWxmKToKKyAgICAgICAgZGVzYyA9ICIiCisgICAgICAgIHNlbGVjdGVkX2ltYWdlID0gc2VsZi5pbWFnZV9jb21iby5nZXRfYWN0aXZlX3RleHQoKQorICAgICAgICBpZiBzZWxlY3RlZF9pbWFnZSBhbmQgc2VsZWN0ZWRfaW1hZ2UgaW4gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5wbl9wYXRoLmtleXMoKToKKyAgICAgICAgICAgIGltYWdlX3BhdGggPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLnBuX3BhdGhbc2VsZWN0ZWRfaW1hZ2VdCisgICAgICAgICAgICBpbWFnZV9pdGVyID0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5nZXRfaXRlcihpbWFnZV9wYXRoKQorICAgICAgICAgICAgZGVzYyA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuZ2V0X3ZhbHVlKGltYWdlX2l0ZXIsIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuQ09MX0RFU0MpCisKKyAgICAgICAgbWFyayA9ICgiPHNwYW4gJXM+JXM8L3NwYW4+XG4iKSAlIChzZWxmLnNwYW5fdGFnKCdzbWFsbCcpLCBkZXNjKQorICAgICAgICBzZWxmLmltYWdlX2Rlc2Muc2V0X21hcmt1cChtYXJrKQorCisgICAgZGVmIGltYWdlX2NvbWJvX2NoYW5nZWRfaWRsZV9jYihzZWxmLCBzZWxlY3RlZF9pbWFnZSwgc2VsZWN0ZWRfcmVjaXBlcywgc2VsZWN0ZWRfcGFja2FnZXMpOgorICAgICAgICBzZWxmLmJ1aWxkZXIudXBkYXRlX3JlY2lwZV9tb2RlbChzZWxlY3RlZF9pbWFnZSwgc2VsZWN0ZWRfcmVjaXBlcykKKyAgICAgICAgc2VsZi5idWlsZGVyLnVwZGF0ZV9wYWNrYWdlX21vZGVsKHNlbGVjdGVkX3BhY2thZ2VzKQorICAgICAgICBzZWxmLmJ1aWxkZXIud2luZG93X3NlbnNpdGl2ZShUcnVlKQorCisgICAgZGVmIGltYWdlX2NvbWJvX2NoYW5nZWRfY2Ioc2VsZiwgY29tYm8pOgorICAgICAgICBzZWxmLmJ1aWxkZXIud2luZG93X3NlbnNpdGl2ZShGYWxzZSkKKyAgICAgICAgc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLmltYWdlX2NvbWJvLmdldF9hY3RpdmVfdGV4dCgpCisgICAgICAgIGlmIHNlbGVjdGVkX2ltYWdlID09IHNlbGYuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgIHRvcGRpciA9IHNlbGYuYnVpbGRlci5nZXRfdG9wZGlyKCkKKyAgICAgICAgICAgIGltYWdlc19kaXIgPSB0b3BkaXIgKyAiL3JlY2lwZXMvaW1hZ2VzL2N1c3RvbS8iCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuZW5zdXJlX2RpcihpbWFnZXNfZGlyKQorCisgICAgICAgICAgICBkaWFsb2cgPSBSZXRyaWV2ZUltYWdlRGlhbG9nKGltYWdlc19kaXIsICJTZWxlY3QgZnJvbSBteSBpbWFnZSByZWNpcGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkZXIsIGd0ay5ESUFMT0dfTU9EQUwgfCBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQpCisgICAgICAgICAgICByZXNwb25zZSA9IGRpYWxvZy5ydW4oKQorICAgICAgICAgICAgaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX09LOgorICAgICAgICAgICAgICAgIGltYWdlX25hbWUgPSBkaWFsb2cuZ2V0X2ZpbGVuYW1lKCkKKyAgICAgICAgICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChpbWFnZV9uYW1lKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkX2ltYWdlID0gb3MucGF0aC5zcGxpdGV4dCh0YWlsKVswXQorICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkID0gc2VsZWN0ZWRfaW1hZ2UKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9pbWFnZV9jb21ibyhzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLCBzZWxlY3RlZF9pbWFnZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLl9fZHVtbXlfaW1hZ2VfXworICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2ltYWdlX2NvbWJvKHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwsIE5vbmUpCisgICAgICAgICAgICBkaWFsb2cuZGVzdHJveSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmN1c3RvbV9pbWFnZV9zZWxlY3RlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmN1c3RvbV9pbWFnZV9zZWxlY3RlZCA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9pbWFnZV9jb21ibyhzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLCBzZWxlY3RlZF9pbWFnZSkKKworICAgICAgICBpZiBub3Qgc2VsZWN0ZWRfaW1hZ2Ugb3IgKHNlbGVjdGVkX2ltYWdlID09IHNlbGYuX19kdW1teV9pbWFnZV9fKToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3dfc2Vuc2l0aXZlKFRydWUpCisgICAgICAgICAgICBzZWxmLmp1c3RfYmFrZV9idXR0b24uaGlkZSgpCisgICAgICAgICAgICBzZWxmLmVkaXRfaW1hZ2VfYnV0dG9uLmhpZGUoKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyByZW1vdmUgX19kdW1teV9pbWFnZV9fIGl0ZW0gZnJvbSB0aGUgc3RvcmUgbGlzdCBhZnRlciBmaXJzdCB1c2VyIHNlbGVjdGlvbgorICAgICAgICAjIGJlY2F1c2UgaXQgaXMgbm8gbG9uZ2VyIHZhbGlkCisgICAgICAgIGNvbWJvX3N0b3JlID0gY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgaWYgbGVuKGNvbWJvX3N0b3JlKSBhbmQgKGNvbWJvX3N0b3JlWzBdWzBdID09IHNlbGYuX19kdW1teV9pbWFnZV9fKToKKyAgICAgICAgICAgIGNvbWJvLnJlbW92ZV90ZXh0KDApCisKKyAgICAgICAgc2VsZi5idWlsZGVyLmN1c3RvbWl6ZWQgPSBGYWxzZQorCisgICAgICAgIHNlbGVjdGVkX3JlY2lwZXMgPSBbXQorCisgICAgICAgIGltYWdlX3BhdGggPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLnBuX3BhdGhbc2VsZWN0ZWRfaW1hZ2VdCisgICAgICAgIGltYWdlX2l0ZXIgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmdldF9pdGVyKGltYWdlX3BhdGgpCisgICAgICAgIHNlbGVjdGVkX3BhY2thZ2VzID0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5nZXRfdmFsdWUoaW1hZ2VfaXRlciwgc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5DT0xfSU5TVEFMTCkuc3BsaXQoKQorICAgICAgICBzZWxmLnVwZGF0ZV9pbWFnZV9kZXNjKCkKKworICAgICAgICBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLnJlc2V0KCkKKyAgICAgICAgc2VsZi5idWlsZGVyLnBhY2thZ2VfbW9kZWwucmVzZXQoKQorCisgICAgICAgIHNlbGYuc2hvd19iYXNlaW1nX3NlbGVjdGVkKCkKKworICAgICAgICBpZiBzZWxlY3RlZF9pbWFnZSA9PSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICBzZWxmLmp1c3RfYmFrZV9idXR0b24uaGlkZSgpCisKKyAgICAgICAgZ2xpYi5pZGxlX2FkZChzZWxmLmltYWdlX2NvbWJvX2NoYW5nZWRfaWRsZV9jYiwgc2VsZWN0ZWRfaW1hZ2UsIHNlbGVjdGVkX3JlY2lwZXMsIHNlbGVjdGVkX3BhY2thZ2VzKQorCisgICAgZGVmIF9pbWFnZV9jb21ib19jb25uZWN0X3NpZ25hbChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaW1hZ2VfY29tYm9faWQ6CisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbWJvX2lkID0gc2VsZi5pbWFnZV9jb21iby5jb25uZWN0KCJjaGFuZ2VkIiwgc2VsZi5pbWFnZV9jb21ib19jaGFuZ2VkX2NiKQorCisgICAgZGVmIF9pbWFnZV9jb21ib19kaXNjb25uZWN0X3NpZ25hbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbWFnZV9jb21ib19pZDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uZGlzY29ubmVjdChzZWxmLmltYWdlX2NvbWJvX2lkKQorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb21ib19pZCA9IE5vbmUKKworICAgIGRlZiB1cGRhdGVfaW1hZ2VfY29tYm8oc2VsZiwgcmVjaXBlX21vZGVsLCBzZWxlY3RlZF9pbWFnZSk6CisgICAgICAgICMgVXBkYXRlIHRoZSBpbWFnZSBjb21ibyBhY2NvcmRpbmcgdG8gdGhlIGltYWdlcyBpbiB0aGUgcmVjaXBlX21vZGVsCisgICAgICAgICMgcG9wdWxhdGUgaW1hZ2UgY29tYm8KKyAgICAgICAgZmlsdGVyID0ge1JlY2lwZUxpc3RNb2RlbC5DT0xfVFlQRSA6IFsnaW1hZ2UnXX0KKyAgICAgICAgaW1hZ2VfbW9kZWwgPSByZWNpcGVfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIpCisgICAgICAgIGltYWdlX21vZGVsLnNldF9zb3J0X2NvbHVtbl9pZChyZWNpcGVfbW9kZWwuQ09MX05BTUUsIGd0ay5TT1JUX0FTQ0VORElORykKKyAgICAgICAgYWN0aXZlID0gMAorICAgICAgICBjbnQgPSAwCisKKyAgICAgICAgd2hpdGVfcGF0dGVybiA9IFtdCisgICAgICAgIGlmIHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLmltYWdlX3doaXRlX3BhdHRlcm46CisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5pbWFnZV93aGl0ZV9wYXR0ZXJuLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgd2hpdGVfcGF0dGVybi5hcHBlbmQocmUuY29tcGlsZShpKSkKKworICAgICAgICBibGFja19wYXR0ZXJuID0gW10KKyAgICAgICAgaWYgc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMuaW1hZ2VfYmxhY2tfcGF0dGVybjoKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLmltYWdlX2JsYWNrX3BhdHRlcm4uc3BsaXQoKToKKyAgICAgICAgICAgICAgICBibGFja19wYXR0ZXJuLmFwcGVuZChyZS5jb21waWxlKGkpKQorICAgICAgICBibGFja19wYXR0ZXJuLmFwcGVuZChyZS5jb21waWxlKCJob2ItaW1hZ2UiKSkKKyAgICAgICAgYmxhY2tfcGF0dGVybi5hcHBlbmQocmUuY29tcGlsZSgiZWRpdGVkKC1bMC05XSopKi5iYiQiKSkKKworICAgICAgICBpdCA9IGltYWdlX21vZGVsLmdldF9pdGVyX2ZpcnN0KCkKKyAgICAgICAgc2VsZi5faW1hZ2VfY29tYm9fZGlzY29ubmVjdF9zaWduYWwoKQorICAgICAgICBtb2RlbCA9IHNlbGYuaW1hZ2VfY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgbW9kZWwuY2xlYXIoKQorICAgICAgICAjIFNldCBhIGluZGljYXRvciB0ZXh0IHRvIGNvbWJvIHN0b3JlIHdoZW4gZmlyc3Qgb3BlbgorICAgICAgICBpZiBub3Qgc2VsZWN0ZWRfaW1hZ2U6CisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbWJvLmFwcGVuZF90ZXh0KHNlbGYuX19kdW1teV9pbWFnZV9fKQorICAgICAgICAgICAgY250ID0gY250ICsgMQorCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uYXBwZW5kX3RleHQoc2VsZi5fX2N1c3RvbV9pbWFnZV9fKQorICAgICAgICBzZWxmLmltYWdlX2NvbWJvLmFwcGVuZF90ZXh0KCItLVNlcGFyYXRvci0tIikKKyAgICAgICAgY250ID0gY250ICsgMgorCisgICAgICAgIHRvcGRpciA9IHNlbGYuYnVpbGRlci5nZXRfdG9wZGlyKCkKKyAgICAgICAgIyBhcHBlbmQgYW5kIHNldCBhY3RpdmUKKyAgICAgICAgd2hpbGUgaXQ6CisgICAgICAgICAgICBwYXRoID0gaW1hZ2VfbW9kZWwuZ2V0X3BhdGgoaXQpCisgICAgICAgICAgICBpdCA9IGltYWdlX21vZGVsLml0ZXJfbmV4dChpdCkKKyAgICAgICAgICAgIGltYWdlX25hbWUgPSBpbWFnZV9tb2RlbFtwYXRoXVtyZWNpcGVfbW9kZWwuQ09MX05BTUVdCisgICAgICAgICAgICBpZiBpbWFnZV9uYW1lID09IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBibGFja19wYXR0ZXJuOgorICAgICAgICAgICAgICAgIGFsbG93ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIGJsYWNrX3BhdHRlcm46CisgICAgICAgICAgICAgICAgICAgIGlmIHBhdHRlcm4uc2VhcmNoKGltYWdlX25hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgd2hpdGVfcGF0dGVybjoKKyAgICAgICAgICAgICAgICBhbGxvdyA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gd2hpdGVfcGF0dGVybjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcGF0dGVybi5zZWFyY2goaW1hZ2VfbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFsbG93ID0gVHJ1ZQorCisgICAgICAgICAgICBmaWxlX25hbWUgPSBpbWFnZV9tb2RlbFtwYXRoXVtyZWNpcGVfbW9kZWwuQ09MX0ZJTEVdCisgICAgICAgICAgICBpZiBmaWxlX25hbWUgYW5kIHRvcGRpciBpbiBmaWxlX25hbWU6CisgICAgICAgICAgICAgICAgYWxsb3cgPSBGYWxzZQorCisgICAgICAgICAgICBpZiBhbGxvdzoKKyAgICAgICAgICAgICAgICBzZWxmLmltYWdlX2NvbWJvLmFwcGVuZF90ZXh0KGltYWdlX25hbWUpCisgICAgICAgICAgICAgICAgaWYgaW1hZ2VfbmFtZSA9PSBzZWxlY3RlZF9pbWFnZToKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gY250CisgICAgICAgICAgICAgICAgY250ID0gY250ICsgMQorICAgICAgICBzZWxmLmltYWdlX2NvbWJvLmFwcGVuZF90ZXh0KHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXykKKworICAgICAgICBpZiBzZWxlY3RlZF9pbWFnZSA9PSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLl9fY3VzdG9tX2ltYWdlX186CisgICAgICAgICAgICBhY3RpdmUgPSBjbnQKKworICAgICAgICBpZiBzZWxmLmN1c3RvbV9pbWFnZV9zZWxlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uYXBwZW5kX3RleHQoIi0tU2VwYXJhdG9yLS0iKQorICAgICAgICAgICAgc2VsZi5pbWFnZV9jb21iby5hcHBlbmRfdGV4dChzZWxmLmN1c3RvbV9pbWFnZV9zZWxlY3RlZCkKKyAgICAgICAgICAgIGNudCA9IGNudCArIDIKKyAgICAgICAgICAgIGlmIHNlbGYuY3VzdG9tX2ltYWdlX3NlbGVjdGVkID09IHNlbGVjdGVkX2ltYWdlOgorICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGNudAorCisgICAgICAgIHNlbGYuaW1hZ2VfY29tYm8uc2V0X2FjdGl2ZShhY3RpdmUpCisKKyAgICAgICAgaWYgYWN0aXZlICE9IDA6CisgICAgICAgICAgICBzZWxmLnNob3dfYmFzZWltZ19zZWxlY3RlZCgpCisKKyAgICAgICAgc2VsZi5faW1hZ2VfY29tYm9fY29ubmVjdF9zaWduYWwoKQorCisgICAgZGVmIGxheWVyX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgICMgQ3JlYXRlIGEgbGF5ZXIgc2VsZWN0aW9uIGRpYWxvZworICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19sYXllcl9zZWxlY3Rpb25fZGlhbG9nKCkKKworICAgIGRlZiB2aWV3X2Fkdl9jb25maWd1cmF0aW9uX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgICMgQ3JlYXRlIGFuIGFkdmFuY2VkIHNldHRpbmdzIGRpYWxvZworICAgICAgICByZXNwb25zZSwgc2V0dGluZ3NfY2hhbmdlZCA9IHNlbGYuYnVpbGRlci5zaG93X2Fkdl9zZXR0aW5nc19kaWFsb2coKQorICAgICAgICBpZiBub3QgcmVzcG9uc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2V0dGluZ3NfY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3cuc2V0X2N1cnNvcihndGsuZ2RrLkN1cnNvcihndGsuZ2RrLldBVENIKSkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci53YWl0KDAuMSkgI3dhaXQgZm9yIGFkdl9zZXR0aW5nc19kaWFsb2cgdG8gdGVybWluYXRlCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucmVwYXJzZV9wb3N0X2Fkdl9zZXR0aW5ncygpCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIud2luZG93LnNldF9jdXJzb3IoTm9uZSkKKworICAgIGRlZiBqdXN0X2Jha2VfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLnBhcnNpbmdfd2FybmluZ3MgPSBbXQorICAgICAgICBzZWxmLmJ1aWxkZXIuanVzdF9iYWtlKCkKKworICAgIGRlZiBlZGl0X2ltYWdlX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zZXRfYmFzZV9pbWFnZSgpCisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X3JlY2lwZXMoKQorCisgICAgZGVmIG15X2ltYWdlc19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19sb2FkX215X2ltYWdlc19kaWFsb2coKQorCisgICAgZGVmIHNldHRpbmdzX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgICMgQ3JlYXRlIGFuIGFkdmFuY2VkIHNldHRpbmdzIGRpYWxvZworICAgICAgICByZXNwb25zZSwgc2V0dGluZ3NfY2hhbmdlZCA9IHNlbGYuYnVpbGRlci5zaG93X3NpbXBsZV9zZXR0aW5nc19kaWFsb2coKQorICAgICAgICBpZiBub3QgcmVzcG9uc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2V0dGluZ3NfY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yZXBhcnNlX3Bvc3RfYWR2X3NldHRpbmdzKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9pbWFnZWRldGFpbHNwYWdlLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL2ltYWdlZGV0YWlsc3BhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzUyZTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9pbWFnZWRldGFpbHNwYWdlLnB5CkBAIC0wLDAgKzEsNjY5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGd0aworZnJvbSBiYi51aS5jcnVtYnMuaG9iY29sb3IgaW1wb3J0IEhvYkNvbG9ycworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBoaWMsIEhvYlZpZXdUYWJsZSwgSG9iQWx0QnV0dG9uLCBIb2JCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLmhvYnBhZ2VzIGltcG9ydCBIb2JQYWdlCitpbXBvcnQgc3VicHJvY2VzcworZnJvbSBiYi51aS5jcnVtYnMuaGlnLmNydW1ic2RpYWxvZyBpbXBvcnQgQ3J1bWJzRGlhbG9nCitmcm9tIGJiLnVpLmNydW1icy5oaWcuc2F2ZWltYWdlZGlhbG9nIGltcG9ydCBTYXZlSW1hZ2VEaWFsb2cKKworIworIyBJbWFnZURldGFpbHNQYWdlCisjCitjbGFzcyBJbWFnZURldGFpbHNQYWdlIChIb2JQYWdlKToKKworICAgIGNsYXNzIERldGFpbEJveCAoZ3RrLkV2ZW50Qm94KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpZGdldCA9IE5vbmUsIHZhcmxpc3QgPSBOb25lLCB2YWxsaXN0ID0gTm9uZSwgaWNvbiA9IE5vbmUsIGJ1dHRvbiA9IE5vbmUsIGJ1dHRvbjI9Tm9uZSwgY29sb3IgPSBIb2JDb2xvcnMuTElHSFRfR1JBWSk6CisgICAgICAgICAgICBndGsuRXZlbnRCb3guX19pbml0X18oc2VsZikKKworICAgICAgICAgICAgIyBzZXQgY29sb3IKKyAgICAgICAgICAgIHN0eWxlID0gc2VsZi5nZXRfc3R5bGUoKS5jb3B5KCkKKyAgICAgICAgICAgIHN0eWxlLmJnW2d0ay5TVEFURV9OT1JNQUxdID0gc2VsZi5nZXRfY29sb3JtYXAoKS5hbGxvY19jb2xvcihjb2xvciwgRmFsc2UsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5zZXRfc3R5bGUoc3R5bGUpCisKKyAgICAgICAgICAgIHNlbGYucm93ID0gZ3RrLlRhYmxlKDEsIDIsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5yb3cuc2V0X2JvcmRlcl93aWR0aCgxMCkKKyAgICAgICAgICAgIHNlbGYuYWRkKHNlbGYucm93KQorICAgICAgICAKKyAgICAgICAgICAgIHRvdGFsX3Jvd3MgPSAwCisgICAgICAgICAgICBpZiB3aWRnZXQ6CisgICAgICAgICAgICAgICAgdG90YWxfcm93cyA9IDEwCisgICAgICAgICAgICBpZiB2YXJsaXN0IGFuZCB2YWxsaXN0OgorICAgICAgICAgICAgICAgICMgcGFjayB0aGUgaWNvbiBhbmQgdGhlIHRleHQgb24gdGhlIGxlZnQKKyAgICAgICAgICAgICAgICB0b3RhbF9yb3dzICs9IGxlbih2YXJsaXN0KQorICAgICAgICAgICAgc2VsZi50YWJsZSA9IGd0ay5UYWJsZSh0b3RhbF9yb3dzLCAyMCwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYudGFibGUuc2V0X3Jvd19zcGFjaW5ncyg2KQorICAgICAgICAgICAgc2VsZi50YWJsZS5zZXRfc2l6ZV9yZXF1ZXN0KDEwMCwgLTEpCisgICAgICAgICAgICBzZWxmLnJvdy5hdHRhY2goc2VsZi50YWJsZSwgMCwgMSwgMCwgMSwgeG9wdGlvbnM9Z3RrLkZJTEx8Z3RrLkVYUEFORCwgeW9wdGlvbnM9Z3RrLkZJTEwpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbGlkID0gMAorICAgICAgICAgICAgcm93aWQgPSAwCisgICAgICAgICAgICBzZWxmLmxpbmVfd2lkZ2V0cyA9IHt9CisgICAgICAgICAgICBpZiBpY29uOgorICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKGljb24sIGNvbGlkLCBjb2xpZCArIDIsIDAsIDEpCisgICAgICAgICAgICAgICAgY29saWQgPSBjb2xpZCArIDIKKyAgICAgICAgICAgIGlmIHdpZGdldDoKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaCh3aWRnZXQsIGNvbGlkLCAyMCwgMCwgMTApCisgICAgICAgICAgICAgICAgcm93aWQgPSAxMAorICAgICAgICAgICAgaWYgdmFybGlzdCBhbmQgdmFsbGlzdDoKKyAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJhbmdlKHJvd2lkLCB0b3RhbF9yb3dzKToKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSByb3cgLSByb3dpZAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVfd2lkZ2V0c1t2YXJsaXN0W2luZGV4XV0gPSBzZWxmLnRleHQybGFiZWwodmFybGlzdFtpbmRleF0sIHZhbGxpc3RbaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChzZWxmLmxpbmVfd2lkZ2V0c1t2YXJsaXN0W2luZGV4XV0sIGNvbGlkLCAyMCwgcm93LCByb3cgKyAxKQorICAgICAgICAgICAgIyBwYWNrIHRoZSBidXR0b24gb24gdGhlIHJpZ2h0CisgICAgICAgICAgICBpZiBidXR0b246CisgICAgICAgICAgICAgICAgc2VsZi5iYm94ID0gZ3RrLlZCb3goKQorICAgICAgICAgICAgICAgIHNlbGYuYmJveC5wYWNrX3N0YXJ0KGJ1dHRvbiwgZXhwYW5kPVRydWUsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICAgICAgaWYgYnV0dG9uMjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5iYm94LnBhY2tfc3RhcnQoYnV0dG9uMiwgZXhwYW5kPVRydWUsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5iYm94LnNldF9zaXplX3JlcXVlc3QoMTUwLC0xKQorICAgICAgICAgICAgICAgIHNlbGYucm93LmF0dGFjaChzZWxmLmJib3gsIDEsIDIsIDAsIDEsIHhvcHRpb25zPWd0ay5GSUxMLCB5b3B0aW9ucz1ndGsuRVhQQU5EKQorICAgICAgICAgICAgICAgIAorICAgICAgICBkZWYgdXBkYXRlX2xpbmVfd2lkZ2V0cyhzZWxmLCB2YXJpYWJsZSwgdmFsdWUpOgorICAgICAgICAgICAgaWYgbGVuKHNlbGYubGluZV93aWRnZXRzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5saW5lX3dpZGdldHNbdmFyaWFibGVdLCBndGsuTGFiZWwpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5saW5lX3dpZGdldHNbdmFyaWFibGVdLnNldF9tYXJrdXAoc2VsZi5mb3JtYXRfbGluZSh2YXJpYWJsZSwgdmFsdWUpKQorCisgICAgICAgIGRlZiB3cmFwX2xpbmUoc2VsZiwgaW5wdXRzKToKKyAgICAgICAgICAgICMgd3JhcCB0aGUgbG9uZyB0ZXh0IG9mIGlucHV0cworICAgICAgICAgICAgd3JhcF93aWR0aF9jaGFycyA9IDc1CisgICAgICAgICAgICBvdXRwdXRzID0gIiIKKyAgICAgICAgICAgIHRtcHMgPSBpbnB1dHMKKyAgICAgICAgICAgIGxlc3NfY2hhcnMgPSBsZW4oaW5wdXRzKQorICAgICAgICAgICAgd2hpbGUgKGxlc3NfY2hhcnMgLSB3cmFwX3dpZHRoX2NoYXJzKSA+IDA6CisgICAgICAgICAgICAgICAgbGVzc19jaGFycyAtPSB3cmFwX3dpZHRoX2NoYXJzCisgICAgICAgICAgICAgICAgb3V0cHV0cyArPSB0bXBzWzp3cmFwX3dpZHRoX2NoYXJzXSArICJcbiAgICAgICAgICAgICAgICIKKyAgICAgICAgICAgICAgICB0bXBzID0gaW5wdXRzW2xlc3NfY2hhcnM6XQorICAgICAgICAgICAgb3V0cHV0cyArPSB0bXBzCisgICAgICAgICAgICByZXR1cm4gb3V0cHV0cworCisgICAgICAgIGRlZiBmb3JtYXRfbGluZShzZWxmLCB2YXJpYWJsZSwgdmFsdWUpOgorICAgICAgICAgICAgd3JhcGVkX3ZhbHVlID0gc2VsZi53cmFwX2xpbmUodmFsdWUpCisgICAgICAgICAgICBtYXJrdXAgPSAiPHNwYW4gd2VpZ2h0PVwnYm9sZFwnPiVzPC9zcGFuPiIgJSB2YXJpYWJsZQorICAgICAgICAgICAgbWFya3VwICs9ICI8c3BhbiB3ZWlnaHQ9XCdub3JtYWxcJyBmb3JlZ3JvdW5kPVwnIzFjMWMxY1wnIGZvbnRfZGVzYz1cJzE0cHhcJz4lczwvc3Bhbj4iICUgd3JhcGVkX3ZhbHVlCisgICAgICAgICAgICByZXR1cm4gbWFya3VwCisKKyAgICAgICAgZGVmIHRleHQybGFiZWwoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgICAgICMgYXBwZW5kIHRoZSBuYW1lOnZhbHVlIHRvIHRoZSBsZWZ0IGJveAorICAgICAgICAgICAgIyBzdWNoIGFzICJOYW1lOiBob2ItY29yZS1taW5pbWFsLXZhcmlhbnQtMjAxMS0xMi0xNS1iZWFnbGVib2FyZCIKKyAgICAgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKHNlbGYuZm9ybWF0X2xpbmUodmFyaWFibGUsIHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBsYWJlbAorCisgICAgY2xhc3MgQnVpbGREZXRhaWxCb3ggKGd0ay5FdmVudEJveCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YXJsaXN0ID0gTm9uZSwgdmFsbGlzdCA9IE5vbmUsIGljb24gPSBOb25lLCBjb2xvciA9IEhvYkNvbG9ycy5MSUdIVF9HUkFZKToKKyAgICAgICAgICAgIGd0ay5FdmVudEJveC5fX2luaXRfXyhzZWxmKQorCisgICAgICAgICAgICAjIHNldCBjb2xvcgorICAgICAgICAgICAgc3R5bGUgPSBzZWxmLmdldF9zdHlsZSgpLmNvcHkoKQorICAgICAgICAgICAgc3R5bGUuYmdbZ3RrLlNUQVRFX05PUk1BTF0gPSBzZWxmLmdldF9jb2xvcm1hcCgpLmFsbG9jX2NvbG9yKGNvbG9yLCBGYWxzZSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLnNldF9zdHlsZShzdHlsZSkKKworICAgICAgICAgICAgc2VsZi5oYm94ID0gZ3RrLkhCb3goKQorICAgICAgICAgICAgc2VsZi5oYm94LnNldF9ib3JkZXJfd2lkdGgoMTApCisgICAgICAgICAgICBzZWxmLmFkZChzZWxmLmhib3gpCisKKyAgICAgICAgICAgIHRvdGFsX3Jvd3MgPSAwCisgICAgICAgICAgICBpZiB2YXJsaXN0IGFuZCB2YWxsaXN0OgorICAgICAgICAgICAgICAgICMgcGFjayB0aGUgaWNvbiBhbmQgdGhlIHRleHQgb24gdGhlIGxlZnQKKyAgICAgICAgICAgICAgICB0b3RhbF9yb3dzICs9IGxlbih2YXJsaXN0KQorICAgICAgICAgICAgc2VsZi50YWJsZSA9IGd0ay5UYWJsZSh0b3RhbF9yb3dzLCAyMCwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYudGFibGUuc2V0X3Jvd19zcGFjaW5ncyg2KQorICAgICAgICAgICAgc2VsZi50YWJsZS5zZXRfc2l6ZV9yZXF1ZXN0KDEwMCwgLTEpCisgICAgICAgICAgICBzZWxmLmhib3gucGFja19zdGFydChzZWxmLnRhYmxlLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlLCBwYWRkaW5nPTE1KQorCisgICAgICAgICAgICBjb2xpZCA9IDAKKyAgICAgICAgICAgIHJvd2lkID0gMAorICAgICAgICAgICAgc2VsZi5saW5lX3dpZGdldHMgPSB7fQorICAgICAgICAgICAgaWYgaWNvbjoKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChpY29uLCBjb2xpZCwgY29saWQgKyAyLCAwLCAxKQorICAgICAgICAgICAgICAgIGNvbGlkID0gY29saWQgKyAyCisgICAgICAgICAgICBpZiB2YXJsaXN0IGFuZCB2YWxsaXN0OgorICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmFuZ2Uocm93aWQsIHRvdGFsX3Jvd3MpOgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHJvdyAtIHJvd2lkCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZV93aWRnZXRzW3Zhcmxpc3RbaW5kZXhdXSA9IHNlbGYudGV4dDJsYWJlbCh2YXJsaXN0W2luZGV4XSwgdmFsbGlzdFtpbmRleF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKHNlbGYubGluZV93aWRnZXRzW3Zhcmxpc3RbaW5kZXhdXSwgY29saWQsIDIwLCByb3csIHJvdyArIDEpCisgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZiB1cGRhdGVfbGluZV93aWRnZXRzKHNlbGYsIHZhcmlhYmxlLCB2YWx1ZSk6CisgICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5lX3dpZGdldHMpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLmxpbmVfd2lkZ2V0c1t2YXJpYWJsZV0sIGd0ay5MYWJlbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmxpbmVfd2lkZ2V0c1t2YXJpYWJsZV0uc2V0X21hcmt1cChzZWxmLmZvcm1hdF9saW5lKHZhcmlhYmxlLCB2YWx1ZSkpCisKKyAgICAgICAgZGVmIHdyYXBfbGluZShzZWxmLCBpbnB1dHMpOgorICAgICAgICAgICAgIyB3cmFwIHRoZSBsb25nIHRleHQgb2YgaW5wdXRzCisgICAgICAgICAgICB3cmFwX3dpZHRoX2NoYXJzID0gNzUKKyAgICAgICAgICAgIG91dHB1dHMgPSAiIgorICAgICAgICAgICAgdG1wcyA9IGlucHV0cworICAgICAgICAgICAgbGVzc19jaGFycyA9IGxlbihpbnB1dHMpCisgICAgICAgICAgICB3aGlsZSAobGVzc19jaGFycyAtIHdyYXBfd2lkdGhfY2hhcnMpID4gMDoKKyAgICAgICAgICAgICAgICBsZXNzX2NoYXJzIC09IHdyYXBfd2lkdGhfY2hhcnMKKyAgICAgICAgICAgICAgICBvdXRwdXRzICs9IHRtcHNbOndyYXBfd2lkdGhfY2hhcnNdICsgIlxuICAgICAgICAgICAgICAgIgorICAgICAgICAgICAgICAgIHRtcHMgPSBpbnB1dHNbbGVzc19jaGFyczpdCisgICAgICAgICAgICBvdXRwdXRzICs9IHRtcHMKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICAgICAgZGVmIGZvcm1hdF9saW5lKHNlbGYsIHZhcmlhYmxlLCB2YWx1ZSk6CisgICAgICAgICAgICB3cmFwZWRfdmFsdWUgPSBzZWxmLndyYXBfbGluZSh2YWx1ZSkKKyAgICAgICAgICAgIG1hcmt1cCA9ICI8c3BhbiB3ZWlnaHQ9XCdib2xkXCc+JXM8L3NwYW4+IiAlIHZhcmlhYmxlCisgICAgICAgICAgICBtYXJrdXAgKz0gIjxzcGFuIHdlaWdodD1cJ25vcm1hbFwnIGZvcmVncm91bmQ9XCcjMWMxYzFjXCcgZm9udF9kZXNjPVwnMTRweFwnPiVzPC9zcGFuPiIgJSB3cmFwZWRfdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBtYXJrdXAKKworICAgICAgICBkZWYgdGV4dDJsYWJlbChzZWxmLCB2YXJpYWJsZSwgdmFsdWUpOgorICAgICAgICAgICAgIyBhcHBlbmQgdGhlIG5hbWU6dmFsdWUgdG8gdGhlIGxlZnQgYm94CisgICAgICAgICAgICAjIHN1Y2ggYXMgIk5hbWU6IGhvYi1jb3JlLW1pbmltYWwtdmFyaWFudC0yMDExLTEyLTE1LWJlYWdsZWJvYXJkIgorICAgICAgICAgICAgbGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoc2VsZi5mb3JtYXRfbGluZSh2YXJpYWJsZSwgdmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGxhYmVsCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcik6CisgICAgICAgIHN1cGVyKEltYWdlRGV0YWlsc1BhZ2UsIHNlbGYpLl9faW5pdF9fKGJ1aWxkZXIsICJJbWFnZSBkZXRhaWxzIikKKworICAgICAgICBzZWxmLmltYWdlX3N0b3JlID0gW10KKyAgICAgICAgc2VsZi5idXR0b25faWRzID0ge30KKyAgICAgICAgc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIHNlbGYuaW1hZ2Vfc2F2ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorICAgICAgICBzZWxmLm5hbWVfZmllbGRfdGVtcGxhdGUgPSAiIgorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uX2ZpZWxkX3RlbXBsYXRlID0gIiIKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSB2aXN1YWwgZWxlbWVudHMKKyAgICAgICAgIyBjcmVhdGUgdGhlIHRvb2xiYXIKKyAgICAgICAgc2VsZi50b29sYmFyID0gZ3RrLlRvb2xiYXIoKQorICAgICAgICBzZWxmLnRvb2xiYXIuc2V0X29yaWVudGF0aW9uKGd0ay5PUklFTlRBVElPTl9IT1JJWk9OVEFMKQorICAgICAgICBzZWxmLnRvb2xiYXIuc2V0X3N0eWxlKGd0ay5UT09MQkFSX0JPVEgpCisKKyAgICAgICAgbXlfaW1hZ2VzX2J1dHRvbiA9IHNlbGYuYXBwZW5kX3Rvb2xiYXJfYnV0dG9uKHNlbGYudG9vbGJhciwKKyAgICAgICAgICAgICJJbWFnZXMiLAorICAgICAgICAgICAgaGljLklDT05fSU1BR0VTX0RJU1BMQVlfRklMRSwKKyAgICAgICAgICAgIGhpYy5JQ09OX0lNQUdFU19IT1ZFUl9GSUxFLAorICAgICAgICAgICAgIk9wZW4gcHJldmlvdXNseSBidWlsdCBpbWFnZXMiLAorICAgICAgICAgICAgc2VsZi5teV9pbWFnZXNfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIHNldHRpbmdzX2J1dHRvbiA9IHNlbGYuYXBwZW5kX3Rvb2xiYXJfYnV0dG9uKHNlbGYudG9vbGJhciwKKyAgICAgICAgICAgICJTZXR0aW5ncyIsCisgICAgICAgICAgICBoaWMuSUNPTl9TRVRUSU5HU19ESVNQTEFZX0ZJTEUsCisgICAgICAgICAgICBoaWMuSUNPTl9TRVRUSU5HU19IT1ZFUl9GSUxFLAorICAgICAgICAgICAgIlZpZXcgYWRkaXRpb25hbCBidWlsZCBzZXR0aW5ncyIsCisgICAgICAgICAgICBzZWxmLnNldHRpbmdzX2J1dHRvbl9jbGlja2VkX2NiKQorCisgICAgICAgIHNlbGYuZGV0YWlsc190b3BfYnV0dG9ucyA9IHNlbGYuYWRkX29udG9fdG9wX2JhcihzZWxmLnRvb2xiYXIpCisKKyAgICBkZWYgX3JlbW92ZV9hbGxfd2lkZ2V0KHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuZ2V0X2NoaWxkcmVuKCkgb3IgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5yZW1vdmUoY2hpbGQpCisgICAgICAgIGNoaWxkcmVuID0gc2VsZi5ib3hfZ3JvdXBfYXJlYS5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnJlbW92ZShjaGlsZCkKKyAgICAgICAgY2hpbGRyZW4gPSBzZWxmLmRldGFpbHNfYm90dG9tX2J1dHRvbnMuZ2V0X2NoaWxkcmVuKCkgb3IgW10KKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zLnJlbW92ZShjaGlsZCkKKworICAgIGRlZiBzaG93X3BhZ2Uoc2VsZiwgc3RlcCk6CisgICAgICAgIHNlbGYuYnVpbGRfc3VjY2VlZGVkID0gKHN0ZXAgPT0gc2VsZi5idWlsZGVyLklNQUdFX0dFTkVSQVRFRCkKKyAgICAgICAgaW1hZ2VfYWRkciA9IHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLmltYWdlX2FkZHIKKyAgICAgICAgaW1hZ2VfbmFtZXMgPSBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5pbWFnZV9uYW1lcworICAgICAgICBpZiBzZWxmLmJ1aWxkX3N1Y2NlZWRlZDoKKyAgICAgICAgICAgIG1hY2hpbmUgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5jdXJyX21hY2gKKyAgICAgICAgICAgIGJhc2VfaW1hZ2UgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpCisgICAgICAgICAgICBsYXllcnMgPSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5sYXllcnMKKyAgICAgICAgICAgIHBrZ19udW0gPSAiJXMiICUgbGVuKHNlbGYuYnVpbGRlci5wYWNrYWdlX21vZGVsLmdldF9zZWxlY3RlZF9wYWNrYWdlcygpKQorICAgICAgICAgICAgbG9nX2ZpbGUgPSBzZWxmLmJ1aWxkZXIuY3VycmVudF9sb2dmaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwa2dfbnVtID0gIk4vQSIKKyAgICAgICAgICAgIGxvZ19maWxlID0gTm9uZQorCisgICAgICAgICMgcmVtb3ZlCisgICAgICAgIGZvciBidXR0b25faWQsIGJ1dHRvbiBpbiBzZWxmLmJ1dHRvbl9pZHMuaXRlbXMoKToKKyAgICAgICAgICAgIGJ1dHRvbi5kaXNjb25uZWN0KGJ1dHRvbl9pZCkKKyAgICAgICAgc2VsZi5fcmVtb3ZlX2FsbF93aWRnZXQoKQorCisgICAgICAgICMgcmVwYWNrCisgICAgICAgIHNlbGYucGFja19zdGFydChzZWxmLmRldGFpbHNfdG9wX2J1dHRvbnMsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZ3JvdXBfYWxpZ24sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgc2VsZi5idWlsZF9yZXN1bHQgPSBOb25lCisgICAgICAgIGlmIHNlbGYuaW1hZ2Vfc2F2ZWQgb3IgKHNlbGYuYnVpbGRfc3VjY2VlZGVkIGFuZCBzZWxmLmJ1aWxkZXIuY3VycmVudF9zdGVwID09IHNlbGYuYnVpbGRlci5JTUFHRV9HRU5FUkFUSU5HKToKKyAgICAgICAgICAgICMgYnVpbGRpbmcgaXMgdGhlIHByZXZpb3VzIHN0ZXAKKyAgICAgICAgICAgIGljb24gPSBndGsuSW1hZ2UoKQorICAgICAgICAgICAgcGl4bWFwX3BhdGggPSBoaWMuSUNPTl9JTkRJX0NPTkZJUk1fRklMRQorICAgICAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuUlVOTklORworICAgICAgICAgICAgcGl4X2J1ZmZlciA9IGd0ay5nZGsucGl4YnVmX25ld19mcm9tX2ZpbGUocGl4bWFwX3BhdGgpCisgICAgICAgICAgICBpY29uLnNldF9mcm9tX3BpeGJ1ZihwaXhfYnVmZmVyKQorICAgICAgICAgICAgdmFybGlzdCA9IFsiIl0KKyAgICAgICAgICAgIGlmIHNlbGYuaW1hZ2Vfc2F2ZWQ6CisgICAgICAgICAgICAgICAgdmFsbGlzdCA9IFsiWW91ciBpbWFnZSByZWNpcGUgaGFzIGJlZW4gc2F2ZWQiXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWxsaXN0ID0gWyJZb3VyIGltYWdlIGlzIHJlYWR5Il0KKyAgICAgICAgICAgIHNlbGYuYnVpbGRfcmVzdWx0ID0gc2VsZi5CdWlsZERldGFpbEJveCh2YXJsaXN0PXZhcmxpc3QsIHZhbGxpc3Q9dmFsbGlzdCwgaWNvbj1pY29uLCBjb2xvcj1jb2xvcikKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmJ1aWxkX3Jlc3VsdCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYuYnV0dG9ubGlzdCA9IFsiQnVpbGQgbmV3IGltYWdlIiwgIlNhdmUgaW1hZ2UgcmVjaXBlIiwgIlJ1biBpbWFnZSIsICJEZXBsb3kgaW1hZ2UiXQorCisgICAgICAgICMgTmFtZQorICAgICAgICBzZWxmLmltYWdlX3N0b3JlID0gW10KKyAgICAgICAgc2VsZi50b2dnbGVkX2ltYWdlID0gIiIKKyAgICAgICAgZGVmYXVsdF9pbWFnZV9zaXplID0gMAorICAgICAgICBzZWxmLm51bV90b2dnbGVkID0gMAorICAgICAgICBpID0gMAorICAgICAgICBmb3IgaW1hZ2VfbmFtZSBpbiBpbWFnZV9uYW1lczoKKyAgICAgICAgICAgIGltYWdlX3NpemUgPSBIb2JQYWdlLl9zaXplX3RvX3N0cmluZyhvcy5zdGF0KG9zLnBhdGguam9pbihpbWFnZV9hZGRyLCBpbWFnZV9uYW1lKSkuc3Rfc2l6ZSkKKworICAgICAgICAgICAgaW1hZ2VfYXR0ciA9ICgicnVuIiBpZiAoc2VsZi50ZXN0X3R5cGVfcnVubmFibGUoaW1hZ2VfbmFtZSkgYW5kIHNlbGYudGVzdF9tYWNoX3J1bm5hYmxlKGltYWdlX25hbWUpKSBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkZXBsb3kiIGlmIHNlbGYudGVzdF9kZXBsb3lhYmxlKGltYWdlX25hbWUpIGVsc2UgIiIpKQorICAgICAgICAgICAgaXNfdG9nZ2xlZCA9IChpbWFnZV9hdHRyICE9ICIiKQorCisgICAgICAgICAgICBpZiBub3Qgc2VsZi50b2dnbGVkX2ltYWdlOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gKGxlbihpbWFnZV9uYW1lcykgLSAxKToKKyAgICAgICAgICAgICAgICAgICAgaXNfdG9nZ2xlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBpc190b2dnbGVkOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ltYWdlX3NpemUgPSBpbWFnZV9zaXplCisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9nZ2xlZF9pbWFnZSA9IGltYWdlX25hbWUKKworICAgICAgICAgICAgc3BsaXRfc3R1ZmYgPSBpbWFnZV9uYW1lLnNwbGl0KCcuJykKKyAgICAgICAgICAgIGlmICJyb290ZnMiIGluIHNwbGl0X3N0dWZmOgorICAgICAgICAgICAgICAgIGltYWdlX3R5cGUgPSBpbWFnZV9uYW1lWyhsZW4oc3BsaXRfc3R1ZmZbMF0pICsgbGVuKCIucm9vdGZzIikgKyAxKTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGltYWdlX3R5cGUgPSBpbWFnZV9uYW1lWyhsZW4oc3BsaXRfc3R1ZmZbMF0pICsgMSk6XQorCisgICAgICAgICAgICBzZWxmLmltYWdlX3N0b3JlLmFwcGVuZCh7J25hbWUnOiBpbWFnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiBpbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUnOiBpbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzX3RvZ2dsZWQnOiBpc190b2dnbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbl9hdHRyJzogaW1hZ2VfYXR0cix9KQorCisgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgIHNlbGYubnVtX3RvZ2dsZWQgKz0gaXNfdG9nZ2xlZAorCisgICAgICAgIGlzX3J1bm5hYmxlID0gc2VsZi5jcmVhdGVfYm90dG9tX2J1dHRvbnMoc2VsZi5idXR0b25saXN0LCBzZWxmLnRvZ2dsZWRfaW1hZ2UpCisKKyAgICAgICAgIyBHZW5lcmF0ZWQgaW1hZ2UgZmlsZXMgaW5mbworICAgICAgICB2YXJsaXN0ID0gWyJOYW1lOiAiLCAiRmlsZXMgY3JlYXRlZDogIiwgIkRpcmVjdG9yeTogIl0KKyAgICAgICAgdmFsbGlzdCA9IFtdCisKKyAgICAgICAgdmFsbGlzdC5hcHBlbmQoaW1hZ2VfbmFtZS5zcGxpdCgnLicpWzBdKQorICAgICAgICB2YWxsaXN0LmFwcGVuZCgnLCAgJy5qb2luKGZpbGVpdGVtWyd0eXBlJ10gZm9yIGZpbGVpdGVtIGluIHNlbGYuaW1hZ2Vfc3RvcmUpKQorICAgICAgICB2YWxsaXN0LmFwcGVuZChpbWFnZV9hZGRyKQorCisgICAgICAgIHZpZXdfZmlsZXNfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJWaWV3IGZpbGVzIikKKyAgICAgICAgdmlld19maWxlc19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYudmlld19maWxlc19jbGlja2VkX2NiLCBpbWFnZV9hZGRyKQorICAgICAgICB2aWV3X2ZpbGVzX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJPcGVuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW1hZ2UgZmlsZXMiKQorICAgICAgICBvcGVuX2xvZ19idXR0b24gPSBOb25lCisgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJPcGVuIGxvZyIpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYub3Blbl9sb2dfY2xpY2tlZF9jYiwgbG9nX2ZpbGUpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiT3BlbiB0aGUgYnVpbGQncyBsb2cgZmlsZSIpCisgICAgICAgIHNlbGYuaW1hZ2VfZGV0YWlsID0gc2VsZi5EZXRhaWxCb3godmFybGlzdD12YXJsaXN0LCB2YWxsaXN0PXZhbGxpc3QsIGJ1dHRvbj12aWV3X2ZpbGVzX2J1dHRvbiwgYnV0dG9uMj1vcGVuX2xvZ19idXR0b24pCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmltYWdlX2RldGFpbCwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBrZXJuZWwgYm94IGZvciB0aGUgcWVtdSBpbWFnZXMKKyAgICAgICAgc2VsZi5zZWxfa2VybmVsID0gIiIKKyAgICAgICAgc2VsZi5rZXJuZWxfZGV0YWlsID0gTm9uZQorICAgICAgICBpZiAncWVtdScgaW4gaW1hZ2VfbmFtZToKKyAgICAgICAgICAgIHNlbGYuc2VsX2tlcm5lbCA9IHNlbGYuZ2V0X2tlcm5lbF9maWxlX25hbWUoKQorCisgICAgICAgICMgICAgdmFybGlzdCA9IFsiS2VybmVsOiAiXQorICAgICAgICAjICAgIHZhbGxpc3QgPSBbXQorICAgICAgICAjICAgIHZhbGxpc3QuYXBwZW5kKHNlbGYuc2VsX2tlcm5lbCkKKworICAgICAgICAjICAgIGNoYW5nZV9rZXJuZWxfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJDaGFuZ2UiKQorICAgICAgICAjICAgIGNoYW5nZV9rZXJuZWxfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmNoYW5nZV9rZXJuZWxfY2IpCisgICAgICAgICMgICAgY2hhbmdlX2tlcm5lbF9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiQ2hhbmdlIHFlbXUga2VybmVsIGZpbGUiKQorICAgICAgICAjICAgIHNlbGYua2VybmVsX2RldGFpbCA9IHNlbGYuRGV0YWlsQm94KHZhcmxpc3Q9dmFybGlzdCwgdmFsbGlzdD12YWxsaXN0LCBidXR0b249Y2hhbmdlX2tlcm5lbF9idXR0b24pCisgICAgICAgICMgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYua2VybmVsX2RldGFpbCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICAjIE1hY2hpbmUsIEltYWdlIHJlY2lwZSBhbmQgTGF5ZXJzCisgICAgICAgIGxheWVyX251bV9saW1pdCA9IDE1CisgICAgICAgIHZhcmxpc3QgPSBbIk1hY2hpbmU6ICIsICJJbWFnZSByZWNpcGU6ICIsICJMYXllcnM6ICJdCisgICAgICAgIHZhbGxpc3QgPSBbXQorICAgICAgICBzZWxmLnNldHRpbmdfZGV0YWlsID0gTm9uZQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3N1Y2NlZWRlZDoKKyAgICAgICAgICAgIHZhbGxpc3QuYXBwZW5kKG1hY2hpbmUpCisgICAgICAgICAgICBpZiBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmlzX2N1c3RvbV9pbWFnZSgpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmluaXRpYWxfc2VsZWN0ZWRfaW1hZ2UgPT0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fOgorICAgICAgICAgICAgICAgICAgICBiYXNlX2ltYWdlID0iTmV3IGltYWdlIHJlY2lwZSIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiYXNlX2ltYWdlID0gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW5pdGlhbF9zZWxlY3RlZF9pbWFnZSArICIgKGVkaXRlZCkiCisgICAgICAgICAgICB2YWxsaXN0LmFwcGVuZChiYXNlX2ltYWdlKQorICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgIGZvciBsYXllciBpbiBsYXllcnM6CisgICAgICAgICAgICAgICAgaWYgaSA+IGxheWVyX251bV9saW1pdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB2YXJsaXN0LmFwcGVuZCgiIC0gIikKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIHZhbGxpc3QuYXBwZW5kKCIiKQorICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgIGZvciBsYXllciBpbiBsYXllcnM6CisgICAgICAgICAgICAgICAgaWYgaSA+IGxheWVyX251bV9saW1pdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIGkgPT0gbGF5ZXJfbnVtX2xpbWl0OgorICAgICAgICAgICAgICAgICAgICB2YWxsaXN0LmFwcGVuZCgiYW5kIG1vcmUuLi4iKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbGxpc3QuYXBwZW5kKGxheWVyKQorICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICAgICBlZGl0X2NvbmZpZ19idXR0b24gPSBIb2JBbHRCdXR0b24oIkVkaXQgY29uZmlndXJhdGlvbiIpCisgICAgICAgICAgICBlZGl0X2NvbmZpZ19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiRWRpdCBtYWNoaW5lIGFuZCBpbWFnZSByZWNpcGUiKQorICAgICAgICAgICAgZWRpdF9jb25maWdfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmVkaXRfY29uZmlnX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICAgICAgc2VsZi5zZXR0aW5nX2RldGFpbCA9IHNlbGYuRGV0YWlsQm94KHZhcmxpc3Q9dmFybGlzdCwgdmFsbGlzdD12YWxsaXN0LCBidXR0b249ZWRpdF9jb25maWdfYnV0dG9uKQorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuc2V0dGluZ19kZXRhaWwsIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgIyBQYWNrYWdlcyBpbmNsdWRlZCwgYW5kIFRvdGFsIGltYWdlIHNpemUKKyAgICAgICAgdmFybGlzdCA9IFsiUGFja2FnZXMgaW5jbHVkZWQ6ICIsICJUb3RhbCBpbWFnZSBzaXplOiAiXQorICAgICAgICB2YWxsaXN0ID0gW10KKyAgICAgICAgdmFsbGlzdC5hcHBlbmQocGtnX251bSkKKyAgICAgICAgdmFsbGlzdC5hcHBlbmQoZGVmYXVsdF9pbWFnZV9zaXplKQorICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbWFnZV9zaXplID0gZGVmYXVsdF9pbWFnZV9zaXplCisgICAgICAgIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmltYWdlX3BhY2thZ2VzID0gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcGFja2FnZXMKKyAgICAgICAgaWYgc2VsZi5idWlsZF9zdWNjZWVkZWQ6CisgICAgICAgICAgICBlZGl0X3BhY2thZ2VzX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbigiRWRpdCBwYWNrYWdlcyIpCisgICAgICAgICAgICBlZGl0X3BhY2thZ2VzX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJFZGl0IHRoZSBwYWNrYWdlcyBpbmNsdWRlZCBpbiB5b3VyIGltYWdlIikKKyAgICAgICAgICAgIGVkaXRfcGFja2FnZXNfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmVkaXRfcGFja2FnZXNfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIGVsc2U6ICMgZ2V0IHRvIHRoaXMgcGFnZSBmcm9tICJNeSBpbWFnZXMiCisgICAgICAgICAgICBlZGl0X3BhY2thZ2VzX2J1dHRvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RldGFpbCA9IHNlbGYuRGV0YWlsQm94KHZhcmxpc3Q9dmFybGlzdCwgdmFsbGlzdD12YWxsaXN0LCBidXR0b249ZWRpdF9wYWNrYWdlc19idXR0b24pCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLnBhY2thZ2VfZGV0YWlsLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgICMgcGFjayB0aGUgYnV0dG9ucyBhdCB0aGUgYm90dG9tLCBhdCB0aGlzIHRpbWUgdGhleSBhcmUgYWxyZWFkeSBjcmVhdGVkLgorICAgICAgICBpZiBzZWxmLmJ1aWxkX3N1Y2NlZWRlZDoKKyAgICAgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19lbmQoc2VsZi5kZXRhaWxzX2JvdHRvbV9idXR0b25zLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGVsc2U6ICMgZm9yICJNeSBpbWFnZXMiIHBhZ2UKKyAgICAgICAgICAgIHNlbGYuZGV0YWlsc19zZXBhcmF0b3IgPSBndGsuSFNlcGFyYXRvcigpCisgICAgICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5kZXRhaWxzX3NlcGFyYXRvciwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucywgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorICAgICAgICBpZiBzZWxmLmtlcm5lbF9kZXRhaWwgYW5kIChub3QgaXNfcnVubmFibGUpOgorICAgICAgICAgICAgc2VsZi5rZXJuZWxfZGV0YWlsLmhpZGUoKQorICAgICAgICBzZWxmLmltYWdlX3NhdmVkID0gRmFsc2UKKworICAgIGRlZiB2aWV3X2ZpbGVzX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uLCBpbWFnZV9hZGRyKToKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKCJ4ZGctb3BlbiAvJXMiICUgaW1hZ2VfYWRkciwgc2hlbGw9VHJ1ZSkKKworICAgIGRlZiBvcGVuX2xvZ19jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbiwgbG9nX2ZpbGUpOgorICAgICAgICBpZiBsb2dfZmlsZToKKyAgICAgICAgICAgIGxvZ19maWxlID0gImZpbGU6Ly8vIiArIGxvZ19maWxlCisgICAgICAgICAgICBndGsuc2hvd191cmkoc2NyZWVuPWJ1dHRvbi5nZXRfc2NyZWVuKCksIHVyaT1sb2dfZmlsZSwgdGltZXN0YW1wPTApCisKKyAgICBkZWYgcmVmcmVzaF9wYWNrYWdlX2RldGFpbF9ib3goc2VsZiwgaW1hZ2Vfc2l6ZSk6CisgICAgICAgIHNlbGYucGFja2FnZV9kZXRhaWwudXBkYXRlX2xpbmVfd2lkZ2V0cygiVG90YWwgaW1hZ2Ugc2l6ZTogIiwgaW1hZ2Vfc2l6ZSkKKworICAgIGRlZiB0ZXN0X3R5cGVfcnVubmFibGUoc2VsZiwgaW1hZ2VfbmFtZSk6CisgICAgICAgIHR5cGVfcnVubmFibGUgPSBGYWxzZQorICAgICAgICBmb3IgdCBpbiBzZWxmLmJ1aWxkZXIucGFyYW1ldGVycy5ydW5uYWJsZV9pbWFnZV90eXBlczoKKyAgICAgICAgICAgIGlmIGltYWdlX25hbWUuZW5kc3dpdGgodCk6CisgICAgICAgICAgICAgICAgdHlwZV9ydW5uYWJsZSA9IFRydWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gdHlwZV9ydW5uYWJsZQorCisgICAgZGVmIHRlc3RfbWFjaF9ydW5uYWJsZShzZWxmLCBpbWFnZV9uYW1lKToKKyAgICAgICAgbWFjaF9ydW5uYWJsZSA9IEZhbHNlCisgICAgICAgIGZvciB0IGluIHNlbGYuYnVpbGRlci5wYXJhbWV0ZXJzLnJ1bm5hYmxlX21hY2hpbmVfcGF0dGVybnM6CisgICAgICAgICAgICBpZiB0IGluIGltYWdlX25hbWU6CisgICAgICAgICAgICAgICAgbWFjaF9ydW5uYWJsZSA9IFRydWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gbWFjaF9ydW5uYWJsZQorCisgICAgZGVmIHRlc3RfZGVwbG95YWJsZShzZWxmLCBpbWFnZV9uYW1lKToKKyAgICAgICAgaWYgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uY3Vycl9tYWNoLnN0YXJ0c3dpdGgoInFlbXUiKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBkZXBsb3lhYmxlID0gRmFsc2UKKyAgICAgICAgZm9yIHQgaW4gc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMuZGVwbG95YWJsZV9pbWFnZV90eXBlczoKKyAgICAgICAgICAgIGlmIGltYWdlX25hbWUuZW5kc3dpdGgodCk6CisgICAgICAgICAgICAgICAgZGVwbG95YWJsZSA9IFRydWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gZGVwbG95YWJsZQorCisgICAgZGVmIGdldF9rZXJuZWxfZmlsZV9uYW1lKHNlbGYsIGtlcm5lbF9hZGRyPSIiKToKKyAgICAgICAga2VybmVsX25hbWUgPSAiIgorCisgICAgICAgIGlmIG5vdCBrZXJuZWxfYWRkcjoKKyAgICAgICAgICAgIGtlcm5lbF9hZGRyID0gc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMuaW1hZ2VfYWRkcgorCisgICAgICAgIGZpbGVzID0gW2YgZm9yIGYgaW4gb3MubGlzdGRpcihrZXJuZWxfYWRkcikgaWYgZlswXSA8PiAnLiddCisgICAgICAgIGZvciBjaGVja19maWxlIGluIGZpbGVzOgorICAgICAgICAgICAgaWYgY2hlY2tfZmlsZS5lbmRzd2l0aCgiLmJpbiIpOgorICAgICAgICAgICAgICAgIG5hbWVfc3BsaXRzID0gY2hlY2tfZmlsZS5zcGxpdCgiLiIpWzBdCisgICAgICAgICAgICAgICAgaWYgc2VsZi5idWlsZGVyLnBhcmFtZXRlcnMua2VybmVsX2ltYWdlX3R5cGUgaW4gbmFtZV9zcGxpdHMuc3BsaXQoIi0iKToKKyAgICAgICAgICAgICAgICAgICAga2VybmVsX25hbWUgPSBjaGVja19maWxlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgcmV0dXJuIGtlcm5lbF9uYW1lCisKKyAgICBkZWYgc2hvd19idWlsZGVkX2ltYWdlc19kaWFsb2coc2VsZiwgd2lkZ2V0LCBwcmltYXJ5X2FjdGlvbj0iIik6CisgICAgICAgIHRpdGxlID0gcHJpbWFyeV9hY3Rpb24gaWYgcHJpbWFyeV9hY3Rpb24gZWxzZSAiWW91ciBidWlsZGVkIGltYWdlcyIKKyAgICAgICAgZGlhbG9nID0gQ3J1bWJzRGlhbG9nKHRpdGxlLCBzZWxmLmJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGsuRElBTE9HX01PREFMIHwgZ3RrLkRJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UKQorICAgICAgICBkaWFsb2cuc2V0X2JvcmRlcl93aWR0aCgxMikKKworICAgICAgICBsYWJlbCA9IGd0ay5MYWJlbCgpCisgICAgICAgIGxhYmVsLnNldF91c2VfbWFya3VwKFRydWUpCisgICAgICAgIGxhYmVsLnNldF9hbGlnbm1lbnQoMC4wLCAwLjUpCisgICAgICAgIGxhYmVsLnNldF9wYWRkaW5nKDEyLDApCisgICAgICAgIGlmIHByaW1hcnlfYWN0aW9uID09ICJSdW4gaW1hZ2UiOgorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cCgiPHNwYW4gZm9udF9kZXNjPScxMic+U2VsZWN0IHRoZSBpbWFnZSBmaWxlIHlvdSB3YW50IHRvIHJ1bjo8L3NwYW4+IikKKyAgICAgICAgZWxpZiBwcmltYXJ5X2FjdGlvbiA9PSAiRGVwbG95IGltYWdlIjoKKyAgICAgICAgICAgIGxhYmVsLnNldF9tYXJrdXAoIjxzcGFuIGZvbnRfZGVzYz0nMTInPlNlbGVjdCB0aGUgaW1hZ2UgZmlsZSB5b3Ugd2FudCB0byBkZXBsb3k6PC9zcGFuPiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbC5zZXRfbWFya3VwKCI8c3BhbiBmb250X2Rlc2M9JzEyJz5TZWxlY3QgdGhlIGltYWdlIGZpbGUgeW91IHdhbnQgdG8gJXM8L3NwYW4+IiAlIHByaW1hcnlfYWN0aW9uKQorICAgICAgICBkaWFsb2cudmJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgIyBmaWx0ZXIgY3JlYXRlZCBpbWFnZXMgYXMgYWN0aW9uIGF0dHJpYnV0aW9uIChkZXBsb3kgb3IgcnVuKQorICAgICAgICBhY3Rpb25fYXR0ciA9ICIiCisgICAgICAgIGFjdGlvbl9pbWFnZXMgPSBbXQorICAgICAgICBmb3IgZmlsZWl0ZW0gaW4gc2VsZi5pbWFnZV9zdG9yZToKKyAgICAgICAgICAgIGFjdGlvbl9hdHRyID0gZmlsZWl0ZW1bJ2FjdGlvbl9hdHRyJ10KKyAgICAgICAgICAgIGlmICAoYWN0aW9uX2F0dHIgPT0gJ3J1bicgYW5kIHByaW1hcnlfYWN0aW9uID09ICJSdW4gaW1hZ2UiKSBcCisgICAgICAgICAgICAgb3IgKGFjdGlvbl9hdHRyID09ICdkZXBsb3knIGFuZCBwcmltYXJ5X2FjdGlvbiA9PSAiRGVwbG95IGltYWdlIik6CisgICAgICAgICAgICAgICAgYWN0aW9uX2ltYWdlcy5hcHBlbmQoZmlsZWl0ZW0pCisKKyAgICAgICAgIyBwYWNrIHRoZSBjb3JyZXNwb25kaW5nICdydW5uYWJsZScgb3IgJ2RlcGxveScgcmFkaW9fYnV0dG9ucywgaWYgdGhlcmUgaGFzIG5vIG1vcmUgdGhhbiBvbmUgZmlsZS4KKyAgICAgICAgIyBhc3N1bWUgdGhhdCB0aGVyZSBkb2VzIG5vdCBib3RoIGhhdmUgJ2RlcGxveScgYW5kICdydW5uYWJsZScgZmlsZXMgaW4gdGhlIHNhbWUgYnVpbGRpbmcgcmVzdWx0CisgICAgICAgICMgaW4gcG9zc2libGUgYXMgZGVzaWduLgorICAgICAgICBjdXJyX3JvdyA9IDAKKyAgICAgICAgcm93cyA9IChsZW4oYWN0aW9uX2ltYWdlcykpIGlmIGxlbihhY3Rpb25faW1hZ2VzKSA8IDEwIGVsc2UgMTAKKyAgICAgICAgdGFibGUgPSBndGsuVGFibGUocm93cywgMTAsIFRydWUpCisgICAgICAgIHRhYmxlLnNldF9yb3dfc3BhY2luZ3MoNikKKyAgICAgICAgdGFibGUuc2V0X2NvbF9zcGFjaW5nKDAsIDEyKQorICAgICAgICB0YWJsZS5zZXRfY29sX3NwYWNpbmcoNSwgMTIpCisKKyAgICAgICAgc2VsX3BhcmVudF9idG4gPSBOb25lCisgICAgICAgIGZvciBmaWxlaXRlbSBpbiBhY3Rpb25faW1hZ2VzOgorICAgICAgICAgICAgc2VsX2J0biA9IGd0ay5SYWRpb0J1dHRvbihzZWxfcGFyZW50X2J0biwgZmlsZWl0ZW1bJ3R5cGUnXSkKKyAgICAgICAgICAgIHNlbF9wYXJlbnRfYnRuID0gc2VsX2J0biBpZiBub3Qgc2VsX3BhcmVudF9idG4gZWxzZSBzZWxfcGFyZW50X2J0bgorICAgICAgICAgICAgc2VsX2J0bi5zZXRfYWN0aXZlKGZpbGVpdGVtWydpc190b2dnbGVkJ10pCisgICAgICAgICAgICBzZWxfYnRuLmNvbm5lY3QoJ3RvZ2dsZWQnLCBzZWxmLnRhYmxlX3NlbGVjdGVkX2NiLCBmaWxlaXRlbSkKKyAgICAgICAgICAgIGlmIGN1cnJfcm93IDwgMTA6CisgICAgICAgICAgICAgICAgdGFibGUuYXR0YWNoKHNlbF9idG4sIDAsIDQsIGN1cnJfcm93LCBjdXJyX3JvdyArIDEsIHhwYWRkaW5nPTI0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YWJsZS5hdHRhY2goc2VsX2J0biwgNSwgOSwgY3Vycl9yb3cgLSAxMCwgY3Vycl9yb3cgLSA5LCB4cGFkZGluZz0yNCkKKyAgICAgICAgICAgIGN1cnJfcm93ICs9IDEKKworICAgICAgICBkaWFsb2cudmJveC5wYWNrX3N0YXJ0KHRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UsIHBhZGRpbmc9NikKKworICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbigiQ2FuY2VsIiwgZ3RrLlJFU1BPTlNFX0NBTkNFTCkKKyAgICAgICAgSG9iQWx0QnV0dG9uLnN0eWxlX2J1dHRvbihidXR0b24pCisKKyAgICAgICAgaWYgcHJpbWFyeV9hY3Rpb246CisgICAgICAgICAgICBidXR0b24gPSBkaWFsb2cuYWRkX2J1dHRvbihwcmltYXJ5X2FjdGlvbiwgZ3RrLlJFU1BPTlNFX1lFUykKKyAgICAgICAgICAgIEhvYkJ1dHRvbi5zdHlsZV9idXR0b24oYnV0dG9uKQorCisgICAgICAgIGRpYWxvZy5zaG93X2FsbCgpCisKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgICAgIGlmIHJlc3BvbnNlICE9IGd0ay5SRVNQT05TRV9ZRVM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgZmlsZWl0ZW0gaW4gc2VsZi5pbWFnZV9zdG9yZToKKyAgICAgICAgICAgIGlmIGZpbGVpdGVtWydpc190b2dnbGVkJ106CisgICAgICAgICAgICAgICAgaWYgZmlsZWl0ZW1bJ2FjdGlvbl9hdHRyJ10gPT0gJ3J1bic6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRlci5ydW5xZW11X2ltYWdlKGZpbGVpdGVtWyduYW1lJ10sIHNlbGYuc2VsX2tlcm5lbCkKKyAgICAgICAgICAgICAgICBlbGlmIGZpbGVpdGVtWydhY3Rpb25fYXR0ciddID09ICdkZXBsb3knOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuZGVwbG95X2ltYWdlKGZpbGVpdGVtWyduYW1lJ10pCisKKyAgICBkZWYgdGFibGVfc2VsZWN0ZWRfY2Ioc2VsZiwgdGJ1dHRvbiwgaW1hZ2UpOgorICAgICAgICBpbWFnZVsnaXNfdG9nZ2xlZCddID0gdGJ1dHRvbi5nZXRfYWN0aXZlKCkKKyAgICAgICAgaWYgaW1hZ2VbJ2lzX3RvZ2dsZWQnXToKKyAgICAgICAgICAgIHNlbGYudG9nZ2xlZF9pbWFnZSA9IGltYWdlWyduYW1lJ10KKworICAgIGRlZiBjaGFuZ2Vfa2VybmVsX2NiKHNlbGYsIHdpZGdldCk6CisgICAgICAgIGtlcm5lbF9wYXRoID0gc2VsZi5idWlsZGVyLnNob3dfbG9hZF9rZXJuZWxfZGlhbG9nKCkKKyAgICAgICAgaWYga2VybmVsX3BhdGggYW5kIHNlbGYua2VybmVsX2RldGFpbDoKKyAgICAgICAgICAgIGltcG9ydCBvcy5wYXRoCisgICAgICAgICAgICBzZWxmLnNlbF9rZXJuZWwgPSBvcy5wYXRoLmJhc2VuYW1lKGtlcm5lbF9wYXRoKQorICAgICAgICAgICAgbWFya3VwID0gc2VsZi5rZXJuZWxfZGV0YWlsLmZvcm1hdF9saW5lKCJLZXJuZWw6ICIsIHNlbGYuc2VsX2tlcm5lbCkKKyAgICAgICAgICAgIGxhYmVsID0gKChzZWxmLmtlcm5lbF9kZXRhaWwuZ2V0X2NoaWxkcmVuKClbMF0pLmdldF9jaGlsZHJlbigpWzBdKS5nZXRfY2hpbGRyZW4oKVswXQorICAgICAgICAgICAgbGFiZWwuc2V0X21hcmt1cChtYXJrdXApCisKKyAgICBkZWYgY3JlYXRlX2JvdHRvbV9idXR0b25zKHNlbGYsIGJ1dHRvbmxpc3QsIGltYWdlX25hbWUpOgorICAgICAgICAjIENyZWF0ZSB0aGUgYnV0dG9ucyBhdCB0aGUgYm90dG9tCisgICAgICAgIGNyZWF0ZWQgPSBGYWxzZQorICAgICAgICBwYWNrZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmJ1dHRvbl9pZHMgPSB7fQorICAgICAgICBpc19ydW5uYWJsZSA9IEZhbHNlCisKKyAgICAgICAgIyBjcmVhdGUgYnV0dG9uICJEZXBsb3kgaW1hZ2UiCisgICAgICAgIG5hbWUgPSAiRGVwbG95IGltYWdlIgorICAgICAgICBpZiBuYW1lIGluIGJ1dHRvbmxpc3QgYW5kIHNlbGYudGVzdF9kZXBsb3lhYmxlKGltYWdlX25hbWUpOgorICAgICAgICAgICAgZGVwbG95X2J1dHRvbiA9IEhvYkJ1dHRvbignRGVwbG95IGltYWdlJykKKyAgICAgICAgICAgICNkZXBsb3lfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMjA1LCA0OSkKKyAgICAgICAgICAgIGRlcGxveV9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiQnVybiBhIGxpdmUgaW1hZ2UgdG8gYSBVU0IgZHJpdmUgb3IgZmxhc2ggbWVtb3J5IikKKyAgICAgICAgICAgIGRlcGxveV9idXR0b24uc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgICAgIGJ1dHRvbl9pZCA9IGRlcGxveV9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuZGVwbG95X2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICAgICAgc2VsZi5idXR0b25faWRzW2J1dHRvbl9pZF0gPSBkZXBsb3lfYnV0dG9uCisgICAgICAgICAgICBzZWxmLmRldGFpbHNfYm90dG9tX2J1dHRvbnMucGFja19lbmQoZGVwbG95X2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICAgICAgY3JlYXRlZCA9IFRydWUKKyAgICAgICAgICAgIHBhY2tlZCA9IFRydWUKKworICAgICAgICBuYW1lID0gIlJ1biBpbWFnZSIKKyAgICAgICAgaWYgbmFtZSBpbiBidXR0b25saXN0IGFuZCBzZWxmLnRlc3RfdHlwZV9ydW5uYWJsZShpbWFnZV9uYW1lKSBhbmQgc2VsZi50ZXN0X21hY2hfcnVubmFibGUoaW1hZ2VfbmFtZSk6CisgICAgICAgICAgICBpZiBjcmVhdGVkID09IFRydWU6CisgICAgICAgICAgICAgICAgIyBzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAjbGFiZWwgPSBndGsuTGFiZWwoIiBvciAiKQorICAgICAgICAgICAgICAgICNzZWxmLmRldGFpbHNfYm90dG9tX2J1dHRvbnMucGFja19lbmQobGFiZWwsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICAgICAgICAgICMgY3JlYXRlIGJ1dHRvbiAiUnVuIGltYWdlIgorICAgICAgICAgICAgICAgIHJ1bl9idXR0b24gPSBIb2JBbHRCdXR0b24oIlJ1biBpbWFnZSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgY3JlYXRlIGJ1dHRvbiAiUnVuIGltYWdlIiBhcyB0aGUgcHJpbWFyeSBidXR0b24KKyAgICAgICAgICAgICAgICBydW5fYnV0dG9uID0gSG9iQnV0dG9uKCJSdW4gaW1hZ2UiKQorICAgICAgICAgICAgICAgICNydW5fYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMjA1LCA0OSkKKyAgICAgICAgICAgICAgICBydW5fYnV0dG9uLnNldF9mbGFncyhndGsuQ0FOX0RFRkFVTFQpCisgICAgICAgICAgICAgICAgcGFja2VkID0gVHJ1ZQorICAgICAgICAgICAgcnVuX2J1dHRvbi5zZXRfdG9vbHRpcF90ZXh0KCJTdGFydCB1cCBhbiBpbWFnZSB3aXRoIHFlbXUgZW11bGF0b3IiKQorICAgICAgICAgICAgYnV0dG9uX2lkID0gcnVuX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5ydW5fYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbl9pZHNbYnV0dG9uX2lkXSA9IHJ1bl9idXR0b24KKyAgICAgICAgICAgIHNlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucy5wYWNrX2VuZChydW5fYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBjcmVhdGVkID0gVHJ1ZQorICAgICAgICAgICAgaXNfcnVubmFibGUgPSBUcnVlCisKKyAgICAgICAgbmFtZSA9ICJTYXZlIGltYWdlIHJlY2lwZSIKKyAgICAgICAgaWYgbmFtZSBpbiBidXR0b25saXN0IGFuZCBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLmlzX2N1c3RvbV9pbWFnZSgpOgorICAgICAgICAgICAgc2F2ZV9idXR0b24gPSBIb2JBbHRCdXR0b24oIlNhdmUgaW1hZ2UgcmVjaXBlIikKKyAgICAgICAgICAgIHNhdmVfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIktlZXAgeW91ciBjaGFuZ2VzIHNhdmluZyB0aGVtIGFzIGFuIGltYWdlIHJlY2lwZSIpCisgICAgICAgICAgICBzYXZlX2J1dHRvbi5zZXRfc2Vuc2l0aXZlKG5vdCBzZWxmLmltYWdlX3NhdmVkKQorICAgICAgICAgICAgYnV0dG9uX2lkID0gc2F2ZV9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuc2F2ZV9idXR0b25fY2xpY2tlZF9jYikKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uX2lkc1tidXR0b25faWRdID0gc2F2ZV9idXR0b24KKyAgICAgICAgICAgIHNlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucy5wYWNrX2VuZChzYXZlX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIG5hbWUgPSAiQnVpbGQgbmV3IGltYWdlIgorICAgICAgICBpZiBuYW1lIGluIGJ1dHRvbmxpc3Q6CisgICAgICAgICAgICAjIGNyZWF0ZSBidXR0b24gIkJ1aWxkIG5ldyBpbWFnZSIKKyAgICAgICAgICAgIGlmIHBhY2tlZDoKKyAgICAgICAgICAgICAgICBidWlsZF9uZXdfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJCdWlsZCBuZXcgaW1hZ2UiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBidWlsZF9uZXdfYnV0dG9uID0gSG9iQnV0dG9uKCJCdWlsZCBuZXcgaW1hZ2UiKQorICAgICAgICAgICAgICAgIGJ1aWxkX25ld19idXR0b24uc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgICAgICNidWlsZF9uZXdfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMjA1LCA0OSkKKyAgICAgICAgICAgIHNlbGYuZGV0YWlsc19ib3R0b21fYnV0dG9ucy5wYWNrX2VuZChidWlsZF9uZXdfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgICAgICBidWlsZF9uZXdfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkNyZWF0ZSBhIG5ldyBpbWFnZSBmcm9tIHNjcmF0Y2giKQorICAgICAgICAgICAgYnV0dG9uX2lkID0gYnVpbGRfbmV3X2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5idWlsZF9uZXdfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbl9pZHNbYnV0dG9uX2lkXSA9IGJ1aWxkX25ld19idXR0b24KKworICAgICAgICByZXR1cm4gaXNfcnVubmFibGUKKworICAgIGRlZiBkZXBsb3lfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgaWYgc2VsZi50b2dnbGVkX2ltYWdlOgorICAgICAgICAgICAgaWYgc2VsZi5udW1fdG9nZ2xlZCA+IDE6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICAgICAgICAgIHNlbGYuc2hvd19idWlsZGVkX2ltYWdlc19kaWFsb2coTm9uZSwgIkRlcGxveSBpbWFnZSIpCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfc2Vuc2l0aXZlKFRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRlci5kZXBsb3lfaW1hZ2Uoc2VsZi50b2dnbGVkX2ltYWdlKQorCisgICAgZGVmIHJ1bl9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBpZiBzZWxmLnRvZ2dsZWRfaW1hZ2U6CisgICAgICAgICAgICBpZiBzZWxmLm51bV90b2dnbGVkID4gMToKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5zaG93X2J1aWxkZWRfaW1hZ2VzX2RpYWxvZyhOb25lLCAiUnVuIGltYWdlIikKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9zZW5zaXRpdmUoVHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5idWlsZGVyLnJ1bnFlbXVfaW1hZ2Uoc2VsZi50b2dnbGVkX2ltYWdlLCBzZWxmLnNlbF9rZXJuZWwpCisKKyAgICBkZWYgc2F2ZV9idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICB0b3BkaXIgPSBzZWxmLmJ1aWxkZXIuZ2V0X3RvcGRpcigpCisgICAgICAgIGltYWdlc19kaXIgPSB0b3BkaXIgKyAiL3JlY2lwZXMvaW1hZ2VzL2N1c3RvbS8iCisgICAgICAgIHNlbGYuYnVpbGRlci5lbnN1cmVfZGlyKGltYWdlc19kaXIpCisKKyAgICAgICAgc2VsZi5uYW1lX2ZpZWxkX3RlbXBsYXRlID0gc2VsZi5idWlsZGVyLmltYWdlX2NvbmZpZ3VyYXRpb25fcGFnZS5jdXN0b21faW1hZ2Vfc2VsZWN0ZWQKKyAgICAgICAgaWYgc2VsZi5uYW1lX2ZpZWxkX3RlbXBsYXRlOgorICAgICAgICAgICAgaW1hZ2VfcGF0aCA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwucG5fcGF0aFtzZWxmLm5hbWVfZmllbGRfdGVtcGxhdGVdCisgICAgICAgICAgICBpbWFnZV9pdGVyID0gc2VsZi5idWlsZGVyLnJlY2lwZV9tb2RlbC5nZXRfaXRlcihpbWFnZV9wYXRoKQorICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbl9maWVsZF90ZW1wbGF0ZSA9IHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuZ2V0X3ZhbHVlKGltYWdlX2l0ZXIsIHNlbGYuYnVpbGRlci5yZWNpcGVfbW9kZWwuQ09MX0RFU0MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm5hbWVfZmllbGRfdGVtcGxhdGUgPSAiIgorCisgICAgICAgIGRpYWxvZyA9IFNhdmVJbWFnZURpYWxvZyhpbWFnZXNfZGlyLCBzZWxmLm5hbWVfZmllbGRfdGVtcGxhdGUsIHNlbGYuZGVzY3JpcHRpb25fZmllbGRfdGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICJTYXZlIGltYWdlIHJlY2lwZSIsIHNlbGYuYnVpbGRlciwgZ3RrLkRJQUxPR19NT0RBTCB8IGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCkKKyAgICAgICAgcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKyAgICAgICAgZGlhbG9nLmRlc3Ryb3koKQorCisgICAgZGVmIGJ1aWxkX25ld19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIuaW5pdGlhdGVfbmV3X2J1aWxkX2FzeW5jKCkKKworICAgIGRlZiBlZGl0X2NvbmZpZ19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19jb25maWd1cmF0aW9uKCkKKworICAgIGRlZiBlZGl0X3BhY2thZ2VzX2J1dHRvbl9jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X3BhY2thZ2VzKCkKKworICAgIGRlZiBteV9pbWFnZXNfYnV0dG9uX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfbG9hZF9teV9pbWFnZXNfZGlhbG9nKCkKKworICAgIGRlZiBzZXR0aW5nc19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICAjIENyZWF0ZSBhbiBhZHZhbmNlZCBzZXR0aW5ncyBkaWFsb2cKKyAgICAgICAgcmVzcG9uc2UsIHNldHRpbmdzX2NoYW5nZWQgPSBzZWxmLmJ1aWxkZXIuc2hvd19zaW1wbGVfc2V0dGluZ3NfZGlhbG9nKCkKKyAgICAgICAgaWYgbm90IHJlc3BvbnNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNldHRpbmdzX2NoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucmVwYXJzZV9wb3N0X2Fkdl9zZXR0aW5ncygpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcGFja2FnZXNlbGVjdGlvbnBhZ2UucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcGFja2FnZXNlbGVjdGlvbnBhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M2MmIzNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wYWNrYWdlc2VsZWN0aW9ucGFnZS5weQpAQCAtMCwwICsxLDM1NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IERvbmd4aWFvIFh1IDxkb25neGlhby54dUBpbnRlbC5jb20+CisjIEF1dGhvcmVkIGJ5IFNoYW5lIFdhbmcgPHNoYW5lLndhbmdAaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdsaWIKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iVmlld1RhYmxlLCBIb2JOb3RlYm9vaywgSG9iQWx0QnV0dG9uLCBIb2JCdXR0b24KK2Zyb20gYmIudWkuY3J1bWJzLmhvYmxpc3Rtb2RlbCBpbXBvcnQgUGFja2FnZUxpc3RNb2RlbAorZnJvbSBiYi51aS5jcnVtYnMuaG9icGFnZXMgaW1wb3J0IEhvYlBhZ2UKKworIworIyBQYWNrYWdlU2VsZWN0aW9uUGFnZQorIworY2xhc3MgUGFja2FnZVNlbGVjdGlvblBhZ2UgKEhvYlBhZ2UpOgorCisgICAgcGFnZXMgPSBbCisgICAgICAgIHsKKyAgICAgICAgICduYW1lJyAgICAgIDogJ0luY2x1ZGVkIHBhY2thZ2VzJywKKyAgICAgICAgICd0b29sdGlwJyAgIDogJ1RoZSBwYWNrYWdlcyBjdXJyZW50bHkgaW5jbHVkZWQgZm9yIHlvdXIgaW1hZ2UnLAorICAgICAgICAgJ2ZpbHRlcicgICAgOiB7IFBhY2thZ2VMaXN0TW9kZWwuQ09MX0lOQyA6IFtUcnVlXSB9LAorICAgICAgICAgJ3NlYXJjaCcgICAgOiAnU2VhcmNoIHBhY2thZ2VzIGJ5IG5hbWUnLAorICAgICAgICAgJ3NlYXJjaHRpcCcgOiAnRW50ZXIgYSBwYWNrYWdlIG5hbWUgdG8gZmluZCBpdCcsCisgICAgICAgICAnY29sdW1ucycgICA6IFt7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUGFja2FnZSBuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnU2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ3RleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ1JlY2lwZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9SQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAyNTAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnQnJvdWdodCBpbiBieSAoK290aGVycyknLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUGFja2FnZUxpc3RNb2RlbC5DT0xfQklOQiwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICdiaW5iJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDM1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdJbmNsdWRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9JTkMsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAnY2hlY2sgdG9nZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDEwMAorICAgICAgICAgICAgICAgICAgICAgfV0KKyAgICAgICAgfSwgeworICAgICAgICAgJ25hbWUnICAgICAgOiAnQWxsIHBhY2thZ2VzJywKKyAgICAgICAgICd0b29sdGlwJyAgIDogJ0FsbCBwYWNrYWdlcyB0aGF0IGhhdmUgYmVlbiBidWlsdCcsCisgICAgICAgICAnZmlsdGVyJyAgICA6IHt9LAorICAgICAgICAgJ3NlYXJjaCcgICAgOiAnU2VhcmNoIHBhY2thZ2VzIGJ5IG5hbWUnLAorICAgICAgICAgJ3NlYXJjaHRpcCcgOiAnRW50ZXIgYSBwYWNrYWdlIG5hbWUgdG8gZmluZCBpdCcsCisgICAgICAgICAnY29sdW1ucycgICA6IFt7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUGFja2FnZSBuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnU2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ3RleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ1JlY2lwZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBQYWNrYWdlTGlzdE1vZGVsLkNPTF9SQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAyNTAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnSW5jbHVkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ2NoZWNrIHRvZ2dsZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICB9XQorICAgICAgICB9CisgICAgXQorICAgIAorICAgIChJTkNMVURFRCwKKyAgICAgQUxMKSA9IHJhbmdlKDIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcik6CisgICAgICAgIHN1cGVyKFBhY2thZ2VTZWxlY3Rpb25QYWdlLCBzZWxmKS5fX2luaXRfXyhidWlsZGVyLCAiRWRpdCBwYWNrYWdlcyIpCisKKyAgICAgICAgIyBzZXQgaW52aXNpYmxlIG1lbWJlcnMKKyAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbCA9IHNlbGYuYnVpbGRlci5wYWNrYWdlX21vZGVsCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgaW5jbHVkZWRfY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmlucy5zZXRfY3VycmVudF9wYWdlKHNlbGYuSU5DTFVERUQpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5sYWJlbCA9IGd0ay5MYWJlbCgiUGFja2FnZXMgaW5jbHVkZWQ6IDBcblNlbGVjdGVkIHBhY2thZ2VzIHNpemU6IDAgTUIiKQorICAgICAgICBzZWxmLmV2ZW50Ym94ID0gc2VsZi5hZGRfb250b190b3BfYmFyKHNlbGYubGFiZWwsIDczKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ldmVudGJveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi5ncm91cF9hbGlnbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICAjIHNldCB2aXNpYmxlIG1lbWJlcnMKKyAgICAgICAgc2VsZi5pbnMgPSBIb2JOb3RlYm9vaygpCisgICAgICAgIHNlbGYudGFibGVzID0gW10gIyB3ZSBuZWVkIHRvIG1vZGlmeSB0YWJsZSB3aGVuIHRoZSBkaWFsb2cgaXMgc2hvd24KKworICAgICAgICBzZWFyY2hfbmFtZXMgPSBbXQorICAgICAgICBzZWFyY2hfdGlwcyA9IFtdCisgICAgICAgICMgYXBwZW5kIHRoZSB0YWIKKyAgICAgICAgZm9yIHBhZ2UgaW4gc2VsZi5wYWdlczoKKyAgICAgICAgICAgIGNvbHVtbnMgPSBwYWdlWydjb2x1bW5zJ10KKyAgICAgICAgICAgIG5hbWUgPSBwYWdlWyduYW1lJ10KKyAgICAgICAgICAgIHRhYiA9IEhvYlZpZXdUYWJsZShjb2x1bW5zLCBuYW1lKQorICAgICAgICAgICAgc2VhcmNoX25hbWVzLmFwcGVuZChwYWdlWydzZWFyY2gnXSkKKyAgICAgICAgICAgIHNlYXJjaF90aXBzLmFwcGVuZChwYWdlWydzZWFyY2h0aXAnXSkKKyAgICAgICAgICAgIGZpbHRlciA9IHBhZ2VbJ2ZpbHRlciddCisgICAgICAgICAgICBzb3J0X21vZGVsID0gc2VsZi5wYWNrYWdlX21vZGVsLnRyZWVfbW9kZWwoZmlsdGVyLCBpbml0aWFsPVRydWUpCisgICAgICAgICAgICB0YWIuc2V0X21vZGVsKHNvcnRfbW9kZWwpCisgICAgICAgICAgICB0YWIuY29ubmVjdCgidG9nZ2xlZCIsIHNlbGYudGFibGVfdG9nZ2xlZF9jYiwgbmFtZSkKKyAgICAgICAgICAgIHRhYi5jb25uZWN0KCJidXR0b24tcmVsZWFzZS1ldmVudCIsIHNlbGYuYnV0dG9uX2NsaWNrX2NiKQorICAgICAgICAgICAgdGFiLmNvbm5lY3QoImNlbGwtZmFkZWlub3V0LXN0b3BwZWQiLCBzZWxmLmFmdGVyX2ZhZGVvdXRfY2hlY2tpbl9pbmNsdWRlLCBmaWx0ZXIpCisgICAgICAgICAgICBzZWxmLmlucy5hcHBlbmRfcGFnZSh0YWIsIHBhZ2VbJ25hbWUnXSwgcGFnZVsndG9vbHRpcCddKQorICAgICAgICAgICAgc2VsZi50YWJsZXMuYXBwZW5kKHRhYikKKworICAgICAgICBzZWxmLmlucy5zZXRfZW50cnkoc2VhcmNoX25hbWVzLCBzZWFyY2hfdGlwcykKKyAgICAgICAgc2VsZi5pbnMuc2VhcmNoLmNvbm5lY3QoImNoYW5nZWQiLCBzZWxmLnNlYXJjaF9lbnRyeV9jaGFuZ2VkKQorCisgICAgICAgICMgYWRkIGFsbCBpbnRvIHRoZSBkaWFsb2cKKyAgICAgICAgc2VsZi5ib3hfZ3JvdXBfYXJlYS5wYWNrX3N0YXJ0KHNlbGYuaW5zLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCisgICAgICAgIHNlbGYuYnV0dG9uX2JveCA9IGd0ay5IQm94KEZhbHNlLCA2KQorICAgICAgICBzZWxmLmJveF9ncm91cF9hcmVhLnBhY2tfc3RhcnQoc2VsZi5idXR0b25fYm94LCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5idWlsZF9pbWFnZV9idXR0b24gPSBIb2JCdXR0b24oJ0J1aWxkIGltYWdlJykKKyAgICAgICAgI3NlbGYuYnVpbGRfaW1hZ2VfYnV0dG9uLnNldF9zaXplX3JlcXVlc3QoMjA1LCA0OSkKKyAgICAgICAgc2VsZi5idWlsZF9pbWFnZV9idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiQnVpbGQgdGFyZ2V0IGltYWdlIikKKyAgICAgICAgc2VsZi5idWlsZF9pbWFnZV9idXR0b24uc2V0X2ZsYWdzKGd0ay5DQU5fREVGQVVMVCkKKyAgICAgICAgc2VsZi5idWlsZF9pbWFnZV9idXR0b24uZ3JhYl9kZWZhdWx0KCkKKyAgICAgICAgc2VsZi5idWlsZF9pbWFnZV9idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuYnVpbGRfaW1hZ2VfY2xpY2tlZF9jYikKKyAgICAgICAgc2VsZi5idXR0b25fYm94LnBhY2tfZW5kKHNlbGYuYnVpbGRfaW1hZ2VfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisKKyAgICAgICAgc2VsZi5iYWNrX2J1dHRvbiA9IEhvYkFsdEJ1dHRvbignQ2FuY2VsJykKKyAgICAgICAgc2VsZi5iYWNrX2J1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5iYWNrX2J1dHRvbl9jbGlja2VkX2NiKQorICAgICAgICBzZWxmLmJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5iYWNrX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgZGVmIHNlYXJjaF9lbnRyeV9jaGFuZ2VkKHNlbGYsIGVudHJ5KToKKyAgICAgICAgdGV4dCA9IGVudHJ5LmdldF90ZXh0KCkKKyAgICAgICAgaWYgc2VsZi5pbnMuc2VhcmNoX2ZvY3VzOgorICAgICAgICAgICAgc2VsZi5pbnMuc2VhcmNoX2ZvY3VzID0gRmFsc2UKKyAgICAgICAgZWxpZiBzZWxmLmlucy5wYWdlX2NoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLmlucy5wYWdlX2NoYW5nZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmZpbHRlcl9zZWFyY2goZW50cnkpCisgICAgICAgIGVsaWYgdGV4dCBub3QgaW4gc2VsZi5pbnMuc2VhcmNoX25hbWVzOgorICAgICAgICAgICAgc2VsZi5maWx0ZXJfc2VhcmNoKGVudHJ5KQorCisgICAgZGVmIGZpbHRlcl9zZWFyY2goc2VsZiwgZW50cnkpOgorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBjdXJyZW50X3RhYiA9IHNlbGYuaW5zLmdldF9jdXJyZW50X3BhZ2UoKQorICAgICAgICBmaWx0ZXIgPSBzZWxmLnBhZ2VzW2N1cnJlbnRfdGFiXVsnZmlsdGVyJ10KKyAgICAgICAgZmlsdGVyW1BhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUVdID0gdGV4dAorICAgICAgICBzZWxmLnRhYmxlc1tjdXJyZW50X3RhYl0uc2V0X21vZGVsKHNlbGYucGFja2FnZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlciwgc2VhcmNoX2RhdGE9dGV4dCkpCisgICAgICAgIGlmIHNlbGYucGFja2FnZV9tb2RlbC5maWx0ZXJlZF9uYiA9PSAwOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2JhcjoKKyAgICAgICAgICAgICAgICBzZWxmLmlucy5nZXRfbnRoX3BhZ2UoY3VycmVudF90YWIpLmFkZF9ub19yZXN1bHRfYmFyKGVudHJ5KQorICAgICAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2Jhci5zZXRfbm9fc2hvd19hbGwoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2Jhci5zaG93KCkKKyAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikuc2Nyb2xsLmhpZGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyOgorICAgICAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2Jhci5oaWRlKCkKKyAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikuc2Nyb2xsLnNob3coKQorICAgICAgICBpZiBlbnRyeS5nZXRfdGV4dCgpID09ICcnOgorICAgICAgICAgICAgZW50cnkuc2V0X2ljb25fc2Vuc2l0aXZlKGd0ay5FTlRSWV9JQ09OX1NFQ09OREFSWSwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRyeS5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBUcnVlKQorCisgICAgZGVmIGJ1dHRvbl9jbGlja19jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgcGF0aCwgY29sID0gd2lkZ2V0LnRhYmxlX3RyZWUuZ2V0X2N1cnNvcigpCisgICAgICAgIHRyZWVfbW9kZWwgPSB3aWRnZXQudGFibGVfdHJlZS5nZXRfbW9kZWwoKQorICAgICAgICBpZiBwYXRoIGFuZCBjb2wuZ2V0X3RpdGxlKCkgIT0gJ0luY2x1ZGVkJzogIyBlbHNlIGFjdGl2YXRpb24gaXMgbGlrZWx5IGEgcmVtb3ZhbAorICAgICAgICAgICAgcHJvcGVydGllcyA9IHsnYmluYic6ICcnICwgJ25hbWUnOiAnJywgJ3NpemUnOicnLCAncmVjaXBlJzonJywgJ2ZpbGVzX2xpc3QnOicnfQorICAgICAgICAgICAgcHJvcGVydGllc1snYmluYiddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUGFja2FnZUxpc3RNb2RlbC5DT0xfQklOQikKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ25hbWUnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFBhY2thZ2VMaXN0TW9kZWwuQ09MX05BTUUpCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydzaXplJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9TSVpFKQorICAgICAgICAgICAgcHJvcGVydGllc1sncmVjaXBlJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9SQ1ApCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydmaWxlc19saXN0J10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBQYWNrYWdlTGlzdE1vZGVsLkNPTF9GTElTVCkKKworICAgICAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfcmVjaXBlX3Byb3BlcnR5X2RpYWxvZyhwcm9wZXJ0aWVzKQorCisgICAgZGVmIG9wZW5fbG9nX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uLCBsb2dfZmlsZSk6CisgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgbG9nX2ZpbGUgPSAiZmlsZTovLy8iICsgbG9nX2ZpbGUKKyAgICAgICAgICAgIGd0ay5zaG93X3VyaShzY3JlZW49YnV0dG9uLmdldF9zY3JlZW4oKSwgdXJpPWxvZ19maWxlLCB0aW1lc3RhbXA9MCkKKworICAgIGRlZiBzaG93X3BhZ2Uoc2VsZiwgbG9nX2ZpbGUpOgorICAgICAgICBjaGlsZHJlbiA9IHNlbGYuYnV0dG9uX2JveC5nZXRfY2hpbGRyZW4oKSBvciBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLmJ1dHRvbl9ib3gucmVtb3ZlKGNoaWxkKQorICAgICAgICAjIHJlLXBhY2tlZCB0aGUgYnV0dG9ucyBhcyByZXF1ZXN0LCBhZGQgdGhlICdvcGVuIGxvZycgYnV0dG9uIGlmIGJ1aWxkIHN1Y2Nlc3MKKyAgICAgICAgc2VsZi5idXR0b25fYm94LnBhY2tfZW5kKHNlbGYuYnVpbGRfaW1hZ2VfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIGlmIGxvZ19maWxlOgorICAgICAgICAgICAgb3Blbl9sb2dfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCJPcGVuIGxvZyIpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYub3Blbl9sb2dfY2xpY2tlZF9jYiwgbG9nX2ZpbGUpCisgICAgICAgICAgICBvcGVuX2xvZ19idXR0b24uc2V0X3Rvb2x0aXBfdGV4dCgiT3BlbiB0aGUgYnVpbGQncyBsb2cgZmlsZSIpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbl9ib3gucGFja19lbmQob3Blbl9sb2dfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYuYnV0dG9uX2JveC5wYWNrX2VuZChzZWxmLmJhY2tfYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9RmFsc2UpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIGJ1aWxkX2ltYWdlX2NsaWNrZWRfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2VsZi5idWlsZGVyLnBhcnNpbmdfd2FybmluZ3MgPSBbXQorICAgICAgICBzZWxmLmJ1aWxkZXIuYnVpbGRfaW1hZ2UoKQorCisgICAgZGVmIHJlZnJlc2hfdGFibGVzKHNlbGYpOgorICAgICAgICBzZWxmLmlucy5yZXNldF9lbnRyeShzZWxmLmlucy5zZWFyY2gsIDApCisgICAgICAgIGZvciB0YWIgaW4gc2VsZi50YWJsZXM6CisgICAgICAgICAgICBpbmRleCA9IHNlbGYudGFibGVzLmluZGV4KHRhYikKKyAgICAgICAgICAgIGZpbHRlciA9IHNlbGYucGFnZXNbaW5kZXhdWydmaWx0ZXInXQorICAgICAgICAgICAgdGFiLnNldF9tb2RlbChzZWxmLnBhY2thZ2VfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIsIGluaXRpYWw9VHJ1ZSkpCisKKyAgICBkZWYgYmFja19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBpZiBzZWxmLmJ1aWxkZXIucHJldmlvdXNfc3RlcCA9PSAgc2VsZi5idWlsZGVyLklNQUdFX0dFTkVSQVRFRDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5yZXN0b3JlX2luaXRpYWxfc2VsZWN0ZWRfcGFja2FnZXMoKQorICAgICAgICAgICAgc2VsZi5yZWZyZXNoX3NlbGVjdGlvbigpCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIuc2hvd19pbWFnZV9kZXRhaWxzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X2NvbmZpZ3VyYXRpb24oKQorICAgICAgICBzZWxmLnJlZnJlc2hfdGFibGVzKCkKKworICAgIGRlZiByZWZyZXNoX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcGFja2FnZXMgPSBzZWxmLnBhY2thZ2VfbW9kZWwuZ2V0X3NlbGVjdGVkX3BhY2thZ2VzKCkKKyAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24udXNlcl9zZWxlY3RlZF9wYWNrYWdlcyA9IHNlbGYucGFja2FnZV9tb2RlbC5nZXRfdXNlcl9zZWxlY3RlZF9wYWNrYWdlcygpCisgICAgICAgIHNlbGVjdGVkX3BhY2thZ2VzX251bSA9IGxlbihzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlcykKKyAgICAgICAgc2VsZWN0ZWRfcGFja2FnZXNfc2l6ZSA9IHNlbGYucGFja2FnZV9tb2RlbC5nZXRfcGFja2FnZXNfc2l6ZSgpCisgICAgICAgIHNlbGVjdGVkX3BhY2thZ2VzX3NpemVfc3RyID0gSG9iUGFnZS5fc2l6ZV90b19zdHJpbmcoc2VsZWN0ZWRfcGFja2FnZXNfc2l6ZSkKKworICAgICAgICBpZiBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbWFnZV9wYWNrYWdlcyA9PSBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9wYWNrYWdlczoKKyAgICAgICAgICAgIGltYWdlX3RvdGFsX3NpemVfc3RyID0gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yID0gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW1hZ2Vfb3ZlcmhlYWRfZmFjdG9yCisgICAgICAgICAgICBpbWFnZV9yb290ZnNfc2l6ZSA9IHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLmltYWdlX3Jvb3Rmc19zaXplIC8gMTAyNCAjIGltYWdlX3Jvb3Rmc19zaXplIGlzIEtCCisgICAgICAgICAgICBpbWFnZV9leHRyYV9zaXplID0gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uaW1hZ2VfZXh0cmFfc2l6ZSAvIDEwMjQgIyBpbWFnZV9leHRyYV9zaXplIGlzIEtCCisgICAgICAgICAgICBiYXNlX3NpemUgPSBpbWFnZV9vdmVyaGVhZF9mYWN0b3IgKiBzZWxlY3RlZF9wYWNrYWdlc19zaXplCisgICAgICAgICAgICBpbWFnZV90b3RhbF9zaXplID0gbWF4KGJhc2Vfc2l6ZSwgaW1hZ2Vfcm9vdGZzX3NpemUpICsgaW1hZ2VfZXh0cmFfc2l6ZQorICAgICAgICAgICAgaWYgInp5cHBlciIgaW4gc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcGFja2FnZXM6CisgICAgICAgICAgICAgICAgaW1hZ2VfdG90YWxfc2l6ZSArPSAoNTEyMDAgKiAxMDI0KQorICAgICAgICAgICAgaW1hZ2VfdG90YWxfc2l6ZV9zdHIgPSBIb2JQYWdlLl9zaXplX3RvX3N0cmluZyhpbWFnZV90b3RhbF9zaXplKQorCisgICAgICAgIHNlbGYubGFiZWwuc2V0X2xhYmVsKCJQYWNrYWdlcyBpbmNsdWRlZDogJXNcblNlbGVjdGVkIHBhY2thZ2VzIHNpemU6ICVzXG5Fc3RpbWF0ZWQgaW1hZ2Ugc2l6ZTogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRfcGFja2FnZXNfbnVtLCBzZWxlY3RlZF9wYWNrYWdlc19zaXplX3N0ciwgaW1hZ2VfdG90YWxfc2l6ZV9zdHIpKQorICAgICAgICBzZWxmLmlucy5zaG93X2luZGljYXRvcl9pY29uKCJJbmNsdWRlZCBwYWNrYWdlcyIsIHNlbGVjdGVkX3BhY2thZ2VzX251bSkKKworICAgIGRlZiB0b2dnbGVfaXRlbV9pZGxlX2NiKHNlbGYsIHBhdGgsIHZpZXdfdHJlZSwgY2VsbCwgcGFnZW5hbWUpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX21vZGVsLnBhdGhfaW5jbHVkZWQocGF0aCk6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwuaW5jbHVkZV9pdGVtKGl0ZW1fcGF0aD1wYXRoLCBiaW5iPSJVc2VyIFNlbGVjdGVkIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJlX2ZhZGVvdXRfY2hlY2tvdXRfaW5jbHVkZSh2aWV3X3RyZWUpCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwuZXhjbHVkZV9pdGVtKGl0ZW1fcGF0aD1wYXRoKQorICAgICAgICAgICAgc2VsZi5yZW5kZXJfZmFkZW91dCh2aWV3X3RyZWUsIGNlbGwpCisKKyAgICAgICAgc2VsZi5yZWZyZXNoX3NlbGVjdGlvbigpCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1aWxkZXIuY3VzdG9taXplZDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5jdXN0b21pemVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLnNldF9iYXNlX2ltYWdlKCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLnNlbGVjdGVkX2ltYWdlID0gc2VsZi5yZWNpcGVfbW9kZWwuX19jdXN0b21faW1hZ2VfXworICAgICAgICAgICAgc2VsZi5idWlsZGVyLnJjcHBrZ2xpc3RfcG9wdWxhdGVkKCkKKworICAgICAgICBzZWxmLmJ1aWxkZXIud2luZG93X3NlbnNpdGl2ZShUcnVlKQorICAgICAgICB2aWV3X21vZGVsID0gdmlld190cmVlLmdldF9tb2RlbCgpCisgICAgICAgIHZwYXRoID0gc2VsZi5wYWNrYWdlX21vZGVsLmNvbnZlcnRfcGF0aF90b192cGF0aCh2aWV3X21vZGVsLCBwYXRoKQorICAgICAgICB2aWV3X3RyZWUuc2V0X2N1cnNvcih2cGF0aCkKKworICAgIGRlZiB0YWJsZV90b2dnbGVkX2NiKHNlbGYsIHRhYmxlLCBjZWxsLCB2aWV3X3BhdGgsIHRvZ2dsZWRfY29sdW1uaWQsIHZpZXdfdHJlZSwgcGFnZW5hbWUpOgorICAgICAgICAjIENsaWNrIHRvIGluY2x1ZGUgYSBwYWNrYWdlCisgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3dfc2Vuc2l0aXZlKEZhbHNlKQorICAgICAgICB2aWV3X21vZGVsID0gdmlld190cmVlLmdldF9tb2RlbCgpCisgICAgICAgIHBhdGggPSBzZWxmLnBhY2thZ2VfbW9kZWwuY29udmVydF92cGF0aF90b19wYXRoKHZpZXdfbW9kZWwsIHZpZXdfcGF0aCkKKyAgICAgICAgZ2xpYi5pZGxlX2FkZChzZWxmLnRvZ2dsZV9pdGVtX2lkbGVfY2IsIHBhdGgsIHZpZXdfdHJlZSwgY2VsbCwgcGFnZW5hbWUpCisKKyAgICBkZWYgcHJlX2ZhZGVvdXRfY2hlY2tvdXRfaW5jbHVkZShzZWxmLCB0cmVlKToKKyAgICAgICAgI2FmdGVyIHRoZSBmYWRlb3V0IHRoZSB0YWJsZSB3aWxsIGJlIHNvcnRlZCBhcyBiZWZvcmUKKyAgICAgICAgc2VsZi5zb3J0X2NvbHVtbl9pZCA9IHNlbGYucGFja2FnZV9tb2RlbC5zb3J0X2NvbHVtbl9pZAorICAgICAgICBzZWxmLnNvcnRfb3JkZXIgPSBzZWxmLnBhY2thZ2VfbW9kZWwuc29ydF9vcmRlcgorCisgICAgICAgIHNlbGYucGFja2FnZV9tb2RlbC5yZXN5bmNfZmFkZW91dF9jb2x1bW4oc2VsZi5wYWNrYWdlX21vZGVsLmdldF9pdGVyX2ZpcnN0KCkpCisgICAgICAgICMgQ2hlY2sgb3V0IGEgbW9kZWwgd2hpY2ggYmFzZSBvbiB0aGUgY29sdW1uIENPTF9GQURFX0lOQywKKyAgICAgICAgIyBpdCdzIHNhdmUgdGhlIHByZXYgc3RhdGUgb2YgY29sdW1uIENPTF9JTkMgYmVmb3JlIGRvIGV4Y2x1ZGVfaXRlbQorICAgICAgICBmaWx0ZXIgPSB7IFBhY2thZ2VMaXN0TW9kZWwuQ09MX0ZBREVfSU5DICA6IFtUcnVlXX0KKyAgICAgICAgbmV3X21vZGVsID0gc2VsZi5wYWNrYWdlX21vZGVsLnRyZWVfbW9kZWwoZmlsdGVyLCBleGNsdWRlZF9pdGVtc19haGVhZD1UcnVlKQorICAgICAgICB0cmVlLnNldF9tb2RlbChuZXdfbW9kZWwpCisgICAgICAgIHRyZWUuZXhwYW5kX2FsbCgpCisKKyAgICBkZWYgZ2V0X2V4Y2x1ZGVkX3Jvd3Moc2VsZiwgdG9fcmVuZGVyX2NlbGxzLCBtb2RlbCwgaXQpOgorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHBhdGggPSBtb2RlbC5nZXRfcGF0aChpdCkKKyAgICAgICAgICAgIHByZXZfY2VsbF9pc19hY3RpdmUgPSBtb2RlbC5nZXRfdmFsdWUoaXQsIFBhY2thZ2VMaXN0TW9kZWwuQ09MX0ZBREVfSU5DKQorICAgICAgICAgICAgY3Vycl9jZWxsX2lzX2FjdGl2ZSA9IG1vZGVsLmdldF92YWx1ZShpdCwgUGFja2FnZUxpc3RNb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgaWYgKHByZXZfY2VsbF9pc19hY3RpdmUgPT0gVHJ1ZSkgYW5kIChjdXJyX2NlbGxfaXNfYWN0aXZlID09IEZhbHNlKToKKyAgICAgICAgICAgICAgICB0b19yZW5kZXJfY2VsbHMuYXBwZW5kKHBhdGgpCisgICAgICAgICAgICBpZiBtb2RlbC5pdGVyX2hhc19jaGlsZChpdCk6CisgICAgICAgICAgICAgICAgc2VsZi5nZXRfZXhjbHVkZWRfcm93cyh0b19yZW5kZXJfY2VsbHMsIG1vZGVsLCBtb2RlbC5pdGVyX2NoaWxkcmVuKGl0KSkKKyAgICAgICAgICAgIGl0ID0gbW9kZWwuaXRlcl9uZXh0KGl0KQorCisgICAgICAgIHJldHVybiB0b19yZW5kZXJfY2VsbHMKKworICAgIGRlZiByZW5kZXJfZmFkZW91dChzZWxmLCB0cmVlLCBjZWxsKToKKyAgICAgICAgaWYgKG5vdCBjZWxsKSBvciAobm90IHRyZWUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRvX3JlbmRlcl9jZWxscyA9IFtdCisgICAgICAgIHZpZXdfbW9kZWwgPSB0cmVlLmdldF9tb2RlbCgpCisgICAgICAgIHNlbGYuZ2V0X2V4Y2x1ZGVkX3Jvd3ModG9fcmVuZGVyX2NlbGxzLCB2aWV3X21vZGVsLCB2aWV3X21vZGVsLmdldF9pdGVyX2ZpcnN0KCkpCisKKyAgICAgICAgY2VsbC5mYWRlb3V0KHRyZWUsIDEwMDAsIHRvX3JlbmRlcl9jZWxscykKKworICAgIGRlZiBhZnRlcl9mYWRlb3V0X2NoZWNraW5faW5jbHVkZShzZWxmLCB0YWJsZSwgY3RybCwgY2VsbCwgdHJlZSwgZmlsdGVyKToKKyAgICAgICAgc2VsZi5wYWNrYWdlX21vZGVsLnNvcnRfY29sdW1uX2lkID0gc2VsZi5zb3J0X2NvbHVtbl9pZAorICAgICAgICBzZWxmLnBhY2thZ2VfbW9kZWwuc29ydF9vcmRlciA9IHNlbGYuc29ydF9vcmRlcgorICAgICAgICB0cmVlLnNldF9tb2RlbChzZWxmLnBhY2thZ2VfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIpKQorICAgICAgICB0cmVlLmV4cGFuZF9hbGwoKQorCisgICAgZGVmIHNldF9wYWNrYWdlc19jdXJyX3RhYihzZWxmLCBjdXJyX3BhZ2UpOgorICAgICAgICBzZWxmLmlucy5zZXRfY3VycmVudF9wYWdlKGN1cnJfcGFnZSkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3BlcnNpc3RlbnR0b29sdGlwLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3BlcnNpc3RlbnR0b29sdGlwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyN2MxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcGVyc2lzdGVudHRvb2x0aXAucHkKQEAgLTAsMCArMSwxODYgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgZ3RrCit0cnk6CisgICAgaW1wb3J0IGdjb25mCitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBQZXJzaXN0ZW50VG9vbHRpcChndGsuV2luZG93KToKKyAgICAiIiIKKyAgICBBIHRvb2x0aXAgd2hpY2ggcGVyc2lzdHMgb25jZSBzaG93biB1bnRpbCB0aGUgdXNlciBkaXNtaXNzZXMgaXQgd2l0aCB0aGUgRXNjCisgICAga2V5IG9yIGJ5IGNsaWNraW5nIHRoZSBjbG9zZSBidXR0b24uCisKKyAgICAjIEZJWE1FOiB0aGUgUGVyc2lzdGVudFRvb2x0aXAgc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGFueXdoZXJlIG9mZgorICAgICMgaXQuIFdlIGNhbid0IGRvIHRoaXMgd2l0aCBmb2N1cy1vdXQtZXZlbnQgYmVjdWFzZSBtb2RhbCBlbnN1cmVzIHdlIGhhdmUgZm9jdXM/CisKKyAgICBtYXJrdXA6IHNvbWUgUGFuZ28gdGV4dCBtYXJrdXAgdG8gZGlzcGxheSBpbiB0aGUgdG9vbHRpcAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrdXAsIHBhcmVudF93aW49Tm9uZSk6CisgICAgICAgIGd0ay5XaW5kb3cuX19pbml0X18oc2VsZiwgZ3RrLldJTkRPV19QT1BVUCkKKworICAgICAgICAjIEluaGVyaXQgdGhlIHN5c3RlbSB0aGVtZSBmb3IgYSB0b29sdGlwCisgICAgICAgIHN0eWxlID0gZ3RrLnJjX2dldF9zdHlsZV9ieV9wYXRocyhndGsuc2V0dGluZ3NfZ2V0X2RlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdndGstdG9vbHRpcCcsICdndGstdG9vbHRpcCcsIGdvYmplY3QuVFlQRV9OT05FKQorICAgICAgICBzZWxmLnNldF9zdHlsZShzdHlsZSkKKworICAgICAgICAjIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGNsb3NlIGJ1dHRvbiBvbiB0aGUgdGlwIHNob3VsZCByZWZsZWN0IGhvdyB0aGUKKyAgICAgICAgIyB3aW5kb3cgbWFuYWdlciBvZiB0aGUgdXNlcnMgc3lzdGVtIHBsYWNlcyBjbG9zZSBidXR0b25zLiBUcnkgdG8gcmVhZAorICAgICAgICAjIHRoZSBtZXRhY2l0eSBnY29uZiBrZXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNsb3NlIGJ1dHRvbiBpcyBvbiB0aGUKKyAgICAgICAgIyBsZWZ0IG9yIHRoZSByaWdodC4KKyAgICAgICAgIyBJbiB0aGUgY2FzZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgdXNlcnMgY29uZmlndXJhdGlvbiB3ZSBkZWZhdWx0CisgICAgICAgICMgdG8gY2xvc2UgYnV0dG9ucyBiZWluZyBvbiB0aGUgcmlnaHQuCisgICAgICAgIF9fYnV0dG9uX3JpZ2h0ID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGllbnQgPSBnY29uZi5jbGllbnRfZ2V0X2RlZmF1bHQoKQorICAgICAgICAgICAgb3JkZXIgPSBjbGllbnQuZ2V0X3N0cmluZygiL2FwcHMvbWV0YWNpdHkvZ2VuZXJhbC9idXR0b25fbGF5b3V0IikKKyAgICAgICAgICAgIGlmIG9yZGVyIGFuZCBvcmRlci5lbmRzd2l0aCgiOiIpOgorICAgICAgICAgICAgICAgIF9fYnV0dG9uX3JpZ2h0ID0gRmFsc2UKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFdlIG5lZWQgdG8gZW5zdXJlIHdlJ3JlIG9ubHkgc2hvd24gb25jZQorICAgICAgICBzZWxmLnNob3duID0gRmFsc2UKKworICAgICAgICAjIFdlIGRvbid0IHdhbnQgYW55IFdNIGRlY29yYXRpb25zCisgICAgICAgIHNlbGYuc2V0X2RlY29yYXRlZChGYWxzZSkKKyAgICAgICAgIyBXZSBkb24ndCB3YW50IHRvIHNob3cgaW4gdGhlIHRhc2tiYXIgb3Igd2luZG93IHN3aXRjaGVyCisgICAgICAgIHNlbGYuc2V0X3NraXBfcGFnZXJfaGludChUcnVlKQorICAgICAgICBzZWxmLnNldF9za2lwX3Rhc2tiYXJfaGludChUcnVlKQorICAgICAgICAjIFdlIG11c3QgYmUgbW9kYWwgdG8gZW5zdXJlIHdlIGdyYWIgZm9jdXMgd2hlbiBwcmVzZW50ZWQgZnJvbSBhIGd0ay5EaWFsb2cKKyAgICAgICAgc2VsZi5zZXRfbW9kYWwoVHJ1ZSkKKworICAgICAgICBzZWxmLnNldF9ib3JkZXJfd2lkdGgoMCkKKyAgICAgICAgc2VsZi5zZXRfcG9zaXRpb24oZ3RrLldJTl9QT1NfTU9VU0UpCisgICAgICAgIHNlbGYuc2V0X29wYWNpdHkoMC45NSkKKworICAgICAgICAjIEVuc3VyZSBhIHJlYXNvbmFibGUgbWluaW11bSBzaXplCisgICAgICAgIHNlbGYuc2V0X2dlb21ldHJ5X2hpbnRzKHNlbGYsIDEwMCwgNTApCisKKyAgICAgICAgIyBTZXQgdGhpcyB3aW5kb3cgYXMgYSB0cmFuc2llbnQgd2luZG93IGZvciBwYXJlbnQobWFpbiB3aW5kb3cpCisgICAgICAgIGlmIHBhcmVudF93aW46CisgICAgICAgICAgICBzZWxmLnNldF90cmFuc2llbnRfZm9yKHBhcmVudF93aW4pCisgICAgICAgICAgICBzZWxmLnNldF9kZXN0cm95X3dpdGhfcGFyZW50KFRydWUpCisgICAgICAgICMgRHJhdyBvdXIgbGFiZWwgYW5kIGNsb3NlIGJ1dHRvbnMKKyAgICAgICAgaGJveCA9IGd0ay5IQm94KEZhbHNlLCAwKQorICAgICAgICBoYm94LnNob3coKQorICAgICAgICBzZWxmLmFkZChoYm94KQorCisgICAgICAgIGltZyA9IGd0ay5JbWFnZSgpCisgICAgICAgIGltZy5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfQ0xPU0UsIGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorCisgICAgICAgIHNlbGYuYnV0dG9uID0gZ3RrLkJ1dHRvbigpCisgICAgICAgIHNlbGYuYnV0dG9uLnNldF9pbWFnZShpbWcpCisgICAgICAgIHNlbGYuYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLl9kaXNtaXNzX2NiKQorICAgICAgICBzZWxmLmJ1dHRvbi5zZXRfZmxhZ3MoZ3RrLkNBTl9ERUZBVUxUKQorICAgICAgICBzZWxmLmJ1dHRvbi5ncmFiX2ZvY3VzKCkKKyAgICAgICAgc2VsZi5idXR0b24uc2hvdygpCisgICAgICAgIHZib3ggPSBndGsuVkJveChGYWxzZSwgMCkKKyAgICAgICAgdmJveC5zaG93KCkKKyAgICAgICAgdmJveC5wYWNrX3N0YXJ0KHNlbGYuYnV0dG9uLCBGYWxzZSwgRmFsc2UsIDApCisgICAgICAgIGlmIF9fYnV0dG9uX3JpZ2h0OgorICAgICAgICAgICAgaGJveC5wYWNrX2VuZCh2Ym94LCBUcnVlLCBUcnVlLCAwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGJveC5wYWNrX3N0YXJ0KHZib3gsIFRydWUsIFRydWUsIDApCisKKyAgICAgICAgc2VsZi5zZXRfZGVmYXVsdChzZWxmLmJ1dHRvbikKKworICAgICAgICBiaW4gPSBndGsuSEJveChUcnVlLCA2KQorICAgICAgICBiaW4uc2V0X2JvcmRlcl93aWR0aCg2KQorICAgICAgICBiaW4uc2hvdygpCisgICAgICAgIHNlbGYubGFiZWwgPSBndGsuTGFiZWwoKQorICAgICAgICBzZWxmLmxhYmVsLnNldF9saW5lX3dyYXAoVHJ1ZSkKKyAgICAgICAgIyBXZSB3YW50IHRvIG1hdGNoIHRoZSBjb2xvdXJzIG9mIHRoZSBub3JtYWwgdG9vbHRpcHMsIGFzIGRpY3RhdGVkIGJ5CisgICAgICAgICMgdGhlIHVzZXJzIGd0aystMi4wIHRoZW1lLCB3aGVyZXZlciBwb3NzaWJsZSAtIG9uIHNvbWUgc3lzdGVtcyB0aGlzCisgICAgICAgICMgcmVxdWlyZXMgZXhwbGljaXRseSBzZXR0aW5nIGEgZmdfY29sb3IgZm9yIHRoZSBsYWJlbCB3aGljaCBtYXRjaGVzIHRoZQorICAgICAgICAjIHRvb2x0aXBfZmdfY29sb3IKKyAgICAgICAgc2V0dGluZ3MgPSBndGsuc2V0dGluZ3NfZ2V0X2RlZmF1bHQoKQorICAgICAgICBjb2xvdXJzID0gc2V0dGluZ3MuZ2V0X3Byb3BlcnR5KCdndGstY29sb3Itc2NoZW1lJykuc3BsaXQoJ1xuJykKKyAgICAgICAgIyByZW1vdmUgYW55IGVtcHR5IGxpbmVzLCB0aGVyZSdzIGxpa2VseSB0byBiZSBhIHRyYWlsaW5nIG9uZSBhZnRlcgorICAgICAgICAjIGNhbGxpbmcgc3BsaXQgb24gYSBkaWN0aW9uYXJ5LWxpa2Ugc3RyaW5nCisgICAgICAgIGNvbG91cnMgPSBmaWx0ZXIoTm9uZSwgY29sb3VycykKKyAgICAgICAgZm9yIGNvbCBpbiBjb2xvdXJzOgorICAgICAgICAgICAgaXRlbSwgdmFsID0gY29sLnNwbGl0KCc6ICcpCisgICAgICAgICAgICBpZiBpdGVtID09ICd0b29sdGlwX2ZnX2NvbG9yJzoKKyAgICAgICAgICAgICAgICBzdHlsZSA9IHNlbGYubGFiZWwuZ2V0X3N0eWxlKCkKKyAgICAgICAgICAgICAgICBzdHlsZS5mZ1tndGsuU1RBVEVfTk9STUFMXSA9IGd0ay5nZGsuY29sb3JfcGFyc2UodmFsKQorICAgICAgICAgICAgICAgIHNlbGYubGFiZWwuc2V0X3N0eWxlKHN0eWxlKQorICAgICAgICAgICAgICAgIGJyZWFrICMgd2Ugb25seSBjYXJlIGZvciB0aGUgdG9vbHRpcF9mZ19jb2xvcgorCisgICAgICAgIHNlbGYubGFiZWwuc2V0X21hcmt1cChtYXJrdXApCisgICAgICAgIHNlbGYubGFiZWwuc2hvdygpCisgICAgICAgIGJpbi5hZGQoc2VsZi5sYWJlbCkKKyAgICAgICAgaGJveC5wYWNrX2VuZChiaW4sIFRydWUsIFRydWUsIDYpCisKKyAgICAgICAgIyBhZGQgdGhlIG9yaWdpbmFsIFVSTCBkaXNwbGF5IGZvciB1c2VyIHJlZmVyZW5jZQorICAgICAgICBpZiAnYSBocmVmJyBpbiBtYXJrdXA6CisgICAgICAgICAgICBoYm94LnNldF90b29sdGlwX3RleHQoc2VsZi5nZXRfbWFya3VwX3VybChtYXJrdXApKQorICAgICAgICBoYm94LnNob3coKQorCisgICAgICAgIHNlbGYuY29ubmVjdCgia2V5LXByZXNzLWV2ZW50Iiwgc2VsZi5fY2F0Y2hfZXNjX2NiKQorCisgICAgIiIiCisgICAgQ2FsbGJhY2sgd2hlbiB0aGUgUGVyc2lzdGVudFRvb2x0aXAncyBjbG9zZSBidXR0b24gaXMgY2xpY2tlZC4KKyAgICBIaWRlcyB0aGUgUGVyc2lzdGVudFRvb2x0aXAuCisgICAgIiIiCisgICAgZGVmIF9kaXNtaXNzX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuaGlkZSgpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAiIiIKKyAgICBDYWxsYmFjayB3aGVuIHRoZSBFc2Mga2V5IGlzIGRldGVjdGVkLiBIaWRlcyB0aGUgUGVyc2lzdGVudFRvb2x0aXAuCisgICAgIiIiCisgICAgZGVmIF9jYXRjaF9lc2NfY2Ioc2VsZiwgd2lkZ2V0LCBldmVudCk6CisgICAgICAgIGtleW5hbWUgPSBndGsuZ2RrLmtleXZhbF9uYW1lKGV2ZW50LmtleXZhbCkKKyAgICAgICAgaWYga2V5bmFtZSA9PSAiRXNjYXBlIjoKKyAgICAgICAgICAgIHNlbGYuaGlkZSgpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAiIiIKKyAgICBDYWxsZWQgdG8gcHJlc2VudCB0aGUgUGVyc2lzdGVudFRvb2x0aXAuCisgICAgT3ZlcnJpZGVzIHRoZSBzdXBlcmNsYXNzZXMgc2hvdygpIG1ldGhvZCB0byBpbmNsdWRlIHN0YXRlIHRyYWNraW5nLgorICAgICIiIgorICAgIGRlZiBzaG93KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zaG93bjoKKyAgICAgICAgICAgIHNlbGYuc2hvd24gPSBUcnVlCisgICAgICAgICAgICBndGsuV2luZG93LnNob3coc2VsZikKKworICAgICIiIgorICAgIENhbGxlZCB0byBoaWRlIHRoZSBQZXJzaXN0ZW50VG9vbHRpcC4KKyAgICBPdmVycmlkZXMgdGhlIHN1cGVyY2xhc3NlcyBoaWRlKCkgbWV0aG9kIHRvIGluY2x1ZGUgc3RhdGUgdHJhY2tpbmcuCisgICAgIiIiCisgICAgZGVmIGhpZGUoc2VsZik6CisgICAgICAgIHNlbGYuc2hvd24gPSBGYWxzZQorICAgICAgICBndGsuV2luZG93LmhpZGUoc2VsZikKKworICAgICIiIgorICAgIENhbGxlZCB0byBnZXQgdGhlIGh5cGVybGluayBVUkwgZnJvbSBtYXJrdXAgdGV4dC4KKyAgICAiIiIKKyAgICBkZWYgZ2V0X21hcmt1cF91cmwoc2VsZiwgbWFya3VwKToKKyAgICAgICAgdXJsID0gImh0dHA6IgorICAgICAgICBpZiBtYXJrdXAgYW5kIHR5cGUobWFya3VwKSA9PSBzdHI6CisgICAgICAgICAgICBzID0gbWFya3VwCisgICAgICAgICAgICBpZiAnaHR0cDonIGluIHM6CisgICAgICAgICAgICAgICAgaW1wb3J0IHJlCisgICAgICAgICAgICAgICAgdXJsID0gcmUuc2VhcmNoKCcoaHR0cDpbXixcXCAiXSspJywgcykuZ3JvdXAoMCkKKworICAgICAgICByZXR1cm4gdXJsCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcHJvZ3Jlc3MucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcHJvZ3Jlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyOGExMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wcm9ncmVzcy5weQpAQCAtMCwwICsxLDIzIEBACitpbXBvcnQgZ3RrCisKK2NsYXNzIFByb2dyZXNzQmFyKGd0ay5EaWFsb2cpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgorCisgICAgICAgIGd0ay5EaWFsb2cuX19pbml0X18oc2VsZiwgZmxhZ3M9KGd0ay5ESUFMT0dfTU9EQUwgfCBndGsuRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQpKQorICAgICAgICBzZWxmLnNldF90aXRsZSgiUGFyc2luZyBtZXRhZGF0YSwgcGxlYXNlIHdhaXQuLi4iKQorICAgICAgICBzZWxmLnNldF9kZWZhdWx0X3NpemUoNTAwLCAwKQorICAgICAgICBzZWxmLnNldF90cmFuc2llbnRfZm9yKHBhcmVudCkKKyAgICAgICAgc2VsZi5wcm9ncmVzcyA9IGd0ay5Qcm9ncmVzc0JhcigpCisgICAgICAgIHNlbGYudmJveC5wYWNrX3N0YXJ0KHNlbGYucHJvZ3Jlc3MpCisgICAgICAgIHNlbGYuc2hvd19hbGwoKQorCisgICAgZGVmIHNldF90ZXh0KHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYucHJvZ3Jlc3Muc2V0X3RleHQobXNnKQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCB4LCB5KToKKyAgICAgICAgc2VsZi5wcm9ncmVzcy5zZXRfZnJhY3Rpb24oZmxvYXQoeCkvZmxvYXQoeSkpCisgICAgICAgIHNlbGYucHJvZ3Jlc3Muc2V0X3RleHQoIiUyZCAlJSIgJSAoeCoxMDAveSkpCisKKyAgICBkZWYgcHVsc2Uoc2VsZik6CisgICAgICAgIHNlbGYucHJvZ3Jlc3Muc2V0X3RleHQoIkxvYWRpbmcuLi4iKQorICAgICAgICBzZWxmLnByb2dyZXNzLnB1bHNlKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wcm9ncmVzc2Jhci5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wcm9ncmVzc2Jhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJjNjYwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Byb2dyZXNzYmFyLnB5CkBAIC0wLDAgKzEsNTkgQEAKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMSAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitmcm9tIGJiLnVpLmNydW1icy5ob2Jjb2xvciBpbXBvcnQgSG9iQ29sb3JzCisKK2NsYXNzIEhvYlByb2dyZXNzQmFyIChndGsuUHJvZ3Jlc3NCYXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZ3RrLlByb2dyZXNzQmFyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuc2V0X3Jjc3R5bGUoVHJ1ZSkKKyAgICAgICAgc2VsZi5wZXJjZW50YWdlID0gMAorCisgICAgZGVmIHNldF9yY3N0eWxlKHNlbGYsIHN0YXR1cyk6CisgICAgICAgIHJjc3R5bGUgPSBndGsuUmNTdHlsZSgpCisgICAgICAgIHJjc3R5bGUuZmdbMl0gPSBndGsuZ2RrLkNvbG9yKEhvYkNvbG9ycy5CTEFDSykKKyAgICAgICAgaWYgc3RhdHVzID09ICJzdG9wIjoKKyAgICAgICAgICAgIHJjc3R5bGUuYmdbM10gPSBndGsuZ2RrLkNvbG9yKEhvYkNvbG9ycy5XQVJOSU5HKQorICAgICAgICBlbGlmIHN0YXR1cyA9PSAiZmFpbCI6CisgICAgICAgICAgICByY3N0eWxlLmJnWzNdID0gZ3RrLmdkay5Db2xvcihIb2JDb2xvcnMuRVJST1IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByY3N0eWxlLmJnWzNdID0gZ3RrLmdkay5Db2xvcihIb2JDb2xvcnMuUlVOTklORykKKyAgICAgICAgc2VsZi5tb2RpZnlfc3R5bGUocmNzdHlsZSkKKworICAgIGRlZiBzZXRfdGl0bGUoc2VsZiwgdGV4dD1Ob25lKToKKyAgICAgICAgaWYgbm90IHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gIiIKKyAgICAgICAgdGV4dCArPSAiICUuMGYlJSIgJSBzZWxmLnBlcmNlbnRhZ2UKKyAgICAgICAgc2VsZi5zZXRfdGV4dCh0ZXh0KQorCisgICAgZGVmIHNldF9zdG9wX3RpdGxlKHNlbGYsIHRleHQ9Tm9uZSk6CisJaWYgbm90IHRleHQ6CisJICAgIHRleHQgPSAiIgorCXNlbGYuc2V0X3RleHQodGV4dCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfZnJhY3Rpb24oMCkKKyAgICAgICAgc2VsZi5zZXRfdGV4dCgiIikKKyAgICAgICAgc2VsZi5zZXRfcmNzdHlsZShUcnVlKQorICAgICAgICBzZWxmLnBlcmNlbnRhZ2UgPSAwCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGZyYWN0aW9uKToKKyAgICAgICAgc2VsZi5wZXJjZW50YWdlID0gaW50KGZyYWN0aW9uICogMTAwKQorICAgICAgICBzZWxmLnNldF9mcmFjdGlvbihmcmFjdGlvbikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9wdWNjaG8uZ2xhZGUgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcHVjY2hvLmdsYWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcHVjY2hvLmdsYWRlCkBAIC0wLDAgKzEsNjA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBnbGFkZS1pbnRlcmZhY2UgU1lTVEVNICJnbGFkZS0yLjAuZHRkIj4KKzwhLS1HZW5lcmF0ZWQgd2l0aCBnbGFkZTMgMy40LjUgb24gTW9uIE5vdiAxMCAxMjoyNDoxMiAyMDA4IC0tPgorPGdsYWRlLWludGVyZmFjZT4KKyAgPHdpZGdldCBjbGFzcz0iR3RrRGlhbG9nIiBpZD0iYnVpbGRfZGlhbG9nIj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHRyYW5zbGF0YWJsZT0ieWVzIj5TdGFydCBhIGJ1aWxkPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0id2luZG93X3Bvc2l0aW9uIj5HVEtfV0lOX1BPU19DRU5URVJfT05fUEFSRU5UPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idHlwZV9oaW50Ij5HREtfV0lORE9XX1RZUEVfSElOVF9ESUFMT0c8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNfc2VwYXJhdG9yIj5GYWxzZTwvcHJvcGVydHk+CisgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJ2Ym94Ij4KKyAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZCb3giIGlkPSJkaWFsb2ctdmJveDEiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgPGNoaWxkPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1RhYmxlIiBpZD0iYnVpbGRfdGFibGUiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvcmRlcl93aWR0aCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibl9yb3dzIj43PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuX2NvbHVtbnMiPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbHVtbl9zcGFjaW5nIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyb3dfc3BhY2luZyI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0FsaWdubWVudCIgaWQ9InN0YXR1c19hbGlnbm1lbnQiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9wYWRkaW5nIj4xMjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrSEJveCIgaWQ9InN0YXR1c19oYm94Ij4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJzdGF0dXNfaW1hZ2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5vX3Nob3dfYWxsIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstZGlhbG9nLWVycm9yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmaWxsIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJzdGF0dXNfbGFiZWwiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5JZiB5b3Ugc2VlIHRoaXMgdGV4dCBzb21ldGhpbmcgaXMgd3JvbmcuLi48L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV9tYXJrdXAiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJsYWJlbDIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj4mbHQ7YiZndDtCdWlsZCBjb25maWd1cmF0aW9uJmx0Oy9iJmd0OzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV9tYXJrdXAiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj40PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDb21ib0JveCIgaWQ9ImltYWdlX2NvbWJvIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlbnNpdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjc8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0xhYmVsIiBpZD0iaW1hZ2VfbGFiZWwiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2Vuc2l0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5JbWFnZTo8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj43PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDb21ib0JveCIgaWQ9ImRpc3RyaWJ1dGlvbl9jb21ibyI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZW5zaXRpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9ImRpc3RyaWJ1dGlvbl9sYWJlbCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZW5zaXRpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkRpc3RyaWJ1dGlvbjo8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDb21ib0JveCIgaWQ9Im1hY2hpbmVfY29tYm8iPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2Vuc2l0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj40PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJtYWNoaW5lX2xhYmVsIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlbnNpdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4xMjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+TWFjaGluZTo8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtCdXR0b24iIGlkPSJyZWZyZXNoX2J1dHRvbiI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZW5zaXRpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVjZWl2ZXNfZGVmYXVsdCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Z3RrLXJlZnJlc2g8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2Vfc3RvY2siPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNwb25zZV9pZCI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrRW50cnkiIGlkPSJsb2NhdGlvbl9lbnRyeSI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aWR0aF9jaGFycyI+MzI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0xhYmVsIiBpZD0ibGFiZWwzIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5Mb2NhdGlvbjo8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtMYWJlbCIgaWQ9ImxhYmVsMSI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPiZsdDtiJmd0O1JlcG9zaXRvcnkmbHQ7L2ImZ3Q7PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX21hcmt1cCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQxIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHBsYWNlaG9sZGVyLz4KKyAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+NDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0FsaWdubWVudCIgaWQ9ImFsaWdubWVudDIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8cGxhY2Vob2xkZXIvPgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrQWxpZ25tZW50IiBpZD0iYWxpZ25tZW50MyI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjY8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj43PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgIDwvY2hpbGQ+CisgICAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iYWN0aW9uX2FyZWEiPgorICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0hCdXR0b25Cb3giIGlkPSJkaWFsb2ctYWN0aW9uX2FyZWExIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYXlvdXRfc3R5bGUiPkdUS19CVVRUT05CT1hfRU5EPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHBsYWNlaG9sZGVyLz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8cGxhY2Vob2xkZXIvPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrX3R5cGUiPkdUS19QQUNLX0VORDwvcHJvcGVydHk+CisgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICA8L2NoaWxkPgorICAgICAgPC93aWRnZXQ+CisgICAgPC9jaGlsZD4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9Ikd0a0RpYWxvZyIgaWQ9ImRpYWxvZzIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcG9zaXRpb24iPkdUS19XSU5fUE9TX0NFTlRFUl9PTl9QQVJFTlQ8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlX2hpbnQiPkdES19XSU5ET1dfVFlQRV9ISU5UX0RJQUxPRzwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Imhhc19zZXBhcmF0b3IiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9InZib3giPgorICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVkJveCIgaWQ9ImRpYWxvZy12Ym94MiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciPjI8L3Byb3BlcnR5PgorICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVGFibGUiIGlkPSJ0YWJsZTIiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvcmRlcl93aWR0aCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibl9yb3dzIj43PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuX2NvbHVtbnMiPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbHVtbl9zcGFjaW5nIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyb3dfc3BhY2luZyI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0xhYmVsIiBpZD0ibGFiZWw3Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Jmx0O2ImZ3Q7UmVwb3NpdG9yaWVzJmx0Oy9iJmd0OzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV9tYXJrdXAiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrQWxpZ25tZW50IiBpZD0iYWxpZ25tZW50NCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X3BhZGRpbmciPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtTY3JvbGxlZFdpbmRvdyIgaWQ9InNjcm9sbGVkd2luZG93MSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1RyZWVWaWV3IiBpZD0idHJlZXZpZXcxIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnNfY2xpY2thYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wX2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbV9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ5X29wdGlvbnMiPjwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0VudHJ5IiBpZD0iZW50cnkxIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+MjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJsYWJlbDkiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj4mbHQ7YiZndDtBZGRpdGlvbmFsIHBhY2thZ2VzJmx0Oy9iJmd0OzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV9tYXJrdXAiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQ2Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhzY2FsZSI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJsYWJlbDgiPgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+TG9jYXRpb246IDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj4yPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQ3Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhzY2FsZSI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrSEJ1dHRvbkJveCIgaWQ9ImhidXR0b25ib3gxIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BhY2luZyI+NTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtCdXR0b24iIGlkPSJidXR0b243Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlY2VpdmVzX2RlZmF1bHQiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Z3RrLXJlbW92ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3N0b2NrIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNwb25zZV9pZCI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtCdXR0b24iIGlkPSJidXR0b242Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlY2VpdmVzX2RlZmF1bHQiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Z3RrLWVkaXQ8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV9zdG9jayI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzcG9uc2VfaWQiPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIj4xPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtCdXR0b24iIGlkPSJidXR0b241Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlY2VpdmVzX2RlZmF1bHQiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Z3RrLWFkZDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3N0b2NrIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNwb25zZV9pZCI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iPjI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9hdHRhY2giPjE8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrQWxpZ25tZW50IiBpZD0iYWxpZ25tZW50NSI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDxwbGFjZWhvbGRlci8+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj4zPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrTGFiZWwiIGlkPSJsYWJlbDEwIj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjEyPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TZWFyY2g6PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj41PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NjwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrRW50cnkiIGlkPSJlbnRyeTIiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0X2F0dGFjaCI+MTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X2F0dGFjaCI+MzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcF9hdHRhY2giPjU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3R0b21fYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ieV9vcHRpb25zIj48L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtBbGlnbm1lbnQiIGlkPSJhbGlnbm1lbnQ4Ij4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfcGFkZGluZyI+MTI8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3cyIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVHJlZVZpZXciIGlkPSJ0cmVldmlldzIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc19jbGlja2FibGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICAgICAgICA8L2NoaWxkPgorICAgICAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodF9hdHRhY2giPjM8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BfYXR0YWNoIj42PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tX2F0dGFjaCI+NzwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Inlfb3B0aW9ucyI+PC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MTwvcHJvcGVydHk+CisgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICA8L2NoaWxkPgorICAgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImFjdGlvbl9hcmVhIj4KKyAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtIQnV0dG9uQm94IiBpZD0iZGlhbG9nLWFjdGlvbl9hcmVhMiI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGF5b3V0X3N0eWxlIj5HVEtfQlVUVE9OQk9YX0VORDwvcHJvcGVydHk+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0J1dHRvbiIgaWQ9ImJ1dHRvbjQiPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVjZWl2ZXNfZGVmYXVsdCI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+Z3RrLWNsb3NlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3N0b2NrIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzcG9uc2VfaWQiPjA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgPHBhY2tpbmc+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja190eXBlIj5HVEtfUEFDS19FTkQ8L3Byb3BlcnR5PgorICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgPC9jaGlsZD4KKyAgICAgIDwvd2lkZ2V0PgorICAgIDwvY2hpbGQ+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJHdGtXaW5kb3ciIGlkPSJtYWluX3dpbmRvdyI+CisgICAgPGNoaWxkPgorICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVkJveCIgaWQ9Im1haW5fd2luZG93X3Zib3giPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUb29sYmFyIiBpZD0ibWFpbl90b29sYmFyIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICAgICAgPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9Im1haW5fdG9vbGJ1dHRvbl9idWlsZCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkJ1aWxkPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1leGVjdXRlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC93aWRnZXQ+CisgICAgICAgICAgICAgIDxwYWNraW5nPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3BhY2tpbmc+CisgICAgICAgIDwvY2hpbGQ+CisgICAgICAgIDxjaGlsZD4KKyAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWUGFuZWQiIGlkPSJ2cGFuZWQxIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorICAgICAgICAgICAgPGNoaWxkPgorICAgICAgICAgICAgICA8d2lkZ2V0IGNsYXNzPSJHdGtTY3JvbGxlZFdpbmRvdyIgaWQ9InJlc3VsdHNfc2Nyb2xsZWR3aW5kb3ciPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8cGxhY2Vob2xkZXIvPgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5GYWxzZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICAgICAgICAgIDwvcGFja2luZz4KKyAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0icHJvZ3Jlc3Nfc2Nyb2xsZWR3aW5kb3ciPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8Y2hpbGQ+CisgICAgICAgICAgICAgICAgICA8cGxhY2Vob2xkZXIvPgorICAgICAgICAgICAgICAgIDwvY2hpbGQ+CisgICAgICAgICAgICAgIDwvd2lkZ2V0PgorICAgICAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICAgICAgPC9jaGlsZD4KKyAgICAgICAgICA8L3dpZGdldD4KKyAgICAgICAgICA8cGFja2luZz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MTwvcHJvcGVydHk+CisgICAgICAgICAgPC9wYWNraW5nPgorICAgICAgICA8L2NoaWxkPgorICAgICAgPC93aWRnZXQ+CisgICAgPC9jaGlsZD4KKyAgPC93aWRnZXQ+Cis8L2dsYWRlLWludGVyZmFjZT4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9yZWNpcGVzZWxlY3Rpb25wYWdlLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3JlY2lwZXNlbGVjdGlvbnBhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNThkYjQzZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9yZWNpcGVzZWxlY3Rpb25wYWdlLnB5CkBAIC0wLDAgKzEsMzM1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAxMiAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgU2hhbmUgV2FuZyA8c2hhbmUud2FuZ0BpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrCitpbXBvcnQgZ2xpYgorZnJvbSBiYi51aS5jcnVtYnMuaG9iY29sb3IgaW1wb3J0IEhvYkNvbG9ycworZnJvbSBiYi51aS5jcnVtYnMuaG9id2lkZ2V0IGltcG9ydCBIb2JWaWV3VGFibGUsIEhvYk5vdGVib29rLCBIb2JBbHRCdXR0b24sIEhvYkJ1dHRvbgorZnJvbSBiYi51aS5jcnVtYnMuaG9ibGlzdG1vZGVsIGltcG9ydCBSZWNpcGVMaXN0TW9kZWwKK2Zyb20gYmIudWkuY3J1bWJzLmhvYnBhZ2VzIGltcG9ydCBIb2JQYWdlCisKKyMKKyMgUmVjaXBlU2VsZWN0aW9uUGFnZQorIworY2xhc3MgUmVjaXBlU2VsZWN0aW9uUGFnZSAoSG9iUGFnZSk6CisgICAgcGFnZXMgPSBbCisgICAgICAgIHsKKyAgICAgICAgICduYW1lJyAgICAgIDogJ0luY2x1ZGVkIHJlY2lwZXMnLAorICAgICAgICAgJ3Rvb2x0aXAnICAgOiAnVGhlIHJlY2lwZXMgY3VycmVudGx5IGluY2x1ZGVkIGZvciB5b3VyIGltYWdlJywKKyAgICAgICAgICdmaWx0ZXInICAgIDogeyBSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQyAgOiBbVHJ1ZV0sCisgICAgICAgICAgICAgICAgICAgICAgIFJlY2lwZUxpc3RNb2RlbC5DT0xfVFlQRSA6IFsncmVjaXBlJywgJ3BhY2thZ2Vncm91cCddIH0sCisgICAgICAgICAnc2VhcmNoJyAgICA6ICdTZWFyY2ggcmVjaXBlcyBieSBuYW1lJywKKyAgICAgICAgICdzZWFyY2h0aXAnIDogJ0VudGVyIGEgcmVjaXBlIG5hbWUgdG8gZmluZCBpdCcsCisgICAgICAgICAnY29sdW1ucycgICA6IFt7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUmVjaXBlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ3RleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ0dyb3VwJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFJlY2lwZUxpc3RNb2RlbC5DT0xfR1JPVVAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnQnJvdWdodCBpbiBieSAoK290aGVycyknLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9CSU5CLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ2JpbmInLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogNTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ0luY2x1ZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFJlY2lwZUxpc3RNb2RlbC5DT0xfSU5DLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ2NoZWNrIHRvZ2dsZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICB9XQorICAgICAgICB9LCB7CisgICAgICAgICAnbmFtZScgICAgICA6ICdBbGwgcmVjaXBlcycsCisgICAgICAgICAndG9vbHRpcCcgICA6ICdBbGwgcmVjaXBlcyBpbiB5b3VyIGNvbmZpZ3VyZWQgbGF5ZXJzJywKKyAgICAgICAgICdmaWx0ZXInICAgIDogeyBSZWNpcGVMaXN0TW9kZWwuQ09MX1RZUEUgOiBbJ3JlY2lwZSddIH0sCisgICAgICAgICAnc2VhcmNoJyAgICA6ICdTZWFyY2ggcmVjaXBlcyBieSBuYW1lJywKKyAgICAgICAgICdzZWFyY2h0aXAnIDogJ0VudGVyIGEgcmVjaXBlIG5hbWUgdG8gZmluZCBpdCcsCisgICAgICAgICAnY29sdW1ucycgICA6IFt7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnUmVjaXBlIG5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX3N0eWxlJzogJ3RleHQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kJyAgIDogJ1RydWUnCisgICAgICAgICAgICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ0dyb3VwJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9pZCcgICA6IFJlY2lwZUxpc3RNb2RlbC5DT0xfR1JPVVAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnTGljZW5zZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX0xJQywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICd0ZXh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZCcgICA6ICdUcnVlJworICAgICAgICAgICAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9uYW1lJyA6ICdJbmNsdWRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9zdHlsZSc6ICdjaGVjayB0b2dnbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21pbicgIDogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX21heCcgIDogMTAwCisgICAgICAgICAgICAgICAgICAgICAgfV0KKyAgICAgICAgfSwgeworICAgICAgICAgJ25hbWUnICAgICAgOiAnUGFja2FnZSBHcm91cHMnLAorICAgICAgICAgJ3Rvb2x0aXAnICAgOiAnQWxsIHBhY2thZ2UgZ3JvdXBzIGluIHlvdXIgY29uZmlndXJlZCBsYXllcnMnLAorICAgICAgICAgJ2ZpbHRlcicgICAgOiB7IFJlY2lwZUxpc3RNb2RlbC5DT0xfVFlQRSA6IFsncGFja2FnZWdyb3VwJ10gfSwKKyAgICAgICAgICdzZWFyY2gnICAgIDogJ1NlYXJjaCBwYWNrYWdlIGdyb3VwcyBieSBuYW1lJywKKyAgICAgICAgICdzZWFyY2h0aXAnIDogJ0VudGVyIGEgcGFja2FnZSBncm91cCBuYW1lIHRvIGZpbmQgaXQnLAorICAgICAgICAgJ2NvbHVtbnMnICAgOiBbeworICAgICAgICAgICAgICAgICAgICAgICAnY29sX25hbWUnIDogJ1BhY2thZ2UgZ3JvdXAgbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfaWQnICAgOiBSZWNpcGVMaXN0TW9kZWwuQ09MX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWluJyAgOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbWF4JyAgOiA0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICdleHBhbmQnICAgOiAnVHJ1ZScKKyAgICAgICAgICAgICAgICAgICAgICB9LCB7CisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfbmFtZScgOiAnSW5jbHVkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29sX2lkJyAgIDogUmVjaXBlTGlzdE1vZGVsLkNPTF9JTkMsCisgICAgICAgICAgICAgICAgICAgICAgICdjb2xfc3R5bGUnOiAnY2hlY2sgdG9nZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9taW4nICA6IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbF9tYXgnICA6IDEwMAorICAgICAgICAgICAgICAgICAgICAgIH1dCisgICAgICAgIH0KKyAgICBdCisgICAgCisgICAgKElOQ0xVREVELAorICAgICBBTEwsCisgICAgIFRBU0tTKSA9IHJhbmdlKDMpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlciA9IE5vbmUpOgorICAgICAgICBzdXBlcihSZWNpcGVTZWxlY3Rpb25QYWdlLCBzZWxmKS5fX2luaXRfXyhidWlsZGVyLCAiU3RlcCAxIG9mIDI6IEVkaXQgcmVjaXBlcyIpCisKKyAgICAgICAgIyBzZXQgaW52aXNpYmxlIG1lbWJlcnMKKyAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwgPSBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsCisKKyAgICAgICAgIyBjcmVhdGUgdmlzdWFsIGVsZW1lbnRzCisgICAgICAgIHNlbGYuY3JlYXRlX3Zpc3VhbF9lbGVtZW50cygpCisKKyAgICBkZWYgaW5jbHVkZWRfY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmlucy5zZXRfY3VycmVudF9wYWdlKHNlbGYuSU5DTFVERUQpCisKKyAgICBkZWYgY3JlYXRlX3Zpc3VhbF9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5ldmVudGJveCA9IHNlbGYuYWRkX29udG9fdG9wX2JhcihOb25lLCA3MykKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZXZlbnRib3gsIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKyAgICAgICAgc2VsZi5wYWNrX3N0YXJ0KHNlbGYuZ3JvdXBfYWxpZ24sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisKKyAgICAgICAgIyBzZXQgdmlzaWJsZSBtZW1iZXJzCisgICAgICAgIHNlbGYuaW5zID0gSG9iTm90ZWJvb2soKQorICAgICAgICBzZWxmLnRhYmxlcyA9IFtdICMgd2UgbmVlZCBtb2RpZnkgdGFibGUgd2hlbiB0aGUgZGlhbG9nIGlzIHNob3duCisKKyAgICAgICAgc2VhcmNoX25hbWVzID0gW10KKyAgICAgICAgc2VhcmNoX3RpcHMgPSBbXQorICAgICAgICAjIGFwcGVuZCB0aGUgdGFicyBpbiBvcmRlcgorICAgICAgICBmb3IgcGFnZSBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgY29sdW1ucyA9IHBhZ2VbJ2NvbHVtbnMnXQorICAgICAgICAgICAgbmFtZSA9IHBhZ2VbJ25hbWUnXQorICAgICAgICAgICAgdGFiID0gSG9iVmlld1RhYmxlKGNvbHVtbnMsIG5hbWUpCisgICAgICAgICAgICBzZWFyY2hfbmFtZXMuYXBwZW5kKHBhZ2VbJ3NlYXJjaCddKQorICAgICAgICAgICAgc2VhcmNoX3RpcHMuYXBwZW5kKHBhZ2VbJ3NlYXJjaHRpcCddKQorICAgICAgICAgICAgZmlsdGVyID0gcGFnZVsnZmlsdGVyJ10KKyAgICAgICAgICAgIHNvcnRfbW9kZWwgPSBzZWxmLnJlY2lwZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlciwgaW5pdGlhbD1UcnVlKQorICAgICAgICAgICAgdGFiLnNldF9tb2RlbChzb3J0X21vZGVsKQorICAgICAgICAgICAgdGFiLmNvbm5lY3QoInRvZ2dsZWQiLCBzZWxmLnRhYmxlX3RvZ2dsZWRfY2IsIG5hbWUpCisgICAgICAgICAgICB0YWIuY29ubmVjdCgiYnV0dG9uLXJlbGVhc2UtZXZlbnQiLCBzZWxmLmJ1dHRvbl9jbGlja19jYikKKyAgICAgICAgICAgIHRhYi5jb25uZWN0KCJjZWxsLWZhZGVpbm91dC1zdG9wcGVkIiwgc2VsZi5hZnRlcl9mYWRlb3V0X2NoZWNraW5faW5jbHVkZSwgZmlsdGVyKQorICAgICAgICAgICAgc2VsZi5pbnMuYXBwZW5kX3BhZ2UodGFiLCBwYWdlWyduYW1lJ10sIHBhZ2VbJ3Rvb2x0aXAnXSkKKyAgICAgICAgICAgIHNlbGYudGFibGVzLmFwcGVuZCh0YWIpCisKKyAgICAgICAgc2VsZi5pbnMuc2V0X2VudHJ5KHNlYXJjaF9uYW1lcywgc2VhcmNoX3RpcHMpCisgICAgICAgIHNlbGYuaW5zLnNlYXJjaC5jb25uZWN0KCJjaGFuZ2VkIiwgc2VsZi5zZWFyY2hfZW50cnlfY2hhbmdlZCkKKworICAgICAgICAjIGFkZCBhbGwgaW50byB0aGUgd2luZG93CisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19zdGFydChzZWxmLmlucywgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKworICAgICAgICBidXR0b25fYm94ID0gZ3RrLkhCb3goRmFsc2UsIDYpCisgICAgICAgIHNlbGYuYm94X2dyb3VwX2FyZWEucGFja19lbmQoYnV0dG9uX2JveCwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXNfYnV0dG9uID0gSG9iQnV0dG9uKCdCdWlsZCBwYWNrYWdlcycpCisgICAgICAgICNzZWxmLmJ1aWxkX3BhY2thZ2VzX2J1dHRvbi5zZXRfc2l6ZV9yZXF1ZXN0KDIwNSwgNDkpCisgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXNfYnV0dG9uLnNldF90b29sdGlwX3RleHQoIkJ1aWxkIHNlbGVjdGVkIHJlY2lwZXMgaW50byBwYWNrYWdlcyIpCisgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXNfYnV0dG9uLnNldF9mbGFncyhndGsuQ0FOX0RFRkFVTFQpCisgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXNfYnV0dG9uLmdyYWJfZGVmYXVsdCgpCisgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXNfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmJ1aWxkX3BhY2thZ2VzX2NsaWNrZWRfY2IpCisgICAgICAgIGJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5idWlsZF9wYWNrYWdlc19idXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1GYWxzZSkKKworICAgICAgICBzZWxmLmJhY2tfYnV0dG9uID0gSG9iQWx0QnV0dG9uKCdDYW5jZWwnKQorICAgICAgICBzZWxmLmJhY2tfYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLmJhY2tfYnV0dG9uX2NsaWNrZWRfY2IpCisgICAgICAgIGJ1dHRvbl9ib3gucGFja19lbmQoc2VsZi5iYWNrX2J1dHRvbiwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorCisgICAgZGVmIHNlYXJjaF9lbnRyeV9jaGFuZ2VkKHNlbGYsIGVudHJ5KToKKyAgICAgICAgdGV4dCA9IGVudHJ5LmdldF90ZXh0KCkKKyAgICAgICAgaWYgc2VsZi5pbnMuc2VhcmNoX2ZvY3VzOgorICAgICAgICAgICAgc2VsZi5pbnMuc2VhcmNoX2ZvY3VzID0gRmFsc2UKKyAgICAgICAgZWxpZiBzZWxmLmlucy5wYWdlX2NoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLmlucy5wYWdlX2NoYW5nZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmZpbHRlcl9zZWFyY2goZW50cnkpCisgICAgICAgIGVsaWYgdGV4dCBub3QgaW4gc2VsZi5pbnMuc2VhcmNoX25hbWVzOgorICAgICAgICAgICAgc2VsZi5maWx0ZXJfc2VhcmNoKGVudHJ5KQorCisgICAgZGVmIGZpbHRlcl9zZWFyY2goc2VsZiwgZW50cnkpOgorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0X3RleHQoKQorICAgICAgICBjdXJyZW50X3RhYiA9IHNlbGYuaW5zLmdldF9jdXJyZW50X3BhZ2UoKQorICAgICAgICBmaWx0ZXIgPSBzZWxmLnBhZ2VzW2N1cnJlbnRfdGFiXVsnZmlsdGVyJ10KKyAgICAgICAgZmlsdGVyW1JlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRV0gPSB0ZXh0CisgICAgICAgIHNlbGYudGFibGVzW2N1cnJlbnRfdGFiXS5zZXRfbW9kZWwoc2VsZi5yZWNpcGVfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIsIHNlYXJjaF9kYXRhPXRleHQpKQorICAgICAgICBpZiBzZWxmLnJlY2lwZV9tb2RlbC5maWx0ZXJlZF9uYiA9PSAwOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2JhcjoKKyAgICAgICAgICAgICAgICBzZWxmLmlucy5nZXRfbnRoX3BhZ2UoY3VycmVudF90YWIpLmFkZF9ub19yZXN1bHRfYmFyKGVudHJ5KQorICAgICAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2Jhci5zZXRfbm9fc2hvd19hbGwoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2Jhci5zaG93KCkKKyAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikuc2Nyb2xsLmhpZGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5pbnMuZ2V0X250aF9wYWdlKGN1cnJlbnRfdGFiKS50b3BfYmFyOgorICAgICAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikudG9wX2Jhci5oaWRlKCkKKyAgICAgICAgICAgIHNlbGYuaW5zLmdldF9udGhfcGFnZShjdXJyZW50X3RhYikuc2Nyb2xsLnNob3coKQorICAgICAgICBpZiBlbnRyeS5nZXRfdGV4dCgpID09ICcnOgorICAgICAgICAgICAgZW50cnkuc2V0X2ljb25fc2Vuc2l0aXZlKGd0ay5FTlRSWV9JQ09OX1NFQ09OREFSWSwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRyeS5zZXRfaWNvbl9zZW5zaXRpdmUoZ3RrLkVOVFJZX0lDT05fU0VDT05EQVJZLCBUcnVlKQorCisgICAgZGVmIGJ1dHRvbl9jbGlja19jYihzZWxmLCB3aWRnZXQsIGV2ZW50KToKKyAgICAgICAgcGF0aCwgY29sID0gd2lkZ2V0LnRhYmxlX3RyZWUuZ2V0X2N1cnNvcigpCisgICAgICAgIHRyZWVfbW9kZWwgPSB3aWRnZXQudGFibGVfdHJlZS5nZXRfbW9kZWwoKQorICAgICAgICBpZiBwYXRoIGFuZCBjb2wuZ2V0X3RpdGxlKCkgIT0gJ0luY2x1ZGVkJzogIyBlbHNlIGFjdGl2YXRpb24gaXMgbGlrZWx5IGEgcmVtb3ZhbAorICAgICAgICAgICAgcHJvcGVydGllcyA9IHsnc3VtbWFyeSc6ICcnLCAnbmFtZSc6ICcnLCAndmVyc2lvbic6ICcnLCAncmV2aXNpb24nOiAnJywgJ2JpbmInOiAnJywgJ2dyb3VwJzogJycsICdsaWNlbnNlJzogJycsICdob21lcGFnZSc6ICcnLCAnYnVndHJhY2tlcic6ICcnLCAnZGVzY3JpcHRpb24nOiAnJ30KKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ3N1bW1hcnknXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfU1VNTUFSWSkKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ25hbWUnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfTkFNRSkKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ3ZlcnNpb24nXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfVkVSU0lPTikKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ3JldmlzaW9uJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBSZWNpcGVMaXN0TW9kZWwuQ09MX1JFVklTSU9OKQorICAgICAgICAgICAgcHJvcGVydGllc1snYmluYiddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9CSU5CKQorICAgICAgICAgICAgcHJvcGVydGllc1snZ3JvdXAnXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfR1JPVVApCisgICAgICAgICAgICBwcm9wZXJ0aWVzWydsaWNlbnNlJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0xJQykKKyAgICAgICAgICAgIHByb3BlcnRpZXNbJ2hvbWVwYWdlJ10gPSB0cmVlX21vZGVsLmdldF92YWx1ZSh0cmVlX21vZGVsLmdldF9pdGVyKHBhdGgpLCBSZWNpcGVMaXN0TW9kZWwuQ09MX0hPTUVQQUdFKQorICAgICAgICAgICAgcHJvcGVydGllc1snYnVndHJhY2tlciddID0gdHJlZV9tb2RlbC5nZXRfdmFsdWUodHJlZV9tb2RlbC5nZXRfaXRlcihwYXRoKSwgUmVjaXBlTGlzdE1vZGVsLkNPTF9CVUdUUkFDS0VSKQorICAgICAgICAgICAgcHJvcGVydGllc1snZGVzY3JpcHRpb24nXSA9IHRyZWVfbW9kZWwuZ2V0X3ZhbHVlKHRyZWVfbW9kZWwuZ2V0X2l0ZXIocGF0aCksIFJlY2lwZUxpc3RNb2RlbC5DT0xfREVTQykKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5zaG93X3JlY2lwZV9wcm9wZXJ0eV9kaWFsb2cocHJvcGVydGllcykKKworICAgIGRlZiBidWlsZF9wYWNrYWdlc19jbGlja2VkX2NiKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYucmVmcmVzaF90YWJsZXMoKQorICAgICAgICBzZWxmLmJ1aWxkZXIuYnVpbGRfcGFja2FnZXMoKQorCisgICAgZGVmIHJlZnJlc2hfdGFibGVzKHNlbGYpOgorICAgICAgICBzZWxmLmlucy5yZXNldF9lbnRyeShzZWxmLmlucy5zZWFyY2gsIDApCisgICAgICAgIGZvciB0YWIgaW4gc2VsZi50YWJsZXM6CisgICAgICAgICAgICBpbmRleCA9IHNlbGYudGFibGVzLmluZGV4KHRhYikKKyAgICAgICAgICAgIGZpbHRlciA9IHNlbGYucGFnZXNbaW5kZXhdWydmaWx0ZXInXQorICAgICAgICAgICAgdGFiLnNldF9tb2RlbChzZWxmLnJlY2lwZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlciwgc2VhcmNoX2RhdGE9IiIsIGluaXRpYWw9VHJ1ZSkpCisKKyAgICBkZWYgYmFja19idXR0b25fY2xpY2tlZF9jYihzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLnNldF9zZWxlY3RlZF9pbWFnZShzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX2ltYWdlKQorICAgICAgICBzZWxmLmJ1aWxkZXIuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9pbWFnZV9jb21ibyhzZWxmLmJ1aWxkZXIucmVjaXBlX21vZGVsLCBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5pbml0aWFsX3NlbGVjdGVkX2ltYWdlKQorICAgICAgICBzZWxmLmJ1aWxkZXIuaW1hZ2VfY29uZmlndXJhdGlvbl9wYWdlLnVwZGF0ZV9pbWFnZV9kZXNjKCkKKyAgICAgICAgc2VsZi5idWlsZGVyLnNob3dfY29uZmlndXJhdGlvbigpCisgICAgICAgIHNlbGYucmVmcmVzaF90YWJsZXMoKQorCisgICAgZGVmIHJlZnJlc2hfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkZXIuY29uZmlndXJhdGlvbi5zZWxlY3RlZF9pbWFnZSA9IHNlbGYucmVjaXBlX21vZGVsLmdldF9zZWxlY3RlZF9pbWFnZSgpCisgICAgICAgIF8sIHNlbGYuYnVpbGRlci5jb25maWd1cmF0aW9uLnNlbGVjdGVkX3JlY2lwZXMgPSBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfc2VsZWN0ZWRfcmVjaXBlcygpCisgICAgICAgIHNlbGYuaW5zLnNob3dfaW5kaWNhdG9yX2ljb24oIkluY2x1ZGVkIHJlY2lwZXMiLCBsZW4oc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfcmVjaXBlcykpCisKKyAgICBkZWYgdG9nZ2xlX2l0ZW1faWRsZV9jYihzZWxmLCBwYXRoLCB2aWV3X3RyZWUsIGNlbGwsIHBhZ2VuYW1lKToKKyAgICAgICAgaWYgbm90IHNlbGYucmVjaXBlX21vZGVsLnBhdGhfaW5jbHVkZWQocGF0aCk6CisgICAgICAgICAgICBzZWxmLnJlY2lwZV9tb2RlbC5pbmNsdWRlX2l0ZW0oaXRlbV9wYXRoPXBhdGgsIGJpbmI9IlVzZXIgU2VsZWN0ZWQiLCBpbWFnZV9jb250ZW50cz1GYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJlX2ZhZGVvdXRfY2hlY2tvdXRfaW5jbHVkZSh2aWV3X3RyZWUsIHBhZ2VuYW1lKQorICAgICAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwuZXhjbHVkZV9pdGVtKGl0ZW1fcGF0aD1wYXRoKQorICAgICAgICAgICAgc2VsZi5yZW5kZXJfZmFkZW91dCh2aWV3X3RyZWUsIGNlbGwpCisKKyAgICAgICAgc2VsZi5yZWZyZXNoX3NlbGVjdGlvbigpCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1aWxkZXIuY3VzdG9taXplZDoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRlci5jdXN0b21pemVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5idWlsZGVyLmNvbmZpZ3VyYXRpb24uc2VsZWN0ZWRfaW1hZ2UgPSBzZWxmLnJlY2lwZV9tb2RlbC5fX2N1c3RvbV9pbWFnZV9fCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucmNwcGtnbGlzdF9wb3B1bGF0ZWQoKQorCisgICAgICAgIHNlbGYuYnVpbGRlci53aW5kb3dfc2Vuc2l0aXZlKFRydWUpCisKKyAgICAgICAgdmlld19tb2RlbCA9IHZpZXdfdHJlZS5nZXRfbW9kZWwoKQorICAgICAgICB2cGF0aCA9IHNlbGYucmVjaXBlX21vZGVsLmNvbnZlcnRfcGF0aF90b192cGF0aCh2aWV3X21vZGVsLCBwYXRoKQorICAgICAgICB2aWV3X3RyZWUuc2V0X2N1cnNvcih2cGF0aCkKKworICAgIGRlZiB0YWJsZV90b2dnbGVkX2NiKHNlbGYsIHRhYmxlLCBjZWxsLCB2aWV3X3BhdGgsIHRvZ2dsZWRfY29sdW1uaWQsIHZpZXdfdHJlZSwgcGFnZW5hbWUpOgorICAgICAgICAjIENsaWNrIHRvIGluY2x1ZGUgYSByZWNpcGUKKyAgICAgICAgc2VsZi5idWlsZGVyLndpbmRvd19zZW5zaXRpdmUoRmFsc2UpCisgICAgICAgIHZpZXdfbW9kZWwgPSB2aWV3X3RyZWUuZ2V0X21vZGVsKCkKKyAgICAgICAgcGF0aCA9IHNlbGYucmVjaXBlX21vZGVsLmNvbnZlcnRfdnBhdGhfdG9fcGF0aCh2aWV3X21vZGVsLCB2aWV3X3BhdGgpCisgICAgICAgIGdsaWIuaWRsZV9hZGQoc2VsZi50b2dnbGVfaXRlbV9pZGxlX2NiLCBwYXRoLCB2aWV3X3RyZWUsIGNlbGwsIHBhZ2VuYW1lKQorCisgICAgZGVmIHByZV9mYWRlb3V0X2NoZWNrb3V0X2luY2x1ZGUoc2VsZiwgdHJlZSwgcGFnZW5hbWUpOgorICAgICAgICAjYWZ0ZXIgdGhlIGZhZGVvdXQgdGhlIHRhYmxlIHdpbGwgYmUgc29ydGVkIGFzIGJlZm9yZQorICAgICAgICBzZWxmLnNvcnRfY29sdW1uX2lkID0gc2VsZi5yZWNpcGVfbW9kZWwuc29ydF9jb2x1bW5faWQKKyAgICAgICAgc2VsZi5zb3J0X29yZGVyID0gc2VsZi5yZWNpcGVfbW9kZWwuc29ydF9vcmRlcgorCisgICAgICAgICNyZXN5bmMgdGhlIGluY2x1ZGVkIGl0ZW1zIHRvIGEgYmFja3VwIGZhZGUgaW5jbHVkZSBjb2x1bW4KKyAgICAgICAgaXQgPSBzZWxmLnJlY2lwZV9tb2RlbC5nZXRfaXRlcl9maXJzdCgpCisgICAgICAgIHdoaWxlIGl0OgorICAgICAgICAgICAgYWN0aXZlID0gc2VsZi5yZWNpcGVfbW9kZWwuZ2V0X3ZhbHVlKGl0LCBzZWxmLnJlY2lwZV9tb2RlbC5DT0xfSU5DKQorICAgICAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwuc2V0KGl0LCBzZWxmLnJlY2lwZV9tb2RlbC5DT0xfRkFERV9JTkMsIGFjdGl2ZSkKKyAgICAgICAgICAgIGl0ID0gc2VsZi5yZWNpcGVfbW9kZWwuaXRlcl9uZXh0KGl0KQorICAgICAgICAjIENoZWNrIG91dCBhIG1vZGVsIHdoaWNoIGJhc2Ugb24gdGhlIGNvbHVtbiBDT0xfRkFERV9JTkMsCisgICAgICAgICMgaXQncyBzYXZlIHRoZSBwcmV2IHN0YXRlIG9mIGNvbHVtbiBDT0xfSU5DIGJlZm9yZSBkbyBleGNsdWRlX2l0ZW0KKyAgICAgICAgZmlsdGVyID0geyBSZWNpcGVMaXN0TW9kZWwuQ09MX0ZBREVfSU5DOltUcnVlXSB9CisgICAgICAgIGlmIHBhZ2VuYW1lID09ICJJbmNsdWRlZCByZWNpcGVzIjoKKyAgICAgICAgICAgIGZpbHRlcltSZWNpcGVMaXN0TW9kZWwuQ09MX1RZUEVdID0gWydyZWNpcGUnLCAncGFja2FnZWdyb3VwJ10KKyAgICAgICAgZWxpZiBwYWdlbmFtZSA9PSAiQWxsIHJlY2lwZXMiOgorICAgICAgICAgICAgZmlsdGVyW1JlY2lwZUxpc3RNb2RlbC5DT0xfVFlQRV0gPSBbJ3JlY2lwZSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWx0ZXJbUmVjaXBlTGlzdE1vZGVsLkNPTF9UWVBFXSA9IFsncGFja2FnZWdyb3VwJ10KKworICAgICAgICBuZXdfbW9kZWwgPSBzZWxmLnJlY2lwZV9tb2RlbC50cmVlX21vZGVsKGZpbHRlciwgZXhjbHVkZWRfaXRlbXNfYWhlYWQ9VHJ1ZSkKKyAgICAgICAgdHJlZS5zZXRfbW9kZWwobmV3X21vZGVsKQorCisgICAgZGVmIHJlbmRlcl9mYWRlb3V0KHNlbGYsIHRyZWUsIGNlbGwpOgorICAgICAgICBpZiAobm90IGNlbGwpIG9yIChub3QgdHJlZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdG9fcmVuZGVyX2NlbGxzID0gW10KKyAgICAgICAgbW9kZWwgPSB0cmVlLmdldF9tb2RlbCgpCisgICAgICAgIGl0ID0gbW9kZWwuZ2V0X2l0ZXJfZmlyc3QoKQorICAgICAgICB3aGlsZSBpdDoKKyAgICAgICAgICAgIHBhdGggPSBtb2RlbC5nZXRfcGF0aChpdCkKKyAgICAgICAgICAgIHByZXZfY2VsbF9pc19hY3RpdmUgPSBtb2RlbC5nZXRfdmFsdWUoaXQsIFJlY2lwZUxpc3RNb2RlbC5DT0xfRkFERV9JTkMpCisgICAgICAgICAgICBjdXJyX2NlbGxfaXNfYWN0aXZlID0gbW9kZWwuZ2V0X3ZhbHVlKGl0LCBSZWNpcGVMaXN0TW9kZWwuQ09MX0lOQykKKyAgICAgICAgICAgIGlmIChwcmV2X2NlbGxfaXNfYWN0aXZlID09IFRydWUpIGFuZCAoY3Vycl9jZWxsX2lzX2FjdGl2ZSA9PSBGYWxzZSk6CisgICAgICAgICAgICAgICAgdG9fcmVuZGVyX2NlbGxzLmFwcGVuZChwYXRoKQorICAgICAgICAgICAgaXQgPSBtb2RlbC5pdGVyX25leHQoaXQpCisKKyAgICAgICAgY2VsbC5mYWRlb3V0KHRyZWUsIDEwMDAsIHRvX3JlbmRlcl9jZWxscykKKworICAgIGRlZiBhZnRlcl9mYWRlb3V0X2NoZWNraW5faW5jbHVkZShzZWxmLCB0YWJsZSwgY3RybCwgY2VsbCwgdHJlZSwgZmlsdGVyKToKKyAgICAgICAgc2VsZi5yZWNpcGVfbW9kZWwuc29ydF9jb2x1bW5faWQgPSBzZWxmLnNvcnRfY29sdW1uX2lkCisgICAgICAgIHNlbGYucmVjaXBlX21vZGVsLnNvcnRfb3JkZXIgPSBzZWxmLnNvcnRfb3JkZXIKKyAgICAgICAgdHJlZS5zZXRfbW9kZWwoc2VsZi5yZWNpcGVfbW9kZWwudHJlZV9tb2RlbChmaWx0ZXIpKQorCisgICAgZGVmIHNldF9yZWNpcGVfY3Vycl90YWIoc2VsZiwgY3Vycl9wYWdlKToKKyAgICAgICAgc2VsZi5pbnMuc2V0X2N1cnJlbnRfcGFnZShjdXJyX3BhZ2UpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9jcnVtYnMvcnVubmluZ2J1aWxkLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3J1bm5pbmdidWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmE5NTVkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3J1bm5pbmdidWlsZC5weQpAQCAtMCwwICsxLDU1MSBAQAorCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IFJvYiBCcmFkZm9yZCA8cm9iQGxpbnV4LmludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBndGsKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHRpbWUKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgcGFuZ28KK2Zyb20gYmIudWkuY3J1bWJzLmhvYmNvbG9yIGltcG9ydCBIb2JDb2xvcnMKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgSG9iV2FycENlbGxSZW5kZXJlclRleHQsIEhvYkNlbGxSZW5kZXJlclBpeGJ1ZgorCitjbGFzcyBSdW5uaW5nQnVpbGRNb2RlbCAoZ3RrLlRyZWVTdG9yZSk6CisgICAgKENPTF9MT0csIENPTF9QQUNLQUdFLCBDT0xfVEFTSywgQ09MX01FU1NBR0UsIENPTF9JQ09OLCBDT0xfQ09MT1IsIENPTF9OVU1fQUNUSVZFKSA9IHJhbmdlKDcpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBndGsuVHJlZVN0b3JlLl9faW5pdF9fIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfSU5UKQorCisgICAgZGVmIGZhaWx1cmVfbW9kZWxfZmlsdGVyKHNlbGYsIG1vZGVsLCBpdCk6CisgICAgICAgIGNvbG9yID0gbW9kZWwuZ2V0KGl0LCBzZWxmLkNPTF9DT0xPUilbMF0KKyAgICAgICAgaWYgbm90IGNvbG9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvbG9yID09IEhvYkNvbG9ycy5FUlJPUiBvciBjb2xvciA9PSBIb2JDb2xvcnMuV0FSTklORzoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGZhaWx1cmVfbW9kZWwoc2VsZik6CisgICAgICAgIG1vZGVsID0gc2VsZi5maWx0ZXJfbmV3KCkKKyAgICAgICAgbW9kZWwuc2V0X3Zpc2libGVfZnVuYyhzZWxmLmZhaWx1cmVfbW9kZWxfZmlsdGVyKQorICAgICAgICByZXR1cm4gbW9kZWwKKworICAgIGRlZiBmb3JlYWNoX2NlbGxfZnVuYyhzZWxmLCBtb2RlbCwgcGF0aCwgaXRlciwgdXNyX2RhdGE9Tm9uZSk6CisgICAgICAgIGlmIG1vZGVsLmdldF92YWx1ZShpdGVyLCBzZWxmLkNPTF9JQ09OKSA9PSAiZ3RrLWV4ZWN1dGUiOgorICAgICAgICAgICAgbW9kZWwuc2V0KGl0ZXIsIHNlbGYuQ09MX0lDT04sICIiKQorCisgICAgZGVmIGNsb3NlX3Rhc2tfcmVmcmVzaChzZWxmKToKKyAgICAgICAgc2VsZi5mb3JlYWNoKHNlbGYuZm9yZWFjaF9jZWxsX2Z1bmMsIE5vbmUpCisKK2NsYXNzIFJ1bm5pbmdCdWlsZCAoZ29iamVjdC5HT2JqZWN0KToKKyAgICBfX2dzaWduYWxzX18gPSB7CisgICAgICAgICAgJ2J1aWxkLXN0YXJ0ZWQnICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ2J1aWxkLXN1Y2NlZWRlZCcgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ2J1aWxkLWZhaWxlZCcgICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ2J1aWxkLWNvbXBsZXRlJyAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ2J1aWxkLWFib3J0ZWQnICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICAgJ3Rhc2stc3RhcnRlZCcgICAgOiAgKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2JqZWN0LlRZUEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ29iamVjdC5UWVBFX1BZT0JKRUNULCkpLAorICAgICAgICAgICdsb2ctZXJyb3InICAgICAgIDogIChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgICdsb2ctd2FybmluZycgICAgIDogIChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgICdkaXNrLWZ1bGwnICAgICAgIDogIChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkpLAorICAgICAgICAgICduby1wcm92aWRlcicgICAgIDogIChnb2JqZWN0LlNJR05BTF9SVU5fTEFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwpKSwKKyAgICAgICAgICAnbG9nJyAgICAgICAgICAgICA6ICAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvYmplY3QuVFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsKSksCisgICAgICAgICAgfQorICAgIHBpZHNfdG9fdGFzayA9IHt9CisgICAgdGFza3NfdG9faXRlciA9IHt9CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHNlcXVlbnRpYWw9RmFsc2UpOgorICAgICAgICBnb2JqZWN0LkdPYmplY3QuX19pbml0X18gKHNlbGYpCisgICAgICAgIHNlbGYubW9kZWwgPSBSdW5uaW5nQnVpbGRNb2RlbCgpCisgICAgICAgIHNlbGYuc2VxdWVudGlhbCA9IHNlcXVlbnRpYWwKKyAgICAgICAgc2VsZi5idWlsZGFib3J0ZWQgPSBGYWxzZQorCisgICAgZGVmIHJlc2V0IChzZWxmKToKKyAgICAgICAgc2VsZi5waWRzX3RvX3Rhc2suY2xlYXIoKQorICAgICAgICBzZWxmLnRhc2tzX3RvX2l0ZXIuY2xlYXIoKQorICAgICAgICBzZWxmLm1vZGVsLmNsZWFyKCkKKworICAgIGRlZiBoYW5kbGVfZXZlbnQgKHNlbGYsIGV2ZW50LCBwYmFyPU5vbmUpOgorICAgICAgICAjIEhhbmRsZSBhbiBldmVudCBmcm9tIHRoZSBldmVudCBxdWV1ZSwgdGhpcyBtYXkgcmVzdWx0IGluIHVwZGF0aW5nCisgICAgICAgICMgdGhlIG1vZGVsIGFuZCB0aHVzIHRoZSBVSS4gT3IgaXQgbWF5IGJlIHRvIHRlbGwgdXMgdGhhdCB0aGUgYnVpbGQKKyAgICAgICAgIyBoYXMgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IChvciBub3QsIGFzIHRoZSBjYXNlIG1heSBiZS4pCisKKyAgICAgICAgcGFyZW50ID0gTm9uZQorICAgICAgICBwaWQgPSAwCisgICAgICAgIHBhY2thZ2UgPSBOb25lCisgICAgICAgIHRhc2sgPSBOb25lCisKKyAgICAgICAgIyBJZiB3ZSBoYXZlIGEgcGlkIGF0dGFjaGVkIHRvIHRoaXMgbWVzc2FnZS9ldmVudCB0cnkgYW5kIGdldCB0aGUKKyAgICAgICAgIyAocGFja2FnZSwgdGFzaykgcGFpciBmb3IgaXQuIElmIHdlIGdldCB0aGF0IHRoZW4gZ2V0IHRoZSBwYXJlbnQgaXRlcgorICAgICAgICAjIGZvciB0aGUgbWVzc2FnZS4KKyAgICAgICAgaWYgaGFzYXR0cihldmVudCwgJ3BpZCcpOgorICAgICAgICAgICAgcGlkID0gZXZlbnQucGlkCisgICAgICAgIGlmIGhhc2F0dHIoZXZlbnQsICdwcm9jZXNzJyk6CisgICAgICAgICAgICBwaWQgPSBldmVudC5wcm9jZXNzCisKKyAgICAgICAgaWYgcGlkIGFuZCBwaWQgaW4gc2VsZi5waWRzX3RvX3Rhc2s6CisgICAgICAgICAgICAocGFja2FnZSwgdGFzaykgPSBzZWxmLnBpZHNfdG9fdGFza1twaWRdCisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIHRhc2spXQorCisgICAgICAgIGlmKGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKSk6CisgICAgICAgICAgICBpZiBldmVudC50YXNrcGlkID09IDAgb3IgZXZlbnQubGV2ZWxubyA+IGxvZ2dpbmcuSU5GTzoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJoYW5kbGUiLCBldmVudCkKKyAgICAgICAgICAgICMgRklYTUU6IHRoaXMgaXMgYSBoYWNrISBNb3JlIGluZm8gaW4gWW9jdG8gIzE0MzMKKyAgICAgICAgICAgICMgaHR0cDovL2J1Z3ppbGxhLnBva3lsaW51eC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzMsIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAjIG1hc2sgdGhlIGVycm9yIG1lc3NhZ2UgYXMgaXQncyBub3QgaW5mb3JtYXRpdmUgZm9yIHRoZSB1c2VyLgorICAgICAgICAgICAgaWYgZXZlbnQubXNnLnN0YXJ0c3dpdGgoIkV4ZWN1dGlvbiBvZiBldmVudCBoYW5kbGVyICdydW5fYnVpbGRzdGF0cycgZmFpbGVkIik6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIChldmVudC5sZXZlbG5vIDwgbG9nZ2luZy5JTkZPIG9yCisgICAgICAgICAgICAgICAgZXZlbnQubXNnLnN0YXJ0c3dpdGgoIlJ1bm5pbmcgdGFzayIpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIyBkb24ndCBhZGQgdGhlc2UgdG8gdGhlIGxpc3QKKworICAgICAgICAgICAgaWYgZXZlbnQubGV2ZWxubyA+PSBsb2dnaW5nLkVSUk9SOgorICAgICAgICAgICAgICAgIGljb24gPSAiZGlhbG9nLWVycm9yIgorICAgICAgICAgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLkVSUk9SCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ctZXJyb3IiKQorICAgICAgICAgICAgZWxpZiBldmVudC5sZXZlbG5vID49IGxvZ2dpbmcuV0FSTklORzoKKyAgICAgICAgICAgICAgICBpY29uID0gImRpYWxvZy13YXJuaW5nIgorICAgICAgICAgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLldBUk5JTkcKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImxvZy13YXJuaW5nIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWNvbiA9IE5vbmUKKyAgICAgICAgICAgICAgICBjb2xvciA9IEhvYkNvbG9ycy5PSworCisgICAgICAgICAgICAjIGlmIHdlIGtub3cgd2hpY2ggcGFja2FnZSB3ZSBiZWxvbmcgdG8sIHdlJ2xsIGFwcGVuZCBvbnRvIGl0cyBsaXN0LgorICAgICAgICAgICAgIyBvdGhlcndpc2UsIHdlJ2xsIGp1bXAgdG8gdGhlIHRvcCBvZiB0aGUgbWFzdGVyIGxpc3QKKyAgICAgICAgICAgIGlmIHNlbGYuc2VxdWVudGlhbCBvciBub3QgcGFyZW50OgorICAgICAgICAgICAgICAgIHRyZWVfYWRkID0gc2VsZi5tb2RlbC5hcHBlbmQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJlZV9hZGQgPSBzZWxmLm1vZGVsLnByZXBlbmQKKyAgICAgICAgICAgIHRyZWVfYWRkKHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgIChOb25lLAorICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAwKSkKKworICAgICAgICAgICAgIyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgd2hpbGUgcHJvY2Vzc2luZyBhIHBhY2thZ2UKKyAgICAgICAgICAgICMgIChwYXJlbnQpLCBtYXJrIHRoZSB0YXNrIHdpdGggd2FybmluZyBjb2xvcjsKKyAgICAgICAgICAgICMgaW4gY2FzZSB0aGVyZSBhcmUgZXJyb3JzLCB0aGUgdXBkYXRlcyB3aWxsIGJlCisgICAgICAgICAgICAjICBoYW5kbGVkIG9uIFRhc2tGYWlsZWQuCisgICAgICAgICAgICBpZiBjb2xvciA9PSBIb2JDb2xvcnMuV0FSTklORyBhbmQgcGFyZW50OgorICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfQ09MT1IsIGNvbG9yKQorICAgICAgICAgICAgICAgIGlmIHRhc2s6ICN0aGVuIHdlIGhhdmUgYSBwYXJlbnQgKHBhY2thZ2UpLCBhbmQgdXBkYXRlIGl0J3MgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQoc2VsZi50YXNrc190b19pdGVyWyhwYWNrYWdlLCBOb25lKV0sIHNlbGYubW9kZWwuQ09MX0NPTE9SLCBjb2xvcikKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tTdGFydGVkKToKKyAgICAgICAgICAgIChwYWNrYWdlLCB0YXNrKSA9IChldmVudC5fcGFja2FnZSwgZXZlbnQuX3Rhc2spCisKKyAgICAgICAgICAgICMgU2F2ZSBvdXQgdGhpcyBQSUQuCisgICAgICAgICAgICBzZWxmLnBpZHNfdG9fdGFza1twaWRdID0gKHBhY2thZ2UsIHRhc2spCisKKyAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgcGFja2FnZSBpbiBvdXIgbW9kZWwuIElmIHNvIHRoZW4KKyAgICAgICAgICAgICMgdGhhdCBjYW4gYmUgdGhlIHBhcmVudCBmb3IgdGhlIHRhc2suIE90aGVyd2lzZSB3ZSBjcmVhdGUgYSBuZXcKKyAgICAgICAgICAgICMgdG9wIGxldmVsIGZvciB0aGUgcGFja2FnZS4KKyAgICAgICAgICAgIGlmICgocGFja2FnZSwgTm9uZSkgaW4gc2VsZi50YXNrc190b19pdGVyKToKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIE5vbmUpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNlcXVlbnRpYWw6CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IHNlbGYubW9kZWwuYXBwZW5kCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYWRkID0gc2VsZi5tb2RlbC5wcmVwZW5kCisgICAgICAgICAgICAgICAgcGFyZW50ID0gYWRkKE5vbmUsIChOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFja2FnZTogJXMiICUgKHBhY2thZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvYkNvbG9ycy5PSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgICAgICAgICAgICAgIHNlbGYudGFza3NfdG9faXRlclsocGFja2FnZSwgTm9uZSldID0gcGFyZW50CisKKyAgICAgICAgICAgICMgQmVjYXVzZSB0aGlzIHBhcmVudCBwYWNrYWdlIG5vdyBoYXMgYW4gYWN0aXZlIGNoaWxkIG1hcmsgaXQgYXMKKyAgICAgICAgICAgICMgc3VjaC4KKyAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfSUNPTiwgImd0ay1leGVjdXRlIikKKyAgICAgICAgICAgIHBhcmVudF9jb2xvciA9IHNlbGYubW9kZWwuZ2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfQ09MT1IpWzBdCisgICAgICAgICAgICBpZiBwYXJlbnRfY29sb3IgIT0gSG9iQ29sb3JzLkVSUk9SIGFuZCBwYXJlbnRfY29sb3IgIT0gSG9iQ29sb3JzLldBUk5JTkc6CisgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9DT0xPUiwgSG9iQ29sb3JzLlJVTk5JTkcpCisKKyAgICAgICAgICAgICMgQWRkIGFuIGVudHJ5IGluIHRoZSBtb2RlbCBmb3IgdGhpcyB0YXNrCisgICAgICAgICAgICBpID0gc2VsZi5tb2RlbC5hcHBlbmQgKHBhcmVudCwgKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYXNrOiAlcyIgJSAodGFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndGstZXhlY3V0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvYkNvbG9ycy5SVU5OSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKworICAgICAgICAgICAgIyB1cGRhdGUgdGhlIHBhcmVudCdzIGFjdGl2ZSB0YXNrIGNvdW50CisgICAgICAgICAgICBudW1fYWN0aXZlID0gc2VsZi5tb2RlbC5nZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9OVU1fQUNUSVZFKVswXSArIDEKKyAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfTlVNX0FDVElWRSwgbnVtX2FjdGl2ZSkKKworICAgICAgICAgICAgIyBTYXZlIG91dCB0aGUgaXRlciBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0IHdoZW4gd2UgaGF2ZSBhIG1lc3NhZ2UKKyAgICAgICAgICAgICMgdGhhdCB3ZSBuZWVkIHRvIGF0dGFjaCB0byBhIHRhc2suCisgICAgICAgICAgICBzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIHRhc2spXSA9IGkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tCYXNlKToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgImluZm8iLCBldmVudC5fbWVzc2FnZSkKKyAgICAgICAgICAgIGN1cnJlbnQgPSBzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIHRhc2spXQorICAgICAgICAgICAgcGFyZW50ID0gc2VsZi50YXNrc190b19pdGVyWyhwYWNrYWdlLCBOb25lKV0KKworICAgICAgICAgICAgIyByZW1vdmUgdGhpcyB0YXNrIGZyb20gdGhlIHBhcmVudCdzIGFjdGl2ZSBjb3VudAorICAgICAgICAgICAgbnVtX2FjdGl2ZSA9IHNlbGYubW9kZWwuZ2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfTlVNX0FDVElWRSlbMF0gLSAxCisgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChwYXJlbnQsIHNlbGYubW9kZWwuQ09MX05VTV9BQ1RJVkUsIG51bV9hY3RpdmUpCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tGYWlsZWQpOgorICAgICAgICAgICAgICAgICMgTWFyayB0aGUgdGFzayBhbmQgcGFyZW50IGFzIGZhaWxlZAorICAgICAgICAgICAgICAgIGljb24gPSAiZGlhbG9nLWVycm9yIgorICAgICAgICAgICAgICAgIGNvbG9yID0gSG9iQ29sb3JzLkVSUk9SCisKKyAgICAgICAgICAgICAgICBsb2dmaWxlID0gZXZlbnQubG9nZmlsZQorICAgICAgICAgICAgICAgIGlmIGxvZ2ZpbGUgYW5kIG9zLnBhdGguZXhpc3RzKGxvZ2ZpbGUpOgorICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4obG9nZmlsZSkgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2RhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5hcHBlbmQoY3VycmVudCwgKCdwYXN0ZWJpbicsIE5vbmUsIE5vbmUsIGxvZ2RhdGEsICdndGstZXJyb3InLCBIb2JDb2xvcnMuT0ssIDApKQorCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gKGN1cnJlbnQsIHBhcmVudCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KGksIHNlbGYubW9kZWwuQ09MX0lDT04sIGljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuQ09MX0NPTE9SLCBjb2xvcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBNYXJrIHRoZSBwYXJlbnQgcGFja2FnZSBhbmQgdGhlIHRhc2sgYXMgaW5hY3RpdmUsCisgICAgICAgICAgICAgICAgIyBidXQgbWFrZSBzdXJlIHRvIHByZXNlcnZlIGVycm9yLCB3YXJuaW5ncyBhbmQgYWN0aXZlCisgICAgICAgICAgICAgICAgIyBzdGF0ZXMKKyAgICAgICAgICAgICAgICBwYXJlbnRfY29sb3IgPSBzZWxmLm1vZGVsLmdldChwYXJlbnQsIHNlbGYubW9kZWwuQ09MX0NPTE9SKVswXQorICAgICAgICAgICAgICAgIHRhc2tfY29sb3IgPSBzZWxmLm1vZGVsLmdldChjdXJyZW50LCBzZWxmLm1vZGVsLkNPTF9DT0xPUilbMF0KKworICAgICAgICAgICAgICAgICMgTWFyayB0aGUgdGFzayBhcyBpbmFjdGl2ZQorICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KGN1cnJlbnQsIHNlbGYubW9kZWwuQ09MX0lDT04sIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgdGFza19jb2xvciAhPSBIb2JDb2xvcnMuRVJST1I6CisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2tfY29sb3IgPT0gSG9iQ29sb3JzLldBUk5JTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLnNldChjdXJyZW50LCBzZWxmLm1vZGVsLkNPTF9JQ09OLCAnZGlhbG9nLXdhcm5pbmcnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQoY3VycmVudCwgc2VsZi5tb2RlbC5DT0xfQ09MT1IsIEhvYkNvbG9ycy5PSykKKworICAgICAgICAgICAgICAgICMgTWFyayB0aGUgcGFyZW50IGFzIGluYWN0aXZlCisgICAgICAgICAgICAgICAgaWYgcGFyZW50X2NvbG9yICE9IEhvYkNvbG9ycy5FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50X2NvbG9yID09IEhvYkNvbG9ycy5XQVJOSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9JQ09OLCAiZGlhbG9nLXdhcm5pbmciKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5zZXQocGFyZW50LCBzZWxmLm1vZGVsLkNPTF9JQ09OLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVtX2FjdGl2ZSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kZWwuc2V0KHBhcmVudCwgc2VsZi5tb2RlbC5DT0xfQ09MT1IsIEhvYkNvbG9ycy5PSykKKworICAgICAgICAgICAgIyBDbGVhciB0aGUgaXRlcnMgYW5kIHRoZSBwaWRzIHNpbmNlIHdoZW4gdGhlIHRhc2sgZ29lcyBhd2F5IHRoZQorICAgICAgICAgICAgIyBwaWQgd2lsbCBubyBsb25nZXIgYmUgdXNlZCBmb3IgbWVzc2FnZXMKKyAgICAgICAgICAgIGRlbCBzZWxmLnRhc2tzX3RvX2l0ZXJbKHBhY2thZ2UsIHRhc2spXQorICAgICAgICAgICAgZGVsIHNlbGYucGlkc190b190YXNrW3BpZF0KKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkJ1aWxkU3RhcnRlZCk6CisKKyAgICAgICAgICAgIHNlbGYuZW1pdCgiYnVpbGQtc3RhcnRlZCIpCisgICAgICAgICAgICBzZWxmLm1vZGVsLnByZXBlbmQoTm9uZSwgKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWlsZCBTdGFydGVkICglcykiICUgdGltZS5zdHJmdGltZSgnJW0vJWQvJVkgJUg6JU06JVMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9iQ29sb3JzLk9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgICAgIGlmIHBiYXI6CisgICAgICAgICAgICAgICAgcGJhci51cGRhdGUoMCwgc2VsZi5wcm9ncmVzc190b3RhbCkKKyAgICAgICAgICAgICAgICBwYmFyLnNldF90aXRsZShiYi5ldmVudC5nZXROYW1lKGV2ZW50KSkKKworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkJ1aWxkQ29tcGxldGVkKToKKyAgICAgICAgICAgIGZhaWx1cmVzID0gaW50IChldmVudC5fZmFpbHVyZXMpCisgICAgICAgICAgICBzZWxmLm1vZGVsLnByZXBlbmQoTm9uZSwgKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWlsZCBDb21wbGV0ZWQgKCVzKSIgJSB0aW1lLnN0cmZ0aW1lKCclbS8lZC8lWSAlSDolTTolUycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2JDb2xvcnMuT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorCisgICAgICAgICAgICAjIEVtaXQgdGhlIGFwcHJvcHJpYXRlIHNpZ25hbCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBmYWlsdXJlcworICAgICAgICAgICAgaWYgc2VsZi5idWlsZGFib3J0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0ICgiYnVpbGQtYWJvcnRlZCIpCisgICAgICAgICAgICAgICAgc2VsZi5idWlsZGFib3J0ZWQgPSBGYWxzZQorICAgICAgICAgICAgZWxpZiAoZmFpbHVyZXMgPj0gMSk6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0ICgiYnVpbGQtZmFpbGVkIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0ICgiYnVpbGQtc3VjY2VlZGVkIikKKyAgICAgICAgICAgICMgRW1pdCBhIGdlbmVyaWMgImJ1aWxkLWNvbXBsZXRlIiBzaWduYWwgZm9yIHRoaW5ncyB3aXNoaW5nIHRvCisgICAgICAgICAgICAjIGhhbmRsZSB3aGVuIHRoZSBidWlsZCBpcyBmaW5pc2hlZAorICAgICAgICAgICAgc2VsZi5lbWl0KCJidWlsZC1jb21wbGV0ZSIpCisgICAgICAgICAgICAjIHJlc2V0IHRoZSBhbGwgY2VsbCdzIGljb24gaW5kaWNhdG9yCisgICAgICAgICAgICBzZWxmLm1vZGVsLmNsb3NlX3Rhc2tfcmVmcmVzaCgpCisgICAgICAgICAgICBpZiBwYmFyOgorICAgICAgICAgICAgICAgIHBiYXIuc2V0X3RleHQoZXZlbnQubXNnKQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuRGlza0Z1bGwpOgorICAgICAgICAgICAgc2VsZi5idWlsZGFib3J0ZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmVtaXQoImRpc2stZnVsbCIpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb21tYW5kLkNvbW1hbmRGYWlsZWQpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ciLCAiZXJyb3IiLCAiQ29tbWFuZCBleGVjdXRpb24gZmFpbGVkOiAlcyIgJSAoZXZlbnQuZXJyb3IpKQorICAgICAgICAgICAgaWYgZXZlbnQuZXJyb3Iuc3RhcnRzd2l0aCgiRXhpdGVkIHdpdGgiKToKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYW4gZXhpdCBjb2RlIHdlJ3JlIGRvbmUsIGVtaXQgdGhlCisgICAgICAgICAgICAgICAgIyBnZW5lcmljIHNpZ25hbCBmb3IgdGhlIFVJIHRvIG5vdGlmeSB0aGUgdXNlcgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgiYnVpbGQtY29tcGxldGUiKQorICAgICAgICAgICAgICAgICMgcmVzZXQgdGhlIGFsbCBjZWxsJ3MgaWNvbiBpbmRpY2F0b3IKKyAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLmNsb3NlX3Rhc2tfcmVmcmVzaCgpCisKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkKSBhbmQgcGJhcjoKKyAgICAgICAgICAgIHBiYXIuc2V0X3RpdGxlKCJMb2FkaW5nIGNhY2hlIikKKyAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfdG90YWwgPSBldmVudC50b3RhbAorICAgICAgICAgICAgcGJhci51cGRhdGUoMCwgc2VsZi5wcm9ncmVzc190b3RhbCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcykgYW5kIHBiYXI6CisgICAgICAgICAgICBwYmFyLnVwZGF0ZShldmVudC5jdXJyZW50LCBzZWxmLnByb2dyZXNzX3RvdGFsKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCkgYW5kIHBiYXI6CisgICAgICAgICAgICBwYmFyLnVwZGF0ZShzZWxmLnByb2dyZXNzX3RvdGFsLCBzZWxmLnByb2dyZXNzX3RvdGFsKQorICAgICAgICAgICAgcGJhci5oaWRlKCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVN0YXJ0ZWQpIGFuZCBwYmFyOgorICAgICAgICAgICAgaWYgZXZlbnQudG90YWwgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHBiYXIuc2V0X3RpdGxlKCJQcm9jZXNzaW5nIHJlY2lwZXMiKQorICAgICAgICAgICAgc2VsZi5wcm9ncmVzc190b3RhbCA9IGV2ZW50LnRvdGFsCisgICAgICAgICAgICBwYmFyLnVwZGF0ZSgwLCBzZWxmLnByb2dyZXNzX3RvdGFsKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlUHJvZ3Jlc3MpIGFuZCBwYmFyOgorICAgICAgICAgICAgcGJhci51cGRhdGUoZXZlbnQuY3VycmVudCwgc2VsZi5wcm9ncmVzc190b3RhbCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZUNvbXBsZXRlZCkgYW5kIHBiYXI6CisgICAgICAgICAgICBwYmFyLmhpZGUoKQorICAgICAgICAjdXNpbmcgcnVucXVldWUgZXZlbnRzIGFzIG1hbnkgYXMgcG9zc2libGUgdG8gdXBkYXRlIHRoZSBwcm9ncmVzcyBiYXIKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tGYWlsZWQpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ciLCAiZXJyb3IiLCAiVGFzayAlcyAoJXMpIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAnJXMnIiAlIChldmVudC50YXNraWQsIGV2ZW50LnRhc2tzdHJpbmcsIGV2ZW50LmV4aXRjb2RlKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza0ZhaWxlZCk6CisgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJ3YXJuIiwgIlNldHNjZW5lIHRhc2sgJXMgKCVzKSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJyVzJyAtIHJlYWwgdGFzayB3aWxsIGJlIHJ1biBpbnN0ZWFkIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXZlbnQudGFza2lkLCBldmVudC50YXNrc3RyaW5nLCBldmVudC5leGl0Y29kZSkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1N0YXJ0ZWQsIGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrU3RhcnRlZCkpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJpbmZvIiwgIlJ1bm5pbmcgc2V0c2NlbmUgdGFzayAlZCBvZiAlZCAoJXMpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50LnN0YXRzLmNvbXBsZXRlZCArIGV2ZW50LnN0YXRzLmFjdGl2ZSArIGV2ZW50LnN0YXRzLmZhaWxlZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdGF0cy50b3RhbCwgZXZlbnQudGFza3N0cmluZykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGV2ZW50Lm5vZXhlYzoKKyAgICAgICAgICAgICAgICAgICAgdGFza3R5cGUgPSAnbm9leGVjIHRhc2snCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFza3R5cGUgPSAndGFzaycKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJpbmZvIiwgIlJ1bm5pbmcgJXMgJXMgb2YgJXMgKElEOiAlcywgJXMpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2t0eXBlLCBldmVudC5zdGF0cy5jb21wbGV0ZWQgKyBldmVudC5zdGF0cy5hY3RpdmUgKyBldmVudC5zdGF0cy5mYWlsZWQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhdHMudG90YWwsIGV2ZW50LnRhc2tpZCwgZXZlbnQudGFza3N0cmluZykpCisgICAgICAgICAgICBtZXNzYWdlID0ge30KKyAgICAgICAgICAgIG1lc3NhZ2VbImV2ZW50bmFtZSJdID0gYmIuZXZlbnQuZ2V0TmFtZShldmVudCkKKyAgICAgICAgICAgIG51bV9vZl9jb21wbGV0ZWQgPSBldmVudC5zdGF0cy5jb21wbGV0ZWQgKyBldmVudC5zdGF0cy5mYWlsZWQKKyAgICAgICAgICAgIG1lc3NhZ2VbImN1cnJlbnQiXSA9IG51bV9vZl9jb21wbGV0ZWQKKyAgICAgICAgICAgIG1lc3NhZ2VbInRvdGFsIl0gPSBldmVudC5zdGF0cy50b3RhbAorICAgICAgICAgICAgbWVzc2FnZVsidGl0bGUiXSA9ICIiCisgICAgICAgICAgICBtZXNzYWdlWyJ0YXNrIl0gPSBldmVudC50YXNrc3RyaW5nCisgICAgICAgICAgICBzZWxmLmVtaXQoInRhc2stc3RhcnRlZCIsIG1lc3NhZ2UpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTXVsdGlwbGVQcm92aWRlcnMpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ciLCAiaW5mbyIsICJtdWx0aXBsZSBwcm92aWRlcnMgYXJlIGF2YWlsYWJsZSBmb3IgJXMlcyAoJXMpIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXZlbnQuX2lzX3J1bnRpbWUgYW5kICJydW50aW1lICIgb3IgIiIsIGV2ZW50Ll9pdGVtLCAiLCAiLmpvaW4oZXZlbnQuX2NhbmRpZGF0ZXMpKSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgibG9nIiwgImluZm8iLCAiY29uc2lkZXIgZGVmaW5pbmcgYSBQUkVGRVJSRURfUFJPVklERVIgZW50cnkgdG8gbWF0Y2ggJXMiICUgKGV2ZW50Ll9pdGVtKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Ob1Byb3ZpZGVyKToKKyAgICAgICAgICAgIG1zZyA9ICIiCisgICAgICAgICAgICBpZiBldmVudC5fcnVudGltZToKKyAgICAgICAgICAgICAgICByID0gIlIiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHIgPSAiIgorCisgICAgICAgICAgICBleHRyYSA9ICcnCisgICAgICAgICAgICBpZiBub3QgZXZlbnQuX3JlYXNvbnM6CisgICAgICAgICAgICAgICAgaWYgZXZlbnQuX2Nsb3NlX21hdGNoZXM6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gIi4gQ2xvc2UgbWF0Y2hlczpcbiAgJXMiICUgJ1xuICAnLmpvaW4oZXZlbnQuX2Nsb3NlX21hdGNoZXMpCisKKyAgICAgICAgICAgIGlmIGV2ZW50Ll9kZXBlbmRlZXM6CisgICAgICAgICAgICAgICAgbXNnID0gIk5vdGhpbmcgJXNQUk9WSURFUyAnJXMnIChidXQgJXMgJXNERVBFTkRTIG9uIG9yIG90aGVyd2lzZSByZXF1aXJlcyBpdCklc1xuIiAlIChyLCBldmVudC5faXRlbSwgIiwgIi5qb2luKGV2ZW50Ll9kZXBlbmRlZXMpLCByLCBleHRyYSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbXNnID0gIk5vdGhpbmcgJXNQUk9WSURFUyAnJXMnJXNcbiIgJSAociwgZXZlbnQuX2l0ZW0sIGV4dHJhKQorICAgICAgICAgICAgaWYgZXZlbnQuX3JlYXNvbnM6CisgICAgICAgICAgICAgICAgZm9yIHJlYXNvbiBpbiBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICAgbXNnICs9ICgiJXNcbiIgJSByZWFzb24pCisgICAgICAgICAgICBzZWxmLmVtaXQoIm5vLXByb3ZpZGVyIiwgbXNnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCJsb2ciLCAiZXJyb3IiLCBtc2cpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTG9nRXhlY1RUWSk6CisgICAgICAgICAgICBpY29uID0gImRpYWxvZy13YXJuaW5nIgorICAgICAgICAgICAgY29sb3IgPSBIb2JDb2xvcnMuV0FSTklORworICAgICAgICAgICAgaWYgc2VsZi5zZXF1ZW50aWFsIG9yIG5vdCBwYXJlbnQ6CisgICAgICAgICAgICAgICAgdHJlZV9hZGQgPSBzZWxmLm1vZGVsLmFwcGVuZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cmVlX2FkZCA9IHNlbGYubW9kZWwucHJlcGVuZAorICAgICAgICAgICAgdHJlZV9hZGQocGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgKE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1zZywKKyAgICAgICAgICAgICAgICAgICAgICBpY29uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXZlbnQsIChiYi5ldmVudC5CdWlsZEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LlN0YW1wVXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5Db25maWdQYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LlJlY2lwZVBhcnNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuUmVjaXBlUHJlRmluYWxpc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhpdFdhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJhdGlvblN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJhdGlvbkNvbXBsZXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uUHJvZ3Jlc3MpKToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoImxvZyIsICJlcnJvciIsICJVbmtub3duIGV2ZW50OiAlcyIgJSAoZXZlbnQuZXJyb3IgaWYgaGFzYXR0cihldmVudCwgJ2Vycm9yJykgZWxzZSAnZXJyb3InKSkKKworICAgICAgICByZXR1cm4KKworCitkZWYgZG9fcGFzdGViaW4odGV4dCk6CisgICAgdXJsID0gJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vYXBpX3B1YmxpYy5waHAnCisgICAgcGFyYW1zID0geydwYXN0ZV9jb2RlJzogdGV4dCwgJ3Bhc3RlX2Zvcm1hdCc6ICd0ZXh0J30KKworICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmwsIHVybGxpYi51cmxlbmNvZGUocGFyYW1zKSkKKyAgICByZXNwb25zZSA9IHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgcGFzdGVfdXJsID0gcmVzcG9uc2UucmVhZCgpCisKKyAgICByZXR1cm4gcGFzdGVfdXJsCisKKworY2xhc3MgUnVubmluZ0J1aWxkVHJlZVZpZXcgKGd0ay5UcmVlVmlldyk6CisgICAgX19nc2lnbmFsc19fID0geworICAgICAgICAiYnV0dG9uX3ByZXNzX2V2ZW50IiA6ICJvdmVycmlkZSIKKyAgICAgICAgfQorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgcmVhZG9ubHk9RmFsc2UsIGhvYj1GYWxzZSk6CisgICAgICAgIGd0ay5UcmVlVmlldy5fX2luaXRfXyAoc2VsZikKKyAgICAgICAgc2VsZi5yZWFkb25seSA9IHJlYWRvbmx5CisKKyAgICAgICAgIyBUaGUgaWNvbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlJ3JlIGJ1aWxkaW5nIG9yIGZhaWxlZC4KKyAgICAgICAgIyBhZGQgJ2hvYicgZmxhZyBiZWNhdXNlIHRoZXJlIGhhcyBub3Qgb25seSBob2IgdG8gc2hhcmUgdGhpcyBjb2RlCisgICAgICAgIGlmIGhvYjoKKyAgICAgICAgICAgIHJlbmRlcmVyID0gSG9iQ2VsbFJlbmRlcmVyUGl4YnVmICgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZW5kZXJlciA9IGd0ay5DZWxsUmVuZGVyZXJQaXhidWYoKQorICAgICAgICBjb2wgPSBndGsuVHJlZVZpZXdDb2x1bW4gKCJTdGF0dXMiLCByZW5kZXJlcikKKyAgICAgICAgY29sLmFkZF9hdHRyaWJ1dGUgKHJlbmRlcmVyLCAiaWNvbi1uYW1lIiwgNCkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisKKyAgICAgICAgIyBUaGUgbWVzc2FnZSBvZiB0aGUgYnVpbGQuCisgICAgICAgICMgYWRkICdob2InIGZsYWcgYmVjYXVzZSB0aGVyZSBoYXMgbm90IG9ubHkgaG9iIHRvIHNoYXJlIHRoaXMgY29kZQorICAgICAgICBpZiBob2I6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2VfcmVuZGVyZXIgPSBIb2JXYXJwQ2VsbFJlbmRlcmVyVGV4dCAoY29sX251bWJlcj0xKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tZXNzYWdlX3JlbmRlcmVyID0gZ3RrLkNlbGxSZW5kZXJlclRleHQgKCkKKyAgICAgICAgc2VsZi5tZXNzYWdlX2NvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIk1lc3NhZ2UiLCBzZWxmLm1lc3NhZ2VfcmVuZGVyZXIsIHRleHQ9MykKKyAgICAgICAgc2VsZi5tZXNzYWdlX2NvbHVtbi5hZGRfYXR0cmlidXRlKHNlbGYubWVzc2FnZV9yZW5kZXJlciwgJ2JhY2tncm91bmQnLCA1KQorICAgICAgICBzZWxmLm1lc3NhZ2VfcmVuZGVyZXIuc2V0X3Byb3BlcnR5KCdlZGl0YWJsZScsIChub3Qgc2VsZi5yZWFkb25seSkpCisgICAgICAgIHNlbGYuYXBwZW5kX2NvbHVtbiAoc2VsZi5tZXNzYWdlX2NvbHVtbikKKworICAgIGRlZiBkb19idXR0b25fcHJlc3NfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBndGsuVHJlZVZpZXcuZG9fYnV0dG9uX3ByZXNzX2V2ZW50KHNlbGYsIGV2ZW50KQorCisgICAgICAgIGlmIGV2ZW50LmJ1dHRvbiA9PSAzOgorICAgICAgICAgICAgc2VsZWN0aW9uID0gc3VwZXIoUnVubmluZ0J1aWxkVHJlZVZpZXcsIHNlbGYpLmdldF9zZWxlY3Rpb24oKQorICAgICAgICAgICAgKG1vZGVsLCBpdCkgPSBzZWxlY3Rpb24uZ2V0X3NlbGVjdGVkKCkKKyAgICAgICAgICAgIGlmIGl0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNhbl9wYXN0ZSA9IG1vZGVsLmdldChpdCwgbW9kZWwuQ09MX0xPRylbMF0KKyAgICAgICAgICAgICAgICBpZiBjYW5fcGFzdGUgPT0gJ3Bhc3RlYmluJzoKKyAgICAgICAgICAgICAgICAgICAgIyBidWlsZCBhIHNpbXBsZSBtZW51IHdpdGggYSBwYXN0ZWJpbiBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgbWVudSA9IGd0ay5NZW51KCkKKyAgICAgICAgICAgICAgICAgICAgbWVudWl0ZW0gPSBndGsuTWVudUl0ZW0oIkNvcHkiKQorICAgICAgICAgICAgICAgICAgICBtZW51LmFwcGVuZChtZW51aXRlbSkKKyAgICAgICAgICAgICAgICAgICAgbWVudWl0ZW0uY29ubmVjdCgiYWN0aXZhdGUiLCBzZWxmLmNsaXBib2FyZF9oYW5kbGVyLCAobW9kZWwsIGl0KSkKKyAgICAgICAgICAgICAgICAgICAgbWVudWl0ZW0uc2hvdygpCisgICAgICAgICAgICAgICAgICAgIG1lbnVpdGVtID0gZ3RrLk1lbnVJdGVtKCJTZW5kIGxvZyB0byBwYXN0ZWJpbiIpCisgICAgICAgICAgICAgICAgICAgIG1lbnUuYXBwZW5kKG1lbnVpdGVtKQorICAgICAgICAgICAgICAgICAgICBtZW51aXRlbS5jb25uZWN0KCJhY3RpdmF0ZSIsIHNlbGYucGFzdGViaW5faGFuZGxlciwgKG1vZGVsLCBpdCkpCisgICAgICAgICAgICAgICAgICAgIG1lbnVpdGVtLnNob3coKQorICAgICAgICAgICAgICAgICAgICBtZW51LnNob3coKQorICAgICAgICAgICAgICAgICAgICBtZW51LnBvcHVwKE5vbmUsIE5vbmUsIE5vbmUsIGV2ZW50LmJ1dHRvbiwgZXZlbnQudGltZSkKKworICAgIGRlZiBfYWRkX3RvX2NsaXBib2FyZChzZWxmLCBjbGlwcGluZyk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgdGhlIGNvbnRlbnRzIG9mIGNsaXBwaW5nIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLgorICAgICAgICAiIiIKKyAgICAgICAgY2xpcGJvYXJkID0gZ3RrLmNsaXBib2FyZF9nZXQoKQorICAgICAgICBjbGlwYm9hcmQuc2V0X3RleHQoY2xpcHBpbmcpCisgICAgICAgIGNsaXBib2FyZC5zdG9yZSgpCisKKyAgICBkZWYgcGFzdGViaW5faGFuZGxlcihzZWxmLCB3aWRnZXQsIGRhdGEpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VuZCB0aGUgbG9nIGRhdGEgdG8gcGFzdGViaW4sIHRoZW4gYWRkIHRoZSBuZXcgcGFzdGUgdXJsIHRvIHRoZQorICAgICAgICBjbGlwYm9hcmQuCisgICAgICAgICIiIgorICAgICAgICAobW9kZWwsIGl0KSA9IGRhdGEKKyAgICAgICAgcGFzdGVfdXJsID0gZG9fcGFzdGViaW4obW9kZWwuZ2V0KGl0LCBtb2RlbC5DT0xfTUVTU0FHRSlbMF0pCisKKyAgICAgICAgIyBAdG9kbyBQcm92aWRlIHZpc3VhbCBmZWVkYmFjayB0byB0aGUgdXNlciB0aGF0IGl0IGlzIGRvbmUgYW5kIHRoYXQKKyAgICAgICAgIyBpdCB3b3JrZWQuCisgICAgICAgIHByaW50IHBhc3RlX3VybAorCisgICAgICAgIHNlbGYuX2FkZF90b19jbGlwYm9hcmQocGFzdGVfdXJsKQorCisgICAgZGVmIGNsaXBib2FyZF9oYW5kbGVyKHNlbGYsIHdpZGdldCwgZGF0YSk6CisgICAgICAgICIiIgorICAgICAgICAiIiIKKyAgICAgICAgKG1vZGVsLCBpdCkgPSBkYXRhCisgICAgICAgIG1lc3NhZ2UgPSBtb2RlbC5nZXQoaXQsIG1vZGVsLkNPTF9NRVNTQUdFKVswXQorCisgICAgICAgIHNlbGYuX2FkZF90b19jbGlwYm9hcmQobWVzc2FnZSkKKworY2xhc3MgQnVpbGRGYWlsdXJlVHJlZVZpZXcoZ3RrLlRyZWVWaWV3KToKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGd0ay5UcmVlVmlldy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldF9ydWxlc19oaW50KEZhbHNlKQorICAgICAgICBzZWxmLnNldF9oZWFkZXJzX3Zpc2libGUoRmFsc2UpCisgICAgICAgIHNlbGYuZ2V0X3NlbGVjdGlvbigpLnNldF9tb2RlKGd0ay5TRUxFQ1RJT05fU0lOR0xFKQorCisgICAgICAgICMgVGhlIGljb24gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB3ZSdyZSBidWlsZGluZyBvciBmYWlsZWQuCisgICAgICAgIHJlbmRlcmVyID0gSG9iQ2VsbFJlbmRlcmVyUGl4YnVmICgpCisgICAgICAgIGNvbCA9IGd0ay5UcmVlVmlld0NvbHVtbiAoIlN0YXR1cyIsIHJlbmRlcmVyKQorICAgICAgICBjb2wuYWRkX2F0dHJpYnV0ZSAocmVuZGVyZXIsICJpY29uLW5hbWUiLCBSdW5uaW5nQnVpbGRNb2RlbC5DT0xfSUNPTikKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChjb2wpCisKKyAgICAgICAgIyBUaGUgbWVzc2FnZSBvZiB0aGUgYnVpbGQuCisgICAgICAgIHNlbGYubWVzc2FnZV9yZW5kZXJlciA9IEhvYldhcnBDZWxsUmVuZGVyZXJUZXh0IChjb2xfbnVtYmVyPTEpCisgICAgICAgIHNlbGYubWVzc2FnZV9jb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4gKCJNZXNzYWdlIiwgc2VsZi5tZXNzYWdlX3JlbmRlcmVyLCB0ZXh0PVJ1bm5pbmdCdWlsZE1vZGVsLkNPTF9NRVNTQUdFLCBiYWNrZ3JvdW5kPVJ1bm5pbmdCdWlsZE1vZGVsLkNPTF9DT0xPUikKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uIChzZWxmLm1lc3NhZ2VfY29sdW1uKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3Nhbml0eWNoZWNrcGFnZS5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9zYW5pdHljaGVja3BhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjZTJlYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy9zYW5pdHljaGVja3BhZ2UucHkKQEAgLTAsMCArMSw4NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEJvZ2RhbiBNYXJpbmVzY3UgPGJvZ2Rhbi5hLm1hcmluZXNjdUBpbnRlbC5jb20+CisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgZ3RrLCBnb2JqZWN0Citmcm9tIGJiLnVpLmNydW1icy5wcm9ncmVzc2JhciBpbXBvcnQgSG9iUHJvZ3Jlc3NCYXIKK2Zyb20gYmIudWkuY3J1bWJzLmhvYndpZGdldCBpbXBvcnQgaGljCitmcm9tIGJiLnVpLmNydW1icy5ob2JwYWdlcyBpbXBvcnQgSG9iUGFnZQorCisjCisjIFNhbml0eUNoZWNrUGFnZQorIworY2xhc3MgU2FuaXR5Q2hlY2tQYWdlIChIb2JQYWdlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgc3VwZXIoU2FuaXR5Q2hlY2tQYWdlLCBzZWxmKS5fX2luaXRfXyhidWlsZGVyKQorICAgICAgICBzZWxmLnJ1bm5pbmcgPSBGYWxzZQorICAgICAgICBzZWxmLmNyZWF0ZV92aXN1YWxfZWxlbWVudHMoKQorICAgICAgICBzZWxmLnNob3dfYWxsKCkKKworICAgIGRlZiBtYWtlX2xhYmVsKHNlbGYsIHRleHQsIGJvbGQ9VHJ1ZSk6CisgICAgICAgIGxhYmVsID0gZ3RrLkxhYmVsKCkKKyAgICAgICAgbGFiZWwuc2V0X2FsaWdubWVudCgwLjAsIDAuNSkKKyAgICAgICAgbWFyayA9ICI8c3BhbiAlcz4lczwvc3Bhbj4iICUgKHNlbGYuc3Bhbl90YWcoJ3gtbGFyZ2UnLCAnYm9sZCcpIGlmIGJvbGQgZWxzZSBzZWxmLnNwYW5fdGFnKCdtZWRpdW0nKSwgdGV4dCkKKyAgICAgICAgbGFiZWwuc2V0X21hcmt1cChtYXJrKQorICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucnVubmluZzoKKyAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSBUcnVlCisgICAgICAgICAgZ29iamVjdC50aW1lb3V0X2FkZCgxMDAsIHNlbGYudGltZXJfZnVuYykKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bm5pbmcgPSBGYWxzZQorCisgICAgZGVmIGlzX3J1bm5pbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bm5pbmcKKworICAgIGRlZiB0aW1lcl9mdW5jKHNlbGYpOgorICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5wdWxzZSgpCisgICAgICAgIHJldHVybiBzZWxmLnJ1bm5pbmcKKworICAgIGRlZiBjcmVhdGVfdmlzdWFsX2VsZW1lbnRzKHNlbGYpOgorICAgICAgICAjIFRhYmxlJ2QgbGF5b3V0LiAncm93cycgYW5kICdjb2xzJyBnaXZlIHRoZSB0YWJsZSBzaXplCisgICAgICAgIHJvd3MsIGNvbHMgPSAzMCwgNTAKKyAgICAgICAgc2VsZi50YWJsZSA9IGd0ay5UYWJsZShyb3dzLCBjb2xzLCBUcnVlKQorICAgICAgICBzZWxmLnBhY2tfc3RhcnQoc2VsZi50YWJsZSwgZXhwYW5kPUZhbHNlLCBmaWxsPUZhbHNlKQorICAgICAgICBzeCwgc3kgPSAyLCAyCisgICAgICAgICMgJ2luZm8nIGljb24KKyAgICAgICAgaW1hZ2UgPSBndGsuSW1hZ2UoKQorICAgICAgICBpbWFnZS5zZXRfZnJvbV9maWxlKGhpYy5JQ09OX0lORk9fRElTUExBWV9GSUxFKQorICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChpbWFnZSwgc3gsIHN4ICsgMiwgc3ksIHN5ICsgMyApCisgICAgICAgIGltYWdlLnNob3coKQorICAgICAgICAjICdDaGVja2luZycgbWVzc2FnZQorICAgICAgICBsYWJlbCA9IHNlbGYubWFrZV9sYWJlbCgnSG9iIGlzIGNoZWNraW5nIGZvciBjb3JyZWN0IGJ1aWxkIHN5c3RlbSBzZXR1cCcpCisgICAgICAgIHNlbGYudGFibGUuYXR0YWNoKGxhYmVsLCBzeCArIDIsIGNvbHMsIHN5LCBzeSArIDMsIHhwYWRkaW5nPTUgKQorICAgICAgICBsYWJlbC5zaG93KCkKKyAgICAgICAgIyAnU2hvdWxkbid0IHRha2UgbG9uZycgbWVzc2FnZS4KKyAgICAgICAgbGFiZWwgPSBzZWxmLm1ha2VfbGFiZWwoIlRoZSBjaGVjayBzaG91bGRuJ3QgdGFrZSBsb25nLiIsIEZhbHNlKQorICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChsYWJlbCwgc3ggKyAyLCBjb2xzLCBzeSArIDMsIHN5ICsgNCwgeHBhZGRpbmc9NSkKKyAgICAgICAgbGFiZWwuc2hvdygpCisgICAgICAgICMgUHJvZ3Jlc3MgYmFyCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyID0gSG9iUHJvZ3Jlc3NCYXIoKQorICAgICAgICBzZWxmLnRhYmxlLmF0dGFjaChzZWxmLnByb2dyZXNzX2Jhciwgc3ggKyAyLCBjb2xzIC0gMywgc3kgKyA1LCBzeSArIDcsIHhwYWRkaW5nPTUpCisgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNob3coKQorICAgICAgICAjIEFsbCBkb25lCisgICAgICAgIHNlbGYudGFibGUuc2hvdygpCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy91dGlscy5weSBiL2JpdGJha2UvbGliL2JiL3VpL2NydW1icy91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk4NjRmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvY3J1bWJzL3V0aWxzLnB5CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgQml0QmFrZSBVSSBVdGlscyAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisjIFRoaXMgdXRpbGl0eSBtZXRob2QgbG9va3MgZm9yIHh0ZXJtIG9yIHZ0ZSBhbmQgcmV0dXJuIHRoZSAKKyMgZnJpc3QgdG8gZXhpc3QsIGN1cnJlbnRseSB3ZSBhcmUga2VlcGluZyB0aGlzIHNpbXBsZSwgYnV0IAorIyB3ZSB3aWxsIGxpa2VseSBtb3ZlIHRoZSBvZS50ZXJtaW5hbCBpbXBsZW1lbnRhdGlvbiBpbnRvIAorIyBiaXRiYWtlIHdoaWNoIHdpbGwgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eS4KKworaW1wb3J0IG9zCitpbXBvcnQgYmIKKworZGVmIHdoaWNoX3Rlcm1pbmFsKCk6CisgICAgdGVybSA9IGJiLnV0aWxzLndoaWNoKG9zLmVudmlyb25bIlBBVEgiXSwgInh0ZXJtIikKKyAgICBpZiB0ZXJtOgorICAgICAgICByZXR1cm4gdGVybSArICIgLWUgIgorICAgIHRlcm0gPSBiYi51dGlscy53aGljaChvcy5lbnZpcm9uWyJQQVRIIl0sICJ2dGUiKQorICAgIGlmIHRlcm06CisgICAgICAgIHJldHVybiB0ZXJtICsgIiAtYyAiCisgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2RlcGV4cC5weSBiL2JpdGJha2UvbGliL2JiL3VpL2RlcGV4cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBhYWZjCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvZGVwZXhwLnB5CkBAIC0wLDAgKzEsMzMzIEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBiYXNlZCBEZXBlbmRlbmN5IEV4cGxvcmVyCisjCisjIENvcHlyaWdodCAoQykgMjAwNyAgICAgICAgUm9zcyBCdXJ0b24KKyMgQ29weXJpZ2h0IChDKSAyMDA3IC0gMjAwOCBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IHN5cworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBndGsKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHhtbHJwY2xpYgoraW1wb3J0IGJiCitpbXBvcnQgYmIuZXZlbnQKK2Zyb20gYmIudWkuY3J1bWJzLnByb2dyZXNzYmFyIGltcG9ydCBIb2JQcm9ncmVzc0JhcgorCisjIFBhY2thZ2UgTW9kZWwKKyhDT0xfUEtHX05BTUUpID0gKDApCisKKyMgRGVwZW5kZW5jeSBNb2RlbAorKFRZUEVfREVQLCBUWVBFX1JERVApID0gKDAsIDEpCisoQ09MX0RFUF9UWVBFLCBDT0xfREVQX1BBUkVOVCwgQ09MX0RFUF9QQUNLQUdFKSA9ICgwLCAxLCAyKQorCisKK2NsYXNzIFBhY2thZ2VEZXBWaWV3KGd0ay5UcmVlVmlldyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsLCBkZXBfdHlwZSwgbGFiZWwpOgorICAgICAgICBndGsuVHJlZVZpZXcuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jdXJyZW50ID0gTm9uZQorICAgICAgICBzZWxmLmRlcF90eXBlID0gZGVwX3R5cGUKKyAgICAgICAgc2VsZi5maWx0ZXJfbW9kZWwgPSBtb2RlbC5maWx0ZXJfbmV3KCkKKyAgICAgICAgc2VsZi5maWx0ZXJfbW9kZWwuc2V0X3Zpc2libGVfZnVuYyhzZWxmLl9maWx0ZXIpCisgICAgICAgIHNlbGYuc2V0X21vZGVsKHNlbGYuZmlsdGVyX21vZGVsKQorICAgICAgICAjc2VsZi5jb25uZWN0KCJyb3ctYWN0aXZhdGVkIiwgc2VsZi5vbl9wYWNrYWdlX2FjdGl2YXRlZCwgQ09MX0RFUF9QQUNLQUdFKQorICAgICAgICBzZWxmLmFwcGVuZF9jb2x1bW4oZ3RrLlRyZWVWaWV3Q29sdW1uKGxhYmVsLCBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpLCB0ZXh0PUNPTF9ERVBfUEFDS0FHRSkpCisKKyAgICBkZWYgX2ZpbHRlcihzZWxmLCBtb2RlbCwgaXRlcik6CisgICAgICAgICh0aGlzX3R5cGUsIHBhY2thZ2UpID0gbW9kZWwuZ2V0KGl0ZXIsIENPTF9ERVBfVFlQRSwgQ09MX0RFUF9QQVJFTlQpCisgICAgICAgIGlmIHRoaXNfdHlwZSAhPSBzZWxmLmRlcF90eXBlOiByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHBhY2thZ2UgPT0gc2VsZi5jdXJyZW50CisKKyAgICBkZWYgc2V0X2N1cnJlbnRfcGFja2FnZShzZWxmLCBwYWNrYWdlKToKKyAgICAgICAgc2VsZi5jdXJyZW50ID0gcGFja2FnZQorICAgICAgICBzZWxmLmZpbHRlcl9tb2RlbC5yZWZpbHRlcigpCisKKworY2xhc3MgUGFja2FnZVJldmVyc2VEZXBWaWV3KGd0ay5UcmVlVmlldyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsLCBsYWJlbCk6CisgICAgICAgIGd0ay5UcmVlVmlldy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmN1cnJlbnQgPSBOb25lCisgICAgICAgIHNlbGYuZmlsdGVyX21vZGVsID0gbW9kZWwuZmlsdGVyX25ldygpCisgICAgICAgIHNlbGYuZmlsdGVyX21vZGVsLnNldF92aXNpYmxlX2Z1bmMoc2VsZi5fZmlsdGVyKQorICAgICAgICBzZWxmLnNldF9tb2RlbChzZWxmLmZpbHRlcl9tb2RlbCkKKyAgICAgICAgc2VsZi5hcHBlbmRfY29sdW1uKGd0ay5UcmVlVmlld0NvbHVtbihsYWJlbCwgZ3RrLkNlbGxSZW5kZXJlclRleHQoKSwgdGV4dD1DT0xfREVQX1BBUkVOVCkpCisKKyAgICBkZWYgX2ZpbHRlcihzZWxmLCBtb2RlbCwgaXRlcik6CisgICAgICAgIHBhY2thZ2UgPSBtb2RlbC5nZXRfdmFsdWUoaXRlciwgQ09MX0RFUF9QQUNLQUdFKQorICAgICAgICByZXR1cm4gcGFja2FnZSA9PSBzZWxmLmN1cnJlbnQKKworICAgIGRlZiBzZXRfY3VycmVudF9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgorICAgICAgICBzZWxmLmN1cnJlbnQgPSBwYWNrYWdlCisgICAgICAgIHNlbGYuZmlsdGVyX21vZGVsLnJlZmlsdGVyKCkKKworCitjbGFzcyBEZXBFeHBsb3JlcihndGsuV2luZG93KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGd0ay5XaW5kb3cuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5zZXRfdGl0bGUoIkRlcGVuZGVuY3kgRXhwbG9yZXIiKQorICAgICAgICBzZWxmLnNldF9kZWZhdWx0X3NpemUoNTAwLCA1MDApCisgICAgICAgIHNlbGYuY29ubmVjdCgiZGVsZXRlLWV2ZW50IiwgZ3RrLm1haW5fcXVpdCkKKworICAgICAgICAjIENyZWF0ZSB0aGUgZGF0YSBtb2RlbHMKKyAgICAgICAgc2VsZi5wa2dfbW9kZWwgPSBndGsuTGlzdFN0b3JlKGdvYmplY3QuVFlQRV9TVFJJTkcpCisgICAgICAgIHNlbGYucGtnX21vZGVsLnNldF9zb3J0X2NvbHVtbl9pZChDT0xfUEtHX05BTUUsIGd0ay5TT1JUX0FTQ0VORElORykKKyAgICAgICAgc2VsZi5kZXBlbmRzX21vZGVsID0gZ3RrLkxpc3RTdG9yZShnb2JqZWN0LlRZUEVfSU5ULCBnb2JqZWN0LlRZUEVfU1RSSU5HLCBnb2JqZWN0LlRZUEVfU1RSSU5HKQorICAgICAgICBzZWxmLmRlcGVuZHNfbW9kZWwuc2V0X3NvcnRfY29sdW1uX2lkKENPTF9ERVBfUEFDS0FHRSwgZ3RrLlNPUlRfQVNDRU5ESU5HKQorCisgICAgICAgIHBhbmUgPSBndGsuSFBhbmVkKCkKKyAgICAgICAgcGFuZS5zZXRfcG9zaXRpb24oMjUwKQorICAgICAgICBzZWxmLmFkZChwYW5lKQorCisgICAgICAgICMgVGhlIG1hc3RlciBsaXN0IG9mIHBhY2thZ2VzCisgICAgICAgIHNjcm9sbGVkID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgc2Nyb2xsZWQuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNjcm9sbGVkLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCisgICAgICAgIHNlbGYucGtnX3RyZWV2aWV3ID0gZ3RrLlRyZWVWaWV3KHNlbGYucGtnX21vZGVsKQorICAgICAgICBzZWxmLnBrZ190cmVldmlldy5nZXRfc2VsZWN0aW9uKCkuY29ubmVjdCgiY2hhbmdlZCIsIHNlbGYub25fY3Vyc29yX2NoYW5nZWQpCisgICAgICAgIGNvbHVtbiA9IGd0ay5UcmVlVmlld0NvbHVtbigiUGFja2FnZSIsIGd0ay5DZWxsUmVuZGVyZXJUZXh0KCksIHRleHQ9Q09MX1BLR19OQU1FKQorICAgICAgICBzZWxmLnBrZ190cmVldmlldy5hcHBlbmRfY29sdW1uKGNvbHVtbikKKyAgICAgICAgcGFuZS5hZGQxKHNjcm9sbGVkKQorICAgICAgICBzY3JvbGxlZC5hZGQoc2VsZi5wa2dfdHJlZXZpZXcpCisKKyAgICAgICAgYm94ID0gZ3RrLlZCb3goaG9tb2dlbmVvdXM9VHJ1ZSwgc3BhY2luZz00KQorCisgICAgICAgICMgUnVudGltZSBEZXBlbmRzCisgICAgICAgIHNjcm9sbGVkID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKyAgICAgICAgc2Nyb2xsZWQuc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisgICAgICAgIHNjcm9sbGVkLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorICAgICAgICBzZWxmLnJkZXBfdHJlZXZpZXcgPSBQYWNrYWdlRGVwVmlldyhzZWxmLmRlcGVuZHNfbW9kZWwsIFRZUEVfUkRFUCwgIlJ1bnRpbWUgRGVwZW5kcyIpCisgICAgICAgIHNlbGYucmRlcF90cmVldmlldy5jb25uZWN0KCJyb3ctYWN0aXZhdGVkIiwgc2VsZi5vbl9wYWNrYWdlX2FjdGl2YXRlZCwgQ09MX0RFUF9QQUNLQUdFKQorICAgICAgICBzY3JvbGxlZC5hZGQoc2VsZi5yZGVwX3RyZWV2aWV3KQorICAgICAgICBib3guYWRkKHNjcm9sbGVkKQorCisgICAgICAgICMgQnVpbGQgRGVwZW5kcworICAgICAgICBzY3JvbGxlZCA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgIHNjcm9sbGVkLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorICAgICAgICBzY3JvbGxlZC5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKyAgICAgICAgc2VsZi5kZXBfdHJlZXZpZXcgPSBQYWNrYWdlRGVwVmlldyhzZWxmLmRlcGVuZHNfbW9kZWwsIFRZUEVfREVQLCAiQnVpbGQgRGVwZW5kcyIpCisgICAgICAgIHNlbGYuZGVwX3RyZWV2aWV3LmNvbm5lY3QoInJvdy1hY3RpdmF0ZWQiLCBzZWxmLm9uX3BhY2thZ2VfYWN0aXZhdGVkLCBDT0xfREVQX1BBQ0tBR0UpCisgICAgICAgIHNjcm9sbGVkLmFkZChzZWxmLmRlcF90cmVldmlldykKKyAgICAgICAgYm94LmFkZChzY3JvbGxlZCkKKyAgICAgICAgcGFuZS5hZGQyKGJveCkKKworICAgICAgICAjIFJldmVyc2UgRGVwZW5kcworICAgICAgICBzY3JvbGxlZCA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisgICAgICAgIHNjcm9sbGVkLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorICAgICAgICBzY3JvbGxlZC5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKyAgICAgICAgc2VsZi5yZXZkZXBfdHJlZXZpZXcgPSBQYWNrYWdlUmV2ZXJzZURlcFZpZXcoc2VsZi5kZXBlbmRzX21vZGVsLCAiUmV2ZXJzZSBEZXBlbmRzIikKKyAgICAgICAgc2VsZi5yZXZkZXBfdHJlZXZpZXcuY29ubmVjdCgicm93LWFjdGl2YXRlZCIsIHNlbGYub25fcGFja2FnZV9hY3RpdmF0ZWQsIENPTF9ERVBfUEFSRU5UKQorICAgICAgICBzY3JvbGxlZC5hZGQoc2VsZi5yZXZkZXBfdHJlZXZpZXcpCisgICAgICAgIGJveC5hZGQoc2Nyb2xsZWQpCisgICAgICAgIHBhbmUuYWRkMihib3gpCisKKyAgICAgICAgc2VsZi5zaG93X2FsbCgpCisKKyAgICBkZWYgb25fcGFja2FnZV9hY3RpdmF0ZWQoc2VsZiwgdHJlZXZpZXcsIHBhdGgsIGNvbHVtbiwgZGF0YV9jb2wpOgorICAgICAgICBtb2RlbCA9IHRyZWV2aWV3LmdldF9tb2RlbCgpCisgICAgICAgIHBhY2thZ2UgPSBtb2RlbC5nZXRfdmFsdWUobW9kZWwuZ2V0X2l0ZXIocGF0aCksIGRhdGFfY29sKQorCisgICAgICAgIHBrZ19wYXRoID0gW10KKyAgICAgICAgZGVmIGZpbmRlcihtb2RlbCwgcGF0aCwgaXRlciwgbmVlZGxlKToKKyAgICAgICAgICAgIHBhY2thZ2UgPSBtb2RlbC5nZXRfdmFsdWUoaXRlciwgQ09MX1BLR19OQU1FKQorICAgICAgICAgICAgaWYgcGFja2FnZSA9PSBuZWVkbGU6CisgICAgICAgICAgICAgICAgcGtnX3BhdGguYXBwZW5kKHBhdGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYucGtnX21vZGVsLmZvcmVhY2goZmluZGVyLCBwYWNrYWdlKQorICAgICAgICBpZiBwa2dfcGF0aDoKKyAgICAgICAgICAgIHNlbGYucGtnX3RyZWV2aWV3LmdldF9zZWxlY3Rpb24oKS5zZWxlY3RfcGF0aChwa2dfcGF0aFswXSkKKyAgICAgICAgICAgIHNlbGYucGtnX3RyZWV2aWV3LnNjcm9sbF90b19jZWxsKHBrZ19wYXRoWzBdKQorCisgICAgZGVmIG9uX2N1cnNvcl9jaGFuZ2VkKHNlbGYsIHNlbGVjdGlvbik6CisgICAgICAgIChtb2RlbCwgaXQpID0gc2VsZWN0aW9uLmdldF9zZWxlY3RlZCgpCisgICAgICAgIGlmIGl0IGlzIE5vbmU6CisgICAgICAgICAgICBjdXJyZW50X3BhY2thZ2UgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdXJyZW50X3BhY2thZ2UgPSBtb2RlbC5nZXRfdmFsdWUoaXQsIENPTF9QS0dfTkFNRSkKKyAgICAgICAgc2VsZi5yZGVwX3RyZWV2aWV3LnNldF9jdXJyZW50X3BhY2thZ2UoY3VycmVudF9wYWNrYWdlKQorICAgICAgICBzZWxmLmRlcF90cmVldmlldy5zZXRfY3VycmVudF9wYWNrYWdlKGN1cnJlbnRfcGFja2FnZSkKKyAgICAgICAgc2VsZi5yZXZkZXBfdHJlZXZpZXcuc2V0X2N1cnJlbnRfcGFja2FnZShjdXJyZW50X3BhY2thZ2UpCisKKworICAgIGRlZiBwYXJzZShzZWxmLCBkZXBncmFwaCk6CisgICAgICAgIGZvciBwYWNrYWdlIGluIGRlcGdyYXBoWyJwbiJdOgorICAgICAgICAgICAgc2VsZi5wa2dfbW9kZWwuaW5zZXJ0KDAsIChwYWNrYWdlLCkpCisKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZGVwZ3JhcGhbImRlcGVuZHMiXToKKyAgICAgICAgICAgIGZvciBkZXBlbmQgaW4gZGVwZ3JhcGhbImRlcGVuZHMiXVtwYWNrYWdlXToKKyAgICAgICAgICAgICAgICBzZWxmLmRlcGVuZHNfbW9kZWwuaW5zZXJ0ICgwLCAoVFlQRV9ERVAsIHBhY2thZ2UsIGRlcGVuZCkpCisKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZGVwZ3JhcGhbInJkZXBlbmRzLXBuIl06CisgICAgICAgICAgICBmb3IgcmRlcGVuZCBpbiBkZXBncmFwaFsicmRlcGVuZHMtcG4iXVtwYWNrYWdlXToKKyAgICAgICAgICAgICAgICBzZWxmLmRlcGVuZHNfbW9kZWwuaW5zZXJ0ICgwLCAoVFlQRV9SREVQLCBwYWNrYWdlLCByZGVwZW5kKSkKKworCitjbGFzcyBndGt0aHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICAgcXVpdCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNodXRkb3duKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnNldERhZW1vbihUcnVlKQorICAgICAgICBzZWxmLnNodXRkb3duID0gc2h1dGRvd24KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGdvYmplY3QudGhyZWFkc19pbml0KCkKKyAgICAgICAgZ3RrLmdkay50aHJlYWRzX2luaXQoKQorICAgICAgICBndGsubWFpbigpCisgICAgICAgIGd0a3RocmVhZC5xdWl0LnNldCgpCisKKworZGVmIG1haW4oc2VydmVyLCBldmVudEhhbmRsZXIsIHBhcmFtcyk6CisgICAgdHJ5OgorICAgICAgICBwYXJhbXMudXBkYXRlRnJvbVNlcnZlcihzZXJ2ZXIpCisgICAgICAgIGNtZGxpbmUgPSBwYXJhbXMucGFyc2VBY3Rpb25zKCkKKyAgICAgICAgaWYgbm90IGNtZGxpbmU6CisgICAgICAgICAgICBwcmludCgiTm90aGluZyB0byBkby4gIFVzZSAnYml0YmFrZSB3b3JsZCcgdG8gYnVpbGQgZXZlcnl0aGluZywgb3IgcnVuICdiaXRiYWtlIC0taGVscCcgZm9yIHVzYWdlIGluZm9ybWF0aW9uLiIpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBpZiAnbXNnJyBpbiBjbWRsaW5lIGFuZCBjbWRsaW5lWydtc2cnXToKKyAgICAgICAgICAgIHByaW50KGNtZGxpbmVbJ21zZyddKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgY21kbGluZSA9IGNtZGxpbmVbJ2FjdGlvbiddCisgICAgICAgIGlmIG5vdCBjbWRsaW5lIG9yIGNtZGxpbmVbMF0gIT0gImdlbmVyYXRlRG90R3JhcGgiOgorICAgICAgICAgICAgcHJpbnQoIlRoaXMgVUkgcmVxdWlyZXMgdGhlIC1nIG9wdGlvbiIpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXQsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZW5lcmF0ZURlcFRyZWVFdmVudCIsIGNtZGxpbmVbMV0sIGNtZGxpbmVbMl1dKQorICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJFcnJvciBydW5uaW5nIGNvbW1hbmQgJyVzJzogJXMiICUgKGNtZGxpbmUsIGVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsaWYgcmV0ICE9IFRydWU6CisgICAgICAgICAgICBwcmludCgiRXJyb3IgcnVubmluZyBjb21tYW5kICclcyc6IHJldHVybmVkICVzIiAlIChjbWRsaW5lLCByZXQpKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICBleGNlcHQgeG1scnBjbGliLkZhdWx0IGFzIHg6CisgICAgICAgIHByaW50KCJYTUxSUEMgRmF1bHQgZ2V0dGluZyBjb21tYW5kbGluZTpcbiAlcyIgJSB4KQorICAgICAgICByZXR1cm4KKworICAgIHRyeToKKyAgICAgICAgZ3RrLmluaXRfY2hlY2soKQorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlBsZWFzZSBzZXQgRElTUExBWSB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyB0aGlzIGNvbW1hbmQgXG4iKQorICAgICAgICByZXR1cm4KKworICAgIHNodXRkb3duID0gMAorCisgICAgZ3RrZ3VpID0gZ3RrdGhyZWFkKHNodXRkb3duKQorICAgIGd0a2d1aS5zdGFydCgpCisKKyAgICBndGsuZ2RrLnRocmVhZHNfZW50ZXIoKQorICAgIGRlcCA9IERlcEV4cGxvcmVyKCkKKyAgICBiYXJkaWFsb2cgPSBndGsuRGlhbG9nKHBhcmVudD1kZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz1ndGsuRElBTE9HX01PREFMfGd0ay5ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCkKKyAgICBiYXJkaWFsb2cuc2V0X2RlZmF1bHRfc2l6ZSg0MDAsIDUwKQorICAgIHBiYXIgPSBIb2JQcm9ncmVzc0JhcigpCisgICAgYmFyZGlhbG9nLnZib3gucGFja19zdGFydChwYmFyKQorICAgIGJhcmRpYWxvZy5zaG93X2FsbCgpCisgICAgYmFyZGlhbG9nLmNvbm5lY3QoImRlbGV0ZS1ldmVudCIsIGd0ay5tYWluX3F1aXQpCisgICAgZ3RrLmdkay50aHJlYWRzX2xlYXZlKCkKKworICAgIHByb2dyZXNzX3RvdGFsID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRIYW5kbGVyLndhaXRFdmVudCgwLjI1KQorICAgICAgICAgICAgaWYgZ3RrdGhyZWFkLnF1aXQuaXNTZXQoKToKKyAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3duIl0pCisgICAgICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCdVbmFibGUgdG8gY2xlYW5seSBzdG9wOiAlcycgJSBlcnJvcikKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBldmVudCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFN0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIHByb2dyZXNzX3RvdGFsID0gZXZlbnQudG90YWwKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfZW50ZXIoKQorICAgICAgICAgICAgICAgIGJhcmRpYWxvZy5zZXRfdGl0bGUoIkxvYWRpbmcgQ2FjaGUiKQorICAgICAgICAgICAgICAgIHBiYXIudXBkYXRlKDApCisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2xlYXZlKCkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkUHJvZ3Jlc3MpOgorICAgICAgICAgICAgICAgIHggPSBldmVudC5jdXJyZW50CisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2VudGVyKCkKKyAgICAgICAgICAgICAgICBwYmFyLnVwZGF0ZSh4ICogMS4wIC8gcHJvZ3Jlc3NfdG90YWwpCisgICAgICAgICAgICAgICAgcGJhci5zZXRfdGl0bGUoJycpCisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2xlYXZlKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRDb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgIGJhcmRpYWxvZy5oaWRlKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZVN0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIHByb2dyZXNzX3RvdGFsID0gZXZlbnQudG90YWwKKyAgICAgICAgICAgICAgICBpZiBwcm9ncmVzc190b3RhbCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgICAgICAgICAgcGJhci51cGRhdGUoMCkKKyAgICAgICAgICAgICAgICBiYXJkaWFsb2cuc2V0X3RpdGxlKCJQcm9jZXNzaW5nIHJlY2lwZXMiKQorCisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2xlYXZlKCkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyk6CisgICAgICAgICAgICAgICAgeCA9IGV2ZW50LmN1cnJlbnQKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfZW50ZXIoKQorICAgICAgICAgICAgICAgIHBiYXIudXBkYXRlKHggKiAxLjAgLyBwcm9ncmVzc190b3RhbCkKKyAgICAgICAgICAgICAgICBwYmFyLnNldF90aXRsZSgnJykKKyAgICAgICAgICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICBiYXJkaWFsb2cuaGlkZSgpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuRGVwVHJlZUdlbmVyYXRlZCk6CisgICAgICAgICAgICAgICAgZ3RrLmdkay50aHJlYWRzX2VudGVyKCkKKyAgICAgICAgICAgICAgICBkZXAucGFyc2UoZXZlbnQuX2RlcGdyYXBoKQorICAgICAgICAgICAgICAgIGd0ay5nZGsudGhyZWFkc19sZWF2ZSgpCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kRmFpbGVkKToKKyAgICAgICAgICAgICAgICBwcmludCgiQ29tbWFuZCBleGVjdXRpb24gZmFpbGVkOiAlcyIgJSBldmVudC5lcnJvcikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuZXhpdGNvZGUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kRXhpdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmV4aXRjb2RlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvb2tlci5Db29rZXJFeGl0KToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBpb2Vycm9yOgorICAgICAgICAgICAgIyBpZ25vcmUgaW50ZXJydXB0ZWQgaW8KKyAgICAgICAgICAgIGlmIGlvZXJyb3IuYXJnc1swXSA9PSA0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgaWYgc2h1dGRvd24gPT0gMjoKKyAgICAgICAgICAgICAgICBwcmludCgiXG5UaGlyZCBLZXlib2FyZCBJbnRlcnJ1cHQsIGV4aXQuXG4iKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBzaHV0ZG93biA9PSAxOgorICAgICAgICAgICAgICAgIHByaW50KCJcblNlY29uZCBLZXlib2FyZCBJbnRlcnJ1cHQsIHN0b3BwaW5nLi4uXG4iKQorICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1VuYWJsZSB0byBjbGVhbmx5IHN0b3A6ICVzJyAlIGVycm9yKQorICAgICAgICAgICAgaWYgc2h1dGRvd24gPT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBJbnRlcnJ1cHQsIGNsb3NpbmcgZG93bi4uLlxuIikKKyAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVTaHV0ZG93biJdKQorICAgICAgICAgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCgnVW5hYmxlIHRvIGNsZWFubHkgc2h1dGRvd246ICVzJyAlIGVycm9yKQorICAgICAgICAgICAgc2h1dGRvd24gPSBzaHV0ZG93biArIDEKKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2dvZ2dsZS5weSBiL2JpdGJha2UvbGliL2JiL3VpL2dvZ2dsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGVlN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvZ29nZ2xlLnB5CkBAIC0wLDAgKzEsMTIxIEBACisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IFJvYiBCcmFkZm9yZCA8cm9iQGxpbnV4LmludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBnb2JqZWN0CitpbXBvcnQgZ3RrCitpbXBvcnQgeG1scnBjbGliCitmcm9tIGJiLnVpLmNydW1icy5ydW5uaW5nYnVpbGQgaW1wb3J0IFJ1bm5pbmdCdWlsZFRyZWVWaWV3LCBSdW5uaW5nQnVpbGQKK2Zyb20gYmIudWkuY3J1bWJzLnByb2dyZXNzIGltcG9ydCBQcm9ncmVzc0JhcgorCitpbXBvcnQgUXVldWUKKworCitkZWYgZXZlbnRfaGFuZGxlX2lkbGVfZnVuYyAoZXZlbnRIYW5kbGVyLCBidWlsZCwgcGJhcik6CisKKyAgICAjIENvbnN1bWUgYXMgbWFueSBtZXNzYWdlcyBhcyB3ZSBjYW4gaW4gdGhlIHRpbWUgYXZhaWxhYmxlIHRvIHVzCisgICAgZXZlbnQgPSBldmVudEhhbmRsZXIuZ2V0RXZlbnQoKQorICAgIHdoaWxlIGV2ZW50OgorICAgICAgICBidWlsZC5oYW5kbGVfZXZlbnQgKGV2ZW50LCBwYmFyKQorICAgICAgICBldmVudCA9IGV2ZW50SGFuZGxlci5nZXRFdmVudCgpCisKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgc2Nyb2xsX3R2X2NiIChtb2RlbCwgcGF0aCwgaXRlciwgdmlldyk6CisgICAgdmlldy5zY3JvbGxfdG9fY2VsbCAocGF0aCkKKworCisjIEB0b2RvIGhvb2sgdGhlc2UgaW50byB0aGUgR1VJIHNvIHRoZSB1c2VyIGhhcyBmZWVkYmFjay4uLgorZGVmIHJ1bm5pbmdfYnVpbGRfZmFpbGVkX2NiIChydW5uaW5nX2J1aWxkKToKKyAgICBwYXNzCisKKworZGVmIHJ1bm5pbmdfYnVpbGRfc3VjY2VlZGVkX2NiIChydW5uaW5nX2J1aWxkKToKKyAgICBwYXNzCisKKworY2xhc3MgTWFpbldpbmRvdyAoZ3RrLldpbmRvdyk6CisgICAgZGVmIF9faW5pdF9fIChzZWxmKToKKyAgICAgICAgZ3RrLldpbmRvdy5fX2luaXRfXyAoc2VsZiwgZ3RrLldJTkRPV19UT1BMRVZFTCkKKworICAgICAgICAjIFNldHVwIHRyZWUgdmlldyBhbmQgdGhlIHNjcm9sbGVkIHdpbmRvdworICAgICAgICBzY3JvbGxlZF93aW5kb3cgPSBndGsuU2Nyb2xsZWRXaW5kb3cgKCkKKyAgICAgICAgc2VsZi5hZGQgKHNjcm9sbGVkX3dpbmRvdykKKyAgICAgICAgc2VsZi5jdXJfYnVpbGRfdHYgPSBSdW5uaW5nQnVpbGRUcmVlVmlldygpCisgICAgICAgIHNlbGYuY29ubmVjdCgiZGVsZXRlLWV2ZW50IiwgZ3RrLm1haW5fcXVpdCkKKyAgICAgICAgc2VsZi5zZXRfZGVmYXVsdF9zaXplKDY0MCwgNDgwKQorICAgICAgICBzY3JvbGxlZF93aW5kb3cuYWRkIChzZWxmLmN1cl9idWlsZF90dikKKworCitkZWYgbWFpbiAoc2VydmVyLCBldmVudEhhbmRsZXIsIHBhcmFtcyk6CisgICAgZ29iamVjdC50aHJlYWRzX2luaXQoKQorICAgIGd0ay5nZGsudGhyZWFkc19pbml0KCkKKworICAgIHdpbmRvdyA9IE1haW5XaW5kb3cgKCkKKyAgICB3aW5kb3cuc2hvd19hbGwgKCkKKyAgICBwYmFyID0gUHJvZ3Jlc3NCYXIod2luZG93KQorICAgIHBiYXIuY29ubmVjdCgiZGVsZXRlLWV2ZW50IiwgZ3RrLm1haW5fcXVpdCkKKworICAgICMgQ3JlYXRlIHRoZSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGJ1aWxkCisgICAgcnVubmluZ19idWlsZCA9IFJ1bm5pbmdCdWlsZCAoKQorICAgIHdpbmRvdy5jdXJfYnVpbGRfdHYuc2V0X21vZGVsIChydW5uaW5nX2J1aWxkLm1vZGVsKQorICAgIHJ1bm5pbmdfYnVpbGQubW9kZWwuY29ubmVjdCgicm93LWluc2VydGVkIiwgc2Nyb2xsX3R2X2NiLCB3aW5kb3cuY3VyX2J1aWxkX3R2KQorICAgIHJ1bm5pbmdfYnVpbGQuY29ubmVjdCAoImJ1aWxkLXN1Y2NlZWRlZCIsIHJ1bm5pbmdfYnVpbGRfc3VjY2VlZGVkX2NiKQorICAgIHJ1bm5pbmdfYnVpbGQuY29ubmVjdCAoImJ1aWxkLWZhaWxlZCIsIHJ1bm5pbmdfYnVpbGRfZmFpbGVkX2NiKQorCisgICAgdHJ5OgorICAgICAgICBwYXJhbXMudXBkYXRlRnJvbVNlcnZlcihzZXJ2ZXIpCisgICAgICAgIGNtZGxpbmUgPSBwYXJhbXMucGFyc2VBY3Rpb25zKCkKKyAgICAgICAgaWYgbm90IGNtZGxpbmU6CisgICAgICAgICAgICBwcmludCgiTm90aGluZyB0byBkby4gIFVzZSAnYml0YmFrZSB3b3JsZCcgdG8gYnVpbGQgZXZlcnl0aGluZywgb3IgcnVuICdiaXRiYWtlIC0taGVscCcgZm9yIHVzYWdlIGluZm9ybWF0aW9uLiIpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBpZiAnbXNnJyBpbiBjbWRsaW5lIGFuZCBjbWRsaW5lWydtc2cnXToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihjbWRsaW5lWydtc2cnXSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGNtZGxpbmUgPSBjbWRsaW5lWydhY3Rpb24nXQorICAgICAgICByZXQsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoY21kbGluZSkKKyAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICBwcmludCgiRXJyb3IgcnVubmluZyBjb21tYW5kICclcyc6ICVzIiAlIChjbWRsaW5lLCBlcnJvcikpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIHJldCAhPSBUcnVlOgorICAgICAgICAgICAgcHJpbnQoIkVycm9yIHJ1bm5pbmcgY29tbWFuZCAnJXMnOiByZXR1cm5lZCAlcyIgJSAoY21kbGluZSwgcmV0KSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgZXhjZXB0IHhtbHJwY2xpYi5GYXVsdCBhcyB4OgorICAgICAgICBwcmludCgiWE1MUlBDIEZhdWx0IGdldHRpbmcgY29tbWFuZGxpbmU6XG4gJXMiICUgeCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgICMgVXNlIGEgdGltZW91dCBmdW5jdGlvbiBmb3IgcHJvYmluZyB0aGUgZXZlbnQgcXVldWUgdG8gZmluZCBvdXQgaWYgd2UKKyAgICAjIGhhdmUgYSBtZXNzYWdlIHdhaXRpbmcgZm9yIHVzLgorICAgIGdvYmplY3QudGltZW91dF9hZGQgKDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9oYW5kbGVfaWRsZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nX2J1aWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBiYXIpCisKKyAgICB0cnk6CisgICAgICAgIGd0ay5tYWluKCkKKyAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBpb2Vycm9yOgorICAgICAgICAjIGlnbm9yZSBpbnRlcnJ1cHRlZCBpbworICAgICAgICBpZiBpb2Vycm9yLmFyZ3NbMF0gPT0gNDoKKyAgICAgICAgICAgIHBhc3MKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHBhc3MKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS9ob2IucHkgYi9iaXRiYWtlL2xpYi9iYi91aS9ob2IucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGE1YjQxMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2hvYi5weQpAQCAtMCwwICsxLDEwOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIEJpdEJha2UgR3JhcGhpY2FsIEdUSyBVc2VyIEludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEgICAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIEF1dGhvcmVkIGJ5IEpvc2h1YSBMb2NrIDxqb3NoQGxpbnV4LmludGVsLmNvbT4KKyMgQXV0aG9yZWQgYnkgRG9uZ3hpYW8gWHUgPGRvbmd4aWFvLnh1QGludGVsLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworcmVxdWlyZW1lbnRzID0gIkZBVEFMOiBIb2IgcmVxdWlyZXMgR3RrKyAyLjIwLjAgb3IgaGlnaGVyLCBQeUd0ayAyLjIxLjAgb3IgaGlnaGVyIgordHJ5OgorICAgIGltcG9ydCBnb2JqZWN0CisgICAgaW1wb3J0IGd0aworICAgIGltcG9ydCBweWd0aworICAgIHB5Z3RrLnJlcXVpcmUoJzIuMCcpICMgdG8gYmUgY2VydGFpbiB3ZSBkb24ndCBoYXZlIGd0aysgMS54ICE/IQorICAgIGd0a3ZlciA9IGd0ay5ndGtfdmVyc2lvbgorICAgIHB5Z3RrdmVyID0gZ3RrLnB5Z3RrX3ZlcnNpb24KKyAgICBpZiBndGt2ZXIgIDwgKDIsIDIwLCAwKSBvciBweWd0a3ZlciA8ICgyLCAyMSwgMCk6CisgICAgICAgIHN5cy5leGl0KCIlcyxcbllvdSBoYXZlIEd0aysgJXMgYW5kIFB5R3RrICVzLiIgJSAocmVxdWlyZW1lbnRzLAorICAgICAgICAgICAgICAgICIuIi5qb2luKG1hcChzdHIsIGd0a3ZlcikpLAorICAgICAgICAgICAgICAgICIuIi5qb2luKG1hcChzdHIsIHB5Z3RrdmVyKSkpKQorZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICBzeXMuZXhpdCgiJXMgKCVzKS4iICUgKHJlcXVpcmVtZW50cywgc3RyKGV4YykpKQorc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpKQordHJ5OgorICAgIGltcG9ydCBiYgorZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBleGM6CisgICAgc3lzLmV4aXQoc3RyKGV4YykpCitmcm9tIGJiLnVpIGltcG9ydCB1aWhlbHBlcgorZnJvbSBiYi51aS5jcnVtYnMuaG9ibGlzdG1vZGVsIGltcG9ydCBSZWNpcGVMaXN0TW9kZWwsIFBhY2thZ2VMaXN0TW9kZWwKK2Zyb20gYmIudWkuY3J1bWJzLmhvYmV2ZW50aGFuZGxlciBpbXBvcnQgSG9iSGFuZGxlcgorZnJvbSBiYi51aS5jcnVtYnMuYnVpbGRlciBpbXBvcnQgQnVpbGRlcgorCitmZWF0dXJlU2V0ID0gW2JiLmNvb2tlci5Db29rZXJGZWF0dXJlcy5IT0JfRVhUUkFfQ0FDSEVTLCBiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuQkFTRURBVEFTVE9SRV9UUkFDS0lOR10KKworZGVmIGV2ZW50X2hhbmRsZV9pZGxlX2Z1bmMoZXZlbnRIYW5kbGVyLCBob2JIYW5kbGVyKToKKyAgICAjIENvbnN1bWUgYXMgbWFueSBtZXNzYWdlcyBhcyB3ZSBjYW4gaW4gdGhlIHRpbWUgYXZhaWxhYmxlIHRvIHVzCisgICAgaWYgbm90IGV2ZW50SGFuZGxlcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZXZlbnQgPSBldmVudEhhbmRsZXIuZ2V0RXZlbnQoKQorICAgIHdoaWxlIGV2ZW50OgorICAgICAgICBob2JIYW5kbGVyLmhhbmRsZV9ldmVudChldmVudCkKKyAgICAgICAgZXZlbnQgPSBldmVudEhhbmRsZXIuZ2V0RXZlbnQoKQorICAgIHJldHVybiBUcnVlCisKK19ldnRfbGlzdCA9IFsgImJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXhpdFdhaXQiLCAiYmIuZXZlbnQuTG9nRXhlY1RUWSIsICJsb2dnaW5nLkxvZ1JlY29yZCIsCisgICAgICAgICAgICAgICJiYi5idWlsZC5UYXNrRmFpbGVkIiwgImJiLmJ1aWxkLlRhc2tCYXNlIiwgImJiLmV2ZW50LlBhcnNlU3RhcnRlZCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5QYXJzZVByb2dyZXNzIiwgImJiLmV2ZW50LlBhcnNlQ29tcGxldGVkIiwgImJiLmV2ZW50LkNhY2hlTG9hZFN0YXJ0ZWQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuQ2FjaGVMb2FkUHJvZ3Jlc3MiLCAiYmIuZXZlbnQuQ2FjaGVMb2FkQ29tcGxldGVkIiwgImJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCIsCisgICAgICAgICAgICAgICJiYi5jb21tYW5kLkNvbW1hbmRFeGl0IiwgImJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCIsICAiYmIuY29va2VyLkNvb2tlckV4aXQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuTXVsdGlwbGVQcm92aWRlcnMiLCAiYmIuZXZlbnQuTm9Qcm92aWRlciIsICJiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza1N0YXJ0ZWQiLAorICAgICAgICAgICAgICAiYmIucnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCIsICJiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tGYWlsZWQiLCAiYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tGYWlsZWQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuQnVpbGRCYXNlIiwgImJiLmJ1aWxkLlRhc2tTdGFydGVkIiwgImJiLmJ1aWxkLlRhc2tTdWNjZWVkZWQiLCAiYmIuYnVpbGQuVGFza0ZhaWxlZFNpbGVudCIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5TYW5pdHlDaGVja1Bhc3NlZCIsICJiYi5ldmVudC5TYW5pdHlDaGVja0ZhaWxlZCIsICJiYi5ldmVudC5QYWNrYWdlSW5mbyIsCisgICAgICAgICAgICAgICJiYi5ldmVudC5UYXJnZXRzVHJlZUdlbmVyYXRlZCIsICJiYi5ldmVudC5Db25maWdGaWxlc0ZvdW5kIiwgImJiLmV2ZW50LkNvbmZpZ0ZpbGVQYXRoRm91bmQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuRmlsZXNNYXRjaGluZ0ZvdW5kIiwgImJiLmV2ZW50Lk5ldHdvcmtUZXN0RmFpbGVkIiwgImJiLmV2ZW50Lk5ldHdvcmtUZXN0UGFzc2VkIiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50LkJ1aWxkU3RhcnRlZCIsICJiYi5ldmVudC5CdWlsZENvbXBsZXRlZCIsICJiYi5ldmVudC5EaXNrRnVsbCJdCisKK2RlZiBtYWluIChzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgcGFyYW1zKToKKyAgICBwYXJhbXMudXBkYXRlRnJvbVNlcnZlcihzZXJ2ZXIpCisgICAgZ29iamVjdC50aHJlYWRzX2luaXQoKQorCisgICAgIyBUaGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBIb2IgYW5kIHRoZSBiaXRiYWtlIHNlcnZlciBhcmUKKyAgICAjIHJ1bm5pbmcgb24gZGlmZmVyZW50IG1hY2hpbmVzCisgICAgIyByZWNpcGUgbW9kZWwgYW5kIHBhY2thZ2UgbW9kZWwKKyAgICByZWNpcGVfbW9kZWwgPSBSZWNpcGVMaXN0TW9kZWwoKQorICAgIHBhY2thZ2VfbW9kZWwgPSBQYWNrYWdlTGlzdE1vZGVsKCkKKworICAgIGxsZXZlbCwgZGVidWdfZG9tYWlucyA9IGJiLm1zZy5jb25zdHJ1Y3RMb2dPcHRpb25zKCkKKyAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInNldEV2ZW50TWFzayIsIHNlcnZlci5nZXRFdmVudEhhbmRsZSgpLCBsbGV2ZWwsIGRlYnVnX2RvbWFpbnMsIF9ldnRfbGlzdF0pCisgICAgaG9iSGFuZGxlciA9IEhvYkhhbmRsZXIoc2VydmVyLCByZWNpcGVfbW9kZWwsIHBhY2thZ2VfbW9kZWwpCisgICAgYnVpbGRlciA9IEJ1aWxkZXIoaG9iSGFuZGxlciwgcmVjaXBlX21vZGVsLCBwYWNrYWdlX21vZGVsKQorCisgICAgIyBUaGlzIHRpbWVvdXQgZnVuY3Rpb24gcmVndWxhcmx5IHByb2JlcyB0aGUgZXZlbnQgcXVldWUgdG8gZmluZCBvdXQgaWYgd2UKKyAgICAjIGhhdmUgYW55IG1lc3NhZ2VzIHdhaXRpbmcgZm9yIHVzLgorICAgIGdvYmplY3QudGltZW91dF9hZGQoMTAsIGV2ZW50X2hhbmRsZV9pZGxlX2Z1bmMsIGV2ZW50SGFuZGxlciwgaG9iSGFuZGxlcikKKworICAgIHRyeToKKyAgICAgICAgZ3RrLm1haW4oKQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGlvZXJyb3I6CisgICAgICAgICMgaWdub3JlIGludGVycnVwdGVkIGlvCisgICAgICAgIGlmIGlvZXJyb3IuYXJnc1swXSA9PSA0OgorICAgICAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIGhvYkhhbmRsZXIuY2FuY2VsX2J1aWxkKGZvcmNlID0gVHJ1ZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0cnk6CisgICAgICAgIHJldCA9IG1haW4oKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHJldCA9IDEKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKDE1KQorICAgIHN5cy5leGl0KHJldCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2ltYWdlcy9pbWFnZXNfZGlzcGxheS5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbWFnZXMvaW1hZ2VzX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Zjg3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbWFnZXMvaW1hZ2VzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2ltYWdlcy9pbWFnZXNfaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW1hZ2VzL2ltYWdlc19ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5Y2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2ltYWdlcy9pbWFnZXNfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvYWRkLWhvdmVyLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvYWRkLWhvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZkZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hZGQtaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvYWRkLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvYWRkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3MDkwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hZGQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvYWxlcnQucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9hbGVydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNmY1NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvYWxlcnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvY29uZmlybWF0aW9uLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvY29uZmlybWF0aW9uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU0MDJkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9jb25maXJtYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvZGVuaWVkLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvZGVuaWVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM1YzdkCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9kZW5pZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvZXJyb3IucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9lcnJvci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2YThjMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvZXJyb3IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvaW5mby5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2luZm8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOGU4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL2luZm8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvaXNzdWVzLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvaXNzdWVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGM3NDYxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9pc3N1ZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVmcmVzaC5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL3JlZnJlc2gucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmM0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL3JlZnJlc2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVtb3ZlLWhvdmVyLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVtb3ZlLWhvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTU3YzY5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZW1vdmUtaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVtb3ZlLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvcmVtb3ZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWMzYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5kaWNhdG9ycy9yZW1vdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZGljYXRvcnMvdGljay5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL3RpY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWFkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmRpY2F0b3JzL3RpY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZm8vaW5mb19kaXNwbGF5LnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZm8vaW5mb19kaXNwbGF5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWZiYmEyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvaW5mby9pbmZvX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2luZm8vaW5mb19ob3Zlci5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmZvL2luZm9faG92ZXIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZDI5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9pbmZvL2luZm9faG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2xheWVycy9sYXllcnNfZGlzcGxheS5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9sYXllcnMvbGF5ZXJzX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjkwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9sYXllcnMvbGF5ZXJzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2xheWVycy9sYXllcnNfaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvbGF5ZXJzL2xheWVyc19ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmM2NlMAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL2xheWVycy9sYXllcnNfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3BhY2thZ2VzL3BhY2thZ2VzX2Rpc3BsYXkucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcGFja2FnZXMvcGFja2FnZXNfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkMGE1MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3BhY2thZ2VzL3BhY2thZ2VzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3BhY2thZ2VzL3BhY2thZ2VzX2hvdmVyLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3BhY2thZ2VzL3BhY2thZ2VzX2hvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgxMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcGFja2FnZXMvcGFja2FnZXNfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3JlY2lwZS9yZWNpcGVfZGlzcGxheS5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9yZWNpcGUvcmVjaXBlX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODA5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy9yZWNpcGUvcmVjaXBlX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3JlY2lwZS9yZWNpcGVfaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvcmVjaXBlL3JlY2lwZV9ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0OGRhOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3JlY2lwZS9yZWNpcGVfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3NldHRpbmdzL3NldHRpbmdzX2Rpc3BsYXkucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvc2V0dGluZ3Mvc2V0dGluZ3NfZGlzcGxheS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjNDY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3NldHRpbmdzL3NldHRpbmdzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3NldHRpbmdzL3NldHRpbmdzX2hvdmVyLnBuZyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3NldHRpbmdzL3NldHRpbmdzX2hvdmVyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJhMGJmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvc2V0dGluZ3Mvc2V0dGluZ3NfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3RlbXBsYXRlcy90ZW1wbGF0ZXNfZGlzcGxheS5wbmcgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy90ZW1wbGF0ZXMvdGVtcGxhdGVzX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1M2M3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9pY29ucy90ZW1wbGF0ZXMvdGVtcGxhdGVzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3RlbXBsYXRlcy90ZW1wbGF0ZXNfaG92ZXIucG5nIGIvYml0YmFrZS9saWIvYmIvdWkvaWNvbnMvdGVtcGxhdGVzL3RlbXBsYXRlc19ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiNzE2NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL2ljb25zL3RlbXBsYXRlcy90ZW1wbGF0ZXNfaG92ZXIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JiL3VpL2tub3R0eS5weSBiL2JpdGJha2UvbGliL2JiL3VpL2tub3R0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmVlMjQyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYmIvdWkva25vdHR5LnB5CkBAIC0wLDAgKzEsNTY0IEBACisjCisjIEJpdEJha2UgKE5vKVRUWSBVSSBJbXBsZW1lbnRhdGlvbgorIworIyBIYW5kbGluZyBvdXRwdXQgdG8gVFRZcyBvciBmaWxlcyAobm8gVFRZKQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMiBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB4bWxycGNsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgcHJvZ3Jlc3NiYXIKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBiYi5tc2cKK2ltcG9ydCB0aW1lCitpbXBvcnQgZmNudGwKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBjb3B5CitpbXBvcnQgYXRleGl0Citmcm9tIGJiLnVpIGltcG9ydCB1aWhlbHBlcgorCitmZWF0dXJlU2V0ID0gW2JiLmNvb2tlci5Db29rZXJGZWF0dXJlcy5TRU5EX1NBTklUWUVWRU5UU10KKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIkJpdEJha2UiKQoraW50ZXJhY3RpdmUgPSBzeXMuc3Rkb3V0LmlzYXR0eSgpCisKK2NsYXNzIEJCUHJvZ3Jlc3MocHJvZ3Jlc3NiYXIuUHJvZ3Jlc3NCYXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIG1heHZhbCk6CisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHdpZGdldHMgPSBbcHJvZ3Jlc3NiYXIuUGVyY2VudGFnZSgpLCAnICcsIHByb2dyZXNzYmFyLkJhcigpLCAnICcsCisgICAgICAgICAgIHByb2dyZXNzYmFyLkVUQSgpXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3Jlc2l6ZV9kZWZhdWx0ID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHV0lOQ0gpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuX3Jlc2l6ZV9kZWZhdWx0ID0gTm9uZQorICAgICAgICBwcm9ncmVzc2Jhci5Qcm9ncmVzc0Jhci5fX2luaXRfXyhzZWxmLCBtYXh2YWwsIFtzZWxmLm1zZyArICI6ICJdICsgd2lkZ2V0cywgZmQ9c3lzLnN0ZG91dCkKKworICAgIGRlZiBfaGFuZGxlX3Jlc2l6ZShzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgcHJvZ3Jlc3NiYXIuUHJvZ3Jlc3NCYXIuX2hhbmRsZV9yZXNpemUoc2VsZiwgc2lnbnVtLCBmcmFtZSkKKyAgICAgICAgaWYgc2VsZi5fcmVzaXplX2RlZmF1bHQ6CisgICAgICAgICAgICBzZWxmLl9yZXNpemVfZGVmYXVsdChzaWdudW0sIGZyYW1lKQorICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHByb2dyZXNzYmFyLlByb2dyZXNzQmFyLmZpbmlzaChzZWxmKQorICAgICAgICBpZiBzZWxmLl9yZXNpemVfZGVmYXVsdDoKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1dJTkNILCBzZWxmLl9yZXNpemVfZGVmYXVsdCkKKworY2xhc3MgTm9uSW50ZXJhY3RpdmVQcm9ncmVzcyhvYmplY3QpOgorICAgIGZvYmogPSBzeXMuc3Rkb3V0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBtYXh2YWwpOgorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBzZWxmLm1heHZhbCA9IG1heHZhbAorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmZvYmoud3JpdGUoIiVzLi4uIiAlIHNlbGYubXNnKQorICAgICAgICBzZWxmLmZvYmouZmx1c2goKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHVwZGF0ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHNlbGYuZm9iai53cml0ZSgiZG9uZS5cbiIpCisgICAgICAgIHNlbGYuZm9iai5mbHVzaCgpCisKK2RlZiBuZXdfcHJvZ3Jlc3MobXNnLCBtYXh2YWwpOgorICAgIGlmIGludGVyYWN0aXZlOgorICAgICAgICByZXR1cm4gQkJQcm9ncmVzcyhtc2csIG1heHZhbCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uSW50ZXJhY3RpdmVQcm9ncmVzcyhtc2csIG1heHZhbCkKKworZGVmIHBsdXJhbGlzZShzaW5ndWxhciwgcGx1cmFsLCBxdHkpOgorICAgIGlmKHF0eSA9PSAxKToKKyAgICAgICAgcmV0dXJuIHNpbmd1bGFyICUgcXR5CisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHBsdXJhbCAlIHF0eQorCisKK2NsYXNzIEludGVyYWN0Q29uc29sZUxvZ0ZpbHRlcihsb2dnaW5nLkZpbHRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRmLCBmb3JtYXQpOgorICAgICAgICBzZWxmLnRmID0gdGYKKyAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKKworICAgIGRlZiBmaWx0ZXIoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPT0gc2VsZi5mb3JtYXQuTk9URSBhbmQgKHJlY29yZC5tc2cuc3RhcnRzd2l0aCgiUnVubmluZyIpIG9yIHJlY29yZC5tc2cuc3RhcnRzd2l0aCgicmVjaXBlICIpKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLnRmLmNsZWFyRm9vdGVyKCkKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgVGVybWluYWxGaWx0ZXIob2JqZWN0KToKKyAgICBjb2x1bW5zID0gODAKKworICAgIGRlZiBzaWd3aW5jaF9oYW5kbGUoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CisgICAgICAgIHNlbGYuY29sdW1ucyA9IHNlbGYuZ2V0VGVybWluYWxDb2x1bW5zKCkKKyAgICAgICAgaWYgc2VsZi5fc2lnd2luY2hfZGVmYXVsdDoKKyAgICAgICAgICAgIHNlbGYuX3NpZ3dpbmNoX2RlZmF1bHQoc2lnbnVtLCBmcmFtZSkKKworICAgIGRlZiBnZXRUZXJtaW5hbENvbHVtbnMoc2VsZik6CisgICAgICAgIGRlZiBpb2N0bF9HV0lOU1ooZmQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNyID0gc3RydWN0LnVucGFjaygnaGgnLCBmY250bC5pb2N0bChmZCwgc2VsZi50ZXJtaW9zLlRJT0NHV0lOU1osICcxMjM0JykpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJldHVybiBjcgorICAgICAgICBjciA9IGlvY3RsX0dXSU5TWihzeXMuc3Rkb3V0LmZpbGVubygpKQorICAgICAgICBpZiBub3QgY3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKG9zLmN0ZXJtaWQoKSwgb3MuT19SRE9OTFkpCisgICAgICAgICAgICAgICAgY3IgPSBpb2N0bF9HV0lOU1ooZmQpCisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBub3QgY3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3IgPSAoZW52WydMSU5FUyddLCBlbnZbJ0NPTFVNTlMnXSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBjciA9ICgyNSwgODApCisgICAgICAgIHJldHVybiBjclsxXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1haW4sIGhlbHBlciwgY29uc29sZSwgZXJyY29uc29sZSwgZm9ybWF0KToKKyAgICAgICAgc2VsZi5tYWluID0gbWFpbgorICAgICAgICBzZWxmLmhlbHBlciA9IGhlbHBlcgorICAgICAgICBzZWxmLmN1dSA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGRpbmJhY2t1cCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnRlcmFjdGl2ZSA9IHN5cy5zdGRvdXQuaXNhdHR5KCkKKyAgICAgICAgc2VsZi5mb290ZXJfcHJlc2VudCA9IEZhbHNlCisgICAgICAgIHNlbGYubGFzdHBpZHMgPSBbXQorCisgICAgICAgIGlmIG5vdCBzZWxmLmludGVyYWN0aXZlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGN1cnNlcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBzeXMuZXhpdCgiRkFUQUw6IFRoZSBrbm90dHkgdWkgY291bGQgbm90IGxvYWQgdGhlIHJlcXVpcmVkIGN1cnNlcyBweXRob24gbW9kdWxlLiIpCisKKyAgICAgICAgaW1wb3J0IHRlcm1pb3MKKyAgICAgICAgc2VsZi5jdXJzZXMgPSBjdXJzZXMKKyAgICAgICAgc2VsZi50ZXJtaW9zID0gdGVybWlvcworICAgICAgICB0cnk6CisgICAgICAgICAgICBmZCA9IHN5cy5zdGRpbi5maWxlbm8oKQorICAgICAgICAgICAgc2VsZi5zdGRpbmJhY2t1cCA9IHRlcm1pb3MudGNnZXRhdHRyKGZkKQorICAgICAgICAgICAgbmV3ID0gY29weS5kZWVwY29weShzZWxmLnN0ZGluYmFja3VwKQorICAgICAgICAgICAgbmV3WzNdID0gbmV3WzNdICYgfnRlcm1pb3MuRUNITworICAgICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQURSQUlOLCBuZXcpCisgICAgICAgICAgICBjdXJzZXMuc2V0dXB0ZXJtKCkKKyAgICAgICAgICAgIGlmIGN1cnNlcy50aWdldG51bSgiY29sb3JzIikgPiAyOgorICAgICAgICAgICAgICAgIGZvcm1hdC5lbmFibGVfY29sb3IoKQorICAgICAgICAgICAgc2VsZi5lZCA9IGN1cnNlcy50aWdldHN0cigiZWQiKQorICAgICAgICAgICAgaWYgc2VsZi5lZDoKKyAgICAgICAgICAgICAgICBzZWxmLmN1dSA9IGN1cnNlcy50aWdldHN0cigiY3V1IikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9zaWd3aW5jaF9kZWZhdWx0ID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHV0lOQ0gpCisgICAgICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHV0lOQ0gsIHNlbGYuc2lnd2luY2hfaGFuZGxlKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuY29sdW1ucyA9IHNlbGYuZ2V0VGVybWluYWxDb2x1bW5zKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5jdXUgPSBOb25lCisgICAgICAgIGNvbnNvbGUuYWRkRmlsdGVyKEludGVyYWN0Q29uc29sZUxvZ0ZpbHRlcihzZWxmLCBmb3JtYXQpKQorICAgICAgICBlcnJjb25zb2xlLmFkZEZpbHRlcihJbnRlcmFjdENvbnNvbGVMb2dGaWx0ZXIoc2VsZiwgZm9ybWF0KSkKKworICAgIGRlZiBjbGVhckZvb3RlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mb290ZXJfcHJlc2VudDoKKyAgICAgICAgICAgIGxpbmVzID0gc2VsZi5mb290ZXJfcHJlc2VudAorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzZWxmLmN1cnNlcy50cGFybShzZWxmLmN1dSwgbGluZXMpKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzZWxmLmN1cnNlcy50cGFybShzZWxmLmVkKSkKKyAgICAgICAgc2VsZi5mb290ZXJfcHJlc2VudCA9IEZhbHNlCisKKyAgICBkZWYgdXBkYXRlRm9vdGVyKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jdXU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYWN0aXZldGFza3MgPSBzZWxmLmhlbHBlci5ydW5uaW5nX3Rhc2tzCisgICAgICAgIGZhaWxlZHRhc2tzID0gc2VsZi5oZWxwZXIuZmFpbGVkX3Rhc2tzCisgICAgICAgIHJ1bm5pbmdwaWRzID0gc2VsZi5oZWxwZXIucnVubmluZ19waWRzCisgICAgICAgIGlmIHNlbGYuZm9vdGVyX3ByZXNlbnQgYW5kIChzZWxmLmxhc3Rjb3VudCA9PSBzZWxmLmhlbHBlci50YXNrbnVtYmVyX2N1cnJlbnQpIGFuZCAoc2VsZi5sYXN0cGlkcyA9PSBydW5uaW5ncGlkcyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5mb290ZXJfcHJlc2VudDoKKyAgICAgICAgICAgIHNlbGYuY2xlYXJGb290ZXIoKQorICAgICAgICBpZiAobm90IHNlbGYuaGVscGVyLnRhc2tudW1iZXJfdG90YWwgb3Igc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50ID09IHNlbGYuaGVscGVyLnRhc2tudW1iZXJfdG90YWwpIGFuZCBub3QgbGVuKGFjdGl2ZXRhc2tzKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0YXNrcyA9IFtdCisgICAgICAgIGZvciB0IGluIHJ1bm5pbmdwaWRzOgorICAgICAgICAgICAgdGFza3MuYXBwZW5kKCIlcyAocGlkICVzKSIgJSAoYWN0aXZldGFza3NbdF1bInRpdGxlIl0sIHQpKQorCisgICAgICAgIGlmIHNlbGYubWFpbi5zaHV0ZG93bjoKKyAgICAgICAgICAgIGNvbnRlbnQgPSAiV2FpdGluZyBmb3IgJXMgcnVubmluZyB0YXNrcyB0byBmaW5pc2g6IiAlIGxlbihhY3RpdmV0YXNrcykKKyAgICAgICAgZWxpZiBub3QgbGVuKGFjdGl2ZXRhc2tzKToKKyAgICAgICAgICAgIGNvbnRlbnQgPSAiTm8gY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgKCVzIG9mICVzKSIgJSAoc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50LCBzZWxmLmhlbHBlci50YXNrbnVtYmVyX3RvdGFsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGVudCA9ICJDdXJyZW50bHkgJXMgcnVubmluZyB0YXNrcyAoJXMgb2YgJXMpOiIgJSAobGVuKGFjdGl2ZXRhc2tzKSwgc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50LCBzZWxmLmhlbHBlci50YXNrbnVtYmVyX3RvdGFsKQorICAgICAgICBwcmludChjb250ZW50KQorICAgICAgICBsaW5lcyA9IDEgKyBpbnQobGVuKGNvbnRlbnQpIC8gKHNlbGYuY29sdW1ucyArIDEpKQorICAgICAgICBmb3IgdGFza251bSwgdGFzayBpbiBlbnVtZXJhdGUodGFza3MpOgorICAgICAgICAgICAgY29udGVudCA9ICIlczogJXMiICUgKHRhc2tudW0sIHRhc2spCisgICAgICAgICAgICBwcmludChjb250ZW50KQorICAgICAgICAgICAgbGluZXMgPSBsaW5lcyArIDEgKyBpbnQobGVuKGNvbnRlbnQpIC8gKHNlbGYuY29sdW1ucyArIDEpKQorICAgICAgICBzZWxmLmZvb3Rlcl9wcmVzZW50ID0gbGluZXMKKyAgICAgICAgc2VsZi5sYXN0cGlkcyA9IHJ1bm5pbmdwaWRzWzpdCisgICAgICAgIHNlbGYubGFzdGNvdW50ID0gc2VsZi5oZWxwZXIudGFza251bWJlcl9jdXJyZW50CisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0ZGluYmFja3VwOgorICAgICAgICAgICAgZmQgPSBzeXMuc3RkaW4uZmlsZW5vKCkKKyAgICAgICAgICAgIHNlbGYudGVybWlvcy50Y3NldGF0dHIoZmQsIHNlbGYudGVybWlvcy5UQ1NBRFJBSU4sIHNlbGYuc3RkaW5iYWNrdXApCisKK2RlZiBfbG9nX3NldHRpbmdzX2Zyb21fc2VydmVyKHNlcnZlcik6CisgICAgIyBHZXQgdmFsdWVzIG9mIHZhcmlhYmxlcyB3aGljaCBjb250cm9sIG91ciBvdXRwdXQKKyAgICBpbmNsdWRlbG9ncywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCSU5DTFVERUxPR1MiXSkKKyAgICBpZiBlcnJvcjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQklOQ0xVREVMT0dTIHZhcmlhYmxlOiAlcyIgJSBlcnJvcikKKyAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKyAgICBsb2dsaW5lcywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCSU5DTFVERUxPR1NfTElORVMiXSkKKyAgICBpZiBlcnJvcjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQklOQ0xVREVMT0dTX0xJTkVTIHZhcmlhYmxlOiAlcyIgJSBlcnJvcikKKyAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKyAgICBjb25zb2xlbG9nZmlsZSwgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCX0NPTlNPTEVMT0ciXSkKKyAgICBpZiBlcnJvcjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQl9DT05TT0xFTE9HIHZhcmlhYmxlOiAlcyIgJSBlcnJvcikKKyAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKyAgICByZXR1cm4gaW5jbHVkZWxvZ3MsIGxvZ2xpbmVzLCBjb25zb2xlbG9nZmlsZQorCitfZXZ0X2xpc3QgPSBbICJiYi5ydW5xdWV1ZS5ydW5RdWV1ZUV4aXRXYWl0IiwgImJiLmV2ZW50LkxvZ0V4ZWNUVFkiLCAibG9nZ2luZy5Mb2dSZWNvcmQiLAorICAgICAgICAgICAgICAiYmIuYnVpbGQuVGFza0ZhaWxlZCIsICJiYi5idWlsZC5UYXNrQmFzZSIsICJiYi5ldmVudC5QYXJzZVN0YXJ0ZWQiLAorICAgICAgICAgICAgICAiYmIuZXZlbnQuUGFyc2VQcm9ncmVzcyIsICJiYi5ldmVudC5QYXJzZUNvbXBsZXRlZCIsICJiYi5ldmVudC5DYWNoZUxvYWRTdGFydGVkIiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50LkNhY2hlTG9hZFByb2dyZXNzIiwgImJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCIsICJiYi5jb21tYW5kLkNvbW1hbmRGYWlsZWQiLAorICAgICAgICAgICAgICAiYmIuY29tbWFuZC5Db21tYW5kRXhpdCIsICJiYi5jb21tYW5kLkNvbW1hbmRDb21wbGV0ZWQiLCAgImJiLmNvb2tlci5Db29rZXJFeGl0IiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzIiwgImJiLmV2ZW50Lk5vUHJvdmlkZXIiLCAiYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkIiwKKyAgICAgICAgICAgICAgImJiLnJ1bnF1ZXVlLnJ1blF1ZXVlVGFza1N0YXJ0ZWQiLCAiYmIucnVucXVldWUucnVuUXVldWVUYXNrRmFpbGVkIiwgImJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkIiwKKyAgICAgICAgICAgICAgImJiLmV2ZW50LkJ1aWxkQmFzZSIsICJiYi5idWlsZC5UYXNrU3RhcnRlZCIsICJiYi5idWlsZC5UYXNrU3VjY2VlZGVkIiwgImJiLmJ1aWxkLlRhc2tGYWlsZWRTaWxlbnQiXQorCitkZWYgbWFpbihzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgcGFyYW1zLCB0ZiA9IFRlcm1pbmFsRmlsdGVyKToKKworICAgIGluY2x1ZGVsb2dzLCBsb2dsaW5lcywgY29uc29sZWxvZ2ZpbGUgPSBfbG9nX3NldHRpbmdzX2Zyb21fc2VydmVyKHNlcnZlcikKKworICAgIGlmIHN5cy5zdGRpbi5pc2F0dHkoKSBhbmQgc3lzLnN0ZG91dC5pc2F0dHkoKToKKyAgICAgICAgbG9nX2V4ZWNfdHR5ID0gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIGxvZ19leGVjX3R0eSA9IEZhbHNlCisKKyAgICBoZWxwZXIgPSB1aWhlbHBlci5CQlVJSGVscGVyKCkKKworICAgIGNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkKKyAgICBlcnJjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRlcnIpCisgICAgZm9ybWF0X3N0ciA9ICIlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICBmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoZm9ybWF0X3N0cikKKyAgICBiYi5tc2cuYWRkRGVmYXVsdGxvZ0ZpbHRlcihjb25zb2xlLCBiYi5tc2cuQkJMb2dGaWx0ZXJTdGRPdXQpCisgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoZXJyY29uc29sZSwgYmIubXNnLkJCTG9nRmlsdGVyU3RkRXJyKQorICAgIGNvbnNvbGUuc2V0Rm9ybWF0dGVyKGZvcm1hdCkKKyAgICBlcnJjb25zb2xlLnNldEZvcm1hdHRlcihmb3JtYXQpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZSkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihlcnJjb25zb2xlKQorCisgICAgaWYgcGFyYW1zLm9wdGlvbnMucmVtb3RlX3NlcnZlciBhbmQgcGFyYW1zLm9wdGlvbnMua2lsbF9zZXJ2ZXI6CisgICAgICAgIHNlcnZlci50ZXJtaW5hdGVTZXJ2ZXIoKQorICAgICAgICByZXR1cm4KKworICAgIGlmIGNvbnNvbGVsb2dmaWxlIGFuZCBub3QgcGFyYW1zLm9wdGlvbnMuc2hvd19lbnZpcm9ubWVudCBhbmQgbm90IHBhcmFtcy5vcHRpb25zLnNob3dfdmVyc2lvbnM6CisgICAgICAgIGJiLnV0aWxzLm1rZGlyaGllcihvcy5wYXRoLmRpcm5hbWUoY29uc29sZWxvZ2ZpbGUpKQorICAgICAgICBjb25sb2dmb3JtYXQgPSBiYi5tc2cuQkJMb2dGb3JtYXR0ZXIoZm9ybWF0X3N0cikKKyAgICAgICAgY29uc29sZWxvZyA9IGxvZ2dpbmcuRmlsZUhhbmRsZXIoY29uc29sZWxvZ2ZpbGUpCisgICAgICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGVsb2cpCisgICAgICAgIGNvbnNvbGVsb2cuc2V0Rm9ybWF0dGVyKGNvbmxvZ2Zvcm1hdCkKKyAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoY29uc29sZWxvZykKKworICAgIGxsZXZlbCwgZGVidWdfZG9tYWlucyA9IGJiLm1zZy5jb25zdHJ1Y3RMb2dPcHRpb25zKCkKKyAgICBzZXJ2ZXIucnVuQ29tbWFuZChbInNldEV2ZW50TWFzayIsIHNlcnZlci5nZXRFdmVudEhhbmRsZSgpLCBsbGV2ZWwsIGRlYnVnX2RvbWFpbnMsIF9ldnRfbGlzdF0pCisKKyAgICBpZiBub3QgcGFyYW1zLm9ic2VydmVfb25seToKKyAgICAgICAgcGFyYW1zLnVwZGF0ZUZyb21TZXJ2ZXIoc2VydmVyKQorICAgICAgICBwYXJhbXMudXBkYXRlVG9TZXJ2ZXIoc2VydmVyLCBvcy5lbnZpcm9uLmNvcHkoKSkKKyAgICAgICAgY21kbGluZSA9IHBhcmFtcy5wYXJzZUFjdGlvbnMoKQorICAgICAgICBpZiBub3QgY21kbGluZToKKyAgICAgICAgICAgIHByaW50KCJOb3RoaW5nIHRvIGRvLiAgVXNlICdiaXRiYWtlIHdvcmxkJyB0byBidWlsZCBldmVyeXRoaW5nLCBvciBydW4gJ2JpdGJha2UgLS1oZWxwJyBmb3IgdXNhZ2UgaW5mb3JtYXRpb24uIikKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGlmICdtc2cnIGluIGNtZGxpbmUgYW5kIGNtZGxpbmVbJ21zZyddOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGNtZGxpbmVbJ21zZyddKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICByZXQsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoY21kbGluZVsnYWN0aW9uJ10pCisgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb21tYW5kICclcycgZmFpbGVkOiAlcyIgJSAoY21kbGluZSwgZXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxpZiByZXQgIT0gVHJ1ZToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ29tbWFuZCAnJXMnIGZhaWxlZDogcmV0dXJuZWQgJXMiICUgKGNtZGxpbmUsIHJldCkpCisgICAgICAgICAgICByZXR1cm4gMQorCisKKyAgICBwYXJzZXByb2dyZXNzID0gTm9uZQorICAgIGNhY2hlcHJvZ3Jlc3MgPSBOb25lCisgICAgbWFpbi5zaHV0ZG93biA9IDAKKyAgICBpbnRlcnJ1cHRlZCA9IEZhbHNlCisgICAgcmV0dXJuX3ZhbHVlID0gMAorICAgIGVycm9ycyA9IDAKKyAgICB3YXJuaW5ncyA9IDAKKyAgICB0YXNrZmFpbHVyZXMgPSBbXQorCisgICAgdGVybWZpbHRlciA9IHRmKG1haW4sIGhlbHBlciwgY29uc29sZSwgZXJyY29uc29sZSwgZm9ybWF0KQorICAgIGF0ZXhpdC5yZWdpc3Rlcih0ZXJtZmlsdGVyLmZpbmlzaCkKKworICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRIYW5kbGVyLndhaXRFdmVudCgwKQorICAgICAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBtYWluLnNodXRkb3duID4gMToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0ZXJtZmlsdGVyLnVwZGF0ZUZvb3RlcigpCisgICAgICAgICAgICAgICAgZXZlbnQgPSBldmVudEhhbmRsZXIud2FpdEV2ZW50KDAuMjUpCisgICAgICAgICAgICAgICAgaWYgZXZlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGhlbHBlci5ldmVudEhhbmRsZXIoZXZlbnQpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZUV4aXRXYWl0KToKKyAgICAgICAgICAgICAgICBpZiBub3QgbWFpbi5zaHV0ZG93bjoKKyAgICAgICAgICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTG9nRXhlY1RUWSk6CisgICAgICAgICAgICAgICAgaWYgbG9nX2V4ZWNfdHR5OgorICAgICAgICAgICAgICAgICAgICB0cmllcyA9IGV2ZW50LnJldHJpZXMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgdHJpZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiVHJ5aW5nIHRvIHJ1bjogJXMiICUgZXZlbnQucHJvZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnN5c3RlbShldmVudC5wcm9nKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKGV2ZW50LnNsZWVwX2RlbGF5KQorICAgICAgICAgICAgICAgICAgICAgICAgdHJpZXMgLT0gMQorICAgICAgICAgICAgICAgICAgICBpZiB0cmllczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oZXZlbnQubXNnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5vID49IGZvcm1hdC5FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICsgMQorICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAxCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC5sZXZlbG5vID09IGZvcm1hdC5XQVJOSU5HOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IHdhcm5pbmdzICsgMQorICAgICAgICAgICAgICAgICMgRm9yICJub3JtYWwiIGxvZ2dpbmcgY29uZGl0aW9ucywgZG9uJ3Qgc2hvdyBub3RlIGxvZ3MgZnJvbSB0YXNrcworICAgICAgICAgICAgICAgICMgYnV0IGRvIHNob3cgdGhlbSBpZiB0aGUgdXNlciBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBsb2cgbGV2ZWwgdG8KKyAgICAgICAgICAgICAgICAjIGluY2x1ZGUgdmVyYm9zZS9kZWJ1ZyBtZXNzYWdlcworICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRhc2twaWQgIT0gMCBhbmQgZXZlbnQubGV2ZWxubyA8PSBmb3JtYXQuTk9URSBhbmQgKGV2ZW50LmxldmVsbm8gPCBsbGV2ZWwgb3IgKGV2ZW50LmxldmVsbm8gPT0gZm9ybWF0Lk5PVEUgYW5kIGxsZXZlbCAhPSBmb3JtYXQuVkVSQk9TRSkpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGUoZXZlbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0ZhaWxlZFNpbGVudCk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkxvZ2ZpbGUgZm9yIGZhaWxlZCBzZXRzY2VuZSB0YXNrIGlzICVzIiAlIGV2ZW50LmxvZ2ZpbGUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tGYWlsZWQpOgorICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDEKKyAgICAgICAgICAgICAgICBsb2dmaWxlID0gZXZlbnQubG9nZmlsZQorICAgICAgICAgICAgICAgIGlmIGxvZ2ZpbGUgYW5kIG9zLnBhdGguZXhpc3RzKGxvZ2ZpbGUpOgorICAgICAgICAgICAgICAgICAgICB0ZXJtZmlsdGVyLmNsZWFyRm9vdGVyKCkKKyAgICAgICAgICAgICAgICAgICAgYmIuZXJyb3IoIkxvZ2ZpbGUgb2YgZmFpbHVyZSBzdG9yZWQgaW46ICVzIiAlIGxvZ2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIGluY2x1ZGVsb2dzIGFuZCBub3QgZXZlbnQuZXJycHJpbnRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCJMb2cgZGF0YSBmb2xsb3dzOiIpCisgICAgICAgICAgICAgICAgICAgICAgICBmID0gb3Blbihsb2dmaWxlLCAiciIpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbG9nbGluZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnIHwgJXMnICUgbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmVzKSA+IGludChsb2dsaW5lcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnfCAlcycgJSBsKQorICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQobGluZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tCYXNlKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudC5fbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VTdGFydGVkKToKKyAgICAgICAgICAgICAgICBpZiBldmVudC50b3RhbCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3MgPSBuZXdfcHJvZ3Jlc3MoIlBhcnNpbmcgcmVjaXBlcyIsIGV2ZW50LnRvdGFsKS5zdGFydCgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlUHJvZ3Jlc3MpOgorICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3MudXBkYXRlKGV2ZW50LmN1cnJlbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlQ29tcGxldGVkKToKKyAgICAgICAgICAgICAgICBpZiBub3QgcGFyc2Vwcm9ncmVzczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHBhcnNlcHJvZ3Jlc3MuZmluaXNoKCkKKyAgICAgICAgICAgICAgICBwcmludCgoIlBhcnNpbmcgb2YgJWQgLmJiIGZpbGVzIGNvbXBsZXRlICglZCBjYWNoZWQsICVkIHBhcnNlZCkuICVkIHRhcmdldHMsICVkIHNraXBwZWQsICVkIG1hc2tlZCwgJWQgZXJyb3JzLiIKKyAgICAgICAgICAgICAgICAgICAgJSAoIGV2ZW50LnRvdGFsLCBldmVudC5jYWNoZWQsIGV2ZW50LnBhcnNlZCwgZXZlbnQudmlydHVhbHMsIGV2ZW50LnNraXBwZWQsIGV2ZW50Lm1hc2tlZCwgZXZlbnQuZXJyb3JzKSkpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgY2FjaGVwcm9ncmVzcyA9IG5ld19wcm9ncmVzcygiTG9hZGluZyBjYWNoZSIsIGV2ZW50LnRvdGFsKS5zdGFydCgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFByb2dyZXNzKToKKyAgICAgICAgICAgICAgICBjYWNoZXByb2dyZXNzLnVwZGF0ZShldmVudC5jdXJyZW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRDb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgIGNhY2hlcHJvZ3Jlc3MuZmluaXNoKCkKKyAgICAgICAgICAgICAgICBwcmludCgiTG9hZGVkICVkIGVudHJpZXMgZnJvbSBkZXBlbmRlbmN5IGNhY2hlLiIgJSBldmVudC5udW1fZW50cmllcykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb21tYW5kLkNvbW1hbmRGYWlsZWQpOgorICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IGV2ZW50LmV4aXRjb2RlCisgICAgICAgICAgICAgICAgaWYgZXZlbnQuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyArIDEKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQ6ICVzIiwgZXZlbnQuZXJyb3IpCisgICAgICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuY29tbWFuZC5Db21tYW5kRXhpdCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHJldHVybl92YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gZXZlbnQuZXhpdGNvZGUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCwgYmIuY29va2VyLkNvb2tlckV4aXQpKToKKyAgICAgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5NdWx0aXBsZVByb3ZpZGVycyk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm11bHRpcGxlIHByb3ZpZGVycyBhcmUgYXZhaWxhYmxlIGZvciAlcyVzICglcykiLCBldmVudC5faXNfcnVudGltZSBhbmQgInJ1bnRpbWUgIiBvciAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5faXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiLmpvaW4oZXZlbnQuX2NhbmRpZGF0ZXMpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjb25zaWRlciBkZWZpbmluZyBhIFBSRUZFUlJFRF9QUk9WSURFUiBlbnRyeSB0byBtYXRjaCAlcyIsIGV2ZW50Ll9pdGVtKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Ob1Byb3ZpZGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAxCisgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICsgMQorICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9ydW50aW1lOgorICAgICAgICAgICAgICAgICAgICByID0gIlIiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgciA9ICIiCisKKyAgICAgICAgICAgICAgICBleHRyYSA9ICcnCisgICAgICAgICAgICAgICAgaWYgbm90IGV2ZW50Ll9yZWFzb25zOgorICAgICAgICAgICAgICAgICAgICBpZiBldmVudC5fY2xvc2VfbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gIi4gQ2xvc2UgbWF0Y2hlczpcbiAgJXMiICUgJ1xuICAnLmpvaW4oZXZlbnQuX2Nsb3NlX21hdGNoZXMpCisKKyAgICAgICAgICAgICAgICBpZiBldmVudC5fZGVwZW5kZWVzOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIk5vdGhpbmcgJXNQUk9WSURFUyAnJXMnIChidXQgJXMgJXNERVBFTkRTIG9uIG9yIG90aGVyd2lzZSByZXF1aXJlcyBpdCklcyIsIHIsIGV2ZW50Ll9pdGVtLCAiLCAiLmpvaW4oZXZlbnQuX2RlcGVuZGVlcyksIHIsIGV4dHJhKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiTm90aGluZyAlc1BST1ZJREVTICclcyclcyIsIHIsIGV2ZW50Ll9pdGVtLCBleHRyYSkKKyAgICAgICAgICAgICAgICBpZiBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHJlYXNvbiBpbiBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiJXMiLCByZWFzb24pCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUnVubmluZyBzZXRzY2VuZSB0YXNrICVkIG9mICVkICglcykiICUgKGV2ZW50LnN0YXRzLmNvbXBsZXRlZCArIGV2ZW50LnN0YXRzLmFjdGl2ZSArIGV2ZW50LnN0YXRzLmZhaWxlZCArIDEsIGV2ZW50LnN0YXRzLnRvdGFsLCBldmVudC50YXNrc3RyaW5nKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTdGFydGVkKToKKyAgICAgICAgICAgICAgICBpZiBldmVudC5ub2V4ZWM6CisgICAgICAgICAgICAgICAgICAgIHRhc2t0eXBlID0gJ25vZXhlYyB0YXNrJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRhc2t0eXBlID0gJ3Rhc2snCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJ1bm5pbmcgJXMgJXMgb2YgJXMgKElEOiAlcywgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdGF0cy5jb21wbGV0ZWQgKyBldmVudC5zdGF0cy5hY3RpdmUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdGF0cy5mYWlsZWQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0YXRzLnRvdGFsLCBldmVudC50YXNraWQsIGV2ZW50LnRhc2tzdHJpbmcpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUucnVuUXVldWVUYXNrRmFpbGVkKToKKyAgICAgICAgICAgICAgICB0YXNrZmFpbHVyZXMuYXBwZW5kKGV2ZW50LnRhc2tzdHJpbmcpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJUYXNrICVzICglcykgZmFpbGVkIHdpdGggZXhpdCBjb2RlICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXNraWQsIGV2ZW50LnRhc2tzdHJpbmcsIGV2ZW50LmV4aXRjb2RlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrRmFpbGVkKToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiU2V0c2NlbmUgdGFzayAlcyAoJXMpIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAnJXMnIC0gcmVhbCB0YXNrIHdpbGwgYmUgcnVuIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXNraWQsIGV2ZW50LnRhc2tzdHJpbmcsIGV2ZW50LmV4aXRjb2RlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkRlcFRyZWVHZW5lcmF0ZWQpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgaWdub3JlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuQnVpbGRCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk1ldGFkYXRhRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuU3RhbXBVcGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuQ29uZmlnUGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LlJlY2lwZVBhcnNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5SZWNpcGVQcmVGaW5hbGlzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ydW5xdWV1ZS5ydW5RdWV1ZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJhdGlvblN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXZlbnQuT3BlcmF0aW9uQ29tcGxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50Lk9wZXJhdGlvblByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LkRpc2tGdWxsKSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmtub3duIGV2ZW50OiAlcyIsIGV2ZW50KQorCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGlvZXJyb3I6CisgICAgICAgICAgICB0ZXJtZmlsdGVyLmNsZWFyRm9vdGVyKCkKKyAgICAgICAgICAgICMgaWdub3JlIGludGVycnVwdGVkIGlvCisgICAgICAgICAgICBpZiBpb2Vycm9yLmFyZ3NbMF0gPT0gNDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzdHIoaW9lcnJvcikpCisgICAgICAgICAgICBpZiBub3QgcGFyYW1zLm9ic2VydmVfb25seToKKyAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3duIl0pCisgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICB0ZXJtZmlsdGVyLmNsZWFyRm9vdGVyKCkKKyAgICAgICAgICAgIGlmIHBhcmFtcy5vYnNlcnZlX29ubHk6CisgICAgICAgICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgSW50ZXJydXB0LCBleGl0aW5nIG9ic2VydmVyLi4uIikKKyAgICAgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMgorICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5vYnNlcnZlX29ubHkgYW5kIG1haW4uc2h1dGRvd24gPT0gMToKKyAgICAgICAgICAgICAgICBwcmludCgiXG5TZWNvbmQgS2V5Ym9hcmQgSW50ZXJydXB0LCBzdG9wcGluZy4uLlxuIikKKyAgICAgICAgICAgICAgICBfLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsic3RhdGVGb3JjZVNodXRkb3duIl0pCisgICAgICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIGNsZWFubHkgc3RvcDogJXMiICUgZXJyb3IpCisgICAgICAgICAgICBpZiBub3QgcGFyYW1zLm9ic2VydmVfb25seSBhbmQgbWFpbi5zaHV0ZG93biA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIEludGVycnVwdCwgY2xvc2luZyBkb3duLi4uXG4iKQorICAgICAgICAgICAgICAgIGludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZVNodXRkb3duIl0pCisgICAgICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIGNsZWFubHkgc2h1dGRvd246ICVzIiAlIGVycm9yKQorICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IG1haW4uc2h1dGRvd24gKyAxCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKGUpKQorICAgICAgICAgICAgaWYgbm90IHBhcmFtcy5vYnNlcnZlX29ubHk6CisgICAgICAgICAgICAgICAgXywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbInN0YXRlRm9yY2VTaHV0ZG93biJdKQorICAgICAgICAgICAgbWFpbi5zaHV0ZG93biA9IDIKKyAgICB0cnk6CisgICAgICAgIHN1bW1hcnkgPSAiIgorICAgICAgICBpZiB0YXNrZmFpbHVyZXM6CisgICAgICAgICAgICBzdW1tYXJ5ICs9IHBsdXJhbGlzZSgiXG5TdW1tYXJ5OiAlcyB0YXNrIGZhaWxlZDoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuU3VtbWFyeTogJXMgdGFza3MgZmFpbGVkOiIsIGxlbih0YXNrZmFpbHVyZXMpKQorICAgICAgICAgICAgZm9yIGZhaWx1cmUgaW4gdGFza2ZhaWx1cmVzOgorICAgICAgICAgICAgICAgIHN1bW1hcnkgKz0gIlxuICAlcyIgJSBmYWlsdXJlCisgICAgICAgIGlmIHdhcm5pbmdzOgorICAgICAgICAgICAgc3VtbWFyeSArPSBwbHVyYWxpc2UoIlxuU3VtbWFyeTogVGhlcmUgd2FzICVzIFdBUk5JTkcgbWVzc2FnZSBzaG93bi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuU3VtbWFyeTogVGhlcmUgd2VyZSAlcyBXQVJOSU5HIG1lc3NhZ2VzIHNob3duLiIsIHdhcm5pbmdzKQorICAgICAgICBpZiByZXR1cm5fdmFsdWUgYW5kIGVycm9yczoKKyAgICAgICAgICAgIHN1bW1hcnkgKz0gcGx1cmFsaXNlKCJcblN1bW1hcnk6IFRoZXJlIHdhcyAlcyBFUlJPUiBtZXNzYWdlIHNob3duLCByZXR1cm5pbmcgYSBub24temVybyBleGl0IGNvZGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblN1bW1hcnk6IFRoZXJlIHdlcmUgJXMgRVJST1IgbWVzc2FnZXMgc2hvd24sIHJldHVybmluZyBhIG5vbi16ZXJvIGV4aXQgY29kZS4iLCBlcnJvcnMpCisgICAgICAgIGlmIHN1bW1hcnk6CisgICAgICAgICAgICBwcmludChzdW1tYXJ5KQorCisgICAgICAgIGlmIGludGVycnVwdGVkOgorICAgICAgICAgICAgcHJpbnQoIkV4ZWN1dGlvbiB3YXMgaW50ZXJydXB0ZWQsIHJldHVybmluZyBhIG5vbi16ZXJvIGV4aXQgY29kZS4iKQorICAgICAgICAgICAgaWYgcmV0dXJuX3ZhbHVlID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMQorICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgIGltcG9ydCBlcnJubworICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVQSVBFOgorICAgICAgICAgICAgcGFzcworCisgICAgcmV0dXJuIHJldHVybl92YWx1ZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvbmN1cnNlcy5weSBiL2JpdGJha2UvbGliL2JiL3VpL25jdXJzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4OWE3NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL25jdXJzZXMucHkKQEAgLTAsMCArMSwzNzMgQEAKKyMKKyMgQml0QmFrZSBDdXJzZXMgVUkgSW1wbGVtZW50YXRpb24KKyMKKyMgSW1wbGVtZW50cyBhbiBuY3Vyc2VzIGZyb250ZW5kIGZvciB0aGUgQml0QmFrZSB1dGlsaXR5LgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIiIiCisgICAgV2UgaGF2ZSB0aGUgZm9sbG93aW5nIHdpbmRvd3M6CisKKyAgICAgICAgMS4pIE1haW4gV2luZG93OiBTaG93cyB3aGF0IHdlIGFyZSB1bHRpbWF0ZWx5IGJ1aWxkaW5nIGFuZCBob3cgZmFyIHdlIGFyZS4gSW5jbHVkZXMgc3RhdHVzIGJhcgorICAgICAgICAyLikgVGhyZWFkIEFjdGl2aXR5IFdpbmRvdzogU2hvd3Mgb25lIHN0YXR1cyBsaW5lIGZvciBldmVyeSBjb25jdXJyZW50IGJpdGJha2UgdGhyZWFkLgorICAgICAgICAzLikgQ29tbWFuZCBMaW5lIFdpbmRvdzogQ29udGFpbnMgYW4gaW50ZXJhY3RpdmUgY29tbWFuZCBsaW5lIHdoZXJlIHlvdSBjYW4gaW50ZXJhY3Qgdy8gQml0YmFrZS4KKworICAgIEJhc2ljIHdpbmRvdyBsYXlvdXQgaXMgbGlrZSB0aGF0OgorCisgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgIHwgPE1haW4gV2luZG93PiAgICAgICAgICAgICAgIHwgPFRocmVhZCBBY3Rpdml0eSBXaW5kb3c+ICB8CisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDogZm9vIGRvX2NvbXBpbGUgY29tcGxldGV8CisgICAgICAgIHwgQnVpbGRpbmcgR3RrKy0yLjYuMTAgICAgICAgIHwgMTogYmFyIGRvX3BhdGNoIGNvbXBsZXRlICB8CisgICAgICAgIHwgU3RhdHVzOiA2MCUgICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICAgIHw8Q29tbWFuZCBMaW5lIFdpbmRvdz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHw+Pj4gd2hpY2ggdmlydHVhbC9rZXJuZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHxvcGVuemF1cnVzLWtlcm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHw+Pj4gXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKKyIiIgorCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MsIHN5cywgaXRlcnRvb2xzLCB0aW1lLCBzdWJwcm9jZXNzCisKK3RyeToKKyAgICBpbXBvcnQgY3Vyc2VzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgc3lzLmV4aXQoIkZBVEFMOiBUaGUgbmN1cnNlcyB1aSBjb3VsZCBub3QgbG9hZCB0aGUgcmVxdWlyZWQgY3Vyc2VzIHB5dGhvbiBtb2R1bGUuIikKKworaW1wb3J0IGJiCitpbXBvcnQgeG1scnBjbGliCitmcm9tIGJiIGltcG9ydCB1aQorZnJvbSBiYi51aSBpbXBvcnQgdWloZWxwZXIKKworcGFyc2VzcGluID0gaXRlcnRvb2xzLmN5Y2xlKCByJ3wvLVxcJyApCisKK1ggPSAwCitZID0gMQorV0lEVEggPSAyCitIRUlHSFQgPSAzCisKK01BWFNUQVRVU0xFTkdUSCA9IDMyCisKK2NsYXNzIE5DdXJzZXNVSToKKyAgICAiIiIKKyAgICBOQ3Vyc2VzIFVJIENsYXNzCisgICAgIiIiCisgICAgY2xhc3MgV2luZG93OgorICAgICAgICAiIiJCYXNlIFdpbmRvdyBDbGFzcyIiIgorICAgICAgICBkZWYgX19pbml0X18oIHNlbGYsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZnPWN1cnNlcy5DT0xPUl9CTEFDSywgYmc9Y3Vyc2VzLkNPTE9SX1dISVRFICk6CisgICAgICAgICAgICBzZWxmLndpbiA9IGN1cnNlcy5uZXd3aW4oIGhlaWdodCwgd2lkdGgsIHksIHggKQorICAgICAgICAgICAgc2VsZi5kaW1lbnNpb25zID0gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgY3Vyc2VzLmhhc19jb2xvcnMoKToKKyAgICAgICAgICAgICAgICBjb2xvciA9IDEKKyAgICAgICAgICAgICAgICBjdXJzZXMuaW5pdF9wYWlyKCBjb2xvciwgZmcsIGJnICkKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5ia2dkc2V0KCBvcmQoJyAnKSwgY3Vyc2VzLmNvbG9yX3BhaXIoY29sb3IpICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53aW4uYmtnZHNldCggb3JkKCcgJyksIGN1cnNlcy5BX0JPTEQgKQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLmVyYXNlKCkKKyAgICAgICAgICAgIHNlbGYuc2V0U2Nyb2xsaW5nKCkKKyAgICAgICAgICAgIHNlbGYud2luLm5vdXRyZWZyZXNoKCkKKworICAgICAgICBkZWYgZXJhc2UoIHNlbGYgKToKKyAgICAgICAgICAgIHNlbGYud2luLmVyYXNlKCkKKworICAgICAgICBkZWYgc2V0U2Nyb2xsaW5nKCBzZWxmLCBiID0gVHJ1ZSApOgorICAgICAgICAgICAgc2VsZi53aW4uc2Nyb2xsb2soIGIgKQorICAgICAgICAgICAgc2VsZi53aW4uaWRsb2soIGIgKQorCisgICAgICAgIGRlZiBzZXRCb3hlZCggc2VsZiApOgorICAgICAgICAgICAgc2VsZi5ib3hlZCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYud2luLmJveCgpCisgICAgICAgICAgICBzZWxmLndpbi5ub3V0cmVmcmVzaCgpCisKKyAgICAgICAgZGVmIHNldFRleHQoIHNlbGYsIHgsIHksIHRleHQsICphcmdzICk6CisgICAgICAgICAgICBzZWxmLndpbi5hZGRzdHIoIHksIHgsIHRleHQsICphcmdzICkKKyAgICAgICAgICAgIHNlbGYud2luLm5vdXRyZWZyZXNoKCkKKworICAgICAgICBkZWYgYXBwZW5kVGV4dCggc2VsZiwgdGV4dCwgKmFyZ3MgKToKKyAgICAgICAgICAgIHNlbGYud2luLmFkZHN0ciggdGV4dCwgKmFyZ3MgKQorICAgICAgICAgICAgc2VsZi53aW4ubm91dHJlZnJlc2goKQorCisgICAgICAgIGRlZiBkcmF3SGxpbmUoIHNlbGYsIHkgKToKKyAgICAgICAgICAgIHNlbGYud2luLmhsaW5lKCB5LCAwLCBjdXJzZXMuQUNTX0hMSU5FLCBzZWxmLmRpbWVuc2lvbnNbV0lEVEhdICkKKyAgICAgICAgICAgIHNlbGYud2luLm5vdXRyZWZyZXNoKCkKKworICAgIGNsYXNzIERlY29yYXRlZFdpbmRvdyggV2luZG93ICk6CisgICAgICAgICIiIkJhc2UgY2xhc3MgZm9yIHdpbmRvd3Mgd2l0aCBhIGJveCBhbmQgYSB0aXRsZSBiYXIiIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKCBzZWxmLCB0aXRsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmc9Y3Vyc2VzLkNPTE9SX0JMQUNLLCBiZz1jdXJzZXMuQ09MT1JfV0hJVEUgKToKKyAgICAgICAgICAgIE5DdXJzZXNVSS5XaW5kb3cuX19pbml0X18oIHNlbGYsIHgrMSwgeSszLCB3aWR0aC0yLCBoZWlnaHQtNCwgZmcsIGJnICkKKyAgICAgICAgICAgIHNlbGYuZGVjb3JhdGlvbiA9IE5DdXJzZXNVSS5XaW5kb3coIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZnLCBiZyApCisgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24uc2V0Qm94ZWQoKQorICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uLndpbi5obGluZSggMiwgMSwgY3Vyc2VzLkFDU19ITElORSwgd2lkdGgtMiApCisgICAgICAgICAgICBzZWxmLnNldFRpdGxlKCB0aXRsZSApCisKKyAgICAgICAgZGVmIHNldFRpdGxlKCBzZWxmLCB0aXRsZSApOgorICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uLnNldFRleHQoIDEsIDEsIHRpdGxlLmNlbnRlciggc2VsZi5kaW1lbnNpb25zW1dJRFRIXS0yICksIGN1cnNlcy5BX0JPTEQgKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjICAgIGNsYXNzIFRpdGxlV2luZG93KCBXaW5kb3cgKToKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMgICAgICAgICIiIlRpdGxlIFdpbmRvdyIiIgorIyAgICAgICAgZGVmIF9faW5pdF9fKCBzZWxmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk6CisjICAgICAgICAgICAgTkN1cnNlc1VJLldpbmRvdy5fX2luaXRfXyggc2VsZiwgeCwgeSwgd2lkdGgsIGhlaWdodCApCisjICAgICAgICAgICAgdmVyc2lvbiA9IGJiLl9fdmVyc2lvbl9fCisjICAgICAgICAgICAgdGl0bGUgPSAiQml0QmFrZSAlcyIgJSB2ZXJzaW9uCisjICAgICAgICAgICAgY3JlZGl0ID0gIihDKSAyMDAzLTIwMDcgVGVhbSBCaXRCYWtlIgorIyAgICAgICAgICAgICNzZWxmLndpbi5obGluZSggMiwgMSwgY3Vyc2VzLkFDU19ITElORSwgd2lkdGgtMiApCisjICAgICAgICAgICAgc2VsZi53aW4uYm9yZGVyKCkKKyMgICAgICAgICAgICBzZWxmLnNldFRleHQoIDEsIDEsIHRpdGxlLmNlbnRlciggc2VsZi5kaW1lbnNpb25zW1dJRFRIXS0yICksIGN1cnNlcy5BX0JPTEQgKQorIyAgICAgICAgICAgIHNlbGYuc2V0VGV4dCggMSwgMiwgY3JlZGl0LmNlbnRlciggc2VsZi5kaW1lbnNpb25zW1dJRFRIXS0yICksIGN1cnNlcy5BX0JPTEQgKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgY2xhc3MgVGhyZWFkQWN0aXZpdHlXaW5kb3coIERlY29yYXRlZFdpbmRvdyApOgorICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworICAgICAgICAiIiJUaHJlYWQgQWN0aXZpdHkgV2luZG93IiIiCisgICAgICAgIGRlZiBfX2luaXRfXyggc2VsZiwgeCwgeSwgd2lkdGgsIGhlaWdodCApOgorICAgICAgICAgICAgTkN1cnNlc1VJLkRlY29yYXRlZFdpbmRvdy5fX2luaXRfXyggc2VsZiwgIlRocmVhZCBBY3Rpdml0eSIsIHgsIHksIHdpZHRoLCBoZWlnaHQgKQorCisgICAgICAgIGRlZiBzZXRTdGF0dXMoIHNlbGYsIHRocmVhZCwgdGV4dCApOgorICAgICAgICAgICAgbGluZSA9ICIlMDJkOiAlcyIgJSAoIHRocmVhZCwgdGV4dCApCisgICAgICAgICAgICB3aWR0aCA9IHNlbGYuZGltZW5zaW9uc1tXSURUSF0KKyAgICAgICAgICAgIGlmICggbGVuKGxpbmUpID4gd2lkdGggKToKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6d2lkdGgtM10gKyAiLi4uIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5sanVzdCggd2lkdGggKQorICAgICAgICAgICAgc2VsZi5zZXRUZXh0KCAwLCB0aHJlYWQsIGxpbmUgKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgY2xhc3MgTWFpbldpbmRvdyggRGVjb3JhdGVkV2luZG93ICk6CisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgICAgICIiIk1haW4gV2luZG93IiIiCisgICAgICAgIGRlZiBfX2luaXRfXyggc2VsZiwgeCwgeSwgd2lkdGgsIGhlaWdodCApOgorICAgICAgICAgICAgc2VsZi5TdGF0dXNQb3NpdGlvbiA9IHdpZHRoIC0gTUFYU1RBVFVTTEVOR1RICisgICAgICAgICAgICBOQ3Vyc2VzVUkuRGVjb3JhdGVkV2luZG93Ll9faW5pdF9fKCBzZWxmLCBOb25lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkKKyAgICAgICAgICAgIGN1cnNlcy5ubCgpCisKKyAgICAgICAgZGVmIHNldFRpdGxlKCBzZWxmLCB0aXRsZSApOgorICAgICAgICAgICAgdGl0bGUgPSAiQml0QmFrZSAlcyIgJSBiYi5fX3ZlcnNpb25fXworICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uLnNldFRleHQoIDIsIDEsIHRpdGxlLCBjdXJzZXMuQV9CT0xEICkKKyAgICAgICAgICAgIHNlbGYuZGVjb3JhdGlvbi5zZXRUZXh0KCBzZWxmLlN0YXR1c1Bvc2l0aW9uIC0gOCwgMSwgIlN0YXR1czoiLCBjdXJzZXMuQV9CT0xEICkKKworICAgICAgICBkZWYgc2V0U3RhdHVzKHNlbGYsIHN0YXR1cyk6CisgICAgICAgICAgICB3aGlsZSBsZW4oc3RhdHVzKSA8IE1BWFNUQVRVU0xFTkdUSDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMgKyAiICIKKyAgICAgICAgICAgIHNlbGYuZGVjb3JhdGlvbi5zZXRUZXh0KCBzZWxmLlN0YXR1c1Bvc2l0aW9uLCAxLCBzdGF0dXMsIGN1cnNlcy5BX0JPTEQgKQorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICBjbGFzcyBTaGVsbE91dHB1dFdpbmRvdyggRGVjb3JhdGVkV2luZG93ICk6CisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgICAgICIiIkludGVyYWN0aXZlIENvbW1hbmQgTGluZSBPdXRwdXQiIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKCBzZWxmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk6CisgICAgICAgICAgICBOQ3Vyc2VzVUkuRGVjb3JhdGVkV2luZG93Ll9faW5pdF9fKCBzZWxmLCAiQ29tbWFuZCBMaW5lIFdpbmRvdyIsIHgsIHksIHdpZHRoLCBoZWlnaHQgKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgY2xhc3MgU2hlbGxJbnB1dFdpbmRvdyggV2luZG93ICk6CisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgICAgICIiIkludGVyYWN0aXZlIENvbW1hbmQgTGluZSBJbnB1dCIiIgorICAgICAgICBkZWYgX19pbml0X18oIHNlbGYsIHgsIHksIHdpZHRoLCBoZWlnaHQgKToKKyAgICAgICAgICAgIE5DdXJzZXNVSS5XaW5kb3cuX19pbml0X18oIHNlbGYsIHgsIHksIHdpZHRoLCBoZWlnaHQgKQorCisjIHB1dCB0aGF0IHRvIHRoZSB0b3AgYWdhaW4gZnJvbSBjdXJzZXMudGV4dHBhZCBpbXBvcnQgVGV4dGJveAorIyAgICAgICAgICAgIHNlbGYudGV4dGJveCA9IFRleHRib3goIHNlbGYud2luICkKKyMgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCgpCisjICAgICAgICAgICAgdC5ydW4gPSBzZWxmLnRleHRib3guZWRpdAorIyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisgICAgZGVmIG1haW4oc2VsZiwgc3Rkc2NyLCBzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgcGFyYW1zKToKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyAgICAgICAgaGVpZ2h0LCB3aWR0aCA9IHN0ZHNjci5nZXRtYXh5eCgpCisKKyAgICAgICAgIyBmb3Igbm93IHNwbGl0IGl0IGxpa2UgdGhhdDoKKyAgICAgICAgIyBNQUlOX3kgKyBUSFJFQURfeSA9IDIvMyBzY3JlZW4gYXQgdGhlIHRvcAorICAgICAgICAjIE1BSU5feCA9IDIvMyBsZWZ0LCBUSFJFQURfeSA9IDEvMyByaWdodAorICAgICAgICAjIENMSV95ID0gMS8zIG9mIHNjcmVlbiBhdCB0aGUgYm90dG9tCisgICAgICAgICMgQ0xJX3ggPSBmdWxsCisKKyAgICAgICAgbWFpbl9sZWZ0ID0gMAorICAgICAgICBtYWluX3RvcCA9IDAKKyAgICAgICAgbWFpbl9oZWlnaHQgPSAoIGhlaWdodCAvLyAzICogMiApCisgICAgICAgIG1haW5fd2lkdGggPSAoIHdpZHRoIC8vIDMgKSAqIDIKKyAgICAgICAgY2xvX2xlZnQgPSBtYWluX2xlZnQKKyAgICAgICAgY2xvX3RvcCA9IG1haW5fdG9wICsgbWFpbl9oZWlnaHQKKyAgICAgICAgY2xvX2hlaWdodCA9IGhlaWdodCAtIG1haW5faGVpZ2h0IC0gbWFpbl90b3AgLSAxCisgICAgICAgIGNsb193aWR0aCA9IHdpZHRoCisgICAgICAgIGNsaV9sZWZ0ID0gbWFpbl9sZWZ0CisgICAgICAgIGNsaV90b3AgPSBjbG9fdG9wICsgY2xvX2hlaWdodAorICAgICAgICBjbGlfaGVpZ2h0ID0gMQorICAgICAgICBjbGlfd2lkdGggPSB3aWR0aAorICAgICAgICB0aHJlYWRfbGVmdCA9IG1haW5fbGVmdCArIG1haW5fd2lkdGgKKyAgICAgICAgdGhyZWFkX3RvcCA9IG1haW5fdG9wCisgICAgICAgIHRocmVhZF9oZWlnaHQgPSBtYWluX2hlaWdodAorICAgICAgICB0aHJlYWRfd2lkdGggPSB3aWR0aCAtIG1haW5fd2lkdGgKKworICAgICAgICAjdHcgPSBzZWxmLlRpdGxlV2luZG93KCAwLCAwLCB3aWR0aCwgbWFpbl90b3AgKQorICAgICAgICBtdyA9IHNlbGYuTWFpbldpbmRvdyggbWFpbl9sZWZ0LCBtYWluX3RvcCwgbWFpbl93aWR0aCwgbWFpbl9oZWlnaHQgKQorICAgICAgICB0YXcgPSBzZWxmLlRocmVhZEFjdGl2aXR5V2luZG93KCB0aHJlYWRfbGVmdCwgdGhyZWFkX3RvcCwgdGhyZWFkX3dpZHRoLCB0aHJlYWRfaGVpZ2h0ICkKKyAgICAgICAgY2xvID0gc2VsZi5TaGVsbE91dHB1dFdpbmRvdyggY2xvX2xlZnQsIGNsb190b3AsIGNsb193aWR0aCwgY2xvX2hlaWdodCApCisgICAgICAgIGNsaSA9IHNlbGYuU2hlbGxJbnB1dFdpbmRvdyggY2xpX2xlZnQsIGNsaV90b3AsIGNsaV93aWR0aCwgY2xpX2hlaWdodCApCisgICAgICAgIGNsaS5zZXRUZXh0KCAwLCAwLCAiQkI+IiApCisKKyAgICAgICAgbXcuc2V0U3RhdHVzKCJJZGxlIikKKworICAgICAgICBoZWxwZXIgPSB1aWhlbHBlci5CQlVJSGVscGVyKCkKKyAgICAgICAgc2h1dGRvd24gPSAwCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyYW1zLnVwZGF0ZUZyb21TZXJ2ZXIoc2VydmVyKQorICAgICAgICAgICAgY21kbGluZSA9IHBhcmFtcy5wYXJzZUFjdGlvbnMoKQorICAgICAgICAgICAgaWYgbm90IGNtZGxpbmU6CisgICAgICAgICAgICAgICAgcHJpbnQoIk5vdGhpbmcgdG8gZG8uICBVc2UgJ2JpdGJha2Ugd29ybGQnIHRvIGJ1aWxkIGV2ZXJ5dGhpbmcsIG9yIHJ1biAnYml0YmFrZSAtLWhlbHAnIGZvciB1c2FnZSBpbmZvcm1hdGlvbi4iKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBpZiAnbXNnJyBpbiBjbWRsaW5lIGFuZCBjbWRsaW5lWydtc2cnXToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoY21kbGluZVsnbXNnJ10pCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGNtZGxpbmUgPSBjbWRsaW5lWydhY3Rpb24nXQorICAgICAgICAgICAgcmV0LCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKGNtZGxpbmUpCisgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCgiRXJyb3IgcnVubmluZyBjb21tYW5kICclcyc6ICVzIiAlIChjbWRsaW5lLCBlcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbGlmIHJldCAhPSBUcnVlOgorICAgICAgICAgICAgICAgIHByaW50KCJDb3VsZG4ndCBnZXQgZGVmYXVsdCBjb21tYW5kbGluZCEgJXMiICUgcmV0KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgeG1scnBjbGliLkZhdWx0IGFzIHg6CisgICAgICAgICAgICBwcmludCgiWE1MUlBDIEZhdWx0IGdldHRpbmcgY29tbWFuZGxpbmU6XG4gJXMiICUgeCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGV4aXRmbGFnID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGV4aXRmbGFnOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRIYW5kbGVyLndhaXRFdmVudCgwLjI1KQorICAgICAgICAgICAgICAgIGlmIG5vdCBldmVudDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGhlbHBlci5ldmVudEhhbmRsZXIoZXZlbnQpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0Jhc2UpOgorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KCJOT1RFOiAlc1xuIiAlIGV2ZW50Ll9tZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgICAgICAgICAgbXcuYXBwZW5kVGV4dChsb2dnaW5nLmdldExldmVsTmFtZShldmVudC5sZXZlbG5vKSArICc6ICcgKyBldmVudC5nZXRNZXNzYWdlKCkgKyAnXG4nKQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuQ2FjaGVMb2FkU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VfdG90YWwgPSBldmVudC50b3RhbAorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFByb2dyZXNzKToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2ZW50LmN1cnJlbnQKKyAgICAgICAgICAgICAgICAgICAgeSA9IHNlbGYucGFyc2VfdG90YWwKKyAgICAgICAgICAgICAgICAgICAgbXcuc2V0U3RhdHVzKCJMb2FkaW5nIENhY2hlOiAgICVzIFslMmQgJSVdIiAlICggbmV4dChwYXJzZXNwaW4pLCB4KjEwMC95ICkgKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgICAgIG13LnNldFN0YXR1cygiSWRsZSIpCisgICAgICAgICAgICAgICAgICAgIG13LmFwcGVuZFRleHQoIkxvYWRlZCAlZCBlbnRyaWVzIGZyb20gZGVwZW5kZW5jeSBjYWNoZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoIGV2ZW50Lm51bV9lbnRyaWVzKSkKKworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VfdG90YWwgPSBldmVudC50b3RhbAorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlUHJvZ3Jlc3MpOgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZlbnQuY3VycmVudAorICAgICAgICAgICAgICAgICAgICB5ID0gc2VsZi5wYXJzZV90b3RhbAorICAgICAgICAgICAgICAgICAgICBtdy5zZXRTdGF0dXMoIlBhcnNpbmcgUmVjaXBlczogJXMgWyUyZCAlJV0iICUgKCBuZXh0KHBhcnNlc3BpbiksIHgqMTAwL3kgKSApCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuUGFyc2VDb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgICAgICBtdy5zZXRTdGF0dXMoIklkbGUiKQorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KCJQYXJzaW5nIGZpbmlzaGVkLiAlZCBjYWNoZWQsICVkIHBhcnNlZCwgJWQgc2tpcHBlZCwgJWQgbWFza2VkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICggZXZlbnQuY2FjaGVkLCBldmVudC5wYXJzZWQsIGV2ZW50LnNraXBwZWQsIGV2ZW50Lm1hc2tlZCApKQorCisjICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tGYWlsZWQpOgorIyAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnQubG9nZmlsZToKKyMgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhLmdldFZhcigiQkJJTkNMVURFTE9HUyIsIGQpOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5lcnJvcigibG9nIGRhdGEgZm9sbG93cyAoJXMpIiAlIGxvZ2ZpbGUpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9saW5lcyA9IGRhdGEuZ2V0VmFyKCJCQklOQ0xVREVMT0dTX0xJTkVTIiwgZCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVtYmVyX29mX2xpbmVzOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5jYWxsKCd0YWlsIC1uJXMgJXMnICUgKG51bWJlcl9vZl9saW5lcywgbG9nZmlsZSksIHNoZWxsPVRydWUpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gb3Blbihsb2dmaWxlLCAiciIpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBmLnJlYWRsaW5lKCkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsID09ICcnOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsLnJzdHJpcCgpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ3wgJXMnICUgbAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisjICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuZXJyb3IoInNlZSBsb2cgaW4gJXMiICUgbG9nZmlsZSkKKworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZENvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgICAgICMgc3RvcCBzbyB0aGUgdXNlciBjYW4gc2VlIHRoZSByZXN1bHQgb2YgdGhlIGJ1aWxkLCBidXQKKyAgICAgICAgICAgICAgICAgICAgIyBhbHNvIGFsbG93IHRoZW0gdG8gbm93IGV4aXQgd2l0aCBhIHNpbmdsZSBeQworICAgICAgICAgICAgICAgICAgICBzaHV0ZG93biA9IDIKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb21tYW5kLkNvbW1hbmRGYWlsZWQpOgorICAgICAgICAgICAgICAgICAgICBtdy5hcHBlbmRUZXh0KCJDb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQ6ICVzIiAlIGV2ZW50LmVycm9yKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDIpCisgICAgICAgICAgICAgICAgICAgIGV4aXRmbGFnID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZEV4aXQpOgorICAgICAgICAgICAgICAgICAgICBleGl0ZmxhZyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb29rZXIuQ29va2VyRXhpdCk6CisgICAgICAgICAgICAgICAgICAgIGV4aXRmbGFnID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTG9nRXhlY1RUWSk6CisgICAgICAgICAgICAgICAgICAgIG13LmFwcGVuZFRleHQoJ1dBUk46ICcgKyBldmVudC5tc2cgKyAnXG4nKQorICAgICAgICAgICAgICAgIGlmIGhlbHBlci5uZWVkVXBkYXRlOgorICAgICAgICAgICAgICAgICAgICBhY3RpdmV0YXNrcywgZmFpbGVkdGFza3MgPSBoZWxwZXIuZ2V0VGFza3MoKQorICAgICAgICAgICAgICAgICAgICB0YXcuZXJhc2UoKQorICAgICAgICAgICAgICAgICAgICB0YXcuc2V0VGV4dCgwLCAwLCAiIikKKyAgICAgICAgICAgICAgICAgICAgaWYgYWN0aXZldGFza3M6CisgICAgICAgICAgICAgICAgICAgICAgICB0YXcuYXBwZW5kVGV4dCgiQWN0aXZlIFRhc2tzOlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0YXNrIGluIGFjdGl2ZXRhc2tzLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXcuYXBwZW5kVGV4dCh0YXNrWyJ0aXRsZSJdICsgJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgaWYgZmFpbGVkdGFza3M6CisgICAgICAgICAgICAgICAgICAgICAgICB0YXcuYXBwZW5kVGV4dCgiRmFpbGVkIFRhc2tzOlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0YXNrIGluIGZhaWxlZHRhc2tzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhdy5hcHBlbmRUZXh0KHRhc2tbInRpdGxlIl0gKyAnXG4nKQorCisgICAgICAgICAgICAgICAgY3Vyc2VzLmRvdXBkYXRlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGlvZXJyb3I6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgaW50ZXJydXB0ZWQgaW8KKyAgICAgICAgICAgICAgICBpZiBpb2Vycm9yLmFyZ3NbMF0gPT0gNDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgaWYgc2h1dGRvd24gPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgbXcuYXBwZW5kVGV4dCgiVGhpcmQgS2V5Ym9hcmQgSW50ZXJydXB0LCBleGl0LlxuIikKKyAgICAgICAgICAgICAgICAgICAgZXhpdGZsYWcgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgc2h1dGRvd24gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgbXcuYXBwZW5kVGV4dCgiU2Vjb25kIEtleWJvYXJkIEludGVycnVwdCwgc3RvcHBpbmcuLi5cbiIpCisgICAgICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZUZvcmNlU2h1dGRvd24iXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiVW5hYmxlIHRvIGNsZWFubHkgc3RvcDogJXMiICUgZXJyb3IpCisgICAgICAgICAgICAgICAgaWYgc2h1dGRvd24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbXcuYXBwZW5kVGV4dCgiS2V5Ym9hcmQgSW50ZXJydXB0LCBjbG9zaW5nIGRvd24uLi5cbiIpCisgICAgICAgICAgICAgICAgICAgIF8sIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJzdGF0ZVNodXRkb3duIl0pCisgICAgICAgICAgICAgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIlVuYWJsZSB0byBjbGVhbmx5IHNodXRkb3duOiAlcyIgJSBlcnJvcikKKyAgICAgICAgICAgICAgICBzaHV0ZG93biA9IHNodXRkb3duICsgMQorICAgICAgICAgICAgICAgIHBhc3MKKworZGVmIG1haW4oc2VydmVyLCBldmVudEhhbmRsZXIsIHBhcmFtcyk6CisgICAgaWYgbm90IG9zLmlzYXR0eShzeXMuc3Rkb3V0LmZpbGVubygpKToKKyAgICAgICAgcHJpbnQoIkZBVEFMOiBVbmFibGUgdG8gcnVuICduY3Vyc2VzJyBVSSB3aXRob3V0IGEgVFRZLiIpCisgICAgICAgIHJldHVybgorICAgIHVpID0gTkN1cnNlc1VJKCkKKyAgICB0cnk6CisgICAgICAgIGN1cnNlcy53cmFwcGVyKHVpLm1haW4sIHNlcnZlciwgZXZlbnRIYW5kbGVyLCBwYXJhbXMpCisgICAgZXhjZXB0OgorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvcHVjY2hvLnB5IGIvYml0YmFrZS9saWIvYmIvdWkvcHVjY2hvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTQ1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS9wdWNjaG8ucHkKQEAgLTAsMCArMSw0MjUgQEAKKyMKKyMgQml0QmFrZSBHcmFwaGljYWwgR1RLIFVzZXIgSW50ZXJmYWNlCisjCisjIENvcHlyaWdodCAoQykgMjAwOCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgQXV0aG9yZWQgYnkgUm9iIEJyYWRmb3JkIDxyb2JAbGludXguaW50ZWwuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGd0aworaW1wb3J0IGdvYmplY3QKK2ltcG9ydCBndGsuZ2xhZGUKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgb3MKK2ltcG9ydCBjb250ZXh0bGliCisKK2Zyb20gYmIudWkuY3J1bWJzLmJ1aWxkbWFuYWdlciBpbXBvcnQgQnVpbGRNYW5hZ2VyLCBCdWlsZENvbmZpZ3VyYXRpb24KK2Zyb20gYmIudWkuY3J1bWJzLmJ1aWxkbWFuYWdlciBpbXBvcnQgQnVpbGRNYW5hZ2VyVHJlZVZpZXcKKworZnJvbSBiYi51aS5jcnVtYnMucnVubmluZ2J1aWxkIGltcG9ydCBSdW5uaW5nQnVpbGQsIFJ1bm5pbmdCdWlsZFRyZWVWaWV3CisKKyMgVGhlIG1ldGFkYXRhIGxvYWRlciBpcyB1c2VkIGJ5IHRoZSBCdWlsZFNldHVwRGlhbG9nIHRvIGRvd25sb2FkIHRoZQorIyBhdmFpbGFibGUgb3B0aW9ucyB0byBwb3B1bGF0ZSB0aGUgZGlhbG9nCitjbGFzcyBNZXRhRGF0YUxvYWRlcihnb2JqZWN0LkdPYmplY3QpOgorICAgICIiIiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBtZWNoYW5pc20gZm9yIGxvYWRpbmcgdGhlIG1ldGFkYXRhICh0aGUKKyAgICBmZXRjaGluZyBhbmQgcGFyc2luZykgZnJvbSBhIGdpdmVuIFVSTC4gVGhlIG1ldGFkYXRhIGVuY29tcGFzc2VzIGRldGFpbHMKKyAgICBvbiB3aGF0IG1hY2hpbmVzIGFyZSBhdmFpbGFibGUuIFRoZSBkaXN0cmlidXRpb24gYW5kIGltYWdlcyBhdmFpbGFibGUgZm9yCisgICAgdGhlIG1hY2hpbmUgYW5kIHRoZSB0aGUgdXJpcyB0byB1c2UgZm9yIGJ1aWxkaW5nIHRoZSBnaXZlbiBtYWNoaW5lLiIiIgorICAgIF9fZ3NpZ25hbHNfXyA9IHsKKyAgICAgICAgJ3N1Y2Nlc3MnIDogKGdvYmplY3QuU0lHTkFMX1JVTl9MQVNULAorICAgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAoKSksCisgICAgICAgICdlcnJvcicgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0xBU1QsCisgICAgICAgICAgICAgICAgICAgZ29iamVjdC5UWVBFX05PTkUsCisgICAgICAgICAgICAgICAgICAgKGdvYmplY3QuVFlQRV9TVFJJTkcsKSkKKyAgICAgICAgfQorCisgICAgIyBXZSB1c2UgdGhlc2UgbGl0dGxlIGhlbHBlciBmdW5jdGlvbnMgdG8gZW5zdXJlIHRoYXQgd2UgdGFrZSB0aGUgZ2RrIGxvY2sKKyAgICAjIHdoZW4gZW1pdHRpbmcgdGhlIHNpZ25hbC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXMgaWRsZXMgKHNvIHRoYXQKKyAgICAjIHRoZXkgaGFwcGVuIGluIHRoZSBndGsgLyBtYWluIHRocmVhZCdzIG1haW4gbG9vcC4KKyAgICBkZWYgZW1pdF9lcnJvcl9zaWduYWwgKHNlbGYsIHJlbWFyayk6CisgICAgICAgIGd0ay5nZGsudGhyZWFkc19lbnRlcigpCisgICAgICAgIHNlbGYuZW1pdCAoImVycm9yIiwgcmVtYXJrKQorICAgICAgICBndGsuZ2RrLnRocmVhZHNfbGVhdmUoKQorCisgICAgZGVmIGVtaXRfc3VjY2Vzc19zaWduYWwgKHNlbGYpOgorICAgICAgICBndGsuZ2RrLnRocmVhZHNfZW50ZXIoKQorICAgICAgICBzZWxmLmVtaXQgKCJzdWNjZXNzIikKKyAgICAgICAgZ3RrLmdkay50aHJlYWRzX2xlYXZlKCkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZik6CisgICAgICAgIGdvYmplY3QuR09iamVjdC5fX2luaXRfXyAoc2VsZikKKworICAgIGNsYXNzIExvYWRlclRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAgICAgIiIiIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gYXN5bmNocm9ub3VzIGxvYWRlciBmb3IgdGhlIG1ldGFkYXRhIChieQorICAgICAgICB1c2luZyB0aHJlYWRzIGFuZCBzaWduYWxzKS4gVGhpcyBpcyB1c2VmdWwgc2luY2UgdGhlIG1ldGFkYXRhIG1heSBiZQorICAgICAgICBhdCBhIHJlbW90ZSBVUkwuIiIiCisgICAgICAgIGNsYXNzIExvYWRlckltcG9ydEV4Y2VwdGlvbiAoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbG9hZGVyLCB1cmwpOgorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyAoc2VsZikKKyAgICAgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgICAgICBzZWxmLmxvYWRlciA9IGxvYWRlcgorCisgICAgICAgIGRlZiBydW4gKHNlbGYpOgorICAgICAgICAgICAgcmVzdWx0ID0ge30KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyAodXJsbGliMi51cmxvcGVuIChzZWxmLnVybCkpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgICMgUGFyc2UgdGhlIG1ldGFkYXRhIGZvcm1hdC4gVGhlIGZvcm1hdCBpcy4uLi4KKyAgICAgICAgICAgICAgICAgICAgIyA8bWFjaGluZT47PGRlZmF1bHQgZGlzdHJvPnw8ZGlzdHJvPi4uLjs8ZGVmYXVsdCBpbWFnZT58PGltYWdlPi4uLjs8dHlwZSMjdXJsPnwuLi4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgPSBsaW5lLnNwbGl0KCI7IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gKGNvbXBvbmVudHMpIDwgNCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWV0YURhdGFMb2FkZXIuTG9hZGVyVGhyZWFkLkxvYWRlckltcG9ydEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9IGNvbXBvbmVudHNbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Ryb3MgPSBjb21wb25lbnRzWzFdLnNwbGl0KCJ8IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcyA9IGNvbXBvbmVudHNbMl0uc3BsaXQoInwiKQorICAgICAgICAgICAgICAgICAgICAgICAgdXJscyA9IGNvbXBvbmVudHNbM10uc3BsaXQoInwiKQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbbWFjaGluZV0gPSAoZGlzdHJvcywgaW1hZ2VzLCB1cmxzKQorCisgICAgICAgICAgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzICpwb3RlbnRpYWwqCisgICAgICAgICAgICAgICAgIyBjb25maWd1cmF0aW9uLiBJdCBjYW4gYmVjb21lIGNvbmNyZXRlIGlmIHRoZSBtYWNoaW5lLCBkaXN0cm8KKyAgICAgICAgICAgICAgICAjIGFuZCBpbWFnZSBhcmUgYWxsIGNob3NlbiBpbiB0aGUgVUkKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gQnVpbGRDb25maWd1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLm1ldGFkYXRhX3VybCA9IHNlbGYudXJsCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5tYWNoaW5lX29wdGlvbnMgPSByZXN1bHQKKyAgICAgICAgICAgICAgICBzZWxmLmxvYWRlci5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgorCisgICAgICAgICAgICAgICAgIyBFbWl0IHRoYXQgd2UndmUgYWN0dWFsbHkgZ290IGEgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIGdvYmplY3QuaWRsZV9hZGQgKE1ldGFEYXRhTG9hZGVyLmVtaXRfc3VjY2Vzc19zaWduYWwsCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZGVyKQorCisgICAgICAgICAgICBleGNlcHQgTWV0YURhdGFMb2FkZXIuTG9hZGVyVGhyZWFkLkxvYWRlckltcG9ydEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGdvYmplY3QuaWRsZV9hZGQgKE1ldGFEYXRhTG9hZGVyLmVtaXRfZXJyb3Jfc2lnbmFsLCBzZWxmLmxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgIlJlcG9zaXRvcnkgbWV0YWRhdGEgY29ycnVwdCIpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgZ29iamVjdC5pZGxlX2FkZCAoTWV0YURhdGFMb2FkZXIuZW1pdF9lcnJvcl9zaWduYWwsIHNlbGYubG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGRvd25sb2FkIHJlcG9zaXRvcnkgbWV0YWRhdGEiKQorICAgICAgICAgICAgICAgIHByaW50KGUpCisKKyAgICBkZWYgdHJ5X2ZldGNoX2Zyb21fdXJsIChzZWxmLCB1cmwpOgorICAgICAgICAjIFRyeSBhbmQgZG93bmxvYWQgdGhlIG1ldGFkYXRhLiBGaXJpbmcgYSBzaWduYWwgaWYgc3VjY2Vzc2Z1bAorICAgICAgICB0aHJlYWQgPSBNZXRhRGF0YUxvYWRlci5Mb2FkZXJUaHJlYWQoc2VsZiwgdXJsKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorCitjbGFzcyBCdWlsZFNldHVwRGlhbG9nIChndGsuRGlhbG9nKToKKyAgICBSRVNQT05TRV9CVUlMRCA9IDEKKworICAgICMgQSBsaXR0bGUgaGVscGVyIG1ldGhvZCB0aGF0IGp1c3Qgc2V0cyB0aGUgc3RhdGVzIG9uIHRoZSB3aWRnZXRzIGJhc2VkIG9uCisgICAgIyB3aGV0aGVyIHdlJ3ZlIGdvdCBnb29kIG1ldGFkYXRhIG9yIG5vdC4KKyAgICBkZWYgc2V0X2NvbmZpZ3VyYWJsZSAoc2VsZiwgY29uZmlndXJhYmxlKToKKyAgICAgICAgaWYgKHNlbGYuY29uZmlndXJhYmxlID09IGNvbmZpZ3VyYWJsZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmNvbmZpZ3VyYWJsZSA9IGNvbmZpZ3VyYWJsZQorICAgICAgICBmb3Igd2lkZ2V0IGluIHNlbGYuY29uZl93aWRnZXRzOgorICAgICAgICAgICAgd2lkZ2V0LnNldF9zZW5zaXRpdmUgKGNvbmZpZ3VyYWJsZSkKKworICAgICAgICBpZiBub3QgY29uZmlndXJhYmxlOgorICAgICAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLnNldF9hY3RpdmUgKC0xKQorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fY29tYm8uc2V0X2FjdGl2ZSAoLTEpCisgICAgICAgICAgICBzZWxmLmltYWdlX2NvbWJvLnNldF9hY3RpdmUgKC0xKQorCisgICAgIyBHVEsgd2lkZ2V0IGNhbGxiYWNrcworICAgIGRlZiByZWZyZXNoX2J1dHRvbl9jbGlja2VkIChzZWxmLCBidXR0b24pOgorICAgICAgICAjIFJlZnJlc2ggYnV0dG9uIGNsaWNrZWQuCisKKyAgICAgICAgdXJsID0gc2VsZi5sb2NhdGlvbl9lbnRyeS5nZXRfY2hhcnMgKDAsIC0xKQorICAgICAgICBzZWxmLmxvYWRlci50cnlfZmV0Y2hfZnJvbV91cmwodXJsKQorCisgICAgZGVmIHJlcG9zaXRvcnlfZW50cnlfZWRpdGFibGVfY2hhbmdlZCAoc2VsZiwgZW50cnkpOgorICAgICAgICBpZiAobGVuIChlbnRyeS5nZXRfY2hhcnMgKDAsIC0xKSkgPiAwKToKKyAgICAgICAgICAgIHNlbGYucmVmcmVzaF9idXR0b24uc2V0X3NlbnNpdGl2ZSAoVHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVmcmVzaF9idXR0b24uc2V0X3NlbnNpdGl2ZSAoRmFsc2UpCisgICAgICAgICAgICBzZWxmLmNsZWFyX3N0YXR1c19tZXNzYWdlKCkKKworICAgICAgICAjIElmIHdlIHdlcmUgcHJldmlvdXNseSBjb25maWd1cmFibGUgd2UgYXJlIG5vIGxvbmdlciBzaW5jZSB0aGUKKyAgICAgICAgIyBsb2NhdGlvbiBlbnRyeSBoYXMgYmVlbiBjaGFuZ2VkCisgICAgICAgIHNlbGYuc2V0X2NvbmZpZ3VyYWJsZSAoRmFsc2UpCisKKyAgICBkZWYgbWFjaGluZV9jb21ib19jaGFuZ2VkIChzZWxmLCBjb21ib2JveCk6CisgICAgICAgIGFjdGl2ZV9pdGVyID0gY29tYm9ib3guZ2V0X2FjdGl2ZV9pdGVyKCkKKworICAgICAgICBpZiBub3QgYWN0aXZlX2l0ZXI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBtb2RlbCA9IGNvbWJvYm94LmdldF9tb2RlbCgpCisKKyAgICAgICAgaWYgbW9kZWw6CisgICAgICAgICAgICBjaG9zZW5fbWFjaGluZSA9IG1vZGVsLmdldCAoYWN0aXZlX2l0ZXIsIDApWzBdCisKKyAgICAgICAgKGRpc3Ryb3NfbW9kZWwsIGltYWdlc19tb2RlbCkgPSBcCisgICAgICAgICAgICBzZWxmLmxvYWRlci5jb25maWd1cmF0aW9uLmdldF9kaXN0cm9fYW5kX2ltYWdlc19tb2RlbHMgKGNob3Nlbl9tYWNoaW5lKQorCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2NvbWJvLnNldF9tb2RlbCAoZGlzdHJvc19tb2RlbCkKKyAgICAgICAgc2VsZi5pbWFnZV9jb21iby5zZXRfbW9kZWwgKGltYWdlc19tb2RlbCkKKworICAgICMgQ2FsbGJhY2tzIGZyb20gdGhlIGxvYWRlcgorICAgIGRlZiBsb2FkZXJfc3VjY2Vzc19jYiAoc2VsZiwgbG9hZGVyKToKKyAgICAgICAgc2VsZi5zdGF0dXNfaW1hZ2Uuc2V0X2Zyb21faWNvbl9uYW1lICgiaW5mbyIsCisgICAgICAgICAgICBndGsuSUNPTl9TSVpFX0JVVFRPTikKKyAgICAgICAgc2VsZi5zdGF0dXNfaW1hZ2Uuc2hvdygpCisgICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsLnNldF9sYWJlbCAoIlJlcG9zaXRvcnkgbWV0YWRhdGEgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQiKQorCisgICAgICAgICMgU2V0IHRoZSBtb2RlbHMgb24gdGhlIGNvbWJvIGJveGVzIGJhc2VkIG9uIHRoZSBtb2RlbHMgZ2VuZXJhdGVkIGZyb20KKyAgICAgICAgIyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBsb2FkZXIgaGFzIGNyZWF0ZWQKKworICAgICAgICAjIFdlIGp1c3QgbmVlZCB0byBzZXQgdGhlIG1hY2hpbmUgaGVyZSwgdGhhdCB0aGVuIGRldGVybWluZXMgdGhlCisgICAgICAgICMgZGlzdHJvIGFuZCBpbWFnZSBvcHRpb25zLiBDdW5uaW5nIGh1aD8gOi0pCisKKyAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uID0gc2VsZi5sb2FkZXIuY29uZmlndXJhdGlvbgorICAgICAgICBtb2RlbCA9IHNlbGYuY29uZmlndXJhdGlvbi5nZXRfbWFjaGluZXNfbW9kZWwgKCkKKyAgICAgICAgc2VsZi5tYWNoaW5lX2NvbWJvLnNldF9tb2RlbCAobW9kZWwpCisKKyAgICAgICAgc2VsZi5zZXRfY29uZmlndXJhYmxlIChUcnVlKQorCisgICAgZGVmIGxvYWRlcl9lcnJvcl9jYiAoc2VsZiwgbG9hZGVyLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5zdGF0dXNfaW1hZ2Uuc2V0X2Zyb21faWNvbl9uYW1lICgiZXJyb3IiLAorICAgICAgICAgICAgZ3RrLklDT05fU0laRV9CVVRUT04pCisgICAgICAgIHNlbGYuc3RhdHVzX2ltYWdlLnNob3coKQorICAgICAgICBzZWxmLnN0YXR1c19sYWJlbC5zZXRfdGV4dCAoIkVycm9yIGRvd25sb2FkaW5nIHJlcG9zaXRvcnkgbWV0YWRhdGEiKQorICAgICAgICBmb3Igd2lkZ2V0IGluIHNlbGYuY29uZl93aWRnZXRzOgorICAgICAgICAgICAgd2lkZ2V0LnNldF9zZW5zaXRpdmUgKEZhbHNlKQorCisgICAgZGVmIGNsZWFyX3N0YXR1c19tZXNzYWdlIChzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0dXNfaW1hZ2UuaGlkZSgpCisgICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsLnNldF9sYWJlbCAoCisgICAgICAgICAgICAiIiI8aT5FbnRlciB0aGUgcmVwb3NpdG9yeSBsb2NhdGlvbiBhbmQgcHJlc3MgX1JlZnJlc2g8L2k+IiIiKQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmKToKKyAgICAgICAgZ3RrLkRpYWxvZy5fX2luaXRfXyAoc2VsZikKKworICAgICAgICAjIENhbmNlbAorICAgICAgICBzZWxmLmFkZF9idXR0b24gKGd0ay5TVE9DS19DQU5DRUwsIGd0ay5SRVNQT05TRV9DQU5DRUwpCisKKyAgICAgICAgIyBCdWlsZAorICAgICAgICBidXR0b24gPSBndGsuQnV0dG9uICgiX0J1aWxkIiwgTm9uZSwgVHJ1ZSkKKyAgICAgICAgaW1hZ2UgPSBndGsuSW1hZ2UgKCkKKyAgICAgICAgaW1hZ2Uuc2V0X2Zyb21fc3RvY2sgKGd0ay5TVE9DS19FWEVDVVRFLCBndGsuSUNPTl9TSVpFX0JVVFRPTikKKyAgICAgICAgYnV0dG9uLnNldF9pbWFnZSAoaW1hZ2UpCisgICAgICAgIHNlbGYuYWRkX2FjdGlvbl93aWRnZXQgKGJ1dHRvbiwgQnVpbGRTZXR1cERpYWxvZy5SRVNQT05TRV9CVUlMRCkKKyAgICAgICAgYnV0dG9uLnNob3dfYWxsICgpCisKKyAgICAgICAgIyBQdWxsIGluICpqdXN0KiB0aGUgdGFibGUgZnJvbSB0aGUgR2xhZGUgWE1MIGRhdGEuCisgICAgICAgIGd4bWwgPSBndGsuZ2xhZGUuWE1MIChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pICsgIi9jcnVtYnMvcHVjY2hvLmdsYWRlIiwKKyAgICAgICAgICAgIHJvb3QgPSAiYnVpbGRfdGFibGUiKQorICAgICAgICB0YWJsZSA9IGd4bWwuZ2V0X3dpZGdldCAoImJ1aWxkX3RhYmxlIikKKyAgICAgICAgc2VsZi52Ym94LnBhY2tfc3RhcnQgKHRhYmxlLCBUcnVlLCBGYWxzZSwgMCkKKworICAgICAgICAjIEdyYWIgYWxsIHRoZSB3aWRnZXRzIHRoYXQgd2UgbmVlZCB0byB0dXJuIG9uL29mZiB3aGVuIHdlIHJlZnJlc2guLi4KKyAgICAgICAgc2VsZi5jb25mX3dpZGdldHMgPSBbXQorICAgICAgICBzZWxmLmNvbmZfd2lkZ2V0cyArPSBbZ3htbC5nZXRfd2lkZ2V0ICgibWFjaGluZV9sYWJlbCIpXQorICAgICAgICBzZWxmLmNvbmZfd2lkZ2V0cyArPSBbZ3htbC5nZXRfd2lkZ2V0ICgiZGlzdHJpYnV0aW9uX2xhYmVsIildCisgICAgICAgIHNlbGYuY29uZl93aWRnZXRzICs9IFtneG1sLmdldF93aWRnZXQgKCJpbWFnZV9sYWJlbCIpXQorICAgICAgICBzZWxmLmNvbmZfd2lkZ2V0cyArPSBbZ3htbC5nZXRfd2lkZ2V0ICgibWFjaGluZV9jb21ibyIpXQorICAgICAgICBzZWxmLmNvbmZfd2lkZ2V0cyArPSBbZ3htbC5nZXRfd2lkZ2V0ICgiZGlzdHJpYnV0aW9uX2NvbWJvIildCisgICAgICAgIHNlbGYuY29uZl93aWRnZXRzICs9IFtneG1sLmdldF93aWRnZXQgKCJpbWFnZV9jb21ibyIpXQorCisgICAgICAgICMgR3JhYiB0aGUgc3RhdHVzIHdpZGdldHMKKyAgICAgICAgc2VsZi5zdGF0dXNfaW1hZ2UgPSBneG1sLmdldF93aWRnZXQgKCJzdGF0dXNfaW1hZ2UiKQorICAgICAgICBzZWxmLnN0YXR1c19sYWJlbCA9IGd4bWwuZ2V0X3dpZGdldCAoInN0YXR1c19sYWJlbCIpCisKKyAgICAgICAgIyBHcmFiIHRoZSByZWZyZXNoIGJ1dHRvbiBhbmQgY29ubmVjdCB0byB0aGUgY2xpY2tlZCBzaWduYWwKKyAgICAgICAgc2VsZi5yZWZyZXNoX2J1dHRvbiA9IGd4bWwuZ2V0X3dpZGdldCAoInJlZnJlc2hfYnV0dG9uIikKKyAgICAgICAgc2VsZi5yZWZyZXNoX2J1dHRvbi5jb25uZWN0ICgiY2xpY2tlZCIsIHNlbGYucmVmcmVzaF9idXR0b25fY2xpY2tlZCkKKworICAgICAgICAjIEdyYWIgdGhlIGxvY2F0aW9uIGVudHJ5IGFuZCBjb25uZWN0IHRvIGVkaXRhYmxlOjpjaGFuZ2VkCisgICAgICAgIHNlbGYubG9jYXRpb25fZW50cnkgPSBneG1sLmdldF93aWRnZXQgKCJsb2NhdGlvbl9lbnRyeSIpCisgICAgICAgIHNlbGYubG9jYXRpb25fZW50cnkuY29ubmVjdCAoImNoYW5nZWQiLAorICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5X2VudHJ5X2VkaXRhYmxlX2NoYW5nZWQpCisKKyAgICAgICAgIyBHcmFiIHRoZSBtYWNoaW5lIGNvbWJvIGFuZCBob29rIG9udG8gdGhlIGNoYW5nZWQgc2lnbmFsLiBUaGlzIHRoZW4KKyAgICAgICAgIyBhbGxvd3MgdXMgdG8gcG9wdWxhdGUgdGhlIGRpc3RybyBhbmQgaW1hZ2UgY29tYm9zCisgICAgICAgIHNlbGYubWFjaGluZV9jb21ibyA9IGd4bWwuZ2V0X3dpZGdldCAoIm1hY2hpbmVfY29tYm8iKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uY29ubmVjdCAoImNoYW5nZWQiLCBzZWxmLm1hY2hpbmVfY29tYm9fY2hhbmdlZCkKKworICAgICAgICAjIFNldHVwIHRoZSBjb21ibworICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8ucGFja19zdGFydChjZWxsLCBUcnVlKQorICAgICAgICBzZWxmLm1hY2hpbmVfY29tYm8uYWRkX2F0dHJpYnV0ZShjZWxsLCAndGV4dCcsIDApCisKKyAgICAgICAgIyBHcmFiIHRoZSBkaXN0cm8gYW5kIGltYWdlIGNvbWJvcy4gV2UgbmVlZCB0aGVzZSB0byBwb3B1bGF0ZSB3aXRoCisgICAgICAgICMgbW9kZWxzIG9uY2UgdGhlIG1hY2hpbmUgaXMgY2hvc2VuCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2NvbWJvID0gZ3htbC5nZXRfd2lkZ2V0ICgiZGlzdHJpYnV0aW9uX2NvbWJvIikKKyAgICAgICAgY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fY29tYm8ucGFja19zdGFydChjZWxsLCBUcnVlKQorICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9jb21iby5hZGRfYXR0cmlidXRlKGNlbGwsICd0ZXh0JywgMCkKKworICAgICAgICBzZWxmLmltYWdlX2NvbWJvID0gZ3htbC5nZXRfd2lkZ2V0ICgiaW1hZ2VfY29tYm8iKQorICAgICAgICBjZWxsID0gZ3RrLkNlbGxSZW5kZXJlclRleHQoKQorICAgICAgICBzZWxmLmltYWdlX2NvbWJvLnBhY2tfc3RhcnQoY2VsbCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5pbWFnZV9jb21iby5hZGRfYXR0cmlidXRlKGNlbGwsICd0ZXh0JywgMCkKKworICAgICAgICAjIFB1dCB0aGUgZGVmYXVsdCBkZXNjcmlwdGl2ZSB0ZXh0IGluIHRoZSBzdGF0dXMgYm94CisgICAgICAgIHNlbGYuY2xlYXJfc3RhdHVzX21lc3NhZ2UoKQorCisgICAgICAgICMgTWFyayBhcyBub24tY29uZmlndXJhYmxlLCB0aGlzIGlzIGp1c3QgZ3JleXMgb3V0IHRoZSB3aWRnZXRzIHRoZQorICAgICAgICAjIHVzZXIgY2FuJ3QgeWV0IHVzZQorICAgICAgICBzZWxmLmNvbmZpZ3VyYWJsZSA9IEZhbHNlCisgICAgICAgIHNlbGYuc2V0X2NvbmZpZ3VyYWJsZShGYWxzZSkKKworICAgICAgICAjIFNob3cgdGhlIHRhYmxlCisgICAgICAgIHRhYmxlLnNob3dfYWxsICgpCisKKyAgICAgICAgIyBUaGUgbG9hZGVyIGFuZCBzb21lIHNpZ25hbHMgY29ubmVjdGVkIHRvIGl0IHRvIHVwZGF0ZSB0aGUgc3RhdHVzCisgICAgICAgICMgYXJlYQorICAgICAgICBzZWxmLmxvYWRlciA9IE1ldGFEYXRhTG9hZGVyKCkKKyAgICAgICAgc2VsZi5sb2FkZXIuY29ubmVjdCAoInN1Y2Nlc3MiLCBzZWxmLmxvYWRlcl9zdWNjZXNzX2NiKQorICAgICAgICBzZWxmLmxvYWRlci5jb25uZWN0ICgiZXJyb3IiLCBzZWxmLmxvYWRlcl9lcnJvcl9jYikKKworICAgIGRlZiB1cGRhdGVfY29uZmlndXJhdGlvbiAoc2VsZik6CisgICAgICAgICIiIiBBIHBvb3JseSBuYW1lZCBmdW5jdGlvbiBidXQgaXQgdXBkYXRlcyB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbgorICAgICAgICBmcm9tIHRoZSB3aWRnZXRzLiBUaGlzIGNhbiBtYWtlIHRoYXQgY29uZmlndXJhdGlvbiBjb25jcmV0ZSBhbmQgY2FuCisgICAgICAgIHRodXMgYmUgdXNlZCBmb3IgYnVpbGRpbmcgIiIiCisgICAgICAgICMgRXh0cmFjdCB0aGUgY2hvc2VuIG1hY2hpbmUgZnJvbSB0aGUgY29tYm8KKyAgICAgICAgbW9kZWwgPSBzZWxmLm1hY2hpbmVfY29tYm8uZ2V0X21vZGVsKCkKKyAgICAgICAgYWN0aXZlX2l0ZXIgPSBzZWxmLm1hY2hpbmVfY29tYm8uZ2V0X2FjdGl2ZV9pdGVyKCkKKyAgICAgICAgaWYgKGFjdGl2ZV9pdGVyKToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5tYWNoaW5lID0gbW9kZWwuZ2V0KGFjdGl2ZV9pdGVyLCAwKVswXQorCisgICAgICAgICMgRXh0cmFjdCB0aGUgY2hvc2VuIGRpc3RybyBmcm9tIHRoZSBjb21ibworICAgICAgICBtb2RlbCA9IHNlbGYuZGlzdHJpYnV0aW9uX2NvbWJvLmdldF9tb2RlbCgpCisgICAgICAgIGFjdGl2ZV9pdGVyID0gc2VsZi5kaXN0cmlidXRpb25fY29tYm8uZ2V0X2FjdGl2ZV9pdGVyKCkKKyAgICAgICAgaWYgKGFjdGl2ZV9pdGVyKToKKyAgICAgICAgICAgIHNlbGYuY29uZmlndXJhdGlvbi5kaXN0cm8gPSBtb2RlbC5nZXQoYWN0aXZlX2l0ZXIsIDApWzBdCisKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBjaG9zZW4gaW1hZ2UgZnJvbSB0aGUgY29tYm8KKyAgICAgICAgbW9kZWwgPSBzZWxmLmltYWdlX2NvbWJvLmdldF9tb2RlbCgpCisgICAgICAgIGFjdGl2ZV9pdGVyID0gc2VsZi5pbWFnZV9jb21iby5nZXRfYWN0aXZlX2l0ZXIoKQorICAgICAgICBpZiAoYWN0aXZlX2l0ZXIpOgorICAgICAgICAgICAgc2VsZi5jb25maWd1cmF0aW9uLmltYWdlID0gbW9kZWwuZ2V0KGFjdGl2ZV9pdGVyLCAwKVswXQorCisjIFRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMgdG8gcHVsbCBldmVudHMgb3V0IGZyb20gdGhlIGV2ZW50IHF1ZXVlIGFuZCB0aGVuIHB1c2gKKyMgdGhlbSBpbnRvIHRoZSBSdW5uaW5nQnVpbGQgKHdoaWNoIHRoZW4gZHJpdmVzIHRoZSBSdW5uaW5nQnVpbGQgd2hpY2ggdGhlbgorIyBwdXNoZXMgdGhyb3VnaCBhbmQgdXBkYXRlcyB0aGUgcHJvZ3Jlc3MgdHJlZSB2aWV3LikKKyMKKyMgVE9ETzogU2hvdWxkIGJlIGEgbWV0aG9kIG9uIHRoZSBSdW5uaW5nQnVpbGQgY2xhc3MKK2RlZiBldmVudF9oYW5kbGVfdGltZW91dCAoZXZlbnRIYW5kbGVyLCBidWlsZCk6CisgICAgIyBDb25zdW1lIGFzIG1hbnkgbWVzc2FnZXMgYXMgd2UgY2FuIC4uLgorICAgIGV2ZW50ID0gZXZlbnRIYW5kbGVyLmdldEV2ZW50KCkKKyAgICB3aGlsZSBldmVudDoKKyAgICAgICAgYnVpbGQuaGFuZGxlX2V2ZW50IChldmVudCkKKyAgICAgICAgZXZlbnQgPSBldmVudEhhbmRsZXIuZ2V0RXZlbnQoKQorICAgIHJldHVybiBUcnVlCisKK2NsYXNzIE1haW5XaW5kb3cgKGd0ay5XaW5kb3cpOgorCisgICAgIyBDYWxsYmFjayB0aGF0IGdldHMgZmlyZWQgd2hlbiB0aGUgdXNlciBoaXRzIGEgYnV0dG9uIGluIHRoZQorICAgICMgQnVpbGRTZXR1cERpYWxvZy4KKyAgICBkZWYgYnVpbGRfZGlhbG9nX2JveF9yZXNwb25zZV9jYiAoc2VsZiwgZGlhbG9nLCByZXNwb25zZV9pZCk6CisgICAgICAgIGNvbmYgPSBOb25lCisgICAgICAgIGlmIChyZXNwb25zZV9pZCA9PSBCdWlsZFNldHVwRGlhbG9nLlJFU1BPTlNFX0JVSUxEKToKKyAgICAgICAgICAgIGRpYWxvZy51cGRhdGVfY29uZmlndXJhdGlvbigpCisgICAgICAgICAgICBwcmludChkaWFsb2cuY29uZmlndXJhdGlvbi5tYWNoaW5lLCBkaWFsb2cuY29uZmlndXJhdGlvbi5kaXN0cm8sIFwKKyAgICAgICAgICAgICAgICBkaWFsb2cuY29uZmlndXJhdGlvbi5pbWFnZSkKKyAgICAgICAgICAgIGNvbmYgPSBkaWFsb2cuY29uZmlndXJhdGlvbgorCisgICAgICAgIGRpYWxvZy5kZXN0cm95KCkKKworICAgICAgICBpZiBjb25mOgorICAgICAgICAgICAgc2VsZi5tYW5hZ2VyLmRvX2J1aWxkIChjb25mKQorCisgICAgZGVmIGJ1aWxkX2J1dHRvbl9jbGlja2VkX2NiIChzZWxmLCBidXR0b24pOgorICAgICAgICBkaWFsb2cgPSBCdWlsZFNldHVwRGlhbG9nICgpCisKKyAgICAgICAgIyBGb3Igc29tZSB1bmtub3duIHJlYXNvbiBEaWFsb2cucnVuIGNhdXNlcyBuaWNlIGxpdHRsZSBkZWFkbG9ja3MgLi4uIDotKAorICAgICAgICBkaWFsb2cuY29ubmVjdCAoInJlc3BvbnNlIiwgc2VsZi5idWlsZF9kaWFsb2dfYm94X3Jlc3BvbnNlX2NiKQorICAgICAgICBkaWFsb2cuc2hvdygpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYpOgorICAgICAgICBndGsuV2luZG93Ll9faW5pdF9fIChzZWxmKQorCisgICAgICAgICMgUHVsbCBpbiAqanVzdCogdGhlIG1haW4gdmJveCBmcm9tIHRoZSBHbGFkZSBYTUwgZGF0YSBhbmQgdGhlbiBwYWNrCisgICAgICAgICMgdGhhdCBpbnNpZGUgdGhlIHdpbmRvdworICAgICAgICBneG1sID0gZ3RrLmdsYWRlLlhNTCAob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSArICIvY3J1bWJzL3B1Y2Noby5nbGFkZSIsCisgICAgICAgICAgICByb290ID0gIm1haW5fd2luZG93X3Zib3giKQorICAgICAgICB2Ym94ID0gZ3htbC5nZXRfd2lkZ2V0ICgibWFpbl93aW5kb3dfdmJveCIpCisgICAgICAgIHNlbGYuYWRkICh2Ym94KQorCisgICAgICAgICMgQ3JlYXRlIHRoZSB0cmVlIHZpZXdzIGZvciB0aGUgYnVpbGQgbWFuYWdlciB2aWV3IGFuZCB0aGUgcHJvZ3Jlc3MgdmlldworICAgICAgICBzZWxmLmJ1aWxkX21hbmFnZXJfdmlldyA9IEJ1aWxkTWFuYWdlclRyZWVWaWV3KCkKKyAgICAgICAgc2VsZi5ydW5uaW5nX2J1aWxkX3ZpZXcgPSBSdW5uaW5nQnVpbGRUcmVlVmlldygpCisKKyAgICAgICAgIyBHcmFiIHRoZSBzY3JvbGxlZCB3aW5kb3dzIHRoYXQgd2UgcHV0IHRoZSB0cmVlIHZpZXdzIGludG8KKyAgICAgICAgc2VsZi5yZXN1bHRzX3Njcm9sbGVkd2luZG93ID0gZ3htbC5nZXRfd2lkZ2V0ICgicmVzdWx0c19zY3JvbGxlZHdpbmRvdyIpCisgICAgICAgIHNlbGYucHJvZ3Jlc3Nfc2Nyb2xsZWR3aW5kb3cgPSBneG1sLmdldF93aWRnZXQgKCJwcm9ncmVzc19zY3JvbGxlZHdpbmRvdyIpCisKKyAgICAgICAgIyBQdXQgdGhlIHRyZWUgdmlld3MgaW5zaWRlIC4uLgorICAgICAgICBzZWxmLnJlc3VsdHNfc2Nyb2xsZWR3aW5kb3cuYWRkIChzZWxmLmJ1aWxkX21hbmFnZXJfdmlldykKKyAgICAgICAgc2VsZi5wcm9ncmVzc19zY3JvbGxlZHdpbmRvdy5hZGQgKHNlbGYucnVubmluZ19idWlsZF92aWV3KQorCisgICAgICAgICMgSG9vayB1cCB0aGUgYnVpbGQgYnV0dG9uLi4uCisgICAgICAgIHNlbGYuYnVpbGRfYnV0dG9uID0gZ3htbC5nZXRfd2lkZ2V0ICgibWFpbl90b29sYnV0dG9uX2J1aWxkIikKKyAgICAgICAgc2VsZi5idWlsZF9idXR0b24uY29ubmVjdCAoImNsaWNrZWQiLCBzZWxmLmJ1aWxkX2J1dHRvbl9jbGlja2VkX2NiKQorCisjIEknbSBub3QgdmVyeSBoYXBweSBhYm91dCB0aGUgY3VycmVudCBvd25lcnNoaXAgb2YgdGhlIFJ1bm5pbmdCdWlsZC4gSSBoYXZlCisjIG15IHN1c3BpY2lvbnMgdGhhdCB0aGlzIG9iamVjdCBzaG91bGQgYmUgaGVsZCBieSB0aGUgQnVpbGRNYW5hZ2VyIHNpbmNlIHdlCisjIGNhcmUgYWJvdXQgdGhlIHNpZ25hbHMgaW4gdGhlIG1hbmFnZXIKKworZGVmIHJ1bm5pbmdfYnVpbGRfc3VjY2VlZGVkX2NiIChydW5uaW5nX2J1aWxkLCBtYW5hZ2VyKToKKyAgICAjIE5vdGlmeSB0aGUgbWFuYWdlciB0aGF0IGEgYnVpbGQgaGFzIHN1Y2NlZWRlZC4gVGhpcyBpcyBuZWNlc3NhcnkgYXMgcGFydAorICAgICMgb2YgdGhlICdoYWNrJyB0aGF0IHdlIHVzZSBmb3IgbWFraW5nIHRoZSByb3cgaW4gdGhlIG1vZGVsIC8gdmlldworICAgICMgcmVwcmVzZW50aW5nIHRoZSBvbmdvaW5nIGJ1aWxkIGNoYW5nZSBpbnRvIGEgcm93IHJlcHJlc2VudGluZyB0aGUKKyAgICAjIGNvbXBsZXRlZCBidWlsZC4gU2luY2Ugd2Uga25vdyBvbmx5IG9uZSBidWlsZCBjYW4gYmUgcnVubmluZyBhIHRpbWUgdGhlbgorICAgICMgd2UgY2FuIGhhbmRsZSB0aGlzLgorCisgICAgIyBGSVhNRTogUmVmYWN0b3IgYWxsIHRoaXMgc28gdGhhdCB0aGUgUnVubmluZ0J1aWxkIGlzIG93bmVkIGJ5IHRoZQorICAgICMgQnVpbGRNYW5hZ2VyLiBJdCBjYW4gdGhlbiBob29rIG9udG8gdGhlIHNpZ25hbHMgZGlyZWN0bHkgYW5kIGRyaXZlCisgICAgIyBpbnRlcmVzdGluZyB0aGluZ3MgaXQgY2FyZXMgYWJvdXQuCisgICAgbWFuYWdlci5ub3RpZnlfYnVpbGRfc3VjY2VlZGVkICgpCisgICAgcHJpbnQoImJ1aWxkIHN1Y2NlZWRlZCIpCisKK2RlZiBydW5uaW5nX2J1aWxkX2ZhaWxlZF9jYiAocnVubmluZ19idWlsZCwgbWFuYWdlcik6CisgICAgIyBBcyBhYm92ZQorICAgIHByaW50KCJidWlsZCBmYWlsZWQiKQorICAgIG1hbmFnZXIubm90aWZ5X2J1aWxkX2ZhaWxlZCAoKQorCitkZWYgbWFpbiAoc2VydmVyLCBldmVudEhhbmRsZXIpOgorICAgICMgSW5pdGlhbGlzZSB0aHJlYWRpbmcuLi4KKyAgICBnb2JqZWN0LnRocmVhZHNfaW5pdCgpCisgICAgZ3RrLmdkay50aHJlYWRzX2luaXQoKQorCisgICAgbWFpbl93aW5kb3cgPSBNYWluV2luZG93ICgpCisgICAgbWFpbl93aW5kb3cuc2hvd19hbGwgKCkKKworICAgICMgU2V0IHVwIHRoZSBidWlsZCBtYW5hZ2VyIHN0dWZmIGluIGdlbmVyYWwKKyAgICBidWlsZHNfZGlyID0gb3MucGF0aC5qb2luIChvcy5nZXRjd2QoKSwgICJyZXN1bHRzIikKKyAgICBtYW5hZ2VyID0gQnVpbGRNYW5hZ2VyIChzZXJ2ZXIsIGJ1aWxkc19kaXIpCisgICAgbWFpbl93aW5kb3cuYnVpbGRfbWFuYWdlcl92aWV3LnNldF9tb2RlbCAobWFuYWdlci5tb2RlbCkKKworICAgICMgRG8gdGhlIHJ1bm5pbmcgYnVpbGQgc2V0dXAKKyAgICBydW5uaW5nX2J1aWxkID0gUnVubmluZ0J1aWxkICgpCisgICAgbWFpbl93aW5kb3cucnVubmluZ19idWlsZF92aWV3LnNldF9tb2RlbCAocnVubmluZ19idWlsZC5tb2RlbCkKKyAgICBydW5uaW5nX2J1aWxkLmNvbm5lY3QgKCJidWlsZC1zdWNjZWVkZWQiLCBydW5uaW5nX2J1aWxkX3N1Y2NlZWRlZF9jYiwKKyAgICAgICAgbWFuYWdlcikKKyAgICBydW5uaW5nX2J1aWxkLmNvbm5lY3QgKCJidWlsZC1mYWlsZWQiLCBydW5uaW5nX2J1aWxkX2ZhaWxlZF9jYiwgbWFuYWdlcikKKworICAgICMgV2UgbmVlZCB0byBzYXZlIHRoZSBtYW5hZ2VyIGludG8gdGhlIE1haW5XaW5kb3cgc28gdGhhdCB0aGUgdG9vbGJhcgorICAgICMgYnV0dG9uIGNhbiB1c2UgaXQuCisgICAgIyBGSVhNRTogUmVmYWN0b3IgPworICAgIG1haW5fd2luZG93Lm1hbmFnZXIgPSBtYW5hZ2VyCisKKyAgICAjIFVzZSBhIHRpbWVvdXQgZnVuY3Rpb24gZm9yIHByb2JpbmcgdGhlIGV2ZW50IHF1ZXVlIHRvIGZpbmQgb3V0IGlmIHdlCisgICAgIyBoYXZlIGEgbWVzc2FnZSB3YWl0aW5nIGZvciB1cy4KKyAgICBnb2JqZWN0LnRpbWVvdXRfYWRkICgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaGFuZGxlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfYnVpbGQpCisKKyAgICBndGsubWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS90b2FzdGVydWkucHkgYi9iaXRiYWtlL2xpYi9iYi91aS90b2FzdGVydWkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3ZTg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL3RvYXN0ZXJ1aS5weQpAQCAtMCwwICsxLDM1NSBAQAorIworIyBCaXRCYWtlIFRvYXN0ZXJVSSBJbXBsZW1lbnRhdGlvbgorIyBiYXNlZCBvbiAoTm8pVFRZIFVJIEltcGxlbWVudGF0aW9uIGJ5IFJpY2hhcmQgUHVyZGllCisjCisjIEhhbmRsaW5nIG91dHB1dCB0byBUVFlzIG9yIGZpbGVzIChubyBUVFkpCisjCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDEyIFJpY2hhcmQgUHVyZGllCisjIENvcHlyaWdodCAoQykgMjAxMyAgICAgIEludGVsIENvcnBvcmF0aW9uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitpbXBvcnQgc3lzCit0cnk6CisgICAgaW1wb3J0IGJiCitleGNlcHQgUnVudGltZUVycm9yIGFzIGV4YzoKKyAgICBzeXMuZXhpdChzdHIoZXhjKSkKKworZnJvbSBiYi51aSBpbXBvcnQgdWloZWxwZXIKK2Zyb20gYmIudWkuYnVpbGRpbmZvaGVscGVyIGltcG9ydCBCdWlsZEluZm9IZWxwZXIKKworaW1wb3J0IGJiLm1zZworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworCisjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKKyMgbW9kdWxlIHByb3BlcnRpZXMgZm9yIFVJIG1vZHVsZXMgYXJlIHJlYWQgYnkgYml0YmFrZSBhbmQgdGhlIGNvbnRyYWN0IHNob3VsZCBub3QgYmUgYnJva2VuCisKKworZmVhdHVyZVNldCA9IFtiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuSE9CX0VYVFJBX0NBQ0hFUywgYmIuY29va2VyLkNvb2tlckZlYXR1cmVzLlNFTkRfREVQRU5EU19UUkVFLCBiYi5jb29rZXIuQ29va2VyRmVhdHVyZXMuQkFTRURBVEFTVE9SRV9UUkFDS0lORywgYmIuY29va2VyLkNvb2tlckZlYXR1cmVzLlNFTkRfU0FOSVRZRVZFTlRTXQorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiVG9hc3RlckxvZ2dlciIpCitpbnRlcmFjdGl2ZSA9IHN5cy5zdGRvdXQuaXNhdHR5KCkKKworCisKK2RlZiBfbG9nX3NldHRpbmdzX2Zyb21fc2VydmVyKHNlcnZlcik6CisgICAgIyBHZXQgdmFsdWVzIG9mIHZhcmlhYmxlcyB3aGljaCBjb250cm9sIG91ciBvdXRwdXQKKyAgICBpbmNsdWRlbG9ncywgZXJyb3IgPSBzZXJ2ZXIucnVuQ29tbWFuZChbImdldFZhcmlhYmxlIiwgIkJCSU5DTFVERUxPR1MiXSkKKyAgICBpZiBlcnJvcjoKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBCQklOQ0xVREVMT0dTIHZhcmlhYmxlOiAlcyIsIGVycm9yKQorICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKGVycm9yKQorICAgIGxvZ2xpbmVzLCBlcnJvciA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiQkJJTkNMVURFTE9HU19MSU5FUyJdKQorICAgIGlmIGVycm9yOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBnZXQgdGhlIHZhbHVlIG9mIEJCSU5DTFVERUxPR1NfTElORVMgdmFyaWFibGU6ICVzIiwgZXJyb3IpCisgICAgICAgIHJhaXNlIEJhc2VFeGNlcHRpb24oZXJyb3IpCisgICAgY29uc29sZWxvZ2ZpbGUsIGVycm9yID0gc2VydmVyLnJ1bkNvbW1hbmQoWyJnZXRWYXJpYWJsZSIsICJCQl9DT05TT0xFTE9HIl0pCisgICAgaWYgZXJyb3I6CisgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIGdldCB0aGUgdmFsdWUgb2YgQkJfQ09OU09MRUxPRyB2YXJpYWJsZTogJXMiLCBlcnJvcikKKyAgICAgICAgcmFpc2UgQmFzZUV4Y2VwdGlvbihlcnJvcikKKyAgICByZXR1cm4gaW5jbHVkZWxvZ3MsIGxvZ2xpbmVzLCBjb25zb2xlbG9nZmlsZQorCisKK2RlZiBtYWluKHNlcnZlciwgZXZlbnRIYW5kbGVyLCBwYXJhbXMgKToKKyAgICBoZWxwZXIgPSB1aWhlbHBlci5CQlVJSGVscGVyKCkKKworICAgIGNvbnNvbGUgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc3lzLnN0ZG91dCkKKyAgICBmb3JtYXRfc3RyID0gIiUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIgorICAgIGZvcm1hdHRlciA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQorICAgIGJiLm1zZy5hZGREZWZhdWx0bG9nRmlsdGVyKGNvbnNvbGUpCisgICAgY29uc29sZS5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICAgIGxvZ2dlci5hZGRIYW5kbGVyKGNvbnNvbGUpCisgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKworICAgIF8sIF8sIGNvbnNvbGVsb2dmaWxlID0gX2xvZ19zZXR0aW5nc19mcm9tX3NlcnZlcihzZXJ2ZXIpCisKKyAgICAjIHZlcmlmeSBhbmQgd2FybgorICAgIGJ1aWxkX2hpc3RvcnlfZW5hYmxlZCA9IFRydWUKKyAgICBpbmhlcml0bGlzdCwgXyA9IHNlcnZlci5ydW5Db21tYW5kKFsiZ2V0VmFyaWFibGUiLCAiSU5IRVJJVCJdKQorCisgICAgaWYgbm90ICJidWlsZGhpc3RvcnkiIGluIGluaGVyaXRsaXN0LnNwbGl0KCIgIik6CisgICAgICAgIGxvZ2dlci53YXJuKCJidWlsZGhpc3RvcnkgaXMgbm90IGVuYWJsZWQuIFBsZWFzZSBlbmFibGUgSU5IRVJJVCArPSBcImJ1aWxkaGlzdG9yeVwiIHRvIHNlZSBpbWFnZSBkZXRhaWxzLiIpCisgICAgICAgIGJ1aWxkX2hpc3RvcnlfZW5hYmxlZCA9IEZhbHNlCisKKyAgICBpZiBub3QgcGFyYW1zLm9ic2VydmVfb25seToKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJUb2FzdGVyVUkgY2FuIG9ubHkgd29yayBpbiBvYnNlcnZlciBtb2RlIikKKyAgICAgICAgcmV0dXJuIDEKKworCisgICAgbWFpbi5zaHV0ZG93biA9IDAKKyAgICBpbnRlcnJ1cHRlZCA9IEZhbHNlCisgICAgcmV0dXJuX3ZhbHVlID0gMAorICAgIGVycm9ycyA9IDAKKyAgICB3YXJuaW5ncyA9IDAKKyAgICB0YXNrZmFpbHVyZXMgPSBbXQorICAgIGZpcnN0ID0gVHJ1ZQorCisgICAgYnVpbGRpbmZvaGVscGVyID0gQnVpbGRJbmZvSGVscGVyKHNlcnZlciwgYnVpbGRfaGlzdG9yeV9lbmFibGVkKQorCisgICAgaWYgYnVpbGRpbmZvaGVscGVyLmJyYmUgaXMgbm90IE5vbmUgYW5kIGNvbnNvbGVsb2dmaWxlOgorICAgICAgICAjIGlmIHdlIGFyZSB1bmRlciBtYW5hZ2VkIG1vZGUgd2UgaGF2ZSBubyBvdGhlciBVSSBhbmQgd2UgbmVlZCB0byB3cml0ZSBvdXIgb3duIGZpbGUKKyAgICAgICAgYmIudXRpbHMubWtkaXJoaWVyKG9zLnBhdGguZGlybmFtZShjb25zb2xlbG9nZmlsZSkpCisgICAgICAgIGNvbmxvZ2Zvcm1hdCA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcihmb3JtYXRfc3RyKQorICAgICAgICBjb25zb2xlbG9nID0gbG9nZ2luZy5GaWxlSGFuZGxlcihjb25zb2xlbG9nZmlsZSkKKyAgICAgICAgYmIubXNnLmFkZERlZmF1bHRsb2dGaWx0ZXIoY29uc29sZWxvZykKKyAgICAgICAgY29uc29sZWxvZy5zZXRGb3JtYXR0ZXIoY29ubG9nZm9ybWF0KQorICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihjb25zb2xlbG9nKQorCisKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBldmVudCA9IGV2ZW50SGFuZGxlci53YWl0RXZlbnQoMC4yNSkKKyAgICAgICAgICAgIGlmIGZpcnN0OgorICAgICAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVG9hc3RlclVJIHdhaXRpbmcgZm9yIGV2ZW50cyIpCisKKyAgICAgICAgICAgIGlmIGV2ZW50IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbWFpbi5zaHV0ZG93biA+IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaGVscGVyLmV2ZW50SGFuZGxlcihldmVudCkKKworICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcworICAgICAgICAgICAgIyB0aGUgY29kZSB3aWxsIGxvb2sgaW50byB0aGUgcHJvdGVjdGVkIHZhcmlhYmxlcyBvZiB0aGUgZXZlbnQ7IG5vIGVhc3kgd2F5IGFyb3VuZCB0aGlzCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkJ1aWxkU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX3N0YXJ0ZWRfYnVpbGQoZXZlbnQpCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIChiYi5idWlsZC5UYXNrU3RhcnRlZCwgYmIuYnVpbGQuVGFza1N1Y2NlZWRlZCwgYmIuYnVpbGQuVGFza0ZhaWxlZFNpbGVudCkpOgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci51cGRhdGVfYW5kX3N0b3JlX3Rhc2soZXZlbnQpCisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkxvZ2ZpbGUgZm9yIHRhc2sgJXMiLCBldmVudC5sb2dmaWxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tCYXNlKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhldmVudC5fbWVzc2FnZSkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTG9nRXhlY1RUWSk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oZXZlbnQubXNnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGxvZ2dpbmcuTG9nUmVjb3JkKToKKyAgICAgICAgICAgICAgICBpZiBldmVudC5sZXZlbG5vID09IC0xOgorICAgICAgICAgICAgICAgICAgICBldmVudC5sZXZlbG5vID0gZm9ybWF0dGVyLkVSUk9SCisKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfbG9nX2V2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIGlmIGV2ZW50LmxldmVsbm8gPj0gZm9ybWF0dGVyLkVSUk9SOgorICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgKyAxCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC5sZXZlbG5vID09IGZvcm1hdHRlci5XQVJOSU5HOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IHdhcm5pbmdzICsgMQorICAgICAgICAgICAgICAgICMgRm9yICJub3JtYWwiIGxvZ2dpbmcgY29uZGl0aW9ucywgZG9uJ3Qgc2hvdyBub3RlIGxvZ3MgZnJvbSB0YXNrcworICAgICAgICAgICAgICAgICMgYnV0IGRvIHNob3cgdGhlbSBpZiB0aGUgdXNlciBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBsb2cgbGV2ZWwgdG8KKyAgICAgICAgICAgICAgICAjIGluY2x1ZGUgdmVyYm9zZS9kZWJ1ZyBtZXNzYWdlcworICAgICAgICAgICAgICAgIGlmIGV2ZW50LnRhc2twaWQgIT0gMCBhbmQgZXZlbnQubGV2ZWxubyA8PSBmb3JtYXR0ZXIuTk9URToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGxvZ2dlci5oYW5kbGUoZXZlbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza0ZhaWxlZCk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnVwZGF0ZV9hbmRfc3RvcmVfdGFzayhldmVudCkKKyAgICAgICAgICAgICAgICBsb2dmaWxlID0gZXZlbnQubG9nZmlsZQorICAgICAgICAgICAgICAgIGlmIGxvZ2ZpbGUgYW5kIG9zLnBhdGguZXhpc3RzKGxvZ2ZpbGUpOgorICAgICAgICAgICAgICAgICAgICBiYi5lcnJvcigiTG9nZmlsZSBvZiBmYWlsdXJlIHN0b3JlZCBpbjogJXMiICUgbG9nZmlsZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIHRoZXNlIGV2ZW50cyBhcmUgdW5wcm9jZXNzZWQgbm93LCBidXQgbWF5IGJlIHVzZWQgaW4gdGhlIGZ1dHVyZSB0byBsb2cKKyAgICAgICAgICAgICMgdGltaW5nIGFuZCBlcnJvciBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgcGFyc2luZyBwaGFzZSBpbiBUb2FzdGVyCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuU2FuaXR5Q2hlY2tQYXNzZWQsIGJiLmV2ZW50LlNhbml0eUNoZWNrKSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlU3RhcnRlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LlBhcnNlUHJvZ3Jlc3MpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5QYXJzZUNvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZFN0YXJ0ZWQpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5DYWNoZUxvYWRQcm9ncmVzcyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50LkNhY2hlTG9hZENvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmV2ZW50Lk11bHRpcGxlUHJvdmlkZXJzKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygibXVsdGlwbGUgcHJvdmlkZXJzIGFyZSBhdmFpbGFibGUgZm9yICVzJXMgKCVzKSIsIGV2ZW50Ll9pc19ydW50aW1lIGFuZCAicnVudGltZSAiIG9yICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9pdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIuam9pbihldmVudC5fY2FuZGlkYXRlcykpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNvbnNpZGVyIGRlZmluaW5nIGEgUFJFRkVSUkVEX1BST1ZJREVSIGVudHJ5IHRvIG1hdGNoICVzIiwgZXZlbnQuX2l0ZW0pCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTm9Qcm92aWRlcik6CisgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzICsgMQorICAgICAgICAgICAgICAgIGlmIGV2ZW50Ll9ydW50aW1lOgorICAgICAgICAgICAgICAgICAgICByID0gIlIiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgciA9ICIiCisKKyAgICAgICAgICAgICAgICBpZiBldmVudC5fZGVwZW5kZWVzOgorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIk5vdGhpbmcgJXNQUk9WSURFUyAnJXMnIChidXQgJXMgJXNERVBFTkRTIG9uIG9yIG90aGVyd2lzZSByZXF1aXJlcyBpdCkiICUgKHIsIGV2ZW50Ll9pdGVtLCAiLCAiLmpvaW4oZXZlbnQuX2RlcGVuZGVlcyksIHIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJOb3RoaW5nICVzUFJPVklERVMgJyVzJyIgJSAociwgZXZlbnQuX2l0ZW0pCisKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IodGV4dCkKKyAgICAgICAgICAgICAgICBpZiBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHJlYXNvbiBpbiBldmVudC5fcmVhc29uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiJXMiLCByZWFzb24pCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHJlYXNvbgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9sb2dfZXJyb3IodGV4dCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5Db25maWdQYXJzZWQpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5SZWNpcGVQYXJzZWQpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgZW5kIG9mIHNhdmVkIGV2ZW50cworCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkLCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTdGFydGVkLCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tTa2lwcGVkKSk6CisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX3N0YXJ0ZWRfdGFzayhldmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ydW5xdWV1ZS5ydW5RdWV1ZVRhc2tDb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci51cGRhdGVfYW5kX3N0b3JlX3Rhc2soZXZlbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUucnVuUXVldWVUYXNrRmFpbGVkKToKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIudXBkYXRlX2FuZF9zdG9yZV90YXNrKGV2ZW50KQorICAgICAgICAgICAgICAgIHRhc2tmYWlsdXJlcy5hcHBlbmQoZXZlbnQudGFza3N0cmluZykKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRhc2sgJXMgKCVzKSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhc2tpZCwgZXZlbnQudGFza3N0cmluZywgZXZlbnQuZXhpdGNvZGUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgKGJiLnJ1bnF1ZXVlLnNjZW5lUXVldWVUYXNrQ29tcGxldGVkLCBiYi5ydW5xdWV1ZS5zY2VuZVF1ZXVlVGFza0ZhaWxlZCkpOgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci51cGRhdGVfYW5kX3N0b3JlX3Rhc2soZXZlbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuVHJlZURhdGFQcmVwYXJhdGlvblN0YXJ0ZWQsIGJiLmV2ZW50LlRyZWVEYXRhUHJlcGFyYXRpb25Db21wbGV0ZWQpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuQnVpbGRDb21wbGV0ZWQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCkpOgorCisgICAgICAgICAgICAgICAgZXJyb3Jjb2RlID0gMAorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCk6CisgICAgICAgICAgICAgICAgICAgIGVycm9ycyArPSAxCisgICAgICAgICAgICAgICAgICAgIGVycm9yY29kZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQ6ICVzIiwgZXZlbnQuZXJyb3IpCisKKyAgICAgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgYnVpbGQgaW5mbyBoZWxwZXIgb24gQnVpbGRDb21wbGV0ZWQsIG5vdCBvbiBDb21tYW5kWFhYCisgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnVwZGF0ZV9idWlsZF9pbmZvcm1hdGlvbihldmVudCwgZXJyb3JzLCB3YXJuaW5ncywgdGFza2ZhaWx1cmVzKQorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5jbG9zZShlcnJvcmNvZGUpCisgICAgICAgICAgICAgICAgIyBtYXJrIHRoZSBsb2cgb3V0cHV0OyBjb250cm9sbGVycyBtYXkga2lsbCB0aGUgdG9hc3RlclVJIGFmdGVyIHNlZWluZyB0aGlzIGxvZworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUb2FzdGVyVUkgYnVpbGQgZG9uZSAxLCBicmJlOiAlcyIsIGJ1aWxkaW5mb2hlbHBlci5icmJlICkKKworICAgICAgICAgICAgICAgICMgd2Ugc3RhcnQgYSBuZXcgYnVpbGQgaW5mbworICAgICAgICAgICAgICAgIGlmIGJ1aWxkaW5mb2hlbHBlci5icmJlIGlzIG5vdCBOb25lOgorCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiVG9hc3RlclVJIHVuZGVyIEJ1aWxkRW52aXJvbm1lbnQgbWFuYWdlbWVudCAtIGV4aXRpbmcgYWZ0ZXIgdGhlIGJ1aWxkIikKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnRlcm1pbmF0ZVNlcnZlcigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJUb2FzdGVyVUkgcHJlcGFyZWQgZm9yIG5ldyBidWlsZCIpCisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IDAKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MgPSAwCisgICAgICAgICAgICAgICAgICAgIHRhc2tmYWlsdXJlcyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlciA9IEJ1aWxkSW5mb0hlbHBlcihzZXJ2ZXIsIGJ1aWxkX2hpc3RvcnlfZW5hYmxlZCkKKworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUb2FzdGVyVUkgYnVpbGQgZG9uZSAyIikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuY29tbWFuZC5Db21tYW5kQ29tcGxldGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmNvbW1hbmQuQ29tbWFuZEZhaWxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5jb21tYW5kLkNvbW1hbmRFeGl0KSk6CisgICAgICAgICAgICAgICAgZXJyb3Jjb2RlID0gMAorCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuZXZlbnQuTWV0YWRhdGFFdmVudCk6CisgICAgICAgICAgICAgICAgaWYgZXZlbnQudHlwZSA9PSAiU2luZ2xlUGFja2FnZUluZm8iOgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfYnVpbGRfcGFja2FnZV9pbmZvcm1hdGlvbihldmVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gIkxheWVySW5mbyI6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9sYXllcl9pbmZvKGV2ZW50KQorICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQudHlwZSA9PSAiQnVpbGRTdGF0c0xpc3QiOgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfdGFza3Nfc3RhdHMoZXZlbnQpCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC50eXBlID09ICJJbWFnZVBrZ0xpc3QiOgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfdGFyZ2V0X3BhY2thZ2VfZGF0YShldmVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gIk1pc3NlZFNzdGF0ZSI6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9taXNzZWRfc3RhdGVfdGFza3MoZXZlbnQpCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC50eXBlID09ICJJbWFnZUZpbGVTaXplIjoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnVwZGF0ZV90YXJnZXRfaW1hZ2VfZmlsZShldmVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LnR5cGUgPT0gIkFydGlmYWN0RmlsZVNpemUiOgorICAgICAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIudXBkYXRlX2FydGlmYWN0X2ltYWdlX2ZpbGUoZXZlbnQpCisgICAgICAgICAgICAgICAgZWxpZiBldmVudC50eXBlID09ICJMaWNlbnNlTWFuaWZlc3RQYXRoIjoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRpbmZvaGVscGVyLnN0b3JlX2xpY2Vuc2VfbWFuaWZlc3RfcGF0aChldmVudCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVucHJvY2Vzc2VkIE1ldGFkYXRhRXZlbnQgJXMgIiwgc3RyKGV2ZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5jb29rZXIuQ29va2VyRXhpdCk6CisgICAgICAgICAgICAgICAgIyBleGl0IHdoZW4gdGhlIHNlcnZlciBleGl0cworICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgaWdub3JlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCAoYmIuZXZlbnQuQnVpbGRCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LlN0YW1wVXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLmV2ZW50LlJlY2lwZVByZUZpbmFsaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiLnJ1bnF1ZXVlLnJ1blF1ZXVlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIucnVucXVldWUucnVuUXVldWVFeGl0V2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5ldmVudC5PcGVyYXRpb25Qcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5jb21tYW5kLkNvbW1hbmRGYWlsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIuY29tbWFuZC5Db21tYW5kRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYi5jb21tYW5kLkNvbW1hbmRDb21wbGV0ZWQpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5ldmVudC5EZXBUcmVlR2VuZXJhdGVkKToKKyAgICAgICAgICAgICAgICBidWlsZGluZm9oZWxwZXIuc3RvcmVfZGVwZW5kZW5jeV9pbmZvcm1hdGlvbihldmVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVua25vd24gZXZlbnQ6ICVzIiwgZXZlbnQpCisgICAgICAgICAgICByZXR1cm5fdmFsdWUgKz0gMQorCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGlvZXJyb3I6CisgICAgICAgICAgICAjIGlnbm9yZSBpbnRlcnJ1cHRlZCBpbworICAgICAgICAgICAgaWYgaW9lcnJvci5hcmdzWzBdID09IDQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBtYWluLnNodXRkb3duID0gMQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAjIHByaW50IGVycm9ycyB0byBsb2cKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIGZyb20gcHByaW50IGltcG9ydCBwZm9ybWF0CisgICAgICAgICAgICBleGNlcHRpb25fZGF0YSA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiJXNcbiVzIiAsIGUsIGV4Y2VwdGlvbl9kYXRhKQorCisgICAgICAgICAgICBfLCBfLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBpZiB0YiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjdXJyID0gdGIKKyAgICAgICAgICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiRXJyb3IgZGF0YSBkdW1wICVzXG4lc1xuIiAsIHRyYWNlYmFjay5mb3JtYXRfdGIoY3VyciwxKSwgcGZvcm1hdChjdXJyLnRiX2ZyYW1lLmZfbG9jYWxzKSkKKyAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnIudGJfbmV4dAorCisgICAgICAgICAgICAjIHNhdmUgdGhlbSB0byBkYXRhYmFzZSwgaWYgcG9zc2libGU7IGlmIGl0IGZhaWxzLCB3ZSBhbHJlYWR5IGxvZ2dlZCB0byBjb25zb2xlLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJ1aWxkaW5mb2hlbHBlci5zdG9yZV9sb2dfZXhjZXB0aW9uKCIlc1xuJXMiICUgKHN0cihlKSwgZXhjZXB0aW9uX2RhdGEpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBjZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNSSVRJQ0FMIC0gRmFpbGVkIHRvIHRvIHNhdmUgdG9hc3RlciBleGNlcHRpb24gdG8gdGhlIGRhdGFiYXNlOiAlcyIsIHN0cihjZSkpCisKKyAgICAgICAgICAgICMgbWFrZSBzdXJlIHdlIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAgICAgICAgICByZXR1cm5fdmFsdWUgKz0gMQorCisgICAgaWYgaW50ZXJydXB0ZWQ6CisgICAgICAgIGlmIHJldHVybl92YWx1ZSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICs9IDEKKworICAgIGxvZ2dlci53YXJuKCJSZXR1cm4gdmFsdWUgaXMgJWQiLCByZXR1cm5fdmFsdWUpCisgICAgcmV0dXJuIHJldHVybl92YWx1ZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYmIvdWkvdWlldmVudC5weSBiL2JpdGJha2UvbGliL2JiL3VpL3VpZXZlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjNTBjNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JiL3VpL3VpZXZlbnQucHkKQEAgLTAsMCArMSwxNTUgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgIE1pY2hhZWwgJ01pY2tleScgTGF1ZXIKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyAgUmljaGFyZCBQdXJkaWUKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworIiIiCitVc2UgdGhpcyBjbGFzcyB0byBmb3JrIG9mZiBhIHRocmVhZCB0byByZWNpZXZlIGV2ZW50IGNhbGxiYWNrcyBmcm9tIHRoZSBiaXRiYWtlCitzZXJ2ZXIgYW5kIHF1ZXVlIHRoZW0gZm9yIHRoZSBVSSB0byBwcm9jZXNzLiBUaGlzIHByb2Nlc3MgbXVzdCBiZSB1c2VkIHRvIGF2b2lkCitjbGllbnQvc2VydmVyIGRlYWRsb2Nrcy4KKyIiIgorCitpbXBvcnQgc29ja2V0LCB0aHJlYWRpbmcsIHBpY2tsZQorZnJvbSBTaW1wbGVYTUxSUENTZXJ2ZXIgaW1wb3J0IFNpbXBsZVhNTFJQQ1NlcnZlciwgU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIKKworY2xhc3MgQkJVSUV2ZW50UXVldWU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIEJCU2VydmVyLCBjbGllbnRpbmZvPSgibG9jYWxob3N0LCAwIikpOgorCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZSA9IFtdCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZUxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZU5vdGlmeSA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgc2VsZi5CQlNlcnZlciA9IEJCU2VydmVyCisgICAgICAgIHNlbGYuY2xpZW50aW5mbyA9IGNsaWVudGluZm8KKworICAgICAgICBzZXJ2ZXIgPSBVSVhNTFJQQ1NlcnZlcihzZWxmLmNsaWVudGluZm8pCisgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0ID0gc2VydmVyLnNvY2tldC5nZXRzb2NrbmFtZSgpCisKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKCBzZWxmLnN5c3RlbV9xdWl0LCAiZXZlbnQucXVpdCIgKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oIHNlbGYuc2VuZF9ldmVudCwgImV2ZW50LnNlbmRwaWNrbGUiICkKKyAgICAgICAgc2VydmVyLnNvY2tldC5zZXR0aW1lb3V0KDEpCisKKyAgICAgICAgc2VsZi5FdmVudEhhbmRsZXIgPSBOb25lCisgICAgICAgIGNvdW50X3RyaWVzID0gMAorCisgICAgICAgICMgdGhlIGV2ZW50IGhhbmRsZXIgcmVnaXN0cmF0aW9uIG1heSBmYWlsIGhlcmUgZHVlIHRvIGNvb2tlciBiZWluZyBpbiBpbnZhbGlkIHN0YXRlCisgICAgICAgICMgdGhpcyBpcyBhIHRyYW5zaWVudCBzaXR1YXRpb24sIGFuZCB3ZSBzaG91bGQgcmV0cnkgYSBjb3VwbGUgb2YgdGltZXMgYmVmb3JlCisgICAgICAgICMgZ2l2aW5nIHVwCisKKyAgICAgICAgd2hpbGUgc2VsZi5FdmVudEhhbmRsZXIgPT0gTm9uZSBhbmQgY291bnRfdHJpZXMgPCA1OgorICAgICAgICAgICAgc2VsZi5FdmVudEhhbmRsZSA9IHNlbGYuQkJTZXJ2ZXIucmVnaXN0ZXJFdmVudEhhbmRsZXIoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisKKyAgICAgICAgICAgIGlmIChzZWxmLkV2ZW50SGFuZGxlICE9IE5vbmUpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGJiLndhcm4oIkNvdWxkIG5vdCByZWdpc3RlciBVSSBldmVudCBoYW5kbGVyICVzOiVkLCByZXRyeSIgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpKQorICAgICAgICAgICAgY291bnRfdHJpZXMgKz0gMQorICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKworCisgICAgICAgIGlmIHNlbGYuRXZlbnRIYW5kbGUgPT0gTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ291bGQgbm90IHJlZ2lzdGVyIFVJIGV2ZW50IGhhbmRsZXIiKQorCisgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisKKyAgICAgICAgc2VsZi50ID0gdGhyZWFkaW5nLlRocmVhZCgpCisgICAgICAgIHNlbGYudC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgc2VsZi50LnJ1biA9IHNlbGYuc3RhcnRDYWxsYmFja0hhbmRsZXIKKyAgICAgICAgc2VsZi50LnN0YXJ0KCkKKworICAgIGRlZiBnZXRFdmVudChzZWxmKToKKworICAgICAgICBzZWxmLmV2ZW50UXVldWVMb2NrLmFjcXVpcmUoKQorCisgICAgICAgIGlmIGxlbihzZWxmLmV2ZW50UXVldWUpID09IDA6CisgICAgICAgICAgICBzZWxmLmV2ZW50UXVldWVMb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpdGVtID0gc2VsZi5ldmVudFF1ZXVlLnBvcCgwKQorCisgICAgICAgIGlmIGxlbihzZWxmLmV2ZW50UXVldWUpID09IDA6CisgICAgICAgICAgICBzZWxmLmV2ZW50UXVldWVOb3RpZnkuY2xlYXIoKQorCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZUxvY2sucmVsZWFzZSgpCisgICAgICAgIHJldHVybiBpdGVtCisKKyAgICBkZWYgd2FpdEV2ZW50KHNlbGYsIGRlbGF5KToKKyAgICAgICAgc2VsZi5ldmVudFF1ZXVlTm90aWZ5LndhaXQoZGVsYXkpCisgICAgICAgIHJldHVybiBzZWxmLmdldEV2ZW50KCkKKworICAgIGRlZiBxdWV1ZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZUxvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZS5hcHBlbmQoZXZlbnQpCisgICAgICAgIHNlbGYuZXZlbnRRdWV1ZU5vdGlmeS5zZXQoKQorICAgICAgICBzZWxmLmV2ZW50UXVldWVMb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHNlbmRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLnF1ZXVlX2V2ZW50KHBpY2tsZS5sb2FkcyhldmVudCkpCisKKyAgICBkZWYgc3RhcnRDYWxsYmFja0hhbmRsZXIoc2VsZik6CisKKyAgICAgICAgc2VsZi5zZXJ2ZXIudGltZW91dCA9IDEKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuc2VydmVyLnF1aXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkJCVUlFdmVudFF1ZXVlLnN0YXJ0Q2FsbGJhY2tIYW5kbGVyOiBFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIGhhbmRsZSByZXF1ZXN0OiAlc1xuJXMiICUgKGUsIHRyYWNlYmFjay5mb3JtYXRfZXhjKGUpKSkKKworICAgICAgICBzZWxmLnNlcnZlci5zZXJ2ZXJfY2xvc2UoKQorCisgICAgZGVmIHN5c3RlbV9xdWl0KCBzZWxmICk6CisgICAgICAgICIiIgorICAgICAgICBTaHV0IGRvd24gdGhlIGNhbGxiYWNrIHRocmVhZAorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5CQlNlcnZlci51bnJlZ2lzdGVyRXZlbnRIYW5kbGVyKHNlbGYuRXZlbnRIYW5kbGUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5zZXJ2ZXIucXVpdCA9IFRydWUKKworY2xhc3MgVUlYTUxSUENTZXJ2ZXIgKFNpbXBsZVhNTFJQQ1NlcnZlcik6CisKKyAgICBkZWYgX19pbml0X18oIHNlbGYsIGludGVyZmFjZSApOgorICAgICAgICBzZWxmLnF1aXQgPSBGYWxzZQorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuX19pbml0X18oIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcj1TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPUZhbHNlLCBhbGxvd19ub25lPVRydWUpCisKKyAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc29jaywgYWRkciA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgc29jay5zZXR0aW1lb3V0KDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIChzb2NrLCBhZGRyKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIChOb25lLCBOb25lKQorCisgICAgZGVmIGNsb3NlX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgIGlmIHJlcXVlc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuY2xvc2VfcmVxdWVzdChzZWxmLCByZXF1ZXN0KQorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgIGlmIHJlcXVlc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIucHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91aS91aWhlbHBlci5weSBiL2JpdGJha2UvbGliL2JiL3VpL3VpaGVscGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDMzODcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91aS91aWhlbHBlci5weQpAQCAtMCwwICsxLDEwMCBAQAorIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyAgTWljaGFlbCAnTWlja2V5JyBMYXVlcgorIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBSaWNoYXJkIFB1cmRpZQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworaW1wb3J0IGJiLmJ1aWxkCisKK2NsYXNzIEJCVUlIZWxwZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm5lZWRVcGRhdGUgPSBGYWxzZQorICAgICAgICBzZWxmLnJ1bm5pbmdfdGFza3MgPSB7fQorICAgICAgICAjIFJ1bm5pbmcgUElEcyBwcmVzZXJ2ZXMgdGhlIG9yZGVyIHRhc2tzIHdlcmUgZXhlY3V0ZWQgaW4KKyAgICAgICAgc2VsZi5ydW5uaW5nX3BpZHMgPSBbXQorICAgICAgICBzZWxmLmZhaWxlZF90YXNrcyA9IFtdCisgICAgICAgIHNlbGYudGFza251bWJlcl9jdXJyZW50ID0gMAorICAgICAgICBzZWxmLnRhc2tudW1iZXJfdG90YWwgPSAwCisKKyAgICBkZWYgZXZlbnRIYW5kbGVyKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza1N0YXJ0ZWQpOgorICAgICAgICAgICAgc2VsZi5ydW5uaW5nX3Rhc2tzW2V2ZW50LnBpZF0gPSB7ICd0aXRsZScgOiAiJXMgJXMiICUgKGV2ZW50Ll9wYWNrYWdlLCBldmVudC5fdGFzaykgfQorICAgICAgICAgICAgc2VsZi5ydW5uaW5nX3BpZHMuYXBwZW5kKGV2ZW50LnBpZCkKKyAgICAgICAgICAgIHNlbGYubmVlZFVwZGF0ZSA9IFRydWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIuYnVpbGQuVGFza1N1Y2NlZWRlZCk6CisgICAgICAgICAgICBkZWwgc2VsZi5ydW5uaW5nX3Rhc2tzW2V2ZW50LnBpZF0KKyAgICAgICAgICAgIHNlbGYucnVubmluZ19waWRzLnJlbW92ZShldmVudC5waWQpCisgICAgICAgICAgICBzZWxmLm5lZWRVcGRhdGUgPSBUcnVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIGJiLmJ1aWxkLlRhc2tGYWlsZWRTaWxlbnQpOgorICAgICAgICAgICAgZGVsIHNlbGYucnVubmluZ190YXNrc1tldmVudC5waWRdCisgICAgICAgICAgICBzZWxmLnJ1bm5pbmdfcGlkcy5yZW1vdmUoZXZlbnQucGlkKQorICAgICAgICAgICAgIyBEb24ndCBhZGQgdG8gdGhlIGZhaWxlZCB0YXNrcyBsaXN0IHNpbmNlIHRoaXMgaXMgZS5nLiBhIHNldHNjZW5lIHRhc2sgZmFpbHVyZQorICAgICAgICAgICAgc2VsZi5uZWVkVXBkYXRlID0gVHJ1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBiYi5idWlsZC5UYXNrRmFpbGVkKToKKyAgICAgICAgICAgIGRlbCBzZWxmLnJ1bm5pbmdfdGFza3NbZXZlbnQucGlkXQorICAgICAgICAgICAgc2VsZi5ydW5uaW5nX3BpZHMucmVtb3ZlKGV2ZW50LnBpZCkKKyAgICAgICAgICAgIHNlbGYuZmFpbGVkX3Rhc2tzLmFwcGVuZCggeyAndGl0bGUnIDogIiVzICVzIiAlIChldmVudC5fcGFja2FnZSwgZXZlbnQuX3Rhc2spfSkKKyAgICAgICAgICAgIHNlbGYubmVlZFVwZGF0ZSA9IFRydWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUucnVuUXVldWVUYXNrU3RhcnRlZCkgb3IgaXNpbnN0YW5jZShldmVudCwgYmIucnVucXVldWUuc2NlbmVRdWV1ZVRhc2tTdGFydGVkKToKKyAgICAgICAgICAgIHNlbGYudGFza251bWJlcl9jdXJyZW50ID0gZXZlbnQuc3RhdHMuY29tcGxldGVkICsgZXZlbnQuc3RhdHMuYWN0aXZlICsgZXZlbnQuc3RhdHMuZmFpbGVkICsgMQorICAgICAgICAgICAgc2VsZi50YXNrbnVtYmVyX3RvdGFsID0gZXZlbnQuc3RhdHMudG90YWwKKyAgICAgICAgICAgIHNlbGYubmVlZFVwZGF0ZSA9IFRydWUKKworICAgIGRlZiBnZXRUYXNrcyhzZWxmKToKKyAgICAgICAgc2VsZi5uZWVkVXBkYXRlID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIChzZWxmLnJ1bm5pbmdfdGFza3MsIHNlbGYuZmFpbGVkX3Rhc2tzKQorCisgICAgZGVmIGZpbmRTZXJ2ZXJEZXRhaWxzKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGltcG9ydCBvcHRwYXJzZQorICAgICAgICBmcm9tIGJiLnNlcnZlci54bWxycGMgaW1wb3J0IEJpdGJha2VTZXJ2ZXJJbmZvLCBCaXRCYWtlU2VydmVyQ29ubmVjdGlvbgorICAgICAgICBob3N0ID0gIiIKKyAgICAgICAgcG9ydCA9IDAKKyAgICAgICAgYmluZCA9ICIiCisgICAgICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigKKyAgICAgICAgICAgIHVzYWdlID0gIiIiJXByb2cgLUggaG9zdCAtUCBwb3J0IC1CIGJpbmRhZGRyIiIiKQorCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCItSCIsICItLWhvc3QiLCBoZWxwID0gIkJpdGJha2Ugc2VydmVyJ3MgSVAgYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJob3N0IiwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1QIiwgIi0tcG9ydCIsIGhlbHAgPSAiQml0YmFrZSBzZXJ2ZXIncyBQb3J0IG51bWJlciIsCisgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gInN0b3JlIiwgZGVzdCA9ICJwb3J0IiwgZGVmYXVsdCA9IE5vbmUpCisKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1CIiwgIi0tYmluZCIsIGhlbHAgPSAiSG9iMiBsb2NhbCBiaW5kIGFkZHJlc3MiLAorICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJzdG9yZSIsIGRlc3QgPSAiYmluZCIsIGRlZmF1bHQgPSBOb25lKQorCisgICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndikKKyAgICAgICAgZm9yIGtleSwgdmFsIGluIG9wdGlvbnMuX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleSA9PSAnaG9zdCcgYW5kIHZhbDoKKyAgICAgICAgICAgICAgICBob3N0ID0gdmFsCisgICAgICAgICAgICBlbGlmIGtleSA9PSAncG9ydCcgYW5kIHZhbDoKKyAgICAgICAgICAgICAgICBwb3J0ID0gaW50KHZhbCkKKyAgICAgICAgICAgIGVsaWYga2V5ID09ICdiaW5kJyBhbmQgdmFsOgorICAgICAgICAgICAgICAgIGJpbmQgPSB2YWwKKworICAgICAgICBpZiBub3QgaG9zdCBvciBub3QgcG9ydCBvciBub3QgYmluZDoKKyAgICAgICAgICAgIHBhcnNlci5wcmludF91c2FnZSgpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIHNlcnZlcmluZm8gPSBCaXRiYWtlU2VydmVySW5mbyhob3N0LCBwb3J0KQorICAgICAgICBjbGllbnRpbmZvID0gKGJpbmQsIDApCisgICAgICAgIGNvbm5lY3Rpb24gPSBCaXRCYWtlU2VydmVyQ29ubmVjdGlvbihzZXJ2ZXJpbmZvLCBjbGllbnRpbmZvKQorCisgICAgICAgIHNlcnZlciA9IGNvbm5lY3Rpb24uY29ubmVjdGlvbgorICAgICAgICBldmVudEhhbmRsZXIgPSBjb25uZWN0aW9uLmV2ZW50cworCisgICAgICAgIHJldHVybiBzZXJ2ZXIsIGV2ZW50SGFuZGxlciwgaG9zdCwgYmluZAorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iYi91dGlscy5weSBiL2JpdGJha2UvbGliL2JiL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZmFhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iYi91dGlscy5weQpAQCAtMCwwICsxLDEzMTIgQEAKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisiIiIKK0JpdEJha2UgVXRpbGl0eSBGdW5jdGlvbnMKKyIiIgorCisjIENvcHlyaWdodCAoQykgMjAwNCBNaWNoYWVsIExhdWVyCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCitpbXBvcnQgcmUsIGZjbnRsLCBvcywgc3RyaW5nLCBzdGF0LCBzaHV0aWwsIHRpbWUKK2ltcG9ydCBzeXMKK2ltcG9ydCBlcnJubworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBiYgoraW1wb3J0IGJiLm1zZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IGZjbnRsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGdsb2IKK2ltcG9ydCBmbm1hdGNoCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgZXJybm8KK2ltcG9ydCBzaWduYWwKK2Zyb20gY29tbWFuZHMgaW1wb3J0IGdldHN0YXR1c291dHB1dAorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorZnJvbSBjdHlwZXMgaW1wb3J0IGNkbGwKKworCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiQml0QmFrZS5VdGlsIikKKworZGVmIGNsZWFuX2NvbnRleHQoKToKKyAgICByZXR1cm4geworICAgICAgICAib3MiOiBvcywKKyAgICAgICAgImJiIjogYmIsCisgICAgICAgICJ0aW1lIjogdGltZSwKKyAgICB9CisKK2RlZiBnZXRfY29udGV4dCgpOgorICAgIHJldHVybiBfY29udGV4dAorICAgIAorCitkZWYgc2V0X2NvbnRleHQoY3R4KToKKyAgICBfY29udGV4dCA9IGN0eAorCisjIENvbnRleHQgdXNlZCBpbiBiZXR0ZXJfZXhlYywgZXZhbAorX2NvbnRleHQgPSBjbGVhbl9jb250ZXh0KCkKKworY2xhc3MgVmVyc2lvblN0cmluZ0V4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBpbnZhbGlkIHZlcnNpb24gc3BlY2lmaWNhdGlvbiBpcyBmb3VuZCIiIgorCitkZWYgZXhwbG9kZV92ZXJzaW9uKHMpOgorICAgIHIgPSBbXQorICAgIGFscGhhX3JlZ2V4cCA9IHJlLmNvbXBpbGUoJ14oW2EtekEtWl0rKSguKikkJykKKyAgICBudW1lcmljX3JlZ2V4cCA9IHJlLmNvbXBpbGUoJ14oXGQrKSguKikkJykKKyAgICB3aGlsZSAocyAhPSAnJyk6CisgICAgICAgIGlmIHNbMF0gaW4gc3RyaW5nLmRpZ2l0czoKKyAgICAgICAgICAgIG0gPSBudW1lcmljX3JlZ2V4cC5tYXRjaChzKQorICAgICAgICAgICAgci5hcHBlbmQoKDAsIGludChtLmdyb3VwKDEpKSkpCisgICAgICAgICAgICBzID0gbS5ncm91cCgyKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgc1swXSBpbiBzdHJpbmcubGV0dGVyczoKKyAgICAgICAgICAgIG0gPSBhbHBoYV9yZWdleHAubWF0Y2gocykKKyAgICAgICAgICAgIHIuYXBwZW5kKCgxLCBtLmdyb3VwKDEpKSkKKyAgICAgICAgICAgIHMgPSBtLmdyb3VwKDIpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBzWzBdID09ICd+JzoKKyAgICAgICAgICAgIHIuYXBwZW5kKCgtMSwgc1swXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByLmFwcGVuZCgoMiwgc1swXSkpCisgICAgICAgIHMgPSBzWzE6XQorICAgIHJldHVybiByCisKK2RlZiBzcGxpdF92ZXJzaW9uKHMpOgorICAgICIiIlNwbGl0IGEgdmVyc2lvbiBzdHJpbmcgaW50byBpdHMgY29uc3RpdHVlbnQgcGFydHMgKFBFLCBQViwgUFIpIiIiCisgICAgcyA9IHMuc3RyaXAoIiA8Pj0iKQorICAgIGUgPSAwCisgICAgaWYgcy5jb3VudCgnOicpOgorICAgICAgICBlID0gaW50KHMuc3BsaXQoIjoiKVswXSkKKyAgICAgICAgcyA9IHMuc3BsaXQoIjoiKVsxXQorICAgIHIgPSAiIgorICAgIGlmIHMuY291bnQoJy0nKToKKyAgICAgICAgciA9IHMucnNwbGl0KCItIiwgMSlbMV0KKyAgICAgICAgcyA9IHMucnNwbGl0KCItIiwgMSlbMF0KKyAgICB2ID0gcworICAgIHJldHVybiAoZSwgdiwgcikKKworZGVmIHZlcmNtcF9wYXJ0KGEsIGIpOgorICAgIHZhID0gZXhwbG9kZV92ZXJzaW9uKGEpCisgICAgdmIgPSBleHBsb2RlX3ZlcnNpb24oYikKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiB2YSA9PSBbXToKKyAgICAgICAgICAgIChvYSwgY2EpID0gKDAsIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAob2EsIGNhKSA9IHZhLnBvcCgwKQorICAgICAgICBpZiB2YiA9PSBbXToKKyAgICAgICAgICAgIChvYiwgY2IpID0gKDAsIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAob2IsIGNiKSA9IHZiLnBvcCgwKQorICAgICAgICBpZiAob2EsIGNhKSA9PSAoMCwgTm9uZSkgYW5kIChvYiwgY2IpID09ICgwLCBOb25lKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGlmIG9hIDwgb2I6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxpZiBvYSA+IG9iOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxpZiBjYSA8IGNiOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGVsaWYgY2EgPiBjYjoKKyAgICAgICAgICAgIHJldHVybiAxCisKK2RlZiB2ZXJjbXAodGEsIHRiKToKKyAgICAoZWEsIHZhLCByYSkgPSB0YQorICAgIChlYiwgdmIsIHJiKSA9IHRiCisKKyAgICByID0gaW50KGVhIG9yIDApIC0gaW50KGViIG9yIDApCisgICAgaWYgKHIgPT0gMCk6CisgICAgICAgIHIgPSB2ZXJjbXBfcGFydCh2YSwgdmIpCisgICAgaWYgKHIgPT0gMCk6CisgICAgICAgIHIgPSB2ZXJjbXBfcGFydChyYSwgcmIpCisgICAgcmV0dXJuIHIKKworZGVmIHZlcmNtcF9zdHJpbmcoYSwgYik6CisgICAgdGEgPSBzcGxpdF92ZXJzaW9uKGEpCisgICAgdGIgPSBzcGxpdF92ZXJzaW9uKGIpCisgICAgcmV0dXJuIHZlcmNtcCh0YSwgdGIpCisKK2RlZiB2ZXJjbXBfc3RyaW5nX29wKGEsIGIsIG9wKToKKyAgICAiIiIKKyAgICBDb21wYXJlIHR3byB2ZXJzaW9ucyBhbmQgY2hlY2sgaWYgdGhlIHNwZWNpZmllZCBjb21wYXJpc29uIG9wZXJhdG9yIG1hdGNoZXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbi4KKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGZhaXJseSBsaWJlcmFsIGFib3V0IHdoYXQgb3BlcmF0b3JzIGl0IHdpbGwgYWNjZXB0IHNpbmNlIHRoZXJlIGFyZSBhIHZhcmlldHkgb2Ygc3R5bGVzCisgICAgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LgorICAgICIiIgorICAgIHJlcyA9IHZlcmNtcF9zdHJpbmcoYSwgYikKKyAgICBpZiBvcCBpbiAoJz0nLCAnPT0nKToKKyAgICAgICAgcmV0dXJuIHJlcyA9PSAwCisgICAgZWxpZiBvcCA9PSAnPD0nOgorICAgICAgICByZXR1cm4gcmVzIDw9IDAKKyAgICBlbGlmIG9wID09ICc+PSc6CisgICAgICAgIHJldHVybiByZXMgPj0gMAorICAgIGVsaWYgb3AgaW4gKCc+JywgJz4+Jyk6CisgICAgICAgIHJldHVybiByZXMgPiAwCisgICAgZWxpZiBvcCBpbiAoJzwnLCAnPDwnKToKKyAgICAgICAgcmV0dXJuIHJlcyA8IDAKKyAgICBlbGlmIG9wID09ICchPSc6CisgICAgICAgIHJldHVybiByZXMgIT0gMAorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZlcnNpb25TdHJpbmdFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIGNvbXBhcmlzb24gb3BlcmF0b3IgIiVzIicgJSBvcCkKKworZGVmIGV4cGxvZGVfZGVwcyhzKToKKyAgICAiIiIKKyAgICBUYWtlIGFuIFJERVBFTkRTIHN0eWxlIHN0cmluZyBvZiBmb3JtYXQ6CisgICAgIkRFUEVORDEgKG9wdGlvbmFsIHZlcnNpb24pIERFUEVORDIgKG9wdGlvbmFsIHZlcnNpb24pIC4uLiIKKyAgICBhbmQgcmV0dXJuIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMuCisgICAgVmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBpZ25vcmVkLgorICAgICIiIgorICAgIHIgPSBbXQorICAgIGwgPSBzLnNwbGl0KCkKKyAgICBmbGFnID0gRmFsc2UKKyAgICBmb3IgaSBpbiBsOgorICAgICAgICBpZiBpWzBdID09ICcoJzoKKyAgICAgICAgICAgIGZsYWcgPSBUcnVlCisgICAgICAgICAgICAjaiA9IFtdCisgICAgICAgIGlmIG5vdCBmbGFnOgorICAgICAgICAgICAgci5hcHBlbmQoaSkKKyAgICAgICAgI2Vsc2U6CisgICAgICAgICMgICAgai5hcHBlbmQoaSkKKyAgICAgICAgaWYgZmxhZyBhbmQgaS5lbmRzd2l0aCgnKScpOgorICAgICAgICAgICAgZmxhZyA9IEZhbHNlCisgICAgICAgICAgICAjIElnbm9yZSB2ZXJzaW9uCisgICAgICAgICAgICAjclstMV0gKz0gJyAnICsgJyAnLmpvaW4oaikKKyAgICByZXR1cm4gcgorCitkZWYgZXhwbG9kZV9kZXBfdmVyc2lvbnMyKHMpOgorICAgICIiIgorICAgIFRha2UgYW4gUkRFUEVORFMgc3R5bGUgc3RyaW5nIG9mIGZvcm1hdDoKKyAgICAiREVQRU5EMSAob3B0aW9uYWwgdmVyc2lvbikgREVQRU5EMiAob3B0aW9uYWwgdmVyc2lvbikgLi4uIgorICAgIGFuZCByZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIGRlcGVuZGVuY2llcyBhbmQgdmVyc2lvbnMuCisgICAgIiIiCisgICAgciA9IHt9CisgICAgbCA9IHMucmVwbGFjZSgiLCIsICIiKS5zcGxpdCgpCisgICAgbGFzdGRlcCA9IE5vbmUKKyAgICBsYXN0Y21wID0gIiIKKyAgICBsYXN0dmVyID0gIiIKKyAgICBpbmNtcCA9IEZhbHNlCisgICAgaW52ZXJzaW9uID0gRmFsc2UKKyAgICBmb3IgaSBpbiBsOgorICAgICAgICBpZiBpWzBdID09ICcoJzoKKyAgICAgICAgICAgIGluY21wID0gVHJ1ZQorICAgICAgICAgICAgaSA9IGlbMTpdLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgaW5jbXA6CisgICAgICAgICAgICBpbmNtcCA9IEZhbHNlCisgICAgICAgICAgICBpbnZlcnNpb24gPSBUcnVlCisgICAgICAgICAgICAjIFRoaXMgbGlzdCBpcyBiYXNlZCBvbiBiZWhhdmlvciBhbmQgc3VwcG9ydGVkIGNvbXBhcmlzb25zIGZyb20gZGViLCBvcGtnIGFuZCBycG0uCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEV2ZW4gdGhvdWdoID08LCA8PCwgPT0sICE9LCA9PiwgYW5kID4+IG1heSBub3QgYmUgc3VwcG9ydGVkLCAKKyAgICAgICAgICAgICMgd2UgbGlzdCBlYWNoIHBvc3NpYmx5IHZhbGlkIGl0ZW0uIAorICAgICAgICAgICAgIyBUaGUgYnVpbGQgc3lzdGVtIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW9uIG9mIHdoYXQgaXQgc3VwcG9ydHMuCisgICAgICAgICAgICBpZiBpLnN0YXJ0c3dpdGgoKCc8PScsICc9PCcsICc8PCcsICc9PScsICchPScsICc+PScsICc9PicsICc+PicpKToKKyAgICAgICAgICAgICAgICBsYXN0Y21wID0gaVswOjJdCisgICAgICAgICAgICAgICAgaSA9IGlbMjpdCisgICAgICAgICAgICBlbGlmIGkuc3RhcnRzd2l0aCgoJzwnLCAnPicsICc9JykpOgorICAgICAgICAgICAgICAgIGxhc3RjbXAgPSBpWzA6MV0KKyAgICAgICAgICAgICAgICBpID0gaVsxOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIHVuc3VwcG9ydGVkIGNhc2UhCisgICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvblN0cmluZ0V4Y2VwdGlvbignSW52YWxpZCB2ZXJzaW9uIHNwZWNpZmljYXRpb24gaW4gIiglcyIgLSBpbnZhbGlkIG9yIG1pc3Npbmcgb3BlcmF0b3InICUgaSkKKyAgICAgICAgICAgICAgICBsYXN0Y21wID0gKGkgb3IgIiIpCisgICAgICAgICAgICAgICAgaSA9ICIiCisgICAgICAgICAgICBpLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgaW52ZXJzaW9uOgorICAgICAgICAgICAgaWYgaS5lbmRzd2l0aCgnKScpOgorICAgICAgICAgICAgICAgIGkgPSBpWzotMV0gb3IgIiIKKyAgICAgICAgICAgICAgICBpbnZlcnNpb24gPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIGxhc3R2ZXIgYW5kIGk6CisgICAgICAgICAgICAgICAgICAgIGxhc3R2ZXIgKz0gIiAiCisgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgIGxhc3R2ZXIgKz0gaQorICAgICAgICAgICAgICAgIGlmIGxhc3RkZXAgbm90IGluIHI6CisgICAgICAgICAgICAgICAgICAgIHJbbGFzdGRlcF0gPSBbXQorICAgICAgICAgICAgICAgIHJbbGFzdGRlcF0uYXBwZW5kKGxhc3RjbXAgKyAiICIgKyBsYXN0dmVyKQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAjaWYgbm90IGludmVyc2lvbjoKKyAgICAgICAgbGFzdGRlcCA9IGkKKyAgICAgICAgbGFzdHZlciA9ICIiCisgICAgICAgIGxhc3RjbXAgPSAiIgorICAgICAgICBpZiBub3QgKGkgaW4gciBhbmQgcltpXSk6CisgICAgICAgICAgICByW2xhc3RkZXBdID0gW10KKworICAgIHJldHVybiByCisKK2RlZiBleHBsb2RlX2RlcF92ZXJzaW9ucyhzKToKKyAgICByID0gZXhwbG9kZV9kZXBfdmVyc2lvbnMyKHMpCisgICAgZm9yIGQgaW4gcjoKKyAgICAgICAgaWYgbm90IHJbZF06CisgICAgICAgICAgICByW2RdID0gTm9uZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbGVuKHJbZF0pID4gMToKKyAgICAgICAgICAgIGJiLndhcm4oImV4cGxvZGVfZGVwX3ZlcnNpb25zKCk6IEl0ZW0gJXMgYXBwZWFyZWQgaW4gZGVwZW5kZW5jeSBzdHJpbmcgJyVzJyBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuICBleHBsb2RlX2RlcF92ZXJzaW9ucyBjYW5ub3QgY29wZSB3aXRoIHRoaXMuIiAlIChkLCBzKSkKKyAgICAgICAgcltkXSA9IHJbZF1bMF0KKyAgICByZXR1cm4gcgorCitkZWYgam9pbl9kZXBzKGRlcHMsIGNvbW1hc2VwPVRydWUpOgorICAgICIiIgorICAgIFRha2UgdGhlIHJlc3VsdCBmcm9tIGV4cGxvZGVfZGVwX3ZlcnNpb25zIGFuZCBnZW5lcmF0ZSBhIGRlcGVuZGVuY3kgc3RyaW5nCisgICAgIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgZGVwIGluIGRlcHM6CisgICAgICAgIGlmIGRlcHNbZGVwXToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVwc1tkZXBdLCBsaXN0KToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiBkZXBzW2RlcF06CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVwICsgIiAoIiArIHYgKyAiKSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVwICsgIiAoIiArIGRlcHNbZGVwXSArICIpIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVwKQorICAgIGlmIGNvbW1hc2VwOgorICAgICAgICByZXR1cm4gIiwgIi5qb2luKHJlc3VsdCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiAiLmpvaW4ocmVzdWx0KQorCitkZWYgX3ByaW50X3RyYWNlKGJvZHksIGxpbmUpOgorICAgICIiIgorICAgIFByaW50IHRoZSBFbnZpcm9ubWVudCBvZiBhIFRleHQgQm9keQorICAgICIiIgorICAgIGVycm9yID0gW10KKyAgICAjIHByaW50IHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgbWV0aG9kCisgICAgbWluX2xpbmUgPSBtYXgoMSwgbGluZS00KQorICAgIG1heF9saW5lID0gbWluKGxpbmUgKyA0LCBsZW4oYm9keSkpCisgICAgZm9yIGkgaW4gcmFuZ2UobWluX2xpbmUsIG1heF9saW5lICsgMSk6CisgICAgICAgIGlmIGxpbmUgPT0gaToKKyAgICAgICAgICAgIGVycm9yLmFwcGVuZCgnICoqKiAlLjRkOiVzJyAlIChpLCBib2R5W2ktMV0ucnN0cmlwKCkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJyb3IuYXBwZW5kKCcgICAgICUuNGQ6JXMnICUgKGksIGJvZHlbaS0xXS5yc3RyaXAoKSkpCisgICAgcmV0dXJuIGVycm9yCisKK2RlZiBiZXR0ZXJfY29tcGlsZSh0ZXh0LCBmaWxlLCByZWFsZmlsZSwgbW9kZSA9ICJleGVjIik6CisgICAgIiIiCisgICAgQSBiZXR0ZXIgY29tcGlsZSBtZXRob2QuIFRoaXMgbWV0aG9kCisgICAgd2lsbCBwcmludCB0aGUgb2ZmZW5kaW5nIGxpbmVzLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNvbXBpbGUodGV4dCwgZmlsZSwgbW9kZSkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIGVycm9yID0gW10KKyAgICAgICAgIyBzcGxpdCB0aGUgdGV4dCBpbnRvIGxpbmVzIGFnYWluCisgICAgICAgIGJvZHkgPSB0ZXh0LnNwbGl0KCdcbicpCisgICAgICAgIGVycm9yLmFwcGVuZCgiRXJyb3IgaW4gY29tcGlsaW5nIHB5dGhvbiBmdW5jdGlvbiBpbiAlczpcbiIgJSByZWFsZmlsZSkKKyAgICAgICAgaWYgZS5saW5lbm86CisgICAgICAgICAgICBlcnJvci5hcHBlbmQoIlRoZSBjb2RlIGxpbmVzIHJlc3VsdGluZyBpbiB0aGlzIGVycm9yIHdlcmU6IikKKyAgICAgICAgICAgIGVycm9yLmV4dGVuZChfcHJpbnRfdHJhY2UoYm9keSwgZS5saW5lbm8pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJyb3IuYXBwZW5kKCJUaGUgZnVuY3Rpb24gY2F1c2luZyB0aGlzIGVycm9yIHdhczoiKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gYm9keToKKyAgICAgICAgICAgICAgICBlcnJvci5hcHBlbmQobGluZSkKKyAgICAgICAgZXJyb3IuYXBwZW5kKCIlczogJXMiICUgKGUuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoZSkpKQorCisgICAgICAgIGxvZ2dlci5lcnJvcigiXG4iLmpvaW4oZXJyb3IpKQorCisgICAgICAgIGUgPSBiYi5CQkhhbmRsZWRFeGNlcHRpb24oZSkKKyAgICAgICAgcmFpc2UgZQorCitkZWYgX3ByaW50X2V4Y2VwdGlvbih0LCB2YWx1ZSwgdGIsIHJlYWxmaWxlLCB0ZXh0LCBjb250ZXh0KToKKyAgICBlcnJvciA9IFtdCisgICAgdHJ5OgorICAgICAgICBleGNlcHRpb24gPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHQsIHZhbHVlKQorICAgICAgICBlcnJvci5hcHBlbmQoJ0Vycm9yIGV4ZWN1dGluZyBhIHB5dGhvbiBmdW5jdGlvbiBpbiAlczpcbicgJSByZWFsZmlsZSkKKworICAgICAgICAjIFN0cmlwICd1cycgZnJvbSB0aGUgc3RhY2sgKGJldHRlcl9leGVjIGNhbGwpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorCisgICAgICAgIHRleHRhcnJheSA9IHRleHQuc3BsaXQoJ1xuJykKKworICAgICAgICBsaW5lZmFpbGVkID0gdGIudGJfbGluZW5vCisKKyAgICAgICAgdGJleHRyYWN0ID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCisgICAgICAgIHRiZm9ybWF0ID0gdHJhY2ViYWNrLmZvcm1hdF9saXN0KHRiZXh0cmFjdCkKKyAgICAgICAgZXJyb3IuYXBwZW5kKCJUaGUgc3RhY2sgdHJhY2Ugb2YgcHl0aG9uIGNhbGxzIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBleGNlcHRpb24vZmFpbHVyZSB3YXM6IikKKyAgICAgICAgZXJyb3IuYXBwZW5kKCJGaWxlOiAnJXMnLCBsaW5lbm86ICVzLCBmdW5jdGlvbjogJXMiICUgKHRiZXh0cmFjdFswXVswXSwgdGJleHRyYWN0WzBdWzFdLCB0YmV4dHJhY3RbMF1bMl0pKQorICAgICAgICBlcnJvci5leHRlbmQoX3ByaW50X3RyYWNlKHRleHRhcnJheSwgbGluZWZhaWxlZCkpCisKKyAgICAgICAgIyBTZWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHdlIGNvbnN0cnVjdGVkIGFuZCBoYXMgY2FsbHMgYmFjayBpbnRvIG90aGVyIGZ1bmN0aW9ucyBpbgorICAgICAgICAjICJ0ZXh0Ii4gSWYgc28sIHRyeSBhbmQgaW1wcm92ZSB0aGUgY29udGV4dCBvZiB0aGUgZXJyb3IgYnkgZGl2aW5nIGRvd24gdGhlIHRyYWNlCisgICAgICAgIGxldmVsID0gMAorICAgICAgICBuZXh0dGIgPSB0Yi50Yl9uZXh0CisgICAgICAgIHdoaWxlIG5leHR0YiBpcyBub3QgTm9uZSBhbmQgKGxldmVsKzEpIDwgbGVuKHRiZXh0cmFjdCk6CisgICAgICAgICAgICBlcnJvci5hcHBlbmQoIkZpbGU6ICclcycsIGxpbmVubzogJXMsIGZ1bmN0aW9uOiAlcyIgJSAodGJleHRyYWN0W2xldmVsKzFdWzBdLCB0YmV4dHJhY3RbbGV2ZWwrMV1bMV0sIHRiZXh0cmFjdFtsZXZlbCsxXVsyXSkpCisgICAgICAgICAgICBpZiB0YmV4dHJhY3RbbGV2ZWxdWzBdID09IHRiZXh0cmFjdFtsZXZlbCsxXVswXSBhbmQgdGJleHRyYWN0W2xldmVsKzFdWzJdID09IHRiZXh0cmFjdFtsZXZlbF1bMF06CisgICAgICAgICAgICAgICAgIyBUaGUgY29kZSB3YXMgcG9zc2libHkgaW4gdGhlIHN0cmluZyB3ZSBjb21waWxlZCBvdXJzZWx2ZXMKKyAgICAgICAgICAgICAgICBlcnJvci5leHRlbmQoX3ByaW50X3RyYWNlKHRleHRhcnJheSwgdGJleHRyYWN0W2xldmVsKzFdWzFdKSkKKyAgICAgICAgICAgIGVsaWYgdGJleHRyYWN0W2xldmVsKzFdWzBdLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGxvb2tzIGxpa2UgaXQgbWlnaHQgYmUgaW4gYSBmaWxlLCB0cnkgYW5kIGxvYWQgaXQKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbih0YmV4dHJhY3RbbGV2ZWwrMV1bMF0sICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5leHRlbmQoX3ByaW50X3RyYWNlKHRleHQsIHRiZXh0cmFjdFtsZXZlbCsxXVsxXSkpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBlcnJvci5hcHBlbmQodGJmb3JtYXRbbGV2ZWwrMV0pCisgICAgICAgICAgICBlbGlmICJkIiBpbiBjb250ZXh0IGFuZCB0YmV4dHJhY3RbbGV2ZWwrMV1bMl06CisgICAgICAgICAgICAgICAgIyBUcnkgYW5kIGZpbmQgdGhlIGNvZGUgaW4gdGhlIGRhdGFzdG9yZSBiYXNlZCBvbiB0aGUgZnVuY3Rpb25uYW1lCisgICAgICAgICAgICAgICAgZCA9IGNvbnRleHRbImQiXQorICAgICAgICAgICAgICAgIGZ1bmN0aW9ubmFtZSA9IHRiZXh0cmFjdFtsZXZlbCsxXVsyXQorICAgICAgICAgICAgICAgIHRleHQgPSBkLmdldFZhcihmdW5jdGlvbm5hbWUsIFRydWUpCisgICAgICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuZXh0ZW5kKF9wcmludF90cmFjZSh0ZXh0LnNwbGl0KCdcbicpLCB0YmV4dHJhY3RbbGV2ZWwrMV1bMV0pKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVycm9yLmFwcGVuZCh0YmZvcm1hdFtsZXZlbCsxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKHRiZm9ybWF0W2xldmVsKzFdKQorICAgICAgICAgICAgbmV4dHRiID0gdGIudGJfbmV4dAorICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDEKKworICAgICAgICBlcnJvci5hcHBlbmQoIkV4Y2VwdGlvbjogJXMiICUgJycuam9pbihleGNlcHRpb24pKQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvZ2dlci5lcnJvcigiXG4iLmpvaW4oZXJyb3IpKQorCitkZWYgYmV0dGVyX2V4ZWMoY29kZSwgY29udGV4dCwgdGV4dCA9IE5vbmUsIHJlYWxmaWxlID0gIjxjb2RlPiIpOgorICAgICIiIgorICAgIFNpbWlsaWFyIHRvIGJldHRlcl9jb21waWxlLCBiZXR0ZXJfZXhlYyB3aWxsCisgICAgcHJpbnQgdGhlIGxpbmVzIHRoYXQgYXJlIHJlc3BvbnNpYmxlIGZvciB0aGUKKyAgICBlcnJvci4KKyAgICAiIiIKKyAgICBpbXBvcnQgYmIucGFyc2UKKyAgICBpZiBub3QgdGV4dDoKKyAgICAgICAgdGV4dCA9IGNvZGUKKyAgICBpZiBub3QgaGFzYXR0cihjb2RlLCAiY29fZmlsZW5hbWUiKToKKyAgICAgICAgY29kZSA9IGJldHRlcl9jb21waWxlKGNvZGUsIHJlYWxmaWxlLCByZWFsZmlsZSkKKyAgICB0cnk6CisgICAgICAgIGV4ZWMoY29kZSwgZ2V0X2NvbnRleHQoKSwgY29udGV4dCkKKyAgICBleGNlcHQgKGJiLkJCSGFuZGxlZEV4Y2VwdGlvbiwgYmIucGFyc2UuU2tpcFJlY2lwZSwgYmIuYnVpbGQuRnVuY0ZhaWxlZCwgYmIuZGF0YV9zbWFydC5FeHBhbnNpb25FcnJvcik6CisgICAgICAgICMgRXJyb3IgYWxyZWFkeSBzaG93biBzbyBwYXNzdGhyb3VnaCwgbm8gbmVlZCBmb3IgdHJhY2ViYWNrCisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAodCwgdmFsdWUsIHRiKSA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9wcmludF9leGNlcHRpb24odCwgdmFsdWUsIHRiLCByZWFsZmlsZSwgdGV4dCwgY29udGV4dCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJFeGNlcHRpb24gaGFuZGxlciBlcnJvcjogJXMiICUgc3RyKGUpKQorCisgICAgICAgIGUgPSBiYi5CQkhhbmRsZWRFeGNlcHRpb24oZSkKKyAgICAgICAgcmFpc2UgZQorCitkZWYgc2ltcGxlX2V4ZWMoY29kZSwgY29udGV4dCk6CisgICAgZXhlYyhjb2RlLCBnZXRfY29udGV4dCgpLCBjb250ZXh0KQorCitkZWYgYmV0dGVyX2V2YWwoc291cmNlLCBsb2NhbHMpOgorICAgIHJldHVybiBldmFsKHNvdXJjZSwgZ2V0X2NvbnRleHQoKSwgbG9jYWxzKQorCitAY29udGV4dG1hbmFnZXIKK2RlZiBmaWxlc2xvY2tlZChmaWxlcyk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIGZvciBsb2NraW5nIGFuZCB1bmxvY2tpbmcgZmlsZSBsb2Nrcy4iIiIKKyAgICBsb2NrcyA9IFtdCisgICAgaWYgZmlsZXM6CisgICAgICAgIGZvciBsb2NrZmlsZSBpbiBmaWxlczoKKyAgICAgICAgICAgIGxvY2tzLmFwcGVuZChiYi51dGlscy5sb2NrZmlsZShsb2NrZmlsZSkpCisKKyAgICB5aWVsZAorCisgICAgZm9yIGxvY2sgaW4gbG9ja3M6CisgICAgICAgIGJiLnV0aWxzLnVubG9ja2ZpbGUobG9jaykKKworQGNvbnRleHRtYW5hZ2VyCitkZWYgdGltZW91dChzZWNvbmRzKToKKyAgICBkZWYgdGltZW91dF9oYW5kbGVyKHNpZ251bSwgZnJhbWUpOgorICAgICAgICBwYXNzCisKKyAgICBvcmlnaW5hbF9oYW5kbGVyID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgdGltZW91dF9oYW5kbGVyKQorCisgICAgdHJ5OgorICAgICAgICBzaWduYWwuYWxhcm0oc2Vjb25kcykKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBzaWduYWwuYWxhcm0oMCkKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgb3JpZ2luYWxfaGFuZGxlcikKKworZGVmIGxvY2tmaWxlKG5hbWUsIHNoYXJlZD1GYWxzZSwgcmV0cnk9VHJ1ZSwgYmxvY2s9RmFsc2UpOgorICAgICIiIgorICAgIFVzZSB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBsb2NrIGZpbGUsIHJldHVybiB3aGVuIHRoZSBsb2NrIGhhcworICAgIGJlZW4gYWNxdWlyZWQuIFJldHVybnMgYSB2YXJpYWJsZSB0byBwYXNzIHRvIHVubG9ja2ZpbGUoKS4KKyAgICBQYXJhbWV0ZXJzOgorICAgICAgICByZXRyeTogVHJ1ZSB0byByZS10cnkgbG9ja2luZyBpZiBpdCBmYWlscywgRmFsc2Ugb3RoZXJ3aXNlCisgICAgICAgIGJsb2NrOiBUcnVlIHRvIGJsb2NrIHVudGlsIHRoZSBsb2NrIHN1Y2NlZWRzLCBGYWxzZSBvdGhlcndpc2UKKyAgICBUaGUgcmV0cnkgYW5kIGJsb2NrIHBhcmFtZXRlcnMgYXJlIGtpbmQgb2YgZXF1aXZhbGVudCB1bmxlc3MgeW91CisgICAgY29uc2lkZXIgdGhlIHBvc3NpYmlsaXR5IG9mIHNlbmRpbmcgYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MgdG8gYnJlYWsKKyAgICBvdXQgLSBhdCB3aGljaCBwb2ludCB5b3Ugd2FudCBibG9jaz1UcnVlIHJhdGhlciB0aGFuIHJldHJ5PVRydWUuCisgICAgIiIiCisgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShuYW1lKQorICAgIG1rZGlyaGllcihkaXJuYW1lKQorCisgICAgaWYgbm90IG9zLmFjY2VzcyhkaXJuYW1lLCBvcy5XX09LKToKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gYWNxdWlyZSBsb2NrICclcycsIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIG9wID0gZmNudGwuTE9DS19FWAorICAgIGlmIHNoYXJlZDoKKyAgICAgICAgb3AgPSBmY250bC5MT0NLX1NICisgICAgaWYgbm90IHJldHJ5IGFuZCBub3QgYmxvY2s6CisgICAgICAgIG9wID0gb3AgfCBmY250bC5MT0NLX05CCisKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICAjIElmIHdlIGxlYXZlIHRoZSBsb2NrZmlsZXMgbHlpbmcgYXJvdW5kIHRoZXJlIGlzIG5vIHByb2JsZW0KKyAgICAgICAgIyBidXQgd2Ugc2hvdWxkIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcy4gVGhpcyBnaXZlcyBwb3RlbnRpYWwKKyAgICAgICAgIyBmb3IgcmFjZXMgdGhvdWdoLiBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3aGVuIHdlIGFjcXVpcmUgdGhlIGxvY2sKKyAgICAgICAgIyB3ZSBjaGVjayB0aGUgZmlsZSB3ZSBsb2NrZWQgd2FzIHN0aWxsIHRoZSBsb2NrIGZpbGUgb24gZGlzay4KKyAgICAgICAgIyBieSBjb21wYXJpbmcgaW5vZGUgbnVtYmVycy4gSWYgdGhleSBkb24ndCBtYXRjaCBvciB0aGUgbG9ja2ZpbGUKKyAgICAgICAgIyBubyBsb25nZXIgZXhpc3RzLCB3ZSBzdGFydCBhZ2Fpbi4KKworICAgICAgICAjIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdW5mYWlyIHNpbmNlIHRoZSBsYXN0IHBlcnNvbiB0byByZXF1ZXN0IHRoZQorICAgICAgICAjIGxvY2sgaXMgdGhlIG1vc3QgbGlrZWx5IHRvIHdpbiBpdC4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsZiA9IG9wZW4obmFtZSwgJ2ErJykKKyAgICAgICAgICAgIGZpbGVubyA9IGxmLmZpbGVubygpCisgICAgICAgICAgICBmY250bC5mbG9jayhmaWxlbm8sIG9wKQorICAgICAgICAgICAgc3RhdGluZm8gPSBvcy5mc3RhdChmaWxlbm8pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsZi5uYW1lKToKKyAgICAgICAgICAgICAgICBzdGF0aW5mbzIgPSBvcy5zdGF0KGxmLm5hbWUpCisgICAgICAgICAgICAgICAgaWYgc3RhdGluZm8uc3RfaW5vID09IHN0YXRpbmZvMi5zdF9pbm86CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZgorICAgICAgICAgICAgbGYuY2xvc2UoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBub3QgcmV0cnk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgdW5sb2NrZmlsZShsZik6CisgICAgIiIiCisgICAgVW5sb2NrIGEgZmlsZSBsb2NrZWQgdXNpbmcgbG9ja2ZpbGUoKQorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgIyBJZiB3ZSBoYWQgYSBzaGFyZWQgbG9jaywgd2UgbmVlZCB0byBwcm9tb3RlIHRvIGV4Y2x1c2l2ZSBiZWZvcmUKKyAgICAgICAgIyByZW1vdmluZyB0aGUgbG9ja2ZpbGUuIEF0dGVtcHQgdGhpcywgaWdub3JlIGZhaWx1cmVzLgorICAgICAgICBmY250bC5mbG9jayhsZi5maWxlbm8oKSwgZmNudGwuTE9DS19FWHxmY250bC5MT0NLX05CKQorICAgICAgICBvcy51bmxpbmsobGYubmFtZSkKKyAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZmNudGwuZmxvY2sobGYuZmlsZW5vKCksIGZjbnRsLkxPQ0tfVU4pCisgICAgbGYuY2xvc2UoKQorCitkZWYgbWQ1X2ZpbGUoZmlsZW5hbWUpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTUQ1IGNoZWNrc3VtIG9mIGZpbGVuYW1lLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGhhc2hsaWIKKyAgICAgICAgbSA9IGhhc2hsaWIubWQ1KCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGltcG9ydCBtZDUKKyAgICAgICAgbSA9IG1kNS5uZXcoKQorCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmOgorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbS51cGRhdGUobGluZSkKKyAgICByZXR1cm4gbS5oZXhkaWdlc3QoKQorCitkZWYgc2hhMjU2X2ZpbGUoZmlsZW5hbWUpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgaGV4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgMjU2LWJpdCBTSEEgY2hlY2tzdW0gb2YKKyAgICBmaWxlbmFtZS4gIE9uIFB5dGhvbiAyLjQgdGhpcyB3aWxsIHJldHVybiBOb25lLCBzbyBjYWxsZXJzIHdpbGwgbmVlZCB0bworICAgIGhhbmRsZSB0aGF0IGJ5IGVpdGhlciBza2lwcGluZyBTSEEgY2hlY2tzLCBvciBydW5uaW5nIGEgc3RhbmRhbG9uZSBzaGEyNTZzdW0KKyAgICBiaW5hcnkuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgaGFzaGxpYgorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHMgPSBoYXNobGliLnNoYTI1NigpCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmOgorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgcy51cGRhdGUobGluZSkKKyAgICByZXR1cm4gcy5oZXhkaWdlc3QoKQorCitkZWYgcHJlc2VydmVkX2VudnZhcnNfZXhwb3J0ZWQoKToKKyAgICAiIiJWYXJpYWJsZXMgd2hpY2ggYXJlIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50IGFuZCBwbGFjZWQgaW4gYW5kIGV4cG9ydGVkCisgICAgZnJvbSB0aGUgbWV0YWRhdGEiIiIKKyAgICByZXR1cm4gWworICAgICAgICAnQkJfVEFTS0hBU0gnLAorICAgICAgICAnSE9NRScsCisgICAgICAgICdMT0dOQU1FJywKKyAgICAgICAgJ1BBVEgnLAorICAgICAgICAnUFdEJywKKyAgICAgICAgJ1NIRUxMJywKKyAgICAgICAgJ1RFUk0nLAorICAgICAgICAnVVNFUicsCisgICAgXQorCitkZWYgcHJlc2VydmVkX2VudnZhcnMoKToKKyAgICAiIiJWYXJpYWJsZXMgd2hpY2ggYXJlIHRha2VuIGZyb20gdGhlIGVudmlyb25tZW50IGFuZCBwbGFjZWQgaW4gdGhlIG1ldGFkYXRhIiIiCisgICAgdiA9IFsKKyAgICAgICAgJ0JCUEFUSCcsCisgICAgICAgICdCQl9QUkVTRVJWRV9FTlYnLAorICAgICAgICAnQkJfRU5WX1dISVRFTElTVCcsCisgICAgICAgICdCQl9FTlZfRVhUUkFXSElURScsCisgICAgXQorICAgIHJldHVybiB2ICsgcHJlc2VydmVkX2VudnZhcnNfZXhwb3J0ZWQoKQorCitkZWYgZmlsdGVyX2Vudmlyb25tZW50KGdvb2RfdmFycyk6CisgICAgIiIiCisgICAgQ3JlYXRlIGEgcHJpc3RpbmUgZW52aXJvbm1lbnQgZm9yIGJpdGJha2UuIFRoaXMgd2lsbCByZW1vdmUgdmFyaWFibGVzIHRoYXQKKyAgICBhcmUgbm90IGtub3duIGFuZCBtYXkgaW5mbHVlbmNlIHRoZSBidWlsZCBpbiBhIG5lZ2F0aXZlIHdheS4KKyAgICAiIiIKKworICAgIHJlbW92ZWRfdmFycyA9IHt9CisgICAgZm9yIGtleSBpbiBvcy5lbnZpcm9uLmtleXMoKToKKyAgICAgICAgaWYga2V5IGluIGdvb2RfdmFyczoKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgcmVtb3ZlZF92YXJzW2tleV0gPSBvcy5lbnZpcm9uW2tleV0KKyAgICAgICAgb3MudW5zZXRlbnYoa2V5KQorICAgICAgICBkZWwgb3MuZW52aXJvbltrZXldCisKKyAgICBpZiByZW1vdmVkX3ZhcnM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygxLCAiUmVtb3ZlZCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBmcm9tIHRoZSBlbnZpcm9ubWVudDogJXMiLCAiLCAiLmpvaW4ocmVtb3ZlZF92YXJzLmtleXMoKSkpCisKKyAgICByZXR1cm4gcmVtb3ZlZF92YXJzCisKK2RlZiBhcHByb3ZlZF92YXJpYWJsZXMoKToKKyAgICAiIiIKKyAgICBEZXRlcm1pbmUgYW5kIHJldHVybiB0aGUgbGlzdCBvZiB3aGl0ZWxpc3RlZCB2YXJpYWJsZXMgd2hpY2ggYXJlIGFwcHJvdmVkCisgICAgdG8gcmVtYWluIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgICAiIiIKKyAgICBpZiAnQkJfUFJFU0VSVkVfRU5WJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gb3MuZW52aXJvbi5rZXlzKCkKKyAgICBhcHByb3ZlZCA9IFtdCisgICAgaWYgJ0JCX0VOVl9XSElURUxJU1QnIGluIG9zLmVudmlyb246CisgICAgICAgIGFwcHJvdmVkID0gb3MuZW52aXJvblsnQkJfRU5WX1dISVRFTElTVCddLnNwbGl0KCkKKyAgICAgICAgYXBwcm92ZWQuZXh0ZW5kKFsnQkJfRU5WX1dISVRFTElTVCddKQorICAgIGVsc2U6CisgICAgICAgIGFwcHJvdmVkID0gcHJlc2VydmVkX2VudnZhcnMoKQorICAgIGlmICdCQl9FTlZfRVhUUkFXSElURScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgYXBwcm92ZWQuZXh0ZW5kKG9zLmVudmlyb25bJ0JCX0VOVl9FWFRSQVdISVRFJ10uc3BsaXQoKSkKKyAgICAgICAgaWYgJ0JCX0VOVl9FWFRSQVdISVRFJyBub3QgaW4gYXBwcm92ZWQ6CisgICAgICAgICAgICBhcHByb3ZlZC5leHRlbmQoWydCQl9FTlZfRVhUUkFXSElURSddKQorICAgIHJldHVybiBhcHByb3ZlZAorCitkZWYgY2xlYW5fZW52aXJvbm1lbnQoKToKKyAgICAiIiIKKyAgICBDbGVhbiB1cCBhbnkgc3B1cmlvdXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGlzIHdpbGwgcmVtb3ZlIGFueQorICAgIHZhcmlhYmxlcyB0aGUgdXNlciBoYXNuJ3QgY2hvc2VuIHRvIHByZXNlcnZlLgorICAgICIiIgorICAgIGlmICdCQl9QUkVTRVJWRV9FTlYnIG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICBnb29kX3ZhcnMgPSBhcHByb3ZlZF92YXJpYWJsZXMoKQorICAgICAgICByZXR1cm4gZmlsdGVyX2Vudmlyb25tZW50KGdvb2RfdmFycykKKworICAgIHJldHVybiB7fQorCitkZWYgZW1wdHlfZW52aXJvbm1lbnQoKToKKyAgICAiIiIKKyAgICBSZW1vdmUgYWxsIHZhcmlhYmxlcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4KKyAgICAiIiIKKyAgICBmb3IgcyBpbiBvcy5lbnZpcm9uLmtleXMoKToKKyAgICAgICAgb3MudW5zZXRlbnYocykKKyAgICAgICAgZGVsIG9zLmVudmlyb25bc10KKworZGVmIGJ1aWxkX2Vudmlyb25tZW50KGQpOgorICAgICIiIgorICAgIEJ1aWxkIGFuIGVudmlyb25tZW50IGZyb20gYWxsIGV4cG9ydGVkIHZhcmlhYmxlcy4KKyAgICAiIiIKKyAgICBpbXBvcnQgYmIuZGF0YQorICAgIGZvciB2YXIgaW4gYmIuZGF0YS5rZXlzKGQpOgorICAgICAgICBleHBvcnQgPSBkLmdldFZhckZsYWcodmFyLCAiZXhwb3J0IikKKyAgICAgICAgaWYgZXhwb3J0OgorICAgICAgICAgICAgb3MuZW52aXJvblt2YXJdID0gZC5nZXRWYXIodmFyLCBUcnVlKSBvciAiIgorCitkZWYgX2NoZWNrX3Vuc2FmZV9kZWxldGVfcGF0aChwYXRoKToKKyAgICAiIiIKKyAgICBCYXNpYyBzYWZlZ3VhcmQgYWdhaW5zdCByZWN1cnNpdmVseSBkZWxldGluZyBzb21ldGhpbmcgd2Ugc2hvdWxkbid0LiBJZiBpdCByZXR1cm5zIFRydWUsCisgICAgdGhlIGNhbGxlciBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggYW4gYXBwcm9wcmlhdGUgbWVzc2FnZS4KKyAgICBOT1RFOiBUaGlzIGlzIE5PVCBtZWFudCB0byBiZSBhIHNlY3VyaXR5IG1lY2hhbmlzbSAtIGp1c3QgYSBndWFyZCBhZ2FpbnN0IHNpbGx5IG1pc3Rha2VzCisgICAgd2l0aCBwb3RlbnRpYWxseSBkaXNhc3Ryb3VzIHJlc3VsdHMuCisgICAgIiIiCisgICAgZXh0cmEgPSAnJworICAgICMgSE9NRSBtaWdodCBub3QgYmUgL2hvbWUvc29tZXRoaW5nLCBzbyBpbiBjYXNlIHdlIGNhbiBnZXQgaXQsIGNoZWNrIGFnYWluc3QgaXQKKyAgICBob21lZGlyID0gb3MuZW52aXJvbi5nZXQoJ0hPTUUnLCAnJykKKyAgICBpZiBob21lZGlyOgorICAgICAgICBleHRyYSA9ICd8JXMnICUgaG9tZWRpcgorICAgIGlmIHJlLm1hdGNoKCcoL3wvL3wvaG9tZXwvaG9tZS9bXi9dKiVzKSQnICUgZXh0cmEsIG9zLnBhdGguYWJzcGF0aChwYXRoKSk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiByZW1vdmUocGF0aCwgcmVjdXJzZT1GYWxzZSk6CisgICAgIiIiRXF1aXZhbGVudCB0byBybSAtZiBvciBybSAtcmYiIiIKKyAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgcmV0dXJuCisgICAgaWYgcmVjdXJzZToKKyAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYi5nbG9iKHBhdGgpOgorICAgICAgICAgICAgaWYgX2NoZWNrX3Vuc2FmZV9kZWxldGVfcGF0aChwYXRoKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2JiLnV0aWxzLnJlbW92ZTogY2FsbGVkIHdpdGggZGFuZ2Vyb3VzIHBhdGggIiVzIiBhbmQgcmVjdXJzZT1UcnVlLCByZWZ1c2luZyB0byBkZWxldGUhJyAlIHBhdGgpCisgICAgICAgICMgc2h1dGlsLnJtdHJlZShuYW1lKSB3b3VsZCBiZSBpZGVhbCBidXQgaXRzIHRvbyBzbG93CisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChbJ3JtJywgJy1yZiddICsgZ2xvYi5nbG9iKHBhdGgpKQorICAgICAgICByZXR1cm4KKyAgICBmb3IgbmFtZSBpbiBnbG9iLmdsb2IocGF0aCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlCisKK2RlZiBwcnVuZWRpcih0b3BkaXIpOgorICAgICMgRGVsZXRlIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gdGhlIGRpcmVjdG9yeSBuYW1lZCBpbiAndG9wZGlyJy4KKyAgICAjIENBVVRJT046ICBUaGlzIGlzIGRhbmdlcm91cyEKKyAgICBpZiBfY2hlY2tfdW5zYWZlX2RlbGV0ZV9wYXRoKHRvcGRpcik6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignYmIudXRpbHMucHJ1bmVkaXI6IGNhbGxlZCB3aXRoIGRhbmdlcm91cyBwYXRoICIlcyIsIHJlZnVzaW5nIHRvIGRlbGV0ZSEnICUgdG9wZGlyKQorICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHRvcGRpciwgdG9wZG93biA9IEZhbHNlKToKKyAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHJvb3QsIG5hbWUpKQorICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsob3MucGF0aC5qb2luKHJvb3QsIG5hbWUpKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHJvb3QsIG5hbWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCisgICAgb3Mucm1kaXIodG9wZGlyKQorCisjCisjIENvdWxkIGFsc28gdXNlIHJldHVybiByZS5jb21waWxlKCIoJXMpIiAlICJ8Ii5qb2luKG1hcChyZS5lc2NhcGUsIHN1ZmZpeGVzKSkpLnN1YihsYW1iZGEgbW86ICIiLCB2YXIpCisjIGJ1dCB0aGF0cyBwb3NzaWJseSBpbnNhbmUgYW5kIHN1ZmZpeGVzIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIHNtYWxsCisjCitkZWYgcHJ1bmVfc3VmZml4KHZhciwgc3VmZml4ZXMsIGQpOgorICAgICMgU2VlIGlmIHZhciBlbmRzIHdpdGggYW55IG9mIHRoZSBzdWZmaXhlcyBsaXN0ZWQgYW5kCisgICAgIyByZW1vdmUgaXQgaWYgZm91bmQKKyAgICBmb3Igc3VmZml4IGluIHN1ZmZpeGVzOgorICAgICAgICBpZiB2YXIuZW5kc3dpdGgoc3VmZml4KToKKyAgICAgICAgICAgIHJldHVybiB2YXIucmVwbGFjZShzdWZmaXgsICIiKQorICAgIHJldHVybiB2YXIKKworZGVmIG1rZGlyaGllcihkaXJlY3RvcnkpOgorICAgICIiIkNyZWF0ZSBhIGRpcmVjdG9yeSBsaWtlICdta2RpciAtcCcsIGJ1dCBkb2VzIG5vdCBjb21wbGFpbiBpZgorICAgIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyBsaWtlIG9zLm1ha2VkaXJzCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICAgIG9zLm1ha2VkaXJzKGRpcmVjdG9yeSkKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIHJhaXNlIGUKKworZGVmIG1vdmVmaWxlKHNyYywgZGVzdCwgbmV3bXRpbWUgPSBOb25lLCBzc3RhdCA9IE5vbmUpOgorICAgICIiIk1vdmVzIGEgZmlsZSBmcm9tIHNyYyB0byBkZXN0LCBwcmVzZXJ2aW5nIGFsbCBwZXJtaXNzaW9ucyBhbmQKKyAgICBhdHRyaWJ1dGVzOyBtdGltZSB3aWxsIGJlIHByZXNlcnZlZCBldmVuIHdoZW4gbW92aW5nIGFjcm9zcworICAgIGZpbGVzeXN0ZW1zLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIG9uIGZhaWx1cmUuIE1vdmUgaXMKKyAgICBhdG9taWMuCisgICAgIiIiCisKKyAgICAjcHJpbnQgIm1vdmVmaWxlKCIgKyBzcmMgKyAiLCIgKyBkZXN0ICsgIiwiICsgc3RyKG5ld210aW1lKSArICIsIiArIHN0cihzc3RhdCkgKyAiKSIKKyAgICB0cnk6CisgICAgICAgIGlmIG5vdCBzc3RhdDoKKyAgICAgICAgICAgIHNzdGF0ID0gb3MubHN0YXQoc3JjKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoIm1vdmVmaWxlOiBTdGF0aW5nIHNvdXJjZSBmaWxlIGZhaWxlZC4uLiIsIGUpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZXN0ZXhpc3RzID0gMQorICAgIHRyeToKKyAgICAgICAgZHN0YXQgPSBvcy5sc3RhdChkZXN0KQorICAgIGV4Y2VwdDoKKyAgICAgICAgZHN0YXQgPSBvcy5sc3RhdChvcy5wYXRoLmRpcm5hbWUoZGVzdCkpCisgICAgICAgIGRlc3RleGlzdHMgPSAwCisKKyAgICBpZiBkZXN0ZXhpc3RzOgorICAgICAgICBpZiBzdGF0LlNfSVNMTksoZHN0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCisgICAgICAgICAgICAgICAgZGVzdGV4aXN0cyA9IDAKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBpZiBzdGF0LlNfSVNMTksoc3N0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnJlYWRsaW5rKHNyYykKKyAgICAgICAgICAgIGlmIGRlc3RleGlzdHMgYW5kIG5vdCBzdGF0LlNfSVNESVIoZHN0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCisgICAgICAgICAgICBvcy5zeW1saW5rKHRhcmdldCwgZGVzdCkKKyAgICAgICAgICAgICNvcy5sY2hvd24oZGVzdCxzc3RhdFtzdGF0LlNUX1VJRF0sc3N0YXRbc3RhdC5TVF9HSURdKQorICAgICAgICAgICAgb3MudW5saW5rKHNyYykKKyAgICAgICAgICAgIHJldHVybiBvcy5sc3RhdChkZXN0KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBwcmludCgibW92ZWZpbGU6IGZhaWxlZCB0byBwcm9wZXJseSBjcmVhdGUgc3ltbGluazoiLCBkZXN0LCAiLT4iLCB0YXJnZXQsIGUpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgcmVuYW1lZmFpbGVkID0gMQorICAgIGlmIHNzdGF0W3N0YXQuU1RfREVWXSA9PSBkc3RhdFtzdGF0LlNUX0RFVl06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgb3MucmVuYW1lIG5lZWRzIHRvIGtub3cgdGhlIGRlc3QgcGF0aCBlbmRpbmcgd2l0aCBmaWxlIG5hbWUKKyAgICAgICAgICAgICMgc28gYXBwZW5kIHRoZSBmaWxlIG5hbWUgdG8gYSBwYXRoIG9ubHkgaWYgaXQncyBhIGRpciBzcGVjaWZpZWQKKyAgICAgICAgICAgIHNyY2ZuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzcmMpCisgICAgICAgICAgICBkZXN0cGF0aCA9IG9zLnBhdGguam9pbihkZXN0LCBzcmNmbmFtZSkgaWYgb3MucGF0aC5pc2RpcihkZXN0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlc3QKKyAgICAgICAgICAgIG9zLnJlbmFtZShzcmMsIGRlc3RwYXRoKQorICAgICAgICAgICAgcmVuYW1lZmFpbGVkID0gMAorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBpZiBlWzBdICE9IGVycm5vLkVYREVWOgorICAgICAgICAgICAgICAgICMgU29tZSByYW5kb20gZXJyb3IuCisgICAgICAgICAgICAgICAgcHJpbnQoIm1vdmVmaWxlOiBGYWlsZWQgdG8gbW92ZSIsIHNyYywgInRvIiwgZGVzdCwgZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgIyBJbnZhbGlkIGNyb3NzLWRldmljZS1saW5rICdiaW5kJyBtb3VudGVkIG9yIGFjdHVhbGx5IENyb3NzLURldmljZQorCisgICAgaWYgcmVuYW1lZmFpbGVkOgorICAgICAgICBkaWRjb3B5ID0gMAorICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3N0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgICAgICB0cnk6ICMgRm9yIHNhZmV0eSBjb3B5IHRoZW4gbW92ZSBpdCBvdmVyLgorICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzcmMsIGRlc3QgKyAiI25ldyIpCisgICAgICAgICAgICAgICAgb3MucmVuYW1lKGRlc3QgKyAiI25ldyIsIGRlc3QpCisgICAgICAgICAgICAgICAgZGlkY29weSA9IDEKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBwcmludCgnbW92ZWZpbGU6IGNvcHknLCBzcmMsICctPicsIGRlc3QsICdmYWlsZWQuJywgZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI3dlIGRvbid0IHlldCBoYW5kbGUgc3BlY2lhbCwgc28gd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gL2Jpbi9tdgorICAgICAgICAgICAgYSA9IGdldHN0YXR1c291dHB1dCgiL2Jpbi9tdiAtZiAiICsgIiciICsgc3JjICsgIicgJyIgKyBkZXN0ICsgIiciKQorICAgICAgICAgICAgaWYgYVswXSAhPSAwOgorICAgICAgICAgICAgICAgIHByaW50KCJtb3ZlZmlsZTogRmFpbGVkIHRvIG1vdmUgc3BlY2lhbCBmaWxlOiIgKyBzcmMgKyAiJyB0byAnIiArIGRlc3QgKyAiJyIsIGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUgIyBmYWlsdXJlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGRpZGNvcHk6CisgICAgICAgICAgICAgICAgb3MubGNob3duKGRlc3QsIHNzdGF0W3N0YXQuU1RfVUlEXSwgc3N0YXRbc3RhdC5TVF9HSURdKQorICAgICAgICAgICAgICAgIG9zLmNobW9kKGRlc3QsIHN0YXQuU19JTU9ERShzc3RhdFtzdGF0LlNUX01PREVdKSkgIyBTdGlja3kgaXMgcmVzZXQgb24gY2hvd24KKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc3JjKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBwcmludCgibW92ZWZpbGU6IEZhaWxlZCB0byBjaG93bi9jaG1vZC91bmxpbmsiLCBkZXN0LCBlKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGlmIG5ld210aW1lOgorICAgICAgICBvcy51dGltZShkZXN0LCAobmV3bXRpbWUsIG5ld210aW1lKSkKKyAgICBlbHNlOgorICAgICAgICBvcy51dGltZShkZXN0LCAoc3N0YXRbc3RhdC5TVF9BVElNRV0sIHNzdGF0W3N0YXQuU1RfTVRJTUVdKSkKKyAgICAgICAgbmV3bXRpbWUgPSBzc3RhdFtzdGF0LlNUX01USU1FXQorICAgIHJldHVybiBuZXdtdGltZQorCitkZWYgY29weWZpbGUoc3JjLCBkZXN0LCBuZXdtdGltZSA9IE5vbmUsIHNzdGF0ID0gTm9uZSk6CisgICAgIiIiCisgICAgQ29waWVzIGEgZmlsZSBmcm9tIHNyYyB0byBkZXN0LCBwcmVzZXJ2aW5nIGFsbCBwZXJtaXNzaW9ucyBhbmQKKyAgICBhdHRyaWJ1dGVzOyBtdGltZSB3aWxsIGJlIHByZXNlcnZlZCBldmVuIHdoZW4gbW92aW5nIGFjcm9zcworICAgIGZpbGVzeXN0ZW1zLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIG9uIGZhaWx1cmUuCisgICAgIiIiCisgICAgI3ByaW50ICJjb3B5ZmlsZSgiICsgc3JjICsgIiwiICsgZGVzdCArICIsIiArIHN0cihuZXdtdGltZSkgKyAiLCIgKyBzdHIoc3N0YXQpICsgIikiCisgICAgdHJ5OgorICAgICAgICBpZiBub3Qgc3N0YXQ6CisgICAgICAgICAgICBzc3RhdCA9IG9zLmxzdGF0KHNyYykKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIGxvZ2dlci53YXJuKCJjb3B5ZmlsZTogc3RhdCBvZiAlcyBmYWlsZWQgKCVzKSIgJSAoc3JjLCBlKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZXN0ZXhpc3RzID0gMQorICAgIHRyeToKKyAgICAgICAgZHN0YXQgPSBvcy5sc3RhdChkZXN0KQorICAgIGV4Y2VwdDoKKyAgICAgICAgZHN0YXQgPSBvcy5sc3RhdChvcy5wYXRoLmRpcm5hbWUoZGVzdCkpCisgICAgICAgIGRlc3RleGlzdHMgPSAwCisKKyAgICBpZiBkZXN0ZXhpc3RzOgorICAgICAgICBpZiBzdGF0LlNfSVNMTksoZHN0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCisgICAgICAgICAgICAgICAgZGVzdGV4aXN0cyA9IDAKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBpZiBzdGF0LlNfSVNMTksoc3N0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnJlYWRsaW5rKHNyYykKKyAgICAgICAgICAgIGlmIGRlc3RleGlzdHMgYW5kIG5vdCBzdGF0LlNfSVNESVIoZHN0YXRbc3RhdC5TVF9NT0RFXSk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGRlc3QpCisgICAgICAgICAgICBvcy5zeW1saW5rKHRhcmdldCwgZGVzdCkKKyAgICAgICAgICAgICNvcy5sY2hvd24oZGVzdCxzc3RhdFtzdGF0LlNUX1VJRF0sc3N0YXRbc3RhdC5TVF9HSURdKQorICAgICAgICAgICAgcmV0dXJuIG9zLmxzdGF0KGRlc3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJjb3B5ZmlsZTogZmFpbGVkIHRvIGNyZWF0ZSBzeW1saW5rICVzIHRvICVzICglcykiICUgKGRlc3QsIHRhcmdldCwgZSkpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHN0YXQuU19JU1JFRyhzc3RhdFtzdGF0LlNUX01PREVdKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3JjY2hvd24gPSBGYWxzZQorICAgICAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhzcmMsIG9zLlJfT0spOgorICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGNhbiByZWFkIGl0CisgICAgICAgICAgICAgICAgc3JjY2hvd24gPSBUcnVlCisgICAgICAgICAgICAgICAgb3MuY2htb2Qoc3JjLCBzc3RhdFtzdGF0LlNUX01PREVdIHwgc3RhdC5TX0lSVVNSKQorCisgICAgICAgICAgICAjIEZvciBzYWZldHkgY29weSB0aGVuIG1vdmUgaXQgb3Zlci4KKyAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzcmMsIGRlc3QgKyAiI25ldyIpCisgICAgICAgICAgICBvcy5yZW5hbWUoZGVzdCArICIjbmV3IiwgZGVzdCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oImNvcHlmaWxlOiBjb3B5ICVzIHRvICVzIGZhaWxlZCAoJXMpIiAlIChzcmMsIGRlc3QsIGUpKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBzcmNjaG93bjoKKyAgICAgICAgICAgICAgICBvcy5jaG1vZChzcmMsIHNzdGF0W3N0YXQuU1RfTU9ERV0pCisgICAgICAgICAgICAgICAgb3MudXRpbWUoc3JjLCAoc3N0YXRbc3RhdC5TVF9BVElNRV0sIHNzdGF0W3N0YXQuU1RfTVRJTUVdKSkKKworICAgIGVsc2U6CisgICAgICAgICN3ZSBkb24ndCB5ZXQgaGFuZGxlIHNwZWNpYWwsIHNvIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIC9iaW4vbXYKKyAgICAgICAgYSA9IGdldHN0YXR1c291dHB1dCgiL2Jpbi9jcCAtZiAiICsgIiciICsgc3JjICsgIicgJyIgKyBkZXN0ICsgIiciKQorICAgICAgICBpZiBhWzBdICE9IDA6CisgICAgICAgICAgICBsb2dnZXIud2FybigiY29weWZpbGU6IGZhaWxlZCB0byBjb3B5IHNwZWNpYWwgZmlsZSAlcyB0byAlcyAoJXMpIiAlIChzcmMsIGRlc3QsIGEpKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlICMgZmFpbHVyZQorICAgIHRyeToKKyAgICAgICAgb3MubGNob3duKGRlc3QsIHNzdGF0W3N0YXQuU1RfVUlEXSwgc3N0YXRbc3RhdC5TVF9HSURdKQorICAgICAgICBvcy5jaG1vZChkZXN0LCBzdGF0LlNfSU1PREUoc3N0YXRbc3RhdC5TVF9NT0RFXSkpICMgU3RpY2t5IGlzIHJlc2V0IG9uIGNob3duCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICBsb2dnZXIud2FybigiY29weWZpbGU6IGZhaWxlZCB0byBjaG93bi9jaG1vZCAlcyAoJXMpIiAlIChkZXN0LCBlKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBpZiBuZXdtdGltZToKKyAgICAgICAgb3MudXRpbWUoZGVzdCwgKG5ld210aW1lLCBuZXdtdGltZSkpCisgICAgZWxzZToKKyAgICAgICAgb3MudXRpbWUoZGVzdCwgKHNzdGF0W3N0YXQuU1RfQVRJTUVdLCBzc3RhdFtzdGF0LlNUX01USU1FXSkpCisgICAgICAgIG5ld210aW1lID0gc3N0YXRbc3RhdC5TVF9NVElNRV0KKyAgICByZXR1cm4gbmV3bXRpbWUKKworZGVmIHdoaWNoKHBhdGgsIGl0ZW0sIGRpcmVjdGlvbiA9IDAsIGhpc3RvcnkgPSBGYWxzZSk6CisgICAgIiIiCisgICAgTG9jYXRlIGEgZmlsZSBpbiBhIFBBVEgKKyAgICAiIiIKKworICAgIGhpc3QgPSBbXQorICAgIHBhdGhzID0gKHBhdGggb3IgIiIpLnNwbGl0KCc6JykKKyAgICBpZiBkaXJlY3Rpb24gIT0gMDoKKyAgICAgICAgcGF0aHMucmV2ZXJzZSgpCisKKyAgICBmb3IgcCBpbiBwYXRoczoKKyAgICAgICAgbmV4dCA9IG9zLnBhdGguam9pbihwLCBpdGVtKQorICAgICAgICBoaXN0LmFwcGVuZChuZXh0KQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXh0KToKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKG5leHQpOgorICAgICAgICAgICAgICAgIG5leHQgPSBvcy5wYXRoLmFic3BhdGgobmV4dCkKKyAgICAgICAgICAgIGlmIGhpc3Rvcnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQsIGhpc3QKKyAgICAgICAgICAgIHJldHVybiBuZXh0CisKKyAgICBpZiBoaXN0b3J5OgorICAgICAgICByZXR1cm4gIiIsIGhpc3QKKyAgICByZXR1cm4gIiIKKworZGVmIHRvX2Jvb2xlYW4oc3RyaW5nLCBkZWZhdWx0PU5vbmUpOgorICAgIGlmIG5vdCBzdHJpbmc6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBub3JtYWxpemVkID0gc3RyaW5nLmxvd2VyKCkKKyAgICBpZiBub3JtYWxpemVkIGluICgieSIsICJ5ZXMiLCAiMSIsICJ0cnVlIik6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBub3JtYWxpemVkIGluICgibiIsICJubyIsICIwIiwgImZhbHNlIik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgdmFsdWUgZm9yIHRvX2Jvb2xlYW46ICVzIiAlIHN0cmluZykKKworZGVmIGNvbnRhaW5zKHZhcmlhYmxlLCBjaGVja3ZhbHVlcywgdHJ1ZXZhbHVlLCBmYWxzZXZhbHVlLCBkKToKKyAgICB2YWwgPSBkLmdldFZhcih2YXJpYWJsZSwgVHJ1ZSkKKyAgICBpZiBub3QgdmFsOgorICAgICAgICByZXR1cm4gZmFsc2V2YWx1ZQorICAgIHZhbCA9IHNldCh2YWwuc3BsaXQoKSkKKyAgICBpZiBpc2luc3RhbmNlKGNoZWNrdmFsdWVzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgY2hlY2t2YWx1ZXMgPSBzZXQoY2hlY2t2YWx1ZXMuc3BsaXQoKSkKKyAgICBlbHNlOgorICAgICAgICBjaGVja3ZhbHVlcyA9IHNldChjaGVja3ZhbHVlcykKKyAgICBpZiBjaGVja3ZhbHVlcy5pc3N1YnNldCh2YWwpOiAKKyAgICAgICAgcmV0dXJuIHRydWV2YWx1ZQorICAgIHJldHVybiBmYWxzZXZhbHVlCisKK2RlZiBjb250YWluc19hbnkodmFyaWFibGUsIGNoZWNrdmFsdWVzLCB0cnVldmFsdWUsIGZhbHNldmFsdWUsIGQpOgorICAgIHZhbCA9IGQuZ2V0VmFyKHZhcmlhYmxlLCBUcnVlKQorICAgIGlmIG5vdCB2YWw6CisgICAgICAgIHJldHVybiBmYWxzZXZhbHVlCisgICAgdmFsID0gc2V0KHZhbC5zcGxpdCgpKQorICAgIGlmIGlzaW5zdGFuY2UoY2hlY2t2YWx1ZXMsIGJhc2VzdHJpbmcpOgorICAgICAgICBjaGVja3ZhbHVlcyA9IHNldChjaGVja3ZhbHVlcy5zcGxpdCgpKQorICAgIGVsc2U6CisgICAgICAgIGNoZWNrdmFsdWVzID0gc2V0KGNoZWNrdmFsdWVzKQorICAgIGlmIGNoZWNrdmFsdWVzICYgdmFsOgorICAgICAgICByZXR1cm4gdHJ1ZXZhbHVlCisgICAgcmV0dXJuIGZhbHNldmFsdWUKKworZGVmIGNwdV9jb3VudCgpOgorICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkKKworZGVmIG5vbmJsb2NraW5nZmQoZmQpOgorICAgIGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX1NFVEZMLCBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGTCkgfCBvcy5PX05PTkJMT0NLKQorCitkZWYgcHJvY2Vzc19wcm9maWxlbG9nKGZuLCBwb3V0ID0gTm9uZSk6CisgICAgIyBFaXRoZXIgY2FsbCB3aXRoIGEgbGlzdCBvZiBmaWxlbmFtZXMgYW5kIHNldCBwb3V0IG9yIGEgZmlsZW5hbWUgYW5kIG9wdGlvbmFsbHkgcG91dC4KKyAgICBpZiBub3QgcG91dDoKKyAgICAgICAgcG91dCA9IGZuICsgJy5wcm9jZXNzZWQnCisgICAgcG91dCA9IG9wZW4ocG91dCwgJ3cnKQorICAgCisgICAgaW1wb3J0IHBzdGF0cworICAgIGlmIGlzaW5zdGFuY2UoZm4sIGxpc3QpOgorICAgICAgICBwID0gcHN0YXRzLlN0YXRzKCpmbiwgc3RyZWFtPXBvdXQpCisgICAgZWxzZToKKyAgICAgICAgcCA9IHBzdGF0cy5TdGF0cyhmbiwgc3RyZWFtPXBvdXQpCisgICAgcC5zb3J0X3N0YXRzKCd0aW1lJykKKyAgICBwLnByaW50X3N0YXRzKCkKKyAgICBwLnByaW50X2NhbGxlcnMoKQorICAgIHAuc29ydF9zdGF0cygnY3VtdWxhdGl2ZScpCisgICAgcC5wcmludF9zdGF0cygpCisKKyAgICBwb3V0LmZsdXNoKCkKKyAgICBwb3V0LmNsb3NlKCkgIAorCisjCisjIFdhcyBwcmVzZW50IHRvIHdvcmsgYXJvdW5kIG11bHRpcHJvY2Vzc2luZyBwb29sIGJ1Z3MgaW4gcHl0aG9uIDwgMi43LjMKKyMKK2RlZiBtdWx0aXByb2Nlc3Npbmdwb29sKCphcmdzLCAqKmt3YXJncyk6CisKKyAgICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLnBvb2wKKyAgICAjaW1wb3J0IG11bHRpcHJvY2Vzc2luZy51dGlsCisgICAgI211bHRpcHJvY2Vzc2luZy51dGlsLmxvZ190b19zdGRlcnIoMTApCisgICAgIyBEZWFsIHdpdGggYSBtdWx0aXByb2Nlc3NpbmcgYnVnIHdoZXJlIHNpZ25hbHMgdG8gdGhlIHByb2Nlc3NlcyB3b3VsZCBiZSBkZWxheWVkIHVudGlsIHRoZSB3b3JrCisgICAgIyBjb21wbGV0ZXMuIFB1dHRpbmcgaW4gYSB0aW1lb3V0IG1lYW5zIHRoZSBzaWduYWxzIChsaWtlIFNJR0lOVC9TSUdURVJNKSBnZXQgcHJvY2Vzc2VkLgorICAgIGRlZiB3cmFwcGVyKGZ1bmMpOgorICAgICAgICBkZWYgd3JhcChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgdGltZW91dD10aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSAxZTEwMCkKKyAgICAgICAgcmV0dXJuIHdyYXAKKyAgICBtdWx0aXByb2Nlc3NpbmcucG9vbC5JTWFwSXRlcmF0b3IubmV4dCA9IHdyYXBwZXIobXVsdGlwcm9jZXNzaW5nLnBvb2wuSU1hcEl0ZXJhdG9yLm5leHQpCisKKyAgICByZXR1cm4gbXVsdGlwcm9jZXNzaW5nLlBvb2woKmFyZ3MsICoqa3dhcmdzKQorCitkZWYgZXhlY19mbGF0X3B5dGhvbl9mdW5jKGZ1bmMsICphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiRXhlY3V0ZSBhIGZsYXQgcHl0aG9uIGZ1bmN0aW9uIChkZWZpbmVkIHdpdGggZGVmIGZ1bmNuYW1lKGFyZ3MpOi4uLikiIiIKKyAgICAjIFByZXBhcmUgYSBzbWFsbCBwaWVjZSBvZiBweXRob24gY29kZSB3aGljaCBjYWxscyB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uCisgICAgIyBUbyBkbyB0aGlzIHdlIG5lZWQgdG8gcHJlcGFyZSB0d28gdGhpbmdzIC0gYSBzZXQgb2YgdmFyaWFibGVzIHdlIGNhbiB1c2UgdG8gcGFzcworICAgICMgdGhlIHZhbHVlcyBvZiBhcmd1bWVudHMgaW50byB0aGUgY2FsbGluZyBmdW5jdGlvbiwgYW5kIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBmb3IKKyAgICAjIHRoZSBmdW5jdGlvbiBiZWluZyBjYWxsZWQKKyAgICBjb250ZXh0ID0ge30KKyAgICBmdW5jYXJncyA9IFtdCisgICAgIyBIYW5kbGUgdW5uYW1lZCBhcmd1bWVudHMKKyAgICBhaWR4ID0gMQorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgYXJnbmFtZSA9ICdhcmdfJXMnICUgYWlkeAorICAgICAgICBjb250ZXh0W2FyZ25hbWVdID0gYXJnCisgICAgICAgIGZ1bmNhcmdzLmFwcGVuZChhcmduYW1lKQorICAgICAgICBhaWR4ICs9IDEKKyAgICAjIEhhbmRsZSBrZXl3b3JkIGFyZ3VtZW50cworICAgIGNvbnRleHQudXBkYXRlKGt3YXJncykKKyAgICBmdW5jYXJncy5leHRlbmQoWyclcz0lcycgJSAoYXJnLCBhcmcpIGZvciBhcmcgaW4ga3dhcmdzLml0ZXJrZXlzKCldKQorICAgIGNvZGUgPSAncmV0dmFsID0gJXMoJXMpJyAlIChmdW5jLCAnLCAnLmpvaW4oZnVuY2FyZ3MpKQorICAgIGNvbXAgPSBiYi51dGlscy5iZXR0ZXJfY29tcGlsZShjb2RlLCAnPHN0cmluZz4nLCAnPHN0cmluZz4nKQorICAgIGJiLnV0aWxzLmJldHRlcl9leGVjKGNvbXAsIGNvbnRleHQsIGNvZGUsICc8c3RyaW5nPicpCisgICAgcmV0dXJuIGNvbnRleHRbJ3JldHZhbCddCisKK2RlZiBlZGl0X21ldGFkYXRhKG1ldGFfbGluZXMsIHZhcmlhYmxlcywgdmFyZnVuYywgbWF0Y2hfb3ZlcnJpZGVzPUZhbHNlKToKKyAgICAiIiJFZGl0IGxpbmVzIGZyb20gYSByZWNpcGUgb3IgY29uZmlnIGZpbGUgYW5kIG1vZGlmeSBvbmUgb3IgbW9yZQorICAgIHNwZWNpZmllZCB2YXJpYWJsZSB2YWx1ZXMgc2V0IGluIHRoZSBmaWxlIHVzaW5nIGEgc3BlY2lmaWVkIGNhbGxiYWNrCisgICAgZnVuY3Rpb24uIExpbmVzIGFyZSBleHBlY3RlZCB0byBoYXZlIHRyYWlsaW5nIG5ld2xpbmVzLgorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIG1ldGFfbGluZXM6IGxpbmVzIGZyb20gdGhlIGZpbGU7IGNhbiBiZSBhIGxpc3Qgb3IgYW4gaXRlcmFibGUKKyAgICAgICAgICAgIChlLmcuIGZpbGUgcG9pbnRlcikKKyAgICAgICAgdmFyaWFibGVzOiBhIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgdG8gbG9vayBmb3IuIEZ1bmN0aW9ucworICAgICAgICAgICAgbWF5IGFsc28gYmUgc3BlY2lmaWVkLCBidXQgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCAnKCknIGF0CisgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBuYW1lLiBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZQorICAgICAgICAgICAgYW55IGludHJpbnNpYyB1bmRlcnN0YW5kaW5nIG9mIF9hcHBlbmQsIF9wcmVwZW5kLCBfcmVtb3ZlLAorICAgICAgICAgICAgb3Igb3ZlcnJpZGVzLCBzbyB0aGVzZSBhcmUgY29uc2lkZXJlZCBhcyBwYXJ0IG9mIHRoZSBuYW1lLgorICAgICAgICAgICAgVGhlc2UgdmFsdWVzIGdvIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24sIHNvIHJlZ3VsYXIKKyAgICAgICAgICAgIGV4cHJlc3Npb24gc3ludGF4IGlzIGFsbG93ZWQuCisgICAgICAgIHZhcmZ1bmM6IGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZXZlcnkgdmFyaWFibGUgbWF0Y2hpbmcKKyAgICAgICAgICAgIG9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgdmFyaWFibGVzIHBhcmFtZXRlci4gVGhlIGZ1bmN0aW9uCisgICAgICAgICAgICBzaG91bGQgdGFrZSBmb3VyIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgICB2YXJuYW1lOiBuYW1lIG9mIHZhcmlhYmxlIG1hdGNoZWQKKyAgICAgICAgICAgICAgICBvcmlndmFsdWU6IGN1cnJlbnQgdmFsdWUgaW4gZmlsZQorICAgICAgICAgICAgICAgIG9wOiB0aGUgb3BlcmF0b3IgKGUuZy4gJys9JykKKyAgICAgICAgICAgICAgICBuZXdsaW5lczogbGlzdCBvZiBsaW5lcyB1cCB0byB0aGlzIHBvaW50LiBZb3UgY2FuIHVzZQorICAgICAgICAgICAgICAgICAgICB0aGlzIHRvIHByZXBlbmQgbGluZXMgYmVmb3JlIHRoaXMgdmFyaWFibGUgc2V0dGluZworICAgICAgICAgICAgICAgICAgICBpZiB5b3Ugd2lzaC4KKyAgICAgICAgICAgIGFuZCBzaG91bGQgcmV0dXJuIGEgdGhyZWUtZWxlbWVudCB0dXBsZToKKyAgICAgICAgICAgICAgICBuZXd2YWx1ZTogbmV3IHZhbHVlIHRvIHN1YnN0aXR1dGUgaW4sIG9yIE5vbmUgdG8gZHJvcAorICAgICAgICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgc2V0dGluZyBlbnRpcmVseS4gKElmIHRoZSByZW1vdmFsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgaW4gdHdvIGNvbnNlY3V0aXZlIGJsYW5rIGxpbmVzLCBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIGJsYW5rIGxpbmVzIHdpbGwgYWxzbyBiZSBkcm9wcGVkKS4KKyAgICAgICAgICAgICAgICBuZXdvcDogdGhlIG9wZXJhdG9yIHRvIHVzZSAtIGlmIHlvdSBzcGVjaWZ5IE5vbmUgaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9wZXJhdGlvbiB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAgICAgaW5kZW50OiBudW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCBtdWx0aS1saW5lIGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgIG9yIC0xIHRvIGluZGVudCB1cCB0byB0aGUgbGV2ZWwgb2YgdGhlIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgYW5kIG9wZW5pbmcgcXVvdGUsIG9yIGEgc3RyaW5nIHRvIHVzZSBhcyB0aGUgaW5kZW50LgorICAgICAgICAgICAgICAgIG1pbmJyZWFrOiBUcnVlIHRvIGFsbG93IHRoZSBmaXJzdCBlbGVtZW50IG9mIGEKKyAgICAgICAgICAgICAgICAgICAgbXVsdGktbGluZSB2YWx1ZSB0byBjb250aW51ZSBvbiB0aGUgc2FtZSBsaW5lIGFzCisgICAgICAgICAgICAgICAgICAgIHRoZSBhc3NpZ25tZW50LCBGYWxzZSB0byBpbmRlbnQgYmVmb3JlIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgICAgICBtYXRjaF9vdmVycmlkZXM6IFRydWUgdG8gbWF0Y2ggaXRlbXMgd2l0aCBfb3ZlcnJpZGVzIG9uIHRoZSBlbmQsCisgICAgICAgICAgICBGYWxzZSBvdGhlcndpc2UKKyAgICBSZXR1cm5zIGEgdHVwbGU6CisgICAgICAgIHVwZGF0ZWQ6CisgICAgICAgICAgICBUcnVlIGlmIGNoYW5nZXMgd2VyZSBtYWRlLCBGYWxzZSBvdGhlcndpc2UuCisgICAgICAgIG5ld2xpbmVzOgorICAgICAgICAgICAgTGluZXMgYWZ0ZXIgcHJvY2Vzc2luZworICAgICIiIgorCisgICAgdmFyX3JlcyA9IHt9CisgICAgaWYgbWF0Y2hfb3ZlcnJpZGVzOgorICAgICAgICBvdmVycmlkZV9yZSA9ICcoX1thLXpBLVowLTktXyQoKXt9XSspPycKKyAgICBlbHNlOgorICAgICAgICBvdmVycmlkZV9yZSA9ICcnCisgICAgZm9yIHZhciBpbiB2YXJpYWJsZXM6CisgICAgICAgIGlmIHZhci5lbmRzd2l0aCgnKCknKToKKyAgICAgICAgICAgIHZhcl9yZXNbdmFyXSA9IHJlLmNvbXBpbGUoJ14oJXMlcylbIFxcdF0qXChbIFxcdF0qXClbIFxcdF0qeycgJSAodmFyWzotMl0ucnN0cmlwKCksIG92ZXJyaWRlX3JlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhcl9yZXNbdmFyXSA9IHJlLmNvbXBpbGUoJ14oJXMlcylbIFxcdF0qWz8rOi5dKj1bKy5dKlsgXFx0XSooWyJcJ10pJyAlICh2YXIsIG92ZXJyaWRlX3JlKSkKKworICAgIHVwZGF0ZWQgPSBGYWxzZQorICAgIHZhcnNldF9zdGFydCA9ICcnCisgICAgdmFybGluZXMgPSBbXQorICAgIG5ld2xpbmVzID0gW10KKyAgICBpbl92YXIgPSBOb25lCisgICAgZnVsbF92YWx1ZSA9ICcnCisgICAgdmFyX2VuZCA9ICcnCisKKyAgICBkZWYgaGFuZGxlX3Zhcl9lbmQoKToKKyAgICAgICAgcHJlcnVuX25ld2xpbmVzID0gbmV3bGluZXNbOl0KKyAgICAgICAgb3AgPSB2YXJzZXRfc3RhcnRbbGVuKGluX3Zhcik6XS5zdHJpcCgpCisgICAgICAgIChuZXd2YWx1ZSwgbmV3b3AsIGluZGVudCwgbWluYnJlYWspID0gdmFyZnVuYyhpbl92YXIsIGZ1bGxfdmFsdWUsIG9wLCBuZXdsaW5lcykKKyAgICAgICAgY2hhbmdlZCA9IChwcmVydW5fbmV3bGluZXMgIT0gbmV3bGluZXMpCisKKyAgICAgICAgaWYgbmV3dmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgRHJvcCB0aGUgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsaWYgbmV3dmFsdWUgIT0gZnVsbF92YWx1ZSBvciAobmV3b3Agbm90IGluIFtOb25lLCBvcF0pOgorICAgICAgICAgICAgaWYgbmV3b3Agbm90IGluIFtOb25lLCBvcF06CisgICAgICAgICAgICAgICAgIyBDYWxsYmFjayBjaGFuZ2VkIHRoZSBvcGVyYXRvcgorICAgICAgICAgICAgICAgIHZhcnNldF9uZXcgPSAiJXMgJXMiICUgKGluX3ZhciwgbmV3b3ApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhcnNldF9uZXcgPSB2YXJzZXRfc3RhcnQKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmRlbnQsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICAgICBpZiBpbmRlbnQgPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIGluZGVudHNwYyA9ICcgJyAqIChsZW4odmFyc2V0X25ldykgKyAyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGluZGVudHNwYyA9ICcgJyAqIGluZGVudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbmRlbnRzcGMgPSBpbmRlbnQKKyAgICAgICAgICAgIGlmIGluX3Zhci5lbmRzd2l0aCgnKCknKToKKyAgICAgICAgICAgICAgICAjIEEgZnVuY3Rpb24gZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmV3dmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzIHtcbiVzJXNcbn1cbicgJSAodmFyc2V0X25ldywgaW5kZW50c3BjLCAoJ1xuJXMnICUgaW5kZW50c3BjKS5qb2luKG5ld3ZhbHVlKSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5ld3ZhbHVlLnN0YXJ0c3dpdGgoJ1xuJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSA9ICdcbicgKyBuZXd2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmV3dmFsdWUuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSA9IG5ld3ZhbHVlICsgJ1xuJworICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzIHslc31cbicgJSAodmFyc2V0X25ldywgbmV3dmFsdWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE5vcm1hbCB2YXJpYWJsZQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmV3dmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmV3dmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IGxpc3QgLT4gZW1wdHkgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lcy5hcHBlbmQoJyVzICIiXG4nICUgdmFyc2V0X25ldykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBtaW5icmVhazoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRmlyc3QgaXRlbSBvbiBmaXJzdCBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4obmV3dmFsdWUpID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyAiJXMiXG4nICUgKHZhcnNldF9uZXcsIG5ld3ZhbHVlWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyAiJXMgXFxcbicgJSAodmFyc2V0X25ldywgbmV3dmFsdWVbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5ld3ZhbHVlWzE6XToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyVzIFxcXG4nICUgKGluZGVudHNwYywgaXRlbSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyJcbicgJSBpbmRlbnRzcGMpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIGl0ZW0gb24gZmlyc3QgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyAiIFxcXG4nICUgdmFyc2V0X25ldykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5ld3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmVzLmFwcGVuZCgnJXMlcyBcXFxuJyAlIChpbmRlbnRzcGMsIGl0ZW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyJcbicgJSBpbmRlbnRzcGMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKCclcyAiJXMiXG4nICUgKHZhcnNldF9uZXcsIG5ld3ZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFB1dCB0aGUgb2xkIGxpbmVzIGJhY2sgd2hlcmUgdGhleSB3ZXJlCisgICAgICAgICAgICBuZXdsaW5lcy5leHRlbmQodmFybGluZXMpCisgICAgICAgICAgICAjIElmIG5ld2xpbmVzIHdhcyB0b3VjaGVkIGJ5IHRoZSBmdW5jdGlvbiwgd2UnbGwgbmVlZCB0byByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQKKworICAgIGNoZWNrc3BjID0gRmFsc2UKKworICAgIGZvciBsaW5lIGluIG1ldGFfbGluZXM6CisgICAgICAgIGlmIGluX3ZhcjoKKyAgICAgICAgICAgIHZhbHVlID0gbGluZS5yc3RyaXAoKQorICAgICAgICAgICAgdmFybGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICBpZiBpbl92YXIuZW5kc3dpdGgoJygpJyk6CisgICAgICAgICAgICAgICAgZnVsbF92YWx1ZSArPSAnXG4nICsgdmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVsbF92YWx1ZSArPSB2YWx1ZVs6LTFdCisgICAgICAgICAgICBpZiB2YWx1ZS5lbmRzd2l0aCh2YXJfZW5kKToKKyAgICAgICAgICAgICAgICBpZiBpbl92YXIuZW5kc3dpdGgoJygpJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bGxfdmFsdWUuY291bnQoJ3snKSAtIGZ1bGxfdmFsdWUuY291bnQoJ30nKSA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmdWxsX3ZhbHVlID0gZnVsbF92YWx1ZVs6LTFdCisgICAgICAgICAgICAgICAgaWYgaGFuZGxlX3Zhcl9lbmQoKToKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzcGMgPSBUcnVlCisgICAgICAgICAgICAgICAgaW5fdmFyID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2tpcCA9IEZhbHNlCisgICAgICAgICAgICBmb3IgKHZhcm5hbWUsIHZhcl9yZSkgaW4gdmFyX3Jlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICByZXMgPSB2YXJfcmUubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICBpZiByZXM6CisgICAgICAgICAgICAgICAgICAgIGlzZnVuYyA9IHZhcm5hbWUuZW5kc3dpdGgoJygpJykKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNmdW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXR2YWx1ZSA9IGxpbmUuc3BsaXQoJ3snLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2VuZCA9ICd9JworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2VuZCA9IHJlcy5ncm91cHMoKVstMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0dmFsdWUgPSBsaW5lLnNwbGl0KHZhcl9lbmQsIDEpCisgICAgICAgICAgICAgICAgICAgIHZhcnNldF9zdGFydCA9IHNwbGl0dmFsdWVbMF0ucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzcGxpdHZhbHVlWzFdLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2Z1bmMgYW5kIHZhbHVlLmVuZHN3aXRoKCdcXCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVs6LTFdCisgICAgICAgICAgICAgICAgICAgIGZ1bGxfdmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB2YXJsaW5lcyA9IFtsaW5lXQorICAgICAgICAgICAgICAgICAgICBpbl92YXIgPSByZXMuZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNmdW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5fdmFyICs9ICcoKScKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUuZW5kc3dpdGgodmFyX2VuZCk6CisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX3ZhbHVlID0gZnVsbF92YWx1ZVs6LTFdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYW5kbGVfdmFyX2VuZCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzcGMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBpbl92YXIgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3Qgc2tpcDoKKyAgICAgICAgICAgICAgICBpZiBjaGVja3NwYzoKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzcGMgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBpZiBuZXdsaW5lc1stMV0gPT0gJ1xuJyBhbmQgbGluZSA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBTcXVhc2ggYmxhbmsgbGluZSBpZiB0aGVyZSBhcmUgdHdvIGNvbnNlY3V0aXZlIGJsYW5rcyBhZnRlciBhIHJlbW92YWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbmV3bGluZXMuYXBwZW5kKGxpbmUpCisgICAgcmV0dXJuICh1cGRhdGVkLCBuZXdsaW5lcykKKworCitkZWYgZWRpdF9tZXRhZGF0YV9maWxlKG1ldGFfZmlsZSwgdmFyaWFibGVzLCB2YXJmdW5jKToKKyAgICAiIiJFZGl0IGEgcmVjaXBlIG9yIGNvbmZpZyBmaWxlIGFuZCBtb2RpZnkgb25lIG9yIG1vcmUgc3BlY2lmaWVkCisgICAgdmFyaWFibGUgdmFsdWVzIHNldCBpbiB0aGUgZmlsZSB1c2luZyBhIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBUaGUgZmlsZSBpcyBvbmx5IHdyaXR0ZW4gdG8gaWYgdGhlIHZhbHVlKHMpIGFjdHVhbGx5IGNoYW5nZS4KKyAgICBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZmlsZSB2ZXJzaW9uIG9mIGVkaXRfbWV0YWRhdGEoKSwgc2VlIHRoYXQKKyAgICBmdW5jdGlvbidzIGRlc2NyaXB0aW9uIGZvciBwYXJhbWV0ZXIvdXNhZ2UgaW5mb3JtYXRpb24uCisgICAgUmV0dXJucyBUcnVlIGlmIHRoZSBmaWxlIHdhcyB3cml0dGVuIHRvLCBGYWxzZSBvdGhlcndpc2UuCisgICAgIiIiCisgICAgd2l0aCBvcGVuKG1ldGFfZmlsZSwgJ3InKSBhcyBmOgorICAgICAgICAodXBkYXRlZCwgbmV3bGluZXMpID0gZWRpdF9tZXRhZGF0YShmLCB2YXJpYWJsZXMsIHZhcmZ1bmMpCisgICAgaWYgdXBkYXRlZDoKKyAgICAgICAgd2l0aCBvcGVuKG1ldGFfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZWxpbmVzKG5ld2xpbmVzKQorICAgIHJldHVybiB1cGRhdGVkCisKKworZGVmIGVkaXRfYmJsYXllcnNfY29uZihiYmxheWVyc19jb25mLCBhZGQsIHJlbW92ZSk6CisgICAgIiIiRWRpdCBiYmxheWVycy5jb25mLCBhZGRpbmcgYW5kL29yIHJlbW92aW5nIGxheWVycyIiIgorCisgICAgaW1wb3J0IGZubWF0Y2gKKworICAgIGRlZiByZW1vdmVfdHJhaWxpbmdfc2VwKHB0aCk6CisgICAgICAgIGlmIHB0aCBhbmQgcHRoWy0xXSA9PSBvcy5zZXA6CisgICAgICAgICAgICBwdGggPSBwdGhbOi0xXQorICAgICAgICByZXR1cm4gcHRoCisKKyAgICBkZWYgbGF5ZXJsaXN0X3BhcmFtKHZhbHVlKToKKyAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICByZXR1cm4gW3JlbW92ZV90cmFpbGluZ19zZXAoeCkgZm9yIHggaW4gdmFsdWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW3JlbW92ZV90cmFpbGluZ19zZXAodmFsdWUpXQorCisgICAgbm90YWRkZWQgPSBbXQorICAgIG5vdHJlbW92ZWQgPSBbXQorCisgICAgYWRkbGF5ZXJzID0gbGF5ZXJsaXN0X3BhcmFtKGFkZCkKKyAgICByZW1vdmVsYXllcnMgPSBsYXllcmxpc3RfcGFyYW0ocmVtb3ZlKQorCisgICAgIyBOZWVkIHRvIHVzZSBhIGxpc3QgaGVyZSBiZWNhdXNlIHdlIGNhbid0IHNldCBub24tbG9jYWwgdmFyaWFibGVzIGZyb20gYSBjYWxsYmFjayBpbiBweXRob24gMi54CisgICAgYmJsYXllcmNhbGxzID0gW10KKworICAgIGRlZiBoYW5kbGVfYmJsYXllcnModmFybmFtZSwgb3JpZ3ZhbHVlLCBvcCwgbmV3bGluZXMpOgorICAgICAgICBiYmxheWVyY2FsbHMuYXBwZW5kKHZhcm5hbWUpCisgICAgICAgIHVwZGF0ZWQgPSBGYWxzZQorICAgICAgICBiYmxheWVycyA9IFtyZW1vdmVfdHJhaWxpbmdfc2VwKHgpIGZvciB4IGluIG9yaWd2YWx1ZS5zcGxpdCgpXQorICAgICAgICBpZiByZW1vdmVsYXllcnM6CisgICAgICAgICAgICBmb3IgcmVtb3ZlbGF5ZXIgaW4gcmVtb3ZlbGF5ZXJzOgorICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGZvciBsYXllciBpbiBiYmxheWVyczoKKyAgICAgICAgICAgICAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKGxheWVyLCByZW1vdmVsYXllcik6CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJibGF5ZXJzLnJlbW92ZShsYXllcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoZWQ6CisgICAgICAgICAgICAgICAgICAgIG5vdHJlbW92ZWQuYXBwZW5kKHJlbW92ZWxheWVyKQorICAgICAgICBpZiBhZGRsYXllcnM6CisgICAgICAgICAgICBmb3IgYWRkbGF5ZXIgaW4gYWRkbGF5ZXJzOgorICAgICAgICAgICAgICAgIGlmIGFkZGxheWVyIG5vdCBpbiBiYmxheWVyczoKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYmJsYXllcnMuYXBwZW5kKGFkZGxheWVyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vdGFkZGVkLmFwcGVuZChhZGRsYXllcikKKworICAgICAgICBpZiB1cGRhdGVkOgorICAgICAgICAgICAgcmV0dXJuIChiYmxheWVycywgTm9uZSwgMiwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKG9yaWd2YWx1ZSwgTm9uZSwgMiwgRmFsc2UpCisKKyAgICBlZGl0X21ldGFkYXRhX2ZpbGUoYmJsYXllcnNfY29uZiwgWydCQkxBWUVSUyddLCBoYW5kbGVfYmJsYXllcnMpCisKKyAgICBpZiBub3QgYmJsYXllcmNhbGxzOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1VuYWJsZSB0byBmaW5kIEJCTEFZRVJTIGluICVzJyAlIGJibGF5ZXJzX2NvbmYpCisKKyAgICByZXR1cm4gKG5vdGFkZGVkLCBub3RyZW1vdmVkKQorCisKK2RlZiBnZXRfZmlsZV9sYXllcihmaWxlbmFtZSwgZCk6CisgICAgIiIiRGV0ZXJtaW5lIHRoZSBjb2xsZWN0aW9uIChhcyBkZWZpbmVkIGJ5IGEgbGF5ZXIncyBsYXllci5jb25mIGZpbGUpIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBmaWxlIiIiCisgICAgY29sbGVjdGlvbnMgPSAoZC5nZXRWYXIoJ0JCRklMRV9DT0xMRUNUSU9OUycsIFRydWUpIG9yICcnKS5zcGxpdCgpCisgICAgY29sbGVjdGlvbl9yZXMgPSB7fQorICAgIGZvciBjb2xsZWN0aW9uIGluIGNvbGxlY3Rpb25zOgorICAgICAgICBjb2xsZWN0aW9uX3Jlc1tjb2xsZWN0aW9uXSA9IGQuZ2V0VmFyKCdCQkZJTEVfUEFUVEVSTl8lcycgJSBjb2xsZWN0aW9uLCBUcnVlKSBvciAnJworCisgICAgZGVmIHBhdGhfdG9fbGF5ZXIocGF0aCk6CisgICAgICAgICMgVXNlIGxvbmdlc3QgcGF0aCBzbyB3ZSBoYW5kbGUgbmVzdGVkIGxheWVycworICAgICAgICBtYXRjaGxlbiA9IDAKKyAgICAgICAgbWF0Y2ggPSBOb25lCisgICAgICAgIGZvciBjb2xsZWN0aW9uLCByZWdleCBpbiBjb2xsZWN0aW9uX3Jlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGxlbihyZWdleCkgPiBtYXRjaGxlbiBhbmQgcmUubWF0Y2gocmVnZXgsIHBhdGgpOgorICAgICAgICAgICAgICAgIG1hdGNobGVuID0gbGVuKHJlZ2V4KQorICAgICAgICAgICAgICAgIG1hdGNoID0gY29sbGVjdGlvbgorICAgICAgICByZXR1cm4gbWF0Y2gKKworICAgIHJlc3VsdCA9IE5vbmUKKyAgICBiYmZpbGVzID0gKGQuZ2V0VmFyKCdCQkZJTEVTJywgVHJ1ZSkgb3IgJycpLnNwbGl0KCkKKyAgICBiYmZpbGVzbWF0Y2ggPSBGYWxzZQorICAgIGZvciBiYmZpbGVzZW50cnkgaW4gYmJmaWxlczoKKyAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKGZpbGVuYW1lLCBiYmZpbGVzZW50cnkpOgorICAgICAgICAgICAgYmJmaWxlc21hdGNoID0gVHJ1ZQorICAgICAgICAgICAgcmVzdWx0ID0gcGF0aF90b19sYXllcihiYmZpbGVzZW50cnkpCisKKyAgICBpZiBub3QgYmJmaWxlc21hdGNoOgorICAgICAgICAjIFByb2JhYmx5IGEgYmJjbGFzcworICAgICAgICByZXN1bHQgPSBwYXRoX3RvX2xheWVyKGZpbGVuYW1lKQorCisgICAgcmV0dXJuIHJlc3VsdAorCisKKyMgQ29uc3RhbnQgdGFrZW4gZnJvbSBodHRwOi8vbGludXguZGllLm5ldC9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKK1BSX1NFVF9QREVBVEhTSUcgPSAxCisKK2NsYXNzIFByQ3RsRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2RlZiBzaWduYWxfb25fcGFyZW50X2V4aXQoc2lnbmFtZSk6CisgICAgIiIiCisgICAgVHJpZ2dlciBzaWduYW1lIHRvIGJlIHNlbnQgd2hlbiB0aGUgcGFyZW50IHByb2Nlc3MgZGllcworICAgICIiIgorICAgIHNpZ251bSA9IGdldGF0dHIoc2lnbmFsLCBzaWduYW1lKQorICAgICMgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzIvcHJjdGwKKyAgICByZXN1bHQgPSBjZGxsWydsaWJjLnNvLjYnXS5wcmN0bChQUl9TRVRfUERFQVRIU0lHLCBzaWdudW0pCisgICAgaWYgcmVzdWx0ICE9IDA6CisgICAgICAgIHJhaXNlIFByQ3RsRXJyb3IoJ3ByY3RsIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJXMnICUgcmVzdWx0KQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L0FVVEhPUlMudHh0IGIvYml0YmFrZS9saWIvYnM0L0FVVEhPUlMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzhmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvQVVUSE9SUy50eHQKQEAgLTAsMCArMSw0MyBAQAorQmVob2xkLCBtb3J0YWwsIHRoZSBvcmlnaW5zIG9mIEJlYXV0aWZ1bCBTb3VwLi4uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGVvbmFyZCBSaWNoYXJkc29uIGlzIHRoZSBwcmltYXJ5IHByb2dyYW1tZXIuCisKK0Fhcm9uIERlVm9yZSBpcyBhd2Vzb21lLgorCitNYXJrIFBpbGdyaW0gcHJvdmlkZWQgdGhlIGVuY29kaW5nIGRldGVjdGlvbiBjb2RlIHRoYXQgZm9ybXMgdGhlIGJhc2UKK29mIFVuaWNvZGVEYW1taXQuCisKK1Rob21hcyBLbHV5dmVyIGFuZCBFemlvIE1lbG90dGkgZmluaXNoZWQgdGhlIHdvcmsgb2YgZ2V0dGluZyBCZWF1dGlmdWwKK1NvdXAgNCB3b3JraW5nIHVuZGVyIFB5dGhvbiAzLgorCitTaW1vbiBXaWxsaXNvbiB3cm90ZSBzb3Vwc2VsZWN0LCB3aGljaCB3YXMgdXNlZCB0byBtYWtlIEJlYXV0aWZ1bCBTb3VwCitzdXBwb3J0IENTUyBzZWxlY3RvcnMuCisKK1NhbSBSdWJ5IGhlbHBlZCB3aXRoIGEgbG90IG9mIGVkZ2UgY2FzZXMuCisKK0pvbmF0aGFuIEVsbGlzIHdhcyBhd2FyZGVkIHRoZSBwcmVzdGlnb3VzIEJlYXUgUG90YWdlIEQnT3IgZm9yIGhpcword29yayBpbiBzb2x2aW5nIHRoZSBuZXN0YWJsZSB0YWdzIGNvbnVuZHJ1bS4KKworQW4gaW5jb21wbGV0ZSBsaXN0IG9mIHBlb3BsZSBoYXZlIGNvbnRyaWJ1dGVkIHBhdGNoZXMgdG8gQmVhdXRpZnVsCitTb3VwOgorCisgSXN0dmFuIEFsYmVydCwgQW5kcmV3IExpbiwgQW50aG9ueSBCYXh0ZXIsIEFuZHJldyBCb3lrbywgVG9ueSBDaGFuZywKKyBaZXBoeXIgRmFuZywgRnV6enksIFJvbWFuIEdhdWZtYW4sIFlvbmkgR2lsYWQsIFJpY2hpZSBIaW5kbGUsIFBldGVyaXMKKyBLcnVtaW5zLCBLZW50IEpvaG5zb24sIEJlbiBMYXN0LCBSb2JlcnQgTGVmdHdpY2gsIFN0YWZmYW4gTWFsbWdyZW4sCisgS3NlbmlhIE1hcmFzYW5vdmEsIEpQIE1vaW5zLCBBZGFtIE1vbnNlbiwgSm9obiBOYWdsZSwgIkpvbiIsIEVkCisgT3NraWV3aWN6LCBHcmVnIFBoaWxsaXBzLCBHaWxlcyBSYWRmb3JkLCBBcnRodXIgUnVkb2xwaCwgTWFya28KKyBTYW1hc3R1ciwgSm91bmkgU2VwcORuZW4sIEFsZXhhbmRlciBTY2htb2xjaywgQW5keSBUaGV5ZXJzLCBHbHluCisgV2Vic3RlciwgUGF1bCBXcmlnaHQsIERhbm55IFlvbworCitBbiBpbmNvbXBsZXRlIGxpc3Qgb2YgcGVvcGxlIHdobyBtYWRlIHN1Z2dlc3Rpb25zIG9yIGZvdW5kIGJ1Z3Mgb3IKK2ZvdW5kIHdheXMgdG8gYnJlYWsgQmVhdXRpZnVsIFNvdXA6CisKKyBIYW5ubyBC9mNrLCBNYXR0ZW8gQmVydGluaSwgQ2hyaXMgQ3VydmV5LCBTaW1vbiBDdXNhY2ssIEJydWNlIEVja2VsLAorIE1hdHQgRXJuc3QsIE1pY2hhZWwgRm9vcmQsIFRvbSBIYXJyaXMsIEJpbGwgZGUgaE9yYSwgRG9uYWxkIEhvd2VzLAorIE1hdHQgUGF0dGVyc29uLCBTY290dCBSb2JlcnRzLCBTdGV2ZSBTdHJhc3NtYW5uLCBNaWtlIFdpbGxpYW1zLAorIHdhcmNoaWxkIGF0IHJlZGhvIGRvdCBjb20sIFNhbWkgS3Vpc21hLCBDYXJsb3MgUm9jaGEsIEJvYiBIdXRjaGlzb24sCisgSm9yZW4gTWMsIE1pY2hhbCBNaWd1cnNraSwgSm9obiBLbGV2ZW4sIFRpbSBIZWFuZXksIFRyaXBwIExpbGxleSwgRWQKKyBTdW1tZXJzLCBEZW5uaXMgU3V0Y2gsIENocmlzIFNtaXRoLCBBYXJvbiBTd2VlcF5XIFN3YXJ0eiwgU3R1YXJ0CisgVHVybmVyLCBHcmVnIEVkd2FyZHMsIEtldmluIEogS2FsdXBzb24sIE5pa29zIEtvdXJlbWVub3MsIEFydHVyIGRlCisgU291c2EgUm9jaGEsIFlpY2h1biBXZWksIFBlciBWb2duc2VuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvQ09QWUlORy50eHQgYi9iaXRiYWtlL2xpYi9iczQvQ09QWUlORy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2OGQxMwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC9DT1BZSU5HLnR4dApAQCAtMCwwICsxLDI2IEBACitCZWF1dGlmdWwgU291cCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CisKKyBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMiBMZW9uYXJkIFJpY2hhcmRzb24KKworIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorIFNPRlRXQVJFLCBEQU1NSVQuCisKK0JlYXV0aWZ1bCBTb3VwIGluY29ycG9yYXRlcyBjb2RlIGZyb20gdGhlIGh0bWw1bGliIGxpYnJhcnksIHdoaWNoIGlzCithbHNvIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9ORVdTLnR4dCBiL2JpdGJha2UvbGliL2JzNC9ORVdTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE2MGEyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L05FV1MudHh0CkBAIC0wLDAgKzEsMTA2NiBAQAorPSA0LjMuMiAoMjAxMzEwMDIpID0KKworKiBGaXhlZCBhIGJ1ZyBpbiB3aGljaCBzaG9ydCBVbmljb2RlIGlucHV0IHdhcyBpbXByb3Blcmx5IGVuY29kZWQgdG8KKyAgQVNDSUkgd2hlbiBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBpdCB3YXMgdGhlIG5hbWUgb2YgYSBmaWxlIG9uCisgIGRpc2suIFtidWc9MTIyNzAxNl0KKworKiBGaXhlZCBhIGNyYXNoIHdoZW4gYSBzaG9ydCBpbnB1dCBjb250YWlucyBkYXRhIG5vdCB2YWxpZCBpbgorICBmaWxlbmFtZXMuIFtidWc9MTIzMjYwNF0KKworKiBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBVbmljb2RlIGRhdGEgcHV0IGludG8gVW5pY29kZURhbW1pdCB0bworICByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBkYXRhLiBbYnVnPTEyMTQ5ODNdCisKKyogQ29tYmluZWQgdHdvIHRlc3RzIHRvIHN0b3AgYSBzcHVyaW91cyB0ZXN0IGZhaWx1cmUgd2hlbiB0ZXN0cyBhcmUKKyAgcnVuIGJ5IG5vc2V0ZXN0cy4gW2J1Zz0xMjEyNDQ1XQorCis9IDQuMy4xICgyMDEzMDgxNSkgPQorCisqIEZpeGVkIHlldCBhbm90aGVyIHByb2JsZW0gd2l0aCB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyLCBjYXVzZWQgYnkKKyAgaHRtbDVsaWIncyB0ZW5kZW5jeSB0byByZWFycmFuZ2UgdGhlIHRyZWUgZHVyaW5nCisgIHBhcnNpbmcuIFtidWc9MTE4OTI2N10KKworKiBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgb3B0aW1pemVkIHZlcnNpb24gb2YgZmluZF9hbGwoKSB0bworICByZXR1cm4gbm90aGluZy4gW2J1Zz0xMjEyNjU1XQorCis9IDQuMy4wICgyMDEzMDgxMikgPQorCisqIEluc3RlYWQgb2YgY29udmVydGluZyBpbmNvbWluZyBkYXRhIHRvIFVuaWNvZGUgYW5kIGZlZWRpbmcgaXQgdG8gdGhlCisgIGx4bWwgdHJlZSBidWlsZGVyIGluIGNodW5rcywgQmVhdXRpZnVsIFNvdXAgbm93IG1ha2VzIHN1Y2Nlc3NpdmUKKyAgZ3Vlc3NlcyBhdCB0aGUgZW5jb2Rpbmcgb2YgdGhlIGluY29taW5nIGRhdGEsIGFuZCB0ZWxscyBseG1sIHRvCisgIHBhcnNlIHRoZSBkYXRhIGFzIHRoYXQgZW5jb2RpbmcuIEdpdmluZyBseG1sIG1vcmUgY29udHJvbCBvdmVyIHRoZQorICBwYXJzaW5nIHByb2Nlc3MgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIGF2b2lkcyBhIG51bWJlciBvZiBidWdzIGFuZAorICBpc3N1ZXMgd2l0aCB0aGUgbHhtbCBwYXJzZXIgd2hpY2ggaGFkIHByZXZpb3VzbHkgcmVxdWlyZWQgZWxhYm9yYXRlCisgIHdvcmthcm91bmRzOgorCisgIC0gQW4gaXNzdWUgaW4gd2hpY2ggbHhtbCByZWZ1c2VzIHRvIHBhcnNlIFVuaWNvZGUgc3RyaW5ncyBvbiBzb21lCisgICAgc3lzdGVtcy4gW2J1Zz0xMTgwNTI3XQorCisgIC0gQSByZXR1cm5pbmcgYnVnIHRoYXQgdHJ1bmNhdGVkIGRvY3VtZW50cyBsb25nZXIgdGhhbiBhICh2ZXJ5CisgICAgc21hbGwpIHNpemUuIFtidWc9OTYzODgwXQorCisgIC0gQSByZXR1cm5pbmcgYnVnIGluIHdoaWNoIGV4dHJhIHNwYWNlcyB3ZXJlIGFkZGVkIHRvIGEgZG9jdW1lbnQgaWYKKyAgICB0aGUgZG9jdW1lbnQgZGVmaW5lZCBhIGNoYXJzZXQgb3RoZXIgdGhhbiBVVEYtOC4gW2J1Zz05NzI0NjZdCisKKyAgVGhpcyByZXF1aXJlZCBhIG1ham9yIG92ZXJoYXVsIG9mIHRoZSB0cmVlIGJ1aWxkZXIgYXJjaGl0ZWN0dXJlLiBJZgorICB5b3Ugd3JvdGUgeW91ciBvd24gdHJlZSBidWlsZGVyIGFuZCBkaWRuJ3QgdGVsbCBtZSwgeW91J2xsIG5lZWQgdG8KKyAgbW9kaWZ5IHlvdXIgcHJlcGFyZV9tYXJrdXAoKSBtZXRob2QuCisKKyogVGhlIFVuaWNvZGVEYW1taXQgY29kZSB0aGF0IG1ha2VzIGd1ZXNzZXMgYXQgZW5jb2RpbmdzIGhhcyBiZWVuCisgIHNwbGl0IGludG8gaXRzIG93biBjbGFzcywgRW5jb2RpbmdEZXRlY3Rvci4gQSBsb3Qgb2YgYXBwYXJlbnRseQorICByZWR1bmRhbnQgY29kZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gVW5pY29kZSwgRGFtbWl0LCBhbmQgc29tZQorICB1bmRvY3VtZW50ZWQgZmVhdHVyZXMgaGF2ZSBhbHNvIGJlZW4gcmVtb3ZlZC4KKworKiBCZWF1dGlmdWwgU291cCB3aWxsIGlzc3VlIGEgd2FybmluZyBpZiBpbnN0ZWFkIG9mIG1hcmt1cCB5b3UgcGFzcyBpdAorICBhIFVSTCBvciB0aGUgbmFtZSBvZiBhIGZpbGUgb24gZGlzayAoYSBjb21tb24gYmVnaW5uZXIncyBtaXN0YWtlKS4KKworKiBBIG51bWJlciBvZiBvcHRpbWl6YXRpb25zIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBseG1sIHRyZWUKKyAgYnVpbGRlciBieSBhYm91dCAzMyUsIHRoZSBodG1sLnBhcnNlciB0cmVlIGJ1aWxkZXIgYnkgYWJvdXQgMjAlLCBhbmQKKyAgdGhlIGh0bWw1bGliIHRyZWUgYnVpbGRlciBieSBhYm91dCAxNSUuCisKKyogQWxsIGZpbmRfYWxsIGNhbGxzIHNob3VsZCBub3cgcmV0dXJuIGEgUmVzdWx0U2V0IG9iamVjdC4gUGF0Y2ggYnkKKyAgQWFyb24gRGVWb3JlLiBbYnVnPTExOTQwMzRdCisKKz0gNC4yLjEgKDIwMTMwNTMxKSA9CisKKyogVGhlIGRlZmF1bHQgWE1MIGZvcm1hdHRlciB3aWxsIG5vdyByZXBsYWNlIGFtcGVyc2FuZHMgZXZlbiBpZiB0aGV5CisgIGFwcGVhciB0byBiZSBwYXJ0IG9mIGVudGl0aWVzLiBUaGF0IGlzLCAiJmx0OyIgd2lsbCBiZWNvbWUKKyAgIiZhbXA7bHQ7Ii4gVGhlIG9sZCBjb2RlIHdhcyBsZWZ0IG92ZXIgZnJvbSBCZWF1dGlmdWwgU291cCAzLCB3aGljaAorICBkaWRuJ3QgYWx3YXlzIHR1cm4gZW50aXRpZXMgaW50byBVbmljb2RlIGNoYXJhY3RlcnMuCisKKyAgSWYgeW91IHJlYWxseSB3YW50IHRoZSBvbGQgYmVoYXZpb3IgKG1heWJlIGJlY2F1c2UgeW91IGFkZCBuZXcKKyAgc3RyaW5ncyB0byB0aGUgdHJlZSwgdGhvc2Ugc3RyaW5ncyBpbmNsdWRlIGVudGl0aWVzLCBhbmQgeW91IHdhbnQKKyAgdGhlIGZvcm1hdHRlciB0byBsZWF2ZSB0aGVtIGFsb25lIG9uIG91dHB1dCksIGl0IGNhbiBiZSBmb3VuZCBpbgorICBFbnRpdHlTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZV94bWxfY29udGFpbmluZ19lbnRpdGllcygpLiBbYnVnPTExODIxODNdCisKKyogR2F2ZSBuZXdfc3RyaW5nKCkgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIHN1YmNsYXNzZXMgb2YKKyAgTmF2aWdhYmxlU3RyaW5nLiBbYnVnPTExODE5ODZdCisKKyogRml4ZWQgYW5vdGhlciBidWcgYnkgd2hpY2ggdGhlIGh0bWw1bGliIHRyZWUgYnVpbGRlciBjb3VsZCBjcmVhdGUgYQorICBkaXNjb25uZWN0ZWQgdHJlZS4gW2J1Zz0xMTgyMDg5XQorCisqIFRoZSAucHJldmlvdXNfZWxlbWVudCBvZiBhIEJlYXV0aWZ1bFNvdXAgb2JqZWN0IGlzIG5vdyBhbHdheXMgTm9uZSwKKyAgbm90IHRoZSBsYXN0IGVsZW1lbnQgdG8gYmUgcGFyc2VkLiBbYnVnPTExODIwODldCisKKyogRml4ZWQgdGVzdCBmYWlsdXJlcyB3aGVuIGx4bWwgaXMgbm90IGluc3RhbGxlZC4gW2J1Zz0xMTgxNTg5XQorCisqIGh0bWw1bGliIG5vdyBzdXBwb3J0cyBQeXRob24gMy4gRml4ZWQgc29tZSBQeXRob24gMi1zcGVjaWZpYworICBjb2RlIGluIHRoZSBodG1sNWxpYiB0ZXN0IHN1aXRlLiBbYnVnPTExODE2MjRdCisKKyogVGhlIGh0bWwucGFyc2VyIHRyZWVidWlsZGVyIGNhbiBub3cgaGFuZGxlIG51bWVyaWMgYXR0cmlidXRlcyBpbgorICB0ZXh0IHdoZW4gdGhlIGhleGlkZWNpbWFsIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBzdGFydHMgd2l0aCBhCisgIGNhcGl0YWwgWC4gUGF0Y2ggYnkgVGltIFNoaXJsZXkuIFtidWc9MTE4NjI0Ml0KKworPSA0LjIuMCAoMjAxMzA1MTQpID0KKworKiBUaGUgVGFnLnNlbGVjdCgpIG1ldGhvZCBub3cgc3VwcG9ydHMgYSBtdWNoIHdpZGVyIHZhcmlldHkgb2YgQ1NTCisgIHNlbGVjdG9ycy4KKworIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGFkamFjZW50IHNpYmxpbmcgY29tYmluYXRvciAoKykgYW5kIHRoZQorICAgZ2VuZXJhbCBzaWJsaW5nIGNvbWJpbmF0b3IgKH4pLiBUZXN0cyBieSAibGlxdWlkZXIiLiBbYnVnPTEwODIxNDRdCisKKyAtIFRoZSBjb21iaW5hdG9ycyAoPiwgKywgYW5kIH4pIGNhbiBub3cgY29tYmluZSB3aXRoIGFueSBzdXBwb3J0ZWQKKyAgIHNlbGVjdG9yLCBub3QganVzdCBvbmUgdGhhdCBzZWxlY3RzIGJhc2VkIG9uIHRhZyBuYW1lLgorCisgLSBBZGRlZCBsaW1pdGVkIHN1cHBvcnQgZm9yIHRoZSAibnRoLW9mLXR5cGUiIHBzZXVkby1jbGFzcy4gQ29kZQorICAgYnkgU3ZlbiBTbG9vdHdlZy4gW2J1Zz0xMTA5OTUyXQorCisqIFRoZSBCZWF1dGlmdWxTb3VwIGNsYXNzIGlzIG5vdyBhbGlhc2VkIHRvICJfcyIgYW5kICJfc291cCIsIG1ha2luZworICBpdCBxdWlja2VyIHRvIHR5cGUgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaW4gYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbjoKKworICBmcm9tIGJzNCBpbXBvcnQgX3MKKyAgIG9yCisgIGZyb20gYnM0IGltcG9ydCBfc291cAorCisgIFRoZSBhbGlhcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUsIHNvIGRvbid0IHVzZSB0aGlzIGluIGNvZGUgeW91J3JlCisgIGdvaW5nIHRvIHJ1biBtb3JlIHRoYW4gb25jZS4KKworKiBBZGRlZCB0aGUgJ2RpYWdub3NlJyBzdWJtb2R1bGUsIHdoaWNoIGluY2x1ZGVzIHNldmVyYWwgdXNlZnVsCisgIGZ1bmN0aW9ucyBmb3IgcmVwb3J0aW5nIHByb2JsZW1zIGFuZCBkb2luZyB0ZWNoIHN1cHBvcnQuCisKKyAgLSBkaWFnbm9zZShkYXRhKSB0cmllcyB0aGUgZ2l2ZW4gbWFya3VwIG9uIGV2ZXJ5IGluc3RhbGxlZCBwYXJzZXIsCisgICAgcmVwb3J0aW5nIGV4Y2VwdGlvbnMgYW5kIGRpc3BsYXlpbmcgc3VjY2Vzc2VzLiBJZiBhIHBhcnNlciBpcyBub3QKKyAgICBpbnN0YWxsZWQsIGRpYWdub3NlKCkgbWVudGlvbnMgdGhpcyBmYWN0LgorCisgIC0gbHhtbF90cmFjZShkYXRhLCBodG1sPVRydWUpIHJ1bnMgdGhlIGdpdmVuIG1hcmt1cCB0aHJvdWdoIGx4bWwncworICAgIFhNTCBwYXJzZXIgb3IgSFRNTCBwYXJzZXIsIGFuZCBwcmludHMgb3V0IHRoZSBwYXJzZXIgZXZlbnRzIGFzCisgICAgdGhleSBoYXBwZW4uIFRoaXMgaGVscHMgeW91IHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbgorICAgIHByb2JsZW0gb2NjdXJzIGluIGx4bWwgY29kZSBvciBCZWF1dGlmdWwgU291cCBjb2RlLgorCisgIC0gaHRtbHBhcnNlcl90cmFjZShkYXRhKSBpcyB0aGUgc2FtZSB0aGluZywgYnV0IGZvciBQeXRob24ncworICAgIGJ1aWx0LWluIEhUTUxQYXJzZXIgY2xhc3MuCisKKyogSW4gYW4gSFRNTCBkb2N1bWVudCwgdGhlIGNvbnRlbnRzIG9mIGEgPHNjcmlwdD4gb3IgPHN0eWxlPiB0YWcgd2lsbAorICBubyBsb25nZXIgdW5kZXJnbyBlbnRpdHkgc3Vic3RpdHV0aW9uIGJ5IGRlZmF1bHQuIFhNTCBkb2N1bWVudHMgd29yaworICB0aGUgc2FtZSB3YXkgdGhleSBkaWQgYmVmb3JlLiBbYnVnPTEwODU5NTNdCisKKyogTWV0aG9kcyBsaWtlIGdldF90ZXh0KCkgYW5kIHByb3BlcnRpZXMgbGlrZSAuc3RyaW5ncyBub3cgb25seSBnaXZlCisgIHlvdSBzdHJpbmdzIHRoYXQgYXJlIHZpc2libGUgaW4gdGhlIGRvY3VtZW50LS1ubyBjb21tZW50cyBvcgorICBwcm9jZXNzaW5nIGNvbW1hbmRzLiBbYnVnPTEwNTAxNjRdCisKKyogVGhlIHByZXR0aWZ5KCkgbWV0aG9kIG5vdyBsZWF2ZXMgdGhlIGNvbnRlbnRzIG9mIDxwcmU+IHRhZ3MKKyAgYWxvbmUuIFtidWc9MTA5NTY1NF0KKworKiBGaXggYSBidWcgaW4gdGhlIGh0bWw1bGliIHRyZWVidWlsZGVyIHdoaWNoIHNvbWV0aW1lcyBjcmVhdGVkCisgIGRpc2Nvbm5lY3RlZCB0cmVlcy4gW2J1Zz0xMDM5NTI3XQorCisqIEZpeCBhIGJ1ZyBpbiB0aGUgbHhtbCB0cmVlYnVpbGRlciB3aGljaCBjcmFzaGVkIHdoZW4gYSB0YWcgaW5jbHVkZWQKKyAgYW4gYXR0cmlidXRlIGZyb20gdGhlIHByZWRlZmluZWQgInhtbDoiIG5hbWVzcGFjZS4gW2J1Zz0xMDY1NjE3XQorCisqIEZpeCBhIGJ1ZyBieSB3aGljaCBrZXl3b3JkIGFyZ3VtZW50cyB0byBmaW5kX3BhcmVudCgpIHdlcmUgbm90CisgIGJlaW5nIHBhc3NlZCBvbi4gW2J1Zz0xMTI2NzM0XQorCisqIFN0b3AgYSBjcmFzaCB3aGVuIHVud2lzZWx5IG1lc3Npbmcgd2l0aCBhIHRhZyB0aGF0J3MgYmVlbgorICBkZWNvbXBvc2VkLiBbYnVnPTEwOTc2OTldCisKKyogTm93IHRoYXQgbHhtbCdzIHNlZ2ZhdWx0IG9uIGludmFsaWQgZG9jdHlwZSBoYXMgYmVlbiBmaXhlZCwgZml4ZWQgYQorICBjb3JyZXNwb25kaW5nIHByb2JsZW0gb24gdGhlIEJlYXV0aWZ1bCBTb3VwIGVuZCB0aGF0IHdhcyBwcmV2aW91c2x5CisgIGludmlzaWJsZS4gW2J1Zz05ODQ5MzZdCisKKyogRml4ZWQgYW4gZXhjZXB0aW9uIHdoZW4gYW4gb3ZlcnNwZWNpZmllZCBDU1Mgc2VsZWN0b3IgZGlkbid0IG1hdGNoCisgIGFueXRoaW5nLiBDb2RlIGJ5IFN0ZWZhYW4gTGlwcGVucy4gW2J1Zz0xMTY4MTY3XQorCis9IDQuMS4zICgyMDEyMDgyMCkgPQorCisqIFNraXBwZWQgYSB0ZXN0IHVuZGVyIFB5dGhvbiAyLjYgYW5kIFB5dGhvbiAzLjEgdG8gYXZvaWQgYSBzcHVyaW91cworICB0ZXN0IGZhaWx1cmUgY2F1c2VkIGJ5IHRoZSBsb3VzeSBIVE1MUGFyc2VyIGluIHRob3NlCisgIHZlcnNpb25zLiBbYnVnPTEwMzg1MDNdCisKKyogUmFpc2UgYSBtb3JlIHNwZWNpZmljIGVycm9yIChGZWF0dXJlTm90Rm91bmQpIHdoZW4gYSByZXF1ZXN0ZWQKKyAgcGFyc2VyIG9yIHBhcnNlciBmZWF0dXJlIGlzIG5vdCBpbnN0YWxsZWQuIFJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgaW5zdGVhZCBvZiBWYWx1ZUVycm9yIHdoZW4gdGhlIHVzZXIgY2FsbHMgaW5zZXJ0X2JlZm9yZSgpIG9yCisgIGluc2VydF9hZnRlcigpIG9uIHRoZSBCZWF1dGlmdWxTb3VwIG9iamVjdCBpdHNlbGYuIFBhdGNoIGJ5IEFhcm9uCisgIERldm9yZS4gW2J1Zz0xMDM4MzAxXQorCis9IDQuMS4yICgyMDEyMDgxNykgPQorCisqIEFzIHBlciBQRVAtOCwgYWxsb3cgc2VhcmNoaW5nIGJ5IENTUyBjbGFzcyB1c2luZyB0aGUgJ2NsYXNzXycKKyAga2V5d29yZCBhcmd1bWVudC4gW2J1Zz0xMDM3NjI0XQorCisqIERpc3BsYXkgbmFtZXNwYWNlIHByZWZpeGVzIGZvciBuYW1lc3BhY2VkIGF0dHJpYnV0ZSBuYW1lcywgaW5zdGVhZCBvZgorICB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWVzIGdpdmVuIGJ5IHRoZSBseG1sIHBhcnNlci4gW2J1Zz0xMDM3NTk3XQorCisqIEZpeGVkIGEgY3Jhc2ggb24gZW5jb2Rpbmcgd2hlbiBhbiBhdHRyaWJ1dGUgbmFtZSBjb250YWluZWQKKyAgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCisKKyogV2hlbiBzbmlmZmluZyBlbmNvZGluZ3MsIGlmIHRoZSBjY2hhcmRldCBsaWJyYXJ5IGlzIGluc3RhbGxlZCwKKyAgQmVhdXRpZnVsIFNvdXAgdXNlcyBpdCBpbnN0ZWFkIG9mIGNoYXJkZXQuIGNjaGFyZGV0IGlzIG11Y2gKKyAgZmFzdGVyLiBbYnVnPTEwMjA3NDhdCisKKyogVXNlIGxvZ2dpbmcud2FybmluZygpIGluc3RlYWQgb2Ygd2FybmluZy53YXJuKCkgdG8gbm90aWZ5IHRoZSB1c2VyCisgIHRoYXQgY2hhcmFjdGVycyB3ZXJlIHJlcGxhY2VkIHdpdGggUkVQTEFDRU1FTlQKKyAgQ0hBUkFDVEVSLiBbYnVnPTEwMTM4NjJdCisKKz0gNC4xLjEgKDIwMTIwNzAzKSA9CisKKyogRml4ZWQgYW4gaHRtbDVsaWIgdHJlZSBidWlsZGVyIGNyYXNoIHdoaWNoIGhhcHBlbmVkIHdoZW4gaHRtbDVsaWIKKyAgbW92ZWQgYSB0YWcgd2l0aCBhIG11bHRpdmFsdWVkIGF0dHJpYnV0ZSBmcm9tIG9uZSBwYXJ0IG9mIHRoZSB0cmVlCisgIHRvIGFub3RoZXIuIFtidWc9MTAxOTYwM10KKworKiBDb3JyZWN0bHkgZGlzcGxheSBjbG9zaW5nIHRhZ3Mgd2l0aCBhbiBYTUwgbmFtZXNwYWNlIGRlY2xhcmVkLiBQYXRjaAorICBieSBBbmRyZWFzIEtvc3R5cmthLiBbYnVnPTEwMTk2MzVdCisKKyogRml4ZWQgYSB0eXBvIHRoYXQgbWFkZSBwYXJzaW5nIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gaXQgc2hvdWxkCisgIGhhdmUgYmVlbiwgYW5kIGFsc28gd2FpdGVkIHRvbyBsb25nIHRvIGNsb3NlIHRhZ3Mgd2l0aCBYTUwKKyAgbmFtZXNwYWNlcy4gW2J1Zz0xMDIwMjY4XQorCisqIGdldF90ZXh0KCkgbm93IHJldHVybnMgYW4gZW1wdHkgVW5pY29kZSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gdGV4dCwKKyAgcmF0aGVyIHRoYW4gYW4gZW1wdHkgYnl0ZXN0cmluZy4gW2J1Zz0xMDIwMzg3XQorCis9IDQuMS4wICgyMDEyMDUyOSkgPQorCisqIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBmaXhpbmcgV2luZG93cy0xMjUyIGNoYXJhY3RlcnMKKyAgZW1iZWRkZWQgaW4gVVRGLTggZG9jdW1lbnRzLiAoVW5pY29kZURhbW1pdC5kZXR3aW5nbGUoKSkKKworKiBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgJnF1b3Q7IHdpdGggdGhlIGJ1aWx0LWluIHBhcnNlci4gW2J1Zz05OTM4NzFdCisKKyogQ29tbWVudHMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9ucywgYW5kCisgIG1hcmt1cCBkZWNsYXJhdGlvbnMgYXJlIG5vdyB0cmVhdGVkIGFzIHByZWZvcm1hdHRlZCBzdHJpbmdzLCB0aGUgd2F5CisgIENEYXRhIGJsb2NrcyBhcmUuIFtidWc9MTAwMTAyNV0KKworKiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSBseG1sIHRyZWVidWlsZGVyIHRoYXQgcHJldmVudGVkIHRoZSB1c2VyIGZyb20KKyAgYWRkaW5nIGF0dHJpYnV0ZXMgdG8gYSB0YWcgdGhhdCBkaWRuJ3Qgb3JpZ2luYWxseSBoYXZlCisgIGF0dHJpYnV0ZXMuIFtidWc9MTAwMjM3OF0gVGhhbmtzIHRvIE9saXZlciBCZWF0dGllIGZvciB0aGUgcGF0Y2guCisKKyogRml4ZWQgc29tZSBlZGdlLWNhc2UgYnVncyBoYXZpbmcgdG8gZG8gd2l0aCBpbnNlcnRpbmcgYW4gZWxlbWVudAorICBpbnRvIGEgdGFnIGl0J3MgYWxyZWFkeSBpbnNpZGUsIGFuZCByZXBsYWNpbmcgb25lIG9mIGEgdGFnJ3MKKyAgY2hpbGRyZW4gd2l0aCBhbm90aGVyLiBbYnVnPTk5NzUyOV0KKworKiBBZGRlZCB0aGUgYWJpbGl0eSB0byBzZWFyY2ggZm9yIGF0dHJpYnV0ZSB2YWx1ZXMgc3BlY2lmaWVkIGluIFVURi04LiBbYnVnPTEwMDM5NzRdCisKKyAgVGhpcyBjYXVzZWQgYSBtYWpvciByZWZhY3RvcmluZyBvZiB0aGUgc2VhcmNoIGNvZGUuIEFsbCB0aGUgdGVzdHMKKyAgcGFzcywgYnV0IGl0J3MgcG9zc2libGUgdGhhdCBzb21lIHNlYXJjaGVzIHdpbGwgYmVoYXZlIGRpZmZlcmVudGx5LgorCis9IDQuMC41ICgyMDEyMDQyNykgPQorCisqIEFkZGVkIGEgbmV3IG1ldGhvZCwgd3JhcCgpLCB3aGljaCB3cmFwcyBhbiBlbGVtZW50IGluIGEgdGFnLgorCisqIFJlbmFtZWQgcmVwbGFjZV93aXRoX2NoaWxkcmVuKCkgdG8gdW53cmFwKCksIHdoaWNoIGlzIGVhc2llciB0bworICB1bmRlcnN0YW5kIGFuZCBhbHNvIHRoZSBqUXVlcnkgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCisKKyogTWFkZSBlbmNvZGluZyBzdWJzdGl0dXRpb24gaW4gPG1ldGE+IHRhZ3MgY29tcGxldGVseSB0cmFuc3BhcmVudCAobm8KKyAgbW9yZSAlU09VUC1FTkNPRElORyUpLgorCisqIEZpeGVkIGEgYnVnIGluIGRlY29kaW5nIGRhdGEgdGhhdCBjb250YWluZWQgYSBieXRlLW9yZGVyIG1hcmssIHN1Y2gKKyAgYXMgZGF0YSBlbmNvZGVkIGluIFVURi0xNkxFLiBbYnVnPTk4ODk4MF0KKworKiBGaXhlZCBhIGJ1ZyB0aGF0IG1hZGUgdGhlIEhUTUxQYXJzZXIgdHJlZWJ1aWxkZXIgZ2VuZXJhdGUgWE1MCisgIGRlZmluaXRpb25zIGVuZGluZyB3aXRoIHR3byBxdWVzdGlvbiBtYXJrcyBpbnN0ZWFkIG9mCisgIG9uZS4gW2J1Zz05ODQyNThdCisKKyogVXBvbiBkb2N1bWVudCBnZW5lcmF0aW9uLCBDRGF0YSBvYmplY3RzIGFyZSBubyBsb25nZXIgcnVuIHRocm91Z2gKKyAgdGhlIGZvcm1hdHRlci4gW2J1Zz05ODg5MDVdCisKKyogVGhlIHRlc3Qgc3VpdGUgbm93IHBhc3NlcyB3aGVuIGx4bWwgaXMgbm90IGluc3RhbGxlZCwgd2hldGhlciBvciBub3QKKyAgaHRtbDVsaWIgaXMgaW5zdGFsbGVkLiBbYnVnPTk4NzAwNF0KKworKiBQcmludCBhIHdhcm5pbmcgb24gSFRNTFBhcnNlRXJyb3JzIHRvIGxldCBwZW9wbGUga25vdyB0aGV5IHNob3VsZAorICBpbnN0YWxsIGEgYmV0dGVyIHBhcnNlciBsaWJyYXJ5LgorCis9IDQuMC40ICgyMDEyMDQxNikgPQorCisqIEZpeGVkIGEgYnVnIHRoYXQgc29tZXRpbWVzIGNyZWF0ZWQgZGlzY29ubmVjdGVkIHRyZWVzLgorCisqIEZpeGVkIGEgYnVnIHdpdGggdGhlIHN0cmluZyBzZXR0ZXIgdGhhdCBtb3ZlZCBhIHN0cmluZyBhcm91bmQgdGhlCisgIHRyZWUgaW5zdGVhZCBvZiBjb3B5aW5nIGl0LiBbYnVnPTk4MzA1MF0KKworKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBub3cgcnVuIHRocm91Z2ggdGhlIHByb3ZpZGVkIG91dHB1dCBmb3JtYXR0ZXIuCisgIFByZXZpb3VzbHkgdGhleSB3ZXJlIGFsd2F5cyBydW4gdGhyb3VnaCB0aGUgJ21pbmltYWwnIGZvcm1hdHRlci4gSW4KKyAgdGhlIGZ1dHVyZSBJIG1heSBtYWtlIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgZGlmZmVyZW50IGZvcm1hdHRlcnMKKyAgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIHN0cmluZ3MsIGJ1dCBmb3Igbm93LCBjb25zaXN0ZW50IGJlaGF2aW9yCisgIGlzIGJldHRlciB0aGFuIGluY29uc2lzdGVudCBiZWhhdmlvci4gW2J1Zz05ODAyMzddCisKKyogQWRkZWQgdGhlIG1pc3NpbmcgcmVuZGVyQ29udGVudHMgbWV0aG9kIGZyb20gQmVhdXRpZnVsIFNvdXAgMy4gQWxzbworICBhZGRlZCBhbiBlbmNvZGVfY29udGVudHMoKSBtZXRob2QgdG8gZ28gYWxvbmcgd2l0aCBkZWNvZGVfY29udGVudHMoKS4KKworKiBHaXZlIGEgbW9yZSB1c2VmdWwgZXJyb3Igd2hlbiB0aGUgdXNlciB0cmllcyB0byBydW4gdGhlIFB5dGhvbiAyCisgIHZlcnNpb24gb2YgQlMgdW5kZXIgUHl0aG9uIDMuCisKKyogVW5pY29kZURhbW1pdCBjYW4gbm93IGNvbnZlcnQgTWljcm9zb2Z0IHNtYXJ0IHF1b3RlcyB0byBBU0NJSSB3aXRoCisgIFVuaWNvZGVEYW1taXQobWFya3VwLCBzbWFydF9xdW90ZXNfdG89ImFzY2lpIikuCisKKz0gNC4wLjMgKDIwMTIwNDAzKSA9CisKKyogRml4ZWQgYSB0eXBvIHRoYXQgY2F1c2VkIHNvbWUgdmVyc2lvbnMgb2YgUHl0aG9uIDMgdG8gY29udmVydCB0aGUKKyAgQmVhdXRpZnVsIFNvdXAgY29kZWJhc2UgaW5jb3JyZWN0bHkuCisKKyogR290IHJpZCBvZiB0aGUgNC4wLjIgd29ya2Fyb3VuZCBmb3IgSFRNTCBkb2N1bWVudHMtLWl0IHdhcworICB1bm5lY2Vzc2FyeSBhbmQgdGhlIHdvcmthcm91bmQgd2FzIHRyaWdnZXJpbmcgYSAocG9zc2libHkgZGlmZmVyZW50LAorICBidXQgcmVsYXRlZCkgYnVnIGluIGx4bWwuIFtidWc9OTcyNDY2XQorCis9IDQuMC4yICgyMDEyMDMyNikgPQorCisqIFdvcmtlZCBhcm91bmQgYSBwb3NzaWJsZSBidWcgaW4gbHhtbCB0aGF0IHByZXZlbnRzIG5vbi10aW55IFhNTAorICBkb2N1bWVudHMgZnJvbSBiZWluZyBwYXJzZWQuIFtidWc9OTYzODgwLCBidWc9OTYzOTM2XQorCisqIEZpeGVkIGEgYnVnIHdoZXJlIHNwZWNpZnlpbmcgYHRleHRgIHdoaWxlIGFsc28gc2VhcmNoaW5nIGZvciBhIHRhZworICBvbmx5IHdvcmtlZCBpZiBgdGV4dGAgd2FudGVkIGFuIGV4YWN0IHN0cmluZyBtYXRjaC4gW2J1Zz05NTU5NDJdCisKKz0gNC4wLjEgKDIwMTIwMzE0KSA9CisKKyogVGhpcyBpcyB0aGUgZmlyc3Qgb2ZmaWNpYWwgcmVsZWFzZSBvZiBCZWF1dGlmdWwgU291cCA0LiBUaGVyZSBpcyBubworICA0LjAuMCByZWxlYXNlLCB0byBlbGltaW5hdGUgYW55IHBvc3NpYmlsaXR5IHRoYXQgcGFja2FnaW5nIHNvZnR3YXJlCisgIG1pZ2h0IHRyZWF0ICI0LjAuMCIgYXMgYmVpbmcgYW4gZWFybGllciB2ZXJzaW9uIHRoYW4gIjQuMC4wYjEwIi4KKworKiBCcm91Z2h0IEJTIHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2Ygc291cHNlbGVjdCwgYWRkaW5nCisgIENTUyBzZWxlY3RvciBzdXBwb3J0IGZvciBkaXJlY3QgZGVzY2VuZGFudCBtYXRjaGVzIGFuZCBtdWx0aXBsZSBDU1MKKyAgY2xhc3MgbWF0Y2hlcy4KKworPSA0LjAuMGIxMCAoMjAxMjAzMDIpID0KKworKiBBZGRlZCBzdXBwb3J0IGZvciBzaW1wbGUgQ1NTIHNlbGVjdG9ycywgdGFrZW4gZnJvbSB0aGUgc291cHNlbGVjdCBwcm9qZWN0LgorCisqIEZpeGVkIGEgY3Jhc2ggd2hlbiB1c2luZyBodG1sNWxpYi4gW2J1Zz05NDMyNDZdCisKKyogSW4gSFRNTDUtc3R5bGUgPG1ldGEgY2hhcnNldD0iZm9vIj4gdGFncywgdGhlIHZhbHVlIG9mIHRoZSAiY2hhcnNldCIKKyAgYXR0cmlidXRlIGlzIG5vdyByZXBsYWNlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbmNvZGluZyBvbgorICBvdXRwdXQuIFtidWc9OTQyNzE0XQorCisqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGNhbGxpbmcgYSB0YWcgdG8gc29tZXRpbWVzIGNhbGwgZmluZF9hbGwoKQorICB3aXRoIHRoZSB3cm9uZyBhcmd1bWVudHMuIFtidWc9OTQ0NDI2XQorCisqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnJvdWdodCBiYWNrIHRoZSBCZWF1dGlmdWxTdG9uZVNvdXAKKyAgY2xhc3MgYXMgYSBkZXByZWNhdGVkIHdyYXBwZXIgYXJvdW5kIEJlYXV0aWZ1bFNvdXAuCisKKz0gNC4wLjBiOSAoMjAxMjAyMjgpID0KKworKiBGaXhlZCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIERPQ1RZUEVzIHRoYXQgaGF2ZSBib3RoIGEgcHVibGljCisgIElEIGFuZCBhIHN5c3RlbSBJRC4KKworKiBGaXhlZCB0aGUgZ2VuZXJhdGVkIFhNTCBkZWNsYXJhdGlvbi4KKworKiBSZW5hbWVkIFRhZy5uc3ByZWZpeCB0byBUYWcucHJlZml4LCBmb3IgY29uc2lzdGVuY3kgd2l0aAorICBOYW1lc3BhY2VkQXR0cmlidXRlLgorCisqIEZpeGVkIGEgdGVzdCBmYWlsdXJlIHRoYXQgb2NjdXJlZCBvbiBQeXRob24gMy54IHdoZW4gY2hhcmRldCB3YXMKKyAgaW5zdGFsbGVkLgorCisqIE1hZGUgcHJldHRpZnkoKSByZXR1cm4gVW5pY29kZSBieSBkZWZhdWx0LCBzbyBpdCB3aWxsIGxvb2sgbmljZSBvbgorICBQeXRob24gMyB3aGVuIHBhc3NlZCBpbnRvIHByaW50KCkuCisKKz0gNC4wLjBiOCAoMjAxMjAyMjQpID0KKworKiBBbGwgdHJlZSBidWlsZGVycyBub3cgcHJlc2VydmUgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGluIHRoZQorICBkb2N1bWVudHMgdGhleSBwYXJzZS4gSWYgeW91IHVzZSB0aGUgaHRtbDVsaWIgcGFyc2VyIG9yIGx4bWwncyBYTUwKKyAgcGFyc2VyLCB5b3UgY2FuIGFjY2VzcyB0aGUgbmFtZXNwYWNlIFVSTCBmb3IgYSB0YWcgYXMgdGFnLm5hbWVzcGFjZS4KKworICBIb3dldmVyLCB0aGVyZSBpcyBubyBzcGVjaWFsIHN1cHBvcnQgZm9yIG5hbWVzcGFjZS1vcmllbnRlZAorICBzZWFyY2hpbmcgb3IgdHJlZSBtYW5pcHVsYXRpb24uIFdoZW4geW91IHNlYXJjaCB0aGUgdHJlZSwgeW91IG5lZWQKKyAgdG8gdXNlIG5hbWVzcGFjZSBwcmVmaXhlcyBleGFjdGx5IGFzIHRoZXkncmUgdXNlZCBpbiB0aGUgb3JpZ2luYWwKKyAgZG9jdW1lbnQuCisKKyogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERPQ1RZUEUgYWx3YXlzIGVuZHMgaW4gYSBuZXdsaW5lLgorCisqIElzc3VlIGEgd2FybmluZyBpZiB0aGUgdXNlciB0cmllcyB0byB1c2UgYSBTb3VwU3RyYWluZXIgaW4KKyAgY29uanVuY3Rpb24gd2l0aCB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQKKyAgdGhlbS4KKworPSA0LjAuMGI3ICgyMDEyMDIyMykgPQorCisqIFVwb24gZGVjb2RpbmcgdG8gc3RyaW5nLCBhbnkgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIHJlcHJlc2VudGVkIGluCisgIHlvdXIgY2hvc2VuIGVuY29kaW5nIHdpbGwgYmUgY29udmVydGVkIGludG8gbnVtZXJpYyBYTUwgZW50aXR5CisgIHJlZmVyZW5jZXMuCisKKyogSXNzdWUgYSB3YXJuaW5nIGlmIGNoYXJhY3RlcnMgd2VyZSByZXBsYWNlZCB3aXRoIFJFUExBQ0VNRU5UCisgIENIQVJBQ1RFUiBkdXJpbmcgVW5pY29kZSBjb252ZXJzaW9uLgorCisqIFJlc3RvcmVkIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi42LgorCisqIFRoZSBpbnN0YWxsIHByb2Nlc3Mgbm8gbG9uZ2VyIGluc3RhbGxzIGRvY3Mgb3IgYXV4aWxsYXJ5IHRleHQgZmlsZXMuCisKKyogSXQncyBub3cgcG9zc2libGUgdG8gZGVlcGNvcHkgYSBCZWF1dGlmdWxTb3VwIG9iamVjdCBjcmVhdGVkIHdpdGgKKyAgUHl0aG9uJ3MgYnVpbHQtaW4gSFRNTCBwYXJzZXIuCisKKyogQWJvdXQgMTAwIHVuaXQgdGVzdHMgdGhhdCAidGVzdCIgdGhlIGJlaGF2aW9yIG9mIHZhcmlvdXMgcGFyc2VycyBvbgorICBpbnZhbGlkIG1hcmt1cCBoYXZlIGJlZW4gcmVtb3ZlZC4gTGVnaXRpbWF0ZSBjaGFuZ2VzIHRvIHRob3NlCisgIHBhcnNlcnMgY2F1c2VkIHRoZXNlIHRlc3RzIHRvIGZhaWwsIGluZGljYXRpbmcgdGhhdCBwZXJoYXBzCisgIEJlYXV0aWZ1bCBTb3VwIHNob3VsZCBub3QgdGVzdCB0aGUgYmVoYXZpb3Igb2YgZm9yZWlnbgorICBsaWJyYXJpZXMuCisKKyAgVGhlIHByb2JsZW1hdGljIHVuaXQgdGVzdHMgaGF2ZSBiZWVuIHJlZm9ybXVsYXRlZCBhcyBpbmZvcm1hdGlvbmFsCisgIGNvbXBhcmlzb25zIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0CisgIHNjcmlwdHMvZGVtb25zdHJhdGVfcGFyc2VyX2RpZmZlcmVuY2VzLnB5LgorCisgIFRoaXMgbWFrZXMgQmVhdXRpZnVsIFNvdXAgY29tcGF0aWJsZSB3aXRoIGh0bWw1bGliIHZlcnNpb24gMC45NSBhbmQKKyAgZnV0dXJlIHZlcnNpb25zIG9mIEhUTUxQYXJzZXIuCisKKz0gNC4wLjBiNiAoMjAxMjAyMTYpID0KKworKiBNdWx0aS12YWx1ZWQgYXR0cmlidXRlcyBsaWtlICJjbGFzcyIgYWx3YXlzIGhhdmUgYSBsaXN0IG9mIHZhbHVlcywKKyAgZXZlbiBpZiB0aGVyZSdzIG9ubHkgb25lIHZhbHVlIGluIHRoZSBsaXN0LgorCisqIEFkZGVkIGEgbnVtYmVyIG9mIG11bHRpLXZhbHVlZCBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gSFRNTDUuCisKKyogU3RvcHBlZCBnZW5lcmF0aW5nIGEgc3BhY2UgYmVmb3JlIHRoZSBzbGFzaCB0aGF0IGNsb3NlcyBhbgorICBlbXB0eS1lbGVtZW50IHRhZy4gVGhpcyBtYXkgY29tZSBiYWNrIGlmIEkgYWRkIGEgc3BlY2lhbCBYSFRNTCBtb2RlCisgIChodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvI0NfMiksIGJ1dCByaWdodCBub3cgaXQncyBwcmV0dHkKKyAgdXNlbGVzcy4KKworKiBQYXNzaW5nIHRleHQgYWxvbmcgd2l0aCB0YWctc3BlY2lmaWMgYXJndW1lbnRzIHRvIGEgZmluZCogbWV0aG9kOgorCisgICBmaW5kKCJhIiwgdGV4dD0iQ2xpY2sgaGVyZSIpCisKKyAgd2lsbCBmaW5kIHRhZ3MgdGhhdCBjb250YWluIHRoZSBnaXZlbiB0ZXh0IGFzIHRoZWlyCisgIC5zdHJpbmcuIFByZXZpb3VzbHksIHRoZSB0YWctc3BlY2lmaWMgYXJndW1lbnRzIHdlcmUgaWdub3JlZCBhbmQKKyAgb25seSBzdHJpbmdzIHdlcmUgc2VhcmNoZWQuCisKKyogRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgdGhlIGh0bWw1bGliIHRyZWUgYnVpbGRlciB0byBidWlsZCBhCisgIHBhcnRpYWxseSBkaXNjb25uZWN0ZWQgdHJlZS4gR2VuZXJhbGx5IGNsZWFuZWQgdXAgdGhlIGh0bWw1bGliIHRyZWUKKyAgYnVpbGRlci4KKworKiBJZiB5b3UgcmVzdHJpY3QgYSBtdWx0aS12YWx1ZWQgYXR0cmlidXRlIGxpa2UgImNsYXNzIiB0byBhIHN0cmluZworICB0aGF0IGNvbnRhaW5zIHNwYWNlcywgQmVhdXRpZnVsIFNvdXAgd2lsbCBvbmx5IGNvbnNpZGVyIGl0IGEgbWF0Y2gKKyAgaWYgdGhlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoYXQgc3BlY2lmaWMgc3RyaW5nLgorCis9IDQuMC4wYjUgKDIwMTIwMjA5KSA9CisKKyogUmF0aW9uYWxpemVkIEJlYXV0aWZ1bCBTb3VwJ3MgdHJlYXRtZW50IG9mIENTUyBjbGFzcy4gQSB0YWcKKyAgYmVsb25naW5nIHRvIG11bHRpcGxlIENTUyBjbGFzc2VzIGlzIHRyZWF0ZWQgYXMgaGF2aW5nIGEgbGlzdCBvZgorICB2YWx1ZXMgZm9yIHRoZSAnY2xhc3MnIGF0dHJpYnV0ZS4gU2VhcmNoaW5nIGZvciBhIENTUyBjbGFzcyB3aWxsCisgIG1hdGNoICphbnkqIG9mIHRoZSBDU1MgY2xhc3Nlcy4KKworICBUaGlzIGFjdHVhbGx5IGFmZmVjdHMgYWxsIGF0dHJpYnV0ZXMgdGhhdCB0aGUgSFRNTCBzdGFuZGFyZCBkZWZpbmVzCisgIGFzIHRha2luZyBtdWx0aXBsZSB2YWx1ZXMgKGNsYXNzLCByZWwsIHJldiwgYXJjaGl2ZSwgYWNjZXB0LWNoYXJzZXQsCisgIGFuZCBoZWFkZXJzKSwgYnV0ICdjbGFzcycgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbi4gW2J1Zz00MTAzNF0KKworKiBJZiB5b3UgcGFzcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgZGljdGlvbmFyeSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50CisgIHRvIG9uZSBvZiB0aGUgZmluZCogbWV0aG9kcywgaXQnbGwgYXNzdW1lIHlvdSB3YW50IHRvIHVzZSB0aGF0CisgIG9iamVjdCB0byBzZWFyY2ggYWdhaW5zdCBhIHRhZydzIENTUyBjbGFzc2VzLiBQcmV2aW91c2x5IHRoaXMgb25seQorICB3b3JrZWQgaWYgeW91IHBhc3NlZCBpbiBhIHN0cmluZy4KKworKiBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBhIGNyYXNoIHdoZW4geW91IHBhc3NlZCBhIGRpY3Rpb25hcnkgYXMgYW4KKyAgYXR0cmlidXRlIHZhbHVlIChwb3NzaWJseSBiZWNhdXNlIHlvdSBtaXN0eXBlZCAiYXR0cnMiKS4gW2J1Zz04NDI0MTldCisKKyogVW5pY29kZSwgRGFtbWl0IG5vdyBkZXRlY3RzIHRoZSBlbmNvZGluZyBpbiBIVE1MIDUtc3R5bGUgPG1ldGE+IHRhZ3MKKyAgbGlrZSA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4uIFtidWc9ODM3MjY4XQorCisqIElmIFVuaWNvZGUsIERhbW1pdCBjYW4ndCBmaWd1cmUgb3V0IGEgY29uc2lzdGVudCBlbmNvZGluZyBmb3IgYQorICBwYWdlLCBpdCB3aWxsIHRyeSBlYWNoIG9mIGl0cyBndWVzc2VzIGFnYWluLCB3aXRoIGVycm9ycz0icmVwbGFjZSIKKyAgaW5zdGVhZCBvZiBlcnJvcnM9InN0cmljdCIuIFRoaXMgbWF5IG1lYW4gdGhhdCBzb21lIGRhdGEgZ2V0cworICByZXBsYWNlZCB3aXRoIFJFUExBQ0VNRU5UIENIQVJBQ1RFUiwgYnV0IGF0IGxlYXN0IG1vc3Qgb2YgaXQgd2lsbAorICBnZXQgdHVybmVkIGludG8gVW5pY29kZS4gW2J1Zz03NTQ5MDNdCisKKyogUGF0Y2hlZCBvdmVyIGEgYnVnIGluIGh0bWw1bGliICg/KSB0aGF0IHdhcyBjcmFzaGluZyBCZWF1dGlmdWwgU291cAorICBvbiBjZXJ0YWluIGtpbmRzIG9mIG1hcmt1cC4gW2J1Zz04Mzg4MDBdCisKKyogRml4ZWQgYSBidWcgdGhhdCB3cmVja2VkIHRoZSB0cmVlIGlmIHlvdSByZXBsYWNlZCBhbiBlbGVtZW50IHdpdGggYW4KKyAgZW1wdHkgc3RyaW5nLiBbYnVnPTcyODY5N10KKworKiBJbXByb3ZlZCBVbmljb2RlLCBEYW1taXQncyBiZWhhdmlvciB3aGVuIHlvdSBnaXZlIGl0IFVuaWNvZGUgdG8KKyAgYmVnaW4gd2l0aC4KKworPSA0LjAuMGI0ICgyMDEyMDIwOCkgPQorCisqIEFkZGVkIEJlYXV0aWZ1bFNvdXAubmV3X3N0cmluZygpIHRvIGdvIGFsb25nIHdpdGggQmVhdXRpZnVsU291cC5uZXdfdGFnKCkKKworKiBCZWF1dGlmdWxTb3VwLm5ld190YWcoKSB3aWxsIGZvbGxvdyB0aGUgcnVsZXMgb2Ygd2hhdGV2ZXIKKyAgdHJlZS1idWlsZGVyIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgb3JpZ2luYWwgQmVhdXRpZnVsU291cCBvYmplY3QuIEEKKyAgbmV3IDxwPiB0YWcgd2lsbCBsb29rIGxpa2UgIjxwIC8+IiBpZiB0aGUgc291cCBvYmplY3Qgd2FzIGNyZWF0ZWQgdG8KKyAgcGFyc2UgWE1MLCBidXQgaXQgd2lsbCBsb29rIGxpa2UgIjxwPjwvcD4iIGlmIHRoZSBzb3VwIG9iamVjdCB3YXMKKyAgY3JlYXRlZCB0byBwYXJzZSBIVE1MLgorCisqIFdlIHBhc3MgaW4gc3RyaWN0PUZhbHNlIHRvIGh0bWwucGFyc2VyIG9uIFB5dGhvbiAzLCBncmVhdGx5CisgIGltcHJvdmluZyBodG1sLnBhcnNlcidzIGFiaWxpdHkgdG8gaGFuZGxlIGJhZCBIVE1MLgorCisqIFdlIGFsc28gbW9ua2V5cGF0Y2ggYSBzZXJpb3VzIGJ1ZyBpbiBodG1sLnBhcnNlciB0aGF0IG1hZGUKKyAgc3RyaWN0PUZhbHNlIGRpc2FzdHJvdXMgb24gUHl0aG9uIDMuMi4yLgorCisqIFJlcGxhY2VkIHRoZSAic3Vic3RpdHV0ZV9odG1sX2VudGl0aWVzIiBhcmd1bWVudCB3aXRoIHRoZQorICBtb3JlIGdlbmVyYWwgImZvcm1hdHRlciIgYXJndW1lbnQuCisKKyogQmFyZSBhbXBlcnNhbmRzIGFuZCBhbmdsZSBicmFja2V0cyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB0byBYTUwKKyAgZW50aXRpZXMgdW5sZXNzIHRoZSB1c2VyIHByZXZlbnRzIGl0LgorCisqIEFkZGVkIFBhZ2VFbGVtZW50Lmluc2VydF9iZWZvcmUoKSBhbmQgUGFnZUVsZW1lbnQuaW5zZXJ0X2FmdGVyKCksCisgIHdoaWNoIGxldCB5b3UgcHV0IGFuIGVsZW1lbnQgaW50byB0aGUgcGFyc2UgdHJlZSB3aXRoIHJlc3BlY3QgdG8KKyAgc29tZSBvdGhlciBlbGVtZW50LgorCisqIFJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBub25zZW5zaWNhbAorICBsaWtlIGluc2VydCBhIHRhZyBpbnRvIGl0c2VsZi4KKworCis9IDQuMC4wYjMgKDIwMTIwMjAzKSA9CisKK0JlYXV0aWZ1bCBTb3VwIDQgaXMgYSBuZWFybHktY29tcGxldGUgcmV3cml0ZSB0aGF0IHJlbW92ZXMgQmVhdXRpZnVsCitTb3VwJ3MgY3VzdG9tIEhUTUwgcGFyc2VyIGluIGZhdm9yIG9mIGEgc3lzdGVtIHRoYXQgbGV0cyB5b3Ugd3JpdGUgYQorbGl0dGxlIGdsdWUgY29kZSBhbmQgcGx1ZyBpbiBhbnkgSFRNTCBvciBYTUwgcGFyc2VyIHlvdSB3YW50LgorCitCZWF1dGlmdWwgU291cCA0LjAgY29tZXMgd2l0aCBnbHVlIGNvZGUgZm9yIGZvdXIgcGFyc2VyczoKKworICogUHl0aG9uJ3Mgc3RhbmRhcmQgSFRNTFBhcnNlciAoaHRtbC5wYXJzZXIgaW4gUHl0aG9uIDMpCisgKiBseG1sJ3MgSFRNTCBhbmQgWE1MIHBhcnNlcnMKKyAqIGh0bWw1bGliJ3MgSFRNTCBwYXJzZXIKKworSFRNTFBhcnNlciBpcyB0aGUgZGVmYXVsdCwgYnV0IEkgcmVjb21tZW5kIHlvdSBpbnN0YWxsIGx4bWwgaWYgeW91CitjYW4uCisKK0ZvciBjb21wbGV0ZSBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIFNwaGlueCBkb2N1bWVudGF0aW9uIGluCiticzQvZG9jL3NvdXJjZS8uIFdoYXQgZm9sbG93cyBpcyBhIHN1bW1hcnkgb2YgdGhlIGNoYW5nZXMgZnJvbQorQmVhdXRpZnVsIFNvdXAgMy4KKworPT09IFRoZSBtb2R1bGUgbmFtZSBoYXMgY2hhbmdlZCA9PT0KKworUHJldmlvdXNseSB5b3UgaW1wb3J0ZWQgdGhlIEJlYXV0aWZ1bFNvdXAgY2xhc3MgZnJvbSBhIG1vZHVsZSBhbHNvCitjYWxsZWQgQmVhdXRpZnVsU291cC4gVG8gc2F2ZSBrZXlzdHJva2VzIGFuZCBtYWtlIGl0IGNsZWFyIHdoaWNoCit2ZXJzaW9uIG9mIHRoZSBBUEkgaXMgaW4gdXNlLCB0aGUgbW9kdWxlIGlzIG5vdyBjYWxsZWQgJ2JzNCc6CisKKyAgICA+Pj4gZnJvbSBiczQgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKKworPT09IEl0IHdvcmtzIHdpdGggUHl0aG9uIDMgPT09CisKK0JlYXV0aWZ1bCBTb3VwIDMuMS4wIHdvcmtlZCB3aXRoIFB5dGhvbiAzLCBidXQgdGhlIHBhcnNlciBpdCB1c2VkIHdhcworc28gYmFkIHRoYXQgaXQgYmFyZWx5IHdvcmtlZCBhdCBhbGwuIEJlYXV0aWZ1bCBTb3VwIDQgd29ya3Mgd2l0aAorUHl0aG9uIDMsIGFuZCBzaW5jZSBpdHMgcGFyc2VyIGlzIHBsdWdnYWJsZSwgeW91IGRvbid0IHNhY3JpZmljZQorcXVhbGl0eS4KKworU3BlY2lhbCB0aGFua3MgdG8gVGhvbWFzIEtsdXl2ZXIgYW5kIEV6aW8gTWVsb3R0aSBmb3IgZ2V0dGluZyBQeXRob24gMworc3VwcG9ydCB0byB0aGUgZmluaXNoIGxpbmUuIEV6aW8gTWVsb3R0aSBpcyBhbHNvIHRvIHRoYW5rIGZvciBncmVhdGx5CitpbXByb3ZpbmcgdGhlIEhUTUwgcGFyc2VyIHRoYXQgY29tZXMgd2l0aCBQeXRob24gMy4yLgorCis9PT0gQ0RBVEEgc2VjdGlvbnMgYXJlIG5vcm1hbCB0ZXh0LCBpZiB0aGV5J3JlIHVuZGVyc3Rvb2QgYXQgYWxsLiA9PT0KKworQ3VycmVudGx5LCB0aGUgbHhtbCBhbmQgaHRtbDVsaWIgSFRNTCBwYXJzZXJzIGlnbm9yZSBDREFUQSBzZWN0aW9ucyBpbgorbWFya3VwOgorCisgPHA+PCFbQ0RBVEFbZm9vXV0+PC9wPiA9PiA8cD48L3A+CisKK0EgZnV0dXJlIHZlcnNpb24gb2YgaHRtbDVsaWIgd2lsbCB0dXJuIENEQVRBIHNlY3Rpb25zIGludG8gdGV4dCBub2RlcywKK2J1dCBvbmx5IHdpdGhpbiB0YWdzIGxpa2UgPHN2Zz4gYW5kIDxtYXRoPjoKKworIDxzdmc+PCFbQ0RBVEFbZm9vXV0+PC9zdmc+ID0+IDxwPmZvbzwvcD4KKworVGhlIGRlZmF1bHQgWE1MIHBhcnNlciAod2hpY2ggdXNlcyBseG1sIGJlaGluZCB0aGUgc2NlbmVzKSB0dXJucyBDREFUQQorc2VjdGlvbnMgaW50byBvcmRpbmFyeSB0ZXh0IGVsZW1lbnRzOgorCisgPHA+PCFbQ0RBVEFbZm9vXV0+PC9wPiA9PiA8cD5mb288L3A+CisKK0luIHRoZW9yeSBpdCdzIHBvc3NpYmxlIHRvIHByZXNlcnZlIHRoZSBDREFUQSBzZWN0aW9ucyB3aGVuIHVzaW5nIHRoZQorWE1MIHBhcnNlciwgYnV0IEkgZG9uJ3Qgc2VlIGhvdyB0byBnZXQgaXQgdG8gd29yayBpbiBwcmFjdGljZS4KKworPT09IE1pc2NlbGxhbmVvdXMgb3RoZXIgc3R1ZmYgPT09CisKK0lmIHRoZSBCZWF1dGlmdWxTb3VwIGluc3RhbmNlIGhhcyAuaXNfeG1sIHNldCB0byBUcnVlLCBhbiBhcHByb3ByaWF0ZQorWE1MIGRlY2xhcmF0aW9uIHdpbGwgYmUgZW1pdHRlZCB3aGVuIHRoZSB0cmVlIGlzIHRyYW5zZm9ybWVkIGludG8gYQorc3RyaW5nOgorCisgICAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPgorICAgIDxtYXJrdXA+CisgICAgIC4uLgorICAgIDwvbWFya3VwPgorCitUaGUgWydseG1sJywgJ3htbCddIHRyZWUgYnVpbGRlciBzZXRzIC5pc194bWwgdG8gVHJ1ZTsgdGhlIG90aGVyIHRyZWUKK2J1aWxkZXJzIHNldCBpdCB0byBGYWxzZS4gSWYgeW91IHdhbnQgdG8gcGFyc2UgWEhUTUwgd2l0aCBhbiBIVE1MCitwYXJzZXIsIHlvdSBjYW4gc2V0IGl0IG1hbnVhbGx5LgorCisKKz0gMy4yLjAgPQorCitUaGUgMy4xIHNlcmllcyB3YXNuJ3QgdmVyeSB1c2VmdWwsIHNvIEkgcmVuYW1lZCB0aGUgMy4wIHNlcmllcyB0byAzLjIKK3RvIG1ha2UgaXQgb2J2aW91cyB3aGljaCBvbmUgeW91IHNob3VsZCB1c2UuCisKKz0gMy4xLjAgPQorCitBIGh5YnJpZCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgMi40IGFuZCBjYW4gYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQKK3RvIHJ1biB1bmRlciBQeXRob24gMy4wLiBUaGVyZSBhcmUgdGhyZWUgYmFja3dhcmRzLWluY29tcGF0aWJsZQorY2hhbmdlcyB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mLCBidXQgbm8gbmV3IGZlYXR1cmVzIG9yIGRlbGliZXJhdGUKK2JlaGF2aW9yIGNoYW5nZXMuCisKKzEuIHN0cigpIG1heSBubyBsb25nZXIgZG8gd2hhdCB5b3Ugd2FudC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBtZWFuaW5nCitvZiBzdHIoKSBpbnZlcnRzIGJldHdlZW4gUHl0aG9uIDIgYW5kIDM7IGluIFB5dGhvbiAyIGl0IGdpdmVzIHlvdSBhCitieXRlIHN0cmluZywgaW4gUHl0aG9uIDMgaXQgZ2l2ZXMgeW91IGEgVW5pY29kZSBzdHJpbmcuCisKK1RoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHlvdSBjYW4ndCBwYXNzIGFuIGVuY29kaW5nIHRvIC5fX3N0cl9fCithbnltb3JlLiBVc2UgZW5jb2RlKCkgdG8gZ2V0IGEgc3RyaW5nIGFuZCBkZWNvZGUoKSB0byBnZXQgVW5pY29kZSwgYW5kCit5b3UnbGwgYmUgcmVhZHkgKHdlbGwsIHJlYWRpZXIpIGZvciBQeXRob24gMy4KKworMi4gQmVhdXRpZnVsIFNvdXAgaXMgbm93IGJhc2VkIG9uIEhUTUxQYXJzZXIgcmF0aGVyIHRoYW4gU0dNTFBhcnNlciwKK3doaWNoIGlzIGdvbmUgaW4gUHl0aG9uIDMuIFRoZXJlJ3Mgc29tZSBiYWQgSFRNTCB0aGF0IFNHTUxQYXJzZXIKK2hhbmRsZWQgYnV0IEhUTUxQYXJzZXIgZG9lc24ndCwgdXN1YWxseSB0byBkbyB3aXRoIGF0dHJpYnV0ZSB2YWx1ZXMKK3RoYXQgYXJlbid0IGNsb3NlZCBvciBoYXZlIGJyYWNrZXRzIGluc2lkZSB0aGVtOgorCisgIDxhIGhyZWY9ImZvbzwvYT4sIDwvYT48YSBocmVmPSJiYXIiPmJhejwvYT4KKyAgPGEgYj0iPGE+Ij4nLCAnPGEgYj0iJmx0O2EmZ3Q7Ij48L2E+PGE+Ij48L2E+CisKK0EgbGF0ZXIgdmVyc2lvbiBvZiBCZWF1dGlmdWwgU291cCB3aWxsIGFsbG93IHlvdSB0byBwbHVnIGluIGRpZmZlcmVudAorcGFyc2VycyB0byBtYWtlIHRyYWRlb2ZmcyBiZXR3ZWVuIHNwZWVkIGFuZCB0aGUgYWJpbGl0eSB0byBoYW5kbGUgYmFkCitIVE1MLgorCiszLiBJbiBQeXRob24gMyAoYnV0IG5vdCBQeXRob24gMiksIEhUTUxQYXJzZXIgY29udmVydHMgZW50aXRpZXMgd2l0aGluCithdHRyaWJ1dGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgY2hhcmFjdGVycy4gSW4gUHl0aG9uIDIgaXQncworcG9zc2libGUgdG8gcGFyc2UgdGhpcyBzdHJpbmcgYW5kIGxlYXZlIHRoZSAmZWFjdXRlOyBpbnRhY3QuCisKKyA8YSBocmVmPSJodHRwOi8vY3J1bW15LmNvbT9zYWNyJmVhY3V0ZTsmYmxldSI+CisKK0luIFB5dGhvbiAzLCB0aGUgJmVhY3V0ZTsgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byBceGU5IGR1cmluZworcGFyc2luZy4KKworCis9IDMuMC43YSA9CisKK0FkZGVkIGFuIGltcG9ydCB0aGF0IG1ha2VzIEJTIHdvcmsgaW4gUHl0aG9uIDIuMy4KKworCis9IDMuMC43ID0KKworRml4ZWQgYSBVbmljb2RlRGVjb2RlRXJyb3Igd2hlbiB1bnBpY2tsaW5nIGRvY3VtZW50cyB0aGF0IGNvbnRhaW4KK25vbi1BU0NJSSBjaGFyYWN0ZXJzLgorCitGaXhlZCBhIFR5cGVFcnJvciB0aGF0IG9jY3VyZWQgaW4gc29tZSBjaXJjdW1zdGFuY2VzIHdoZW4gYSB0YWcKK2NvbnRhaW5lZCBubyB0ZXh0LgorCitKdW1wIHRocm91Z2ggaG9vcHMgdG8gYXZvaWQgdGhlIHVzZSBvZiBjaGFyZGV0LCB3aGljaCBjYW4gYmUgZXh0cmVtZWx5CitzbG93IGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4gVVRGLTggZG9jdW1lbnRzIHNob3VsZCBuZXZlciB0cmlnZ2VyIHRoZQordXNlIG9mIGNoYXJkZXQuCisKK1doaXRlc3BhY2UgaXMgcHJlc2VydmVkIGluc2lkZSA8cHJlPiBhbmQgPHRleHRhcmVhPiB0YWdzIHRoYXQgY29udGFpbgorbm90aGluZyBidXQgd2hpdGVzcGFjZS4KKworQmVhdXRpZnVsIFNvdXAgY2FuIG5vdyBwYXJzZSBhIGRvY3R5cGUgdGhhdCdzIHNjb3BlZCB0byBhbiBYTUwgbmFtZXNwYWNlLgorCisKKz0gMy4wLjYgPQorCitHb3QgcmlkIG9mIGEgdmVyeSBvbGQgZGVidWcgbGluZSB0aGF0IHByZXZlbnRlZCBjaGFyZGV0IGZyb20gd29ya2luZy4KKworQWRkZWQgYSBUYWcuZGVjb21wb3NlKCkgbWV0aG9kIHRoYXQgY29tcGxldGVseSBkaXNjb25uZWN0cyBhIHRyZWUgb3IgYQorc3Vic2V0IG9mIGEgdHJlZSwgYnJlYWtpbmcgaXQgdXAgaW50byBiaXRlLXNpemVkIHBpZWNlcyB0aGF0IGFyZQorZWFzeSBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdGVyIHRvIGNvbGxlY3QuCisKK1RhZy5leHRyYWN0KCkgbm93IHJldHVybnMgdGhlIHRhZyB0aGF0IHdhcyBleHRyYWN0ZWQuCisKK1RhZy5maW5kTmV4dCgpIG5vdyBkb2VzIHNvbWV0aGluZyB3aXRoIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyB5b3UgcGFzcworaXQgaW5zdGVhZCBvZiBkcm9wcGluZyB0aGVtIG9uIHRoZSBmbG9vci4KKworRml4ZWQgYSBVbmljb2RlIGNvbnZlcnNpb24gYnVnLgorCitGaXhlZCBhIGJ1ZyB0aGF0IGdhcmJsZWQgc29tZSA8bWV0YT4gdGFncyB3aGVuIHJld3JpdGluZyB0aGVtLgorCisKKz0gMy4wLjUgPQorCitTb3VwIG9iamVjdHMgY2FuIG5vdyBiZSBwaWNrbGVkLCBhbmQgY29waWVkIHdpdGggY29weS5kZWVwY29weS4KKworVGFnLmFwcGVuZCBub3cgd29ya3MgcHJvcGVybHkgb24gZXhpc3RpbmcgQlMgb2JqZWN0cy4gKEl0IHdhc24ndAorb3JpZ2luYWxseSBpbnRlbmRlZCBmb3Igb3V0c2lkZSB1c2UsIGJ1dCBpdCBjYW4gYmUgbm93LikgKEdpbGVzCitSYWRmb3JkKQorCitQYXNzaW5nIGluIGEgbm9uZXhpc3RlbnQgZW5jb2Rpbmcgd2lsbCBubyBsb25nZXIgY3Jhc2ggdGhlIHBhcnNlciBvbgorUHl0aG9uIDIuNCAoSm9obiBOYWdsZSkuCisKK0ZpeGVkIGFuIHVuZGVybHlpbmcgYnVnIGluIFNHTUxQYXJzZXIgdGhhdCB0aGlua3MgQVNDSUkgaGFzIDI1NQorY2hhcmFjdGVycyBpbnN0ZWFkIG9mIDEyNyAoSm9obiBOYWdsZSkuCisKK0VudGl0aWVzIGFyZSBjb252ZXJ0ZWQgbW9yZSBjb25zaXN0ZW50bHkgdG8gVW5pY29kZSBjaGFyYWN0ZXJzLgorCitFbnRpdHkgcmVmZXJlbmNlcyBpbiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBub3cgY29udmVydGVkIHRvIFVuaWNvZGUKK2NoYXJhY3RlcnMgd2hlbiBhcHByb3ByaWF0ZS4gTnVtZXJpYyBlbnRpdGllcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCwKK2JlY2F1c2UgU0dNTFBhcnNlciBhbHdheXMgY29udmVydHMgdGhlbSBvdXRzaWRlIG9mIGF0dHJpYnV0ZSB2YWx1ZXMuCisKK0FMTF9FTlRJVElFUyBoYXBwZW5zIHRvIGp1c3QgYmUgdGhlIFhIVE1MIGVudGl0aWVzLCBzbyBJIHJlbmFtZWQgaXQgdG8KK1hIVE1MX0VOVElUSUVTLgorCitUaGUgcmVndWxhciBleHByZXNzaW9uIGZvciBiYXJlIGFtcGVyc2FuZHMgd2FzIHRvbyBsb29zZS4gSW4gc29tZQorY2FzZXMgYW1wZXJzYW5kcyB3ZXJlIG5vdCBiZWluZyBlc2NhcGVkLiAoU2FtIFJ1Ynk/KQorCitOb24tYnJlYWtpbmcgc3BhY2VzIGFuZCBvdGhlciBzcGVjaWFsIFVuaWNvZGUgc3BhY2UgY2hhcmFjdGVycyBhcmUgbm8KK2xvbmdlciBmb2xkZWQgdG8gQVNDSUkgc3BhY2VzLiAoUm9iZXJ0IExlZnR3aWNoKQorCitJbmZvcm1hdGlvbiBpbnNpZGUgYSBURVhUQVJFQSB0YWcgaXMgbm93IHBhcnNlZCBsaXRlcmFsbHksIG5vdCBhcyBIVE1MCit0YWdzLiBURVhUQVJFQSBub3cgd29ya3MgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgU0NSSVBULiAoWmVwaHlyIEZhbmcpCisKKz0gMy4wLjQgPQorCitGaXhlZCBhIGJ1ZyB0aGF0IGNyYXNoZWQgVW5pY29kZSBjb252ZXJzaW9uIGluIHNvbWUgY2FzZXMuCisKK0ZpeGVkIGEgYnVnIHRoYXQgcHJldmVudGVkIFVuaWNvZGVEYW1taXQgZnJvbSBiZWluZyB1c2VkIGFzIGEKK2dlbmVyYWwtcHVycG9zZSBkYXRhIHNjcnViYmVyLgorCitGaXhlZCBzb21lIHVuaXQgdGVzdCBmYWlsdXJlcyB3aGVuIHJ1bm5pbmcgYWdhaW5zdCBQeXRob24gMi41LgorCitXaGVuIGNvbnNpZGVyaW5nIHdoZXRoZXIgdG8gY29udmVydCBzbWFydCBxdW90ZXMsIFVuaWNvZGVEYW1taXQgbm93Citsb29rcyBhdCB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIHdheS4KKworPSAzLjAuMyAoMjAwNjA2MDYpID0KKworQmVhdXRpZnVsIFNvdXAgaXMgbm93IHVzYWJsZSBhcyBhIHdheSB0byBjbGVhbiB1cCBpbnZhbGlkIFhNTC9IVE1MIChiZQorc3VyZSB0byBwYXNzIGluIGFuIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBjb252ZXJ0RW50aXRpZXMsIG9yIFhNTC9IVE1MCitlbnRpdGllcyBtaWdodCBzdGljayBhcm91bmQgdGhhdCBhcmVuJ3QgdmFsaWQgaW4gSFRNTC9YTUwpLiBUaGUgcmVzdWx0CittYXkgbm90IHZhbGlkYXRlLCBidXQgaXQgc2hvdWxkIGJlIGdvb2QgZW5vdWdoIHRvIG5vdCBjaG9rZSBhCityZWFsLXdvcmxkIFhNTCBwYXJzZXIuIFNwZWNpZmljYWxseSwgdGhlIG91dHB1dCBvZiBhIHByb3Blcmx5Citjb25zdHJ1Y3RlZCBzb3VwIG9iamVjdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkIGFzIHBhcnQgb2YgYW4gWE1MCitkb2N1bWVudCwgYnV0IHBhcnRzIG1heSBiZSBtaXNzaW5nIGlmIHRoZXkgd2VyZSBtaXNzaW5nIGluIHRoZQorb3JpZ2luYWwuIEFzIGFsd2F5cywgaWYgdGhlIGlucHV0IGlzIHZhbGlkIFhNTCwgdGhlIG91dHB1dCB3aWxsIGFsc28KK2JlIHZhbGlkLgorCis9IDMuMC4yICgyMDA2MDYwMikgPQorCitQcmV2aW91c2x5LCBCZWF1dGlmdWwgU291cCBjb3JyZWN0bHkgaGFuZGxlZCBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQKK2NvbnRhaW5lZCBlbWJlZGRlZCBxdW90ZXMgKHNvbWV0aW1lcyBieSBlc2NhcGluZyksIGJ1dCBub3Qgb3RoZXIga2luZHMKK29mIFhNTCBjaGFyYWN0ZXIuIE5vdywgaXQgY29ycmVjdGx5IGhhbmRsZXMgb3IgZXNjYXBlcyBhbGwgc3BlY2lhbCBYTUwKK2NoYXJhY3RlcnMgaW4gYXR0cmlidXRlIHZhbHVlcy4KKworSSBhbGlhc2VkIG1ldGhvZHMgdG8gdGhlIDIueCBuYW1lcyAoZmV0Y2gsIGZpbmQsIGZpbmRUZXh0LCBldGMuKSBmb3IKK2JhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLiBUaG9zZSBuYW1lcyBhcmUgZGVwcmVjYXRlZCBhbmQgaWYgSQorZXZlciBkbyBhIDQuMCBJIHdpbGwgcmVtb3ZlIHRoZW0uIEkgd2lsbCwgSSB0ZWxsIHlvdSEKKworRml4ZWQgYSBidWcgd2hlcmUgdGhlIGZpbmRBbGwgbWV0aG9kIHdhc24ndCBwYXNzaW5nIGFsb25nIGFueSBrZXl3b3JkCithcmd1bWVudHMuCisKK1doZW4gcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgQmVhdXRpZnVsIFNvdXAgbm93IGFjdHMgYXMgYW4gSFRNTAorcHJldHR5LXByaW50ZXIsIG5vdCBhbiBYTUwgcHJldHR5LXByaW50ZXIuCisKKz0gMy4wLjEgKDIwMDYwNTMwKSA9CisKK1JlaW50cm9kdWNlZCB0aGUgImZldGNoIGJ5IENTUyBjbGFzcyIgc2hvcnRjdXQuIEkgdGhvdWdodCBrZXl3b3JkCithcmd1bWVudHMgd291bGQgcmVwbGFjZSBpdCwgYnV0IHRoZXkgZG9uJ3QuIFlvdSBjYW4ndCBjYWxsIHNvdXAoJ2EnLAorY2xhc3M9J2ZvbycpIGJlY2F1c2UgY2xhc3MgaXMgYSBQeXRob24ga2V5d29yZC4KKworSWYgQmVhdXRpZnVsIFNvdXAgZW5jb3VudGVycyBhIG1ldGEgdGFnIHRoYXQgZGVjbGFyZXMgdGhlIGVuY29kaW5nLAorYnV0IGEgU291cFN0cmFpbmVyIHRlbGxzIGl0IG5vdCB0byBwYXJzZSB0aGF0IHRhZywgQmVhdXRpZnVsIFNvdXAgd2lsbAorbm8gbG9uZ2VyIHRyeSB0byByZXdyaXRlIHRoZSBtZXRhIHRhZyB0byBtZW50aW9uIHRoZSBuZXcKK2VuY29kaW5nLiBCYXNpY2FsbHksIHRoaXMgbWFrZXMgU291cFN0cmFpbmVycyB3b3JrIGluIHJlYWwtd29ybGQKK2FwcGxpY2F0aW9ucyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHRoZSBwYXJzZXIuCisKKz0gMy4wLjAgIldobyB3b3VsZCBub3QgZ2l2ZSBhbGwgZWxzZSBmb3IgdHdvIHAiICgyMDA2MDUyOCkgPQorCitUaGlzIHJlbGVhc2UgaXMgbm90IGJhY2t3YXJkLWNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyByZWxlYXNlcy4gSWYKK3lvdSd2ZSBnb3QgY29kZSB3cml0dGVuIHdpdGggYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCBnbworYWhlYWQgYW5kIGtlZXAgdXNpbmcgaXQsIHVubGVzcyBvbmUgb2YgdGhlIGZlYXR1cmVzIG1lbnRpb25lZCBoZXJlCityZWFsbHkgbWFrZXMgeW91ciBsaWZlIGVhc2llci4gU2luY2UgdGhlIGxpYnJhcnkgaXMgc2VsZi1jb250YWluZWQsCit5b3UgY2FuIGluY2x1ZGUgYW4gb2xkIGNvcHkgb2YgdGhlIGxpYnJhcnkgaW4geW91ciBvbGQgYXBwbGljYXRpb25zLAorYW5kIHVzZSB0aGUgbmV3IHZlcnNpb24gZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKworVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gcmV3cml0dGVuIGFuZCBncmVhdGx5IGV4cGFuZGVkIHdpdGggbWFueQorbW9yZSBleGFtcGxlcy4KKworQmVhdXRpZnVsIFNvdXAgYXV0b2RldGVjdHMgdGhlIGVuY29kaW5nIG9mIGEgZG9jdW1lbnQgKG9yIHVzZXMgdGhlIG9uZQoreW91IHNwZWNpZnkpLCBhbmQgY29udmVydHMgaXQgZnJvbSBpdHMgbmF0aXZlIGVuY29kaW5nIHRvCitVbmljb2RlLiBJbnRlcm5hbGx5LCBpdCBvbmx5IGRlYWxzIHdpdGggVW5pY29kZSBzdHJpbmdzLiBXaGVuIHlvdQorcHJpbnQgb3V0IHRoZSBkb2N1bWVudCwgaXQgY29udmVydHMgdG8gVVRGLTggKG9yIGFub3RoZXIgZW5jb2RpbmcgeW91CitzcGVjaWZ5KS4gW0RvYyByZWZlcmVuY2VdCisKK0l0J3Mgbm93IGVhc3kgdG8gbWFrZSBsYXJnZS1zY2FsZSBjaGFuZ2VzIHRvIHRoZSBwYXJzZSB0cmVlIHdpdGhvdXQKK3NjcmV3aW5nIHVwIHRoZSBuYXZpZ2F0aW9uIG1lbWJlcnMuIFRoZSBtZXRob2RzIGFyZSBleHRyYWN0LAorcmVwbGFjZVdpdGgsIGFuZCBpbnNlcnQuIFtEb2MgcmVmZXJlbmNlLiBTZWUgYWxzbyBJbXByb3ZpbmcgTWVtb3J5CitVc2FnZSB3aXRoIGV4dHJhY3RdCisKK1Bhc3NpbmcgVHJ1ZSBpbiBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUgZ2l2ZXMgeW91IHRhZ3MgdGhhdCBoYXZlIGFueQordmFsdWUgZm9yIHRoYXQgYXR0cmlidXRlLiBZb3UgZG9uJ3QgaGF2ZSB0byBjcmVhdGUgYSByZWd1bGFyCitleHByZXNzaW9uLiBQYXNzaW5nIE5vbmUgZm9yIGFuIGF0dHJpYnV0ZSB2YWx1ZSBnaXZlcyB5b3UgdGFncyB0aGF0Citkb24ndCBoYXZlIHRoYXQgYXR0cmlidXRlIGF0IGFsbC4KKworVGFnIG9iamVjdHMgbm93IGtub3cgd2hldGhlciBvciBub3QgdGhleSdyZSBzZWxmLWNsb3NpbmcuIFRoaXMgYXZvaWRzCit0aGUgcHJvYmxlbSB3aGVyZSBCZWF1dGlmdWwgU291cCB0aG91Z2h0IHRoYXQgdGFncyBsaWtlIDxCUiAvPiB3ZXJlCitzZWxmLWNsb3NpbmcgZXZlbiBpbiBYTUwgZG9jdW1lbnRzLiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgc2VsZi1jbG9zaW5nCit0YWdzIGZvciBhIHBhcnNlciBvYmplY3QgYnkgcGFzc2luZyB0aGVtIGluIGFzIGEgbGlzdCBvZgorc2VsZkNsb3NpbmdUYWdzOiB5b3UgZG9uJ3QgaGF2ZSB0byBzdWJjbGFzcyBhbnltb3JlLgorCitUaGVyZSdzIGEgbmV3IGJ1aWx0LWluIHBhcnNlciwgTWluaW1hbFNvdXAsIHdoaWNoIGhhcyBtb3N0IG9mCitCZWF1dGlmdWxTb3VwJ3MgSFRNTC1zcGVjaWZpYyBydWxlcywgYnV0IG5vIHRhZyBuZXN0aW5nIHJ1bGVzLiBbRG9jCityZWZlcmVuY2VdCisKK1lvdSBjYW4gdXNlIGEgU291cFN0cmFpbmVyIHRvIHRlbGwgQmVhdXRpZnVsIFNvdXAgdG8gcGFyc2Ugb25seSBwYXJ0CitvZiBhIGRvY3VtZW50LiBUaGlzIHNhdmVzIHRpbWUgYW5kIG1lbW9yeSwgb2Z0ZW4gbWFraW5nIEJlYXV0aWZ1bCBTb3VwCithYm91dCBhcyBmYXN0IGFzIGEgY3VzdG9tLWJ1aWx0IFNHTUxQYXJzZXIgc3ViY2xhc3MuIFtEb2MgcmVmZXJlbmNlLAorU291cFN0cmFpbmVyIHJlZmVyZW5jZV0KKworWW91IGNhbiAodXN1YWxseSkgdXNlIGtleXdvcmQgYXJndW1lbnRzIGluc3RlYWQgb2YgcGFzc2luZyBhCitkaWN0aW9uYXJ5IG9mIGF0dHJpYnV0ZXMgdG8gYSBzZWFyY2ggbWV0aG9kLiBUaGF0IGlzLCB5b3UgY2FuIHJlcGxhY2UKK3NvdXAoYXJncz17ImlkIiA6ICI1In0pIHdpdGggc291cChpZD0iNSIpLiBZb3UgY2FuIHN0aWxsIHVzZSBhcmdzIGlmCisoZm9yIGluc3RhbmNlKSB5b3UgbmVlZCB0byBmaW5kIGFuIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGNsYXNoZXMgd2l0aAordGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gZmluZEFsbC4gW0RvYyByZWZlcmVuY2U6ICoqa3dhcmdzIGF0dHJzXQorCitUaGUgbWV0aG9kIG5hbWVzIGhhdmUgY2hhbmdlZCB0byB0aGUgYmV0dGVyIG1ldGhvZCBuYW1lcyB1c2VkIGluCitSdWJ5ZnVsIFNvdXAuIEluc3RlYWQgb2YgZmluZCBtZXRob2RzIGFuZCBmZXRjaCBtZXRob2RzLCB0aGVyZSBhcmUKK29ubHkgZmluZCBtZXRob2RzLiBJbnN0ZWFkIG9mIGEgc2NoZW1lIHdoZXJlIHlvdSBjYW4ndCByZW1lbWJlciB3aGljaAorbWV0aG9kIGZpbmRzIG9uZSBlbGVtZW50IGFuZCB3aGljaCBvbmUgZmluZHMgdGhlbSBhbGwsIHdlIGhhdmUgZmluZAorYW5kIGZpbmRBbGwuIEluIGdlbmVyYWwsIGlmIHRoZSBtZXRob2QgbmFtZSBtZW50aW9ucyBBbGwgb3IgYSBwbHVyYWwKK25vdW4gKGVnLiBmaW5kTmV4dFNpYmxpbmdzKSwgdGhlbiBpdCBmaW5kcyBtYW55IGVsZW1lbnRzCittZXRob2QuIE90aGVyd2lzZSwgaXQgb25seSBmaW5kcyBvbmUgZWxlbWVudC4gW0RvYyByZWZlcmVuY2VdCisKK1NvbWUgb2YgdGhlIGFyZ3VtZW50IG5hbWVzIGhhdmUgYmVlbiByZW5hbWVkIGZvciBjbGFyaXR5LiBGb3IgaW5zdGFuY2UKK2F2b2lkUGFyc2VyUHJvYmxlbXMgaXMgbm93IHBhcnNlck1hc3NhZ2UuCisKK0JlYXV0aWZ1bCBTb3VwIG5vIGxvbmdlciBpbXBsZW1lbnRzIGEgZmVlZCBtZXRob2QuIFlvdSBuZWVkIHRvIHBhc3MgYQorc3RyaW5nIG9yIGEgZmlsZWhhbmRsZSBpbnRvIHRoZSBzb3VwIGNvbnN0cnVjdG9yLCBub3Qgd2l0aCBmZWVkIGFmdGVyCit0aGUgc291cCBoYXMgYmVlbiBjcmVhdGVkLiBUaGVyZSBpcyBzdGlsbCBhIGZlZWQgbWV0aG9kLCBidXQgaXQncyB0aGUKK2ZlZWQgbWV0aG9kIGltcGxlbWVudGVkIGJ5IFNHTUxQYXJzZXIgYW5kIGNhbGxpbmcgaXQgd2lsbCBieXBhc3MKK0JlYXV0aWZ1bCBTb3VwIGFuZCBjYXVzZSBwcm9ibGVtcy4KKworVGhlIE5hdmlnYWJsZVRleHQgY2xhc3MgaGFzIGJlZW4gcmVuYW1lZCB0byBOYXZpZ2FibGVTdHJpbmcuIFRoZXJlIGlzCitubyBOYXZpZ2FibGVVbmljb2RlU3RyaW5nIGFueW1vcmUsIGJlY2F1c2UgZXZlcnkgc3RyaW5nIGluc2lkZSBhCitCZWF1dGlmdWwgU291cCBwYXJzZSB0cmVlIGlzIGEgVW5pY29kZSBzdHJpbmcuCisKK2ZpbmRUZXh0IGFuZCBmZXRjaFRleHQgYXJlIGdvbmUuIEp1c3QgcGFzcyBhIHRleHQgYXJndW1lbnQgaW50byBmaW5kCitvciBmaW5kQWxsLgorCitOdWxsIHdhcyBtb3JlIHRyb3VibGUgdGhhbiBpdCB3YXMgd29ydGgsIHNvIEkgZ290IHJpZCBvZiBpdC4gQW55dGhpbmcKK3RoYXQgdXNlZCB0byByZXR1cm4gTnVsbCBub3cgcmV0dXJucyBOb25lLgorCitTcGVjaWFsIFhNTCBjb25zdHJ1Y3RzIGxpa2UgY29tbWVudHMgYW5kIENEQVRBIG5vdyBoYXZlIHRoZWlyIG93bgorTmF2aWdhYmxlU3RyaW5nIHN1YmNsYXNzZXMsIGluc3RlYWQgb2YgYmVpbmcgdHJlYXRlZCBhcyBvZGRseS1mb3JtZWQKK2RhdGEuIElmIHlvdSBwYXJzZSBhIGRvY3VtZW50IHRoYXQgY29udGFpbnMgQ0RBVEEgYW5kIHdyaXRlIGl0IGJhY2sKK291dCwgdGhlIENEQVRBIHdpbGwgc3RpbGwgYmUgdGhlcmUuCisKK1doZW4geW91J3JlIHBhcnNpbmcgYSBkb2N1bWVudCwgeW91IGNhbiBnZXQgQmVhdXRpZnVsIFNvdXAgdG8gY29udmVydAorWE1MIG9yIEhUTUwgZW50aXRpZXMgaW50byB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlIGNoYXJhY3RlcnMuIFtEb2MKK3JlZmVyZW5jZV0KKworPSAyLjEuMSAoMjAwNTA5MTgpID0KKworRml4ZWQgYSBzZXJpb3VzIHBlcmZvcm1hbmNlIGJ1ZyBpbiBCZWF1dGlmdWxTdG9uZVNvdXAgd2hpY2ggd2FzCitjYXVzaW5nIHBhcnNpbmcgdG8gYmUgaW5jcmVkaWJseSBzbG93LgorCitDb3JyZWN0ZWQgc2V2ZXJhbCBlbnRpdGllcyB0aGF0IHdlcmUgcHJldmlvdXNseSBiZWluZyBpbmNvcnJlY3RseQordHJhbnNsYXRlZCBmcm9tIE1pY3Jvc29mdCBzbWFydC1xdW90ZS1saWtlIGNoYXJhY3RlcnMuCisKK0ZpeGVkIGEgYnVnIHRoYXQgd2FzIGJyZWFraW5nIHRleHQgZmV0Y2guCisKK0ZpeGVkIGEgYnVnIHRoYXQgY3Jhc2hlZCB0aGUgcGFyc2VyIHdoZW4gdGV4dCBjaHVua3MgdGhhdCBsb29rIGxpa2UKK0hUTUwgdGFnIG5hbWVzIHNob3dlZCB1cCB3aXRoaW4gYSBTQ1JJUFQgdGFnLgorCitUSEVBRCwgVEJPRFksIGFuZCBURk9PVCB0YWdzIGFyZSBub3cgbmVzdGFibGUgd2l0aGluIFRBQkxFCit0YWdzLiBOZXN0ZWQgdGFibGVzIHNob3VsZCBwYXJzZSBtb3JlIHNlbnNpYmx5IG5vdy4KKworQkFTRSBpcyBub3cgY29uc2lkZXJlZCBhIHNlbGYtY2xvc2luZyB0YWcuCisKKz0gMi4xLjAgIkdhbWUsIG9yIGFueSBvdGhlciBkaXNoPyIgKDIwMDUwNTA0KSA9CisKK0FkZGVkIGEgd2lkZSB2YXJpZXR5IG9mIG5ldyBzZWFyY2ggbWV0aG9kcyB3aGljaCwgZ2l2ZW4gYSBzdGFydGluZworcG9pbnQgaW5zaWRlIHRoZSB0cmVlLCBmb2xsb3cgYSBwYXJ0aWN1bGFyIG5hdmlnYXRpb24gbWVtYmVyIChsaWtlCituZXh0U2libGluZykgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgbG9va2luZyBmb3IgVGFnIGFuZCBOYXZpZ2FibGVUZXh0CitvYmplY3RzIHRoYXQgbWF0Y2ggY2VydGFpbiBjcml0ZXJpYS4gVGhlIG5ldyBtZXRob2RzIGFyZSBmaW5kTmV4dCwKK2ZldGNoTmV4dCwgZmluZFByZXZpb3VzLCBmZXRjaFByZXZpb3VzLCBmaW5kTmV4dFNpYmxpbmcsCitmZXRjaE5leHRTaWJsaW5ncywgZmluZFByZXZpb3VzU2libGluZywgZmV0Y2hQcmV2aW91c1NpYmxpbmdzLAorZmluZFBhcmVudCwgYW5kIGZldGNoUGFyZW50cy4gQWxsIG9mIHRoZXNlIHVzZSB0aGUgc2FtZSBiYXNpYyBjb2RlCit1c2VkIGJ5IGZpcnN0IGFuZCBmZXRjaCwgc28geW91IGNhbiBwYXNzIHlvdXIgd2VpcmQgd2F5cyBvZiBtYXRjaGluZwordGhpbmdzIGludG8gdGhlc2UgbWV0aG9kcy4KKworVGhlIGZldGNoIG1ldGhvZCBhbmQgaXRzIGRlcml2YXRpdmVzIG5vdyBhY2NlcHQgYSBsaW1pdCBhcmd1bWVudC4KKworWW91IGNhbiBub3cgcGFzcyBrZXl3b3JkIGFyZ3VtZW50cyB3aGVuIGNhbGxpbmcgYSBUYWcgb2JqZWN0IGFzIHRob3VnaAoraXQgd2VyZSBhIG1ldGhvZC4KKworRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgYWxsIGhhbmQtY3JlYXRlZCB0YWdzIHRvIHNoYXJlIGEgc2luZ2xlIHNldCBvZgorYXR0cmlidXRlcy4KKworPSAyLjAuMyAoMjAwNTA1MDEpID0KKworRml4ZWQgUHl0aG9uIDIuMiBzdXBwb3J0IGZvciBpdGVyYXRvcnMuCisKK0ZpeGVkIGEgYnVnIHRoYXQgZ2F2ZSB0aGUgd3JvbmcgcmVwcmVzZW50YXRpb24gdG8gdGFncyB3aXRoaW4gcXVvdGUKK3RhZ3MgbGlrZSA8c2NyaXB0Pi4KKworVG9vayBzb21lIGNvZGUgZnJvbSBNYXJrIFBpbGdyaW0gdGhhdCB0cmVhdHMgQ0RBVEEgZGVjbGFyYXRpb25zIGFzCitkYXRhIGluc3RlYWQgb2YgaWdub3JpbmcgdGhlbS4KKworQmVhdXRpZnVsIFNvdXAncyBzZXR1cC5weSB3aWxsIG5vdyBkbyBhbiBpbnN0YWxsIGV2ZW4gaWYgdGhlIHVuaXQKK3Rlc3RzIGZhaWwuIEl0IHdvbid0IGJ1aWxkIGEgc291cmNlIGRpc3RyaWJ1dGlvbiBpZiB0aGUgdW5pdCB0ZXN0cworZmFpbCwgc28gSSBjYW4ndCByZWxlYXNlIGEgbmV3IHZlcnNpb24gdW5sZXNzIHRoZXkgcGFzcy4KKworPSAyLjAuMiAoMjAwNTA0MTYpID0KKworQWRkZWQgdGhlIHVuaXQgdGVzdHMgaW4gYSBzZXBhcmF0ZSBtb2R1bGUsIGFuZCBwYWNrYWdlZCBpdCB3aXRoCitkaXN0dXRpbHMuCisKK0ZpeGVkIGEgYnVnIHRoYXQgc29tZXRpbWVzIGNhdXNlZCByZW5kZXJDb250ZW50cygpIHRvIHJldHVybiBhIFVuaWNvZGUKK3N0cmluZyBldmVuIGlmIHRoZXJlIHdhcyBubyBVbmljb2RlIGluIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisKK0FkZGVkIHRoZSBkb25lKCkgbWV0aG9kLCB3aGljaCBjbG9zZXMgYWxsIG9mIHRoZSBwYXJzZXIncyBvcGVuCit0YWdzLiBJdCBnZXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHBhc3MgaW4gc29tZSB0ZXh0IHRvIHRoZQorY29uc3RydWN0b3Igb2YgYSBwYXJzZXIgY2xhc3M7IG90aGVyd2lzZSB5b3UgbXVzdCBjYWxsIGl0IHlvdXJzZWxmLgorCitSZWluc3RhdGVkIHNvbWUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCAxLnggdmVyc2lvbnM6IHJlZmVyZW5jaW5nCit0aGUgc3RyaW5nIG1lbWJlciBvZiBhIE5hdmlnYWJsZVRleHQgb2JqZWN0IHJldHVybnMgdGhlIE5hdmlnYWJsZVRleHQKK29iamVjdCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLgorCis9IDIuMC4xICgyMDA1MDQxMikgPQorCitGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBiYWQgcmVzdWx0cyB3aGVuIHlvdSB0cmllZCB0byByZWZlcmVuY2UgYSB0YWcKK25hbWUgc2hvcnRlciB0aGFuIDMgY2hhcmFjdGVycyBhcyBhIG1lbWJlciBvZiBhIFRhZywgZWcuIHRhZy50YWJsZS50ZC4KKworTWFkZSBzdXJlIGFsbCBUYWdzIGhhdmUgdGhlICdoaWRkZW4nIGF0dHJpYnV0ZSBzbyB0aGF0IGFuIGF0dGVtcHQgdG8KK2FjY2VzcyB0YWcuaGlkZGVuIGRvZXNuJ3Qgc3Bhd24gYW4gYXR0ZW1wdCB0byBmaW5kIGEgdGFnIG5hbWVkCisnaGlkZGVuJy4KKworRml4ZWQgYSBidWcgaW4gdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IuCisKKz0gMi4wLjAgIldobyBjYXJlcyBmb3IgZmlzaD8iICgyMDA1MDQxMCkKKworQmVhdXRpZnVsIFNvdXAgdmVyc2lvbiAxIHdhcyB2ZXJ5IHVzZWZ1bCBidXQgYWxzbyBwcmV0dHkgc3R1cGlkLiBJCitvcmlnaW5hbGx5IHdyb3RlIGl0IHdpdGhvdXQgbm90aWNpbmcgYW55IG9mIHRoZSBwcm9ibGVtcyBpbmhlcmVudCBpbgordHJ5aW5nIHRvIGJ1aWxkIGEgcGFyc2UgdHJlZSBvdXQgb2YgYW1iaWd1b3VzIEhUTUwgdGFncy4gVGhpcyB2ZXJzaW9uCitzb2x2ZXMgYWxsIG9mIHRob3NlIHByb2JsZW1zIHRvIG15IHNhdGlzZmFjdGlvbi4gSXQgYWxzbyBhZGRzIG1hbnkgbmV3CitjbGV2ZXIgdGhpbmdzIHRvIG1ha2UgdXAgZm9yIHRoZSByZW1vdmFsIG9mIHRoZSBzdHVwaWQgdGhpbmdzLgorCis9PSBQYXJzaW5nID09CisKK1RoZSBwYXJzZXIgbG9naWMgaGFzIGJlZW4gZ3JlYXRseSBpbXByb3ZlZCwgYW5kIHRoZSBCZWF1dGlmdWxTb3VwCitjbGFzcyBzaG91bGQgbXVjaCBtb3JlIHJlbGlhYmx5IHlpZWxkIGEgcGFyc2UgdHJlZSB0aGF0IGxvb2tzIGxpa2UKK3doYXQgdGhlIHBhZ2UgYXV0aG9yIGludGVuZGVkLiBGb3IgYSBwYXJ0aWN1bGFyIGNsYXNzIG9mIG9kZCBlZGdlCitjYXNlcyB0aGF0IG5vdyBjYXVzZXMgcHJvYmxlbXMsIHRoZXJlIGlzIGEgbmV3IGNsYXNzLAorSUNhbnRCZWxpZXZlSXRzQmVhdXRpZnVsU291cC4KKworQnkgZGVmYXVsdCwgQmVhdXRpZnVsIFNvdXAgbm93IHBlcmZvcm1zIHNvbWUgY2xlYW51cCBvcGVyYXRpb25zIG9uCit0ZXh0IGJlZm9yZSBwYXJzaW5nIGl0LiBUaGlzIGlzIHRvIGF2b2lkIGNvbW1vbiBwcm9ibGVtcyB3aXRoIGJhZAorZGVmaW5pdGlvbnMgYW5kIHNlbGYtY2xvc2luZyB0YWdzIHRoYXQgY3Jhc2ggU0dNTFBhcnNlci4gWW91IGNhbgorcHJvdmlkZSB5b3VyIG93biBzZXQgb2YgY2xlYW51cCBvcGVyYXRpb25zLCBvciB0dXJuIGl0IG9mZgorYWx0b2dldGhlci4gVGhlIGNsZWFudXAgb3BlcmF0aW9ucyBpbmNsdWRlIGZpeGluZyBzZWxmLWNsb3NpbmcgdGFncwordGhhdCBkb24ndCBjbG9zZSwgYW5kIHJlcGxhY2luZyBNaWNyb3NvZnQgc21hcnQgcXVvdGVzIGFuZCBzaW1pbGFyCitjaGFyYWN0ZXJzIHdpdGggdGhlaXIgSFRNTCBlbnRpdHkgZXF1aXZhbGVudHMuCisKK1lvdSBjYW4gbm93IGdldCBhIHByZXR0eS1wcmludCB2ZXJzaW9uIG9mIHBhcnNlZCBIVE1MIHRvIGdldCBhIHZpc3VhbAorcGljdHVyZSBvZiBob3cgQmVhdXRpZnVsIFNvdXAgcGFyc2VzIGl0LCB3aXRoIHRoZSBUYWcucHJldHRpZnkoKQorbWV0aG9kLgorCis9PSBTdHJpbmdzIGFuZCBVbmljb2RlID09CisKK1RoZXJlIGFyZSBzZXBhcmF0ZSBOYXZpZ2FibGVUZXh0IHN1YmNsYXNzZXMgZm9yIEFTQ0lJIGFuZCBVbmljb2RlCitzdHJpbmdzLiBUaGVzZSBjbGFzc2VzIGRpcmVjdGx5IHN1YmNsYXNzIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgZGF0YQordHlwZXMuIFRoaXMgbWVhbnMgeW91IGNhbiB0cmVhdCBOYXZpZ2FibGVUZXh0IG9iamVjdHMgYXMgc3RyaW5ncworaW5zdGVhZCBvZiBoYXZpbmcgdG8gY2FsbCBtZXRob2RzIG9uIHRoZW0gdG8gZ2V0IHRoZSBzdHJpbmdzLgorCitzdHIoKSBvbiBhIFRhZyBhbHdheXMgcmV0dXJucyBhIHN0cmluZywgYW5kIHVuaWNvZGUoKSBhbHdheXMgcmV0dXJucworVW5pY29kZS4gUHJldmlvdXNseSBpdCB3YXMgaW5jb25zaXN0ZW50LgorCis9PSBUcmVlIHRyYXZlcnNhbCA9PQorCitJbiBhIGZpcnN0KCkgb3IgZmV0Y2goKSBjYWxsLCB0aGUgdGFnIG5hbWUgb3IgdGhlIGRlc2lyZWQgdmFsdWUgb2YgYW4KK2F0dHJpYnV0ZSBjYW4gbm93IGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorCisgKiBBIHN0cmluZyAobWF0Y2hlcyB0aGF0IHNwZWNpZmljIHRhZyBvciB0aGF0IHNwZWNpZmljIGF0dHJpYnV0ZSB2YWx1ZSkKKyAqIEEgbGlzdCBvZiBzdHJpbmdzIChtYXRjaGVzIGFueSB0YWcgb3IgYXR0cmlidXRlIHZhbHVlIGluIHRoZSBsaXN0KQorICogQSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0IChtYXRjaGVzIGFueSB0YWcgb3IgYXR0cmlidXRlCisgICB2YWx1ZSB0aGF0IG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbikKKyAqIEEgY2FsbGFibGUgb2JqZWN0IHRoYXQgdGFrZXMgdGhlIFRhZyBvYmplY3Qgb3IgYXR0cmlidXRlIHZhbHVlIGFzIGEKKyAgIHN0cmluZy4gSXQgcmV0dXJucyBOb25lL2ZhbHNlL2VtcHR5IHN0cmluZyBpZiB0aGUgZ2l2ZW4gc3RyaW5nCisgICBkb2Vzbid0IG1hdGNoLCBhbmQgYW55IG90aGVyIHZhbHVlIGlmIGl0IGRvZXMuCisKK1RoaXMgaXMgbXVjaCBlYXNpZXIgdG8gdXNlIHRoYW4gU1FMLXN0eWxlIHdpbGRjYXJkcyAoc2VlLCByZWd1bGFyCitleHByZXNzaW9ucyBhcmUgZ29vZCBmb3Igc29tZXRoaW5nKS4gQmVjYXVzZSBvZiB0aGlzLCBJIHRvb2sgb3V0CitTUUwtc3R5bGUgd2lsZGNhcmRzLiBJJ2xsIHB1dCB0aGVtIGJhY2sgaWYgc29tZW9uZSBjb21wbGFpbnMsIGJ1dAordGhlaXIgcmVtb3ZhbCBzaW1wbGlmaWVzIHRoZSBjb2RlIGEgbG90LgorCitZb3UgY2FuIHVzZSBmZXRjaCgpIGFuZCBmaXJzdCgpIHRvIHNlYXJjaCBmb3IgdGV4dCBpbiB0aGUgcGFyc2UgdHJlZSwKK25vdCBqdXN0IHRhZ3MuIFRoZXJlIGFyZSBuZXcgYWxpYXMgbWV0aG9kcyBmZXRjaFRleHQoKSBhbmQgZmlyc3RUZXh0KCkKK2Rlc2lnbmVkIGZvciB0aGlzIHB1cnBvc2UuIEFzIHdpdGggc2VhcmNoaW5nIGZvciB0YWdzLCB5b3UgY2FuIHBhc3MgaW4KK2Egc3RyaW5nLCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QsIG9yIGEgbWV0aG9kIHRvIG1hdGNoIHlvdXIgdGV4dC4KKworSWYgeW91IHBhc3MgaW4gc29tZXRoaW5nIGJlc2lkZXMgYSBtYXAgdG8gdGhlIGF0dHJzIGFyZ3VtZW50IG9mCitmZXRjaCgpIG9yIGZpcnN0KCksIEJlYXV0aWZ1bCBTb3VwIHdpbGwgYXNzdW1lIHlvdSB3YW50IHRvIG1hdGNoIHRoYXQKK3RoaW5nIGFnYWluc3QgdGhlICJjbGFzcyIgYXR0cmlidXRlLiBXaGVuIHlvdSdyZSBzY3JhcGluZword2VsbC1zdHJ1Y3R1cmVkIEhUTUwsIHRoaXMgbWFrZXMgeW91ciBjb2RlIGEgbG90IGNsZWFuZXIuCisKKzEueCBhbmQgMi54IGJvdGggbGV0IHlvdSBjYWxsIGEgVGFnIG9iamVjdCBhcyBhIHNob3J0aGFuZCBmb3IKK2ZldGNoKCkuIEZvciBpbnN0YW5jZSwgZm9vKCJiYXIiKSBpcyBhIHNob3J0aGFuZCBmb3IKK2Zvby5mZXRjaCgiYmFyIikuIEluIDIueCwgeW91IGNhbiBhbHNvIGFjY2VzcyBhIHNwZWNpYWxseS1uYW1lZCBtZW1iZXIKK29mIGEgVGFnIG9iamVjdCBhcyBhIHNob3J0aGFuZCBmb3IgZmlyc3QoKS4gRm9yIGluc3RhbmNlLCBmb28uYmFyVGFnCitpcyBhIHNob3J0aGFuZCBmb3IgZm9vLmZpcnN0KCJiYXIiKS4gQnkgY2hhaW5pbmcgdGhlc2Ugc2hvcnRjdXRzIHlvdQordHJhdmVyc2UgYSB0cmVlIGluIHZlcnkgbGl0dGxlIGNvZGU6IGZvciBoZWFkZXIgaW4KK3NvdXAuYm9keVRhZy5wVGFnLnRhYmxlVGFnKCd0aCcpOgorCitJZiBhbiBlbGVtZW50IHJlbGF0aW9uc2hpcCAobGlrZSBwYXJlbnQgb3IgbmV4dCkgZG9lc24ndCBhcHBseSB0byBhCit0YWcsIGl0J2xsIG5vdyBzaG93IHVwIE51bGwgaW5zdGVhZCBvZiBOb25lLiBmaXJzdCgpIHdpbGwgYWxzbyByZXR1cm4KK051bGwgaWYgeW91IGFzayBpdCBmb3IgYSBub25leGlzdGVudCB0YWcuIE51bGwgaXMgYW4gb2JqZWN0IHRoYXQncworanVzdCBsaWtlIE5vbmUsIGV4Y2VwdCB5b3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHRvIGl0IGFuZCBpdCdsbAorZ2l2ZSB5b3UgTnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yLgorCitUaGlzIGxldHMgeW91IGRvIHRyZWUgdHJhdmVyc2FscyBsaWtlIHNvdXAuaHRtbFRhZy5oZWFkVGFnLnRpdGxlVGFnCit3aXRob3V0IGhhdmluZyB0byB3b3JyeSBpZiB0aGUgaW50ZXJtZWRpYXRlIHN0YWdlcyBhcmUgYWN0dWFsbHkKK3RoZXJlLiBQcmV2aW91c2x5LCBpZiB0aGVyZSB3YXMgbm8gJ2hlYWQnIHRhZyBpbiB0aGUgZG9jdW1lbnQsIGhlYWRUYWcKK2luIHRoYXQgaW5zdGFuY2Ugd291bGQgaGF2ZSBiZWVuIE5vbmUsIGFuZCBhY2Nlc3NpbmcgaXRzICd0aXRsZVRhZycKK21lbWJlciB3b3VsZCBoYXZlIHRocm93biBhbiBBdHRyaWJ1dGVFcnJvci4gTm93LCB5b3UgY2FuIGdldCB3aGF0IHlvdQord2FudCB3aGVuIGl0IGV4aXN0cywgYW5kIGdldCBOdWxsIHdoZW4gaXQgZG9lc24ndCwgd2l0aG91dCBoYXZpbmcgdG8KK2RvIGEgbG90IG9mIGNvbmRpdGlvbmFscyBjaGVja2luZyB0byBzZWUgaWYgZXZlcnkgc3RhZ2UgaXMgTm9uZS4KKworVGhlcmUgYXJlIHR3byBuZXcgcmVsYXRpb25zIGJldHdlZW4gcGFnZSBlbGVtZW50czogcHJldmlvdXNTaWJsaW5nIGFuZAorbmV4dFNpYmxpbmcuIFRoZXkgcmVmZXJlbmNlIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBlbGVtZW50IGF0IHRoZSBzYW1lCitsZXZlbCBvZiB0aGUgcGFyc2UgdHJlZS4gRm9yIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSBIVE1MIGxpa2UgdGhpczoKKworICA8cD48dWw+PGxpPkZvbzxiciAvPjxsaT5CYXI8L3VsPgorCitUaGUgZmlyc3QgJ2xpJyB0YWcgaGFzIGEgcHJldmlvdXNTaWJsaW5nIG9mIE51bGwgYW5kIGl0cyBuZXh0U2libGluZworaXMgdGhlIHNlY29uZCAnbGknIHRhZy4gVGhlIHNlY29uZCAnbGknIHRhZyBoYXMgYSBuZXh0U2libGluZyBvZiBOdWxsCithbmQgaXRzIHByZXZpb3VzU2libGluZyBpcyB0aGUgZmlyc3QgJ2xpJyB0YWcuIFRoZSBwcmV2aW91c1NpYmxpbmcgb2YKK3RoZSAndWwnIHRhZyBpcyB0aGUgZmlyc3QgJ3AnIHRhZy4gVGhlIG5leHRTaWJsaW5nIG9mICdGb28nIGlzIHRoZQorJ2JyJyB0YWcuCisKK0kgdG9vayBvdXQgdGhlIGFiaWxpdHkgdG8gdXNlIGZldGNoKCkgdG8gZmluZCB0YWdzIHRoYXQgaGF2ZSBhCitzcGVjaWZpYyBsaXN0IG9mIGNvbnRlbnRzLiBTZWUsIEkgY2FuJ3QgZXZlbiBleHBsYWluIGl0IHdlbGwuIEl0IHdhcworcmVhbGx5IGRpZmZpY3VsdCB0byB1c2UsIEkgbmV2ZXIgdXNlZCBpdCwgYW5kIEkgZG9uJ3QgdGhpbmsgYW55b25lCitlbHNlIGV2ZXIgdXNlZCBpdC4gVG8gdGhlIGV4dGVudCBhbnlvbmUgZGlkLCB0aGV5IGNhbiBwcm9iYWJseSB1c2UKK2ZldGNoVGV4dCgpIGluc3RlYWQuIElmIGl0IHR1cm5zIG91dCBzb21lb25lIG5lZWRzIGl0IEknbGwgdGhpbmsgb2YKK2Fub3RoZXIgc29sdXRpb24uCisKKz09IFRyZWUgbWFuaXB1bGF0aW9uID09CisKK1lvdSBjYW4gYWRkIG5ldyBhdHRyaWJ1dGVzIHRvIGEgdGFnLCBhbmQgZGVsZXRlIGF0dHJpYnV0ZXMgZnJvbSBhCit0YWcuIEluIDEueCB5b3UgY291bGQgb25seSBjaGFuZ2UgYSB0YWcncyBleGlzdGluZyBhdHRyaWJ1dGVzLgorCis9PSBQb3J0aW5nIENvbnNpZGVyYXRpb25zID09CisKK1RoZXJlIGFyZSB0aHJlZSBjaGFuZ2VzIGluIDIuMCB0aGF0IGJyZWFrIG9sZCBjb2RlOgorCitJbiB0aGUgcG9zdC0xLjIgcmVsZWFzZSB5b3UgY291bGQgcGFzcyBpbiBhIGZ1bmN0aW9uIGludG8gZmV0Y2goKS4gVGhlCitmdW5jdGlvbiB0b29rIGEgc3RyaW5nLCB0aGUgdGFnIG5hbWUuIEluIDIuMCwgdGhlIGZ1bmN0aW9uIHRha2VzIHRoZQorYWN0dWFsIFRhZyBvYmplY3QuCisKK0l0J3Mgbm8gbG9uZ2VyIHRvIHBhc3MgaW4gU1FMLXN0eWxlIHdpbGRjYXJkcyB0byBmZXRjaCgpLiBVc2UgYQorcmVndWxhciBleHByZXNzaW9uIGluc3RlYWQuCisKK1RoZSBkaWZmZXJlbnQgcGFyc2luZyBhbGdvcml0aG0gbWVhbnMgdGhlIHBhcnNlIHRyZWUgbWF5IG5vdCBiZSBzaGFwZWQKK2xpa2UgeW91IGV4cGVjdC4gVGhpcyB3aWxsIG9ubHkgYWN0dWFsbHkgYWZmZWN0IHlvdSBpZiB5b3VyIGNvZGUgdXNlcworb25lIG9mIHRoZSBhZmZlY3RlZCBwYXJ0cy4gSSBoYXZlbid0IHJ1biBpbnRvIHRoaXMgcHJvYmxlbSB5ZXQgd2hpbGUKK3BvcnRpbmcgbXkgY29kZS4KKworPSBCZXR3ZWVuIDEuMiBhbmQgMi4wID0KKworVGhpcyBpcyB0aGUgcmVsZWFzZSB0byBnZXQgaWYgeW91IHdhbnQgUHl0aG9uIDEuNSBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVzaXJlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgY2FuIG5vdyBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKworICogQSBzdHJpbmcKKyAqIEEgc3RyaW5nIHdpdGggU1FMLXN0eWxlIHdpbGRjYXJkcworICogQSBjb21waWxlZCBSRSBvYmplY3QKKyAqIEEgY2FsbGFibGUgdGhhdCByZXR1cm5zIE5vbmUvZmFsc2UvZW1wdHkgc3RyaW5nIGlmIHRoZSBnaXZlbiB2YWx1ZQorICAgZG9lc24ndCBtYXRjaCwgYW5kIGFueSBvdGhlciB2YWx1ZSBvdGhlcndpc2UuCisKK1RoaXMgaXMgbXVjaCBlYXNpZXIgdG8gdXNlIHRoYW4gU1FMLXN0eWxlIHdpbGRjYXJkcyAoc2VlLCByZWd1bGFyCitleHByZXNzaW9ucyBhcmUgZ29vZCBmb3Igc29tZXRoaW5nKS4gQmVjYXVzZSBvZiB0aGlzLCBJIG5vIGxvbmdlcgorcmVjb21tZW5kIHlvdSB1c2UgU1FMLXN0eWxlIHdpbGRjYXJkcy4gVGhleSBtYXkgZ28gYXdheSBpbiBhIGZ1dHVyZQorcmVsZWFzZSB0byBjbGVhbiB1cCB0aGUgY29kZS4KKworTWFkZSBCZWF1dGlmdWwgU291cCBoYW5kbGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXMgdGV4dCBpbnN0ZWFkIG9mCitpZ25vcmluZyB0aGVtLgorCitBcHBsaWVkIHBhdGNoIGZyb20gUmljaGllIEhpbmRsZSAocmljaGllIGF0IGVudHJpYW4gZG90IGNvbSkgdGhhdAorbWFrZXMgdGFnLnN0cmluZyBhIHNob3J0aGFuZCBmb3IgdGFnLmNvbnRlbnRzWzBdLnN0cmluZyB3aGVuIHRoZSB0YWcKK2hhcyBvbmx5IG9uZSBzdHJpbmctb3duaW5nIGNoaWxkLgorCitBZGRlZCBzdGlsbCBtb3JlIG5lc3RhYmxlIHRhZ3MuIFRoZSBuZXN0YWJsZSB0YWdzIHRoaW5nIHdvbid0IHdvcmsgaW4KK2EgbG90IG9mIGNhc2VzIGFuZCBuZWVkcyB0byBiZSByZXRob3VnaHQuCisKK0ZpeGVkIGFuIGVkZ2UgY2FzZSB3aGVyZSBzZWFyY2hpbmcgZm9yICIlZm9vIiB3b3VsZCBtYXRjaCBhbnkgc3RyaW5nCitzaG9ydGVyIHRoYW4gImZvbyIuCisKKz0gMS4yICJXaG8gZm9yIHN1Y2ggZGFpbnRpZXMgd291bGQgbm90IHN0b29wPyIgKDIwMDQwNzA4KSA9CisKK0FwcGxpZWQgcGF0Y2ggZnJvbSBCZW4gTGFzdCAoYmVuIGF0IGJlbmxhc3QgZG90IGNvbSkgdGhhdCBtYWRlCitUYWcucmVuZGVyQ29udGVudHMoKSBjb3JyZWN0bHkgaGFuZGxlIFVuaWNvZGUuCisKK01hZGUgQmVhdXRpZnVsU3RvbmVTb3VwIGV2ZW4gZHVtYmVyIGJ5IG1ha2luZyBpdCBub3QgaW1wbGljaXRseSBjbG9zZQorYSB0YWcgd2hlbiBhbm90aGVyIHRhZyBvZiB0aGUgc2FtZSB0eXBlIGlzIGVuY291bnRlcmVkOyBvbmx5IHdoZW4gYW4KK2FjdHVhbCBjbG9zaW5nIHRhZyBpcyBlbmNvdW50ZXJlZC4gVGhpcyBjaGFuZ2UgY291cnRlc3kgb2YgRnV6enkgKG1pa2UKK2F0IHBjYmxva2VzIGRvdCBjb20pLiBCZWF1dGlmdWxTb3VwIHN0aWxsIHdvcmtzIGFzIGJlZm9yZS4KKworPSAxLjEgIlN3aW1taW5nIGluIGEgaG90IHR1cmVlbiIgPQorCitBZGRlZCBtb3JlICduZXN0YWJsZScgdGFncy4gQ2hhbmdlZCBwb3BwaW5nIHNlbWFudGljcyBzbyB0aGF0IHdoZW4gYQorbmVzdGFibGUgdGFnIGlzIGVuY291bnRlcmVkLCB0YWdzIGFyZSBwb3BwZWQgdXAgdG8gdGhlIHByZXZpb3VzbHkKK2VuY291bnRlcmVkIG5lc3RhYmxlIHRhZyAob2Ygd2hhdGV2ZXIga2luZCkuIEkgd2lsbCByZXZlcnQgdGhpcyBpZgorZW5vdWdoIHBlb3BsZSBjb21wbGFpbiwgYnV0IGl0IHNob3VsZCBtYWtlIG1vcmUgcGVvcGxlJ3MgbGl2ZXMgZWFzaWVyCit0aGFuIGhhcmRlci4gVGhpcyBlbmhhbmNlbWVudCB3YXMgc3VnZ2VzdGVkIGJ5IEFudGhvbnkgQmF4dGVyIChhbnRob255CithdCBpbnRlcmxpbmsgZG90IGNvbSBkb3QgYXUpLgorCis9IDEuMCAiU28gcmljaCBhbmQgZ3JlZW4iICgyMDA0MDQyMCkgPQorCitJbml0aWFsIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iczQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMzQyNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQwNiBAQAorIiIiQmVhdXRpZnVsIFNvdXAKK0VsaXhpciBhbmQgVG9uaWMKKyJUaGUgU2NyZWVuLVNjcmFwZXIncyBGcmllbmQiCitodHRwOi8vd3d3LmNydW1teS5jb20vc29mdHdhcmUvQmVhdXRpZnVsU291cC8KKworQmVhdXRpZnVsIFNvdXAgdXNlcyBhIHBsdWdnYWJsZSBYTUwgb3IgSFRNTCBwYXJzZXIgdG8gcGFyc2UgYQorKHBvc3NpYmx5IGludmFsaWQpIGRvY3VtZW50IGludG8gYSB0cmVlIHJlcHJlc2VudGF0aW9uLiBCZWF1dGlmdWwgU291cAorcHJvdmlkZXMgcHJvdmlkZXMgbWV0aG9kcyBhbmQgUHl0aG9uaWMgaWRpb21zIHRoYXQgbWFrZSBpdCBlYXN5IHRvCituYXZpZ2F0ZSwgc2VhcmNoLCBhbmQgbW9kaWZ5IHRoZSBwYXJzZSB0cmVlLgorCitCZWF1dGlmdWwgU291cCB3b3JrcyB3aXRoIFB5dGhvbiAyLjYgYW5kIHVwLiBJdCB3b3JrcyBiZXR0ZXIgaWYgbHhtbAorYW5kL29yIGh0bWw1bGliIGlzIGluc3RhbGxlZC4KKworRm9yIG1vcmUgdGhhbiB5b3UgZXZlciB3YW50ZWQgdG8ga25vdyBhYm91dCBCZWF1dGlmdWwgU291cCwgc2VlIHRoZQorZG9jdW1lbnRhdGlvbjoKK2h0dHA6Ly93d3cuY3J1bW15LmNvbS9zb2Z0d2FyZS9CZWF1dGlmdWxTb3VwL2JzNC9kb2MvCisiIiIKKworX19hdXRob3JfXyA9ICJMZW9uYXJkIFJpY2hhcmRzb24gKGxlb25hcmRyQHNlZ2ZhdWx0Lm9yZykiCitfX3ZlcnNpb25fXyA9ICI0LjMuMiIKK19fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IChjKSAyMDA0LTIwMTMgTGVvbmFyZCBSaWNoYXJkc29uIgorX19saWNlbnNlX18gPSAiTUlUIgorCitfX2FsbF9fID0gWydCZWF1dGlmdWxTb3VwJ10KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIC5idWlsZGVyIGltcG9ydCBidWlsZGVyX3JlZ2lzdHJ5LCBQYXJzZXJSZWplY3RlZE1hcmt1cAorZnJvbSAuZGFtbWl0IGltcG9ydCBVbmljb2RlRGFtbWl0Citmcm9tIC5lbGVtZW50IGltcG9ydCAoCisgICAgQ0RhdGEsCisgICAgQ29tbWVudCwKKyAgICBERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICBEZWNsYXJhdGlvbiwKKyAgICBEb2N0eXBlLAorICAgIE5hdmlnYWJsZVN0cmluZywKKyAgICBQYWdlRWxlbWVudCwKKyAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24sCisgICAgUmVzdWx0U2V0LAorICAgIFNvdXBTdHJhaW5lciwKKyAgICBUYWcsCisgICAgKQorCisjIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIGRvIGlzIGdpdmUgYSB1c2VmdWwgZXJyb3IgaWYgc29tZW9uZSBpcworIyBydW5uaW5nIHRoaXMgY29kZSB1bmRlciBQeXRob24gMyB3aXRob3V0IGNvbnZlcnRpbmcgaXQuCitzeW50YXhfZXJyb3IgPSB1J1lvdSBhcmUgdHJ5aW5nIHRvIHJ1biB0aGUgUHl0aG9uIDIgdmVyc2lvbiBvZiBCZWF1dGlmdWwgU291cCB1bmRlciBQeXRob24gMy4gVGhpcyB3aWxsIG5vdCB3b3JrLiBZb3UgbmVlZCB0byBjb252ZXJ0IHRoZSBjb2RlLCBlaXRoZXIgYnkgaW5zdGFsbGluZyBpdCAoYHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsYCkgb3IgYnkgcnVubmluZyAydG8zIChgMnRvMyAtdyBiczRgKS4nCisKK2NsYXNzIEJlYXV0aWZ1bFNvdXAoVGFnKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljIGludGVyZmFjZSBjYWxsZWQgYnkgdGhlIHRyZWUgYnVpbGRlcnMuCisKKyAgICBUaGVzZSBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBwYXJzZXI6CisgICAgICByZXNldCgpCisgICAgICBmZWVkKG1hcmt1cCkKKworICAgIFRoZSB0cmVlIGJ1aWxkZXIgbWF5IGNhbGwgdGhlc2UgbWV0aG9kcyBmcm9tIGl0cyBmZWVkKCkgaW1wbGVtZW50YXRpb246CisgICAgICBoYW5kbGVfc3RhcnR0YWcobmFtZSwgYXR0cnMpICMgU2VlIG5vdGUgYWJvdXQgcmV0dXJuIHZhbHVlCisgICAgICBoYW5kbGVfZW5kdGFnKG5hbWUpCisgICAgICBoYW5kbGVfZGF0YShkYXRhKSAjIEFwcGVuZHMgdG8gdGhlIGN1cnJlbnQgZGF0YSBub2RlCisgICAgICBlbmREYXRhKGNvbnRhaW5lckNsYXNzPU5hdmlnYWJsZVN0cmluZykgIyBFbmRzIHRoZSBjdXJyZW50IGRhdGEgbm9kZQorCisgICAgTm8gbWF0dGVyIGhvdyBjb21wbGljYXRlZCB0aGUgdW5kZXJseWluZyBwYXJzZXIgaXMsIHlvdSBzaG91bGQgYmUKKyAgICBhYmxlIHRvIGJ1aWxkIGEgdHJlZSB1c2luZyAnc3RhcnQgdGFnJyBldmVudHMsICdlbmQgdGFnJyBldmVudHMsCisgICAgJ2RhdGEnIGV2ZW50cywgYW5kICJkb25lIHdpdGggZGF0YSIgZXZlbnRzLgorCisgICAgSWYgeW91IGVuY291bnRlciBhbiBlbXB0eS1lbGVtZW50IHRhZyAoYWthIGEgc2VsZi1jbG9zaW5nIHRhZywKKyAgICBsaWtlIEhUTUwncyA8YnI+IHRhZyksIGNhbGwgaGFuZGxlX3N0YXJ0dGFnIGFuZCB0aGVuCisgICAgaGFuZGxlX2VuZHRhZy4KKyAgICAiIiIKKyAgICBST09UX1RBR19OQU1FID0gdSdbZG9jdW1lbnRdJworCisgICAgIyBJZiB0aGUgZW5kLXVzZXIgZ2l2ZXMgbm8gaW5kaWNhdGlvbiB3aGljaCB0cmVlIGJ1aWxkZXIgdGhleQorICAgICMgd2FudCwgbG9vayBmb3Igb25lIHdpdGggdGhlc2UgZmVhdHVyZXMuCisgICAgREVGQVVMVF9CVUlMREVSX0ZFQVRVUkVTID0gWydodG1sJywgJ2Zhc3QnXQorCisgICAgQVNDSUlfU1BBQ0VTID0gJ1x4MjBceDBhXHgwOVx4MGNceDBkJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmt1cD0iIiwgZmVhdHVyZXM9Tm9uZSwgYnVpbGRlcj1Ob25lLAorICAgICAgICAgICAgICAgICBwYXJzZV9vbmx5PU5vbmUsIGZyb21fZW5jb2Rpbmc9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJUaGUgU291cCBvYmplY3QgaXMgaW5pdGlhbGl6ZWQgYXMgdGhlICdyb290IHRhZycsIGFuZCB0aGUKKyAgICAgICAgcHJvdmlkZWQgbWFya3VwICh3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmaWxlLWxpa2Ugb2JqZWN0KQorICAgICAgICBpcyBmZWQgaW50byB0aGUgdW5kZXJseWluZyBwYXJzZXIuIiIiCisKKyAgICAgICAgaWYgJ2NvbnZlcnRFbnRpdGllcycgaW4ga3dhcmdzOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiQlM0IGRvZXMgbm90IHJlc3BlY3QgdGhlIGNvbnZlcnRFbnRpdGllcyBhcmd1bWVudCB0byB0aGUgIgorICAgICAgICAgICAgICAgICJCZWF1dGlmdWxTb3VwIGNvbnN0cnVjdG9yLiBFbnRpdGllcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCAiCisgICAgICAgICAgICAgICAgInRvIFVuaWNvZGUgY2hhcmFjdGVycy4iKQorCisgICAgICAgIGlmICdtYXJrdXBNYXNzYWdlJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBkZWwga3dhcmdzWydtYXJrdXBNYXNzYWdlJ10KKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIkJTNCBkb2VzIG5vdCByZXNwZWN0IHRoZSBtYXJrdXBNYXNzYWdlIGFyZ3VtZW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgIkJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IuIFRoZSB0cmVlIGJ1aWxkZXIgaXMgcmVzcG9uc2libGUgIgorICAgICAgICAgICAgICAgICJmb3IgYW55IG5lY2Vzc2FyeSBtYXJrdXAgbWFzc2FnZS4iKQorCisgICAgICAgIGlmICdzbWFydFF1b3Rlc1RvJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBkZWwga3dhcmdzWydzbWFydFF1b3Rlc1RvJ10KKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIkJTNCBkb2VzIG5vdCByZXNwZWN0IHRoZSBzbWFydFF1b3Rlc1RvIGFyZ3VtZW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgIkJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IuIFNtYXJ0IHF1b3RlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCAiCisgICAgICAgICAgICAgICAgInRvIFVuaWNvZGUgY2hhcmFjdGVycy4iKQorCisgICAgICAgIGlmICdzZWxmQ2xvc2luZ1RhZ3MnIGluIGt3YXJnczoKKyAgICAgICAgICAgIGRlbCBrd2FyZ3NbJ3NlbGZDbG9zaW5nVGFncyddCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJCUzQgZG9lcyBub3QgcmVzcGVjdCB0aGUgc2VsZkNsb3NpbmdUYWdzIGFyZ3VtZW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgIkJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IuIFRoZSB0cmVlIGJ1aWxkZXIgaXMgcmVzcG9uc2libGUgIgorICAgICAgICAgICAgICAgICJmb3IgdW5kZXJzdGFuZGluZyBzZWxmLWNsb3NpbmcgdGFncy4iKQorCisgICAgICAgIGlmICdpc0hUTUwnIGluIGt3YXJnczoKKyAgICAgICAgICAgIGRlbCBrd2FyZ3NbJ2lzSFRNTCddCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJCUzQgZG9lcyBub3QgcmVzcGVjdCB0aGUgaXNIVE1MIGFyZ3VtZW50IHRvIHRoZSAiCisgICAgICAgICAgICAgICAgIkJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IuIFlvdSBjYW4gcGFzcyBpbiBmZWF0dXJlcz0naHRtbCcgIgorICAgICAgICAgICAgICAgICJvciBmZWF0dXJlcz0neG1sJyB0byBnZXQgYSBidWlsZGVyIGNhcGFibGUgb2YgaGFuZGxpbmcgIgorICAgICAgICAgICAgICAgICJvbmUgb3IgdGhlIG90aGVyLiIpCisKKyAgICAgICAgZGVmIGRlcHJlY2F0ZWRfYXJndW1lbnQob2xkX25hbWUsIG5ld19uYW1lKToKKyAgICAgICAgICAgIGlmIG9sZF9uYW1lIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICAgICAnVGhlICIlcyIgYXJndW1lbnQgdG8gdGhlIEJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IgJworICAgICAgICAgICAgICAgICAgICAnaGFzIGJlZW4gcmVuYW1lZCB0byAiJXMuIicgJSAob2xkX25hbWUsIG5ld19uYW1lKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGt3YXJnc1tvbGRfbmFtZV0KKyAgICAgICAgICAgICAgICBkZWwga3dhcmdzW29sZF9uYW1lXQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBwYXJzZV9vbmx5ID0gcGFyc2Vfb25seSBvciBkZXByZWNhdGVkX2FyZ3VtZW50KAorICAgICAgICAgICAgInBhcnNlT25seVRoZXNlIiwgInBhcnNlX29ubHkiKQorCisgICAgICAgIGZyb21fZW5jb2RpbmcgPSBmcm9tX2VuY29kaW5nIG9yIGRlcHJlY2F0ZWRfYXJndW1lbnQoCisgICAgICAgICAgICAiZnJvbUVuY29kaW5nIiwgImZyb21fZW5jb2RpbmciKQorCisgICAgICAgIGlmIGxlbihrd2FyZ3MpID4gMDoKKyAgICAgICAgICAgIGFyZyA9IGt3YXJncy5rZXlzKCkucG9wKCkKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAiX19pbml0X18oKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgYXJnKQorCisgICAgICAgIGlmIGJ1aWxkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZmVhdHVyZXMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gW2ZlYXR1cmVzXQorICAgICAgICAgICAgaWYgZmVhdHVyZXMgaXMgTm9uZSBvciBsZW4oZmVhdHVyZXMpID09IDA6CisgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBzZWxmLkRFRkFVTFRfQlVJTERFUl9GRUFUVVJFUworICAgICAgICAgICAgYnVpbGRlcl9jbGFzcyA9IGJ1aWxkZXJfcmVnaXN0cnkubG9va3VwKCpmZWF0dXJlcykKKyAgICAgICAgICAgIGlmIGJ1aWxkZXJfY2xhc3MgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBGZWF0dXJlTm90Rm91bmQoCisgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgdHJlZSBidWlsZGVyIHdpdGggdGhlIGZlYXR1cmVzIHlvdSAiCisgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWQ6ICVzLiBEbyB5b3UgbmVlZCB0byBpbnN0YWxsIGEgcGFyc2VyIGxpYnJhcnk/IgorICAgICAgICAgICAgICAgICAgICAlICIsIi5qb2luKGZlYXR1cmVzKSkKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyX2NsYXNzKCkKKyAgICAgICAgc2VsZi5idWlsZGVyID0gYnVpbGRlcgorICAgICAgICBzZWxmLmlzX3htbCA9IGJ1aWxkZXIuaXNfeG1sCisgICAgICAgIHNlbGYuYnVpbGRlci5zb3VwID0gc2VsZgorCisgICAgICAgIHNlbGYucGFyc2Vfb25seSA9IHBhcnNlX29ubHkKKworICAgICAgICBpZiBoYXNhdHRyKG1hcmt1cCwgJ3JlYWQnKTogICAgICAgICMgSXQncyBhIGZpbGUtdHlwZSBvYmplY3QuCisgICAgICAgICAgICBtYXJrdXAgPSBtYXJrdXAucmVhZCgpCisgICAgICAgIGVsaWYgbGVuKG1hcmt1cCkgPD0gMjU2OgorICAgICAgICAgICAgIyBQcmludCBvdXQgd2FybmluZ3MgZm9yIGEgY291cGxlIGJlZ2lubmVyIHByb2JsZW1zCisgICAgICAgICAgICAjIGludm9sdmluZyBwYXNzaW5nIG5vbi1tYXJrdXAgdG8gQmVhdXRpZnVsIFNvdXAuCisgICAgICAgICAgICAjIEJlYXV0aWZ1bCBTb3VwIHdpbGwgc3RpbGwgcGFyc2UgdGhlIGlucHV0IGFzIG1hcmt1cCwKKyAgICAgICAgICAgICMganVzdCBpbiBjYXNlIHRoYXQncyB3aGF0IHRoZSB1c2VyIHJlYWxseSB3YW50cy4KKyAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKG1hcmt1cCwgdW5pY29kZSkKKyAgICAgICAgICAgICAgICBhbmQgbm90IG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMpOgorICAgICAgICAgICAgICAgIHBvc3NpYmxlX2ZpbGVuYW1lID0gbWFya3VwLmVuY29kZSgidXRmOCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvc3NpYmxlX2ZpbGVuYW1lID0gbWFya3VwCisgICAgICAgICAgICBpc19maWxlID0gRmFsc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpc19maWxlID0gb3MucGF0aC5leGlzdHMocG9zc2libGVfZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbG1vc3QgY2VydGFpbmx5IGEgcHJvYmxlbSBpbnZvbHZpbmcKKyAgICAgICAgICAgICAgICAjIGNoYXJhY3RlcnMgbm90IHZhbGlkIGluIGZpbGVuYW1lcyBvbiB0aGlzCisgICAgICAgICAgICAgICAgIyBzeXN0ZW0uIEp1c3QgbGV0IGl0IGdvLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIGlzX2ZpbGU6CisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAgICAgJyIlcyIgbG9va3MgbGlrZSBhIGZpbGVuYW1lLCBub3QgbWFya3VwLiBZb3Ugc2hvdWxkIHByb2JhYmx5IG9wZW4gdGhpcyBmaWxlIGFuZCBwYXNzIHRoZSBmaWxlaGFuZGxlIGludG8gQmVhdXRpZnVsIFNvdXAuJyAlIG1hcmt1cCkKKyAgICAgICAgICAgIGlmIG1hcmt1cFs6NV0gPT0gImh0dHA6IiBvciBtYXJrdXBbOjZdID09ICJodHRwczoiOgorICAgICAgICAgICAgICAgICMgVE9ETzogVGhpcyBpcyB1Z2x5IGJ1dCBJIGNvdWxkbid0IGdldCBpdCB0byB3b3JrIGluCisgICAgICAgICAgICAgICAgIyBQeXRob24gMyBvdGhlcndpc2UuCisgICAgICAgICAgICAgICAgaWYgKChpc2luc3RhbmNlKG1hcmt1cCwgYnl0ZXMpIGFuZCBub3QgYicgJyBpbiBtYXJrdXApCisgICAgICAgICAgICAgICAgICAgIG9yIChpc2luc3RhbmNlKG1hcmt1cCwgdW5pY29kZSkgYW5kIG5vdCB1JyAnIGluIG1hcmt1cCkpOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgbG9va3MgbGlrZSBhIFVSTC4gQmVhdXRpZnVsIFNvdXAgaXMgbm90IGFuIEhUVFAgY2xpZW50LiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBhbiBIVFRQIGNsaWVudCB0byBnZXQgdGhlIGRvY3VtZW50IGJlaGluZCB0aGUgVVJMLCBhbmQgZmVlZCB0aGF0IGRvY3VtZW50IHRvIEJlYXV0aWZ1bCBTb3VwLicgJSBtYXJrdXApCisKKyAgICAgICAgZm9yIChzZWxmLm1hcmt1cCwgc2VsZi5vcmlnaW5hbF9lbmNvZGluZywgc2VsZi5kZWNsYXJlZF9odG1sX2VuY29kaW5nLAorICAgICAgICAgc2VsZi5jb250YWluc19yZXBsYWNlbWVudF9jaGFyYWN0ZXJzKSBpbiAoCisgICAgICAgICAgICBzZWxmLmJ1aWxkZXIucHJlcGFyZV9tYXJrdXAobWFya3VwLCBmcm9tX2VuY29kaW5nKSk6CisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9mZWVkKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IFBhcnNlclJlamVjdGVkTWFya3VwOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIENsZWFyIG91dCB0aGUgbWFya3VwIGFuZCByZW1vdmUgdGhlIGJ1aWxkZXIncyBjaXJjdWxhcgorICAgICAgICAjIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdC4KKyAgICAgICAgc2VsZi5tYXJrdXAgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRlci5zb3VwID0gTm9uZQorCisgICAgZGVmIF9mZWVkKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgdGhlIGRvY3VtZW50IHRvIFVuaWNvZGUuCisgICAgICAgIHNlbGYuYnVpbGRlci5yZXNldCgpCisKKyAgICAgICAgc2VsZi5idWlsZGVyLmZlZWQoc2VsZi5tYXJrdXApCisgICAgICAgICMgQ2xvc2Ugb3V0IGFueSB1bmZpbmlzaGVkIHN0cmluZ3MgYW5kIGNsb3NlIGFsbCB0aGUgb3BlbiB0YWdzLgorICAgICAgICBzZWxmLmVuZERhdGEoKQorICAgICAgICB3aGlsZSBzZWxmLmN1cnJlbnRUYWcubmFtZSAhPSBzZWxmLlJPT1RfVEFHX05BTUU6CisgICAgICAgICAgICBzZWxmLnBvcFRhZygpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIFRhZy5fX2luaXRfXyhzZWxmLCBzZWxmLCBzZWxmLmJ1aWxkZXIsIHNlbGYuUk9PVF9UQUdfTkFNRSkKKyAgICAgICAgc2VsZi5oaWRkZW4gPSAxCisgICAgICAgIHNlbGYuYnVpbGRlci5yZXNldCgpCisgICAgICAgIHNlbGYuY3VycmVudF9kYXRhID0gW10KKyAgICAgICAgc2VsZi5jdXJyZW50VGFnID0gTm9uZQorICAgICAgICBzZWxmLnRhZ1N0YWNrID0gW10KKyAgICAgICAgc2VsZi5wcmVzZXJ2ZV93aGl0ZXNwYWNlX3RhZ19zdGFjayA9IFtdCisgICAgICAgIHNlbGYucHVzaFRhZyhzZWxmKQorCisgICAgZGVmIG5ld190YWcoc2VsZiwgbmFtZSwgbmFtZXNwYWNlPU5vbmUsIG5zcHJlZml4PU5vbmUsICoqYXR0cnMpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvdXAuIiIiCisgICAgICAgIHJldHVybiBUYWcoTm9uZSwgc2VsZi5idWlsZGVyLCBuYW1lLCBuYW1lc3BhY2UsIG5zcHJlZml4LCBhdHRycykKKworICAgIGRlZiBuZXdfc3RyaW5nKHNlbGYsIHMsIHN1YmNsYXNzPU5hdmlnYWJsZVN0cmluZyk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBOYXZpZ2FibGVTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc291cC4iIiIKKyAgICAgICAgbmF2aWdhYmxlID0gc3ViY2xhc3MocykKKyAgICAgICAgbmF2aWdhYmxlLnNldHVwKCkKKyAgICAgICAgcmV0dXJuIG5hdmlnYWJsZQorCisgICAgZGVmIGluc2VydF9iZWZvcmUoc2VsZiwgc3VjY2Vzc29yKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiQmVhdXRpZnVsU291cCBvYmplY3RzIGRvbid0IHN1cHBvcnQgaW5zZXJ0X2JlZm9yZSgpLiIpCisKKyAgICBkZWYgaW5zZXJ0X2FmdGVyKHNlbGYsIHN1Y2Nlc3Nvcik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIkJlYXV0aWZ1bFNvdXAgb2JqZWN0cyBkb24ndCBzdXBwb3J0IGluc2VydF9hZnRlcigpLiIpCisKKyAgICBkZWYgcG9wVGFnKHNlbGYpOgorICAgICAgICB0YWcgPSBzZWxmLnRhZ1N0YWNrLnBvcCgpCisgICAgICAgIGlmIHNlbGYucHJlc2VydmVfd2hpdGVzcGFjZV90YWdfc3RhY2sgYW5kIHRhZyA9PSBzZWxmLnByZXNlcnZlX3doaXRlc3BhY2VfdGFnX3N0YWNrWy0xXToKKyAgICAgICAgICAgIHNlbGYucHJlc2VydmVfd2hpdGVzcGFjZV90YWdfc3RhY2sucG9wKCkKKyAgICAgICAgI3ByaW50ICJQb3AiLCB0YWcubmFtZQorICAgICAgICBpZiBzZWxmLnRhZ1N0YWNrOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50VGFnID0gc2VsZi50YWdTdGFja1stMV0KKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudFRhZworCisgICAgZGVmIHB1c2hUYWcoc2VsZiwgdGFnKToKKyAgICAgICAgI3ByaW50ICJQdXNoIiwgdGFnLm5hbWUKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50VGFnOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50VGFnLmNvbnRlbnRzLmFwcGVuZCh0YWcpCisgICAgICAgIHNlbGYudGFnU3RhY2suYXBwZW5kKHRhZykKKyAgICAgICAgc2VsZi5jdXJyZW50VGFnID0gc2VsZi50YWdTdGFja1stMV0KKyAgICAgICAgaWYgdGFnLm5hbWUgaW4gc2VsZi5idWlsZGVyLnByZXNlcnZlX3doaXRlc3BhY2VfdGFnczoKKyAgICAgICAgICAgIHNlbGYucHJlc2VydmVfd2hpdGVzcGFjZV90YWdfc3RhY2suYXBwZW5kKHRhZykKKworICAgIGRlZiBlbmREYXRhKHNlbGYsIGNvbnRhaW5lckNsYXNzPU5hdmlnYWJsZVN0cmluZyk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudF9kYXRhOgorICAgICAgICAgICAgY3VycmVudF9kYXRhID0gdScnLmpvaW4oc2VsZi5jdXJyZW50X2RhdGEpCisgICAgICAgICAgICAjIElmIHdoaXRlc3BhY2UgaXMgbm90IHByZXNlcnZlZCwgYW5kIHRoaXMgc3RyaW5nIGNvbnRhaW5zCisgICAgICAgICAgICAjIG5vdGhpbmcgYnV0IEFTQ0lJIHNwYWNlcywgcmVwbGFjZSBpdCB3aXRoIGEgc2luZ2xlIHNwYWNlCisgICAgICAgICAgICAjIG9yIG5ld2xpbmUuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5wcmVzZXJ2ZV93aGl0ZXNwYWNlX3RhZ19zdGFjazoKKyAgICAgICAgICAgICAgICBzdHJpcHBhYmxlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGZvciBpIGluIGN1cnJlbnRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgaWYgaSBub3QgaW4gc2VsZi5BU0NJSV9TUEFDRVM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcHBhYmxlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgc3RyaXBwYWJsZToKKyAgICAgICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiBjdXJyZW50X2RhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2RhdGEgPSAnXG4nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2RhdGEgPSAnICcKKworICAgICAgICAgICAgIyBSZXNldCB0aGUgZGF0YSBjb2xsZWN0b3IuCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZGF0YSA9IFtdCisKKyAgICAgICAgICAgICMgU2hvdWxkIHdlIGFkZCB0aGlzIHN0cmluZyB0byB0aGUgdHJlZSBhdCBhbGw/CisgICAgICAgICAgICBpZiBzZWxmLnBhcnNlX29ubHkgYW5kIGxlbihzZWxmLnRhZ1N0YWNrKSA8PSAxIGFuZCBcCisgICAgICAgICAgICAgICAgICAgKG5vdCBzZWxmLnBhcnNlX29ubHkudGV4dCBvciBcCisgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnBhcnNlX29ubHkuc2VhcmNoKGN1cnJlbnRfZGF0YSkpOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBvID0gY29udGFpbmVyQ2xhc3MoY3VycmVudF9kYXRhKQorICAgICAgICAgICAgc2VsZi5vYmplY3Rfd2FzX3BhcnNlZChvKQorCisgICAgZGVmIG9iamVjdF93YXNfcGFyc2VkKHNlbGYsIG8sIHBhcmVudD1Ob25lLCBtb3N0X3JlY2VudF9lbGVtZW50PU5vbmUpOgorICAgICAgICAiIiJBZGQgYW4gb2JqZWN0IHRvIHRoZSBwYXJzZSB0cmVlLiIiIgorICAgICAgICBwYXJlbnQgPSBwYXJlbnQgb3Igc2VsZi5jdXJyZW50VGFnCisgICAgICAgIG1vc3RfcmVjZW50X2VsZW1lbnQgPSBtb3N0X3JlY2VudF9lbGVtZW50IG9yIHNlbGYuX21vc3RfcmVjZW50X2VsZW1lbnQKKyAgICAgICAgby5zZXR1cChwYXJlbnQsIG1vc3RfcmVjZW50X2VsZW1lbnQpCisKKyAgICAgICAgaWYgbW9zdF9yZWNlbnRfZWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG1vc3RfcmVjZW50X2VsZW1lbnQubmV4dF9lbGVtZW50ID0gbworICAgICAgICBzZWxmLl9tb3N0X3JlY2VudF9lbGVtZW50ID0gbworICAgICAgICBwYXJlbnQuY29udGVudHMuYXBwZW5kKG8pCisKKyAgICBkZWYgX3BvcFRvVGFnKHNlbGYsIG5hbWUsIG5zcHJlZml4PU5vbmUsIGluY2x1c2l2ZVBvcD1UcnVlKToKKyAgICAgICAgIiIiUG9wcyB0aGUgdGFnIHN0YWNrIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIG1vc3QgcmVjZW50CisgICAgICAgIGluc3RhbmNlIG9mIHRoZSBnaXZlbiB0YWcuIElmIGluY2x1c2l2ZVBvcCBpcyBmYWxzZSwgcG9wcyB0aGUgdGFnCisgICAgICAgIHN0YWNrIHVwIHRvIGJ1dCAqbm90KiBpbmNsdWRpbmcgdGhlIG1vc3QgcmVjZW50IGluc3RxYW5jZSBvZgorICAgICAgICB0aGUgZ2l2ZW4gdGFnLiIiIgorICAgICAgICAjcHJpbnQgIlBvcHBpbmcgdG8gJXMiICUgbmFtZQorICAgICAgICBpZiBuYW1lID09IHNlbGYuUk9PVF9UQUdfTkFNRToKKyAgICAgICAgICAgICMgVGhlIEJlYXV0aWZ1bFNvdXAgb2JqZWN0IGl0c2VsZiBjYW4gbmV2ZXIgYmUgcG9wcGVkLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbW9zdF9yZWNlbnRseV9wb3BwZWQgPSBOb25lCisKKyAgICAgICAgc3RhY2tfc2l6ZSA9IGxlbihzZWxmLnRhZ1N0YWNrKQorICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFja19zaXplIC0gMSwgMCwgLTEpOgorICAgICAgICAgICAgdCA9IHNlbGYudGFnU3RhY2tbaV0KKyAgICAgICAgICAgIGlmIChuYW1lID09IHQubmFtZSBhbmQgbnNwcmVmaXggPT0gdC5wcmVmaXgpOgorICAgICAgICAgICAgICAgIGlmIGluY2x1c2l2ZVBvcDoKKyAgICAgICAgICAgICAgICAgICAgbW9zdF9yZWNlbnRseV9wb3BwZWQgPSBzZWxmLnBvcFRhZygpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG1vc3RfcmVjZW50bHlfcG9wcGVkID0gc2VsZi5wb3BUYWcoKQorCisgICAgICAgIHJldHVybiBtb3N0X3JlY2VudGx5X3BvcHBlZAorCisgICAgZGVmIGhhbmRsZV9zdGFydHRhZyhzZWxmLCBuYW1lLCBuYW1lc3BhY2UsIG5zcHJlZml4LCBhdHRycyk6CisgICAgICAgICIiIlB1c2ggYSBzdGFydCB0YWcgb24gdG8gdGhlIHN0YWNrLgorCisgICAgICAgIElmIHRoaXMgbWV0aG9kIHJldHVybnMgTm9uZSwgdGhlIHRhZyB3YXMgcmVqZWN0ZWQgYnkgdGhlCisgICAgICAgIFNvdXBTdHJhaW5lci4gWW91IHNob3VsZCBwcm9jZWVkIGFzIGlmIHRoZSB0YWcgaGFkIG5vdCBvY2N1cmVkCisgICAgICAgIGluIHRoZSBkb2N1bWVudC4gRm9yIGluc3RhbmNlLCBpZiB0aGlzIHdhcyBhIHNlbGYtY2xvc2luZyB0YWcsCisgICAgICAgIGRvbid0IGNhbGwgaGFuZGxlX2VuZHRhZy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBwcmludCAiU3RhcnQgdGFnICVzOiAlcyIgJSAobmFtZSwgYXR0cnMpCisgICAgICAgIHNlbGYuZW5kRGF0YSgpCisKKyAgICAgICAgaWYgKHNlbGYucGFyc2Vfb25seSBhbmQgbGVuKHNlbGYudGFnU3RhY2spIDw9IDEKKyAgICAgICAgICAgIGFuZCAoc2VsZi5wYXJzZV9vbmx5LnRleHQKKyAgICAgICAgICAgICAgICAgb3Igbm90IHNlbGYucGFyc2Vfb25seS5zZWFyY2hfdGFnKG5hbWUsIGF0dHJzKSkpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICB0YWcgPSBUYWcoc2VsZiwgc2VsZi5idWlsZGVyLCBuYW1lLCBuYW1lc3BhY2UsIG5zcHJlZml4LCBhdHRycywKKyAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudFRhZywgc2VsZi5fbW9zdF9yZWNlbnRfZWxlbWVudCkKKyAgICAgICAgaWYgdGFnIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdGFnCisgICAgICAgIGlmIHNlbGYuX21vc3RfcmVjZW50X2VsZW1lbnQ6CisgICAgICAgICAgICBzZWxmLl9tb3N0X3JlY2VudF9lbGVtZW50Lm5leHRfZWxlbWVudCA9IHRhZworICAgICAgICBzZWxmLl9tb3N0X3JlY2VudF9lbGVtZW50ID0gdGFnCisgICAgICAgIHNlbGYucHVzaFRhZyh0YWcpCisgICAgICAgIHJldHVybiB0YWcKKworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIG5hbWUsIG5zcHJlZml4PU5vbmUpOgorICAgICAgICAjcHJpbnQgIkVuZCB0YWc6ICIgKyBuYW1lCisgICAgICAgIHNlbGYuZW5kRGF0YSgpCisgICAgICAgIHNlbGYuX3BvcFRvVGFnKG5hbWUsIG5zcHJlZml4KQorCisgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmN1cnJlbnRfZGF0YS5hcHBlbmQoZGF0YSkKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgcHJldHR5X3ByaW50PUZhbHNlLAorICAgICAgICAgICAgICAgZXZlbnR1YWxfZW5jb2Rpbmc9REVGQVVMVF9PVVRQVVRfRU5DT0RJTkcsCisgICAgICAgICAgICAgICBmb3JtYXR0ZXI9Im1pbmltYWwiKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHN0cmluZyBvciBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCisgICAgICAgIFRvIGdldCBVbmljb2RlLCBwYXNzIE5vbmUgZm9yIGVuY29kaW5nLiIiIgorCisgICAgICAgIGlmIHNlbGYuaXNfeG1sOgorICAgICAgICAgICAgIyBQcmludCB0aGUgWE1MIGRlY2xhcmF0aW9uCisgICAgICAgICAgICBlbmNvZGluZ19wYXJ0ID0gJycKKyAgICAgICAgICAgIGlmIGV2ZW50dWFsX2VuY29kaW5nICE9IE5vbmU6CisgICAgICAgICAgICAgICAgZW5jb2RpbmdfcGFydCA9ICcgZW5jb2Rpbmc9IiVzIicgJSBldmVudHVhbF9lbmNvZGluZworICAgICAgICAgICAgcHJlZml4ID0gdSc8P3htbCB2ZXJzaW9uPSIxLjAiJXM/PlxuJyAlIGVuY29kaW5nX3BhcnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByZWZpeCA9IHUnJworICAgICAgICBpZiBub3QgcHJldHR5X3ByaW50OgorICAgICAgICAgICAgaW5kZW50X2xldmVsID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5kZW50X2xldmVsID0gMAorICAgICAgICByZXR1cm4gcHJlZml4ICsgc3VwZXIoQmVhdXRpZnVsU291cCwgc2VsZikuZGVjb2RlKAorICAgICAgICAgICAgaW5kZW50X2xldmVsLCBldmVudHVhbF9lbmNvZGluZywgZm9ybWF0dGVyKQorCisjIEFsaWFzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHR5cGUgaW1wb3J0OiAnZnJvbSBiczQgaW1wb3J0IF9zb3VwJworX3MgPSBCZWF1dGlmdWxTb3VwCitfc291cCA9IEJlYXV0aWZ1bFNvdXAKKworY2xhc3MgQmVhdXRpZnVsU3RvbmVTb3VwKEJlYXV0aWZ1bFNvdXApOgorICAgICIiIkRlcHJlY2F0ZWQgaW50ZXJmYWNlIHRvIGFuIFhNTCBwYXJzZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAga3dhcmdzWydmZWF0dXJlcyddID0gJ3htbCcKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICdUaGUgQmVhdXRpZnVsU3RvbmVTb3VwIGNsYXNzIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgb2YgdXNpbmcgJworICAgICAgICAgICAgJ2l0LCBwYXNzIGZlYXR1cmVzPSJ4bWwiIGludG8gdGhlIEJlYXV0aWZ1bFNvdXAgY29uc3RydWN0b3IuJykKKyAgICAgICAgc3VwZXIoQmVhdXRpZnVsU3RvbmVTb3VwLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisKKworY2xhc3MgU3RvcFBhcnNpbmcoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIEZlYXR1cmVOb3RGb3VuZChWYWx1ZUVycm9yKToKKyAgICBwYXNzCisKKworI0J5IGRlZmF1bHQsIGFjdCBhcyBhbiBIVE1MIHByZXR0eS1wcmludGVyLgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzCisgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAoc3lzLnN0ZGluKQorICAgIHByaW50IHNvdXAucHJldHRpZnkoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDBmNWYyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMjEgQEAKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgc3lzCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCAoCisgICAgQ2hhcnNldE1ldGFBdHRyaWJ1dGVWYWx1ZSwKKyAgICBDb250ZW50TWV0YUF0dHJpYnV0ZVZhbHVlLAorICAgIHdoaXRlc3BhY2VfcmUKKyAgICApCisKK19fYWxsX18gPSBbCisgICAgJ0hUTUxUcmVlQnVpbGRlcicsCisgICAgJ1NBWFRyZWVCdWlsZGVyJywKKyAgICAnVHJlZUJ1aWxkZXInLAorICAgICdUcmVlQnVpbGRlclJlZ2lzdHJ5JywKKyAgICBdCisKKyMgU29tZSB1c2VmdWwgZmVhdHVyZXMgZm9yIGEgVHJlZUJ1aWxkZXIgdG8gaGF2ZS4KK0ZBU1QgPSAnZmFzdCcKK1BFUk1JU1NJVkUgPSAncGVybWlzc2l2ZScKK1NUUklDVCA9ICdzdHJpY3QnCitYTUwgPSAneG1sJworSFRNTCA9ICdodG1sJworSFRNTF81ID0gJ2h0bWw1JworCisKK2NsYXNzIFRyZWVCdWlsZGVyUmVnaXN0cnkob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZGVyc19mb3JfZmVhdHVyZSA9IGRlZmF1bHRkaWN0KGxpc3QpCisgICAgICAgIHNlbGYuYnVpbGRlcnMgPSBbXQorCisgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIHRyZWVidWlsZGVyX2NsYXNzKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYSB0cmVlYnVpbGRlciBiYXNlZCBvbiBpdHMgYWR2ZXJ0aXNlZCBmZWF0dXJlcy4iIiIKKyAgICAgICAgZm9yIGZlYXR1cmUgaW4gdHJlZWJ1aWxkZXJfY2xhc3MuZmVhdHVyZXM6CisgICAgICAgICAgICBzZWxmLmJ1aWxkZXJzX2Zvcl9mZWF0dXJlW2ZlYXR1cmVdLmluc2VydCgwLCB0cmVlYnVpbGRlcl9jbGFzcykKKyAgICAgICAgc2VsZi5idWlsZGVycy5pbnNlcnQoMCwgdHJlZWJ1aWxkZXJfY2xhc3MpCisKKyAgICBkZWYgbG9va3VwKHNlbGYsICpmZWF0dXJlcyk6CisgICAgICAgIGlmIGxlbihzZWxmLmJ1aWxkZXJzKSA9PSAwOgorICAgICAgICAgICAgIyBUaGVyZSBhcmUgbm8gYnVpbGRlcnMgYXQgYWxsLgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBsZW4oZmVhdHVyZXMpID09IDA6CisgICAgICAgICAgICAjIFRoZXkgZGlkbid0IGFzayBmb3IgYW55IGZlYXR1cmVzLiBHaXZlIHRoZW0gdGhlIG1vc3QKKyAgICAgICAgICAgICMgcmVjZW50bHkgcmVnaXN0ZXJlZCBidWlsZGVyLgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRlcnNbMF0KKworICAgICAgICAjIEdvIGRvd24gdGhlIGxpc3Qgb2YgZmVhdHVyZXMgaW4gb3JkZXIsIGFuZCBlbGltaW5hdGUgYW55IGJ1aWxkZXJzCisgICAgICAgICMgdGhhdCBkb24ndCBtYXRjaCBldmVyeSBmZWF0dXJlLgorICAgICAgICBmZWF0dXJlcyA9IGxpc3QoZmVhdHVyZXMpCisgICAgICAgIGZlYXR1cmVzLnJldmVyc2UoKQorICAgICAgICBjYW5kaWRhdGVzID0gTm9uZQorICAgICAgICBjYW5kaWRhdGVfc2V0ID0gTm9uZQorICAgICAgICB3aGlsZSBsZW4oZmVhdHVyZXMpID4gMDoKKyAgICAgICAgICAgIGZlYXR1cmUgPSBmZWF0dXJlcy5wb3AoKQorICAgICAgICAgICAgd2VfaGF2ZV90aGVfZmVhdHVyZSA9IHNlbGYuYnVpbGRlcnNfZm9yX2ZlYXR1cmUuZ2V0KGZlYXR1cmUsIFtdKQorICAgICAgICAgICAgaWYgbGVuKHdlX2hhdmVfdGhlX2ZlYXR1cmUpID4gMDoKKyAgICAgICAgICAgICAgICBpZiBjYW5kaWRhdGVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSB3ZV9oYXZlX3RoZV9mZWF0dXJlCisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZV9zZXQgPSBzZXQoY2FuZGlkYXRlcykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEVsaW1pbmF0ZSBhbnkgY2FuZGlkYXRlcyB0aGF0IGRvbid0IGhhdmUgdGhpcyBmZWF0dXJlLgorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVfc2V0ID0gY2FuZGlkYXRlX3NldC5pbnRlcnNlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQod2VfaGF2ZV90aGVfZmVhdHVyZSkpCisKKyAgICAgICAgIyBUaGUgb25seSB2YWxpZCBjYW5kaWRhdGVzIGFyZSB0aGUgb25lcyBpbiBjYW5kaWRhdGVfc2V0LgorICAgICAgICAjIEdvIHRocm91Z2ggdGhlIG9yaWdpbmFsIGxpc3Qgb2YgY2FuZGlkYXRlcyBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgICAgICMgdGhhdCdzIGluIGNhbmRpZGF0ZV9zZXQuCisgICAgICAgIGlmIGNhbmRpZGF0ZV9zZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGZvciBjYW5kaWRhdGUgaW4gY2FuZGlkYXRlczoKKyAgICAgICAgICAgIGlmIGNhbmRpZGF0ZSBpbiBjYW5kaWRhdGVfc2V0OgorICAgICAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyBUaGUgQmVhdXRpZnVsU291cCBjbGFzcyB3aWxsIHRha2UgZmVhdHVyZSBsaXN0cyBmcm9tIGRldmVsb3BlcnMgYW5kIHVzZSB0aGVtCisjIHRvIGxvb2sgdXAgYnVpbGRlcnMgaW4gdGhpcyByZWdpc3RyeS4KK2J1aWxkZXJfcmVnaXN0cnkgPSBUcmVlQnVpbGRlclJlZ2lzdHJ5KCkKKworY2xhc3MgVHJlZUJ1aWxkZXIob2JqZWN0KToKKyAgICAiIiJUdXJuIGEgZG9jdW1lbnQgaW50byBhIEJlYXV0aWZ1bCBTb3VwIG9iamVjdCB0cmVlLiIiIgorCisgICAgZmVhdHVyZXMgPSBbXQorCisgICAgaXNfeG1sID0gRmFsc2UKKyAgICBwcmVzZXJ2ZV93aGl0ZXNwYWNlX3RhZ3MgPSBzZXQoKQorICAgIGVtcHR5X2VsZW1lbnRfdGFncyA9IE5vbmUgIyBBIHRhZyB3aWxsIGJlIGNvbnNpZGVyZWQgYW4gZW1wdHktZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YWcgd2hlbiBhbmQgb25seSB3aGVuIGl0IGhhcyBubyBjb250ZW50cy4KKworICAgICMgQSB2YWx1ZSBmb3IgdGhlc2UgdGFnL2F0dHJpYnV0ZSBjb21iaW5hdGlvbnMgaXMgYSBzcGFjZS0gb3IKKyAgICAjIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIENEQVRBLCByYXRoZXIgdGhhbiBhIHNpbmdsZSBDREFUQS4KKyAgICBjZGF0YV9saXN0X2F0dHJpYnV0ZXMgPSB7fQorCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc291cCA9IE5vbmUKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNhbl9iZV9lbXB0eV9lbGVtZW50KHNlbGYsIHRhZ19uYW1lKToKKyAgICAgICAgIiIiTWlnaHQgYSB0YWcgd2l0aCB0aGlzIG5hbWUgYmUgYW4gZW1wdHktZWxlbWVudCB0YWc/CisKKyAgICAgICAgVGhlIGZpbmFsIG1hcmt1cCBtYXkgb3IgbWF5IG5vdCBhY3R1YWxseSBwcmVzZW50IHRoaXMgdGFnIGFzCisgICAgICAgIHNlbGYtY2xvc2luZy4KKworICAgICAgICBGb3IgaW5zdGFuY2U6IGFuIEhUTUxCdWlsZGVyIGRvZXMgbm90IGNvbnNpZGVyIGEgPHA+IHRhZyB0byBiZQorICAgICAgICBhbiBlbXB0eS1lbGVtZW50IHRhZyAoaXQncyBub3QgaW4KKyAgICAgICAgSFRNTEJ1aWxkZXIuZW1wdHlfZWxlbWVudF90YWdzKS4gVGhpcyBtZWFucyBhbiBlbXB0eSA8cD4gdGFnCisgICAgICAgIHdpbGwgYmUgcHJlc2VudGVkIGFzICI8cD48L3A+Iiwgbm90ICI8cCAvPiIuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaGFzIG5vIG9waW5pb24gYWJvdXQgd2hpY2ggdGFncyBhcmUKKyAgICAgICAgZW1wdHktZWxlbWVudCB0YWdzLCBzbyBhIHRhZyB3aWxsIGJlIHByZXNlbnRlZCBhcyBhbgorICAgICAgICBlbXB0eS1lbGVtZW50IHRhZyBpZiBhbmQgb25seSBpZiBpdCBoYXMgbm8gY29udGVudHMuCisgICAgICAgICI8Zm9vPjwvZm9vPiIgd2lsbCBiZWNvbWUgIjxmb28gLz4iLCBhbmQgIjxmb28+YmFyPC9mb28+IiB3aWxsCisgICAgICAgIGJlIGxlZnQgYWxvbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmVtcHR5X2VsZW1lbnRfdGFncyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIHRhZ19uYW1lIGluIHNlbGYuZW1wdHlfZWxlbWVudF90YWdzCisKKyAgICBkZWYgZmVlZChzZWxmLCBtYXJrdXApOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBwcmVwYXJlX21hcmt1cChzZWxmLCBtYXJrdXAsIHVzZXJfc3BlY2lmaWVkX2VuY29kaW5nPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50X2RlY2xhcmVkX2VuY29kaW5nPU5vbmUpOgorICAgICAgICByZXR1cm4gbWFya3VwLCBOb25lLCBOb25lLCBGYWxzZQorCisgICAgZGVmIHRlc3RfZnJhZ21lbnRfdG9fZG9jdW1lbnQoc2VsZiwgZnJhZ21lbnQpOgorICAgICAgICAiIiJXcmFwIGFuIEhUTUwgZnJhZ21lbnQgdG8gbWFrZSBpdCBsb29rIGxpa2UgYSBkb2N1bWVudC4KKworICAgICAgICBEaWZmZXJlbnQgcGFyc2VycyBkbyB0aGlzIGRpZmZlcmVudGx5LiBGb3IgaW5zdGFuY2UsIGx4bWwKKyAgICAgICAgaW50cm9kdWNlcyBhbiBlbXB0eSA8aGVhZD4gdGFnLCBhbmQgaHRtbDVsaWIKKyAgICAgICAgZG9lc24ndC4gQWJzdHJhY3RpbmcgdGhpcyBhd2F5IGxldHMgdXMgd3JpdGUgc2ltcGxlIHRlc3RzCisgICAgICAgIHdoaWNoIHJ1biBIVE1MIGZyYWdtZW50cyB0aHJvdWdoIHRoZSBwYXJzZXIgYW5kIGNvbXBhcmUgdGhlCisgICAgICAgIHJlc3VsdHMgYWdhaW5zdCBvdGhlciBIVE1MIGZyYWdtZW50cy4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiB0ZXN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBmcmFnbWVudAorCisgICAgZGVmIHNldF91cF9zdWJzdGl0dXRpb25zKHNlbGYsIHRhZyk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9yZXBsYWNlX2NkYXRhX2xpc3RfYXR0cmlidXRlX3ZhbHVlcyhzZWxmLCB0YWdfbmFtZSwgYXR0cnMpOgorICAgICAgICAiIiJSZXBsYWNlcyBjbGFzcz0iZm9vIGJhciIgd2l0aCBjbGFzcz1bImZvbyIsICJiYXIiXQorCisgICAgICAgIE1vZGlmaWVzIGl0cyBpbnB1dCBpbiBwbGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBhdHRyczoKKyAgICAgICAgICAgIHJldHVybiBhdHRycworICAgICAgICBpZiBzZWxmLmNkYXRhX2xpc3RfYXR0cmlidXRlczoKKyAgICAgICAgICAgIHVuaXZlcnNhbCA9IHNlbGYuY2RhdGFfbGlzdF9hdHRyaWJ1dGVzLmdldCgnKicsIFtdKQorICAgICAgICAgICAgdGFnX3NwZWNpZmljID0gc2VsZi5jZGF0YV9saXN0X2F0dHJpYnV0ZXMuZ2V0KAorICAgICAgICAgICAgICAgIHRhZ19uYW1lLmxvd2VyKCksIE5vbmUpCisgICAgICAgICAgICBmb3IgYXR0ciBpbiBhdHRycy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgYXR0ciBpbiB1bml2ZXJzYWwgb3IgKHRhZ19zcGVjaWZpYyBhbmQgYXR0ciBpbiB0YWdfc3BlY2lmaWMpOgorICAgICAgICAgICAgICAgICAgICAjIFdlIGhhdmUgYSAiY2xhc3MiLXR5cGUgYXR0cmlidXRlIHdob3NlIHN0cmluZworICAgICAgICAgICAgICAgICAgICAjIHZhbHVlIGlzIGEgd2hpdGVzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICAjIHZhbHVlcy4gU3BsaXQgaXQgaW50byBhIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbYXR0cl0KKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB3aGl0ZXNwYWNlX3JlLnNwbGl0KHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBodG1sNWxpYiBzb21ldGltZXMgY2FsbHMgc2V0QXR0cmlidXRlcyB0d2ljZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIHNhbWUgdGFnIHdoZW4gcmVhcnJhbmdpbmcgdGhlIHBhcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRyZWUuIE9uIHRoZSBzZWNvbmQgY2FsbCB0aGUgYXR0cmlidXRlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGhlcmUgaXMgYWxyZWFkeSBhIGxpc3QuICBJZiB0aGlzIGhhcHBlbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAjIGxlYXZlIHRoZSB2YWx1ZSBhbG9uZSByYXRoZXIgdGhhbiB0cnlpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3BsaXQgaXQgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBhdHRyc1thdHRyXSA9IHZhbHVlcworICAgICAgICByZXR1cm4gYXR0cnMKKworY2xhc3MgU0FYVHJlZUJ1aWxkZXIoVHJlZUJ1aWxkZXIpOgorICAgICIiIkEgQmVhdXRpZnVsIFNvdXAgdHJlZWJ1aWxkZXIgdGhhdCBsaXN0ZW5zIGZvciBTQVggZXZlbnRzLiIiIgorCisgICAgZGVmIGZlZWQoc2VsZiwgbWFya3VwKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICBhdHRycyA9IGRpY3QoKGtleVsxXSwgdmFsdWUpIGZvciBrZXksIHZhbHVlIGluIGxpc3QoYXR0cnMuaXRlbXMoKSkpCisgICAgICAgICNwcmludCAiU3RhcnQgJXMsICVyIiAlIChuYW1lLCBhdHRycykKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9zdGFydHRhZyhuYW1lLCBhdHRycykKKworICAgIGRlZiBlbmRFbGVtZW50KHNlbGYsIG5hbWUpOgorICAgICAgICAjcHJpbnQgIkVuZCAlcyIgJSBuYW1lCisgICAgICAgIHNlbGYuc291cC5oYW5kbGVfZW5kdGFnKG5hbWUpCisKKyAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbnNUdXBsZSwgbm9kZU5hbWUsIGF0dHJzKToKKyAgICAgICAgIyBUaHJvdyBhd2F5IChucywgbm9kZU5hbWUpIGZvciBub3cuCisgICAgICAgIHNlbGYuc3RhcnRFbGVtZW50KG5vZGVOYW1lLCBhdHRycykKKworICAgIGRlZiBlbmRFbGVtZW50TlMoc2VsZiwgbnNUdXBsZSwgbm9kZU5hbWUpOgorICAgICAgICAjIFRocm93IGF3YXkgKG5zLCBub2RlTmFtZSkgZm9yIG5vdy4KKyAgICAgICAgc2VsZi5lbmRFbGVtZW50KG5vZGVOYW1lKQorICAgICAgICAjaGFuZGxlci5lbmRFbGVtZW50TlMoKG5zLCBub2RlLm5vZGVOYW1lKSwgbm9kZS5ub2RlTmFtZSkKKworICAgIGRlZiBzdGFydFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4LCBub2RlVmFsdWUpOgorICAgICAgICAjIElnbm9yZSB0aGUgcHJlZml4IGZvciBub3cuCisgICAgICAgIHBhc3MKKworICAgIGRlZiBlbmRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCk6CisgICAgICAgICMgSWdub3JlIHRoZSBwcmVmaXggZm9yIG5vdy4KKyAgICAgICAgIyBoYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KQorICAgICAgICBwYXNzCisKKyAgICBkZWYgY2hhcmFjdGVycyhzZWxmLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGNvbnRlbnQpCisKKyAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGVuZERvY3VtZW50KHNlbGYpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgSFRNTFRyZWVCdWlsZGVyKFRyZWVCdWlsZGVyKToKKyAgICAiIiJUaGlzIFRyZWVCdWlsZGVyIGtub3dzIGZhY3RzIGFib3V0IEhUTUwuCisKKyAgICBTdWNoIGFzIHdoaWNoIHRhZ3MgYXJlIGVtcHR5LWVsZW1lbnQgdGFncy4KKyAgICAiIiIKKworICAgIHByZXNlcnZlX3doaXRlc3BhY2VfdGFncyA9IHNldChbJ3ByZScsICd0ZXh0YXJlYSddKQorICAgIGVtcHR5X2VsZW1lbnRfdGFncyA9IHNldChbJ2JyJyAsICdocicsICdpbnB1dCcsICdpbWcnLCAnbWV0YScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BhY2VyJywgJ2xpbmsnLCAnZnJhbWUnLCAnYmFzZSddKQorCisgICAgIyBUaGUgSFRNTCBzdGFuZGFyZCBkZWZpbmVzIHRoZXNlIGF0dHJpYnV0ZXMgYXMgY29udGFpbmluZyBhCisgICAgIyBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMsIG5vdCBhIHNpbmdsZSB2YWx1ZS4gVGhhdCBpcywKKyAgICAjIGNsYXNzPSJmb28gYmFyIiBtZWFucyB0aGF0IHRoZSAnY2xhc3MnIGF0dHJpYnV0ZSBoYXMgdHdvIHZhbHVlcywKKyAgICAjICdmb28nIGFuZCAnYmFyJywgbm90IHRoZSBzaW5nbGUgdmFsdWUgJ2ZvbyBiYXInLiAgV2hlbiB3ZQorICAgICMgZW5jb3VudGVyIG9uZSBvZiB0aGVzZSBhdHRyaWJ1dGVzLCB3ZSB3aWxsIHBhcnNlIGl0cyB2YWx1ZSBpbnRvCisgICAgIyBhIGxpc3Qgb2YgdmFsdWVzIGlmIHBvc3NpYmxlLiBVcG9uIG91dHB1dCwgdGhlIGxpc3Qgd2lsbCBiZQorICAgICMgY29udmVydGVkIGJhY2sgaW50byBhIHN0cmluZy4KKyAgICBjZGF0YV9saXN0X2F0dHJpYnV0ZXMgPSB7CisgICAgICAgICIqIiA6IFsnY2xhc3MnLCAnYWNjZXNza2V5JywgJ2Ryb3B6b25lJ10sCisgICAgICAgICJhIiA6IFsncmVsJywgJ3JldiddLAorICAgICAgICAibGluayIgOiAgWydyZWwnLCAncmV2J10sCisgICAgICAgICJ0ZCIgOiBbImhlYWRlcnMiXSwKKyAgICAgICAgInRoIiA6IFsiaGVhZGVycyJdLAorICAgICAgICAidGQiIDogWyJoZWFkZXJzIl0sCisgICAgICAgICJmb3JtIiA6IFsiYWNjZXB0LWNoYXJzZXQiXSwKKyAgICAgICAgIm9iamVjdCIgOiBbImFyY2hpdmUiXSwKKworICAgICAgICAjIFRoZXNlIGFyZSBIVE1MNSBzcGVjaWZpYywgYXMgYXJlICouYWNjZXNza2V5IGFuZCAqLmRyb3B6b25lIGFib3ZlLgorICAgICAgICAiYXJlYSIgOiBbInJlbCJdLAorICAgICAgICAiaWNvbiIgOiBbInNpemVzIl0sCisgICAgICAgICJpZnJhbWUiIDogWyJzYW5kYm94Il0sCisgICAgICAgICJvdXRwdXQiIDogWyJmb3IiXSwKKyAgICAgICAgfQorCisgICAgZGVmIHNldF91cF9zdWJzdGl0dXRpb25zKHNlbGYsIHRhZyk6CisgICAgICAgICMgV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiA8bWV0YT4gdGFncworICAgICAgICBpZiB0YWcubmFtZSAhPSAnbWV0YSc6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBodHRwX2VxdWl2ID0gdGFnLmdldCgnaHR0cC1lcXVpdicpCisgICAgICAgIGNvbnRlbnQgPSB0YWcuZ2V0KCdjb250ZW50JykKKyAgICAgICAgY2hhcnNldCA9IHRhZy5nZXQoJ2NoYXJzZXQnKQorCisgICAgICAgICMgV2UgYXJlIGludGVyZXN0ZWQgaW4gPG1ldGE+IHRhZ3MgdGhhdCBzYXkgd2hhdCBlbmNvZGluZyB0aGUKKyAgICAgICAgIyBkb2N1bWVudCB3YXMgb3JpZ2luYWxseSBpbi4gVGhpcyBtZWFucyBIVE1MIDUtc3R5bGUgPG1ldGE+CisgICAgICAgICMgdGFncyB0aGF0IHByb3ZpZGUgdGhlICJjaGFyc2V0IiBhdHRyaWJ1dGUuIEl0IGFsc28gbWVhbnMKKyAgICAgICAgIyBIVE1MIDQtc3R5bGUgPG1ldGE+IHRhZ3MgdGhhdCBwcm92aWRlIHRoZSAiY29udGVudCIKKyAgICAgICAgIyBhdHRyaWJ1dGUgYW5kIGhhdmUgImh0dHAtZXF1aXYiIHNldCB0byAiY29udGVudC10eXBlIi4KKyAgICAgICAgIworICAgICAgICAjIEluIGJvdGggY2FzZXMgd2Ugd2lsbCByZXBsYWNlIHRoZSB2YWx1ZSBvZiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgIyBhdHRyaWJ1dGUgd2l0aCBhIHN0YW5kaW4gb2JqZWN0IHRoYXQgY2FuIHRha2Ugb24gYW55CisgICAgICAgICMgZW5jb2RpbmcuCisgICAgICAgIG1ldGFfZW5jb2RpbmcgPSBOb25lCisgICAgICAgIGlmIGNoYXJzZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIEhUTUwgNSBzdHlsZToKKyAgICAgICAgICAgICMgPG1ldGEgY2hhcnNldD0idXRmOCI+CisgICAgICAgICAgICBtZXRhX2VuY29kaW5nID0gY2hhcnNldAorICAgICAgICAgICAgdGFnWydjaGFyc2V0J10gPSBDaGFyc2V0TWV0YUF0dHJpYnV0ZVZhbHVlKGNoYXJzZXQpCisKKyAgICAgICAgZWxpZiAoY29udGVudCBpcyBub3QgTm9uZSBhbmQgaHR0cF9lcXVpdiBpcyBub3QgTm9uZQorICAgICAgICAgICAgICBhbmQgaHR0cF9lcXVpdi5sb3dlcigpID09ICdjb250ZW50LXR5cGUnKToKKyAgICAgICAgICAgICMgSFRNTCA0IHN0eWxlOgorICAgICAgICAgICAgIyA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGY4Ij4KKyAgICAgICAgICAgIHRhZ1snY29udGVudCddID0gQ29udGVudE1ldGFBdHRyaWJ1dGVWYWx1ZShjb250ZW50KQorCisgICAgICAgIHJldHVybiAobWV0YV9lbmNvZGluZyBpcyBub3QgTm9uZSkKKworZGVmIHJlZ2lzdGVyX3RyZWVidWlsZGVyc19mcm9tKG1vZHVsZSk6CisgICAgIiIiQ29weSBUcmVlQnVpbGRlcnMgZnJvbSB0aGUgZ2l2ZW4gbW9kdWxlIGludG8gdGhpcyBtb2R1bGUuIiIiCisgICAgIyBJJ20gZmFpcmx5IHN1cmUgdGhpcyBpcyBub3QgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMuCisgICAgdGhpc19tb2R1bGUgPSBzeXMubW9kdWxlc1snYnM0LmJ1aWxkZXInXQorICAgIGZvciBuYW1lIGluIG1vZHVsZS5fX2FsbF9fOgorICAgICAgICBvYmogPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKKworICAgICAgICBpZiBpc3N1YmNsYXNzKG9iaiwgVHJlZUJ1aWxkZXIpOgorICAgICAgICAgICAgc2V0YXR0cih0aGlzX21vZHVsZSwgbmFtZSwgb2JqKQorICAgICAgICAgICAgdGhpc19tb2R1bGUuX19hbGxfXy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICMgUmVnaXN0ZXIgdGhlIGJ1aWxkZXIgd2hpbGUgd2UncmUgYXQgaXQuCisgICAgICAgICAgICB0aGlzX21vZHVsZS5idWlsZGVyX3JlZ2lzdHJ5LnJlZ2lzdGVyKG9iaikKKworY2xhc3MgUGFyc2VyUmVqZWN0ZWRNYXJrdXAoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKyMgQnVpbGRlcnMgYXJlIHJlZ2lzdGVyZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiBwcmlvcml0eSwgc28gdGhhdCBjdXN0b20KKyMgYnVpbGRlciByZWdpc3RyYXRpb25zIHdpbGwgdGFrZSBwcmVjZWRlbmNlLiBJbiBnZW5lcmFsLCB3ZSB3YW50IGx4bWwKKyMgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgaHRtbDVsaWIsIGJlY2F1c2UgaXQncyBmYXN0ZXIuIEFuZCB3ZSBvbmx5CisjIHdhbnQgdG8gdXNlIEhUTUxQYXJzZXIgYXMgYSBsYXN0IHJlc3VsdC4KK2Zyb20gLiBpbXBvcnQgX2h0bWxwYXJzZXIKK3JlZ2lzdGVyX3RyZWVidWlsZGVyc19mcm9tKF9odG1scGFyc2VyKQordHJ5OgorICAgIGZyb20gLiBpbXBvcnQgX2h0bWw1bGliCisgICAgcmVnaXN0ZXJfdHJlZWJ1aWxkZXJzX2Zyb20oX2h0bWw1bGliKQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgVGhleSBkb24ndCBoYXZlIGh0bWw1bGliIGluc3RhbGxlZC4KKyAgICBwYXNzCit0cnk6CisgICAgZnJvbSAuIGltcG9ydCBfbHhtbAorICAgIHJlZ2lzdGVyX3RyZWVidWlsZGVyc19mcm9tKF9seG1sKQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgVGhleSBkb24ndCBoYXZlIGx4bWwgaW5zdGFsbGVkLgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19odG1sNWxpYi5weSBiL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19odG1sNWxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUzNmFlNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19odG1sNWxpYi5weQpAQCAtMCwwICsxLDI4NSBAQAorX19hbGxfXyA9IFsKKyAgICAnSFRNTDVUcmVlQnVpbGRlcicsCisgICAgXQorCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0ICgKKyAgICBQRVJNSVNTSVZFLAorICAgIEhUTUwsCisgICAgSFRNTF81LAorICAgIEhUTUxUcmVlQnVpbGRlciwKKyAgICApCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCBOYW1lc3BhY2VkQXR0cmlidXRlCitpbXBvcnQgaHRtbDVsaWIKK2Zyb20gaHRtbDVsaWIuY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCAoCisgICAgQ29tbWVudCwKKyAgICBEb2N0eXBlLAorICAgIE5hdmlnYWJsZVN0cmluZywKKyAgICBUYWcsCisgICAgKQorCitjbGFzcyBIVE1MNVRyZWVCdWlsZGVyKEhUTUxUcmVlQnVpbGRlcik6CisgICAgIiIiVXNlIGh0bWw1bGliIHRvIGJ1aWxkIGEgdHJlZS4iIiIKKworICAgIGZlYXR1cmVzID0gWydodG1sNWxpYicsIFBFUk1JU1NJVkUsIEhUTUxfNSwgSFRNTF0KKworICAgIGRlZiBwcmVwYXJlX21hcmt1cChzZWxmLCBtYXJrdXAsIHVzZXJfc3BlY2lmaWVkX2VuY29kaW5nKToKKyAgICAgICAgIyBTdG9yZSB0aGUgdXNlci1zcGVjaWZpZWQgZW5jb2RpbmcgZm9yIHVzZSBsYXRlciBvbi4KKyAgICAgICAgc2VsZi51c2VyX3NwZWNpZmllZF9lbmNvZGluZyA9IHVzZXJfc3BlY2lmaWVkX2VuY29kaW5nCisgICAgICAgIHlpZWxkIChtYXJrdXAsIE5vbmUsIE5vbmUsIEZhbHNlKQorCisgICAgIyBUaGVzZSBtZXRob2RzIGFyZSBkZWZpbmVkIGJ5IEJlYXV0aWZ1bCBTb3VwLgorICAgIGRlZiBmZWVkKHNlbGYsIG1hcmt1cCk6CisgICAgICAgIGlmIHNlbGYuc291cC5wYXJzZV9vbmx5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigiWW91IHByb3ZpZGVkIGEgdmFsdWUgZm9yIHBhcnNlX29ubHksIGJ1dCB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIGRvZXNuJ3Qgc3VwcG9ydCBwYXJzZV9vbmx5LiBUaGUgZW50aXJlIGRvY3VtZW50IHdpbGwgYmUgcGFyc2VkLiIpCisgICAgICAgIHBhcnNlciA9IGh0bWw1bGliLkhUTUxQYXJzZXIodHJlZT1zZWxmLmNyZWF0ZV90cmVlYnVpbGRlcikKKyAgICAgICAgZG9jID0gcGFyc2VyLnBhcnNlKG1hcmt1cCwgZW5jb2Rpbmc9c2VsZi51c2VyX3NwZWNpZmllZF9lbmNvZGluZykKKworICAgICAgICAjIFNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGRldGVjdGVkIGJ5IHRoZSB0b2tlbml6ZXIuCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKToKKyAgICAgICAgICAgICMgV2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgdGhpcyBiZWNhdXNlIGh0bWw1bGliIHNldHMKKyAgICAgICAgICAgICMgY2hhckVuY29kaW5nIHRvIFVURi04IGlmIGl0IGdldHMgVW5pY29kZSBpbnB1dC4KKyAgICAgICAgICAgIGRvYy5vcmlnaW5hbF9lbmNvZGluZyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvYy5vcmlnaW5hbF9lbmNvZGluZyA9IHBhcnNlci50b2tlbml6ZXIuc3RyZWFtLmNoYXJFbmNvZGluZ1swXQorCisgICAgZGVmIGNyZWF0ZV90cmVlYnVpbGRlcihzZWxmLCBuYW1lc3BhY2VIVE1MRWxlbWVudHMpOgorICAgICAgICBzZWxmLnVuZGVybHlpbmdfYnVpbGRlciA9IFRyZWVCdWlsZGVyRm9ySHRtbDVsaWIoCisgICAgICAgICAgICBzZWxmLnNvdXAsIG5hbWVzcGFjZUhUTUxFbGVtZW50cykKKyAgICAgICAgcmV0dXJuIHNlbGYudW5kZXJseWluZ19idWlsZGVyCisKKyAgICBkZWYgdGVzdF9mcmFnbWVudF90b19kb2N1bWVudChzZWxmLCBmcmFnbWVudCk6CisgICAgICAgICIiIlNlZSBgVHJlZUJ1aWxkZXJgLiIiIgorICAgICAgICByZXR1cm4gdSc8aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+JXM8L2JvZHk+PC9odG1sPicgJSBmcmFnbWVudAorCisKK2NsYXNzIFRyZWVCdWlsZGVyRm9ySHRtbDVsaWIoaHRtbDVsaWIudHJlZWJ1aWxkZXJzLl9iYXNlLlRyZWVCdWlsZGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VwLCBuYW1lc3BhY2VIVE1MRWxlbWVudHMpOgorICAgICAgICBzZWxmLnNvdXAgPSBzb3VwCisgICAgICAgIHN1cGVyKFRyZWVCdWlsZGVyRm9ySHRtbDVsaWIsIHNlbGYpLl9faW5pdF9fKG5hbWVzcGFjZUhUTUxFbGVtZW50cykKKworICAgIGRlZiBkb2N1bWVudENsYXNzKHNlbGYpOgorICAgICAgICBzZWxmLnNvdXAucmVzZXQoKQorICAgICAgICByZXR1cm4gRWxlbWVudChzZWxmLnNvdXAsIHNlbGYuc291cCwgTm9uZSkKKworICAgIGRlZiBpbnNlcnREb2N0eXBlKHNlbGYsIHRva2VuKToKKyAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KKyAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQorICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCisKKyAgICAgICAgZG9jdHlwZSA9IERvY3R5cGUuZm9yX25hbWVfYW5kX2lkcyhuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCisgICAgICAgIHNlbGYuc291cC5vYmplY3Rfd2FzX3BhcnNlZChkb2N0eXBlKQorCisgICAgZGVmIGVsZW1lbnRDbGFzcyhzZWxmLCBuYW1lLCBuYW1lc3BhY2UpOgorICAgICAgICB0YWcgPSBzZWxmLnNvdXAubmV3X3RhZyhuYW1lLCBuYW1lc3BhY2UpCisgICAgICAgIHJldHVybiBFbGVtZW50KHRhZywgc2VsZi5zb3VwLCBuYW1lc3BhY2UpCisKKyAgICBkZWYgY29tbWVudENsYXNzKHNlbGYsIGRhdGEpOgorICAgICAgICByZXR1cm4gVGV4dE5vZGUoQ29tbWVudChkYXRhKSwgc2VsZi5zb3VwKQorCisgICAgZGVmIGZyYWdtZW50Q2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuc291cCA9IEJlYXV0aWZ1bFNvdXAoIiIpCisgICAgICAgIHNlbGYuc291cC5uYW1lID0gIltkb2N1bWVudF9mcmFnbWVudF0iCisgICAgICAgIHJldHVybiBFbGVtZW50KHNlbGYuc291cCwgc2VsZi5zb3VwLCBOb25lKQorCisgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgorICAgICAgICAjIFhYWCBUaGlzIGNvZGUgaXMgbm90IGNvdmVyZWQgYnkgdGhlIEJTNCB0ZXN0cy4KKyAgICAgICAgc2VsZi5zb3VwLmFwcGVuZChub2RlLmVsZW1lbnQpCisKKyAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNvdXAKKworICAgIGRlZiBnZXRGcmFnbWVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIGh0bWw1bGliLnRyZWVidWlsZGVycy5fYmFzZS5UcmVlQnVpbGRlci5nZXRGcmFnbWVudChzZWxmKS5lbGVtZW50CisKK2NsYXNzIEF0dHJMaXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICBzZWxmLmVsZW1lbnQgPSBlbGVtZW50CisgICAgICAgIHNlbGYuYXR0cnMgPSBkaWN0KHNlbGYuZWxlbWVudC5hdHRycykKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuYXR0cnMuaXRlbXMoKSkuX19pdGVyX18oKQorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICJzZXQgYXR0ciIsIG5hbWUsIHZhbHVlCisgICAgICAgIHNlbGYuZWxlbWVudFtuYW1lXSA9IHZhbHVlCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLmF0dHJzLml0ZW1zKCkpCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuYXR0cnMua2V5cygpKQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuYXR0cnMpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyc1tuYW1lXQorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIGxpc3Qoc2VsZi5hdHRycy5rZXlzKCkpCisKKworY2xhc3MgRWxlbWVudChodG1sNWxpYi50cmVlYnVpbGRlcnMuX2Jhc2UuTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQsIHNvdXAsIG5hbWVzcGFjZSk6CisgICAgICAgIGh0bWw1bGliLnRyZWVidWlsZGVycy5fYmFzZS5Ob2RlLl9faW5pdF9fKHNlbGYsIGVsZW1lbnQubmFtZSkKKyAgICAgICAgc2VsZi5lbGVtZW50ID0gZWxlbWVudAorICAgICAgICBzZWxmLnNvdXAgPSBzb3VwCisgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlCisKKyAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CisgICAgICAgIHN0cmluZ19jaGlsZCA9IGNoaWxkID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgIyBTb21lIG90aGVyIHBpZWNlIG9mIGNvZGUgZGVjaWRlZCB0byBwYXNzIGluIGEgc3RyaW5nCisgICAgICAgICAgICAjIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBUZXh0RWxlbWVudCBvYmplY3QgdG8gY29udGFpbiB0aGUKKyAgICAgICAgICAgICMgc3RyaW5nLgorICAgICAgICAgICAgc3RyaW5nX2NoaWxkID0gY2hpbGQgPSBub2RlCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBUYWcpOgorICAgICAgICAgICAgIyBTb21lIG90aGVyIHBpZWNlIG9mIGNvZGUgZGVjaWRlZCB0byBwYXNzIGluIGEgVGFnCisgICAgICAgICAgICAjIGluc3RlYWQgb2YgY3JlYXRpbmcgYW4gRWxlbWVudCBvYmplY3QgdG8gY29udGFpbiB0aGUKKyAgICAgICAgICAgICMgVGFnLgorICAgICAgICAgICAgY2hpbGQgPSBub2RlCisgICAgICAgIGVsaWYgbm9kZS5lbGVtZW50Ll9fY2xhc3NfXyA9PSBOYXZpZ2FibGVTdHJpbmc6CisgICAgICAgICAgICBzdHJpbmdfY2hpbGQgPSBjaGlsZCA9IG5vZGUuZWxlbWVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hpbGQgPSBub2RlLmVsZW1lbnQKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaGlsZCwgYmFzZXN0cmluZykgYW5kIGNoaWxkLnBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGUuZWxlbWVudC5leHRyYWN0KCkKKworICAgICAgICBpZiAoc3RyaW5nX2NoaWxkIGFuZCBzZWxmLmVsZW1lbnQuY29udGVudHMKKyAgICAgICAgICAgIGFuZCBzZWxmLmVsZW1lbnQuY29udGVudHNbLTFdLl9fY2xhc3NfXyA9PSBOYXZpZ2FibGVTdHJpbmcpOgorICAgICAgICAgICAgIyBXZSBhcmUgYXBwZW5kaW5nIGEgc3RyaW5nIG9udG8gYW5vdGhlciBzdHJpbmcuCisgICAgICAgICAgICAjIFRPRE8gVGhpcyBoYXMgTyhuXjIpIHBlcmZvcm1hbmNlLCBmb3IgaW5wdXQgbGlrZQorICAgICAgICAgICAgIyAiYTwvYT5hPC9hPmE8L2E+Li4uIgorICAgICAgICAgICAgb2xkX2VsZW1lbnQgPSBzZWxmLmVsZW1lbnQuY29udGVudHNbLTFdCisgICAgICAgICAgICBuZXdfZWxlbWVudCA9IHNlbGYuc291cC5uZXdfc3RyaW5nKG9sZF9lbGVtZW50ICsgc3RyaW5nX2NoaWxkKQorICAgICAgICAgICAgb2xkX2VsZW1lbnQucmVwbGFjZV93aXRoKG5ld19lbGVtZW50KQorICAgICAgICAgICAgc2VsZi5zb3VwLl9tb3N0X3JlY2VudF9lbGVtZW50ID0gbmV3X2VsZW1lbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBicmFuZCBuZXcgTmF2aWdhYmxlU3RyaW5nIGZyb20gdGhpcyBzdHJpbmcuCisgICAgICAgICAgICAgICAgY2hpbGQgPSBzZWxmLnNvdXAubmV3X3N0cmluZyhub2RlKQorCisgICAgICAgICAgICAjIFRlbGwgQmVhdXRpZnVsIFNvdXAgdG8gYWN0IGFzIGlmIGl0IHBhcnNlZCB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgICMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHBhcmVudCdzIGxhc3QgZGVzY2VuZGFudC4gKE9yCisgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwYXJlbnQsIGlmIGl0IGhhcyBubyBjaGlsZHJlbi4pCisgICAgICAgICAgICBpZiBzZWxmLmVsZW1lbnQuY29udGVudHM6CisgICAgICAgICAgICAgICAgbW9zdF9yZWNlbnRfZWxlbWVudCA9IHNlbGYuZWxlbWVudC5fbGFzdF9kZXNjZW5kYW50KEZhbHNlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtb3N0X3JlY2VudF9lbGVtZW50ID0gc2VsZi5lbGVtZW50CisKKyAgICAgICAgICAgIHNlbGYuc291cC5vYmplY3Rfd2FzX3BhcnNlZCgKKyAgICAgICAgICAgICAgICBjaGlsZCwgcGFyZW50PXNlbGYuZWxlbWVudCwKKyAgICAgICAgICAgICAgICBtb3N0X3JlY2VudF9lbGVtZW50PW1vc3RfcmVjZW50X2VsZW1lbnQpCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEF0dHJMaXN0KHNlbGYuZWxlbWVudCkKKworICAgIGRlZiBzZXRBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpOgorICAgICAgICBpZiBhdHRyaWJ1dGVzIGlzIG5vdCBOb25lIGFuZCBsZW4oYXR0cmlidXRlcykgPiAwOgorCisgICAgICAgICAgICBjb252ZXJ0ZWRfYXR0cmlidXRlcyA9IFtdCisgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbGlzdChhdHRyaWJ1dGVzLml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZSA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoKm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyaWJ1dGVzW25hbWVdCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbbmV3X25hbWVdID0gdmFsdWUKKworICAgICAgICAgICAgc2VsZi5zb3VwLmJ1aWxkZXIuX3JlcGxhY2VfY2RhdGFfbGlzdF9hdHRyaWJ1dGVfdmFsdWVzKAorICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgYXR0cmlidXRlcykKKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBhdHRyaWJ1dGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50W25hbWVdID0gdmFsdWUKKworICAgICAgICAgICAgIyBUaGUgYXR0cmlidXRlcyBtYXkgY29udGFpbiB2YXJpYWJsZXMgdGhhdCBuZWVkIHN1YnN0aXR1dGlvbi4KKyAgICAgICAgICAgICMgQ2FsbCBzZXRfdXBfc3Vic3RpdHV0aW9ucyBtYW51YWxseS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlIFRhZyBjb25zdHJ1Y3RvciBjYWxsZWQgdGhpcyBtZXRob2Qgd2hlbiB0aGUgVGFnIHdhcyBjcmVhdGVkLAorICAgICAgICAgICAgIyBidXQgd2UganVzdCBzZXQvY2hhbmdlZCB0aGUgYXR0cmlidXRlcywgc28gY2FsbCBpdCBhZ2Fpbi4KKyAgICAgICAgICAgIHNlbGYuc291cC5idWlsZGVyLnNldF91cF9zdWJzdGl0dXRpb25zKHNlbGYuZWxlbWVudCkKKyAgICBhdHRyaWJ1dGVzID0gcHJvcGVydHkoZ2V0QXR0cmlidXRlcywgc2V0QXR0cmlidXRlcykKKworICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKKyAgICAgICAgaWYgaW5zZXJ0QmVmb3JlOgorICAgICAgICAgICAgdGV4dCA9IFRleHROb2RlKHNlbGYuc291cC5uZXdfc3RyaW5nKGRhdGEpLCBzZWxmLnNvdXApCisgICAgICAgICAgICBzZWxmLmluc2VydEJlZm9yZShkYXRhLCBpbnNlcnRCZWZvcmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFwcGVuZENoaWxkKGRhdGEpCisKKyAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5vZGUsIHJlZk5vZGUpOgorICAgICAgICBpbmRleCA9IHNlbGYuZWxlbWVudC5pbmRleChyZWZOb2RlLmVsZW1lbnQpCisgICAgICAgIGlmIChub2RlLmVsZW1lbnQuX19jbGFzc19fID09IE5hdmlnYWJsZVN0cmluZyBhbmQgc2VsZi5lbGVtZW50LmNvbnRlbnRzCisgICAgICAgICAgICBhbmQgc2VsZi5lbGVtZW50LmNvbnRlbnRzW2luZGV4LTFdLl9fY2xhc3NfXyA9PSBOYXZpZ2FibGVTdHJpbmcpOgorICAgICAgICAgICAgIyAoU2VlIGNvbW1lbnRzIGluIGFwcGVuZENoaWxkKQorICAgICAgICAgICAgb2xkX25vZGUgPSBzZWxmLmVsZW1lbnQuY29udGVudHNbaW5kZXgtMV0KKyAgICAgICAgICAgIG5ld19zdHIgPSBzZWxmLnNvdXAubmV3X3N0cmluZyhvbGRfbm9kZSArIG5vZGUuZWxlbWVudCkKKyAgICAgICAgICAgIG9sZF9ub2RlLnJlcGxhY2Vfd2l0aChuZXdfc3RyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbGVtZW50Lmluc2VydChpbmRleCwgbm9kZS5lbGVtZW50KQorICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCisKKyAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CisgICAgICAgIG5vZGUuZWxlbWVudC5leHRyYWN0KCkKKworICAgIGRlZiByZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld19wYXJlbnQpOgorICAgICAgICAiIiJNb3ZlIGFsbCBvZiB0aGlzIHRhZydzIGNoaWxkcmVuIGludG8gYW5vdGhlciB0YWcuIiIiCisgICAgICAgIGVsZW1lbnQgPSBzZWxmLmVsZW1lbnQKKyAgICAgICAgbmV3X3BhcmVudF9lbGVtZW50ID0gbmV3X3BhcmVudC5lbGVtZW50CisgICAgICAgICMgRGV0ZXJtaW5lIHdoYXQgdGhpcyB0YWcncyBuZXh0X2VsZW1lbnQgd2lsbCBiZSBvbmNlIGFsbCB0aGUgY2hpbGRyZW4KKyAgICAgICAgIyBhcmUgcmVtb3ZlZC4KKyAgICAgICAgZmluYWxfbmV4dF9lbGVtZW50ID0gZWxlbWVudC5uZXh0X3NpYmxpbmcKKworICAgICAgICBuZXdfcGFyZW50c19sYXN0X2Rlc2NlbmRhbnQgPSBuZXdfcGFyZW50X2VsZW1lbnQuX2xhc3RfZGVzY2VuZGFudChGYWxzZSwgRmFsc2UpCisgICAgICAgIGlmIGxlbihuZXdfcGFyZW50X2VsZW1lbnQuY29udGVudHMpID4gMDoKKyAgICAgICAgICAgICMgVGhlIG5ldyBwYXJlbnQgYWxyZWFkeSBjb250YWlucyBjaGlsZHJlbi4gV2Ugd2lsbCBiZQorICAgICAgICAgICAgIyBhcHBlbmRpbmcgdGhpcyB0YWcncyBjaGlsZHJlbiB0byB0aGUgZW5kLgorICAgICAgICAgICAgbmV3X3BhcmVudHNfbGFzdF9jaGlsZCA9IG5ld19wYXJlbnRfZWxlbWVudC5jb250ZW50c1stMV0KKyAgICAgICAgICAgIG5ld19wYXJlbnRzX2xhc3RfZGVzY2VuZGFudF9uZXh0X2VsZW1lbnQgPSBuZXdfcGFyZW50c19sYXN0X2Rlc2NlbmRhbnQubmV4dF9lbGVtZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZSBuZXcgcGFyZW50IGNvbnRhaW5zIG5vIGNoaWxkcmVuLgorICAgICAgICAgICAgbmV3X3BhcmVudHNfbGFzdF9jaGlsZCA9IE5vbmUKKyAgICAgICAgICAgIG5ld19wYXJlbnRzX2xhc3RfZGVzY2VuZGFudF9uZXh0X2VsZW1lbnQgPSBuZXdfcGFyZW50X2VsZW1lbnQubmV4dF9lbGVtZW50CisKKyAgICAgICAgdG9fYXBwZW5kID0gZWxlbWVudC5jb250ZW50cworICAgICAgICBhcHBlbmRfYWZ0ZXIgPSBuZXdfcGFyZW50LmVsZW1lbnQuY29udGVudHMKKyAgICAgICAgaWYgbGVuKHRvX2FwcGVuZCkgPiAwOgorICAgICAgICAgICAgIyBTZXQgdGhlIGZpcnN0IGNoaWxkJ3MgcHJldmlvdXNfZWxlbWVudCBhbmQgcHJldmlvdXNfc2libGluZworICAgICAgICAgICAgIyB0byBlbGVtZW50cyB3aXRoaW4gdGhlIG5ldyBwYXJlbnQKKyAgICAgICAgICAgIGZpcnN0X2NoaWxkID0gdG9fYXBwZW5kWzBdCisgICAgICAgICAgICBmaXJzdF9jaGlsZC5wcmV2aW91c19lbGVtZW50ID0gbmV3X3BhcmVudHNfbGFzdF9kZXNjZW5kYW50CisgICAgICAgICAgICBmaXJzdF9jaGlsZC5wcmV2aW91c19zaWJsaW5nID0gbmV3X3BhcmVudHNfbGFzdF9jaGlsZAorCisgICAgICAgICAgICAjIEZpeCB0aGUgbGFzdCBjaGlsZCdzIG5leHRfZWxlbWVudCBhbmQgbmV4dF9zaWJsaW5nCisgICAgICAgICAgICBsYXN0X2NoaWxkID0gdG9fYXBwZW5kWy0xXQorICAgICAgICAgICAgbGFzdF9jaGlsZC5uZXh0X2VsZW1lbnQgPSBuZXdfcGFyZW50c19sYXN0X2Rlc2NlbmRhbnRfbmV4dF9lbGVtZW50CisgICAgICAgICAgICBsYXN0X2NoaWxkLm5leHRfc2libGluZyA9IE5vbmUKKworICAgICAgICBmb3IgY2hpbGQgaW4gdG9fYXBwZW5kOgorICAgICAgICAgICAgY2hpbGQucGFyZW50ID0gbmV3X3BhcmVudF9lbGVtZW50CisgICAgICAgICAgICBuZXdfcGFyZW50X2VsZW1lbnQuY29udGVudHMuYXBwZW5kKGNoaWxkKQorCisgICAgICAgICMgTm93IHRoYXQgdGhpcyBlbGVtZW50IGhhcyBubyBjaGlsZHJlbiwgY2hhbmdlIGl0cyAubmV4dF9lbGVtZW50LgorICAgICAgICBlbGVtZW50LmNvbnRlbnRzID0gW10KKyAgICAgICAgZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBmaW5hbF9uZXh0X2VsZW1lbnQKKworICAgIGRlZiBjbG9uZU5vZGUoc2VsZik6CisgICAgICAgIHRhZyA9IHNlbGYuc291cC5uZXdfdGFnKHNlbGYuZWxlbWVudC5uYW1lLCBzZWxmLm5hbWVzcGFjZSkKKyAgICAgICAgbm9kZSA9IEVsZW1lbnQodGFnLCBzZWxmLnNvdXAsIHNlbGYubmFtZXNwYWNlKQorICAgICAgICBmb3Iga2V5LHZhbHVlIGluIHNlbGYuYXR0cmlidXRlczoKKyAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlc1trZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBoYXNDb250ZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbGVtZW50LmNvbnRlbnRzCisKKyAgICBkZWYgZ2V0TmFtZVR1cGxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5hbWVzcGFjZSA9PSBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXNbImh0bWwiXSwgc2VsZi5uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lc3BhY2UsIHNlbGYubmFtZQorCisgICAgbmFtZVR1cGxlID0gcHJvcGVydHkoZ2V0TmFtZVR1cGxlKQorCitjbGFzcyBUZXh0Tm9kZShFbGVtZW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCwgc291cCk6CisgICAgICAgIGh0bWw1bGliLnRyZWVidWlsZGVycy5fYmFzZS5Ob2RlLl9faW5pdF9fKHNlbGYsIE5vbmUpCisgICAgICAgIHNlbGYuZWxlbWVudCA9IGVsZW1lbnQKKyAgICAgICAgc2VsZi5zb3VwID0gc291cAorCisgICAgZGVmIGNsb25lTm9kZShzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX2h0bWxwYXJzZXIucHkgYi9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9faHRtbHBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYThkOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L2J1aWxkZXIvX2h0bWxwYXJzZXIucHkKQEAgLTAsMCArMSwyNTggQEAKKyIiIlVzZSB0aGUgSFRNTFBhcnNlciBsaWJyYXJ5IHRvIHBhcnNlIEhUTUwgZmlsZXMgdGhhdCBhcmVuJ3QgdG9vIGJhZC4iIiIKKworX19hbGxfXyA9IFsKKyAgICAnSFRNTFBhcnNlclRyZWVCdWlsZGVyJywKKyAgICBdCisKK2Zyb20gSFRNTFBhcnNlciBpbXBvcnQgKAorICAgIEhUTUxQYXJzZXIsCisgICAgSFRNTFBhcnNlRXJyb3IsCisgICAgKQoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCisKKyMgU3RhcnRpbmcgaW4gUHl0aG9uIDMuMiwgdGhlIEhUTUxQYXJzZXIgY29uc3RydWN0b3IgdGFrZXMgYSAnc3RyaWN0JworIyBhcmd1bWVudCwgd2hpY2ggd2UnZCBsaWtlIHRvIHNldCB0byBGYWxzZS4gVW5mb3J0dW5hdGVseSwKKyMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjczIG1ha2VzIHN0cmljdD1UcnVlIGEgYmV0dGVyIGJldAorIyBiZWZvcmUgUHl0aG9uIDMuMi4zLgorIworIyBBdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSwgd2UgbW9ua2V5cGF0Y2ggSFRNTFBhcnNlciBzbyB0aGF0CisjIHN0cmljdD1UcnVlIHdvcmtzIHdlbGwgb24gUHl0aG9uIDMuMi4yLgorbWFqb3IsIG1pbm9yLCByZWxlYXNlID0gc3lzLnZlcnNpb25faW5mb1s6M10KK0NPTlNUUlVDVE9SX1RBS0VTX1NUUklDVCA9ICgKKyAgICBtYWpvciA+IDMKKyAgICBvciAobWFqb3IgPT0gMyBhbmQgbWlub3IgPiAyKQorICAgIG9yIChtYWpvciA9PSAzIGFuZCBtaW5vciA9PSAyIGFuZCByZWxlYXNlID49IDMpKQorCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCAoCisgICAgQ0RhdGEsCisgICAgQ29tbWVudCwKKyAgICBEZWNsYXJhdGlvbiwKKyAgICBEb2N0eXBlLAorICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiwKKyAgICApCitmcm9tIGJzNC5kYW1taXQgaW1wb3J0IEVudGl0eVN1YnN0aXR1dGlvbiwgVW5pY29kZURhbW1pdAorCitmcm9tIGJzNC5idWlsZGVyIGltcG9ydCAoCisgICAgSFRNTCwKKyAgICBIVE1MVHJlZUJ1aWxkZXIsCisgICAgU1RSSUNULAorICAgICkKKworCitIVE1MUEFSU0VSID0gJ2h0bWwucGFyc2VyJworCitjbGFzcyBCZWF1dGlmdWxTb3VwSFRNTFBhcnNlcihIVE1MUGFyc2VyKToKKyAgICBkZWYgaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgIyBYWFggbmFtZXNwYWNlCisgICAgICAgIGF0dHJfZGljdCA9IHt9CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJzOgorICAgICAgICAgICAgIyBDaGFuZ2UgTm9uZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgICMgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIHRyZWUgYnVpbGRlcnMuCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHZhbHVlID0gJycKKyAgICAgICAgICAgIGF0dHJfZGljdFtrZXldID0gdmFsdWUKKyAgICAgICAgICAgIGF0dHJ2YWx1ZSA9ICciIicKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9zdGFydHRhZyhuYW1lLCBOb25lLCBOb25lLCBhdHRyX2RpY3QpCisKKyAgICBkZWYgaGFuZGxlX2VuZHRhZyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9lbmR0YWcobmFtZSkKKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICMgWFhYIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEhUTUxQYXJzZXIuIFJlbW92ZSB0aGlzIG9uY2UKKyAgICAgICAgIyBpdCdzIGZpeGVkLgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ3gnKToKKyAgICAgICAgICAgIHJlYWxfbmFtZSA9IGludChuYW1lLmxzdHJpcCgneCcpLCAxNikKKyAgICAgICAgZWxpZiBuYW1lLnN0YXJ0c3dpdGgoJ1gnKToKKyAgICAgICAgICAgIHJlYWxfbmFtZSA9IGludChuYW1lLmxzdHJpcCgnWCcpLCAxNikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlYWxfbmFtZSA9IGludChuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSB1bmljaHIocmVhbF9uYW1lKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpLCBlOgorICAgICAgICAgICAgZGF0YSA9IHUiXE57UkVQTEFDRU1FTlQgQ0hBUkFDVEVSfSIKKworICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgY2hhcmFjdGVyID0gRW50aXR5U3Vic3RpdHV0aW9uLkhUTUxfRU5USVRZX1RPX0NIQVJBQ1RFUi5nZXQobmFtZSkKKyAgICAgICAgaWYgY2hhcmFjdGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGF0YSA9IGNoYXJhY3RlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9ICImJXM7IiAlIG5hbWUKKyAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnNvdXAuZW5kRGF0YSgpCisgICAgICAgIHNlbGYuc291cC5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICBzZWxmLnNvdXAuZW5kRGF0YShDb21tZW50KQorCisgICAgZGVmIGhhbmRsZV9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnNvdXAuZW5kRGF0YSgpCisgICAgICAgIGlmIGRhdGEuc3RhcnRzd2l0aCgiRE9DVFlQRSAiKToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhW2xlbigiRE9DVFlQRSAiKTpdCisgICAgICAgIGVsaWYgZGF0YSA9PSAnRE9DVFlQRSc6CisgICAgICAgICAgICAjIGkuZS4gIjwhRE9DVFlQRT4iCisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKERvY3R5cGUpCisKKyAgICBkZWYgdW5rbm93bl9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBkYXRhLnVwcGVyKCkuc3RhcnRzd2l0aCgnQ0RBVEFbJyk6CisgICAgICAgICAgICBjbHMgPSBDRGF0YQorICAgICAgICAgICAgZGF0YSA9IGRhdGFbbGVuKCdDREFUQVsnKTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbHMgPSBEZWNsYXJhdGlvbgorICAgICAgICBzZWxmLnNvdXAuZW5kRGF0YSgpCisgICAgICAgIHNlbGYuc291cC5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICBzZWxmLnNvdXAuZW5kRGF0YShjbHMpCisKKyAgICBkZWYgaGFuZGxlX3BpKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnNvdXAuZW5kRGF0YSgpCisgICAgICAgIGlmIGRhdGEuZW5kc3dpdGgoIj8iKSBhbmQgZGF0YS5sb3dlcigpLnN0YXJ0c3dpdGgoInhtbCIpOgorICAgICAgICAgICAgIyAiQW4gWEhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB1c2luZyB0aGUgdHJhaWxpbmcgJz8nCisgICAgICAgICAgICAjIHdpbGwgY2F1c2UgdGhlICc/JyB0byBiZSBpbmNsdWRlZCBpbiBkYXRhLiIgLSBIVE1MUGFyc2VyCisgICAgICAgICAgICAjIGRvY3MuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFN0cmlwIHRoZSBxdWVzdGlvbiBtYXJrIHNvIHdlIGRvbid0IGVuZCB1cCB3aXRoIHR3bworICAgICAgICAgICAgIyBxdWVzdGlvbiBtYXJrcy4KKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzotMV0KKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikKKworCitjbGFzcyBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIoSFRNTFRyZWVCdWlsZGVyKToKKworICAgIGlzX3htbCA9IEZhbHNlCisgICAgZmVhdHVyZXMgPSBbSFRNTCwgU1RSSUNULCBIVE1MUEFSU0VSXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGlmIENPTlNUUlVDVE9SX1RBS0VTX1NUUklDVDoKKyAgICAgICAgICAgIGt3YXJnc1snc3RyaWN0J10gPSBGYWxzZQorICAgICAgICBzZWxmLnBhcnNlcl9hcmdzID0gKGFyZ3MsIGt3YXJncykKKworICAgIGRlZiBwcmVwYXJlX21hcmt1cChzZWxmLCBtYXJrdXAsIHVzZXJfc3BlY2lmaWVkX2VuY29kaW5nPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50X2RlY2xhcmVkX2VuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgOnJldHVybjogQSA0LXR1cGxlIChtYXJrdXAsIG9yaWdpbmFsIGVuY29kaW5nLCBlbmNvZGluZworICAgICAgICBkZWNsYXJlZCB3aXRoaW4gbWFya3VwLCB3aGV0aGVyIGFueSBjaGFyYWN0ZXJzIGhhZCB0byBiZQorICAgICAgICByZXBsYWNlZCB3aXRoIFJFUExBQ0VNRU5UIENIQVJBQ1RFUikuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmt1cCwgdW5pY29kZSk6CisgICAgICAgICAgICB5aWVsZCAobWFya3VwLCBOb25lLCBOb25lLCBGYWxzZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeV9lbmNvZGluZ3MgPSBbdXNlcl9zcGVjaWZpZWRfZW5jb2RpbmcsIGRvY3VtZW50X2RlY2xhcmVkX2VuY29kaW5nXQorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KG1hcmt1cCwgdHJ5X2VuY29kaW5ncywgaXNfaHRtbD1UcnVlKQorICAgICAgICB5aWVsZCAoZGFtbWl0Lm1hcmt1cCwgZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nLAorICAgICAgICAgICAgICAgZGFtbWl0LmRlY2xhcmVkX2h0bWxfZW5jb2RpbmcsCisgICAgICAgICAgICAgICBkYW1taXQuY29udGFpbnNfcmVwbGFjZW1lbnRfY2hhcmFjdGVycykKKworICAgIGRlZiBmZWVkKHNlbGYsIG1hcmt1cCk6CisgICAgICAgIGFyZ3MsIGt3YXJncyA9IHNlbGYucGFyc2VyX2FyZ3MKKyAgICAgICAgcGFyc2VyID0gQmVhdXRpZnVsU291cEhUTUxQYXJzZXIoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBwYXJzZXIuc291cCA9IHNlbGYuc291cAorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIuZmVlZChtYXJrdXApCisgICAgICAgIGV4Y2VwdCBIVE1MUGFyc2VFcnJvciwgZToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oUnVudGltZVdhcm5pbmcoCisgICAgICAgICAgICAgICAgIlB5dGhvbidzIGJ1aWx0LWluIEhUTUxQYXJzZXIgY2Fubm90IHBhcnNlIHRoZSBnaXZlbiBkb2N1bWVudC4gVGhpcyBpcyBub3QgYSBidWcgaW4gQmVhdXRpZnVsIFNvdXAuIFRoZSBiZXN0IHNvbHV0aW9uIGlzIHRvIGluc3RhbGwgYW4gZXh0ZXJuYWwgcGFyc2VyIChseG1sIG9yIGh0bWw1bGliKSwgYW5kIHVzZSBCZWF1dGlmdWwgU291cCB3aXRoIHRoYXQgcGFyc2VyLiBTZWUgaHR0cDovL3d3dy5jcnVtbXkuY29tL3NvZnR3YXJlL0JlYXV0aWZ1bFNvdXAvYnM0L2RvYy8jaW5zdGFsbGluZy1hLXBhcnNlciBmb3IgaGVscC4iKSkKKyAgICAgICAgICAgIHJhaXNlIGUKKworIyBQYXRjaCAzLjIgdmVyc2lvbnMgb2YgSFRNTFBhcnNlciBlYXJsaWVyIHRoYW4gMy4yLjMgdG8gdXNlIHNvbWUKKyMgMy4yLjMgY29kZS4gVGhpcyBlbnN1cmVzIHRoZXkgZG9uJ3QgdHJlYXQgbWFya3VwIGxpa2UgPHA+PC9wPiBhcyBhCisjIHN0cmluZy4KKyMKKyMgWFhYIFRoaXMgY29kZSBjYW4gYmUgcmVtb3ZlZCBvbmNlIG1vc3QgUHl0aG9uIDMgdXNlcnMgYXJlIG9uIDMuMi4zLgoraWYgbWFqb3IgPT0gMyBhbmQgbWlub3IgPT0gMiBhbmQgbm90IENPTlNUUlVDVE9SX1RBS0VTX1NUUklDVDoKKyAgICBpbXBvcnQgcmUKKyAgICBhdHRyZmluZF90b2xlcmFudCA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInXHMqKCg/PD1bXCciXHNdKVteXHMvPl1bXlxzLz0+XSopKFxzKj0rXHMqJworICAgICAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8KD8hW1wnIl0pW14+XHNdKikpPycpCisgICAgSFRNTFBhcnNlclRyZWVCdWlsZGVyLmF0dHJmaW5kX3RvbGVyYW50ID0gYXR0cmZpbmRfdG9sZXJhbnQKKworICAgIGxvY2F0ZXN0YXJ0dGFnZW5kID0gcmUuY29tcGlsZShyIiIiCisgIDxbYS16QS1aXVstLmEtekEtWjAtOTpfXSogICAgICAgICAgIyB0YWcgbmFtZQorICAoPzpccysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpdGVzcGFjZSBiZWZvcmUgYXR0cmlidXRlIG5hbWUKKyAgICAoPzpbYS16QS1aX11bLS46YS16QS1aMC05X10qICAgICAjIGF0dHJpYnV0ZSBuYW1lCisgICAgICAoPzpccyo9XHMqICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZSBpbmRpY2F0b3IKKyAgICAgICAgKD86J1teJ10qJyAgICAgICAgICAgICAgICAgICAjIExJVEEtZW5jbG9zZWQgdmFsdWUKKyAgICAgICAgICB8XCJbXlwiXSpcIiAgICAgICAgICAgICAgICAjIExJVC1lbmNsb3NlZCB2YWx1ZQorICAgICAgICAgIHxbXidcIj5cc10rICAgICAgICAgICAgICAgICMgYmFyZSB2YWx1ZQorICAgICAgICAgKQorICAgICAgICk/CisgICAgICkKKyAgICkqCisgIFxzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0cmFpbGluZyB3aGl0ZXNwYWNlCisiIiIsIHJlLlZFUkJPU0UpCisgICAgQmVhdXRpZnVsU291cEhUTUxQYXJzZXIubG9jYXRlc3RhcnR0YWdlbmQgPSBsb2NhdGVzdGFydHRhZ2VuZAorCisgICAgZnJvbSBodG1sLnBhcnNlciBpbXBvcnQgdGFnZmluZCwgYXR0cmZpbmQKKworICAgIGRlZiBwYXJzZV9zdGFydHRhZyhzZWxmLCBpKToKKyAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSBOb25lCisgICAgICAgIGVuZHBvcyA9IHNlbGYuY2hlY2tfZm9yX3dob2xlX3N0YXJ0X3RhZyhpKQorICAgICAgICBpZiBlbmRwb3MgPCAwOgorICAgICAgICAgICAgcmV0dXJuIGVuZHBvcworICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIHNlbGYuX19zdGFydHRhZ190ZXh0ID0gcmF3ZGF0YVtpOmVuZHBvc10KKworICAgICAgICAjIE5vdyBwYXJzZSB0aGUgZGF0YSBiZXR3ZWVuIGkrMSBhbmQgaiBpbnRvIGEgdGFnIGFuZCBhdHRycworICAgICAgICBhdHRycyA9IFtdCisgICAgICAgIG1hdGNoID0gdGFnZmluZC5tYXRjaChyYXdkYXRhLCBpKzEpCisgICAgICAgIGFzc2VydCBtYXRjaCwgJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9zdGFydHRhZygpJworICAgICAgICBrID0gbWF0Y2guZW5kKCkKKyAgICAgICAgc2VsZi5sYXN0dGFnID0gdGFnID0gcmF3ZGF0YVtpKzE6a10ubG93ZXIoKQorICAgICAgICB3aGlsZSBrIDwgZW5kcG9zOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3Q6CisgICAgICAgICAgICAgICAgbSA9IGF0dHJmaW5kLm1hdGNoKHJhd2RhdGEsIGspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG0gPSBhdHRyZmluZF90b2xlcmFudC5tYXRjaChyYXdkYXRhLCBrKQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dHJuYW1lLCByZXN0LCBhdHRydmFsdWUgPSBtLmdyb3VwKDEsIDIsIDMpCisgICAgICAgICAgICBpZiBub3QgcmVzdDoKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBOb25lCisgICAgICAgICAgICBlbGlmIGF0dHJ2YWx1ZVs6MV0gPT0gJ1wnJyA9PSBhdHRydmFsdWVbLTE6XSBvciBcCisgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZVs6MV0gPT0gJyInID09IGF0dHJ2YWx1ZVstMTpdOgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQorICAgICAgICAgICAgaWYgYXR0cnZhbHVlOgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IHNlbGYudW5lc2NhcGUoYXR0cnZhbHVlKQorICAgICAgICAgICAgYXR0cnMuYXBwZW5kKChhdHRybmFtZS5sb3dlcigpLCBhdHRydmFsdWUpKQorICAgICAgICAgICAgayA9IG0uZW5kKCkKKworICAgICAgICBlbmQgPSByYXdkYXRhW2s6ZW5kcG9zXS5zdHJpcCgpCisgICAgICAgIGlmIGVuZCBub3QgaW4gKCI+IiwgIi8+Iik6CisgICAgICAgICAgICBsaW5lbm8sIG9mZnNldCA9IHNlbGYuZ2V0cG9zKCkKKyAgICAgICAgICAgIGlmICJcbiIgaW4gc2VsZi5fX3N0YXJ0dGFnX3RleHQ6CisgICAgICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgc2VsZi5fX3N0YXJ0dGFnX3RleHQuY291bnQoIlxuIikKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3N0YXJ0dGFnX3RleHQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlbGYuX19zdGFydHRhZ190ZXh0LnJmaW5kKCJcbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIGxlbihzZWxmLl9fc3RhcnR0YWdfdGV4dCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0OgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoImp1bmsgY2hhcmFjdGVycyBpbiBzdGFydCB0YWc6ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocmF3ZGF0YVtrOmVuZHBvc11bOjIwXSwpKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6ZW5kcG9zXSkKKyAgICAgICAgICAgIHJldHVybiBlbmRwb3MKKyAgICAgICAgaWYgZW5kLmVuZHN3aXRoKCcvPicpOgorICAgICAgICAgICAgIyBYSFRNTC1zdHlsZSBlbXB0eSB0YWc6IDxzcGFuIGF0dHI9InZhbHVlIiAvPgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhcnRlbmR0YWcodGFnLCBhdHRycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3N0YXJ0dGFnKHRhZywgYXR0cnMpCisgICAgICAgICAgICBpZiB0YWcgaW4gc2VsZi5DREFUQV9DT05URU5UX0VMRU1FTlRTOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2NkYXRhX21vZGUodGFnKQorICAgICAgICByZXR1cm4gZW5kcG9zCisKKyAgICBkZWYgc2V0X2NkYXRhX21vZGUoc2VsZiwgZWxlbSk6CisgICAgICAgIHNlbGYuY2RhdGFfZWxlbSA9IGVsZW0ubG93ZXIoKQorICAgICAgICBzZWxmLmludGVyZXN0aW5nID0gcmUuY29tcGlsZShyJzwvXHMqJXNccyo+JyAlIHNlbGYuY2RhdGFfZWxlbSwgcmUuSSkKKworICAgIEJlYXV0aWZ1bFNvdXBIVE1MUGFyc2VyLnBhcnNlX3N0YXJ0dGFnID0gcGFyc2Vfc3RhcnR0YWcKKyAgICBCZWF1dGlmdWxTb3VwSFRNTFBhcnNlci5zZXRfY2RhdGFfbW9kZSA9IHNldF9jZGF0YV9tb2RlCisKKyAgICBDT05TVFJVQ1RPUl9UQUtFU19TVFJJQ1QgPSBUcnVlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9fbHhtbC5weSBiL2JpdGJha2UvbGliL2JzNC9idWlsZGVyL19seG1sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWQ0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvYnVpbGRlci9fbHhtbC5weQpAQCAtMCwwICsxLDIzMyBAQAorX19hbGxfXyA9IFsKKyAgICAnTFhNTFRyZWVCdWlsZGVyRm9yWE1MJywKKyAgICAnTFhNTFRyZWVCdWlsZGVyJywKKyAgICBdCisKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgY29sbGVjdGlvbnMKK2Zyb20gbHhtbCBpbXBvcnQgZXRyZWUKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0IENvbW1lbnQsIERvY3R5cGUsIE5hbWVzcGFjZWRBdHRyaWJ1dGUKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0ICgKKyAgICBGQVNULAorICAgIEhUTUwsCisgICAgSFRNTFRyZWVCdWlsZGVyLAorICAgIFBFUk1JU1NJVkUsCisgICAgUGFyc2VyUmVqZWN0ZWRNYXJrdXAsCisgICAgVHJlZUJ1aWxkZXIsCisgICAgWE1MKQorZnJvbSBiczQuZGFtbWl0IGltcG9ydCBFbmNvZGluZ0RldGVjdG9yCisKK0xYTUwgPSAnbHhtbCcKKworY2xhc3MgTFhNTFRyZWVCdWlsZGVyRm9yWE1MKFRyZWVCdWlsZGVyKToKKyAgICBERUZBVUxUX1BBUlNFUl9DTEFTUyA9IGV0cmVlLlhNTFBhcnNlcgorCisgICAgaXNfeG1sID0gVHJ1ZQorCisgICAgIyBXZWxsLCBpdCdzIHBlcm1pc3NpdmUgYnkgWE1MIHBhcnNlciBzdGFuZGFyZHMuCisgICAgZmVhdHVyZXMgPSBbTFhNTCwgWE1MLCBGQVNULCBQRVJNSVNTSVZFXQorCisgICAgQ0hVTktfU0laRSA9IDUxMgorCisgICAgIyBUaGlzIG5hbWVzcGFjZSBtYXBwaW5nIGlzIHNwZWNpZmllZCBpbiB0aGUgWE1MIE5hbWVzcGFjZQorICAgICMgc3RhbmRhcmQuCisgICAgREVGQVVMVF9OU01BUFMgPSB7J2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScgOiAieG1sIn0KKworICAgIGRlZiBkZWZhdWx0X3BhcnNlcihzZWxmLCBlbmNvZGluZyk6CisgICAgICAgICMgVGhpcyBjYW4gZWl0aGVyIHJldHVybiBhIHBhcnNlciBvYmplY3Qgb3IgYSBjbGFzcywgd2hpY2gKKyAgICAgICAgIyB3aWxsIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRlZmF1bHQgYXJndW1lbnRzLgorICAgICAgICBpZiBzZWxmLl9kZWZhdWx0X3BhcnNlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kZWZhdWx0X3BhcnNlcgorICAgICAgICByZXR1cm4gZXRyZWUuWE1MUGFyc2VyKAorICAgICAgICAgICAgdGFyZ2V0PXNlbGYsIHN0cmlwX2NkYXRhPUZhbHNlLCByZWNvdmVyPVRydWUsIGVuY29kaW5nPWVuY29kaW5nKQorCisgICAgZGVmIHBhcnNlcl9mb3Ioc2VsZiwgZW5jb2RpbmcpOgorICAgICAgICAjIFVzZSB0aGUgZGVmYXVsdCBwYXJzZXIuCisgICAgICAgIHBhcnNlciA9IHNlbGYuZGVmYXVsdF9wYXJzZXIoZW5jb2RpbmcpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZXIsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKKyAgICAgICAgICAgICMgSW5zdGFudGlhdGUgdGhlIHBhcnNlciB3aXRoIGRlZmF1bHQgYXJndW1lbnRzCisgICAgICAgICAgICBwYXJzZXIgPSBwYXJzZXIodGFyZ2V0PXNlbGYsIHN0cmlwX2NkYXRhPUZhbHNlLCBlbmNvZGluZz1lbmNvZGluZykKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlcj1Ob25lLCBlbXB0eV9lbGVtZW50X3RhZ3M9Tm9uZSk6CisgICAgICAgICMgVE9ETzogSXNzdWUgYSB3YXJuaW5nIGlmIHBhcnNlciBpcyBwcmVzZW50IGJ1dCBub3QgYQorICAgICAgICAjIGNhbGxhYmxlLCBzaW5jZSB0aGF0IG1lYW5zIHRoZXJlJ3Mgbm8gd2F5IHRvIGNyZWF0ZSBuZXcKKyAgICAgICAgIyBwYXJzZXJzIGZvciBkaWZmZXJlbnQgZW5jb2RpbmdzLgorICAgICAgICBzZWxmLl9kZWZhdWx0X3BhcnNlciA9IHBhcnNlcgorICAgICAgICBpZiBlbXB0eV9lbGVtZW50X3RhZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVtcHR5X2VsZW1lbnRfdGFncyA9IHNldChlbXB0eV9lbGVtZW50X3RhZ3MpCisgICAgICAgIHNlbGYuc291cCA9IE5vbmUKKyAgICAgICAgc2VsZi5uc21hcHMgPSBbc2VsZi5ERUZBVUxUX05TTUFQU10KKworICAgIGRlZiBfZ2V0TnNUYWcoc2VsZiwgdGFnKToKKyAgICAgICAgIyBTcGxpdCB0aGUgbmFtZXNwYWNlIFVSTCBvdXQgb2YgYSBmdWxseS1xdWFsaWZpZWQgbHhtbCB0YWcKKyAgICAgICAgIyBuYW1lLiBDb3BpZWQgZnJvbSBseG1sJ3Mgc3JjL2x4bWwvc2F4LnB5LgorICAgICAgICBpZiB0YWdbMF0gPT0gJ3snOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHRhZ1sxOl0uc3BsaXQoJ30nLCAxKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgdGFnKQorCisgICAgZGVmIHByZXBhcmVfbWFya3VwKHNlbGYsIG1hcmt1cCwgdXNlcl9zcGVjaWZpZWRfZW5jb2Rpbmc9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICA6eWllbGQ6IEEgc2VyaWVzIG9mIDQtdHVwbGVzLgorICAgICAgICAgKG1hcmt1cCwgZW5jb2RpbmcsIGRlY2xhcmVkIGVuY29kaW5nLAorICAgICAgICAgIGhhcyB1bmRlcmdvbmUgY2hhcmFjdGVyIHJlcGxhY2VtZW50KQorCisgICAgICAgIEVhY2ggNC10dXBsZSByZXByZXNlbnRzIGEgc3RyYXRlZ3kgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrdXAsIHVuaWNvZGUpOgorICAgICAgICAgICAgIyBXZSB3ZXJlIGdpdmVuIFVuaWNvZGUuIE1heWJlIGx4bWwgY2FuIHBhcnNlIFVuaWNvZGUgb24KKyAgICAgICAgICAgICMgdGhpcyBzeXN0ZW0/CisgICAgICAgICAgICB5aWVsZCBtYXJrdXAsIE5vbmUsIGRvY3VtZW50X2RlY2xhcmVkX2VuY29kaW5nLCBGYWxzZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKToKKyAgICAgICAgICAgICMgTm8sIGFwcGFyZW50bHkgbm90LiBDb252ZXJ0IHRoZSBVbmljb2RlIHRvIFVURi04IGFuZAorICAgICAgICAgICAgIyB0ZWxsIGx4bWwgdG8gcGFyc2UgaXQgYXMgVVRGLTguCisgICAgICAgICAgICB5aWVsZCAobWFya3VwLmVuY29kZSgidXRmOCIpLCAidXRmOCIsCisgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2RpbmcsIEZhbHNlKQorCisgICAgICAgICMgSW5zdGVhZCBvZiB1c2luZyBVbmljb2RlRGFtbWl0IHRvIGNvbnZlcnQgdGhlIGJ5dGVzdHJpbmcgdG8KKyAgICAgICAgIyBVbmljb2RlIHVzaW5nIGRpZmZlcmVudCBlbmNvZGluZ3MsIHVzZSBFbmNvZGluZ0RldGVjdG9yIHRvCisgICAgICAgICMgaXRlcmF0ZSBvdmVyIHRoZSBlbmNvZGluZ3MsIGFuZCB0ZWxsIGx4bWwgdG8gdHJ5IHRvIHBhcnNlCisgICAgICAgICMgdGhlIGRvY3VtZW50IGFzIGVhY2ggb25lIGluIHR1cm4uCisgICAgICAgIGlzX2h0bWwgPSBub3Qgc2VsZi5pc194bWwKKyAgICAgICAgdHJ5X2VuY29kaW5ncyA9IFt1c2VyX3NwZWNpZmllZF9lbmNvZGluZywgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2RpbmddCisgICAgICAgIGRldGVjdG9yID0gRW5jb2RpbmdEZXRlY3RvcihtYXJrdXAsIHRyeV9lbmNvZGluZ3MsIGlzX2h0bWwpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBkZXRlY3Rvci5lbmNvZGluZ3M6CisgICAgICAgICAgICB5aWVsZCAoZGV0ZWN0b3IubWFya3VwLCBlbmNvZGluZywgZG9jdW1lbnRfZGVjbGFyZWRfZW5jb2RpbmcsIEZhbHNlKQorCisgICAgZGVmIGZlZWQoc2VsZiwgbWFya3VwKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrdXAsIGJ5dGVzKToKKyAgICAgICAgICAgIG1hcmt1cCA9IEJ5dGVzSU8obWFya3VwKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya3VwLCB1bmljb2RlKToKKyAgICAgICAgICAgIG1hcmt1cCA9IFN0cmluZ0lPKG1hcmt1cCkKKworICAgICAgICAjIENhbGwgZmVlZCgpIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgdGhlIG1hcmt1cCBpcyBlbXB0eSwKKyAgICAgICAgIyBvciB0aGUgcGFyc2VyIHdvbid0IGJlIGluaXRpYWxpemVkLgorICAgICAgICBkYXRhID0gbWFya3VwLnJlYWQoc2VsZi5DSFVOS19TSVpFKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYucGFyc2VyX2ZvcihzZWxmLnNvdXAub3JpZ2luYWxfZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLnBhcnNlci5mZWVkKGRhdGEpCisgICAgICAgICAgICB3aGlsZSBsZW4oZGF0YSkgIT0gMDoKKyAgICAgICAgICAgICAgICAjIE5vdyBjYWxsIGZlZWQoKSBvbiB0aGUgcmVzdCBvZiB0aGUgZGF0YSwgY2h1bmsgYnkgY2h1bmsuCisgICAgICAgICAgICAgICAgZGF0YSA9IG1hcmt1cC5yZWFkKHNlbGYuQ0hVTktfU0laRSkKKyAgICAgICAgICAgICAgICBpZiBsZW4oZGF0YSkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmVlZChkYXRhKQorICAgICAgICAgICAgc2VsZi5wYXJzZXIuY2xvc2UoKQorICAgICAgICBleGNlcHQgKFVuaWNvZGVEZWNvZGVFcnJvciwgTG9va3VwRXJyb3IsIGV0cmVlLlBhcnNlckVycm9yKSwgZToKKyAgICAgICAgICAgIHJhaXNlIFBhcnNlclJlamVjdGVkTWFya3VwKHN0cihlKSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5uc21hcHMgPSBbc2VsZi5ERUZBVUxUX05TTUFQU10KKworICAgIGRlZiBzdGFydChzZWxmLCBuYW1lLCBhdHRycywgbnNtYXA9e30pOgorICAgICAgICAjIE1ha2Ugc3VyZSBhdHRycyBpcyBhIG11dGFibGUgZGljdC0tbHhtbCBtYXkgc2VuZCBhbiBpbW11dGFibGUgZGljdHByb3h5LgorICAgICAgICBhdHRycyA9IGRpY3QoYXR0cnMpCisgICAgICAgIG5zcHJlZml4ID0gTm9uZQorICAgICAgICAjIEludmVydCBlYWNoIG5hbWVzcGFjZSBtYXAgYXMgaXQgY29tZXMgaW4uCisgICAgICAgIGlmIGxlbihzZWxmLm5zbWFwcykgPiAxOgorICAgICAgICAgICAgIyBUaGVyZSBhcmUgbm8gbmV3IG5hbWVzcGFjZXMgZm9yIHRoaXMgdGFnLCBidXQKKyAgICAgICAgICAgICMgbm9uLWRlZmF1bHQgbmFtZXNwYWNlcyBhcmUgaW4gcGxheSwgc28gd2UgbmVlZCBhCisgICAgICAgICAgICAjIHNlcGFyYXRlIHRhZyBzdGFjayB0byBrbm93IHdoZW4gdGhleSBlbmQuCisgICAgICAgICAgICBzZWxmLm5zbWFwcy5hcHBlbmQoTm9uZSkKKyAgICAgICAgZWxpZiBsZW4obnNtYXApID4gMDoKKyAgICAgICAgICAgICMgQSBuZXcgbmFtZXNwYWNlIG1hcHBpbmcgaGFzIGNvbWUgaW50byBwbGF5LgorICAgICAgICAgICAgaW52ZXJ0ZWRfbnNtYXAgPSBkaWN0KCh2YWx1ZSwga2V5KSBmb3Iga2V5LCB2YWx1ZSBpbiBuc21hcC5pdGVtcygpKQorICAgICAgICAgICAgc2VsZi5uc21hcHMuYXBwZW5kKGludmVydGVkX25zbWFwKQorICAgICAgICAgICAgIyBBbHNvIHRyZWF0IHRoZSBuYW1lc3BhY2UgbWFwcGluZyBhcyBhIHNldCBvZiBhdHRyaWJ1dGVzIG9uIHRoZQorICAgICAgICAgICAgIyB0YWcsIHNvIHdlIGNhbiByZWNyZWF0ZSBpdCBsYXRlci4KKyAgICAgICAgICAgIGF0dHJzID0gYXR0cnMuY29weSgpCisgICAgICAgICAgICBmb3IgcHJlZml4LCBuYW1lc3BhY2UgaW4gbnNtYXAuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBOYW1lc3BhY2VkQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAieG1sbnMiLCBwcmVmaXgsICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIpCisgICAgICAgICAgICAgICAgYXR0cnNbYXR0cmlidXRlXSA9IG5hbWVzcGFjZQorCisgICAgICAgICMgTmFtZXNwYWNlcyBhcmUgaW4gcGxheS4gRmluZCBhbnkgYXR0cmlidXRlcyB0aGF0IGNhbWUgaW4KKyAgICAgICAgIyBmcm9tIGx4bWwgd2l0aCBuYW1lc3BhY2VzIGF0dGFjaGVkIHRvIHRoZWlyIG5hbWVzLCBhbmQKKyAgICAgICAgIyB0dXJuIHRoZW4gaW50byBOYW1lc3BhY2VkQXR0cmlidXRlIG9iamVjdHMuCisgICAgICAgIG5ld19hdHRycyA9IHt9CisgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiBhdHRycy5pdGVtcygpOgorICAgICAgICAgICAgbmFtZXNwYWNlLCBhdHRyID0gc2VsZi5fZ2V0TnNUYWcoYXR0cikKKyAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIG5ld19hdHRyc1thdHRyXSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5zcHJlZml4ID0gc2VsZi5fcHJlZml4X2Zvcl9uYW1lc3BhY2UobmFtZXNwYWNlKQorICAgICAgICAgICAgICAgIGF0dHIgPSBOYW1lc3BhY2VkQXR0cmlidXRlKG5zcHJlZml4LCBhdHRyLCBuYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgbmV3X2F0dHJzW2F0dHJdID0gdmFsdWUKKyAgICAgICAgYXR0cnMgPSBuZXdfYXR0cnMKKworICAgICAgICBuYW1lc3BhY2UsIG5hbWUgPSBzZWxmLl9nZXROc1RhZyhuYW1lKQorICAgICAgICBuc3ByZWZpeCA9IHNlbGYuX3ByZWZpeF9mb3JfbmFtZXNwYWNlKG5hbWVzcGFjZSkKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9zdGFydHRhZyhuYW1lLCBuYW1lc3BhY2UsIG5zcHJlZml4LCBhdHRycykKKworICAgIGRlZiBfcHJlZml4X2Zvcl9uYW1lc3BhY2Uoc2VsZiwgbmFtZXNwYWNlKToKKyAgICAgICAgIiIiRmluZCB0aGUgY3VycmVudGx5IGFjdGl2ZSBwcmVmaXggZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UuIiIiCisgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZm9yIGludmVydGVkX25zbWFwIGluIHJldmVyc2VkKHNlbGYubnNtYXBzKToKKyAgICAgICAgICAgIGlmIGludmVydGVkX25zbWFwIGlzIG5vdCBOb25lIGFuZCBuYW1lc3BhY2UgaW4gaW52ZXJ0ZWRfbnNtYXA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludmVydGVkX25zbWFwW25hbWVzcGFjZV0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBlbmQoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgY29tcGxldGVkX3RhZyA9IHNlbGYuc291cC50YWdTdGFja1stMV0KKyAgICAgICAgbmFtZXNwYWNlLCBuYW1lID0gc2VsZi5fZ2V0TnNUYWcobmFtZSkKKyAgICAgICAgbnNwcmVmaXggPSBOb25lCisgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBpbnZlcnRlZF9uc21hcCBpbiByZXZlcnNlZChzZWxmLm5zbWFwcyk6CisgICAgICAgICAgICAgICAgaWYgaW52ZXJ0ZWRfbnNtYXAgaXMgbm90IE5vbmUgYW5kIG5hbWVzcGFjZSBpbiBpbnZlcnRlZF9uc21hcDoKKyAgICAgICAgICAgICAgICAgICAgbnNwcmVmaXggPSBpbnZlcnRlZF9uc21hcFtuYW1lc3BhY2VdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuc291cC5oYW5kbGVfZW5kdGFnKG5hbWUsIG5zcHJlZml4KQorICAgICAgICBpZiBsZW4oc2VsZi5uc21hcHMpID4gMToKKyAgICAgICAgICAgICMgVGhpcyB0YWcsIG9yIG9uZSBvZiBpdHMgcGFyZW50cywgaW50cm9kdWNlZCBhIG5hbWVzcGFjZQorICAgICAgICAgICAgIyBtYXBwaW5nLCBzbyBwb3AgaXQgb2ZmIHRoZSBzdGFjay4KKyAgICAgICAgICAgIHNlbGYubnNtYXBzLnBvcCgpCisKKyAgICBkZWYgcGkoc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRhdGEoc2VsZiwgY29udGVudCk6CisgICAgICAgIHNlbGYuc291cC5oYW5kbGVfZGF0YShjb250ZW50KQorCisgICAgZGVmIGRvY3R5cGUoc2VsZiwgbmFtZSwgcHViaWQsIHN5c3RlbSk6CisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgZG9jdHlwZSA9IERvY3R5cGUuZm9yX25hbWVfYW5kX2lkcyhuYW1lLCBwdWJpZCwgc3lzdGVtKQorICAgICAgICBzZWxmLnNvdXAub2JqZWN0X3dhc19wYXJzZWQoZG9jdHlwZSkKKworICAgIGRlZiBjb21tZW50KHNlbGYsIGNvbnRlbnQpOgorICAgICAgICAiSGFuZGxlIGNvbW1lbnRzIGFzIENvbW1lbnQgb2JqZWN0cy4iCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKCkKKyAgICAgICAgc2VsZi5zb3VwLmhhbmRsZV9kYXRhKGNvbnRlbnQpCisgICAgICAgIHNlbGYuc291cC5lbmREYXRhKENvbW1lbnQpCisKKyAgICBkZWYgdGVzdF9mcmFnbWVudF90b19kb2N1bWVudChzZWxmLCBmcmFnbWVudCk6CisgICAgICAgICIiIlNlZSBgVHJlZUJ1aWxkZXJgLiIiIgorICAgICAgICByZXR1cm4gdSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PlxuJXMnICUgZnJhZ21lbnQKKworCitjbGFzcyBMWE1MVHJlZUJ1aWxkZXIoSFRNTFRyZWVCdWlsZGVyLCBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwpOgorCisgICAgZmVhdHVyZXMgPSBbTFhNTCwgSFRNTCwgRkFTVCwgUEVSTUlTU0lWRV0KKyAgICBpc194bWwgPSBGYWxzZQorCisgICAgZGVmIGRlZmF1bHRfcGFyc2VyKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgcmV0dXJuIGV0cmVlLkhUTUxQYXJzZXIKKworICAgIGRlZiBmZWVkKHNlbGYsIG1hcmt1cCk6CisgICAgICAgIGVuY29kaW5nID0gc2VsZi5zb3VwLm9yaWdpbmFsX2VuY29kaW5nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5wYXJzZXJfZm9yKGVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmVlZChtYXJrdXApCisgICAgICAgICAgICBzZWxmLnBhcnNlci5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCAoVW5pY29kZURlY29kZUVycm9yLCBMb29rdXBFcnJvciwgZXRyZWUuUGFyc2VyRXJyb3IpLCBlOgorICAgICAgICAgICAgcmFpc2UgUGFyc2VyUmVqZWN0ZWRNYXJrdXAoc3RyKGUpKQorCisKKyAgICBkZWYgdGVzdF9mcmFnbWVudF90b19kb2N1bWVudChzZWxmLCBmcmFnbWVudCk6CisgICAgICAgICIiIlNlZSBgVHJlZUJ1aWxkZXJgLiIiIgorICAgICAgICByZXR1cm4gdSc8aHRtbD48Ym9keT4lczwvYm9keT48L2h0bWw+JyAlIGZyYWdtZW50CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvZGFtbWl0LnB5IGIvYml0YmFrZS9saWIvYnM0L2RhbW1pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY0MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L2RhbW1pdC5weQpAQCAtMCwwICsxLDgyOSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyIiIkJlYXV0aWZ1bCBTb3VwIGJvbnVzIGxpYnJhcnk6IFVuaWNvZGUsIERhbW1pdAorCitUaGlzIGxpYnJhcnkgY29udmVydHMgYSBieXRlc3RyZWFtIHRvIFVuaWNvZGUgdGhyb3VnaCBhbnkgbWVhbnMKK25lY2Vzc2FyeS4gSXQgaXMgaGVhdmlseSBiYXNlZCBvbiBjb2RlIGZyb20gTWFyayBQaWxncmltJ3MgVW5pdmVyc2FsCitGZWVkIFBhcnNlci4gSXQgd29ya3MgYmVzdCBvbiBYTUwgYW5kIFhNTCwgYnV0IGl0IGRvZXMgbm90IHJld3JpdGUgdGhlCitYTUwgb3IgSFRNTCB0byByZWZsZWN0IGEgbmV3IGVuY29kaW5nOyB0aGF0J3MgdGhlIHRyZWUgYnVpbGRlcidzIGpvYi4KKyIiIgorCitpbXBvcnQgY29kZWNzCitmcm9tIGh0bWxlbnRpdHlkZWZzIGltcG9ydCBjb2RlcG9pbnQybmFtZQoraW1wb3J0IHJlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN0cmluZworCisjIEltcG9ydCBhIGxpYnJhcnkgdG8gYXV0b2RldGVjdCBjaGFyYWN0ZXIgZW5jb2RpbmdzLgorY2hhcmRldF90eXBlID0gTm9uZQordHJ5OgorICAgICMgRmlyc3QgdHJ5IHRoZSBmYXN0IEMgaW1wbGVtZW50YXRpb24uCisgICAgIyAgUHlQSSBwYWNrYWdlOiBjY2hhcmRldAorICAgIGltcG9ydCBjY2hhcmRldAorICAgIGRlZiBjaGFyZGV0X2RhbW1pdChzKToKKyAgICAgICAgcmV0dXJuIGNjaGFyZGV0LmRldGVjdChzKVsnZW5jb2RpbmcnXQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRyeToKKyAgICAgICAgIyBGYWxsIGJhY2sgdG8gdGhlIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uCisgICAgICAgICMgIERlYmlhbiBwYWNrYWdlOiBweXRob24tY2hhcmRldAorICAgICAgICAjICBQeVBJIHBhY2thZ2U6IGNoYXJkZXQKKyAgICAgICAgaW1wb3J0IGNoYXJkZXQKKyAgICAgICAgZGVmIGNoYXJkZXRfZGFtbWl0KHMpOgorICAgICAgICAgICAgcmV0dXJuIGNoYXJkZXQuZGV0ZWN0KHMpWydlbmNvZGluZyddCisgICAgICAgICNpbXBvcnQgY2hhcmRldC5jb25zdGFudHMKKyAgICAgICAgI2NoYXJkZXQuY29uc3RhbnRzLl9kZWJ1ZyA9IDEKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgTm8gY2hhcmRldCBhdmFpbGFibGUuCisgICAgICAgIGRlZiBjaGFyZGV0X2RhbW1pdChzKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyMgQXZhaWxhYmxlIGZyb20gaHR0cDovL2Nqa3B5dGhvbi5pMThuLm9yZy8uCit0cnk6CisgICAgaW1wb3J0IGljb252X2NvZGVjCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCit4bWxfZW5jb2RpbmdfcmUgPSByZS5jb21waWxlKAorICAgICdePFw/LiplbmNvZGluZz1bXCciXSguKj8pW1wnIl0uKlw/PicuZW5jb2RlKCksIHJlLkkpCitodG1sX21ldGFfcmUgPSByZS5jb21waWxlKAorICAgICc8XHMqbWV0YVtePl0rY2hhcnNldFxzKj1ccypbIlwnXT8oW14+XSo/KVsgLztcJyI+XScuZW5jb2RlKCksIHJlLkkpCisKK2NsYXNzIEVudGl0eVN1YnN0aXR1dGlvbihvYmplY3QpOgorCisgICAgIiIiU3Vic3RpdHV0ZSBYTUwgb3IgSFRNTCBlbnRpdGllcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVycy4iIiIKKworICAgIGRlZiBfcG9wdWxhdGVfY2xhc3NfdmFyaWFibGVzKCk6CisgICAgICAgIGxvb2t1cCA9IHt9CisgICAgICAgIHJldmVyc2VfbG9va3VwID0ge30KKyAgICAgICAgY2hhcmFjdGVyc19mb3JfcmUgPSBbXQorICAgICAgICBmb3IgY29kZXBvaW50LCBuYW1lIGluIGxpc3QoY29kZXBvaW50Mm5hbWUuaXRlbXMoKSk6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSB1bmljaHIoY29kZXBvaW50KQorICAgICAgICAgICAgaWYgY29kZXBvaW50ICE9IDM0OgorICAgICAgICAgICAgICAgICMgVGhlcmUncyBubyBwb2ludCBpbiB0dXJuaW5nIHRoZSBxdW90YXRpb24gbWFyayBpbnRvCisgICAgICAgICAgICAgICAgIyAmcXVvdDssIHVubGVzcyBpdCBoYXBwZW5zIHdpdGhpbiBhbiBhdHRyaWJ1dGUgdmFsdWUsIHdoaWNoCisgICAgICAgICAgICAgICAgIyBpcyBoYW5kbGVkIGVsc2V3aGVyZS4KKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzX2Zvcl9yZS5hcHBlbmQoY2hhcmFjdGVyKQorICAgICAgICAgICAgICAgIGxvb2t1cFtjaGFyYWN0ZXJdID0gbmFtZQorICAgICAgICAgICAgIyBCdXQgd2UgZG8gd2FudCB0byB0dXJuICZxdW90OyBpbnRvIHRoZSBxdW90YXRpb24gbWFyay4KKyAgICAgICAgICAgIHJldmVyc2VfbG9va3VwW25hbWVdID0gY2hhcmFjdGVyCisgICAgICAgIHJlX2RlZmluaXRpb24gPSAiWyVzXSIgJSAiIi5qb2luKGNoYXJhY3RlcnNfZm9yX3JlKQorICAgICAgICByZXR1cm4gbG9va3VwLCByZXZlcnNlX2xvb2t1cCwgcmUuY29tcGlsZShyZV9kZWZpbml0aW9uKQorICAgIChDSEFSQUNURVJfVE9fSFRNTF9FTlRJVFksIEhUTUxfRU5USVRZX1RPX0NIQVJBQ1RFUiwKKyAgICAgQ0hBUkFDVEVSX1RPX0hUTUxfRU5USVRZX1JFKSA9IF9wb3B1bGF0ZV9jbGFzc192YXJpYWJsZXMoKQorCisgICAgQ0hBUkFDVEVSX1RPX1hNTF9FTlRJVFkgPSB7CisgICAgICAgICInIjogImFwb3MiLAorICAgICAgICAnIic6ICJxdW90IiwKKyAgICAgICAgIiYiOiAiYW1wIiwKKyAgICAgICAgIjwiOiAibHQiLAorICAgICAgICAiPiI6ICJndCIsCisgICAgICAgIH0KKworICAgIEJBUkVfQU1QRVJTQU5EX09SX0JSQUNLRVQgPSByZS5jb21waWxlKCIoWzw+XXwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiYoPyEjXGQrO3wjeFswLTlhLWZBLUZdKzt8XHcrOykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKQorCisgICAgQU1QRVJTQU5EX09SX0JSQUNLRVQgPSByZS5jb21waWxlKCIoWzw+Jl0pIikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfc3Vic3RpdHV0ZV9odG1sX2VudGl0eShjbHMsIG1hdGNob2JqKToKKyAgICAgICAgZW50aXR5ID0gY2xzLkNIQVJBQ1RFUl9UT19IVE1MX0VOVElUWS5nZXQobWF0Y2hvYmouZ3JvdXAoMCkpCisgICAgICAgIHJldHVybiAiJiVzOyIgJSBlbnRpdHkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfc3Vic3RpdHV0ZV94bWxfZW50aXR5KGNscywgbWF0Y2hvYmopOgorICAgICAgICAiIiJVc2VkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc3Vic3RpdHV0ZSB0aGUKKyAgICAgICAgYXBwcm9wcmlhdGUgWE1MIGVudGl0eSBmb3IgYW4gWE1MIHNwZWNpYWwgY2hhcmFjdGVyLiIiIgorICAgICAgICBlbnRpdHkgPSBjbHMuQ0hBUkFDVEVSX1RPX1hNTF9FTlRJVFlbbWF0Y2hvYmouZ3JvdXAoMCldCisgICAgICAgIHJldHVybiAiJiVzOyIgJSBlbnRpdHkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBxdW90ZWRfYXR0cmlidXRlX3ZhbHVlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiTWFrZSBhIHZhbHVlIGludG8gYSBxdW90ZWQgWE1MIGF0dHJpYnV0ZSwgcG9zc2libHkgZXNjYXBpbmcgaXQuCisKKyAgICAgICAgIE1vc3Qgc3RyaW5ncyB3aWxsIGJlIHF1b3RlZCB1c2luZyBkb3VibGUgcXVvdGVzLgorCisgICAgICAgICAgQm9iJ3MgQmFyIC0+ICJCb2IncyBCYXIiCisKKyAgICAgICAgIElmIGEgc3RyaW5nIGNvbnRhaW5zIGRvdWJsZSBxdW90ZXMsIGl0IHdpbGwgYmUgcXVvdGVkIHVzaW5nCisgICAgICAgICBzaW5nbGUgcXVvdGVzLgorCisgICAgICAgICAgV2VsY29tZSB0byAibXkgYmFyIiAtPiAnV2VsY29tZSB0byAibXkgYmFyIicKKworICAgICAgICAgSWYgYSBzdHJpbmcgY29udGFpbnMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMsIHRoZQorICAgICAgICAgZG91YmxlIHF1b3RlcyB3aWxsIGJlIGVzY2FwZWQsIGFuZCB0aGUgc3RyaW5nIHdpbGwgYmUgcXVvdGVkCisgICAgICAgICB1c2luZyBkb3VibGUgcXVvdGVzLgorCisgICAgICAgICAgV2VsY29tZSB0byAiQm9iJ3MgQmFyIiAtPiAiV2VsY29tZSB0byAmcXVvdDtCb2IncyBiYXImcXVvdDsKKyAgICAgICAgIiIiCisgICAgICAgIHF1b3RlX3dpdGggPSAnIicKKyAgICAgICAgaWYgJyInIGluIHZhbHVlOgorICAgICAgICAgICAgaWYgIiciIGluIHZhbHVlOgorICAgICAgICAgICAgICAgICMgVGhlIHN0cmluZyBjb250YWlucyBib3RoIHNpbmdsZSBhbmQgZG91YmxlCisgICAgICAgICAgICAgICAgIyBxdW90ZXMuICBUdXJuIHRoZSBkb3VibGUgcXVvdGVzIGludG8KKyAgICAgICAgICAgICAgICAjIGVudGl0aWVzLiBXZSBxdW90ZSB0aGUgZG91YmxlIHF1b3RlcyByYXRoZXIgdGhhbgorICAgICAgICAgICAgICAgICMgdGhlIHNpbmdsZSBxdW90ZXMgYmVjYXVzZSB0aGUgZW50aXR5IG5hbWUgaXMKKyAgICAgICAgICAgICAgICAjICImcXVvdDsiIHdoZXRoZXIgdGhpcyBpcyBIVE1MIG9yIFhNTC4gIElmIHdlCisgICAgICAgICAgICAgICAgIyBxdW90ZWQgdGhlIHNpbmdsZSBxdW90ZXMsIHdlJ2QgaGF2ZSB0byBkZWNpZGUKKyAgICAgICAgICAgICAgICAjIGJldHdlZW4gJmFwb3M7IGFuZCAmc3F1b3Q7LgorICAgICAgICAgICAgICAgIHJlcGxhY2Vfd2l0aCA9ICImcXVvdDsiCisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCciJywgcmVwbGFjZV93aXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFRoZXJlIGFyZSBkb3VibGUgcXVvdGVzIGJ1dCBubyBzaW5nbGUgcXVvdGVzLgorICAgICAgICAgICAgICAgICMgV2UgY2FuIHVzZSBzaW5nbGUgcXVvdGVzIHRvIHF1b3RlIHRoZSBhdHRyaWJ1dGUuCisgICAgICAgICAgICAgICAgcXVvdGVfd2l0aCA9ICInIgorICAgICAgICByZXR1cm4gcXVvdGVfd2l0aCArIHZhbHVlICsgcXVvdGVfd2l0aAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN1YnN0aXR1dGVfeG1sKGNscywgdmFsdWUsIG1ha2VfcXVvdGVkX2F0dHJpYnV0ZT1GYWxzZSk6CisgICAgICAgICIiIlN1YnN0aXR1dGUgWE1MIGVudGl0aWVzIGZvciBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzLgorCisgICAgICAgIDpwYXJhbSB2YWx1ZTogQSBzdHJpbmcgdG8gYmUgc3Vic3RpdHV0ZWQuIFRoZSBsZXNzLXRoYW4gc2lnbgorICAgICAgICAgIHdpbGwgYmVjb21lICZsdDssIHRoZSBncmVhdGVyLXRoYW4gc2lnbiB3aWxsIGJlY29tZSAmZ3Q7LAorICAgICAgICAgIGFuZCBhbnkgYW1wZXJzYW5kcyB3aWxsIGJlY29tZSAmYW1wOy4gSWYgeW91IHdhbnQgYW1wZXJzYW5kcworICAgICAgICAgIHRoYXQgYXBwZWFyIHRvIGJlIHBhcnQgb2YgYW4gZW50aXR5IGRlZmluaXRpb24gdG8gYmUgbGVmdAorICAgICAgICAgIGFsb25lLCB1c2Ugc3Vic3RpdHV0ZV94bWxfY29udGFpbmluZ19lbnRpdGllcygpIGluc3RlYWQuCisKKyAgICAgICAgOnBhcmFtIG1ha2VfcXVvdGVkX2F0dHJpYnV0ZTogSWYgVHJ1ZSwgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUKKyAgICAgICAgIHF1b3RlZCwgYXMgYmVmaXRzIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgRXNjYXBlIGFuZ2xlIGJyYWNrZXRzIGFuZCBhbXBlcnNhbmRzLgorICAgICAgICB2YWx1ZSA9IGNscy5BTVBFUlNBTkRfT1JfQlJBQ0tFVC5zdWIoCisgICAgICAgICAgICBjbHMuX3N1YnN0aXR1dGVfeG1sX2VudGl0eSwgdmFsdWUpCisKKyAgICAgICAgaWYgbWFrZV9xdW90ZWRfYXR0cmlidXRlOgorICAgICAgICAgICAgdmFsdWUgPSBjbHMucXVvdGVkX2F0dHJpYnV0ZV92YWx1ZSh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc3Vic3RpdHV0ZV94bWxfY29udGFpbmluZ19lbnRpdGllcygKKyAgICAgICAgY2xzLCB2YWx1ZSwgbWFrZV9xdW90ZWRfYXR0cmlidXRlPUZhbHNlKToKKyAgICAgICAgIiIiU3Vic3RpdHV0ZSBYTUwgZW50aXRpZXMgZm9yIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMuCisKKyAgICAgICAgOnBhcmFtIHZhbHVlOiBBIHN0cmluZyB0byBiZSBzdWJzdGl0dXRlZC4gVGhlIGxlc3MtdGhhbiBzaWduIHdpbGwKKyAgICAgICAgICBiZWNvbWUgJmx0OywgdGhlIGdyZWF0ZXItdGhhbiBzaWduIHdpbGwgYmVjb21lICZndDssIGFuZCBhbnkKKyAgICAgICAgICBhbXBlcnNhbmRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFuIGVudGl0eSBkZWZpdGlvbiB3aWxsCisgICAgICAgICAgYmVjb21lICZhbXA7LgorCisgICAgICAgIDpwYXJhbSBtYWtlX3F1b3RlZF9hdHRyaWJ1dGU6IElmIFRydWUsIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlCisgICAgICAgICBxdW90ZWQsIGFzIGJlZml0cyBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgICIiIgorICAgICAgICAjIEVzY2FwZSBhbmdsZSBicmFja2V0cywgYW5kIGFtcGVyc2FuZHMgdGhhdCBhcmVuJ3QgcGFydCBvZgorICAgICAgICAjIGVudGl0aWVzLgorICAgICAgICB2YWx1ZSA9IGNscy5CQVJFX0FNUEVSU0FORF9PUl9CUkFDS0VULnN1YigKKyAgICAgICAgICAgIGNscy5fc3Vic3RpdHV0ZV94bWxfZW50aXR5LCB2YWx1ZSkKKworICAgICAgICBpZiBtYWtlX3F1b3RlZF9hdHRyaWJ1dGU6CisgICAgICAgICAgICB2YWx1ZSA9IGNscy5xdW90ZWRfYXR0cmlidXRlX3ZhbHVlKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzdWJzdGl0dXRlX2h0bWwoY2xzLCBzKToKKyAgICAgICAgIiIiUmVwbGFjZSBjZXJ0YWluIFVuaWNvZGUgY2hhcmFjdGVycyB3aXRoIG5hbWVkIEhUTUwgZW50aXRpZXMuCisKKyAgICAgICAgVGhpcyBkaWZmZXJzIGZyb20gZGF0YS5lbmNvZGUoZW5jb2RpbmcsICd4bWxjaGFycmVmcmVwbGFjZScpCisgICAgICAgIGluIHRoYXQgdGhlIGdvYWwgaXMgdG8gbWFrZSB0aGUgcmVzdWx0IG1vcmUgcmVhZGFibGUgKHRvIHRob3NlCisgICAgICAgIHdpdGggQVNDSUkgZGlzcGxheXMpIHJhdGhlciB0aGFuIHRvIHJlY292ZXIgZnJvbQorICAgICAgICBlcnJvcnMuIFRoZXJlJ3MgYWJzb2x1dGVseSBub3RoaW5nIHdyb25nIHdpdGggYSBVVEYtOCBzdHJpbmcKKyAgICAgICAgY29udGFpbmcgYSBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFLCBidXQgcmVwbGFjaW5nIHRoYXQKKyAgICAgICAgY2hhcmFjdGVyIHdpdGggIiZlYWN1dGU7IiB3aWxsIG1ha2UgaXQgbW9yZSByZWFkYWJsZSB0byBzb21lCisgICAgICAgIHBlb3BsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBjbHMuQ0hBUkFDVEVSX1RPX0hUTUxfRU5USVRZX1JFLnN1YigKKyAgICAgICAgICAgIGNscy5fc3Vic3RpdHV0ZV9odG1sX2VudGl0eSwgcykKKworCitjbGFzcyBFbmNvZGluZ0RldGVjdG9yOgorICAgICIiIlN1Z2dlc3RzIGEgbnVtYmVyIG9mIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBieXRlc3RyaW5nLgorCisgICAgT3JkZXIgb2YgcHJlY2VkZW5jZToKKworICAgIDEuIEVuY29kaW5ncyB5b3Ugc3BlY2lmaWNhbGx5IHRlbGwgRW5jb2RpbmdEZXRlY3RvciB0byB0cnkgZmlyc3QKKyAgICAodGhlIG92ZXJyaWRlX2VuY29kaW5ncyBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IpLgorCisgICAgMi4gQW4gZW5jb2RpbmcgZGVjbGFyZWQgd2l0aGluIHRoZSBieXRlc3RyaW5nIGl0c2VsZiwgZWl0aGVyIGluIGFuCisgICAgWE1MIGRlY2xhcmF0aW9uIChpZiB0aGUgYnl0ZXN0cmluZyBpcyB0byBiZSBpbnRlcnByZXRlZCBhcyBhbiBYTUwKKyAgICBkb2N1bWVudCksIG9yIGluIGEgPG1ldGE+IHRhZyAoaWYgdGhlIGJ5dGVzdHJpbmcgaXMgdG8gYmUKKyAgICBpbnRlcnByZXRlZCBhcyBhbiBIVE1MIGRvY3VtZW50LikKKworICAgIDMuIEFuIGVuY29kaW5nIGRldGVjdGVkIHRocm91Z2ggdGV4dHVhbCBhbmFseXNpcyBieSBjaGFyZGV0LAorICAgIGNjaGFyZGV0LCBvciBhIHNpbWlsYXIgZXh0ZXJuYWwgbGlicmFyeS4KKworICAgIDQuIFVURi04LgorCisgICAgNS4gV2luZG93cy0xMjUyLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrdXAsIG92ZXJyaWRlX2VuY29kaW5ncz1Ob25lLCBpc19odG1sPUZhbHNlKToKKyAgICAgICAgc2VsZi5vdmVycmlkZV9lbmNvZGluZ3MgPSBvdmVycmlkZV9lbmNvZGluZ3Mgb3IgW10KKyAgICAgICAgc2VsZi5jaGFyZGV0X2VuY29kaW5nID0gTm9uZQorICAgICAgICBzZWxmLmlzX2h0bWwgPSBpc19odG1sCisgICAgICAgIHNlbGYuZGVjbGFyZWRfZW5jb2RpbmcgPSBOb25lCisKKyAgICAgICAgIyBGaXJzdCBvcmRlciBvZiBidXNpbmVzczogc3RyaXAgYSBieXRlLW9yZGVyIG1hcmsuCisgICAgICAgIHNlbGYubWFya3VwLCBzZWxmLnNuaWZmZWRfZW5jb2RpbmcgPSBzZWxmLnN0cmlwX2J5dGVfb3JkZXJfbWFyayhtYXJrdXApCisKKyAgICBkZWYgX3VzYWJsZShzZWxmLCBlbmNvZGluZywgdHJpZWQpOgorICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcubG93ZXIoKQorICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIHRyaWVkOgorICAgICAgICAgICAgICAgIHRyaWVkLmFkZChlbmNvZGluZykKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmNvZGluZ3Moc2VsZik6CisgICAgICAgICIiIllpZWxkIGEgbnVtYmVyIG9mIGVuY29kaW5ncyB0aGF0IG1pZ2h0IHdvcmsgZm9yIHRoaXMgbWFya3VwLiIiIgorICAgICAgICB0cmllZCA9IHNldCgpCisgICAgICAgIGZvciBlIGluIHNlbGYub3ZlcnJpZGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgaWYgc2VsZi5fdXNhYmxlKGUsIHRyaWVkKToKKyAgICAgICAgICAgICAgICB5aWVsZCBlCisKKyAgICAgICAgIyBEaWQgdGhlIGRvY3VtZW50IG9yaWdpbmFsbHkgc3RhcnQgd2l0aCBhIGJ5dGUtb3JkZXIgbWFyaworICAgICAgICAjIHRoYXQgaW5kaWNhdGVkIGl0cyBlbmNvZGluZz8KKyAgICAgICAgaWYgc2VsZi5fdXNhYmxlKHNlbGYuc25pZmZlZF9lbmNvZGluZywgdHJpZWQpOgorICAgICAgICAgICAgeWllbGQgc2VsZi5zbmlmZmVkX2VuY29kaW5nCisKKyAgICAgICAgIyBMb29rIHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIGFuIFhNTCBvciBIVE1MIGVuY29kaW5nCisgICAgICAgICMgZGVjbGFyYXRpb24uCisgICAgICAgIGlmIHNlbGYuZGVjbGFyZWRfZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVjbGFyZWRfZW5jb2RpbmcgPSBzZWxmLmZpbmRfZGVjbGFyZWRfZW5jb2RpbmcoCisgICAgICAgICAgICAgICAgc2VsZi5tYXJrdXAsIHNlbGYuaXNfaHRtbCkKKyAgICAgICAgaWYgc2VsZi5fdXNhYmxlKHNlbGYuZGVjbGFyZWRfZW5jb2RpbmcsIHRyaWVkKToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuZGVjbGFyZWRfZW5jb2RpbmcKKworICAgICAgICAjIFVzZSB0aGlyZC1wYXJ0eSBjaGFyYWN0ZXIgc2V0IGRldGVjdGlvbiB0byBndWVzcyBhdCB0aGUKKyAgICAgICAgIyBlbmNvZGluZy4KKyAgICAgICAgaWYgc2VsZi5jaGFyZGV0X2VuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmNoYXJkZXRfZW5jb2RpbmcgPSBjaGFyZGV0X2RhbW1pdChzZWxmLm1hcmt1cCkKKyAgICAgICAgaWYgc2VsZi5fdXNhYmxlKHNlbGYuY2hhcmRldF9lbmNvZGluZywgdHJpZWQpOgorICAgICAgICAgICAgeWllbGQgc2VsZi5jaGFyZGV0X2VuY29kaW5nCisKKyAgICAgICAgIyBBcyBhIGxhc3QtZGl0Y2ggZWZmb3J0LCB0cnkgdXRmLTggYW5kIHdpbmRvd3MtMTI1Mi4KKyAgICAgICAgZm9yIGUgaW4gKCd1dGYtOCcsICd3aW5kb3dzLTEyNTInKToKKyAgICAgICAgICAgIGlmIHNlbGYuX3VzYWJsZShlLCB0cmllZCk6CisgICAgICAgICAgICAgICAgeWllbGQgZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHN0cmlwX2J5dGVfb3JkZXJfbWFyayhjbHMsIGRhdGEpOgorICAgICAgICAiIiJJZiBhIGJ5dGUtb3JkZXIgbWFyayBpcyBwcmVzZW50LCBzdHJpcCBpdCBhbmQgcmV0dXJuIHRoZSBlbmNvZGluZyBpdCBpbXBsaWVzLiIiIgorICAgICAgICBlbmNvZGluZyA9IE5vbmUKKyAgICAgICAgaWYgKGxlbihkYXRhKSA+PSA0KSBhbmQgKGRhdGFbOjJdID09IGInXHhmZVx4ZmYnKSBcCisgICAgICAgICAgICAgICBhbmQgKGRhdGFbMjo0XSAhPSAnXHgwMFx4MDAnKToKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0Zi0xNmJlJworICAgICAgICAgICAgZGF0YSA9IGRhdGFbMjpdCisgICAgICAgIGVsaWYgKGxlbihkYXRhKSA+PSA0KSBhbmQgKGRhdGFbOjJdID09IGInXHhmZlx4ZmUnKSBcCisgICAgICAgICAgICAgICAgIGFuZCAoZGF0YVsyOjRdICE9ICdceDAwXHgwMCcpOgorICAgICAgICAgICAgZW5jb2RpbmcgPSAndXRmLTE2bGUnCisgICAgICAgICAgICBkYXRhID0gZGF0YVsyOl0KKyAgICAgICAgZWxpZiBkYXRhWzozXSA9PSBiJ1x4ZWZceGJiXHhiZic6CisgICAgICAgICAgICBlbmNvZGluZyA9ICd1dGYtOCcKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzM6XQorICAgICAgICBlbGlmIGRhdGFbOjRdID09IGInXHgwMFx4MDBceGZlXHhmZic6CisgICAgICAgICAgICBlbmNvZGluZyA9ICd1dGYtMzJiZScKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzQ6XQorICAgICAgICBlbGlmIGRhdGFbOjRdID09IGInXHhmZlx4ZmVceDAwXHgwMCc6CisgICAgICAgICAgICBlbmNvZGluZyA9ICd1dGYtMzJsZScKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzQ6XQorICAgICAgICByZXR1cm4gZGF0YSwgZW5jb2RpbmcKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmaW5kX2RlY2xhcmVkX2VuY29kaW5nKGNscywgbWFya3VwLCBpc19odG1sPUZhbHNlLCBzZWFyY2hfZW50aXJlX2RvY3VtZW50PUZhbHNlKToKKyAgICAgICAgIiIiR2l2ZW4gYSBkb2N1bWVudCwgdHJpZXMgdG8gZmluZCBpdHMgZGVjbGFyZWQgZW5jb2RpbmcuCisKKyAgICAgICAgQW4gWE1MIGVuY29kaW5nIGlzIGRlY2xhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgorCisgICAgICAgIEFuIEhUTUwgZW5jb2RpbmcgaXMgZGVjbGFyZWQgaW4gYSA8bWV0YT4gdGFnLCBob3BlZnVsbHkgbmVhciB0aGUKKyAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlYXJjaF9lbnRpcmVfZG9jdW1lbnQ6CisgICAgICAgICAgICB4bWxfZW5kcG9zID0gaHRtbF9lbmRwb3MgPSBsZW4obWFya3VwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeG1sX2VuZHBvcyA9IDEwMjQKKyAgICAgICAgICAgIGh0bWxfZW5kcG9zID0gbWF4KDIwNDgsIGludChsZW4obWFya3VwKSAqIDAuMDUpKQorICAgICAgICAgICAgCisgICAgICAgIGRlY2xhcmVkX2VuY29kaW5nID0gTm9uZQorICAgICAgICBkZWNsYXJlZF9lbmNvZGluZ19tYXRjaCA9IHhtbF9lbmNvZGluZ19yZS5zZWFyY2gobWFya3VwLCBlbmRwb3M9eG1sX2VuZHBvcykKKyAgICAgICAgaWYgbm90IGRlY2xhcmVkX2VuY29kaW5nX21hdGNoIGFuZCBpc19odG1sOgorICAgICAgICAgICAgZGVjbGFyZWRfZW5jb2RpbmdfbWF0Y2ggPSBodG1sX21ldGFfcmUuc2VhcmNoKG1hcmt1cCwgZW5kcG9zPWh0bWxfZW5kcG9zKQorICAgICAgICBpZiBkZWNsYXJlZF9lbmNvZGluZ19tYXRjaCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlY2xhcmVkX2VuY29kaW5nID0gZGVjbGFyZWRfZW5jb2RpbmdfbWF0Y2guZ3JvdXBzKClbMF0uZGVjb2RlKAorICAgICAgICAgICAgICAgICdhc2NpaScpCisgICAgICAgIGlmIGRlY2xhcmVkX2VuY29kaW5nOgorICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmVkX2VuY29kaW5nLmxvd2VyKCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgVW5pY29kZURhbW1pdDoKKyAgICAiIiJBIGNsYXNzIGZvciBkZXRlY3RpbmcgdGhlIGVuY29kaW5nIG9mIGEgKk1MIGRvY3VtZW50IGFuZAorICAgIGNvbnZlcnRpbmcgaXQgdG8gYSBVbmljb2RlIHN0cmluZy4gSWYgdGhlIHNvdXJjZSBlbmNvZGluZyBpcworICAgIHdpbmRvd3MtMTI1MiwgY2FuIHJlcGxhY2UgTVMgc21hcnQgcXVvdGVzIHdpdGggdGhlaXIgSFRNTCBvciBYTUwKKyAgICBlcXVpdmFsZW50cy4iIiIKKworICAgICMgVGhpcyBkaWN0aW9uYXJ5IG1hcHMgY29tbW9ubHkgc2VlbiB2YWx1ZXMgZm9yICJjaGFyc2V0IiBpbiBIVE1MCisgICAgIyBtZXRhIHRhZ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNvZGVjIG5hbWVzLiBJdCBvbmx5IGNvdmVycworICAgICMgdmFsdWVzIHRoYXQgYXJlbid0IGluIFB5dGhvbidzIGFsaWFzZXMgYW5kIGNhbid0IGJlIGRldGVybWluZWQKKyAgICAjIGJ5IHRoZSBoZXVyaXN0aWNzIGluIGZpbmRfY29kZWMuCisgICAgQ0hBUlNFVF9BTElBU0VTID0geyJtYWNpbnRvc2giOiAibWFjLXJvbWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIngtc2ppcyI6ICJzaGlmdC1qaXMifQorCisgICAgRU5DT0RJTkdTX1dJVEhfU01BUlRfUVVPVEVTID0gWworICAgICAgICAid2luZG93cy0xMjUyIiwKKyAgICAgICAgImlzby04ODU5LTEiLAorICAgICAgICAiaXNvLTg4NTktMiIsCisgICAgICAgIF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrdXAsIG92ZXJyaWRlX2VuY29kaW5ncz1bXSwKKyAgICAgICAgICAgICAgICAgc21hcnRfcXVvdGVzX3RvPU5vbmUsIGlzX2h0bWw9RmFsc2UpOgorICAgICAgICBzZWxmLnNtYXJ0X3F1b3Rlc190byA9IHNtYXJ0X3F1b3Rlc190bworICAgICAgICBzZWxmLnRyaWVkX2VuY29kaW5ncyA9IFtdCisgICAgICAgIHNlbGYuY29udGFpbnNfcmVwbGFjZW1lbnRfY2hhcmFjdGVycyA9IEZhbHNlCisgICAgICAgIHNlbGYuaXNfaHRtbCA9IGlzX2h0bWwKKworICAgICAgICBzZWxmLmRldGVjdG9yID0gRW5jb2RpbmdEZXRlY3RvcihtYXJrdXAsIG92ZXJyaWRlX2VuY29kaW5ncywgaXNfaHRtbCkKKworICAgICAgICAjIFNob3J0LWNpcmN1aXQgaWYgdGhlIGRhdGEgaXMgaW4gVW5pY29kZSB0byBiZWdpbiB3aXRoLgorICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmt1cCwgdW5pY29kZSkgb3IgbWFya3VwID09ICcnOgorICAgICAgICAgICAgc2VsZi5tYXJrdXAgPSBtYXJrdXAKKyAgICAgICAgICAgIHNlbGYudW5pY29kZV9tYXJrdXAgPSB1bmljb2RlKG1hcmt1cCkKKyAgICAgICAgICAgIHNlbGYub3JpZ2luYWxfZW5jb2RpbmcgPSBOb25lCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFRoZSBlbmNvZGluZyBkZXRlY3RvciBtYXkgaGF2ZSBzdHJpcHBlZCBhIGJ5dGUtb3JkZXIgbWFyay4KKyAgICAgICAgIyBVc2UgdGhlIHN0cmlwcGVkIG1hcmt1cCBmcm9tIHRoaXMgcG9pbnQgb24uCisgICAgICAgIHNlbGYubWFya3VwID0gc2VsZi5kZXRlY3Rvci5tYXJrdXAKKworICAgICAgICB1ID0gTm9uZQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gc2VsZi5kZXRlY3Rvci5lbmNvZGluZ3M6CisgICAgICAgICAgICBtYXJrdXAgPSBzZWxmLmRldGVjdG9yLm1hcmt1cAorICAgICAgICAgICAgdSA9IHNlbGYuX2NvbnZlcnRfZnJvbShlbmNvZGluZykKKyAgICAgICAgICAgIGlmIHUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBub3QgdToKKyAgICAgICAgICAgICMgTm9uZSBvZiB0aGUgZW5jb2RpbmdzIHdvcmtlZC4gQXMgYW4gYWJzb2x1dGUgbGFzdCByZXNvcnQsCisgICAgICAgICAgICAjIHRyeSB0aGVtIGFnYWluIHdpdGggY2hhcmFjdGVyIHJlcGxhY2VtZW50LgorCisgICAgICAgICAgICBmb3IgZW5jb2RpbmcgaW4gc2VsZi5kZXRlY3Rvci5lbmNvZGluZ3M6CisgICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgIT0gImFzY2lpIjoKKyAgICAgICAgICAgICAgICAgICAgdSA9IHNlbGYuX2NvbnZlcnRfZnJvbShlbmNvZGluZywgInJlcGxhY2UiKQorICAgICAgICAgICAgICAgIGlmIHUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29tZSBjaGFyYWN0ZXJzIGNvdWxkIG5vdCBiZSBkZWNvZGVkLCBhbmQgd2VyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VkIHdpdGggUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLiIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbnNfcmVwbGFjZW1lbnRfY2hhcmFjdGVycyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIElmIG5vbmUgb2YgdGhhdCB3b3JrZWQsIHdlIGNvdWxkIGF0IHRoaXMgcG9pbnQgZm9yY2UgaXQgdG8KKyAgICAgICAgIyBBU0NJSSwgYnV0IHRoYXQgd291bGQgZGVzdHJveSBzbyBtdWNoIGRhdGEgdGhhdCBJIHRoaW5rCisgICAgICAgICMgZ2l2aW5nIHVwIGlzIGJldHRlci4KKyAgICAgICAgc2VsZi51bmljb2RlX21hcmt1cCA9IHUKKyAgICAgICAgaWYgbm90IHU6CisgICAgICAgICAgICBzZWxmLm9yaWdpbmFsX2VuY29kaW5nID0gTm9uZQorCisgICAgZGVmIF9zdWJfbXNfY2hhcihzZWxmLCBtYXRjaCk6CisgICAgICAgICIiIkNoYW5nZXMgYSBNUyBzbWFydCBxdW90ZSBjaGFyYWN0ZXIgdG8gYW4gWE1MIG9yIEhUTUwKKyAgICAgICAgZW50aXR5LCBvciBhbiBBU0NJSSBjaGFyYWN0ZXIuIiIiCisgICAgICAgIG9yaWcgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICBpZiBzZWxmLnNtYXJ0X3F1b3Rlc190byA9PSAnYXNjaWknOgorICAgICAgICAgICAgc3ViID0gc2VsZi5NU19DSEFSU19UT19BU0NJSS5nZXQob3JpZykuZW5jb2RlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1YiA9IHNlbGYuTVNfQ0hBUlMuZ2V0KG9yaWcpCisgICAgICAgICAgICBpZiB0eXBlKHN1YikgPT0gdHVwbGU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zbWFydF9xdW90ZXNfdG8gPT0gJ3htbCc6CisgICAgICAgICAgICAgICAgICAgIHN1YiA9ICcmI3gnLmVuY29kZSgpICsgc3ViWzFdLmVuY29kZSgpICsgJzsnLmVuY29kZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3ViID0gJyYnLmVuY29kZSgpICsgc3ViWzBdLmVuY29kZSgpICsgJzsnLmVuY29kZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YiA9IHN1Yi5lbmNvZGUoKQorICAgICAgICByZXR1cm4gc3ViCisKKyAgICBkZWYgX2NvbnZlcnRfZnJvbShzZWxmLCBwcm9wb3NlZCwgZXJyb3JzPSJzdHJpY3QiKToKKyAgICAgICAgcHJvcG9zZWQgPSBzZWxmLmZpbmRfY29kZWMocHJvcG9zZWQpCisgICAgICAgIGlmIG5vdCBwcm9wb3NlZCBvciAocHJvcG9zZWQsIGVycm9ycykgaW4gc2VsZi50cmllZF9lbmNvZGluZ3M6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLnRyaWVkX2VuY29kaW5ncy5hcHBlbmQoKHByb3Bvc2VkLCBlcnJvcnMpKQorICAgICAgICBtYXJrdXAgPSBzZWxmLm1hcmt1cAorICAgICAgICAjIENvbnZlcnQgc21hcnQgcXVvdGVzIHRvIEhUTUwgaWYgY29taW5nIGZyb20gYW4gZW5jb2RpbmcKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGhhdmUgdGhlbS4KKyAgICAgICAgaWYgKHNlbGYuc21hcnRfcXVvdGVzX3RvIGlzIG5vdCBOb25lCisgICAgICAgICAgICBhbmQgcHJvcG9zZWQgaW4gc2VsZi5FTkNPRElOR1NfV0lUSF9TTUFSVF9RVU9URVMpOgorICAgICAgICAgICAgc21hcnRfcXVvdGVzX3JlID0gYiIoW1x4ODAtXHg5Zl0pIgorICAgICAgICAgICAgc21hcnRfcXVvdGVzX2NvbXBpbGVkID0gcmUuY29tcGlsZShzbWFydF9xdW90ZXNfcmUpCisgICAgICAgICAgICBtYXJrdXAgPSBzbWFydF9xdW90ZXNfY29tcGlsZWQuc3ViKHNlbGYuX3N1Yl9tc19jaGFyLCBtYXJrdXApCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgI3ByaW50ICJUcnlpbmcgdG8gY29udmVydCBkb2N1bWVudCB0byAlcyAoZXJyb3JzPSVzKSIgJSAoCisgICAgICAgICAgICAjICAgIHByb3Bvc2VkLCBlcnJvcnMpCisgICAgICAgICAgICB1ID0gc2VsZi5fdG9fdW5pY29kZShtYXJrdXAsIHByb3Bvc2VkLCBlcnJvcnMpCisgICAgICAgICAgICBzZWxmLm1hcmt1cCA9IHUKKyAgICAgICAgICAgIHNlbGYub3JpZ2luYWxfZW5jb2RpbmcgPSBwcm9wb3NlZAorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAjcHJpbnQgIlRoYXQgZGlkbid0IHdvcmshIgorICAgICAgICAgICAgI3ByaW50IGUKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICNwcmludCAiQ29ycmVjdCBlbmNvZGluZzogJXMiICUgcHJvcG9zZWQKKyAgICAgICAgcmV0dXJuIHNlbGYubWFya3VwCisKKyAgICBkZWYgX3RvX3VuaWNvZGUoc2VsZiwgZGF0YSwgZW5jb2RpbmcsIGVycm9ycz0ic3RyaWN0Iik6CisgICAgICAgICcnJ0dpdmVuIGEgc3RyaW5nIGFuZCBpdHMgZW5jb2RpbmcsIGRlY29kZXMgdGhlIHN0cmluZyBpbnRvIFVuaWNvZGUuCisgICAgICAgICVlbmNvZGluZyBpcyBhIHN0cmluZyByZWNvZ25pemVkIGJ5IGVuY29kaW5ncy5hbGlhc2VzJycnCisgICAgICAgIHJldHVybiB1bmljb2RlKGRhdGEsIGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVjbGFyZWRfaHRtbF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfaHRtbDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLmRldGVjdG9yLmRlY2xhcmVkX2VuY29kaW5nCisKKyAgICBkZWYgZmluZF9jb2RlYyhzZWxmLCBjaGFyc2V0KToKKyAgICAgICAgdmFsdWUgPSAoc2VsZi5fY29kZWMoc2VsZi5DSEFSU0VUX0FMSUFTRVMuZ2V0KGNoYXJzZXQsIGNoYXJzZXQpKQorICAgICAgICAgICAgICAgb3IgKGNoYXJzZXQgYW5kIHNlbGYuX2NvZGVjKGNoYXJzZXQucmVwbGFjZSgiLSIsICIiKSkpCisgICAgICAgICAgICAgICBvciAoY2hhcnNldCBhbmQgc2VsZi5fY29kZWMoY2hhcnNldC5yZXBsYWNlKCItIiwgIl8iKSkpCisgICAgICAgICAgICAgICBvciAoY2hhcnNldCBhbmQgY2hhcnNldC5sb3dlcigpKQorICAgICAgICAgICAgICAgb3IgY2hhcnNldAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUubG93ZXIoKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9jb2RlYyhzZWxmLCBjaGFyc2V0KToKKyAgICAgICAgaWYgbm90IGNoYXJzZXQ6CisgICAgICAgICAgICByZXR1cm4gY2hhcnNldAorICAgICAgICBjb2RlYyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZWNzLmxvb2t1cChjaGFyc2V0KQorICAgICAgICAgICAgY29kZWMgPSBjaGFyc2V0CisgICAgICAgIGV4Y2VwdCAoTG9va3VwRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gY29kZWMKKworCisgICAgIyBBIHBhcnRpYWwgbWFwcGluZyBvZiBJU08tTGF0aW4tMSB0byBIVE1MIGVudGl0aWVzL1hNTCBudW1lcmljIGVudGl0aWVzLgorICAgIE1TX0NIQVJTID0ge2InXHg4MCc6ICgnZXVybycsICcyMEFDJyksCisgICAgICAgICAgICAgICAgYidceDgxJzogJyAnLAorICAgICAgICAgICAgICAgIGInXHg4Mic6ICgnc2JxdW8nLCAnMjAxQScpLAorICAgICAgICAgICAgICAgIGInXHg4Myc6ICgnZm5vZicsICcxOTInKSwKKyAgICAgICAgICAgICAgICBiJ1x4ODQnOiAoJ2JkcXVvJywgJzIwMUUnKSwKKyAgICAgICAgICAgICAgICBiJ1x4ODUnOiAoJ2hlbGxpcCcsICcyMDI2JyksCisgICAgICAgICAgICAgICAgYidceDg2JzogKCdkYWdnZXInLCAnMjAyMCcpLAorICAgICAgICAgICAgICAgIGInXHg4Nyc6ICgnRGFnZ2VyJywgJzIwMjEnKSwKKyAgICAgICAgICAgICAgICBiJ1x4ODgnOiAoJ2NpcmMnLCAnMkM2JyksCisgICAgICAgICAgICAgICAgYidceDg5JzogKCdwZXJtaWwnLCAnMjAzMCcpLAorICAgICAgICAgICAgICAgIGInXHg4QSc6ICgnU2Nhcm9uJywgJzE2MCcpLAorICAgICAgICAgICAgICAgIGInXHg4Qic6ICgnbHNhcXVvJywgJzIwMzknKSwKKyAgICAgICAgICAgICAgICBiJ1x4OEMnOiAoJ09FbGlnJywgJzE1MicpLAorICAgICAgICAgICAgICAgIGInXHg4RCc6ICc/JywKKyAgICAgICAgICAgICAgICBiJ1x4OEUnOiAoJyN4MTdEJywgJzE3RCcpLAorICAgICAgICAgICAgICAgIGInXHg4Ric6ICc/JywKKyAgICAgICAgICAgICAgICBiJ1x4OTAnOiAnPycsCisgICAgICAgICAgICAgICAgYidceDkxJzogKCdsc3F1bycsICcyMDE4JyksCisgICAgICAgICAgICAgICAgYidceDkyJzogKCdyc3F1bycsICcyMDE5JyksCisgICAgICAgICAgICAgICAgYidceDkzJzogKCdsZHF1bycsICcyMDFDJyksCisgICAgICAgICAgICAgICAgYidceDk0JzogKCdyZHF1bycsICcyMDFEJyksCisgICAgICAgICAgICAgICAgYidceDk1JzogKCdidWxsJywgJzIwMjInKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTYnOiAoJ25kYXNoJywgJzIwMTMnKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTcnOiAoJ21kYXNoJywgJzIwMTQnKSwKKyAgICAgICAgICAgICAgICBiJ1x4OTgnOiAoJ3RpbGRlJywgJzJEQycpLAorICAgICAgICAgICAgICAgIGInXHg5OSc6ICgndHJhZGUnLCAnMjEyMicpLAorICAgICAgICAgICAgICAgIGInXHg5YSc6ICgnc2Nhcm9uJywgJzE2MScpLAorICAgICAgICAgICAgICAgIGInXHg5Yic6ICgncnNhcXVvJywgJzIwM0EnKSwKKyAgICAgICAgICAgICAgICBiJ1x4OWMnOiAoJ29lbGlnJywgJzE1MycpLAorICAgICAgICAgICAgICAgIGInXHg5ZCc6ICc/JywKKyAgICAgICAgICAgICAgICBiJ1x4OWUnOiAoJyN4MTdFJywgJzE3RScpLAorICAgICAgICAgICAgICAgIGInXHg5Zic6ICgnWXVtbCcsICcnKSx9CisKKyAgICAjIEEgcGFyb2NoaWFsIHBhcnRpYWwgbWFwcGluZyBvZiBJU08tTGF0aW4tMSB0byBBU0NJSS4gQ29udGFpbnMKKyAgICAjIGhvcnJvcnMgbGlrZSBzdHJpcHBpbmcgZGlhY3JpdGljYWwgbWFya3MgdG8gdHVybiDDoSBpbnRvIGEsIGJ1dCBhbHNvCisgICAgIyBjb250YWlucyBub24taG9ycm9ycyBsaWtlIHR1cm5pbmcg4oCcIGludG8gIi4KKyAgICBNU19DSEFSU19UT19BU0NJSSA9IHsKKyAgICAgICAgYidceDgwJyA6ICdFVVInLAorICAgICAgICBiJ1x4ODEnIDogJyAnLAorICAgICAgICBiJ1x4ODInIDogJywnLAorICAgICAgICBiJ1x4ODMnIDogJ2YnLAorICAgICAgICBiJ1x4ODQnIDogJywsJywKKyAgICAgICAgYidceDg1JyA6ICcuLi4nLAorICAgICAgICBiJ1x4ODYnIDogJysnLAorICAgICAgICBiJ1x4ODcnIDogJysrJywKKyAgICAgICAgYidceDg4JyA6ICdeJywKKyAgICAgICAgYidceDg5JyA6ICclJywKKyAgICAgICAgYidceDhhJyA6ICdTJywKKyAgICAgICAgYidceDhiJyA6ICc8JywKKyAgICAgICAgYidceDhjJyA6ICdPRScsCisgICAgICAgIGInXHg4ZCcgOiAnPycsCisgICAgICAgIGInXHg4ZScgOiAnWicsCisgICAgICAgIGInXHg4ZicgOiAnPycsCisgICAgICAgIGInXHg5MCcgOiAnPycsCisgICAgICAgIGInXHg5MScgOiAiJyIsCisgICAgICAgIGInXHg5MicgOiAiJyIsCisgICAgICAgIGInXHg5MycgOiAnIicsCisgICAgICAgIGInXHg5NCcgOiAnIicsCisgICAgICAgIGInXHg5NScgOiAnKicsCisgICAgICAgIGInXHg5NicgOiAnLScsCisgICAgICAgIGInXHg5NycgOiAnLS0nLAorICAgICAgICBiJ1x4OTgnIDogJ34nLAorICAgICAgICBiJ1x4OTknIDogJyhUTSknLAorICAgICAgICBiJ1x4OWEnIDogJ3MnLAorICAgICAgICBiJ1x4OWInIDogJz4nLAorICAgICAgICBiJ1x4OWMnIDogJ29lJywKKyAgICAgICAgYidceDlkJyA6ICc/JywKKyAgICAgICAgYidceDllJyA6ICd6JywKKyAgICAgICAgYidceDlmJyA6ICdZJywKKyAgICAgICAgYidceGEwJyA6ICcgJywKKyAgICAgICAgYidceGExJyA6ICchJywKKyAgICAgICAgYidceGEyJyA6ICdjJywKKyAgICAgICAgYidceGEzJyA6ICdHQlAnLAorICAgICAgICBiJ1x4YTQnIDogJyQnLCAjVGhpcyBhcHByb3hpbWF0aW9uIGlzIGVzcGVjaWFsbHkgcGFyb2NoaWFsLS10aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAjZ2VuZXJpYyBjdXJyZW5jeSBzeW1ib2wuCisgICAgICAgIGInXHhhNScgOiAnWUVOJywKKyAgICAgICAgYidceGE2JyA6ICd8JywKKyAgICAgICAgYidceGE3JyA6ICdTJywKKyAgICAgICAgYidceGE4JyA6ICcuLicsCisgICAgICAgIGInXHhhOScgOiAnJywKKyAgICAgICAgYidceGFhJyA6ICcodGgpJywKKyAgICAgICAgYidceGFiJyA6ICc8PCcsCisgICAgICAgIGInXHhhYycgOiAnIScsCisgICAgICAgIGInXHhhZCcgOiAnICcsCisgICAgICAgIGInXHhhZScgOiAnKFIpJywKKyAgICAgICAgYidceGFmJyA6ICctJywKKyAgICAgICAgYidceGIwJyA6ICdvJywKKyAgICAgICAgYidceGIxJyA6ICcrLScsCisgICAgICAgIGInXHhiMicgOiAnMicsCisgICAgICAgIGInXHhiMycgOiAnMycsCisgICAgICAgIGInXHhiNCcgOiAoIiciLCAnYWN1dGUnKSwKKyAgICAgICAgYidceGI1JyA6ICd1JywKKyAgICAgICAgYidceGI2JyA6ICdQJywKKyAgICAgICAgYidceGI3JyA6ICcqJywKKyAgICAgICAgYidceGI4JyA6ICcsJywKKyAgICAgICAgYidceGI5JyA6ICcxJywKKyAgICAgICAgYidceGJhJyA6ICcodGgpJywKKyAgICAgICAgYidceGJiJyA6ICc+PicsCisgICAgICAgIGInXHhiYycgOiAnMS80JywKKyAgICAgICAgYidceGJkJyA6ICcxLzInLAorICAgICAgICBiJ1x4YmUnIDogJzMvNCcsCisgICAgICAgIGInXHhiZicgOiAnPycsCisgICAgICAgIGInXHhjMCcgOiAnQScsCisgICAgICAgIGInXHhjMScgOiAnQScsCisgICAgICAgIGInXHhjMicgOiAnQScsCisgICAgICAgIGInXHhjMycgOiAnQScsCisgICAgICAgIGInXHhjNCcgOiAnQScsCisgICAgICAgIGInXHhjNScgOiAnQScsCisgICAgICAgIGInXHhjNicgOiAnQUUnLAorICAgICAgICBiJ1x4YzcnIDogJ0MnLAorICAgICAgICBiJ1x4YzgnIDogJ0UnLAorICAgICAgICBiJ1x4YzknIDogJ0UnLAorICAgICAgICBiJ1x4Y2EnIDogJ0UnLAorICAgICAgICBiJ1x4Y2InIDogJ0UnLAorICAgICAgICBiJ1x4Y2MnIDogJ0knLAorICAgICAgICBiJ1x4Y2QnIDogJ0knLAorICAgICAgICBiJ1x4Y2UnIDogJ0knLAorICAgICAgICBiJ1x4Y2YnIDogJ0knLAorICAgICAgICBiJ1x4ZDAnIDogJ0QnLAorICAgICAgICBiJ1x4ZDEnIDogJ04nLAorICAgICAgICBiJ1x4ZDInIDogJ08nLAorICAgICAgICBiJ1x4ZDMnIDogJ08nLAorICAgICAgICBiJ1x4ZDQnIDogJ08nLAorICAgICAgICBiJ1x4ZDUnIDogJ08nLAorICAgICAgICBiJ1x4ZDYnIDogJ08nLAorICAgICAgICBiJ1x4ZDcnIDogJyonLAorICAgICAgICBiJ1x4ZDgnIDogJ08nLAorICAgICAgICBiJ1x4ZDknIDogJ1UnLAorICAgICAgICBiJ1x4ZGEnIDogJ1UnLAorICAgICAgICBiJ1x4ZGInIDogJ1UnLAorICAgICAgICBiJ1x4ZGMnIDogJ1UnLAorICAgICAgICBiJ1x4ZGQnIDogJ1knLAorICAgICAgICBiJ1x4ZGUnIDogJ2InLAorICAgICAgICBiJ1x4ZGYnIDogJ0InLAorICAgICAgICBiJ1x4ZTAnIDogJ2EnLAorICAgICAgICBiJ1x4ZTEnIDogJ2EnLAorICAgICAgICBiJ1x4ZTInIDogJ2EnLAorICAgICAgICBiJ1x4ZTMnIDogJ2EnLAorICAgICAgICBiJ1x4ZTQnIDogJ2EnLAorICAgICAgICBiJ1x4ZTUnIDogJ2EnLAorICAgICAgICBiJ1x4ZTYnIDogJ2FlJywKKyAgICAgICAgYidceGU3JyA6ICdjJywKKyAgICAgICAgYidceGU4JyA6ICdlJywKKyAgICAgICAgYidceGU5JyA6ICdlJywKKyAgICAgICAgYidceGVhJyA6ICdlJywKKyAgICAgICAgYidceGViJyA6ICdlJywKKyAgICAgICAgYidceGVjJyA6ICdpJywKKyAgICAgICAgYidceGVkJyA6ICdpJywKKyAgICAgICAgYidceGVlJyA6ICdpJywKKyAgICAgICAgYidceGVmJyA6ICdpJywKKyAgICAgICAgYidceGYwJyA6ICdvJywKKyAgICAgICAgYidceGYxJyA6ICduJywKKyAgICAgICAgYidceGYyJyA6ICdvJywKKyAgICAgICAgYidceGYzJyA6ICdvJywKKyAgICAgICAgYidceGY0JyA6ICdvJywKKyAgICAgICAgYidceGY1JyA6ICdvJywKKyAgICAgICAgYidceGY2JyA6ICdvJywKKyAgICAgICAgYidceGY3JyA6ICcvJywKKyAgICAgICAgYidceGY4JyA6ICdvJywKKyAgICAgICAgYidceGY5JyA6ICd1JywKKyAgICAgICAgYidceGZhJyA6ICd1JywKKyAgICAgICAgYidceGZiJyA6ICd1JywKKyAgICAgICAgYidceGZjJyA6ICd1JywKKyAgICAgICAgYidceGZkJyA6ICd5JywKKyAgICAgICAgYidceGZlJyA6ICdiJywKKyAgICAgICAgYidceGZmJyA6ICd5JywKKyAgICAgICAgfQorCisgICAgIyBBIG1hcCB1c2VkIHdoZW4gcmVtb3Zpbmcgcm9ndWUgV2luZG93cy0xMjUyL0lTTy04ODU5LTEKKyAgICAjIGNoYXJhY3RlcnMgaW4gb3RoZXJ3aXNlIFVURi04IGRvY3VtZW50cy4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgXHg4MSwgXHg4ZCwgXHg4ZiwgXHg5MCwgYW5kIFx4OWQgYXJlIHVuZGVmaW5lZCBpbgorICAgICMgV2luZG93cy0xMjUyLgorICAgIFdJTkRPV1NfMTI1Ml9UT19VVEY4ID0geworICAgICAgICAweDgwIDogYidceGUyXHg4Mlx4YWMnLCAjIOKCrAorICAgICAgICAweDgyIDogYidceGUyXHg4MFx4OWEnLCAjIOKAmgorICAgICAgICAweDgzIDogYidceGM2XHg5MicsICAgICAjIMaSCisgICAgICAgIDB4ODQgOiBiJ1x4ZTJceDgwXHg5ZScsICMg4oCeCisgICAgICAgIDB4ODUgOiBiJ1x4ZTJceDgwXHhhNicsICMg4oCmCisgICAgICAgIDB4ODYgOiBiJ1x4ZTJceDgwXHhhMCcsICMg4oCgCisgICAgICAgIDB4ODcgOiBiJ1x4ZTJceDgwXHhhMScsICMg4oChCisgICAgICAgIDB4ODggOiBiJ1x4Y2JceDg2JywgICAgICMgy4YKKyAgICAgICAgMHg4OSA6IGInXHhlMlx4ODBceGIwJywgIyDigLAKKyAgICAgICAgMHg4YSA6IGInXHhjNVx4YTAnLCAgICAgIyDFoAorICAgICAgICAweDhiIDogYidceGUyXHg4MFx4YjknLCAjIOKAuQorICAgICAgICAweDhjIDogYidceGM1XHg5MicsICAgICAjIMWSCisgICAgICAgIDB4OGUgOiBiJ1x4YzVceGJkJywgICAgICMgxb0KKyAgICAgICAgMHg5MSA6IGInXHhlMlx4ODBceDk4JywgIyDigJgKKyAgICAgICAgMHg5MiA6IGInXHhlMlx4ODBceDk5JywgIyDigJkKKyAgICAgICAgMHg5MyA6IGInXHhlMlx4ODBceDljJywgIyDigJwKKyAgICAgICAgMHg5NCA6IGInXHhlMlx4ODBceDlkJywgIyDigJ0KKyAgICAgICAgMHg5NSA6IGInXHhlMlx4ODBceGEyJywgIyDigKIKKyAgICAgICAgMHg5NiA6IGInXHhlMlx4ODBceDkzJywgIyDigJMKKyAgICAgICAgMHg5NyA6IGInXHhlMlx4ODBceDk0JywgIyDigJQKKyAgICAgICAgMHg5OCA6IGInXHhjYlx4OWMnLCAgICAgIyDLnAorICAgICAgICAweDk5IDogYidceGUyXHg4NFx4YTInLCAjIOKEogorICAgICAgICAweDlhIDogYidceGM1XHhhMScsICAgICAjIMWhCisgICAgICAgIDB4OWIgOiBiJ1x4ZTJceDgwXHhiYScsICMg4oC6CisgICAgICAgIDB4OWMgOiBiJ1x4YzVceDkzJywgICAgICMgxZMKKyAgICAgICAgMHg5ZSA6IGInXHhjNVx4YmUnLCAgICAgIyDFvgorICAgICAgICAweDlmIDogYidceGM1XHhiOCcsICAgICAjIMW4CisgICAgICAgIDB4YTAgOiBiJ1x4YzJceGEwJywgICAgICMgwqAKKyAgICAgICAgMHhhMSA6IGInXHhjMlx4YTEnLCAgICAgIyDCoQorICAgICAgICAweGEyIDogYidceGMyXHhhMicsICAgICAjIMKiCisgICAgICAgIDB4YTMgOiBiJ1x4YzJceGEzJywgICAgICMgwqMKKyAgICAgICAgMHhhNCA6IGInXHhjMlx4YTQnLCAgICAgIyDCpAorICAgICAgICAweGE1IDogYidceGMyXHhhNScsICAgICAjIMKlCisgICAgICAgIDB4YTYgOiBiJ1x4YzJceGE2JywgICAgICMgwqYKKyAgICAgICAgMHhhNyA6IGInXHhjMlx4YTcnLCAgICAgIyDCpworICAgICAgICAweGE4IDogYidceGMyXHhhOCcsICAgICAjIMKoCisgICAgICAgIDB4YTkgOiBiJ1x4YzJceGE5JywgICAgICMgwqkKKyAgICAgICAgMHhhYSA6IGInXHhjMlx4YWEnLCAgICAgIyDCqgorICAgICAgICAweGFiIDogYidceGMyXHhhYicsICAgICAjIMKrCisgICAgICAgIDB4YWMgOiBiJ1x4YzJceGFjJywgICAgICMgwqwKKyAgICAgICAgMHhhZCA6IGInXHhjMlx4YWQnLCAgICAgIyDCrQorICAgICAgICAweGFlIDogYidceGMyXHhhZScsICAgICAjIMKuCisgICAgICAgIDB4YWYgOiBiJ1x4YzJceGFmJywgICAgICMgwq8KKyAgICAgICAgMHhiMCA6IGInXHhjMlx4YjAnLCAgICAgIyDCsAorICAgICAgICAweGIxIDogYidceGMyXHhiMScsICAgICAjIMKxCisgICAgICAgIDB4YjIgOiBiJ1x4YzJceGIyJywgICAgICMgwrIKKyAgICAgICAgMHhiMyA6IGInXHhjMlx4YjMnLCAgICAgIyDCsworICAgICAgICAweGI0IDogYidceGMyXHhiNCcsICAgICAjIMK0CisgICAgICAgIDB4YjUgOiBiJ1x4YzJceGI1JywgICAgICMgwrUKKyAgICAgICAgMHhiNiA6IGInXHhjMlx4YjYnLCAgICAgIyDCtgorICAgICAgICAweGI3IDogYidceGMyXHhiNycsICAgICAjIMK3CisgICAgICAgIDB4YjggOiBiJ1x4YzJceGI4JywgICAgICMgwrgKKyAgICAgICAgMHhiOSA6IGInXHhjMlx4YjknLCAgICAgIyDCuQorICAgICAgICAweGJhIDogYidceGMyXHhiYScsICAgICAjIMK6CisgICAgICAgIDB4YmIgOiBiJ1x4YzJceGJiJywgICAgICMgwrsKKyAgICAgICAgMHhiYyA6IGInXHhjMlx4YmMnLCAgICAgIyDCvAorICAgICAgICAweGJkIDogYidceGMyXHhiZCcsICAgICAjIMK9CisgICAgICAgIDB4YmUgOiBiJ1x4YzJceGJlJywgICAgICMgwr4KKyAgICAgICAgMHhiZiA6IGInXHhjMlx4YmYnLCAgICAgIyDCvworICAgICAgICAweGMwIDogYidceGMzXHg4MCcsICAgICAjIMOACisgICAgICAgIDB4YzEgOiBiJ1x4YzNceDgxJywgICAgICMgw4EKKyAgICAgICAgMHhjMiA6IGInXHhjM1x4ODInLCAgICAgIyDDggorICAgICAgICAweGMzIDogYidceGMzXHg4MycsICAgICAjIMODCisgICAgICAgIDB4YzQgOiBiJ1x4YzNceDg0JywgICAgICMgw4QKKyAgICAgICAgMHhjNSA6IGInXHhjM1x4ODUnLCAgICAgIyDDhQorICAgICAgICAweGM2IDogYidceGMzXHg4NicsICAgICAjIMOGCisgICAgICAgIDB4YzcgOiBiJ1x4YzNceDg3JywgICAgICMgw4cKKyAgICAgICAgMHhjOCA6IGInXHhjM1x4ODgnLCAgICAgIyDDiAorICAgICAgICAweGM5IDogYidceGMzXHg4OScsICAgICAjIMOJCisgICAgICAgIDB4Y2EgOiBiJ1x4YzNceDhhJywgICAgICMgw4oKKyAgICAgICAgMHhjYiA6IGInXHhjM1x4OGInLCAgICAgIyDDiworICAgICAgICAweGNjIDogYidceGMzXHg4YycsICAgICAjIMOMCisgICAgICAgIDB4Y2QgOiBiJ1x4YzNceDhkJywgICAgICMgw40KKyAgICAgICAgMHhjZSA6IGInXHhjM1x4OGUnLCAgICAgIyDDjgorICAgICAgICAweGNmIDogYidceGMzXHg4ZicsICAgICAjIMOPCisgICAgICAgIDB4ZDAgOiBiJ1x4YzNceDkwJywgICAgICMgw5AKKyAgICAgICAgMHhkMSA6IGInXHhjM1x4OTEnLCAgICAgIyDDkQorICAgICAgICAweGQyIDogYidceGMzXHg5MicsICAgICAjIMOSCisgICAgICAgIDB4ZDMgOiBiJ1x4YzNceDkzJywgICAgICMgw5MKKyAgICAgICAgMHhkNCA6IGInXHhjM1x4OTQnLCAgICAgIyDDlAorICAgICAgICAweGQ1IDogYidceGMzXHg5NScsICAgICAjIMOVCisgICAgICAgIDB4ZDYgOiBiJ1x4YzNceDk2JywgICAgICMgw5YKKyAgICAgICAgMHhkNyA6IGInXHhjM1x4OTcnLCAgICAgIyDDlworICAgICAgICAweGQ4IDogYidceGMzXHg5OCcsICAgICAjIMOYCisgICAgICAgIDB4ZDkgOiBiJ1x4YzNceDk5JywgICAgICMgw5kKKyAgICAgICAgMHhkYSA6IGInXHhjM1x4OWEnLCAgICAgIyDDmgorICAgICAgICAweGRiIDogYidceGMzXHg5YicsICAgICAjIMObCisgICAgICAgIDB4ZGMgOiBiJ1x4YzNceDljJywgICAgICMgw5wKKyAgICAgICAgMHhkZCA6IGInXHhjM1x4OWQnLCAgICAgIyDDnQorICAgICAgICAweGRlIDogYidceGMzXHg5ZScsICAgICAjIMOeCisgICAgICAgIDB4ZGYgOiBiJ1x4YzNceDlmJywgICAgICMgw58KKyAgICAgICAgMHhlMCA6IGInXHhjM1x4YTAnLCAgICAgIyDDoAorICAgICAgICAweGUxIDogYidceGExJywgICAgICMgw6EKKyAgICAgICAgMHhlMiA6IGInXHhjM1x4YTInLCAgICAgIyDDogorICAgICAgICAweGUzIDogYidceGMzXHhhMycsICAgICAjIMOjCisgICAgICAgIDB4ZTQgOiBiJ1x4YzNceGE0JywgICAgICMgw6QKKyAgICAgICAgMHhlNSA6IGInXHhjM1x4YTUnLCAgICAgIyDDpQorICAgICAgICAweGU2IDogYidceGMzXHhhNicsICAgICAjIMOmCisgICAgICAgIDB4ZTcgOiBiJ1x4YzNceGE3JywgICAgICMgw6cKKyAgICAgICAgMHhlOCA6IGInXHhjM1x4YTgnLCAgICAgIyDDqAorICAgICAgICAweGU5IDogYidceGMzXHhhOScsICAgICAjIMOpCisgICAgICAgIDB4ZWEgOiBiJ1x4YzNceGFhJywgICAgICMgw6oKKyAgICAgICAgMHhlYiA6IGInXHhjM1x4YWInLCAgICAgIyDDqworICAgICAgICAweGVjIDogYidceGMzXHhhYycsICAgICAjIMOsCisgICAgICAgIDB4ZWQgOiBiJ1x4YzNceGFkJywgICAgICMgw60KKyAgICAgICAgMHhlZSA6IGInXHhjM1x4YWUnLCAgICAgIyDDrgorICAgICAgICAweGVmIDogYidceGMzXHhhZicsICAgICAjIMOvCisgICAgICAgIDB4ZjAgOiBiJ1x4YzNceGIwJywgICAgICMgw7AKKyAgICAgICAgMHhmMSA6IGInXHhjM1x4YjEnLCAgICAgIyDDsQorICAgICAgICAweGYyIDogYidceGMzXHhiMicsICAgICAjIMOyCisgICAgICAgIDB4ZjMgOiBiJ1x4YzNceGIzJywgICAgICMgw7MKKyAgICAgICAgMHhmNCA6IGInXHhjM1x4YjQnLCAgICAgIyDDtAorICAgICAgICAweGY1IDogYidceGMzXHhiNScsICAgICAjIMO1CisgICAgICAgIDB4ZjYgOiBiJ1x4YzNceGI2JywgICAgICMgw7YKKyAgICAgICAgMHhmNyA6IGInXHhjM1x4YjcnLCAgICAgIyDDtworICAgICAgICAweGY4IDogYidceGMzXHhiOCcsICAgICAjIMO4CisgICAgICAgIDB4ZjkgOiBiJ1x4YzNceGI5JywgICAgICMgw7kKKyAgICAgICAgMHhmYSA6IGInXHhjM1x4YmEnLCAgICAgIyDDugorICAgICAgICAweGZiIDogYidceGMzXHhiYicsICAgICAjIMO7CisgICAgICAgIDB4ZmMgOiBiJ1x4YzNceGJjJywgICAgICMgw7wKKyAgICAgICAgMHhmZCA6IGInXHhjM1x4YmQnLCAgICAgIyDDvQorICAgICAgICAweGZlIDogYidceGMzXHhiZScsICAgICAjIMO+CisgICAgICAgIH0KKworICAgIE1VTFRJQllURV9NQVJLRVJTX0FORF9TSVpFUyA9IFsKKyAgICAgICAgKDB4YzIsIDB4ZGYsIDIpLCAjIDItYnl0ZSBjaGFyYWN0ZXJzIHN0YXJ0IHdpdGggYSBieXRlIEMyLURGCisgICAgICAgICgweGUwLCAweGVmLCAzKSwgIyAzLWJ5dGUgY2hhcmFjdGVycyBzdGFydCB3aXRoIEUwLUVGCisgICAgICAgICgweGYwLCAweGY0LCA0KSwgIyA0LWJ5dGUgY2hhcmFjdGVycyBzdGFydCB3aXRoIEYwLUY0CisgICAgICAgIF0KKworICAgIEZJUlNUX01VTFRJQllURV9NQVJLRVIgPSBNVUxUSUJZVEVfTUFSS0VSU19BTkRfU0laRVNbMF1bMF0KKyAgICBMQVNUX01VTFRJQllURV9NQVJLRVIgPSBNVUxUSUJZVEVfTUFSS0VSU19BTkRfU0laRVNbLTFdWzFdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZGV0d2luZ2xlKGNscywgaW5fYnl0ZXMsIG1haW5fZW5jb2Rpbmc9InV0ZjgiLAorICAgICAgICAgICAgICAgICAgZW1iZWRkZWRfZW5jb2Rpbmc9IndpbmRvd3MtMTI1MiIpOgorICAgICAgICAiIiJGaXggY2hhcmFjdGVycyBmcm9tIG9uZSBlbmNvZGluZyBlbWJlZGRlZCBpbiBzb21lIG90aGVyIGVuY29kaW5nLgorCisgICAgICAgIEN1cnJlbnRseSB0aGUgb25seSBzaXR1YXRpb24gc3VwcG9ydGVkIGlzIFdpbmRvd3MtMTI1MiAob3IgaXRzCisgICAgICAgIHN1YnNldCBJU08tODg1OS0xKSwgZW1iZWRkZWQgaW4gVVRGLTguCisKKyAgICAgICAgVGhlIGlucHV0IG11c3QgYmUgYSBieXRlc3RyaW5nLiBJZiB5b3UndmUgYWxyZWFkeSBjb252ZXJ0ZWQKKyAgICAgICAgdGhlIGRvY3VtZW50IHRvIFVuaWNvZGUsIHlvdSdyZSB0b28gbGF0ZS4KKworICAgICAgICBUaGUgb3V0cHV0IGlzIGEgYnl0ZXN0cmluZyBpbiB3aGljaCBgZW1iZWRkZWRfZW5jb2RpbmdgCisgICAgICAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byB0aGVpciBgbWFpbl9lbmNvZGluZ2AKKyAgICAgICAgZXF1aXZhbGVudHMuCisgICAgICAgICIiIgorICAgICAgICBpZiBlbWJlZGRlZF9lbmNvZGluZy5yZXBsYWNlKCdfJywgJy0nKS5sb3dlcigpIG5vdCBpbiAoCisgICAgICAgICAgICAnd2luZG93cy0xMjUyJywgJ3dpbmRvd3NfMTI1MicpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICAgICAiV2luZG93cy0xMjUyIGFuZCBJU08tODg1OS0xIGFyZSB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAiZW1iZWRkZWQgZW5jb2RpbmdzLiIpCisKKyAgICAgICAgaWYgbWFpbl9lbmNvZGluZy5sb3dlcigpIG5vdCBpbiAoJ3V0ZjgnLCAndXRmLTgnKToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAgICAgIlVURi04IGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQgbWFpbiBlbmNvZGluZy4iKQorCisgICAgICAgIGJ5dGVfY2h1bmtzID0gW10KKworICAgICAgICBjaHVua19zdGFydCA9IDAKKyAgICAgICAgcG9zID0gMAorICAgICAgICB3aGlsZSBwb3MgPCBsZW4oaW5fYnl0ZXMpOgorICAgICAgICAgICAgYnl0ZSA9IGluX2J5dGVzW3Bvc10KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ5dGUsIGludCk6CisgICAgICAgICAgICAgICAgIyBQeXRob24gMi54CisgICAgICAgICAgICAgICAgYnl0ZSA9IG9yZChieXRlKQorICAgICAgICAgICAgaWYgKGJ5dGUgPj0gY2xzLkZJUlNUX01VTFRJQllURV9NQVJLRVIKKyAgICAgICAgICAgICAgICBhbmQgYnl0ZSA8PSBjbHMuTEFTVF9NVUxUSUJZVEVfTUFSS0VSKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgVVRGLTggbXVsdGlieXRlIGNoYXJhY3Rlci4gU2tpcAorICAgICAgICAgICAgICAgICMgdG8gdGhlIGVuZC4KKyAgICAgICAgICAgICAgICBmb3Igc3RhcnQsIGVuZCwgc2l6ZSBpbiBjbHMuTVVMVElCWVRFX01BUktFUlNfQU5EX1NJWkVTOgorICAgICAgICAgICAgICAgICAgICBpZiBieXRlID49IHN0YXJ0IGFuZCBieXRlIDw9IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBieXRlID49IDB4ODAgYW5kIGJ5dGUgaW4gY2xzLldJTkRPV1NfMTI1Ml9UT19VVEY4OgorICAgICAgICAgICAgICAgICMgV2UgZm91bmQgYSBXaW5kb3dzLTEyNTIgY2hhcmFjdGVyIQorICAgICAgICAgICAgICAgICMgU2F2ZSB0aGUgc3RyaW5nIHVwIHRvIHRoaXMgcG9pbnQgYXMgYSBjaHVuay4KKyAgICAgICAgICAgICAgICBieXRlX2NodW5rcy5hcHBlbmQoaW5fYnl0ZXNbY2h1bmtfc3RhcnQ6cG9zXSkKKworICAgICAgICAgICAgICAgICMgTm93IHRyYW5zbGF0ZSB0aGUgV2luZG93cy0xMjUyIGNoYXJhY3RlciBpbnRvIFVURi04CisgICAgICAgICAgICAgICAgIyBhbmQgYWRkIGl0IGFzIGFub3RoZXIsIG9uZS1ieXRlIGNodW5rLgorICAgICAgICAgICAgICAgIGJ5dGVfY2h1bmtzLmFwcGVuZChjbHMuV0lORE9XU18xMjUyX1RPX1VURjhbYnl0ZV0pCisgICAgICAgICAgICAgICAgcG9zICs9IDEKKyAgICAgICAgICAgICAgICBjaHVua19zdGFydCA9IHBvcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEdvIG9uIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICBwb3MgKz0gMQorICAgICAgICBpZiBjaHVua19zdGFydCA9PSAwOgorICAgICAgICAgICAgIyBUaGUgc3RyaW5nIGlzIHVuY2hhbmdlZC4KKyAgICAgICAgICAgIHJldHVybiBpbl9ieXRlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTdG9yZSB0aGUgZmluYWwgY2h1bmsuCisgICAgICAgICAgICBieXRlX2NodW5rcy5hcHBlbmQoaW5fYnl0ZXNbY2h1bmtfc3RhcnQ6XSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKGJ5dGVfY2h1bmtzKQorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvZGlhZ25vc2UucHkgYi9iaXRiYWtlL2xpYi9iczQvZGlhZ25vc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwYjAwYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC9kaWFnbm9zZS5weQpAQCAtMCwwICsxLDIwNCBAQAorIiIiRGlhZ25vc3RpYyBmdW5jdGlvbnMsIG1haW5seSBmb3IgdXNlIHdoZW4gZG9pbmcgdGVjaCBzdXBwb3J0LiIiIgoraW1wb3J0IGNQcm9maWxlCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBIVE1MUGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyCitpbXBvcnQgYnM0Citmcm9tIGJzNCBpbXBvcnQgQmVhdXRpZnVsU291cCwgX192ZXJzaW9uX18KK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0IGJ1aWxkZXJfcmVnaXN0cnkKKworaW1wb3J0IG9zCitpbXBvcnQgcHN0YXRzCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgc3lzCitpbXBvcnQgY1Byb2ZpbGUKKworZGVmIGRpYWdub3NlKGRhdGEpOgorICAgICIiIkRpYWdub3N0aWMgc3VpdGUgZm9yIGlzb2xhdGluZyBjb21tb24gcHJvYmxlbXMuIiIiCisgICAgcHJpbnQgIkRpYWdub3N0aWMgcnVubmluZyBvbiBCZWF1dGlmdWwgU291cCAlcyIgJSBfX3ZlcnNpb25fXworICAgIHByaW50ICJQeXRob24gdmVyc2lvbiAlcyIgJSBzeXMudmVyc2lvbgorCisgICAgYmFzaWNfcGFyc2VycyA9IFsiaHRtbC5wYXJzZXIiLCAiaHRtbDVsaWIiLCAibHhtbCJdCisgICAgZm9yIG5hbWUgaW4gYmFzaWNfcGFyc2VyczoKKyAgICAgICAgZm9yIGJ1aWxkZXIgaW4gYnVpbGRlcl9yZWdpc3RyeS5idWlsZGVyczoKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gYnVpbGRlci5mZWF0dXJlczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzaWNfcGFyc2Vycy5yZW1vdmUobmFtZSkKKyAgICAgICAgICAgIHByaW50ICgKKyAgICAgICAgICAgICAgICAiSSBub3RpY2VkIHRoYXQgJXMgaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyBpdCBtYXkgaGVscC4iICUKKyAgICAgICAgICAgICAgICBuYW1lKQorCisgICAgaWYgJ2x4bWwnIGluIGJhc2ljX3BhcnNlcnM6CisgICAgICAgIGJhc2ljX3BhcnNlcnMuYXBwZW5kKFsibHhtbCIsICJ4bWwiXSkKKyAgICAgICAgZnJvbSBseG1sIGltcG9ydCBldHJlZQorICAgICAgICBwcmludCAiRm91bmQgbHhtbCB2ZXJzaW9uICVzIiAlICIuIi5qb2luKG1hcChzdHIsZXRyZWUuTFhNTF9WRVJTSU9OKSkKKworICAgIGlmICdodG1sNWxpYicgaW4gYmFzaWNfcGFyc2VyczoKKyAgICAgICAgaW1wb3J0IGh0bWw1bGliCisgICAgICAgIHByaW50ICJGb3VuZCBodG1sNWxpYiB2ZXJzaW9uICVzIiAlIGh0bWw1bGliLl9fdmVyc2lvbl9fCisKKyAgICBpZiBoYXNhdHRyKGRhdGEsICdyZWFkJyk6CisgICAgICAgIGRhdGEgPSBkYXRhLnJlYWQoKQorICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZGF0YSk6CisgICAgICAgIHByaW50ICciJXMiIGxvb2tzIGxpa2UgYSBmaWxlbmFtZS4gUmVhZGluZyBkYXRhIGZyb20gdGhlIGZpbGUuJyAlIGRhdGEKKyAgICAgICAgZGF0YSA9IG9wZW4oZGF0YSkucmVhZCgpCisgICAgZWxpZiBkYXRhLnN0YXJ0c3dpdGgoImh0dHA6Iikgb3IgZGF0YS5zdGFydHN3aXRoKCJodHRwczoiKToKKyAgICAgICAgcHJpbnQgJyIlcyIgbG9va3MgbGlrZSBhIFVSTC4gQmVhdXRpZnVsIFNvdXAgaXMgbm90IGFuIEhUVFAgY2xpZW50LicgJSBkYXRhCisgICAgICAgIHByaW50ICJZb3UgbmVlZCB0byB1c2Ugc29tZSBvdGhlciBsaWJyYXJ5IHRvIGdldCB0aGUgZG9jdW1lbnQgYmVoaW5kIHRoZSBVUkwsIGFuZCBmZWVkIHRoYXQgZG9jdW1lbnQgdG8gQmVhdXRpZnVsIFNvdXAuIgorICAgICAgICByZXR1cm4KKyAgICBwcmludAorCisgICAgZm9yIHBhcnNlciBpbiBiYXNpY19wYXJzZXJzOgorICAgICAgICBwcmludCAiVHJ5aW5nIHRvIHBhcnNlIHlvdXIgbWFya3VwIHdpdGggJXMiICUgcGFyc2VyCisgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChkYXRhLCBwYXJzZXIpCisgICAgICAgICAgICBzdWNjZXNzID0gVHJ1ZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgIiVzIGNvdWxkIG5vdCBwYXJzZSB0aGUgbWFya3VwLiIgJSBwYXJzZXIKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICBpZiBzdWNjZXNzOgorICAgICAgICAgICAgcHJpbnQgIkhlcmUncyB3aGF0ICVzIGRpZCB3aXRoIHRoZSBtYXJrdXA6IiAlIHBhcnNlcgorICAgICAgICAgICAgcHJpbnQgc291cC5wcmV0dGlmeSgpCisKKyAgICAgICAgcHJpbnQgIi0iICogODAKKworZGVmIGx4bWxfdHJhY2UoZGF0YSwgaHRtbD1UcnVlLCAqKmt3YXJncyk6CisgICAgIiIiUHJpbnQgb3V0IHRoZSBseG1sIGV2ZW50cyB0aGF0IG9jY3VyIGR1cmluZyBwYXJzaW5nLgorCisgICAgVGhpcyBsZXRzIHlvdSBzZWUgaG93IGx4bWwgcGFyc2VzIGEgZG9jdW1lbnQgd2hlbiBubyBCZWF1dGlmdWwKKyAgICBTb3VwIGNvZGUgaXMgcnVubmluZy4KKyAgICAiIiIKKyAgICBmcm9tIGx4bWwgaW1wb3J0IGV0cmVlCisgICAgZm9yIGV2ZW50LCBlbGVtZW50IGluIGV0cmVlLml0ZXJwYXJzZShTdHJpbmdJTyhkYXRhKSwgaHRtbD1odG1sLCAqKmt3YXJncyk6CisgICAgICAgIHByaW50KCIlcywgJTRzLCAlcyIgJSAoZXZlbnQsIGVsZW1lbnQudGFnLCBlbGVtZW50LnRleHQpKQorCitjbGFzcyBBbm5vdW5jaW5nUGFyc2VyKEhUTUxQYXJzZXIpOgorICAgICIiIkFubm91bmNlcyBIVE1MUGFyc2VyIHBhcnNlIGV2ZW50cywgd2l0aG91dCBkb2luZyBhbnl0aGluZyBlbHNlLiIiIgorCisgICAgZGVmIF9wKHNlbGYsIHMpOgorICAgICAgICBwcmludChzKQorCisgICAgZGVmIGhhbmRsZV9zdGFydHRhZyhzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHNlbGYuX3AoIiVzIFNUQVJUIiAlIG5hbWUpCisKKyAgICBkZWYgaGFuZGxlX2VuZHRhZyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fcCgiJXMgRU5EIiAlIG5hbWUpCisKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX3AoIiVzIERBVEEiICUgZGF0YSkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fcCgiJXMgQ0hBUlJFRiIgJSBuYW1lKQorCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX3AoIiVzIEVOVElUWVJFRiIgJSBuYW1lKQorCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9wKCIlcyBDT01NRU5UIiAlIGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX3AoIiVzIERFQ0wiICUgZGF0YSkKKworICAgIGRlZiB1bmtub3duX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX3AoIiVzIFVOS05PV04tREVDTCIgJSBkYXRhKQorCisgICAgZGVmIGhhbmRsZV9waShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fcCgiJXMgUEkiICUgZGF0YSkKKworZGVmIGh0bWxwYXJzZXJfdHJhY2UoZGF0YSk6CisgICAgIiIiUHJpbnQgb3V0IHRoZSBIVE1MUGFyc2VyIGV2ZW50cyB0aGF0IG9jY3VyIGR1cmluZyBwYXJzaW5nLgorCisgICAgVGhpcyBsZXRzIHlvdSBzZWUgaG93IEhUTUxQYXJzZXIgcGFyc2VzIGEgZG9jdW1lbnQgd2hlbiBubworICAgIEJlYXV0aWZ1bCBTb3VwIGNvZGUgaXMgcnVubmluZy4KKyAgICAiIiIKKyAgICBwYXJzZXIgPSBBbm5vdW5jaW5nUGFyc2VyKCkKKyAgICBwYXJzZXIuZmVlZChkYXRhKQorCitfdm93ZWxzID0gImFlaW91IgorX2NvbnNvbmFudHMgPSAiYmNkZmdoamtsbW5wcXJzdHZ3eHl6IgorCitkZWYgcndvcmQobGVuZ3RoPTUpOgorICAgICJHZW5lcmF0ZSBhIHJhbmRvbSB3b3JkLWxpa2Ugc3RyaW5nLiIKKyAgICBzID0gJycKKyAgICBmb3IgaSBpbiByYW5nZShsZW5ndGgpOgorICAgICAgICBpZiBpICUgMiA9PSAwOgorICAgICAgICAgICAgdCA9IF9jb25zb25hbnRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ID0gX3Zvd2VscworICAgICAgICBzICs9IHJhbmRvbS5jaG9pY2UodCkKKyAgICByZXR1cm4gcworCitkZWYgcnNlbnRlbmNlKGxlbmd0aD00KToKKyAgICAiR2VuZXJhdGUgYSByYW5kb20gc2VudGVuY2UtbGlrZSBzdHJpbmcuIgorICAgIHJldHVybiAiICIuam9pbihyd29yZChyYW5kb20ucmFuZGludCg0LDkpKSBmb3IgaSBpbiByYW5nZShsZW5ndGgpKQorICAgICAgICAKK2RlZiByZG9jKG51bV9lbGVtZW50cz0xMDAwKToKKyAgICAiIiJSYW5kb21seSBnZW5lcmF0ZSBhbiBpbnZhbGlkIEhUTUwgZG9jdW1lbnQuIiIiCisgICAgdGFnX25hbWVzID0gWydwJywgJ2RpdicsICdzcGFuJywgJ2knLCAnYicsICdzY3JpcHQnLCAndGFibGUnXQorICAgIGVsZW1lbnRzID0gW10KKyAgICBmb3IgaSBpbiByYW5nZShudW1fZWxlbWVudHMpOgorICAgICAgICBjaG9pY2UgPSByYW5kb20ucmFuZGludCgwLDMpCisgICAgICAgIGlmIGNob2ljZSA9PSAwOgorICAgICAgICAgICAgIyBOZXcgdGFnLgorICAgICAgICAgICAgdGFnX25hbWUgPSByYW5kb20uY2hvaWNlKHRhZ19uYW1lcykKKyAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCgiPCVzPiIgJSB0YWdfbmFtZSkKKyAgICAgICAgZWxpZiBjaG9pY2UgPT0gMToKKyAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZChyc2VudGVuY2UocmFuZG9tLnJhbmRpbnQoMSw0KSkpCisgICAgICAgIGVsaWYgY2hvaWNlID09IDI6CisgICAgICAgICAgICAjIENsb3NlIGEgdGFnLgorICAgICAgICAgICAgdGFnX25hbWUgPSByYW5kb20uY2hvaWNlKHRhZ19uYW1lcykKKyAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCgiPC8lcz4iICUgdGFnX25hbWUpCisgICAgcmV0dXJuICI8aHRtbD4iICsgIlxuIi5qb2luKGVsZW1lbnRzKSArICI8L2h0bWw+IgorCitkZWYgYmVuY2htYXJrX3BhcnNlcnMobnVtX2VsZW1lbnRzPTEwMDAwMCk6CisgICAgIiIiVmVyeSBiYXNpYyBoZWFkLXRvLWhlYWQgcGVyZm9ybWFuY2UgYmVuY2htYXJrLiIiIgorICAgIHByaW50ICJDb21wYXJhdGl2ZSBwYXJzZXIgYmVuY2htYXJrIG9uIEJlYXV0aWZ1bCBTb3VwICVzIiAlIF9fdmVyc2lvbl9fCisgICAgZGF0YSA9IHJkb2MobnVtX2VsZW1lbnRzKQorICAgIHByaW50ICJHZW5lcmF0ZWQgYSBsYXJnZSBpbnZhbGlkIEhUTUwgZG9jdW1lbnQgKCVkIGJ5dGVzKS4iICUgbGVuKGRhdGEpCisgICAgCisgICAgZm9yIHBhcnNlciBpbiBbImx4bWwiLCBbImx4bWwiLCAiaHRtbCJdLCAiaHRtbDVsaWIiLCAiaHRtbC5wYXJzZXIiXToKKyAgICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGEgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAoZGF0YSwgcGFyc2VyKQorICAgICAgICAgICAgYiA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzdWNjZXNzID0gVHJ1ZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgIiVzIGNvdWxkIG5vdCBwYXJzZSB0aGUgbWFya3VwLiIgJSBwYXJzZXIKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICBpZiBzdWNjZXNzOgorICAgICAgICAgICAgcHJpbnQgIkJTNCslcyBwYXJzZWQgdGhlIG1hcmt1cCBpbiAlLjJmcy4iICUgKHBhcnNlciwgYi1hKQorCisgICAgZnJvbSBseG1sIGltcG9ydCBldHJlZQorICAgIGEgPSB0aW1lLnRpbWUoKQorICAgIGV0cmVlLkhUTUwoZGF0YSkKKyAgICBiID0gdGltZS50aW1lKCkKKyAgICBwcmludCAiUmF3IGx4bWwgcGFyc2VkIHRoZSBtYXJrdXAgaW4gJS4yZnMuIiAlIChiLWEpCisKKyAgICBpbXBvcnQgaHRtbDVsaWIKKyAgICBwYXJzZXIgPSBodG1sNWxpYi5IVE1MUGFyc2VyKCkKKyAgICBhID0gdGltZS50aW1lKCkKKyAgICBwYXJzZXIucGFyc2UoZGF0YSkKKyAgICBiID0gdGltZS50aW1lKCkKKyAgICBwcmludCAiUmF3IGh0bWw1bGliIHBhcnNlZCB0aGUgbWFya3VwIGluICUuMmZzLiIgJSAoYi1hKQorCitkZWYgcHJvZmlsZShudW1fZWxlbWVudHM9MTAwMDAwLCBwYXJzZXI9Imx4bWwiKToKKworICAgIGZpbGVoYW5kbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgIGZpbGVuYW1lID0gZmlsZWhhbmRsZS5uYW1lCisKKyAgICBkYXRhID0gcmRvYyhudW1fZWxlbWVudHMpCisgICAgdmFycyA9IGRpY3QoYnM0PWJzNCwgZGF0YT1kYXRhLCBwYXJzZXI9cGFyc2VyKQorICAgIGNQcm9maWxlLnJ1bmN0eCgnYnM0LkJlYXV0aWZ1bFNvdXAoZGF0YSwgcGFyc2VyKScgLCB2YXJzLCB2YXJzLCBmaWxlbmFtZSkKKworICAgIHN0YXRzID0gcHN0YXRzLlN0YXRzKGZpbGVuYW1lKQorICAgICMgc3RhdHMuc3RyaXBfZGlycygpCisgICAgc3RhdHMuc29ydF9zdGF0cygiY3VtdWxhdGl2ZSIpCisgICAgc3RhdHMucHJpbnRfc3RhdHMoJ19odG1sNWxpYnxiczQnLCA1MCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBkaWFnbm9zZShzeXMuc3RkaW4ucmVhZCgpKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L2VsZW1lbnQucHkgYi9iaXRiYWtlL2xpYi9iczQvZWxlbWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTlhZmRmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L2VsZW1lbnQucHkKQEAgLTAsMCArMSwxNjExIEBACitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGJzNC5kYW1taXQgaW1wb3J0IEVudGl0eVN1YnN0aXR1dGlvbgorCitERUZBVUxUX09VVFBVVF9FTkNPRElORyA9ICJ1dGYtOCIKK1BZM0sgPSAoc3lzLnZlcnNpb25faW5mb1swXSA+IDIpCisKK3doaXRlc3BhY2VfcmUgPSByZS5jb21waWxlKCJccysiKQorCitkZWYgX2FsaWFzKGF0dHIpOgorICAgICIiIkFsaWFzIG9uZSBhdHRyaWJ1dGUgbmFtZSB0byBhbm90aGVyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IiIiCisgICAgQHByb3BlcnR5CisgICAgZGVmIGFsaWFzKHNlbGYpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBhdHRyKQorCisgICAgQGFsaWFzLnNldHRlcgorICAgIGRlZiBhbGlhcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNldGF0dHIoc2VsZiwgYXR0cikKKyAgICByZXR1cm4gYWxpYXMKKworCitjbGFzcyBOYW1lc3BhY2VkQXR0cmlidXRlKHVuaWNvZGUpOgorCisgICAgZGVmIF9fbmV3X18oY2xzLCBwcmVmaXgsIG5hbWUsIG5hbWVzcGFjZT1Ob25lKToKKyAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgb2JqID0gdW5pY29kZS5fX25ld19fKGNscywgcHJlZml4KQorICAgICAgICBlbGlmIHByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgIyBOb3QgcmVhbGx5IG5hbWVzcGFjZWQuCisgICAgICAgICAgICBvYmogPSB1bmljb2RlLl9fbmV3X18oY2xzLCBuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqID0gdW5pY29kZS5fX25ld19fKGNscywgcHJlZml4ICsgIjoiICsgbmFtZSkKKyAgICAgICAgb2JqLnByZWZpeCA9IHByZWZpeAorICAgICAgICBvYmoubmFtZSA9IG5hbWUKKyAgICAgICAgb2JqLm5hbWVzcGFjZSA9IG5hbWVzcGFjZQorICAgICAgICByZXR1cm4gb2JqCisKK2NsYXNzIEF0dHJpYnV0ZVZhbHVlV2l0aENoYXJzZXRTdWJzdGl0dXRpb24odW5pY29kZSk6CisgICAgIiIiQSBzdGFuZC1pbiBvYmplY3QgZm9yIGEgY2hhcmFjdGVyIGVuY29kaW5nIHNwZWNpZmllZCBpbiBIVE1MLiIiIgorCitjbGFzcyBDaGFyc2V0TWV0YUF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZVZhbHVlV2l0aENoYXJzZXRTdWJzdGl0dXRpb24pOgorICAgICIiIkEgZ2VuZXJpYyBzdGFuZC1pbiBmb3IgdGhlIHZhbHVlIG9mIGEgbWV0YSB0YWcncyAnY2hhcnNldCcgYXR0cmlidXRlLgorCisgICAgV2hlbiBCZWF1dGlmdWwgU291cCBwYXJzZXMgdGhlIG1hcmt1cCAnPG1ldGEgY2hhcnNldD0idXRmOCI+JywgdGhlCisgICAgdmFsdWUgb2YgdGhlICdjaGFyc2V0JyBhdHRyaWJ1dGUgd2lsbCBiZSBvbmUgb2YgdGhlc2Ugb2JqZWN0cy4KKyAgICAiIiIKKworICAgIGRlZiBfX25ld19fKGNscywgb3JpZ2luYWxfdmFsdWUpOgorICAgICAgICBvYmogPSB1bmljb2RlLl9fbmV3X18oY2xzLCBvcmlnaW5hbF92YWx1ZSkKKyAgICAgICAgb2JqLm9yaWdpbmFsX3ZhbHVlID0gb3JpZ2luYWxfdmFsdWUKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIGVuY29kZShzZWxmLCBlbmNvZGluZyk6CisgICAgICAgIHJldHVybiBlbmNvZGluZworCisKK2NsYXNzIENvbnRlbnRNZXRhQXR0cmlidXRlVmFsdWUoQXR0cmlidXRlVmFsdWVXaXRoQ2hhcnNldFN1YnN0aXR1dGlvbik6CisgICAgIiIiQSBnZW5lcmljIHN0YW5kLWluIGZvciB0aGUgdmFsdWUgb2YgYSBtZXRhIHRhZydzICdjb250ZW50JyBhdHRyaWJ1dGUuCisKKyAgICBXaGVuIEJlYXV0aWZ1bCBTb3VwIHBhcnNlcyB0aGUgbWFya3VwOgorICAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGY4Ij4KKworICAgIFRoZSB2YWx1ZSBvZiB0aGUgJ2NvbnRlbnQnIGF0dHJpYnV0ZSB3aWxsIGJlIG9uZSBvZiB0aGVzZSBvYmplY3RzLgorICAgICIiIgorCisgICAgQ0hBUlNFVF9SRSA9IHJlLmNvbXBpbGUoIigoXnw7KVxzKmNoYXJzZXQ9KShbXjtdKikiLCByZS5NKQorCisgICAgZGVmIF9fbmV3X18oY2xzLCBvcmlnaW5hbF92YWx1ZSk6CisgICAgICAgIG1hdGNoID0gY2xzLkNIQVJTRVRfUkUuc2VhcmNoKG9yaWdpbmFsX3ZhbHVlKQorICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgIyBObyBzdWJzdGl0dXRpb24gbmVjZXNzYXJ5LgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUuX19uZXdfXyh1bmljb2RlLCBvcmlnaW5hbF92YWx1ZSkKKworICAgICAgICBvYmogPSB1bmljb2RlLl9fbmV3X18oY2xzLCBvcmlnaW5hbF92YWx1ZSkKKyAgICAgICAgb2JqLm9yaWdpbmFsX3ZhbHVlID0gb3JpZ2luYWxfdmFsdWUKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIGVuY29kZShzZWxmLCBlbmNvZGluZyk6CisgICAgICAgIGRlZiByZXdyaXRlKG1hdGNoKToKKyAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgxKSArIGVuY29kaW5nCisgICAgICAgIHJldHVybiBzZWxmLkNIQVJTRVRfUkUuc3ViKHJld3JpdGUsIHNlbGYub3JpZ2luYWxfdmFsdWUpCisKK2NsYXNzIEhUTUxBd2FyZUVudGl0eVN1YnN0aXR1dGlvbihFbnRpdHlTdWJzdGl0dXRpb24pOgorCisgICAgIiIiRW50aXR5IHN1YnN0aXR1dGlvbiBydWxlcyB0aGF0IGFyZSBhd2FyZSBvZiBzb21lIEhUTUwgcXVpcmtzLgorCisgICAgU3BlY2lmaWNhbGx5LCB0aGUgY29udGVudHMgb2YgPHNjcmlwdD4gYW5kIDxzdHlsZT4gdGFncyBzaG91bGQgbm90CisgICAgdW5kZXJnbyBlbnRpdHkgc3Vic3RpdHV0aW9uLgorCisgICAgSW5jb21pbmcgTmF2aWdhYmxlU3RyaW5nIG9iamVjdHMgYXJlIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkncmUgdGhlCisgICAgZGlyZWN0IGNoaWxkcmVuIG9mIGEgPHNjcmlwdD4gb3IgPHN0eWxlPiB0YWcuCisgICAgIiIiCisKKyAgICBjZGF0YV9jb250YWluaW5nX3RhZ3MgPSBzZXQoWyJzY3JpcHQiLCAic3R5bGUiXSkKKworICAgIHByZWZvcm1hdHRlZF90YWdzID0gc2V0KFsicHJlIl0pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3N1YnN0aXR1dGVfaWZfYXBwcm9wcmlhdGUoY2xzLCBucywgZik6CisgICAgICAgIGlmIChpc2luc3RhbmNlKG5zLCBOYXZpZ2FibGVTdHJpbmcpCisgICAgICAgICAgICBhbmQgbnMucGFyZW50IGlzIG5vdCBOb25lCisgICAgICAgICAgICBhbmQgbnMucGFyZW50Lm5hbWUgaW4gY2xzLmNkYXRhX2NvbnRhaW5pbmdfdGFncyk6CisgICAgICAgICAgICAjIERvIG5vdGhpbmcuCisgICAgICAgICAgICByZXR1cm4gbnMKKyAgICAgICAgIyBTdWJzdGl0dXRlLgorICAgICAgICByZXR1cm4gZihucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzdWJzdGl0dXRlX2h0bWwoY2xzLCBucyk6CisgICAgICAgIHJldHVybiBjbHMuX3N1YnN0aXR1dGVfaWZfYXBwcm9wcmlhdGUoCisgICAgICAgICAgICBucywgRW50aXR5U3Vic3RpdHV0aW9uLnN1YnN0aXR1dGVfaHRtbCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzdWJzdGl0dXRlX3htbChjbHMsIG5zKToKKyAgICAgICAgcmV0dXJuIGNscy5fc3Vic3RpdHV0ZV9pZl9hcHByb3ByaWF0ZSgKKyAgICAgICAgICAgIG5zLCBFbnRpdHlTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZV94bWwpCisKK2NsYXNzIFBhZ2VFbGVtZW50KG9iamVjdCk6CisgICAgIiIiQ29udGFpbnMgdGhlIG5hdmlnYXRpb25hbCBpbmZvcm1hdGlvbiBmb3Igc29tZSBwYXJ0IG9mIHRoZSBwYWdlCisgICAgKGVpdGhlciBhIHRhZyBvciBhIHBpZWNlIG9mIHRleHQpIiIiCisKKyAgICAjIFRoZXJlIGFyZSBmaXZlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlICJmb3JtYXR0ZXIiIGFyZ3VtZW50IHBhc3NlZCBpbgorICAgICMgdG8gbWV0aG9kcyBsaWtlIGVuY29kZSgpIGFuZCBwcmV0dGlmeSgpOgorICAgICMKKyAgICAjICJodG1sIiAtIEFsbCBVbmljb2RlIGNoYXJhY3RlcnMgd2l0aCBjb3JyZXNwb25kaW5nIEhUTUwgZW50aXRpZXMKKyAgICAjICAgYXJlIGNvbnZlcnRlZCB0byB0aG9zZSBlbnRpdGllcyBvbiBvdXRwdXQuCisgICAgIyAibWluaW1hbCIgLSBCYXJlIGFtcGVyc2FuZHMgYW5kIGFuZ2xlIGJyYWNrZXRzIGFyZSBjb252ZXJ0ZWQgdG8KKyAgICAjICAgWE1MIGVudGl0aWVzOiAmYW1wOyAmbHQ7ICZndDsKKyAgICAjIE5vbmUgLSBUaGUgbnVsbCBmb3JtYXR0ZXIuIFVuaWNvZGUgY2hhcmFjdGVycyBhcmUgbmV2ZXIKKyAgICAjICAgY29udmVydGVkIHRvIGVudGl0aWVzLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQsIGJ1dCBpdCdzCisgICAgIyAgIGZhc3RlciB0aGFuICJtaW5pbWFsIi4KKyAgICAjIEEgZnVuY3Rpb24gLSBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGV2ZXJ5IHN0cmluZyB0aGF0CisgICAgIyAgbmVlZHMgdG8gdW5kZXJnbyBlbnRpdHkgc3Vic3RpdHV0aW9uLgorICAgICMKKworICAgICMgSW4gYW4gSFRNTCBkb2N1bWVudCwgdGhlIGRlZmF1bHQgImh0bWwiIGFuZCAibWluaW1hbCIgZnVuY3Rpb25zCisgICAgIyB3aWxsIGxlYXZlIHRoZSBjb250ZW50cyBvZiA8c2NyaXB0PiBhbmQgPHN0eWxlPiB0YWdzIGFsb25lLiBGb3IKKyAgICAjIGFuIFhNTCBkb2N1bWVudCwgYWxsIHRhZ3Mgd2lsbCBiZSBnaXZlbiB0aGUgc2FtZSB0cmVhdG1lbnQuCisKKyAgICBIVE1MX0ZPUk1BVFRFUlMgPSB7CisgICAgICAgICJodG1sIiA6IEhUTUxBd2FyZUVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX2h0bWwsCisgICAgICAgICJtaW5pbWFsIiA6IEhUTUxBd2FyZUVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX3htbCwKKyAgICAgICAgTm9uZSA6IE5vbmUKKyAgICAgICAgfQorCisgICAgWE1MX0ZPUk1BVFRFUlMgPSB7CisgICAgICAgICJodG1sIiA6IEVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX2h0bWwsCisgICAgICAgICJtaW5pbWFsIiA6IEVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX3htbCwKKyAgICAgICAgTm9uZSA6IE5vbmUKKyAgICAgICAgfQorCisgICAgZGVmIGZvcm1hdF9zdHJpbmcoc2VsZiwgcywgZm9ybWF0dGVyPSdtaW5pbWFsJyk6CisgICAgICAgICIiIkZvcm1hdCB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXR0ZXIuIiIiCisgICAgICAgIGlmIG5vdCBjYWxsYWJsZShmb3JtYXR0ZXIpOgorICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5fZm9ybWF0dGVyX2Zvcl9uYW1lKGZvcm1hdHRlcikKKyAgICAgICAgaWYgZm9ybWF0dGVyIGlzIE5vbmU6CisgICAgICAgICAgICBvdXRwdXQgPSBzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQgPSBmb3JtYXR0ZXIocykKKyAgICAgICAgcmV0dXJuIG91dHB1dAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9pc194bWwoc2VsZik6CisgICAgICAgICIiIklzIHRoaXMgZWxlbWVudCBwYXJ0IG9mIGFuIFhNTCB0cmVlIG9yIGFuIEhUTUwgdHJlZT8KKworICAgICAgICBUaGlzIGlzIHVzZWQgd2hlbiBtYXBwaW5nIGEgZm9ybWF0dGVyIG5hbWUgKCJtaW5pbWFsIikgdG8gYW4KKyAgICAgICAgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKG9uZSB0aGF0IHBlcmZvcm1zIGVudGl0eS1zdWJzdGl0dXRpb24gb24KKyAgICAgICAgdGhlIGNvbnRlbnRzIG9mIDxzY3JpcHQ+IGFuZCA8c3R5bGU+IHRhZ3MsIG9yIG5vdCkuIEl0J3MKKyAgICAgICAgaW5lZmZpY2llbnQsIGJ1dCBpdCBzaG91bGQgYmUgY2FsbGVkIHZlcnkgcmFyZWx5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgdG9wLWxldmVsIG9iamVjdC4gSXQgc2hvdWxkIGhhdmUgLmlzX3htbCBzZXQKKyAgICAgICAgICAgICMgZnJvbSB0cmVlIGNyZWF0aW9uLiBJZiBub3QsIHRha2UgYSBndWVzcy0tQlMgaXMgdXN1YWxseQorICAgICAgICAgICAgIyB1c2VkIG9uIEhUTUwgbWFya3VwLgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgJ2lzX3htbCcsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQuX2lzX3htbAorCisgICAgZGVmIF9mb3JtYXR0ZXJfZm9yX25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgICJMb29rIHVwIGEgZm9ybWF0dGVyIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyBuYW1lIGFuZCB0aGUgdHJlZS4iCisgICAgICAgIGlmIHNlbGYuX2lzX3htbDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLlhNTF9GT1JNQVRURVJTLmdldCgKKyAgICAgICAgICAgICAgICBuYW1lLCBFbnRpdHlTdWJzdGl0dXRpb24uc3Vic3RpdHV0ZV94bWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5IVE1MX0ZPUk1BVFRFUlMuZ2V0KAorICAgICAgICAgICAgICAgIG5hbWUsIEhUTUxBd2FyZUVudGl0eVN1YnN0aXR1dGlvbi5zdWJzdGl0dXRlX3htbCkKKworICAgIGRlZiBzZXR1cChzZWxmLCBwYXJlbnQ9Tm9uZSwgcHJldmlvdXNfZWxlbWVudD1Ob25lKToKKyAgICAgICAgIiIiU2V0cyB1cCB0aGUgaW5pdGlhbCByZWxhdGlvbnMgYmV0d2VlbiB0aGlzIGVsZW1lbnQgYW5kCisgICAgICAgIG90aGVyIGVsZW1lbnRzLiIiIgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLnByZXZpb3VzX2VsZW1lbnQgPSBwcmV2aW91c19lbGVtZW50CisgICAgICAgIGlmIHByZXZpb3VzX2VsZW1lbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnByZXZpb3VzX2VsZW1lbnQubmV4dF9lbGVtZW50ID0gc2VsZgorICAgICAgICBzZWxmLm5leHRfZWxlbWVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmV2aW91c19zaWJsaW5nID0gTm9uZQorICAgICAgICBzZWxmLm5leHRfc2libGluZyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmUgYW5kIHNlbGYucGFyZW50LmNvbnRlbnRzOgorICAgICAgICAgICAgc2VsZi5wcmV2aW91c19zaWJsaW5nID0gc2VsZi5wYXJlbnQuY29udGVudHNbLTFdCisgICAgICAgICAgICBzZWxmLnByZXZpb3VzX3NpYmxpbmcubmV4dF9zaWJsaW5nID0gc2VsZgorCisgICAgbmV4dFNpYmxpbmcgPSBfYWxpYXMoIm5leHRfc2libGluZyIpICAjIEJTMworICAgIHByZXZpb3VzU2libGluZyA9IF9hbGlhcygicHJldmlvdXNfc2libGluZyIpICAjIEJTMworCisgICAgZGVmIHJlcGxhY2Vfd2l0aChzZWxmLCByZXBsYWNlX3dpdGgpOgorICAgICAgICBpZiByZXBsYWNlX3dpdGggaXMgc2VsZjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiByZXBsYWNlX3dpdGggaXMgc2VsZi5wYXJlbnQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgcmVwbGFjZSBhIFRhZyB3aXRoIGl0cyBwYXJlbnQuIikKKyAgICAgICAgb2xkX3BhcmVudCA9IHNlbGYucGFyZW50CisgICAgICAgIG15X2luZGV4ID0gc2VsZi5wYXJlbnQuaW5kZXgoc2VsZikKKyAgICAgICAgc2VsZi5leHRyYWN0KCkKKyAgICAgICAgb2xkX3BhcmVudC5pbnNlcnQobXlfaW5kZXgsIHJlcGxhY2Vfd2l0aCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICByZXBsYWNlV2l0aCA9IHJlcGxhY2Vfd2l0aCAgIyBCUzMKKworICAgIGRlZiB1bndyYXAoc2VsZik6CisgICAgICAgIG15X3BhcmVudCA9IHNlbGYucGFyZW50CisgICAgICAgIG15X2luZGV4ID0gc2VsZi5wYXJlbnQuaW5kZXgoc2VsZikKKyAgICAgICAgc2VsZi5leHRyYWN0KCkKKyAgICAgICAgZm9yIGNoaWxkIGluIHJldmVyc2VkKHNlbGYuY29udGVudHNbOl0pOgorICAgICAgICAgICAgbXlfcGFyZW50Lmluc2VydChteV9pbmRleCwgY2hpbGQpCisgICAgICAgIHJldHVybiBzZWxmCisgICAgcmVwbGFjZV93aXRoX2NoaWxkcmVuID0gdW53cmFwCisgICAgcmVwbGFjZVdpdGhDaGlsZHJlbiA9IHVud3JhcCAgIyBCUzMKKworICAgIGRlZiB3cmFwKHNlbGYsIHdyYXBfaW5zaWRlKToKKyAgICAgICAgbWUgPSBzZWxmLnJlcGxhY2Vfd2l0aCh3cmFwX2luc2lkZSkKKyAgICAgICAgd3JhcF9pbnNpZGUuYXBwZW5kKG1lKQorICAgICAgICByZXR1cm4gd3JhcF9pbnNpZGUKKworICAgIGRlZiBleHRyYWN0KHNlbGYpOgorICAgICAgICAiIiJEZXN0cnVjdGl2ZWx5IHJpcHMgdGhpcyBlbGVtZW50IG91dCBvZiB0aGUgdHJlZS4iIiIKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgc2VsZi5wYXJlbnQuY29udGVudHNbc2VsZi5wYXJlbnQuaW5kZXgoc2VsZildCisKKyAgICAgICAgI0ZpbmQgdGhlIHR3byBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIG5leHQgdG8gZWFjaCBvdGhlciBpZgorICAgICAgICAjdGhpcyBlbGVtZW50IChhbmQgYW55IGNoaWxkcmVuKSBoYWRuJ3QgYmVlbiBwYXJzZWQuIENvbm5lY3QKKyAgICAgICAgI3RoZSB0d28uCisgICAgICAgIGxhc3RfY2hpbGQgPSBzZWxmLl9sYXN0X2Rlc2NlbmRhbnQoKQorICAgICAgICBuZXh0X2VsZW1lbnQgPSBsYXN0X2NoaWxkLm5leHRfZWxlbWVudAorCisgICAgICAgIGlmIHNlbGYucHJldmlvdXNfZWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJldmlvdXNfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBuZXh0X2VsZW1lbnQKKyAgICAgICAgaWYgbmV4dF9lbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmV4dF9lbGVtZW50LnByZXZpb3VzX2VsZW1lbnQgPSBzZWxmLnByZXZpb3VzX2VsZW1lbnQKKyAgICAgICAgc2VsZi5wcmV2aW91c19lbGVtZW50ID0gTm9uZQorICAgICAgICBsYXN0X2NoaWxkLm5leHRfZWxlbWVudCA9IE5vbmUKKworICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5wcmV2aW91c19zaWJsaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wcmV2aW91c19zaWJsaW5nLm5leHRfc2libGluZyA9IHNlbGYubmV4dF9zaWJsaW5nCisgICAgICAgIGlmIHNlbGYubmV4dF9zaWJsaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5uZXh0X3NpYmxpbmcucHJldmlvdXNfc2libGluZyA9IHNlbGYucHJldmlvdXNfc2libGluZworICAgICAgICBzZWxmLnByZXZpb3VzX3NpYmxpbmcgPSBzZWxmLm5leHRfc2libGluZyA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfbGFzdF9kZXNjZW5kYW50KHNlbGYsIGlzX2luaXRpYWxpemVkPVRydWUsIGFjY2VwdF9zZWxmPVRydWUpOgorICAgICAgICAiRmluZHMgdGhlIGxhc3QgZWxlbWVudCBiZW5lYXRoIHRoaXMgb2JqZWN0IHRvIGJlIHBhcnNlZC4iCisgICAgICAgIGlmIGlzX2luaXRpYWxpemVkIGFuZCBzZWxmLm5leHRfc2libGluZzoKKyAgICAgICAgICAgIGxhc3RfY2hpbGQgPSBzZWxmLm5leHRfc2libGluZy5wcmV2aW91c19lbGVtZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYXN0X2NoaWxkID0gc2VsZgorICAgICAgICAgICAgd2hpbGUgaXNpbnN0YW5jZShsYXN0X2NoaWxkLCBUYWcpIGFuZCBsYXN0X2NoaWxkLmNvbnRlbnRzOgorICAgICAgICAgICAgICAgIGxhc3RfY2hpbGQgPSBsYXN0X2NoaWxkLmNvbnRlbnRzWy0xXQorICAgICAgICBpZiBub3QgYWNjZXB0X3NlbGYgYW5kIGxhc3RfY2hpbGQgPT0gc2VsZjoKKyAgICAgICAgICAgIGxhc3RfY2hpbGQgPSBOb25lCisgICAgICAgIHJldHVybiBsYXN0X2NoaWxkCisgICAgIyBCUzM6IE5vdCBwYXJ0IG9mIHRoZSBBUEkhCisgICAgX2xhc3RSZWN1cnNpdmVDaGlsZCA9IF9sYXN0X2Rlc2NlbmRhbnQKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgcG9zaXRpb24sIG5ld19jaGlsZCk6CisgICAgICAgIGlmIG5ld19jaGlsZCBpcyBzZWxmOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGluc2VydCBhIHRhZyBpbnRvIGl0c2VsZi4iKQorICAgICAgICBpZiAoaXNpbnN0YW5jZShuZXdfY2hpbGQsIGJhc2VzdHJpbmcpCisgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2UobmV3X2NoaWxkLCBOYXZpZ2FibGVTdHJpbmcpKToKKyAgICAgICAgICAgIG5ld19jaGlsZCA9IE5hdmlnYWJsZVN0cmluZyhuZXdfY2hpbGQpCisKKyAgICAgICAgcG9zaXRpb24gPSBtaW4ocG9zaXRpb24sIGxlbihzZWxmLmNvbnRlbnRzKSkKKyAgICAgICAgaWYgaGFzYXR0cihuZXdfY2hpbGQsICdwYXJlbnQnKSBhbmQgbmV3X2NoaWxkLnBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgV2UncmUgJ2luc2VydGluZycgYW4gZWxlbWVudCB0aGF0J3MgYWxyZWFkeSBvbmUKKyAgICAgICAgICAgICMgb2YgdGhpcyBvYmplY3QncyBjaGlsZHJlbi4KKyAgICAgICAgICAgIGlmIG5ld19jaGlsZC5wYXJlbnQgaXMgc2VsZjoKKyAgICAgICAgICAgICAgICBjdXJyZW50X2luZGV4ID0gc2VsZi5pbmRleChuZXdfY2hpbGQpCisgICAgICAgICAgICAgICAgaWYgY3VycmVudF9pbmRleCA8IHBvc2l0aW9uOgorICAgICAgICAgICAgICAgICAgICAjIFdlJ3JlIG1vdmluZyB0aGlzIGVsZW1lbnQgZnVydGhlciBkb3duIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgICAgICMgb2YgdGhpcyBvYmplY3QncyBjaGlsZHJlbi4gVGhhdCBtZWFucyB0aGF0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBleHRyYWN0IHRoaXMgZWxlbWVudCwgb3VyIHRhcmdldCBpbmRleCB3aWxsCisgICAgICAgICAgICAgICAgICAgICMganVtcCBkb3duIG9uZS4KKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gLT0gMQorICAgICAgICAgICAgbmV3X2NoaWxkLmV4dHJhY3QoKQorCisgICAgICAgIG5ld19jaGlsZC5wYXJlbnQgPSBzZWxmCisgICAgICAgIHByZXZpb3VzX2NoaWxkID0gTm9uZQorICAgICAgICBpZiBwb3NpdGlvbiA9PSAwOgorICAgICAgICAgICAgbmV3X2NoaWxkLnByZXZpb3VzX3NpYmxpbmcgPSBOb25lCisgICAgICAgICAgICBuZXdfY2hpbGQucHJldmlvdXNfZWxlbWVudCA9IHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByZXZpb3VzX2NoaWxkID0gc2VsZi5jb250ZW50c1twb3NpdGlvbiAtIDFdCisgICAgICAgICAgICBuZXdfY2hpbGQucHJldmlvdXNfc2libGluZyA9IHByZXZpb3VzX2NoaWxkCisgICAgICAgICAgICBuZXdfY2hpbGQucHJldmlvdXNfc2libGluZy5uZXh0X3NpYmxpbmcgPSBuZXdfY2hpbGQKKyAgICAgICAgICAgIG5ld19jaGlsZC5wcmV2aW91c19lbGVtZW50ID0gcHJldmlvdXNfY2hpbGQuX2xhc3RfZGVzY2VuZGFudChGYWxzZSkKKyAgICAgICAgaWYgbmV3X2NoaWxkLnByZXZpb3VzX2VsZW1lbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuZXdfY2hpbGQucHJldmlvdXNfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBuZXdfY2hpbGQKKworICAgICAgICBuZXdfY2hpbGRzX2xhc3RfZWxlbWVudCA9IG5ld19jaGlsZC5fbGFzdF9kZXNjZW5kYW50KEZhbHNlKQorCisgICAgICAgIGlmIHBvc2l0aW9uID49IGxlbihzZWxmLmNvbnRlbnRzKToKKyAgICAgICAgICAgIG5ld19jaGlsZC5uZXh0X3NpYmxpbmcgPSBOb25lCisKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYKKyAgICAgICAgICAgIHBhcmVudHNfbmV4dF9zaWJsaW5nID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgcGFyZW50c19uZXh0X3NpYmxpbmcgaXMgTm9uZSBhbmQgcGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHBhcmVudHNfbmV4dF9zaWJsaW5nID0gcGFyZW50Lm5leHRfc2libGluZworICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQKKyAgICAgICAgICAgICAgICBpZiBwYXJlbnRzX25leHRfc2libGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBmb3VuZCB0aGUgZWxlbWVudCB0aGF0IGNvbWVzIG5leHQgaW4gdGhlIGRvY3VtZW50LgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgcGFyZW50c19uZXh0X3NpYmxpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmV3X2NoaWxkc19sYXN0X2VsZW1lbnQubmV4dF9lbGVtZW50ID0gcGFyZW50c19uZXh0X3NpYmxpbmcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGUgbGFzdCBlbGVtZW50IG9mIHRoaXMgdGFnIGlzIHRoZSBsYXN0IGVsZW1lbnQgaW4KKyAgICAgICAgICAgICAgICAjIHRoZSBkb2N1bWVudC4KKyAgICAgICAgICAgICAgICBuZXdfY2hpbGRzX2xhc3RfZWxlbWVudC5uZXh0X2VsZW1lbnQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXh0X2NoaWxkID0gc2VsZi5jb250ZW50c1twb3NpdGlvbl0KKyAgICAgICAgICAgIG5ld19jaGlsZC5uZXh0X3NpYmxpbmcgPSBuZXh0X2NoaWxkCisgICAgICAgICAgICBpZiBuZXdfY2hpbGQubmV4dF9zaWJsaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5ld19jaGlsZC5uZXh0X3NpYmxpbmcucHJldmlvdXNfc2libGluZyA9IG5ld19jaGlsZAorICAgICAgICAgICAgbmV3X2NoaWxkc19sYXN0X2VsZW1lbnQubmV4dF9lbGVtZW50ID0gbmV4dF9jaGlsZAorCisgICAgICAgIGlmIG5ld19jaGlsZHNfbGFzdF9lbGVtZW50Lm5leHRfZWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5ld19jaGlsZHNfbGFzdF9lbGVtZW50Lm5leHRfZWxlbWVudC5wcmV2aW91c19lbGVtZW50ID0gbmV3X2NoaWxkc19sYXN0X2VsZW1lbnQKKyAgICAgICAgc2VsZi5jb250ZW50cy5pbnNlcnQocG9zaXRpb24sIG5ld19jaGlsZCkKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgdGFnKToKKyAgICAgICAgIiIiQXBwZW5kcyB0aGUgZ2l2ZW4gdGFnIHRvIHRoZSBjb250ZW50cyBvZiB0aGlzIHRhZy4iIiIKKyAgICAgICAgc2VsZi5pbnNlcnQobGVuKHNlbGYuY29udGVudHMpLCB0YWcpCisKKyAgICBkZWYgaW5zZXJ0X2JlZm9yZShzZWxmLCBwcmVkZWNlc3Nvcik6CisgICAgICAgICIiIk1ha2VzIHRoZSBnaXZlbiBlbGVtZW50IHRoZSBpbW1lZGlhdGUgcHJlZGVjZXNzb3Igb2YgdGhpcyBvbmUuCisKKyAgICAgICAgVGhlIHR3byBlbGVtZW50cyB3aWxsIGhhdmUgdGhlIHNhbWUgcGFyZW50LCBhbmQgdGhlIGdpdmVuIGVsZW1lbnQKKyAgICAgICAgd2lsbCBiZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhpcyBvbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmIGlzIHByZWRlY2Vzc29yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgYmVmb3JlIGl0c2VsZi4iKQorICAgICAgICBwYXJlbnQgPSBzZWxmLnBhcmVudAorICAgICAgICBpZiBwYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgIkVsZW1lbnQgaGFzIG5vIHBhcmVudCwgc28gJ2JlZm9yZScgaGFzIG5vIG1lYW5pbmcuIikKKyAgICAgICAgIyBFeHRyYWN0IGZpcnN0IHNvIHRoYXQgdGhlIGluZGV4IHdvbid0IGJlIHNjcmV3ZWQgdXAgaWYgdGhleQorICAgICAgICAjIGFyZSBzaWJsaW5ncy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShwcmVkZWNlc3NvciwgUGFnZUVsZW1lbnQpOgorICAgICAgICAgICAgcHJlZGVjZXNzb3IuZXh0cmFjdCgpCisgICAgICAgIGluZGV4ID0gcGFyZW50LmluZGV4KHNlbGYpCisgICAgICAgIHBhcmVudC5pbnNlcnQoaW5kZXgsIHByZWRlY2Vzc29yKQorCisgICAgZGVmIGluc2VydF9hZnRlcihzZWxmLCBzdWNjZXNzb3IpOgorICAgICAgICAiIiJNYWtlcyB0aGUgZ2l2ZW4gZWxlbWVudCB0aGUgaW1tZWRpYXRlIHN1Y2Nlc3NvciBvZiB0aGlzIG9uZS4KKworICAgICAgICBUaGUgdHdvIGVsZW1lbnRzIHdpbGwgaGF2ZSB0aGUgc2FtZSBwYXJlbnQsIGFuZCB0aGUgZ2l2ZW4gZWxlbWVudAorICAgICAgICB3aWxsIGJlIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZiBpcyBzdWNjZXNzb3I6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCBpbnNlcnQgYW4gZWxlbWVudCBhZnRlciBpdHNlbGYuIikKKyAgICAgICAgcGFyZW50ID0gc2VsZi5wYXJlbnQKKyAgICAgICAgaWYgcGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJFbGVtZW50IGhhcyBubyBwYXJlbnQsIHNvICdhZnRlcicgaGFzIG5vIG1lYW5pbmcuIikKKyAgICAgICAgIyBFeHRyYWN0IGZpcnN0IHNvIHRoYXQgdGhlIGluZGV4IHdvbid0IGJlIHNjcmV3ZWQgdXAgaWYgdGhleQorICAgICAgICAjIGFyZSBzaWJsaW5ncy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzdWNjZXNzb3IsIFBhZ2VFbGVtZW50KToKKyAgICAgICAgICAgIHN1Y2Nlc3Nvci5leHRyYWN0KCkKKyAgICAgICAgaW5kZXggPSBwYXJlbnQuaW5kZXgoc2VsZikKKyAgICAgICAgcGFyZW50Lmluc2VydChpbmRleCsxLCBzdWNjZXNzb3IpCisKKyAgICBkZWYgZmluZF9uZXh0KHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHRleHQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaWEgYW5kCisgICAgICAgIGFwcGVhcnMgYWZ0ZXIgdGhpcyBUYWcgaW4gdGhlIGRvY3VtZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9vbmUoc2VsZi5maW5kX2FsbF9uZXh0LCBuYW1lLCBhdHRycywgdGV4dCwgKiprd2FyZ3MpCisgICAgZmluZE5leHQgPSBmaW5kX25leHQgICMgQlMzCisKKyAgICBkZWYgZmluZF9hbGxfbmV4dChzZWxmLCBuYW1lPU5vbmUsIGF0dHJzPXt9LCB0ZXh0PU5vbmUsIGxpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyBhbGwgaXRlbXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gY3JpdGVyaWEgYW5kIGFwcGVhcgorICAgICAgICBhZnRlciB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX2FsbChuYW1lLCBhdHRycywgdGV4dCwgbGltaXQsIHNlbGYubmV4dF9lbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCisgICAgZmluZEFsbE5leHQgPSBmaW5kX2FsbF9uZXh0ICAjIEJTMworCisgICAgZGVmIGZpbmRfbmV4dF9zaWJsaW5nKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHRleHQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBjbG9zZXN0IHNpYmxpbmcgdG8gdGhpcyBUYWcgdGhhdCBtYXRjaGVzIHRoZQorICAgICAgICBnaXZlbiBjcml0ZXJpYSBhbmQgYXBwZWFycyBhZnRlciB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX29uZShzZWxmLmZpbmRfbmV4dF9zaWJsaW5ncywgbmFtZSwgYXR0cnMsIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorICAgIGZpbmROZXh0U2libGluZyA9IGZpbmRfbmV4dF9zaWJsaW5nICAjIEJTMworCisgICAgZGVmIGZpbmRfbmV4dF9zaWJsaW5ncyhzZWxmLCBuYW1lPU5vbmUsIGF0dHJzPXt9LCB0ZXh0PU5vbmUsIGxpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHNpYmxpbmdzIG9mIHRoaXMgVGFnIHRoYXQgbWF0Y2ggdGhlIGdpdmVuCisgICAgICAgIGNyaXRlcmlhIGFuZCBhcHBlYXIgYWZ0ZXIgdGhpcyBUYWcgaW4gdGhlIGRvY3VtZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9hbGwobmFtZSwgYXR0cnMsIHRleHQsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXh0X3NpYmxpbmdzLCAqKmt3YXJncykKKyAgICBmaW5kTmV4dFNpYmxpbmdzID0gZmluZF9uZXh0X3NpYmxpbmdzICAgIyBCUzMKKyAgICBmZXRjaE5leHRTaWJsaW5ncyA9IGZpbmRfbmV4dF9zaWJsaW5ncyAgIyBCUzIKKworICAgIGRlZiBmaW5kX3ByZXZpb3VzKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHRleHQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaWEgYW5kCisgICAgICAgIGFwcGVhcnMgYmVmb3JlIHRoaXMgVGFnIGluIHRoZSBkb2N1bWVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfb25lKAorICAgICAgICAgICAgc2VsZi5maW5kX2FsbF9wcmV2aW91cywgbmFtZSwgYXR0cnMsIHRleHQsICoqa3dhcmdzKQorICAgIGZpbmRQcmV2aW91cyA9IGZpbmRfcHJldmlvdXMgICMgQlMzCisKKyAgICBkZWYgZmluZF9hbGxfcHJldmlvdXMoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgdGV4dD1Ob25lLCBsaW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm5zIGFsbCBpdGVtcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpYSBhbmQgYXBwZWFyCisgICAgICAgIGJlZm9yZSB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX2FsbChuYW1lLCBhdHRycywgdGV4dCwgbGltaXQsIHNlbGYucHJldmlvdXNfZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncykKKyAgICBmaW5kQWxsUHJldmlvdXMgPSBmaW5kX2FsbF9wcmV2aW91cyAgIyBCUzMKKyAgICBmZXRjaFByZXZpb3VzID0gZmluZF9hbGxfcHJldmlvdXMgICAgIyBCUzIKKworICAgIGRlZiBmaW5kX3ByZXZpb3VzX3NpYmxpbmcoc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgdGV4dD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGNsb3Nlc3Qgc2libGluZyB0byB0aGlzIFRhZyB0aGF0IG1hdGNoZXMgdGhlCisgICAgICAgIGdpdmVuIGNyaXRlcmlhIGFuZCBhcHBlYXJzIGJlZm9yZSB0aGlzIFRhZyBpbiB0aGUgZG9jdW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maW5kX29uZShzZWxmLmZpbmRfcHJldmlvdXNfc2libGluZ3MsIG5hbWUsIGF0dHJzLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3YXJncykKKyAgICBmaW5kUHJldmlvdXNTaWJsaW5nID0gZmluZF9wcmV2aW91c19zaWJsaW5nICAjIEJTMworCisgICAgZGVmIGZpbmRfcHJldmlvdXNfc2libGluZ3Moc2VsZiwgbmFtZT1Ob25lLCBhdHRycz17fSwgdGV4dD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc2libGluZ3Mgb2YgdGhpcyBUYWcgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4KKyAgICAgICAgY3JpdGVyaWEgYW5kIGFwcGVhciBiZWZvcmUgdGhpcyBUYWcgaW4gdGhlIGRvY3VtZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9hbGwobmFtZSwgYXR0cnMsIHRleHQsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmV2aW91c19zaWJsaW5ncywgKiprd2FyZ3MpCisgICAgZmluZFByZXZpb3VzU2libGluZ3MgPSBmaW5kX3ByZXZpb3VzX3NpYmxpbmdzICAgIyBCUzMKKyAgICBmZXRjaFByZXZpb3VzU2libGluZ3MgPSBmaW5kX3ByZXZpb3VzX3NpYmxpbmdzICAjIEJTMgorCisgICAgZGVmIGZpbmRfcGFyZW50KHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgY2xvc2VzdCBwYXJlbnQgb2YgdGhpcyBUYWcgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbgorICAgICAgICBjcml0ZXJpYS4iIiIKKyAgICAgICAgIyBOT1RFOiBXZSBjYW4ndCB1c2UgX2ZpbmRfb25lIGJlY2F1c2UgZmluZFBhcmVudHMgdGFrZXMgYSBkaWZmZXJlbnQKKyAgICAgICAgIyBzZXQgb2YgYXJndW1lbnRzLgorICAgICAgICByID0gTm9uZQorICAgICAgICBsID0gc2VsZi5maW5kX3BhcmVudHMobmFtZSwgYXR0cnMsIDEsICoqa3dhcmdzKQorICAgICAgICBpZiBsOgorICAgICAgICAgICAgciA9IGxbMF0KKyAgICAgICAgcmV0dXJuIHIKKyAgICBmaW5kUGFyZW50ID0gZmluZF9wYXJlbnQgICMgQlMzCisKKyAgICBkZWYgZmluZF9wYXJlbnRzKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIGxpbWl0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgcGFyZW50cyBvZiB0aGlzIFRhZyB0aGF0IG1hdGNoIHRoZSBnaXZlbgorICAgICAgICBjcml0ZXJpYS4iIiIKKworICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9hbGwobmFtZSwgYXR0cnMsIE5vbmUsIGxpbWl0LCBzZWxmLnBhcmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorICAgIGZpbmRQYXJlbnRzID0gZmluZF9wYXJlbnRzICAgIyBCUzMKKyAgICBmZXRjaFBhcmVudHMgPSBmaW5kX3BhcmVudHMgICMgQlMyCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmV4dF9lbGVtZW50CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJldmlvdXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByZXZpb3VzX2VsZW1lbnQKKworICAgICNUaGVzZSBtZXRob2RzIGRvIHRoZSByZWFsIGhlYXZ5IGxpZnRpbmcuCisKKyAgICBkZWYgX2ZpbmRfb25lKHNlbGYsIG1ldGhvZCwgbmFtZSwgYXR0cnMsIHRleHQsICoqa3dhcmdzKToKKyAgICAgICAgciA9IE5vbmUKKyAgICAgICAgbCA9IG1ldGhvZChuYW1lLCBhdHRycywgdGV4dCwgMSwgKiprd2FyZ3MpCisgICAgICAgIGlmIGw6CisgICAgICAgICAgICByID0gbFswXQorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIF9maW5kX2FsbChzZWxmLCBuYW1lLCBhdHRycywgdGV4dCwgbGltaXQsIGdlbmVyYXRvciwgKiprd2FyZ3MpOgorICAgICAgICAiSXRlcmF0ZXMgb3ZlciBhIGdlbmVyYXRvciBsb29raW5nIGZvciB0aGluZ3MgdGhhdCBtYXRjaC4iCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBTb3VwU3RyYWluZXIpOgorICAgICAgICAgICAgc3RyYWluZXIgPSBuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHJhaW5lciA9IFNvdXBTdHJhaW5lcihuYW1lLCBhdHRycywgdGV4dCwgKiprd2FyZ3MpCisKKyAgICAgICAgaWYgdGV4dCBpcyBOb25lIGFuZCBub3QgbGltaXQgYW5kIG5vdCBhdHRycyBhbmQgbm90IGt3YXJnczoKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgVHJ1ZSBvciBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBPcHRpbWl6YXRpb24gdG8gZmluZCBhbGwgdGFncy4KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoZWxlbWVudCBmb3IgZWxlbWVudCBpbiBnZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbGVtZW50LCBUYWcpKQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTZXQoc3RyYWluZXIsIHJlc3VsdCkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShuYW1lLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAjIE9wdGltaXphdGlvbiB0byBmaW5kIGFsbCB0YWdzIHdpdGggYSBnaXZlbiBuYW1lLgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IChlbGVtZW50IGZvciBlbGVtZW50IGluIGdlbmVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsZW1lbnQsIFRhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZWxlbWVudC5uYW1lID09IG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFNldChzdHJhaW5lciwgcmVzdWx0KQorICAgICAgICByZXN1bHRzID0gUmVzdWx0U2V0KHN0cmFpbmVyKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGkgPSBuZXh0KGdlbmVyYXRvcikKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgIGZvdW5kID0gc3RyYWluZXIuc2VhcmNoKGkpCisgICAgICAgICAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKGZvdW5kKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW1pdCBhbmQgbGVuKHJlc3VsdHMpID49IGxpbWl0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgICNUaGVzZSBnZW5lcmF0b3JzIGNhbiBiZSB1c2VkIHRvIG5hdmlnYXRlIHN0YXJ0aW5nIGZyb20gYm90aAorICAgICNOYXZpZ2FibGVTdHJpbmdzIGFuZCBUYWdzLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXh0X2VsZW1lbnRzKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5uZXh0X2VsZW1lbnQKKyAgICAgICAgd2hpbGUgaSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHlpZWxkIGkKKyAgICAgICAgICAgIGkgPSBpLm5leHRfZWxlbWVudAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5leHRfc2libGluZ3Moc2VsZik6CisgICAgICAgIGkgPSBzZWxmLm5leHRfc2libGluZworICAgICAgICB3aGlsZSBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgaSA9IGkubmV4dF9zaWJsaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJldmlvdXNfZWxlbWVudHMoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnByZXZpb3VzX2VsZW1lbnQKKyAgICAgICAgd2hpbGUgaSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHlpZWxkIGkKKyAgICAgICAgICAgIGkgPSBpLnByZXZpb3VzX2VsZW1lbnQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcmV2aW91c19zaWJsaW5ncyhzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucHJldmlvdXNfc2libGluZworICAgICAgICB3aGlsZSBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgaSA9IGkucHJldmlvdXNfc2libGluZworCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBhcmVudHMoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnBhcmVudAorICAgICAgICB3aGlsZSBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgaSA9IGkucGFyZW50CisKKyAgICAjIE1ldGhvZHMgZm9yIHN1cHBvcnRpbmcgQ1NTIHNlbGVjdG9ycy4KKworICAgIHRhZ19uYW1lX3JlID0gcmUuY29tcGlsZSgnXlthLXowLTldKyQnKQorCisgICAgIyAvXihcdyspXFsoXHcrKShbPX5cfFxeXCRcKl0/KT0/Ij8oW15cXSJdKikiP1xdJC8KKyAgICAjICAgXC0tLS8gIFwtLS0vXC0tLS0tLS0tLS0tLS0vICAgIFwtLS0tLS0tLworICAgICMgICAgIHwgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAjICAgICB8ICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIFRoZSB2YWx1ZQorICAgICMgICAgIHwgICAgICB8ICAgIH4sfCxeLCQsKiBvciA9CisgICAgIyAgICAgfCAgIEF0dHJpYnV0ZQorICAgICMgICAgVGFnCisgICAgYXR0cmlic2VsZWN0X3JlID0gcmUuY29tcGlsZSgKKyAgICAgICAgcideKD9QPHRhZz5cdyspP1xbKD9QPGF0dHJpYnV0ZT5cdyspKD9QPG9wZXJhdG9yPls9flx8XF5cJFwqXT8pJyArCisgICAgICAgIHInPT8iPyg/UDx2YWx1ZT5bXlxdIl0qKSI/XF0kJworICAgICAgICApCisKKyAgICBkZWYgX2F0dHJfdmFsdWVfYXNfc3RyaW5nKHNlbGYsIHZhbHVlLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJGb3JjZSBhbiBhdHRyaWJ1dGUgdmFsdWUgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKworICAgICAgICBBIG11bHRpLXZhbHVlZCBhdHRyaWJ1dGUgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhCisgICAgICAgIHNwYWNlLXNlcGFyYXRlZCBzdGlybmcuCisgICAgICAgICIiIgorICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0KHZhbHVlLCBkZWZhdWx0KQorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KSBvciBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CisgICAgICAgICAgICB2YWx1ZSA9IiAiLmpvaW4odmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIF90YWdfbmFtZV9tYXRjaGVzX2FuZChzZWxmLCBmdW5jdGlvbiwgdGFnX25hbWUpOgorICAgICAgICBpZiBub3QgdGFnX25hbWU6CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlZiBfbWF0Y2godGFnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFnLm5hbWUgPT0gdGFnX25hbWUgYW5kIGZ1bmN0aW9uKHRhZykKKyAgICAgICAgICAgIHJldHVybiBfbWF0Y2gKKworICAgIGRlZiBfYXR0cmlidXRlX2NoZWNrZXIoc2VsZiwgb3BlcmF0b3IsIGF0dHJpYnV0ZSwgdmFsdWU9JycpOgorICAgICAgICAiIiJDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgQ1NTIHNlbGVjdG9yIG9wZXJhdGlvbi4KKworICAgICAgICBUYWtlcyBhbiBvcGVyYXRvciwgYXR0cmlidXRlIGFuZCBvcHRpb25hbCB2YWx1ZS4gUmV0dXJucyBhCisgICAgICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCByZXR1cm4gVHJ1ZSBmb3IgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGF0CisgICAgICAgIGNvbWJpbmF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgb3BlcmF0b3IgPT0gJz0nOgorICAgICAgICAgICAgIyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYGF0dHJpYnV0ZWAgaXMgZXF1YWwgdG8gYHZhbHVlYAorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBlbDogZWwuX2F0dHJfdmFsdWVfYXNfc3RyaW5nKGF0dHJpYnV0ZSkgPT0gdmFsdWUKKyAgICAgICAgZWxpZiBvcGVyYXRvciA9PSAnfic6CisgICAgICAgICAgICAjIHNwYWNlLXNlcGFyYXRlZCBsaXN0IHJlcHJlc2VudGF0aW9uIG9mIGBhdHRyaWJ1dGVgCisgICAgICAgICAgICAjIGNvbnRhaW5zIGB2YWx1ZWAKKyAgICAgICAgICAgIGRlZiBfaW5jbHVkZXNfdmFsdWUoZWxlbWVudCk6CisgICAgICAgICAgICAgICAgYXR0cmlidXRlX3ZhbHVlID0gZWxlbWVudC5nZXQoYXR0cmlidXRlLCBbXSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhdHRyaWJ1dGVfdmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWUgPSBhdHRyaWJ1dGVfdmFsdWUuc3BsaXQoKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbiBhdHRyaWJ1dGVfdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBfaW5jbHVkZXNfdmFsdWUKKyAgICAgICAgZWxpZiBvcGVyYXRvciA9PSAnXic6CisgICAgICAgICAgICAjIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBgYXR0cmlidXRlYCBzdGFydHMgd2l0aCBgdmFsdWVgCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGVsOiBlbC5fYXR0cl92YWx1ZV9hc19zdHJpbmcoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlLCAnJykuc3RhcnRzd2l0aCh2YWx1ZSkKKyAgICAgICAgZWxpZiBvcGVyYXRvciA9PSAnJCc6CisgICAgICAgICAgICAjIHN0cmluZyByZXByZXNlbmF0aW9uIG9mIGBhdHRyaWJ1dGVgIGVuZHMgd2l0aCBgdmFsdWVgCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGVsOiBlbC5fYXR0cl92YWx1ZV9hc19zdHJpbmcoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlLCAnJykuZW5kc3dpdGgodmFsdWUpCisgICAgICAgIGVsaWYgb3BlcmF0b3IgPT0gJyonOgorICAgICAgICAgICAgIyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYGF0dHJpYnV0ZWAgY29udGFpbnMgYHZhbHVlYAorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBlbDogdmFsdWUgaW4gZWwuX2F0dHJfdmFsdWVfYXNfc3RyaW5nKGF0dHJpYnV0ZSwgJycpCisgICAgICAgIGVsaWYgb3BlcmF0b3IgPT0gJ3wnOgorICAgICAgICAgICAgIyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYGF0dHJpYnV0ZWAgaXMgZWl0aGVyIGV4YWN0bHkKKyAgICAgICAgICAgICMgYHZhbHVlYCBvciBzdGFydHMgd2l0aCBgdmFsdWVgIGFuZCB0aGVuIGEgZGFzaC4KKyAgICAgICAgICAgIGRlZiBfaXNfb3Jfc3RhcnRzX3dpdGhfZGFzaChlbGVtZW50KToKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfdmFsdWUgPSBlbGVtZW50Ll9hdHRyX3ZhbHVlX2FzX3N0cmluZyhhdHRyaWJ1dGUsICcnKQorICAgICAgICAgICAgICAgIHJldHVybiAoYXR0cmlidXRlX3ZhbHVlID09IHZhbHVlIG9yIGF0dHJpYnV0ZV92YWx1ZS5zdGFydHN3aXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAnLScpKQorICAgICAgICAgICAgcmV0dXJuIF9pc19vcl9zdGFydHNfd2l0aF9kYXNoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGVsOiBlbC5oYXNfYXR0cihhdHRyaWJ1dGUpCisKKyAgICAjIE9sZCBub24tcHJvcGVydHkgdmVyc2lvbnMgb2YgdGhlIGdlbmVyYXRvcnMsIGZvciBiYWNrd2FyZHMKKyAgICAjIGNvbXBhdGliaWxpdHkgd2l0aCBCUzMuCisgICAgZGVmIG5leHRHZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5leHRfZWxlbWVudHMKKworICAgIGRlZiBuZXh0U2libGluZ0dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmV4dF9zaWJsaW5ncworCisgICAgZGVmIHByZXZpb3VzR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wcmV2aW91c19lbGVtZW50cworCisgICAgZGVmIHByZXZpb3VzU2libGluZ0dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJldmlvdXNfc2libGluZ3MKKworICAgIGRlZiBwYXJlbnRHZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhcmVudHMKKworCitjbGFzcyBOYXZpZ2FibGVTdHJpbmcodW5pY29kZSwgUGFnZUVsZW1lbnQpOgorCisgICAgUFJFRklYID0gJycKKyAgICBTVUZGSVggPSAnJworCisgICAgZGVmIF9fbmV3X18oY2xzLCB2YWx1ZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBOYXZpZ2FibGVTdHJpbmcuCisKKyAgICAgICAgV2hlbiB1bnBpY2tsaW5nIGEgTmF2aWdhYmxlU3RyaW5nLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgc3RyaW5nIGluIERFRkFVTFRfT1VUUFVUX0VOQ09ESU5HLiBUaGF0IGVuY29kaW5nIG5lZWRzIHRvIGJlCisgICAgICAgIHBhc3NlZCBpbiB0byB0aGUgc3VwZXJjbGFzcydzIF9fbmV3X18gb3IgdGhlIHN1cGVyY2xhc3Mgd29uJ3Qga25vdworICAgICAgICBob3cgdG8gaGFuZGxlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdW5pY29kZSk6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZS5fX25ld19fKGNscywgdmFsdWUpCisgICAgICAgIHJldHVybiB1bmljb2RlLl9fbmV3X18oY2xzLCB2YWx1ZSwgREVGQVVMVF9PVVRQVVRfRU5DT0RJTkcpCisKKyAgICBkZWYgX19jb3B5X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgIHJldHVybiAodW5pY29kZShzZWxmKSwpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICIiInRleHQuc3RyaW5nIGdpdmVzIHlvdSB0ZXh0LiBUaGlzIGlzIGZvciBiYWNrd2FyZHMKKyAgICAgICAgY29tcGF0aWJpbGl0eSBmb3IgTmF2aWdhYmxlKlN0cmluZywgYnV0IGZvciBDRGF0YSogaXQgbGV0cyB5b3UKKyAgICAgICAgZ2V0IHRoZSBzdHJpbmcgd2l0aG91dCB0aGUgQ0RhdGEgd3JhcHBlci4iIiIKKyAgICAgICAgaWYgYXR0ciA9PSAnc3RyaW5nJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigKKyAgICAgICAgICAgICAgICAiJyVzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJXMnIiAlICgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGF0dHIpKQorCisgICAgZGVmIG91dHB1dF9yZWFkeShzZWxmLCBmb3JtYXR0ZXI9Im1pbmltYWwiKToKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5mb3JtYXRfc3RyaW5nKHNlbGYsIGZvcm1hdHRlcikKKyAgICAgICAgcmV0dXJuIHNlbGYuUFJFRklYICsgb3V0cHV0ICsgc2VsZi5TVUZGSVgKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQG5hbWUuc2V0dGVyCisgICAgZGVmIG5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJBIE5hdmlnYWJsZVN0cmluZyBjYW5ub3QgYmUgZ2l2ZW4gYSBuYW1lLiIpCisKK2NsYXNzIFByZWZvcm1hdHRlZFN0cmluZyhOYXZpZ2FibGVTdHJpbmcpOgorICAgICIiIkEgTmF2aWdhYmxlU3RyaW5nIG5vdCBzdWJqZWN0IHRvIHRoZSBub3JtYWwgZm9ybWF0dGluZyBydWxlcy4KKworICAgIFRoZSBzdHJpbmcgd2lsbCBiZSBwYXNzZWQgaW50byB0aGUgZm9ybWF0dGVyICh0byB0cmlnZ2VyIHNpZGUgZWZmZWN0cyksCisgICAgYnV0IHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgorICAgICIiIgorCisgICAgZGVmIG91dHB1dF9yZWFkeShzZWxmLCBmb3JtYXR0ZXI9Im1pbmltYWwiKToKKyAgICAgICAgIiIiQ0RhdGEgc3RyaW5ncyBhcmUgcGFzc2VkIGludG8gdGhlIGZvcm1hdHRlci4KKyAgICAgICAgQnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4iIiIKKyAgICAgICAgc2VsZi5mb3JtYXRfc3RyaW5nKHNlbGYsIGZvcm1hdHRlcikKKyAgICAgICAgcmV0dXJuIHNlbGYuUFJFRklYICsgc2VsZiArIHNlbGYuU1VGRklYCisKK2NsYXNzIENEYXRhKFByZWZvcm1hdHRlZFN0cmluZyk6CisKKyAgICBQUkVGSVggPSB1JzwhW0NEQVRBWycKKyAgICBTVUZGSVggPSB1J11dPicKKworY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uKFByZWZvcm1hdHRlZFN0cmluZyk6CisKKyAgICBQUkVGSVggPSB1Jzw/JworICAgIFNVRkZJWCA9IHUnPz4nCisKK2NsYXNzIENvbW1lbnQoUHJlZm9ybWF0dGVkU3RyaW5nKToKKworICAgIFBSRUZJWCA9IHUnPCEtLScKKyAgICBTVUZGSVggPSB1Jy0tPicKKworCitjbGFzcyBEZWNsYXJhdGlvbihQcmVmb3JtYXR0ZWRTdHJpbmcpOgorICAgIFBSRUZJWCA9IHUnPCEnCisgICAgU1VGRklYID0gdSchPicKKworCitjbGFzcyBEb2N0eXBlKFByZWZvcm1hdHRlZFN0cmluZyk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZm9yX25hbWVfYW5kX2lkcyhjbHMsIG5hbWUsIHB1Yl9pZCwgc3lzdGVtX2lkKToKKyAgICAgICAgdmFsdWUgPSBuYW1lIG9yICcnCisgICAgICAgIGlmIHB1Yl9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlICs9ICcgUFVCTElDICIlcyInICUgcHViX2lkCisgICAgICAgICAgICBpZiBzeXN0ZW1faWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgKz0gJyAiJXMiJyAlIHN5c3RlbV9pZAorICAgICAgICBlbGlmIHN5c3RlbV9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlICs9ICcgU1lTVEVNICIlcyInICUgc3lzdGVtX2lkCisKKyAgICAgICAgcmV0dXJuIERvY3R5cGUodmFsdWUpCisKKyAgICBQUkVGSVggPSB1JzwhRE9DVFlQRSAnCisgICAgU1VGRklYID0gdSc+XG4nCisKKworY2xhc3MgVGFnKFBhZ2VFbGVtZW50KToKKworICAgICIiIlJlcHJlc2VudHMgYSBmb3VuZCBIVE1MIHRhZyB3aXRoIGl0cyBhdHRyaWJ1dGVzIGFuZCBjb250ZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXI9Tm9uZSwgYnVpbGRlcj1Ob25lLCBuYW1lPU5vbmUsIG5hbWVzcGFjZT1Ob25lLAorICAgICAgICAgICAgICAgICBwcmVmaXg9Tm9uZSwgYXR0cnM9Tm9uZSwgcGFyZW50PU5vbmUsIHByZXZpb3VzPU5vbmUpOgorICAgICAgICAiQmFzaWMgY29uc3RydWN0b3IuIgorCisgICAgICAgIGlmIHBhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJzZXJfY2xhc3MgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGRvbid0IGFjdHVhbGx5IHN0b3JlIHRoZSBwYXJzZXIgb2JqZWN0OiB0aGF0IGxldHMgZXh0cmFjdGVkCisgICAgICAgICAgICAjIGNodW5rcyBiZSBnYXJiYWdlLWNvbGxlY3RlZC4KKyAgICAgICAgICAgIHNlbGYucGFyc2VyX2NsYXNzID0gcGFyc2VyLl9fY2xhc3NfXworICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyB2YWx1ZSBwcm92aWRlZCBmb3IgbmV3IHRhZydzIG5hbWUuIikKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLm5hbWVzcGFjZSA9IG5hbWVzcGFjZQorICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAorICAgICAgICBpZiBhdHRycyBpcyBOb25lOgorICAgICAgICAgICAgYXR0cnMgPSB7fQorICAgICAgICBlbGlmIGF0dHJzIGFuZCBidWlsZGVyLmNkYXRhX2xpc3RfYXR0cmlidXRlczoKKyAgICAgICAgICAgIGF0dHJzID0gYnVpbGRlci5fcmVwbGFjZV9jZGF0YV9saXN0X2F0dHJpYnV0ZV92YWx1ZXMoCisgICAgICAgICAgICAgICAgc2VsZi5uYW1lLCBhdHRycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGF0dHJzID0gZGljdChhdHRycykKKyAgICAgICAgc2VsZi5hdHRycyA9IGF0dHJzCisgICAgICAgIHNlbGYuY29udGVudHMgPSBbXQorICAgICAgICBzZWxmLnNldHVwKHBhcmVudCwgcHJldmlvdXMpCisgICAgICAgIHNlbGYuaGlkZGVuID0gRmFsc2UKKworICAgICAgICAjIFNldCB1cCBhbnkgc3Vic3RpdHV0aW9ucywgc3VjaCBhcyB0aGUgY2hhcnNldCBpbiBhIE1FVEEgdGFnLgorICAgICAgICBpZiBidWlsZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVpbGRlci5zZXRfdXBfc3Vic3RpdHV0aW9ucyhzZWxmKQorICAgICAgICAgICAgc2VsZi5jYW5fYmVfZW1wdHlfZWxlbWVudCA9IGJ1aWxkZXIuY2FuX2JlX2VtcHR5X2VsZW1lbnQobmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2FuX2JlX2VtcHR5X2VsZW1lbnQgPSBGYWxzZQorCisgICAgcGFyc2VyQ2xhc3MgPSBfYWxpYXMoInBhcnNlcl9jbGFzcyIpICAjIEJTMworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGlzX2VtcHR5X2VsZW1lbnQoc2VsZik6CisgICAgICAgICIiIklzIHRoaXMgdGFnIGFuIGVtcHR5LWVsZW1lbnQgdGFnPyAoYWthIGEgc2VsZi1jbG9zaW5nIHRhZykKKworICAgICAgICBBIHRhZyB0aGF0IGhhcyBjb250ZW50cyBpcyBuZXZlciBhbiBlbXB0eS1lbGVtZW50IHRhZy4KKworICAgICAgICBBIHRhZyB0aGF0IGhhcyBubyBjb250ZW50cyBtYXkgb3IgbWF5IG5vdCBiZSBhbiBlbXB0eS1lbGVtZW50CisgICAgICAgIHRhZy4gSXQgZGVwZW5kcyBvbiB0aGUgYnVpbGRlciB1c2VkIHRvIGNyZWF0ZSB0aGUgdGFnLiBJZiB0aGUKKyAgICAgICAgYnVpbGRlciBoYXMgYSBkZXNpZ25hdGVkIGxpc3Qgb2YgZW1wdHktZWxlbWVudCB0YWdzLCB0aGVuIG9ubHkKKyAgICAgICAgYSB0YWcgd2hvc2UgbmFtZSBzaG93cyB1cCBpbiB0aGF0IGxpc3QgaXMgY29uc2lkZXJlZCBhbgorICAgICAgICBlbXB0eS1lbGVtZW50IHRhZy4KKworICAgICAgICBJZiB0aGUgYnVpbGRlciBoYXMgbm8gZGVzaWduYXRlZCBsaXN0IG9mIGVtcHR5LWVsZW1lbnQgdGFncywKKyAgICAgICAgdGhlbiBhbnkgdGFnIHdpdGggbm8gY29udGVudHMgaXMgYW4gZW1wdHktZWxlbWVudCB0YWcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuY29udGVudHMpID09IDAgYW5kIHNlbGYuY2FuX2JlX2VtcHR5X2VsZW1lbnQKKyAgICBpc1NlbGZDbG9zaW5nID0gaXNfZW1wdHlfZWxlbWVudCAgIyBCUzMKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmcoc2VsZik6CisgICAgICAgICIiIkNvbnZlbmllbmNlIHByb3BlcnR5IHRvIGdldCB0aGUgc2luZ2xlIHN0cmluZyB3aXRoaW4gdGhpcyB0YWcuCisKKyAgICAgICAgOlJldHVybjogSWYgdGhpcyB0YWcgaGFzIGEgc2luZ2xlIHN0cmluZyBjaGlsZCwgcmV0dXJuIHZhbHVlCisgICAgICAgICBpcyB0aGF0IHN0cmluZy4gSWYgdGhpcyB0YWcgaGFzIG5vIGNoaWxkcmVuLCBvciBtb3JlIHRoYW4gb25lCisgICAgICAgICBjaGlsZCwgcmV0dXJuIHZhbHVlIGlzIE5vbmUuIElmIHRoaXMgdGFnIGhhcyBvbmUgY2hpbGQgdGFnLAorICAgICAgICAgcmV0dXJuIHZhbHVlIGlzIHRoZSAnc3RyaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGNoaWxkIHRhZywKKyAgICAgICAgIHJlY3Vyc2l2ZWx5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKHNlbGYuY29udGVudHMpICE9IDE6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBjaGlsZCA9IHNlbGYuY29udGVudHNbMF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgTmF2aWdhYmxlU3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBjaGlsZAorICAgICAgICByZXR1cm4gY2hpbGQuc3RyaW5nCisKKyAgICBAc3RyaW5nLnNldHRlcgorICAgIGRlZiBzdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5jbGVhcigpCisgICAgICAgIHNlbGYuYXBwZW5kKHN0cmluZy5fX2NsYXNzX18oc3RyaW5nKSkKKworICAgIGRlZiBfYWxsX3N0cmluZ3Moc2VsZiwgc3RyaXA9RmFsc2UsIHR5cGVzPShOYXZpZ2FibGVTdHJpbmcsIENEYXRhKSk6CisgICAgICAgICIiIllpZWxkIGFsbCBzdHJpbmdzIG9mIGNlcnRhaW4gY2xhc3NlcywgcG9zc2libHkgc3RyaXBwaW5nIHRoZW0uCisKKyAgICAgICAgQnkgZGVmYXVsdCwgeWllbGRzIG9ubHkgTmF2aWdhYmxlU3RyaW5nIGFuZCBDRGF0YSBvYmplY3RzLiBTbworICAgICAgICBubyBjb21tZW50cywgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGV0Yy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkZXNjZW5kYW50IGluIHNlbGYuZGVzY2VuZGFudHM6CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgKHR5cGVzIGlzIE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGRlc2NlbmRhbnQsIE5hdmlnYWJsZVN0cmluZykpCisgICAgICAgICAgICAgICAgb3IKKyAgICAgICAgICAgICAgICAodHlwZXMgaXMgbm90IE5vbmUgYW5kIHR5cGUoZGVzY2VuZGFudCkgbm90IGluIHR5cGVzKSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHN0cmlwOgorICAgICAgICAgICAgICAgIGRlc2NlbmRhbnQgPSBkZXNjZW5kYW50LnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oZGVzY2VuZGFudCkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHlpZWxkIGRlc2NlbmRhbnQKKworICAgIHN0cmluZ3MgPSBwcm9wZXJ0eShfYWxsX3N0cmluZ3MpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3RyaXBwZWRfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgZm9yIHN0cmluZyBpbiBzZWxmLl9hbGxfc3RyaW5ncyhUcnVlKToKKyAgICAgICAgICAgIHlpZWxkIHN0cmluZworCisgICAgZGVmIGdldF90ZXh0KHNlbGYsIHNlcGFyYXRvcj11IiIsIHN0cmlwPUZhbHNlLAorICAgICAgICAgICAgICAgICB0eXBlcz0oTmF2aWdhYmxlU3RyaW5nLCBDRGF0YSkpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IGFsbCBjaGlsZCBzdHJpbmdzLCBjb25jYXRlbmF0ZWQgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZXBhcmF0b3Iuam9pbihbcyBmb3IgcyBpbiBzZWxmLl9hbGxfc3RyaW5ncygKKyAgICAgICAgICAgICAgICAgICAgc3RyaXAsIHR5cGVzPXR5cGVzKV0pCisgICAgZ2V0VGV4dCA9IGdldF90ZXh0CisgICAgdGV4dCA9IHByb3BlcnR5KGdldF90ZXh0KQorCisgICAgZGVmIGRlY29tcG9zZShzZWxmKToKKyAgICAgICAgIiIiUmVjdXJzaXZlbHkgZGVzdHJveXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdHJlZS4iIiIKKyAgICAgICAgc2VsZi5leHRyYWN0KCkKKyAgICAgICAgaSA9IHNlbGYKKyAgICAgICAgd2hpbGUgaSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5leHQgPSBpLm5leHRfZWxlbWVudAorICAgICAgICAgICAgaS5fX2RpY3RfXy5jbGVhcigpCisgICAgICAgICAgICBpLmNvbnRlbnRzID0gW10KKyAgICAgICAgICAgIGkgPSBuZXh0CisKKyAgICBkZWYgY2xlYXIoc2VsZiwgZGVjb21wb3NlPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEV4dHJhY3QgYWxsIGNoaWxkcmVuLiBJZiBkZWNvbXBvc2UgaXMgVHJ1ZSwgZGVjb21wb3NlIGluc3RlYWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBkZWNvbXBvc2U6CisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmLmNvbnRlbnRzWzpdOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgVGFnKToKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kZWNvbXBvc2UoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZXh0cmFjdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmLmNvbnRlbnRzWzpdOgorICAgICAgICAgICAgICAgIGVsZW1lbnQuZXh0cmFjdCgpCisKKyAgICBkZWYgaW5kZXgoc2VsZiwgZWxlbWVudCk6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIHRoZSBpbmRleCBvZiBhIGNoaWxkIGJ5IGlkZW50aXR5LCBub3QgdmFsdWUuIEF2b2lkcyBpc3N1ZXMgd2l0aAorICAgICAgICB0YWcuY29udGVudHMuaW5kZXgoZWxlbWVudCkgZ2V0dGluZyB0aGUgaW5kZXggb2YgZXF1YWwgZWxlbWVudHMuCisgICAgICAgICIiIgorICAgICAgICBmb3IgaSwgY2hpbGQgaW4gZW51bWVyYXRlKHNlbGYuY29udGVudHMpOgorICAgICAgICAgICAgaWYgY2hpbGQgaXMgZWxlbWVudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUYWcuaW5kZXg6IGVsZW1lbnQgbm90IGluIHRhZyIpCisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdrZXknIGF0dHJpYnV0ZSBmb3IgdGhlIHRhZywgb3IKKyAgICAgICAgdGhlIHZhbHVlIGdpdmVuIGZvciAnZGVmYXVsdCcgaWYgaXQgZG9lc24ndCBoYXZlIHRoYXQKKyAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdHRycy5nZXQoa2V5LCBkZWZhdWx0KQorCisgICAgZGVmIGhhc19hdHRyKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5hdHRycworCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYpLl9faGFzaF9fKCkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJ0YWdba2V5XSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ2tleScgYXR0cmlidXRlIGZvciB0aGUgdGFnLAorICAgICAgICBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdCdzIG5vdCB0aGVyZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXR0cnNba2V5XQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiSXRlcmF0aW5nIG92ZXIgYSB0YWcgaXRlcmF0ZXMgb3ZlciBpdHMgY29udGVudHMuIgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLmNvbnRlbnRzKQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICJUaGUgbGVuZ3RoIG9mIGEgdGFnIGlzIHRoZSBsZW5ndGggb2YgaXRzIGxpc3Qgb2YgY29udGVudHMuIgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuY29udGVudHMpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHgpOgorICAgICAgICByZXR1cm4geCBpbiBzZWxmLmNvbnRlbnRzCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICJBIHRhZyBpcyBub24tTm9uZSBldmVuIGlmIGl0IGhhcyBubyBjb250ZW50cy4iCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICIiIlNldHRpbmcgdGFnW2tleV0gc2V0cyB0aGUgdmFsdWUgb2YgdGhlICdrZXknIGF0dHJpYnV0ZSBmb3IgdGhlCisgICAgICAgIHRhZy4iIiIKKyAgICAgICAgc2VsZi5hdHRyc1trZXldID0gdmFsdWUKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAiRGVsZXRpbmcgdGFnW2tleV0gZGVsZXRlcyBhbGwgJ2tleScgYXR0cmlidXRlcyBmb3IgdGhlIHRhZy4iCisgICAgICAgIHNlbGYuYXR0cnMucG9wKGtleSwgTm9uZSkKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJDYWxsaW5nIGEgdGFnIGxpa2UgYSBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGl0cworICAgICAgICBmaW5kX2FsbCgpIG1ldGhvZC4gRWcuIHRhZygnYScpIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgQSB0YWdzCisgICAgICAgIGZvdW5kIHdpdGhpbiB0aGlzIHRhZy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9hbGwoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHRhZyk6CisgICAgICAgICNwcmludCAiR2V0YXR0ciAlcy4lcyIgJSAoc2VsZi5fX2NsYXNzX18sIHRhZykKKyAgICAgICAgaWYgbGVuKHRhZykgPiAzIGFuZCB0YWcuZW5kc3dpdGgoJ1RhZycpOgorICAgICAgICAgICAgIyBCUzM6IHNvdXAuYVRhZyAtPiAic291cC5maW5kKCJhIikKKyAgICAgICAgICAgIHRhZ19uYW1lID0gdGFnWzotM10KKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJy4lc1RhZyBpcyBkZXByZWNhdGVkLCB1c2UgLmZpbmQoIiVzIikgaW5zdGVhZC4nICUgKAorICAgICAgICAgICAgICAgICAgICB0YWdfbmFtZSwgdGFnX25hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZCh0YWdfbmFtZSkKKyAgICAgICAgIyBXZSBzcGVjaWFsIGNhc2UgY29udGVudHMgdG8gYXZvaWQgcmVjdXJzaW9uLgorICAgICAgICBlbGlmIG5vdCB0YWcuc3RhcnRzd2l0aCgiX18iKSBhbmQgbm90IHRhZz09ImNvbnRlbnRzIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbmQodGFnKQorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigKKyAgICAgICAgICAgICInJXMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclcyciICUgKHNlbGYuX19jbGFzc19fLCB0YWcpKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZmYgdGhpcyB0YWcgaGFzIHRoZSBzYW1lIG5hbWUsIHRoZSBzYW1lIGF0dHJpYnV0ZXMsCisgICAgICAgIGFuZCB0aGUgc2FtZSBjb250ZW50cyAocmVjdXJzaXZlbHkpIGFzIHRoZSBnaXZlbiB0YWcuIiIiCisgICAgICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiAobm90IGhhc2F0dHIob3RoZXIsICduYW1lJykgb3IKKyAgICAgICAgICAgIG5vdCBoYXNhdHRyKG90aGVyLCAnYXR0cnMnKSBvcgorICAgICAgICAgICAgbm90IGhhc2F0dHIob3RoZXIsICdjb250ZW50cycpIG9yCisgICAgICAgICAgICBzZWxmLm5hbWUgIT0gb3RoZXIubmFtZSBvcgorICAgICAgICAgICAgc2VsZi5hdHRycyAhPSBvdGhlci5hdHRycyBvcgorICAgICAgICAgICAgbGVuKHNlbGYpICE9IGxlbihvdGhlcikpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBpLCBteV9jaGlsZCBpbiBlbnVtZXJhdGUoc2VsZi5jb250ZW50cyk6CisgICAgICAgICAgICBpZiBteV9jaGlsZCAhPSBvdGhlci5jb250ZW50c1tpXToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGFnIGlzIG5vdCBpZGVudGljYWwgdG8gdGhlIG90aGVyIHRhZywKKyAgICAgICAgYXMgZGVmaW5lZCBpbiBfX2VxX18uIiIiCisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYsIGVuY29kaW5nPURFRkFVTFRfT1VUUFVUX0VOQ09ESU5HKToKKyAgICAgICAgIiIiUmVuZGVycyB0aGlzIHRhZyBhcyBhIHN0cmluZy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlKGVuY29kaW5nKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUoKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVuY29kZSgpCisKKyAgICBpZiBQWTNLOgorICAgICAgICBfX3N0cl9fID0gX19yZXByX18gPSBfX3VuaWNvZGVfXworCisgICAgZGVmIGVuY29kZShzZWxmLCBlbmNvZGluZz1ERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICAgICAgICAgICAgIGluZGVudF9sZXZlbD1Ob25lLCBmb3JtYXR0ZXI9Im1pbmltYWwiLAorICAgICAgICAgICAgICAgZXJyb3JzPSJ4bWxjaGFycmVmcmVwbGFjZSIpOgorICAgICAgICAjIFR1cm4gdGhlIGRhdGEgc3RydWN0dXJlIGludG8gVW5pY29kZSwgdGhlbiBlbmNvZGUgdGhlCisgICAgICAgICMgVW5pY29kZS4KKyAgICAgICAgdSA9IHNlbGYuZGVjb2RlKGluZGVudF9sZXZlbCwgZW5jb2RpbmcsIGZvcm1hdHRlcikKKyAgICAgICAgcmV0dXJuIHUuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICBkZWYgX3Nob3VsZF9wcmV0dHlfcHJpbnQoc2VsZiwgaW5kZW50X2xldmVsKToKKyAgICAgICAgIiIiU2hvdWxkIHRoaXMgdGFnIGJlIHByZXR0eS1wcmludGVkPyIiIgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgaW5kZW50X2xldmVsIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgKHNlbGYubmFtZSBub3QgaW4gSFRNTEF3YXJlRW50aXR5U3Vic3RpdHV0aW9uLnByZWZvcm1hdHRlZF90YWdzCisgICAgICAgICAgICAgb3Igc2VsZi5faXNfeG1sKSkKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5kZW50X2xldmVsPU5vbmUsCisgICAgICAgICAgICAgICBldmVudHVhbF9lbmNvZGluZz1ERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICAgICAgICAgICAgIGZvcm1hdHRlcj0ibWluaW1hbCIpOgorICAgICAgICAiIiJSZXR1cm5zIGEgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRhZyBhbmQgaXRzIGNvbnRlbnRzLgorCisgICAgICAgIDpwYXJhbSBldmVudHVhbF9lbmNvZGluZzogVGhlIHRhZyBpcyBkZXN0aW5lZCB0byBiZQorICAgICAgICAgICBlbmNvZGVkIGludG8gdGhpcyBlbmNvZGluZy4gVGhpcyBtZXRob2QgaXMgX25vdF8KKyAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgdGhhdCBlbmNvZGluZy4gVGhpcyBpbmZvcm1hdGlvbgorICAgICAgICAgICBpcyBwYXNzZWQgaW4gc28gdGhhdCBpdCBjYW4gYmUgc3Vic3RpdHV0ZWQgaW4gaWYgdGhlCisgICAgICAgICAgIGRvY3VtZW50IGNvbnRhaW5zIGEgPE1FVEE+IHRhZyB0aGF0IG1lbnRpb25zIHRoZSBkb2N1bWVudCdzCisgICAgICAgICAgIGVuY29kaW5nLgorICAgICAgICAiIiIKKworICAgICAgICAjIEZpcnN0IG9mZiwgdHVybiBhIHN0cmluZyBmb3JtYXR0ZXIgaW50byBhIGZ1bmN0aW9uLiBUaGlzCisgICAgICAgICMgd2lsbCBzdG9wIHRoZSBsb29rdXAgZnJvbSBoYXBwZW5pbmcgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKGZvcm1hdHRlcik6CisgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9mb3JtYXR0ZXJfZm9yX25hbWUoZm9ybWF0dGVyKQorCisgICAgICAgIGF0dHJzID0gW10KKyAgICAgICAgaWYgc2VsZi5hdHRyczoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzb3J0ZWQoc2VsZi5hdHRycy5pdGVtcygpKToKKyAgICAgICAgICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCA9IGtleQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KSBvciBpc2luc3RhbmNlKHZhbCwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gJyAnLmpvaW4odmFsKQorICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB1bmljb2RlKHZhbCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbCwgQXR0cmlidXRlVmFsdWVXaXRoQ2hhcnNldFN1YnN0aXR1dGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBldmVudHVhbF9lbmNvZGluZyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwuZW5jb2RlKGV2ZW50dWFsX2VuY29kaW5nKQorCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmZvcm1hdF9zdHJpbmcodmFsLCBmb3JtYXR0ZXIpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlKGtleSkgKyAnPScKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRW50aXR5U3Vic3RpdHV0aW9uLnF1b3RlZF9hdHRyaWJ1dGVfdmFsdWUodGV4dCkpCisgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKGRlY29kZWQpCisgICAgICAgIGNsb3NlID0gJycKKyAgICAgICAgY2xvc2VUYWcgPSAnJworCisgICAgICAgIHByZWZpeCA9ICcnCisgICAgICAgIGlmIHNlbGYucHJlZml4OgorICAgICAgICAgICAgcHJlZml4ID0gc2VsZi5wcmVmaXggKyAiOiIKKworICAgICAgICBpZiBzZWxmLmlzX2VtcHR5X2VsZW1lbnQ6CisgICAgICAgICAgICBjbG9zZSA9ICcvJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xvc2VUYWcgPSAnPC8lcyVzPicgJSAocHJlZml4LCBzZWxmLm5hbWUpCisKKyAgICAgICAgcHJldHR5X3ByaW50ID0gc2VsZi5fc2hvdWxkX3ByZXR0eV9wcmludChpbmRlbnRfbGV2ZWwpCisgICAgICAgIHNwYWNlID0gJycKKyAgICAgICAgaW5kZW50X3NwYWNlID0gJycKKyAgICAgICAgaWYgaW5kZW50X2xldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW5kZW50X3NwYWNlID0gKCcgJyAqIChpbmRlbnRfbGV2ZWwgLSAxKSkKKyAgICAgICAgaWYgcHJldHR5X3ByaW50OgorICAgICAgICAgICAgc3BhY2UgPSBpbmRlbnRfc3BhY2UKKyAgICAgICAgICAgIGluZGVudF9jb250ZW50cyA9IGluZGVudF9sZXZlbCArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZGVudF9jb250ZW50cyA9IE5vbmUKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmRlY29kZV9jb250ZW50cygKKyAgICAgICAgICAgIGluZGVudF9jb250ZW50cywgZXZlbnR1YWxfZW5jb2RpbmcsIGZvcm1hdHRlcikKKworICAgICAgICBpZiBzZWxmLmhpZGRlbjoKKyAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgJ2RvY3VtZW50IHJvb3QnIG9iamVjdC4KKyAgICAgICAgICAgIHMgPSBjb250ZW50cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IFtdCisgICAgICAgICAgICBhdHRyaWJ1dGVfc3RyaW5nID0gJycKKyAgICAgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9zdHJpbmcgPSAnICcgKyAnICcuam9pbihhdHRycykKKyAgICAgICAgICAgIGlmIGluZGVudF9sZXZlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIEV2ZW4gaWYgdGhpcyBwYXJ0aWN1bGFyIHRhZyBpcyBub3QgcHJldHR5LXByaW50ZWQsCisgICAgICAgICAgICAgICAgIyB3ZSBzaG91bGQgaW5kZW50IHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgdGFnLgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKGluZGVudF9zcGFjZSkKKyAgICAgICAgICAgIHMuYXBwZW5kKCc8JXMlcyVzJXM+JyAlICgKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBzZWxmLm5hbWUsIGF0dHJpYnV0ZV9zdHJpbmcsIGNsb3NlKSkKKyAgICAgICAgICAgIGlmIHByZXR0eV9wcmludDoKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCgiXG4iKQorICAgICAgICAgICAgcy5hcHBlbmQoY29udGVudHMpCisgICAgICAgICAgICBpZiBwcmV0dHlfcHJpbnQgYW5kIGNvbnRlbnRzIGFuZCBjb250ZW50c1stMV0gIT0gIlxuIjoKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCgiXG4iKQorICAgICAgICAgICAgaWYgcHJldHR5X3ByaW50IGFuZCBjbG9zZVRhZzoKKyAgICAgICAgICAgICAgICBzLmFwcGVuZChzcGFjZSkKKyAgICAgICAgICAgIHMuYXBwZW5kKGNsb3NlVGFnKQorICAgICAgICAgICAgaWYgaW5kZW50X2xldmVsIGlzIG5vdCBOb25lIGFuZCBjbG9zZVRhZyBhbmQgc2VsZi5uZXh0X3NpYmxpbmc6CisgICAgICAgICAgICAgICAgIyBFdmVuIGlmIHRoaXMgcGFydGljdWxhciB0YWcgaXMgbm90IHByZXR0eS1wcmludGVkLAorICAgICAgICAgICAgICAgICMgd2UncmUgbm93IGRvbmUgd2l0aCB0aGUgdGFnLCBhbmQgd2Ugc2hvdWxkIGFkZCBhCisgICAgICAgICAgICAgICAgIyBuZXdsaW5lIGlmIGFwcHJvcHJpYXRlLgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJcbiIpCisgICAgICAgICAgICBzID0gJycuam9pbihzKQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIHByZXR0aWZ5KHNlbGYsIGVuY29kaW5nPU5vbmUsIGZvcm1hdHRlcj0ibWluaW1hbCIpOgorICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb2RlKFRydWUsIGZvcm1hdHRlcj1mb3JtYXR0ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGUoZW5jb2RpbmcsIFRydWUsIGZvcm1hdHRlcj1mb3JtYXR0ZXIpCisKKyAgICBkZWYgZGVjb2RlX2NvbnRlbnRzKHNlbGYsIGluZGVudF9sZXZlbD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICBldmVudHVhbF9lbmNvZGluZz1ERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyPSJtaW5pbWFsIik6CisgICAgICAgICIiIlJlbmRlcnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFnIGFzIGEgVW5pY29kZSBzdHJpbmcuCisKKyAgICAgICAgOnBhcmFtIGV2ZW50dWFsX2VuY29kaW5nOiBUaGUgdGFnIGlzIGRlc3RpbmVkIHRvIGJlCisgICAgICAgICAgIGVuY29kZWQgaW50byB0aGlzIGVuY29kaW5nLiBUaGlzIG1ldGhvZCBpcyBfbm90XworICAgICAgICAgICByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyB0aGF0IGVuY29kaW5nLiBUaGlzIGluZm9ybWF0aW9uCisgICAgICAgICAgIGlzIHBhc3NlZCBpbiBzbyB0aGF0IGl0IGNhbiBiZSBzdWJzdGl0dXRlZCBpbiBpZiB0aGUKKyAgICAgICAgICAgZG9jdW1lbnQgY29udGFpbnMgYSA8TUVUQT4gdGFnIHRoYXQgbWVudGlvbnMgdGhlIGRvY3VtZW50J3MKKyAgICAgICAgICAgZW5jb2RpbmcuCisgICAgICAgICIiIgorICAgICAgICAjIEZpcnN0IG9mZiwgdHVybiBhIHN0cmluZyBmb3JtYXR0ZXIgaW50byBhIGZ1bmN0aW9uLiBUaGlzCisgICAgICAgICMgd2lsbCBzdG9wIHRoZSBsb29rdXAgZnJvbSBoYXBwZW5pbmcgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKGZvcm1hdHRlcik6CisgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9mb3JtYXR0ZXJfZm9yX25hbWUoZm9ybWF0dGVyKQorCisgICAgICAgIHByZXR0eV9wcmludCA9IChpbmRlbnRfbGV2ZWwgaXMgbm90IE5vbmUpCisgICAgICAgIHMgPSBbXQorICAgICAgICBmb3IgYyBpbiBzZWxmOgorICAgICAgICAgICAgdGV4dCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYywgTmF2aWdhYmxlU3RyaW5nKToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gYy5vdXRwdXRfcmVhZHkoZm9ybWF0dGVyKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGMsIFRhZyk6CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoYy5kZWNvZGUoaW5kZW50X2xldmVsLCBldmVudHVhbF9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXIpKQorICAgICAgICAgICAgaWYgdGV4dCBhbmQgaW5kZW50X2xldmVsIGFuZCBub3Qgc2VsZi5uYW1lID09ICdwcmUnOgorICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHRleHQ6CisgICAgICAgICAgICAgICAgaWYgcHJldHR5X3ByaW50IGFuZCBub3Qgc2VsZi5uYW1lID09ICdwcmUnOgorICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZCgiICIgKiAoaW5kZW50X2xldmVsIC0gMSkpCisgICAgICAgICAgICAgICAgcy5hcHBlbmQodGV4dCkKKyAgICAgICAgICAgICAgICBpZiBwcmV0dHlfcHJpbnQgYW5kIG5vdCBzZWxmLm5hbWUgPT0gJ3ByZSc6CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKCJcbiIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHMpCisKKyAgICBkZWYgZW5jb2RlX2NvbnRlbnRzKAorICAgICAgICBzZWxmLCBpbmRlbnRfbGV2ZWw9Tm9uZSwgZW5jb2Rpbmc9REVGQVVMVF9PVVRQVVRfRU5DT0RJTkcsCisgICAgICAgIGZvcm1hdHRlcj0ibWluaW1hbCIpOgorICAgICAgICAiIiJSZW5kZXJzIHRoZSBjb250ZW50cyBvZiB0aGlzIHRhZyBhcyBhIGJ5dGVzdHJpbmcuIiIiCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5kZWNvZGVfY29udGVudHMoaW5kZW50X2xldmVsLCBlbmNvZGluZywgZm9ybWF0dGVyKQorICAgICAgICByZXR1cm4gY29udGVudHMuZW5jb2RlKGVuY29kaW5nKQorCisgICAgIyBPbGQgbWV0aG9kIGZvciBCUzMgY29tcGF0aWJpbGl0eQorICAgIGRlZiByZW5kZXJDb250ZW50cyhzZWxmLCBlbmNvZGluZz1ERUZBVUxUX09VVFBVVF9FTkNPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnQ9RmFsc2UsIGluZGVudExldmVsPTApOgorICAgICAgICBpZiBub3QgcHJldHR5UHJpbnQ6CisgICAgICAgICAgICBpbmRlbnRMZXZlbCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlX2NvbnRlbnRzKAorICAgICAgICAgICAgaW5kZW50X2xldmVsPWluZGVudExldmVsLCBlbmNvZGluZz1lbmNvZGluZykKKworICAgICNTb3VwIG1ldGhvZHMKKworICAgIGRlZiBmaW5kKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHJlY3Vyc2l2ZT1UcnVlLCB0ZXh0PU5vbmUsCisgICAgICAgICAgICAgKiprd2FyZ3MpOgorICAgICAgICAiIiJSZXR1cm4gb25seSB0aGUgZmlyc3QgY2hpbGQgb2YgdGhpcyBUYWcgbWF0Y2hpbmcgdGhlIGdpdmVuCisgICAgICAgIGNyaXRlcmlhLiIiIgorICAgICAgICByID0gTm9uZQorICAgICAgICBsID0gc2VsZi5maW5kX2FsbChuYW1lLCBhdHRycywgcmVjdXJzaXZlLCB0ZXh0LCAxLCAqKmt3YXJncykKKyAgICAgICAgaWYgbDoKKyAgICAgICAgICAgIHIgPSBsWzBdCisgICAgICAgIHJldHVybiByCisgICAgZmluZENoaWxkID0gZmluZAorCisgICAgZGVmIGZpbmRfYWxsKHNlbGYsIG5hbWU9Tm9uZSwgYXR0cnM9e30sIHJlY3Vyc2l2ZT1UcnVlLCB0ZXh0PU5vbmUsCisgICAgICAgICAgICAgICAgIGxpbWl0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgIiIiRXh0cmFjdHMgYSBsaXN0IG9mIFRhZyBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuCisgICAgICAgIGNyaXRlcmlhLiAgWW91IGNhbiBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBUYWcgYW5kIGFueQorICAgICAgICBhdHRyaWJ1dGVzIHlvdSB3YW50IHRoZSBUYWcgdG8gaGF2ZS4KKworICAgICAgICBUaGUgdmFsdWUgb2YgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgJ2F0dHJzJyBtYXAgY2FuIGJlIGEKKyAgICAgICAgc3RyaW5nLCBhIGxpc3Qgb2Ygc3RyaW5ncywgYSByZWd1bGFyIGV4cHJlc3Npb24gb2JqZWN0LCBvciBhCisgICAgICAgIGNhbGxhYmxlIHRoYXQgdGFrZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgd2hldGhlciBvciBub3QgdGhlCisgICAgICAgIHN0cmluZyBtYXRjaGVzIGZvciBzb21lIGN1c3RvbSBkZWZpbml0aW9uIG9mICdtYXRjaGVzJy4gVGhlCisgICAgICAgIHNhbWUgaXMgdHJ1ZSBvZiB0aGUgdGFnIG5hbWUuIiIiCisKKyAgICAgICAgZ2VuZXJhdG9yID0gc2VsZi5kZXNjZW5kYW50cworICAgICAgICBpZiBub3QgcmVjdXJzaXZlOgorICAgICAgICAgICAgZ2VuZXJhdG9yID0gc2VsZi5jaGlsZHJlbgorICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9hbGwobmFtZSwgYXR0cnMsIHRleHQsIGxpbWl0LCBnZW5lcmF0b3IsICoqa3dhcmdzKQorICAgIGZpbmRBbGwgPSBmaW5kX2FsbCAgICAgICAjIEJTMworICAgIGZpbmRDaGlsZHJlbiA9IGZpbmRfYWxsICAjIEJTMgorCisgICAgI0dlbmVyYXRvciBtZXRob2RzCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICAjIHJldHVybiBpdGVyKCkgdG8gbWFrZSB0aGUgcHVycG9zZSBvZiB0aGUgbWV0aG9kIGNsZWFyCisgICAgICAgIHJldHVybiBpdGVyKHNlbGYuY29udGVudHMpICAjIFhYWCBUaGlzIHNlZW1zIHRvIGJlIHVudGVzdGVkLgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlc2NlbmRhbnRzKHNlbGYpOgorICAgICAgICBpZiBub3QgbGVuKHNlbGYuY29udGVudHMpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN0b3BOb2RlID0gc2VsZi5fbGFzdF9kZXNjZW5kYW50KCkubmV4dF9lbGVtZW50CisgICAgICAgIGN1cnJlbnQgPSBzZWxmLmNvbnRlbnRzWzBdCisgICAgICAgIHdoaWxlIGN1cnJlbnQgaXMgbm90IHN0b3BOb2RlOgorICAgICAgICAgICAgeWllbGQgY3VycmVudAorICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dF9lbGVtZW50CisKKyAgICAjIENTUyBzZWxlY3RvciBjb2RlCisKKyAgICBfc2VsZWN0b3JfY29tYmluYXRvcnMgPSBbJz4nLCAnKycsICd+J10KKyAgICBfc2VsZWN0X2RlYnVnID0gRmFsc2UKKyAgICBkZWYgc2VsZWN0KHNlbGYsIHNlbGVjdG9yLCBfY2FuZGlkYXRlX2dlbmVyYXRvcj1Ob25lKToKKyAgICAgICAgIiIiUGVyZm9ybSBhIENTUyBzZWxlY3Rpb24gb3BlcmF0aW9uIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuIiIiCisgICAgICAgIHRva2VucyA9IHNlbGVjdG9yLnNwbGl0KCkKKyAgICAgICAgY3VycmVudF9jb250ZXh0ID0gW3NlbGZdCisKKyAgICAgICAgaWYgdG9rZW5zWy0xXSBpbiBzZWxmLl9zZWxlY3Rvcl9jb21iaW5hdG9yczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgJ0ZpbmFsIGNvbWJpbmF0b3IgIiVzIiBpcyBtaXNzaW5nIGFuIGFyZ3VtZW50LicgJSB0b2tlbnNbLTFdKQorICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICBwcmludCAnUnVubmluZyBDU1Mgc2VsZWN0b3IgIiVzIicgJSBzZWxlY3RvcgorICAgICAgICBmb3IgaW5kZXgsIHRva2VuIGluIGVudW1lcmF0ZSh0b2tlbnMpOgorICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgIHByaW50ICcgQ29uc2lkZXJpbmcgdG9rZW4gIiVzIicgJSB0b2tlbgorICAgICAgICAgICAgcmVjdXJzaXZlX2NhbmRpZGF0ZV9nZW5lcmF0b3IgPSBOb25lCisgICAgICAgICAgICB0YWdfbmFtZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIHRva2Vuc1tpbmRleC0xXSBpbiBzZWxmLl9zZWxlY3Rvcl9jb21iaW5hdG9yczoKKyAgICAgICAgICAgICAgICAjIFRoaXMgdG9rZW4gd2FzIGNvbnN1bWVkIGJ5IHRoZSBwcmV2aW91cyBjb21iaW5hdG9yLiBTa2lwIGl0LgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyAgVG9rZW4gd2FzIGNvbnN1bWVkIGJ5IHRoZSBwcmV2aW91cyBjb21iaW5hdG9yLicKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBFYWNoIG9wZXJhdGlvbiBjb3JyZXNwb25kcyB0byBhIGNoZWNrZXIgZnVuY3Rpb24sIGEgcnVsZQorICAgICAgICAgICAgIyBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGNhbmRpZGF0ZSBtYXRjaGVzIHRoZQorICAgICAgICAgICAgIyBzZWxlY3Rvci4gQ2FuZGlkYXRlcyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBhY3RpdmUKKyAgICAgICAgICAgICMgaXRlcmF0b3IuCisgICAgICAgICAgICBjaGVja2VyID0gTm9uZQorCisgICAgICAgICAgICBtID0gc2VsZi5hdHRyaWJzZWxlY3RfcmUubWF0Y2godG9rZW4pCisgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgQXR0cmlidXRlIHNlbGVjdG9yCisgICAgICAgICAgICAgICAgdGFnX25hbWUsIGF0dHJpYnV0ZSwgb3BlcmF0b3IsIHZhbHVlID0gbS5ncm91cHMoKQorICAgICAgICAgICAgICAgIGNoZWNrZXIgPSBzZWxmLl9hdHRyaWJ1dGVfY2hlY2tlcihvcGVyYXRvciwgYXR0cmlidXRlLCB2YWx1ZSkKKworICAgICAgICAgICAgZWxpZiAnIycgaW4gdG9rZW46CisgICAgICAgICAgICAgICAgIyBJRCBzZWxlY3RvcgorICAgICAgICAgICAgICAgIHRhZ19uYW1lLCB0YWdfaWQgPSB0b2tlbi5zcGxpdCgnIycsIDEpCisgICAgICAgICAgICAgICAgZGVmIGlkX21hdGNoZXModGFnKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZy5nZXQoJ2lkJywgTm9uZSkgPT0gdGFnX2lkCisgICAgICAgICAgICAgICAgY2hlY2tlciA9IGlkX21hdGNoZXMKKworICAgICAgICAgICAgZWxpZiAnLicgaW4gdG9rZW46CisgICAgICAgICAgICAgICAgIyBDbGFzcyBzZWxlY3RvcgorICAgICAgICAgICAgICAgIHRhZ19uYW1lLCBrbGFzcyA9IHRva2VuLnNwbGl0KCcuJywgMSkKKyAgICAgICAgICAgICAgICBjbGFzc2VzID0gc2V0KGtsYXNzLnNwbGl0KCcuJykpCisgICAgICAgICAgICAgICAgZGVmIGNsYXNzZXNfbWF0Y2goY2FuZGlkYXRlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXMuaXNzdWJzZXQoY2FuZGlkYXRlLmdldCgnY2xhc3MnLCBbXSkpCisgICAgICAgICAgICAgICAgY2hlY2tlciA9IGNsYXNzZXNfbWF0Y2gKKworICAgICAgICAgICAgZWxpZiAnOicgaW4gdG9rZW46CisgICAgICAgICAgICAgICAgIyBQc2V1ZG8tY2xhc3MKKyAgICAgICAgICAgICAgICB0YWdfbmFtZSwgcHNldWRvID0gdG9rZW4uc3BsaXQoJzonLCAxKQorICAgICAgICAgICAgICAgIGlmIHRhZ19uYW1lID09ICcnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIkEgcHNldWRvLWNsYXNzIG11c3QgYmUgcHJlZml4ZWQgd2l0aCBhIHRhZyBuYW1lLiIpCisgICAgICAgICAgICAgICAgcHNldWRvX2F0dHJpYnV0ZXMgPSByZS5tYXRjaCgnKFthLXpBLVpcZC1dKylcKChbYS16QS1aXGRdKylcKScsIHBzZXVkbykKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFtdCisgICAgICAgICAgICAgICAgaWYgcHNldWRvX2F0dHJpYnV0ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHBzZXVkb190eXBlLCBwc2V1ZG9fdmFsdWUgPSBwc2V1ZG9fYXR0cmlidXRlcy5ncm91cHMoKQorICAgICAgICAgICAgICAgICAgICBpZiBwc2V1ZG9fdHlwZSA9PSAnbnRoLW9mLXR5cGUnOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkb192YWx1ZSA9IGludChwc2V1ZG9fdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09ubHkgbnVtZXJpYyB2YWx1ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIHRoZSBudGgtb2YtdHlwZSBwc2V1ZG8tY2xhc3MuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBzZXVkb192YWx1ZSA8IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ250aC1vZi10eXBlIHBzZXVkby1jbGFzcyB2YWx1ZSBtdXN0IGJlIGF0IGxlYXN0IDEuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIENvdW50ZXIob2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzdGluYXRpb24pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBudGhfY2hpbGRfb2ZfdHlwZShzZWxmLCB0YWcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jb3VudCA9PSBzZWxmLmRlc3RpbmF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jb3VudCA+IHNlbGYuZGVzdGluYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0b3AgdGhlIGdlbmVyYXRvciB0aGF0J3Mgc2VuZGluZyB1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGVzZSB0aGluZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyID0gQ291bnRlcihwc2V1ZG9fdmFsdWUpLm50aF9jaGlsZF9vZl90eXBlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPbmx5IHRoZSBmb2xsb3dpbmcgcHNldWRvLWNsYXNzZXMgYXJlIGltcGxlbWVudGVkOiBudGgtb2YtdHlwZS4nKQorCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICcqJzoKKyAgICAgICAgICAgICAgICAjIFN0YXIgc2VsZWN0b3IgLS0gbWF0Y2hlcyBldmVyeXRoaW5nCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiB0b2tlbiA9PSAnPic6CisgICAgICAgICAgICAgICAgIyBSdW4gdGhlIG5leHQgdG9rZW4gYXMgYSBDU1Mgc2VsZWN0b3IgYWdhaW5zdCB0aGUKKyAgICAgICAgICAgICAgICAjIGRpcmVjdCBjaGlsZHJlbiBvZiBlYWNoIHRhZyBpbiB0aGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZV9jYW5kaWRhdGVfZ2VuZXJhdG9yID0gbGFtYmRhIHRhZzogdGFnLmNoaWxkcmVuCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICd+JzoKKyAgICAgICAgICAgICAgICAjIFJ1biB0aGUgbmV4dCB0b2tlbiBhcyBhIENTUyBzZWxlY3RvciBhZ2FpbnN0IHRoZQorICAgICAgICAgICAgICAgICMgc2libGluZ3Mgb2YgZWFjaCB0YWcgaW4gdGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICAgICAgICByZWN1cnNpdmVfY2FuZGlkYXRlX2dlbmVyYXRvciA9IGxhbWJkYSB0YWc6IHRhZy5uZXh0X3NpYmxpbmdzCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICcrJzoKKyAgICAgICAgICAgICAgICAjIEZvciBlYWNoIHRhZyBpbiB0aGUgY3VycmVudCBjb250ZXh0LCBydW4gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAjIHRva2VuIGFzIGEgQ1NTIHNlbGVjdG9yIGFnYWluc3QgdGhlIHRhZydzIG5leHQKKyAgICAgICAgICAgICAgICAjIHNpYmxpbmcgdGhhdCdzIGEgdGFnLgorICAgICAgICAgICAgICAgIGRlZiBuZXh0X3RhZ19zaWJsaW5nKHRhZyk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRhZy5maW5kX25leHRfc2libGluZyhUcnVlKQorICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZV9jYW5kaWRhdGVfZ2VuZXJhdG9yID0gbmV4dF90YWdfc2libGluZworCisgICAgICAgICAgICBlbGlmIHNlbGYudGFnX25hbWVfcmUubWF0Y2godG9rZW4pOgorICAgICAgICAgICAgICAgICMgSnVzdCBhIHRhZyBuYW1lLgorICAgICAgICAgICAgICAgIHRhZ19uYW1lID0gdG9rZW4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ1Vuc3VwcG9ydGVkIG9yIGludmFsaWQgQ1NTIHNlbGVjdG9yOiAiJXMiJyAlIHRva2VuKQorCisgICAgICAgICAgICBpZiByZWN1cnNpdmVfY2FuZGlkYXRlX2dlbmVyYXRvcjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBzZWxlY3RvciBsb29rcyBsaWtlICAiPiBmb28iLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIFRoZSBnZW5lcmF0b3IgY2FsbHMgc2VsZWN0KCkgcmVjdXJzaXZlbHkgb24gZXZlcnkKKyAgICAgICAgICAgICAgICAjIG1lbWJlciBvZiB0aGUgY3VycmVudCBjb250ZXh0LCBwYXNzaW5nIGluIGEgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgIyBjYW5kaWRhdGUgZ2VuZXJhdG9yIGFuZCBhIGRpZmZlcmVudCBzZWxlY3Rvci4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiAiPiBmb28iLCB0aGUgY2FuZGlkYXRlIGdlbmVyYXRvciBpcworICAgICAgICAgICAgICAgICMgb25lIHRoYXQgeWllbGRzIGEgdGFnJ3MgZGlyZWN0IGNoaWxkcmVuICgiPiIpLCBhbmQKKyAgICAgICAgICAgICAgICAjIHRoZSBzZWxlY3RvciBpcyAiZm9vIi4KKyAgICAgICAgICAgICAgICBuZXh0X3Rva2VuID0gdG9rZW5zW2luZGV4KzFdCisgICAgICAgICAgICAgICAgZGVmIHJlY3Vyc2l2ZV9zZWxlY3QodGFnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyAgICBDYWxsaW5nIHNlbGVjdCgiJXMiKSByZWN1cnNpdmVseSBvbiAlcyAlcycgJSAobmV4dF90b2tlbiwgdGFnLm5hbWUsIHRhZy5hdHRycykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICctJyAqIDQwCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHRhZy5zZWxlY3QobmV4dF90b2tlbiwgcmVjdXJzaXZlX2NhbmRpZGF0ZV9nZW5lcmF0b3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICcoUmVjdXJzaXZlIHNlbGVjdCBwaWNrZWQgdXAgY2FuZGlkYXRlICVzICVzKScgJSAoaS5uYW1lLCBpLmF0dHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnLScgKiA0MAorICAgICAgICAgICAgICAgIF91c2VfY2FuZGlkYXRlX2dlbmVyYXRvciA9IHJlY3Vyc2l2ZV9zZWxlY3QKKyAgICAgICAgICAgIGVsaWYgX2NhbmRpZGF0ZV9nZW5lcmF0b3IgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIEJ5IGRlZmF1bHQsIGEgdGFnJ3MgY2FuZGlkYXRlcyBhcmUgYWxsIG9mIGl0cworICAgICAgICAgICAgICAgICMgY2hpbGRyZW4uIElmIHRhZ19uYW1lIGlzIGRlZmluZWQsIG9ubHkgeWllbGQgdGFncworICAgICAgICAgICAgICAgICMgd2l0aCB0aGF0IG5hbWUuCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgICAgICBpZiB0YWdfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrID0gIlthbnldIgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgPSB0YWdfbmFtZQorICAgICAgICAgICAgICAgICAgICBwcmludCAnICAgRGVmYXVsdCBjYW5kaWRhdGUgZ2VuZXJhdG9yLCB0YWcgbmFtZT0iJXMiJyAlIGNoZWNrCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0X2RlYnVnOgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbGF0ZXIgY29kZSwgYnV0IGl0IHN0b3BzCisgICAgICAgICAgICAgICAgICAgICMgYSBidW5jaCBvZiBib2d1cyB0YWdzIGZyb20gY2x1dHRlcmluZyB1cCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBkZWJ1ZyBsb2cuCisgICAgICAgICAgICAgICAgICAgIGRlZiBkZWZhdWx0X2NhbmRpZGF0ZV9nZW5lcmF0b3IodGFnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiB0YWcuZGVzY2VuZGFudHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hpbGQsIFRhZyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGFnX25hbWUgYW5kIG5vdCBjaGlsZC5uYW1lID09IHRhZ19uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNoaWxkCisgICAgICAgICAgICAgICAgICAgIF91c2VfY2FuZGlkYXRlX2dlbmVyYXRvciA9IGRlZmF1bHRfY2FuZGlkYXRlX2dlbmVyYXRvcgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIF91c2VfY2FuZGlkYXRlX2dlbmVyYXRvciA9IGxhbWJkYSB0YWc6IHRhZy5kZXNjZW5kYW50cworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBfdXNlX2NhbmRpZGF0ZV9nZW5lcmF0b3IgPSBfY2FuZGlkYXRlX2dlbmVyYXRvcgorCisgICAgICAgICAgICBuZXdfY29udGV4dCA9IFtdCisgICAgICAgICAgICBuZXdfY29udGV4dF9pZHMgPSBzZXQoW10pCisgICAgICAgICAgICBmb3IgdGFnIGluIGN1cnJlbnRfY29udGV4dDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAgUnVubmluZyBjYW5kaWRhdGUgZ2VuZXJhdG9yIG9uICVzICVzIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lLCByZXByKHRhZy5hdHRycykpCisgICAgICAgICAgICAgICAgZm9yIGNhbmRpZGF0ZSBpbiBfdXNlX2NhbmRpZGF0ZV9nZW5lcmF0b3IodGFnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FuZGlkYXRlLCBUYWcpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFnX25hbWUgYW5kIGNhbmRpZGF0ZS5uYW1lICE9IHRhZ19uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hlY2tlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjaGVja2VyKGNhbmRpZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNoZWNrZXIgaGFzIGRlY2lkZWQgd2Ugc2hvdWxkIG5vIGxvbmdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcnVuIHRoZSBnZW5lcmF0b3IuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hlY2tlciBpcyBOb25lIG9yIHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiICAgICBTVUNDRVNTICVzICVzIiAlIChjYW5kaWRhdGUubmFtZSwgcmVwcihjYW5kaWRhdGUuYXR0cnMpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaWQoY2FuZGlkYXRlKSBub3QgaW4gbmV3X2NvbnRleHRfaWRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgYSB0YWcgbWF0Y2hlcyBhIHNlbGVjdG9yIG1vcmUgdGhhbiBvbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgaW5jbHVkZSBpdCBpbiB0aGUgY29udGV4dCBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29udGV4dC5hcHBlbmQoY2FuZGlkYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jb250ZXh0X2lkcy5hZGQoaWQoY2FuZGlkYXRlKSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9zZWxlY3RfZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiICAgICBGQUlMVVJFICVzICVzIiAlIChjYW5kaWRhdGUubmFtZSwgcmVwcihjYW5kaWRhdGUuYXR0cnMpKQorCisgICAgICAgICAgICBjdXJyZW50X2NvbnRleHQgPSBuZXdfY29udGV4dAorCisgICAgICAgIGlmIHNlbGYuX3NlbGVjdF9kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ICJGaW5hbCB2ZXJkaWN0OiIKKyAgICAgICAgICAgIGZvciBpIGluIGN1cnJlbnRfY29udGV4dDoKKyAgICAgICAgICAgICAgICBwcmludCAiICVzICVzIiAlIChpLm5hbWUsIGkuYXR0cnMpCisgICAgICAgIHJldHVybiBjdXJyZW50X2NvbnRleHQKKworICAgICMgT2xkIG5hbWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgIGRlZiBjaGlsZEdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGRyZW4KKworICAgIGRlZiByZWN1cnNpdmVDaGlsZEdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVzY2VuZGFudHMKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgICIiIlRoaXMgd2FzIGtpbmQgb2YgbWlzbGVhZGluZyBiZWNhdXNlIGhhc19rZXkoKSAoYXR0cmlidXRlcykKKyAgICAgICAgd2FzIGRpZmZlcmVudCBmcm9tIF9faW5fXyAoY29udGVudHMpLiBoYXNfa2V5KCkgaXMgZ29uZSBpbgorICAgICAgICBQeXRob24gMywgYW55d2F5LiIiIgorICAgICAgICB3YXJuaW5ncy53YXJuKCdoYXNfa2V5IGlzIGRlcHJlY2F0ZWQuIFVzZSBoYXNfYXR0cigiJXMiKSBpbnN0ZWFkLicgJSAoCisgICAgICAgICAgICAgICAga2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFzX2F0dHIoa2V5KQorCisjIE5leHQsIGEgY291cGxlIGNsYXNzZXMgdG8gcmVwcmVzZW50IHF1ZXJpZXMgYW5kIHRoZWlyIHJlc3VsdHMuCitjbGFzcyBTb3VwU3RyYWluZXIob2JqZWN0KToKKyAgICAiIiJFbmNhcHN1bGF0ZXMgYSBudW1iZXIgb2Ygd2F5cyBvZiBtYXRjaGluZyBhIG1hcmt1cCBlbGVtZW50ICh0YWcgb3IKKyAgICB0ZXh0KS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIGF0dHJzPXt9LCB0ZXh0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5fbm9ybWFsaXplX3NlYXJjaF92YWx1ZShuYW1lKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhdHRycywgZGljdCk6CisgICAgICAgICAgICAjIFRyZWF0IGEgbm9uLWRpY3QgdmFsdWUgZm9yIGF0dHJzIGFzIGEgc2VhcmNoIGZvciB0aGUgJ2NsYXNzJworICAgICAgICAgICAgIyBhdHRyaWJ1dGUuCisgICAgICAgICAgICBrd2FyZ3NbJ2NsYXNzJ10gPSBhdHRycworICAgICAgICAgICAgYXR0cnMgPSBOb25lCisKKyAgICAgICAgaWYgJ2NsYXNzXycgaW4ga3dhcmdzOgorICAgICAgICAgICAgIyBUcmVhdCBjbGFzc189ImZvbyIgYXMgYSBzZWFyY2ggZm9yIHRoZSAnY2xhc3MnCisgICAgICAgICAgICAjIGF0dHJpYnV0ZSwgb3ZlcnJpZGluZyBhbnkgbm9uLWRpY3QgdmFsdWUgZm9yIGF0dHJzLgorICAgICAgICAgICAga3dhcmdzWydjbGFzcyddID0ga3dhcmdzWydjbGFzc18nXQorICAgICAgICAgICAgZGVsIGt3YXJnc1snY2xhc3NfJ10KKworICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICBpZiBhdHRyczoKKyAgICAgICAgICAgICAgICBhdHRycyA9IGF0dHJzLmNvcHkoKQorICAgICAgICAgICAgICAgIGF0dHJzLnVwZGF0ZShrd2FyZ3MpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0dHJzID0ga3dhcmdzCisgICAgICAgIG5vcm1hbGl6ZWRfYXR0cnMgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRycy5pdGVtcygpOgorICAgICAgICAgICAgbm9ybWFsaXplZF9hdHRyc1trZXldID0gc2VsZi5fbm9ybWFsaXplX3NlYXJjaF92YWx1ZSh2YWx1ZSkKKworICAgICAgICBzZWxmLmF0dHJzID0gbm9ybWFsaXplZF9hdHRycworICAgICAgICBzZWxmLnRleHQgPSBzZWxmLl9ub3JtYWxpemVfc2VhcmNoX3ZhbHVlKHRleHQpCisKKyAgICBkZWYgX25vcm1hbGl6ZV9zZWFyY2hfdmFsdWUoc2VsZiwgdmFsdWUpOgorICAgICAgICAjIExlYXZlIGl0IGFsb25lIGlmIGl0J3MgYSBVbmljb2RlIHN0cmluZywgYSBjYWxsYWJsZSwgYQorICAgICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYSBib29sZWFuLCBvciBOb25lLgorICAgICAgICBpZiAoaXNpbnN0YW5jZSh2YWx1ZSwgdW5pY29kZSkgb3IgY2FsbGFibGUodmFsdWUpIG9yIGhhc2F0dHIodmFsdWUsICdtYXRjaCcpCisgICAgICAgICAgICBvciBpc2luc3RhbmNlKHZhbHVlLCBib29sKSBvciB2YWx1ZSBpcyBOb25lKToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgICMgSWYgaXQncyBhIGJ5dGVzdHJpbmcsIGNvbnZlcnQgaXQgdG8gVW5pY29kZSwgdHJlYXRpbmcgaXQgYXMgVVRGLTguCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoInV0ZjgiKQorCisgICAgICAgICMgSWYgaXQncyBsaXN0bGlrZSwgY29udmVydCBpdCBpbnRvIGEgbGlzdCBvZiBzdHJpbmdzLgorICAgICAgICBpZiBoYXNhdHRyKHZhbHVlLCAnX19pdGVyX18nKToKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IFtdCisgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICBpZiAoaGFzYXR0cih2LCAnX19pdGVyX18nKSBhbmQgbm90IGlzaW5zdGFuY2UodiwgYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZSh2LCB1bmljb2RlKSk6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbG1vc3QgY2VydGFpbmx5IHRoZSB1c2VyJ3MgbWlzdGFrZS4gSW4gdGhlCisgICAgICAgICAgICAgICAgICAgICMgaW50ZXJlc3RzIG9mIGF2b2lkaW5nIGluZmluaXRlIGxvb3BzLCB3ZSdsbCBsZXQKKyAgICAgICAgICAgICAgICAgICAgIyBpdCB0aHJvdWdoIGFzLWlzIHJhdGhlciB0aGFuIGRvaW5nIGEgcmVjdXJzaXZlIGNhbGwuCisgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZS5hcHBlbmQodikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWUuYXBwZW5kKHNlbGYuX25vcm1hbGl6ZV9zZWFyY2hfdmFsdWUodikpCisgICAgICAgICAgICByZXR1cm4gbmV3X3ZhbHVlCisKKyAgICAgICAgIyBPdGhlcndpc2UsIGNvbnZlcnQgaXQgaW50byBhIFVuaWNvZGUgc3RyaW5nLgorICAgICAgICAjIFRoZSB1bmljb2RlKHN0cigpKSB0aGluZyBpcyBzbyB0aGlzIHdpbGwgZG8gdGhlIHNhbWUgdGhpbmcgb24gUHl0aG9uIDIKKyAgICAgICAgIyBhbmQgUHl0aG9uIDMuCisgICAgICAgIHJldHVybiB1bmljb2RlKHN0cih2YWx1ZSkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGV4dAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIlc3wlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLmF0dHJzKQorCisgICAgZGVmIHNlYXJjaF90YWcoc2VsZiwgbWFya3VwX25hbWU9Tm9uZSwgbWFya3VwX2F0dHJzPXt9KToKKyAgICAgICAgZm91bmQgPSBOb25lCisgICAgICAgIG1hcmt1cCA9IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXJrdXBfbmFtZSwgVGFnKToKKyAgICAgICAgICAgIG1hcmt1cCA9IG1hcmt1cF9uYW1lCisgICAgICAgICAgICBtYXJrdXBfYXR0cnMgPSBtYXJrdXAKKyAgICAgICAgY2FsbF9mdW5jdGlvbl93aXRoX3RhZ19kYXRhID0gKAorICAgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLm5hbWUsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKQorICAgICAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKG1hcmt1cF9uYW1lLCBUYWcpKQorCisgICAgICAgIGlmICgobm90IHNlbGYubmFtZSkKKyAgICAgICAgICAgIG9yIGNhbGxfZnVuY3Rpb25fd2l0aF90YWdfZGF0YQorICAgICAgICAgICAgb3IgKG1hcmt1cCBhbmQgc2VsZi5fbWF0Y2hlcyhtYXJrdXAsIHNlbGYubmFtZSkpCisgICAgICAgICAgICBvciAobm90IG1hcmt1cCBhbmQgc2VsZi5fbWF0Y2hlcyhtYXJrdXBfbmFtZSwgc2VsZi5uYW1lKSkpOgorICAgICAgICAgICAgaWYgY2FsbF9mdW5jdGlvbl93aXRoX3RhZ19kYXRhOgorICAgICAgICAgICAgICAgIG1hdGNoID0gc2VsZi5uYW1lKG1hcmt1cF9uYW1lLCBtYXJrdXBfYXR0cnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1hdGNoID0gVHJ1ZQorICAgICAgICAgICAgICAgIG1hcmt1cF9hdHRyX21hcCA9IE5vbmUKKyAgICAgICAgICAgICAgICBmb3IgYXR0ciwgbWF0Y2hfYWdhaW5zdCBpbiBsaXN0KHNlbGYuYXR0cnMuaXRlbXMoKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtYXJrdXBfYXR0cl9tYXA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG1hcmt1cF9hdHRycywgJ2dldCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmt1cF9hdHRyX21hcCA9IG1hcmt1cF9hdHRycworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrdXBfYXR0cl9tYXAgPSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIG1hcmt1cF9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3VwX2F0dHJfbWFwW2tdID0gdgorICAgICAgICAgICAgICAgICAgICBhdHRyX3ZhbHVlID0gbWFya3VwX2F0dHJfbWFwLmdldChhdHRyKQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fbWF0Y2hlcyhhdHRyX3ZhbHVlLCBtYXRjaF9hZ2FpbnN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBpZiBtYXJrdXA6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbWFya3VwCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtYXJrdXBfbmFtZQorICAgICAgICBpZiBmb3VuZCBhbmQgc2VsZi50ZXh0IGFuZCBub3Qgc2VsZi5fbWF0Y2hlcyhmb3VuZC5zdHJpbmcsIHNlbGYudGV4dCk6CisgICAgICAgICAgICBmb3VuZCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGZvdW5kCisgICAgc2VhcmNoVGFnID0gc2VhcmNoX3RhZworCisgICAgZGVmIHNlYXJjaChzZWxmLCBtYXJrdXApOgorICAgICAgICAjIHByaW50ICdsb29raW5nIGZvciAlcyBpbiAlcycgJSAoc2VsZiwgbWFya3VwKQorICAgICAgICBmb3VuZCA9IE5vbmUKKyAgICAgICAgIyBJZiBnaXZlbiBhIGxpc3Qgb2YgaXRlbXMsIHNjYW4gaXQgZm9yIGEgdGV4dCBlbGVtZW50IHRoYXQKKyAgICAgICAgIyBtYXRjaGVzLgorICAgICAgICBpZiBoYXNhdHRyKG1hcmt1cCwgJ19faXRlcl9fJykgYW5kIG5vdCBpc2luc3RhbmNlKG1hcmt1cCwgKFRhZywgYmFzZXN0cmluZykpOgorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gbWFya3VwOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgTmF2aWdhYmxlU3RyaW5nKSBcCisgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLnNlYXJjaChlbGVtZW50KToKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICMgSWYgaXQncyBhIFRhZywgbWFrZSBzdXJlIGl0cyBuYW1lIG9yIGF0dHJpYnV0ZXMgbWF0Y2guCisgICAgICAgICMgRG9uJ3QgYm90aGVyIHdpdGggVGFncyBpZiB3ZSdyZSBzZWFyY2hpbmcgZm9yIHRleHQuCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYXJrdXAsIFRhZyk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi50ZXh0IG9yIHNlbGYubmFtZSBvciBzZWxmLmF0dHJzOgorICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5zZWFyY2hfdGFnKG1hcmt1cCkKKyAgICAgICAgIyBJZiBpdCdzIHRleHQsIG1ha2Ugc3VyZSB0aGUgdGV4dCBtYXRjaGVzLgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWFya3VwLCBOYXZpZ2FibGVTdHJpbmcpIG9yIFwKKyAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShtYXJrdXAsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYubmFtZSBhbmQgbm90IHNlbGYuYXR0cnMgYW5kIHNlbGYuX21hdGNoZXMobWFya3VwLCBzZWxmLnRleHQpOgorICAgICAgICAgICAgICAgIGZvdW5kID0gbWFya3VwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkkgZG9uJ3Qga25vdyBob3cgdG8gbWF0Y2ggYWdhaW5zdCBhICVzIiAlIG1hcmt1cC5fX2NsYXNzX18pCisgICAgICAgIHJldHVybiBmb3VuZAorCisgICAgZGVmIF9tYXRjaGVzKHNlbGYsIG1hcmt1cCwgbWF0Y2hfYWdhaW5zdCk6CisgICAgICAgICMgcHJpbnQgdSJNYXRjaGluZyAlcyBhZ2FpbnN0ICVzIiAlIChtYXJrdXAsIG1hdGNoX2FnYWluc3QpCisgICAgICAgIHJlc3VsdCA9IEZhbHNlCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFya3VwLCBsaXN0KSBvciBpc2luc3RhbmNlKG1hcmt1cCwgdHVwbGUpOgorICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIHNlYXJjaGluZyBhIG11bHRpLXZhbHVlZCBhdHRyaWJ1dGUKKyAgICAgICAgICAgICMgbGlrZSAnY2xhc3MnLgorICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2UobWF0Y2hfYWdhaW5zdCwgdW5pY29kZSkKKyAgICAgICAgICAgICAgICBhbmQgJyAnIGluIG1hdGNoX2FnYWluc3QpOgorICAgICAgICAgICAgICAgICMgQSBiaXQgb2YgYSBzcGVjaWFsIGNhc2UuIElmIHRoZXkgdHJ5IHRvIG1hdGNoICJmb28KKyAgICAgICAgICAgICAgICAjIGJhciIgb24gYSBtdWx0aXZhbHVlIGF0dHJpYnV0ZSdzIHZhbHVlLCBvbmx5IGFjY2VwdAorICAgICAgICAgICAgICAgICMgdGhlIGxpdGVyYWwgdmFsdWUgImZvbyBiYXIiCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgWFhYIFRoaXMgaXMgZ29pbmcgdG8gYmUgcHJldHR5IHNsb3cgYmVjYXVzZSB3ZSBrZWVwCisgICAgICAgICAgICAgICAgIyBzcGxpdHRpbmcgbWF0Y2hfYWdhaW5zdC4gQnV0IGl0IHNob3VsZG4ndCBjb21lIHVwCisgICAgICAgICAgICAgICAgIyB0b28gb2Z0ZW4uCisgICAgICAgICAgICAgICAgcmV0dXJuICh3aGl0ZXNwYWNlX3JlLnNwbGl0KG1hdGNoX2FnYWluc3QpID09IG1hcmt1cCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbWFya3VwOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9tYXRjaGVzKGl0ZW0sIG1hdGNoX2FnYWluc3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBtYXRjaF9hZ2FpbnN0IGlzIFRydWU6CisgICAgICAgICAgICAjIFRydWUgbWF0Y2hlcyBhbnkgbm9uLU5vbmUgdmFsdWUuCisgICAgICAgICAgICByZXR1cm4gbWFya3VwIGlzIG5vdCBOb25lCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtYXRjaF9hZ2FpbnN0LCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hfYWdhaW5zdChtYXJrdXApCisKKyAgICAgICAgIyBDdXN0b20gY2FsbGFibGVzIHRha2UgdGhlIHRhZyBhcyBhbiBhcmd1bWVudCwgYnV0IGFsbAorICAgICAgICAjIG90aGVyIHdheXMgb2YgbWF0Y2hpbmcgbWF0Y2ggdGhlIHRhZyBuYW1lIGFzIGEgc3RyaW5nLgorICAgICAgICBpZiBpc2luc3RhbmNlKG1hcmt1cCwgVGFnKToKKyAgICAgICAgICAgIG1hcmt1cCA9IG1hcmt1cC5uYW1lCisKKyAgICAgICAgIyBFbnN1cmUgdGhhdCBgbWFya3VwYCBpcyBlaXRoZXIgYSBVbmljb2RlIHN0cmluZywgb3IgTm9uZS4KKyAgICAgICAgbWFya3VwID0gc2VsZi5fbm9ybWFsaXplX3NlYXJjaF92YWx1ZShtYXJrdXApCisKKyAgICAgICAgaWYgbWFya3VwIGlzIE5vbmU6CisgICAgICAgICAgICAjIE5vbmUgbWF0Y2hlcyBOb25lLCBGYWxzZSwgYW4gZW1wdHkgc3RyaW5nLCBhbiBlbXB0eSBsaXN0LCBhbmQgc28gb24uCisgICAgICAgICAgICByZXR1cm4gbm90IG1hdGNoX2FnYWluc3QKKworICAgICAgICBpZiBpc2luc3RhbmNlKG1hdGNoX2FnYWluc3QsIHVuaWNvZGUpOgorICAgICAgICAgICAgIyBFeGFjdCBzdHJpbmcgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBtYXJrdXAgPT0gbWF0Y2hfYWdhaW5zdAorCisgICAgICAgIGlmIGhhc2F0dHIobWF0Y2hfYWdhaW5zdCwgJ21hdGNoJyk6CisgICAgICAgICAgICAjIFJlZ2V4cCBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIG1hdGNoX2FnYWluc3Quc2VhcmNoKG1hcmt1cCkKKworICAgICAgICBpZiBoYXNhdHRyKG1hdGNoX2FnYWluc3QsICdfX2l0ZXJfXycpOgorICAgICAgICAgICAgIyBUaGUgbWFya3VwIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2ggYWdhaW5zdCBzb21ldGhpbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGl0ZXJhYmxlLgorICAgICAgICAgICAgcmV0dXJuIG1hcmt1cCBpbiBtYXRjaF9hZ2FpbnN0CisKKworY2xhc3MgUmVzdWx0U2V0KGxpc3QpOgorICAgICIiIkEgUmVzdWx0U2V0IGlzIGp1c3QgYSBsaXN0IHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIFNvdXBTdHJhaW5lcgorICAgIHRoYXQgY3JlYXRlZCBpdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCByZXN1bHQ9KCkpOgorICAgICAgICBzdXBlcihSZXN1bHRTZXQsIHNlbGYpLl9faW5pdF9fKHJlc3VsdCkKKyAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2UKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0aW5nLnB5IGIvYml0YmFrZS9saWIvYnM0L3Rlc3RpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0NDk1YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0aW5nLnB5CkBAIC0wLDAgKzEsNTkyIEBACisiIiJIZWxwZXIgY2xhc3NlcyBmb3IgdGVzdHMuIiIiCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIGJzNCBpbXBvcnQgQmVhdXRpZnVsU291cAorZnJvbSBiczQuZWxlbWVudCBpbXBvcnQgKAorICAgIENoYXJzZXRNZXRhQXR0cmlidXRlVmFsdWUsCisgICAgQ29tbWVudCwKKyAgICBDb250ZW50TWV0YUF0dHJpYnV0ZVZhbHVlLAorICAgIERvY3R5cGUsCisgICAgU291cFN0cmFpbmVyLAorKQorCitmcm9tIGJzNC5idWlsZGVyIGltcG9ydCBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIKK2RlZmF1bHRfYnVpbGRlciA9IEhUTUxQYXJzZXJUcmVlQnVpbGRlcgorCisKK2NsYXNzIFNvdXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkZWZhdWx0X2J1aWxkZXIoc2VsZik6CisgICAgICAgIHJldHVybiBkZWZhdWx0X2J1aWxkZXIoKQorCisgICAgZGVmIHNvdXAoc2VsZiwgbWFya3VwLCAqKmt3YXJncyk6CisgICAgICAgICIiIkJ1aWxkIGEgQmVhdXRpZnVsIFNvdXAgb2JqZWN0IGZyb20gbWFya3VwLiIiIgorICAgICAgICBidWlsZGVyID0ga3dhcmdzLnBvcCgnYnVpbGRlcicsIHNlbGYuZGVmYXVsdF9idWlsZGVyKQorICAgICAgICByZXR1cm4gQmVhdXRpZnVsU291cChtYXJrdXAsIGJ1aWxkZXI9YnVpbGRlciwgKiprd2FyZ3MpCisKKyAgICBkZWYgZG9jdW1lbnRfZm9yKHNlbGYsIG1hcmt1cCk6CisgICAgICAgICIiIlR1cm4gYW4gSFRNTCBmcmFnbWVudCBpbnRvIGEgZG9jdW1lbnQuCisKKyAgICAgICAgVGhlIGRldGFpbHMgZGVwZW5kIG9uIHRoZSBidWlsZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVmYXVsdF9idWlsZGVyLnRlc3RfZnJhZ21lbnRfdG9fZG9jdW1lbnQobWFya3VwKQorCisgICAgZGVmIGFzc2VydFNvdXBFcXVhbHMoc2VsZiwgdG9fcGFyc2UsIGNvbXBhcmVfcGFyc2VkX3RvPU5vbmUpOgorICAgICAgICBidWlsZGVyID0gc2VsZi5kZWZhdWx0X2J1aWxkZXIKKyAgICAgICAgb2JqID0gQmVhdXRpZnVsU291cCh0b19wYXJzZSwgYnVpbGRlcj1idWlsZGVyKQorICAgICAgICBpZiBjb21wYXJlX3BhcnNlZF90byBpcyBOb25lOgorICAgICAgICAgICAgY29tcGFyZV9wYXJzZWRfdG8gPSB0b19wYXJzZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2Zvcihjb21wYXJlX3BhcnNlZF90bykpCisKKworY2xhc3MgSFRNTFRyZWVCdWlsZGVyU21va2VUZXN0KG9iamVjdCk6CisKKyAgICAiIiJBIGJhc2ljIHRlc3Qgb2YgYSB0cmVlYnVpbGRlcidzIGNvbXBldGVuY2UuCisKKyAgICBBbnkgSFRNTCB0cmVlYnVpbGRlciwgcHJlc2VudCBvciBmdXR1cmUsIHNob3VsZCBiZSBhYmxlIHRvIHBhc3MKKyAgICB0aGVzZSB0ZXN0cy4gV2l0aCBpbnZhbGlkIG1hcmt1cCwgdGhlcmUncyByb29tIGZvciBpbnRlcnByZXRhdGlvbiwKKyAgICBhbmQgZGlmZmVyZW50IHBhcnNlcnMgY2FuIGhhbmRsZSBpdCBkaWZmZXJlbnRseS4gQnV0IHdpdGggdGhlCisgICAgbWFya3VwIGluIHRoZXNlIHRlc3RzLCB0aGVyZSdzIG5vdCBtdWNoIHJvb20gZm9yIGludGVycHJldGF0aW9uLgorICAgICIiIgorCisgICAgZGVmIGFzc2VydERvY3R5cGVIYW5kbGVkKHNlbGYsIGRvY3R5cGVfZnJhZ21lbnQpOgorICAgICAgICAiIiJBc3NlcnQgdGhhdCBhIGdpdmVuIGRvY3R5cGUgc3RyaW5nIGlzIGhhbmRsZWQgY29ycmVjdGx5LiIiIgorICAgICAgICBkb2N0eXBlX3N0ciwgc291cCA9IHNlbGYuX2RvY3VtZW50X3dpdGhfZG9jdHlwZShkb2N0eXBlX2ZyYWdtZW50KQorCisgICAgICAgICMgTWFrZSBzdXJlIGEgRG9jdHlwZSBvYmplY3Qgd2FzIGNyZWF0ZWQuCisgICAgICAgIGRvY3R5cGUgPSBzb3VwLmNvbnRlbnRzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9jdHlwZS5fX2NsYXNzX18sIERvY3R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9jdHlwZSwgZG9jdHlwZV9mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc291cClbOmxlbihkb2N0eXBlX3N0cildLCBkb2N0eXBlX3N0cikKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkb2N0eXBlIHdhcyBjb3JyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAgICAjIHBhcnNlIHRyZWUgYW5kIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50IHBhcnNlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLnAuY29udGVudHNbMF0sICdmb28nKQorCisgICAgZGVmIF9kb2N1bWVudF93aXRoX2RvY3R5cGUoc2VsZiwgZG9jdHlwZV9mcmFnbWVudCk6CisgICAgICAgICIiIkdlbmVyYXRlIGFuZCBwYXJzZSBhIGRvY3VtZW50IHdpdGggdGhlIGdpdmVuIGRvY3R5cGUuIiIiCisgICAgICAgIGRvY3R5cGUgPSAnPCFET0NUWVBFICVzPicgJSBkb2N0eXBlX2ZyYWdtZW50CisgICAgICAgIG1hcmt1cCA9IGRvY3R5cGUgKyAnXG48cD5mb288L3A+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgcmV0dXJuIGRvY3R5cGUsIHNvdXAKKworICAgIGRlZiB0ZXN0X25vcm1hbF9kb2N0eXBlcyhzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIG5vcm1hbCwgZXZlcnlkYXkgSFRNTCBkb2N0eXBlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RG9jdHlwZUhhbmRsZWQoImh0bWwiKQorICAgICAgICBzZWxmLmFzc2VydERvY3R5cGVIYW5kbGVkKAorICAgICAgICAgICAgJ2h0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiInKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZG9jdHlwZShzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPCFET0NUWVBFPiIpCisgICAgICAgIGRvY3R5cGUgPSBzb3VwLmNvbnRlbnRzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiIsIGRvY3R5cGUuc3RyaXAoKSkKKworICAgIGRlZiB0ZXN0X3B1YmxpY19kb2N0eXBlX3dpdGhfdXJsKHNlbGYpOgorICAgICAgICBkb2N0eXBlID0gJ2h0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiJworICAgICAgICBzZWxmLmFzc2VydERvY3R5cGVIYW5kbGVkKGRvY3R5cGUpCisKKyAgICBkZWYgdGVzdF9zeXN0ZW1fZG9jdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnREb2N0eXBlSGFuZGxlZCgnZm9vIFNZU1RFTSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iJykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZWRfc3lzdGVtX2RvY3R5cGUoc2VsZik6CisgICAgICAgICMgV2UgY2FuIGhhbmRsZSBhIG5hbWVzcGFjZWQgZG9jdHlwZSB3aXRoIGEgc3lzdGVtIElELgorICAgICAgICBzZWxmLmFzc2VydERvY3R5cGVIYW5kbGVkKCd4c2w6c3R5bGVzaGVldCBTWVNURU0gImh0bWxlbnQuZHRkIicpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2VkX3B1YmxpY19kb2N0eXBlKHNlbGYpOgorICAgICAgICAjIFRlc3QgYSBuYW1lc3BhY2VkIGRvY3R5cGUgd2l0aCBhIHB1YmxpYyBpZC4KKyAgICAgICAgc2VsZi5hc3NlcnREb2N0eXBlSGFuZGxlZCgneHNsOnN0eWxlc2hlZXQgUFVCTElDICJodG1sZW50LmR0ZCInKQorCisgICAgZGVmIHRlc3RfcmVhbF94aHRtbF9kb2N1bWVudChzZWxmKToKKyAgICAgICAgIiIiQSByZWFsIFhIVE1MIGRvY3VtZW50IHNob3VsZCBjb21lIG91dCBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgYXMgaXQgd2VudCBpbi4iIiIKKyAgICAgICAgbWFya3VwID0gYiIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPjx0aXRsZT5IZWxsby48L3RpdGxlPjwvaGVhZD4KKzxib2R5Pkdvb2RieWUuPC9ib2R5PgorPC9odG1sPiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZW5jb2RlKCJ1dGYtOCIpLnJlcGxhY2UoYiJcbiIsIGIiIiksCisgICAgICAgICAgICBtYXJrdXAucmVwbGFjZShiIlxuIiwgYiIiKSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5KHNlbGYpOgorICAgICAgICAiIiJNYWtlIHN1cmUgeW91IGNhbiBjb3B5IHRoZSB0cmVlIGJ1aWxkZXIuCisKKyAgICAgICAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgYnVpbGRlciBpcyBwYXJ0IG9mIGEKKyAgICAgICAgQmVhdXRpZnVsU291cCBvYmplY3QsIGFuZCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY29weSB0aGF0LgorICAgICAgICAiIiIKKyAgICAgICAgY29weS5kZWVwY29weShzZWxmLmRlZmF1bHRfYnVpbGRlcikKKworICAgIGRlZiB0ZXN0X3BfdGFnX2lzX25ldmVyX2VtcHR5X2VsZW1lbnQoc2VsZik6CisgICAgICAgICIiIkEgPHA+IHRhZyBpcyBuZXZlciBkZXNpZ25hdGVkIGFzIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgorCisgICAgICAgIEV2ZW4gaWYgdGhlIG1hcmt1cCBzaG93cyBpdCBhcyBhbiBlbXB0eS1lbGVtZW50IHRhZywgaXQKKyAgICAgICAgc2hvdWxkbid0IGJlIHByZXNlbnRlZCB0aGF0IHdheS4KKyAgICAgICAgIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxwLz4iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNvdXAucC5pc19lbXB0eV9lbGVtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzb3VwLnApLCAiPHA+PC9wPiIpCisKKyAgICBkZWYgdGVzdF91bmNsb3NlZF90YWdzX2dldF9jbG9zZWQoc2VsZik6CisgICAgICAgICIiIkEgdGFnIHRoYXQncyBub3QgY2xvc2VkIGJ5IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50IHNob3VsZCBiZSBjbG9zZWQuCisKKyAgICAgICAgVGhpcyBhcHBsaWVzIHRvIGFsbCB0YWdzIGV4Y2VwdCBlbXB0eS1lbGVtZW50IHRhZ3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwPiIsICI8cD48L3A+IikKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8Yj4iLCAiPGI+PC9iPiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8YnI+IiwgIjxici8+IikKKworICAgIGRlZiB0ZXN0X2JyX2lzX2Fsd2F5c19lbXB0eV9lbGVtZW50X3RhZyhzZWxmKToKKyAgICAgICAgIiIiQSA8YnI+IHRhZyBpcyBkZXNpZ25hdGVkIGFzIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgorCisgICAgICAgIFNvbWUgcGFyc2VycyB0cmVhdCA8YnI+PC9icj4gYXMgb25lIDxici8+IHRhZywgc29tZSBwYXJzZXJzIGFzCisgICAgICAgIHR3byB0YWdzLCBidXQgaXQgc2hvdWxkIGFsd2F5cyBiZSBhbiBlbXB0eS1lbGVtZW50IHRhZy4KKyAgICAgICAgIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxicj48L2JyPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb3VwLmJyLmlzX2VtcHR5X2VsZW1lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNvdXAuYnIpLCAiPGJyLz4iKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2Zvcm1hdHRpbmdfZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPGVtPjxlbT48L2VtPjwvZW0+IikKKworICAgIGRlZiB0ZXN0X2NvbW1lbnQoc2VsZik6CisgICAgICAgICMgQ29tbWVudHMgYXJlIHJlcHJlc2VudGVkIGFzIENvbW1lbnQgb2JqZWN0cy4KKyAgICAgICAgbWFya3VwID0gIjxwPmZvbzwhLS1mb29iYXItLT5iYXo8L3A+IgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMobWFya3VwKQorCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBjb21tZW50ID0gc291cC5maW5kKHRleHQ9ImZvb2JhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbWVudC5fX2NsYXNzX18sIENvbW1lbnQpCisKKyAgICAgICAgIyBUaGUgY29tbWVudCBpcyBwcm9wZXJseSBpbnRlZ3JhdGVkIGludG8gdGhlIHRyZWUuCisgICAgICAgIGZvbyA9IHNvdXAuZmluZCh0ZXh0PSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1lbnQsIGZvby5uZXh0X2VsZW1lbnQpCisgICAgICAgIGJheiA9IHNvdXAuZmluZCh0ZXh0PSJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1lbnQsIGJhei5wcmV2aW91c19lbGVtZW50KQorCisgICAgZGVmIHRlc3RfcHJlc2VydmVkX3doaXRlc3BhY2VfaW5fcHJlX2FuZF90ZXh0YXJlYShzZWxmKToKKyAgICAgICAgIiIiV2hpdGVzcGFjZSBtdXN0IGJlIHByZXNlcnZlZCBpbiA8cHJlPiBhbmQgPHRleHRhcmVhPiB0YWdzLiIiIgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwcmU+ICAgPC9wcmU+IikKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8dGV4dGFyZWE+IHdvbyAgPC90ZXh0YXJlYT4iKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2lubGluZV9lbGVtZW50cyhzZWxmKToKKyAgICAgICAgIiIiSW5saW5lIGVsZW1lbnRzIGNhbiBiZSBuZXN0ZWQgaW5kZWZpbml0ZWx5LiIiIgorICAgICAgICBiX3RhZyA9ICI8Yj5JbnNpZGUgYSBCIHRhZzwvYj4iCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscyhiX3RhZykKKworICAgICAgICBuZXN0ZWRfYl90YWcgPSAiPHA+QSA8aT5uZXN0ZWQgPGI+dGFnPC9iPjwvaT48L3A+IgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMobmVzdGVkX2JfdGFnKQorCisgICAgICAgIGRvdWJsZV9uZXN0ZWRfYl90YWcgPSAiPHA+QSA8YT5kb3VibHkgPGk+bmVzdGVkIDxiPnRhZzwvYj48L2k+PC9hPjwvcD4iCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscyhuZXN0ZWRfYl90YWcpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfYmxvY2tfbGV2ZWxfZWxlbWVudHMoc2VsZik6CisgICAgICAgICIiIkJsb2NrIGVsZW1lbnRzIGNhbiBiZSBuZXN0ZWQuIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoJzxibG9ja3F1b3RlPjxwPjxiPkZvbzwvYj48L3A+PC9ibG9ja3F1b3RlPicpCisgICAgICAgIGJsb2NrcXVvdGUgPSBzb3VwLmJsb2NrcXVvdGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChibG9ja3F1b3RlLnAuYi5zdHJpbmcsICdGb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJsb2NrcXVvdGUuYi5zdHJpbmcsICdGb28nKQorCisgICAgZGVmIHRlc3RfY29ycmVjdGx5X25lc3RlZF90YWJsZXMoc2VsZik6CisgICAgICAgICIiIk9uZSB0YWJsZSBjYW4gZ28gaW5zaWRlIGFub3RoZXIgb25lLiIiIgorICAgICAgICBtYXJrdXAgPSAoJzx0YWJsZSBpZD0iMSI+JworICAgICAgICAgICAgICAgICAgJzx0cj4nCisgICAgICAgICAgICAgICAgICAiPHRkPkhlcmUncyBhbm90aGVyIHRhYmxlOiIKKyAgICAgICAgICAgICAgICAgICc8dGFibGUgaWQ9IjIiPicKKyAgICAgICAgICAgICAgICAgICc8dHI+PHRkPmZvbzwvdGQ+PC90cj4nCisgICAgICAgICAgICAgICAgICAnPC90YWJsZT48L3RkPicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKAorICAgICAgICAgICAgbWFya3VwLAorICAgICAgICAgICAgJzx0YWJsZSBpZD0iMSI+PHRyPjx0ZD5IZXJlXCdzIGFub3RoZXIgdGFibGU6JworICAgICAgICAgICAgJzx0YWJsZSBpZD0iMiI+PHRyPjx0ZD5mb288L3RkPjwvdHI+PC90YWJsZT4nCisgICAgICAgICAgICAnPC90ZD48L3RyPjwvdGFibGU+JykKKworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICAiPHRhYmxlPjx0aGVhZD48dHI+PHRkPkZvbzwvdGQ+PC90cj48L3RoZWFkPiIKKyAgICAgICAgICAgICI8dGJvZHk+PHRyPjx0ZD5CYXI8L3RkPjwvdHI+PC90Ym9keT4iCisgICAgICAgICAgICAiPHRmb290Pjx0cj48dGQ+QmF6PC90ZD48L3RyPjwvdGZvb3Q+PC90YWJsZT4iKQorCisgICAgZGVmIHRlc3RfZGVlcGx5X25lc3RlZF9tdWx0aXZhbHVlZF9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgICMgaHRtbDVsaWIgY2FuIHNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc2FtZSB0YWcgbWFueSB0aW1lcworICAgICAgICAjIGFzIGl0IHJlYXJyYW5nZXMgdGhlIHRyZWUuIFRoaXMgaGFzIGNhdXNlZCBwcm9ibGVtcyB3aXRoCisgICAgICAgICMgbXVsdGl2YWx1ZWQgYXR0cmlidXRlcy4KKyAgICAgICAgbWFya3VwID0gJzx0YWJsZT48ZGl2PjxkaXYgY2xhc3M9ImNzcyI+PC9kaXY+PC9kaXY+PC90YWJsZT4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsiY3NzIl0sIHNvdXAuZGl2LmRpdlsnY2xhc3MnXSkKKworICAgIGRlZiB0ZXN0X2FuZ2xlX2JyYWNrZXRzX2luX2F0dHJpYnV0ZV92YWx1ZXNfYXJlX2VzY2FwZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygnPGEgYj0iPGE+Ij48L2E+JywgJzxhIGI9IiZsdDthJmd0OyI+PC9hPicpCisKKyAgICBkZWYgdGVzdF9lbnRpdGllc19pbl9hdHRyaWJ1dGVzX2NvbnZlcnRlZF90b191bmljb2RlKHNlbGYpOgorICAgICAgICBleHBlY3QgPSB1JzxwIGlkPSJwaVxOe0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREV9YXRhIj48L3A+JworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoJzxwIGlkPSJwaSYjMjQxO2F0YSI+PC9wPicsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCc8cCBpZD0icGkmI3hmMTthdGEiPjwvcD4nLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygnPHAgaWQ9InBpJiNYZjE7YXRhIj48L3A+JywgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoJzxwIGlkPSJwaSZudGlsZGU7YXRhIj48L3A+JywgZXhwZWN0KQorCisgICAgZGVmIHRlc3RfZW50aXRpZXNfaW5fdGV4dF9jb252ZXJ0ZWRfdG9fdW5pY29kZShzZWxmKToKKyAgICAgICAgZXhwZWN0ID0gdSc8cD5waVxOe0xBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREV9YXRhPC9wPicKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8cD5waSYjMjQxO2F0YTwvcD4iLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPHA+cGkmI3hmMTthdGE8L3A+IiwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwPnBpJiNYZjE7YXRhPC9wPiIsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8cD5waSZudGlsZGU7YXRhPC9wPiIsIGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X3F1b3RfZW50aXR5X2NvbnZlcnRlZF90b19xdW90YXRpb25fbWFyayhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCI8cD5JIHNhaWQgJnF1b3Q7Z29vZCBkYXkhJnF1b3Q7PC9wPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHA+SSBzYWlkICJnb29kIGRheSEiPC9wPicpCisKKyAgICBkZWYgdGVzdF9vdXRfb2ZfcmFuZ2VfZW50aXR5KHNlbGYpOgorICAgICAgICBleHBlY3QgPSB1IlxOe1JFUExBQ0VNRU5UIENIQVJBQ1RFUn0iCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiJiMxMDAwMDAwMDAwMDAwMDsiLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiJiN4MTAwMDAwMDAwMDAwMDA7IiwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIiYjMTAwMDAwMDAwMDsiLCBleHBlY3QpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgIk1vc3RseSB0byBwcmV2ZW50IGEgcmVjdXJyZW5jZSBvZiBhIGJ1ZyBpbiB0aGUgaHRtbDVsaWIgdHJlZWJ1aWxkZXIuIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8aHRtbD48aDI+XG5mb288L2gyPjxwPjwvcD48L2h0bWw+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgicCIsIHNvdXAuaDIuc3RyaW5nLm5leHRfZWxlbWVudC5uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJwIiwgc291cC5wLm5hbWUpCisKKyAgICBkZWYgdGVzdF9iYXNpY19uYW1lc3BhY2VzKHNlbGYpOgorICAgICAgICAiIiJQYXJzZXJzIGRvbid0IG5lZWQgdG8gKnVuZGVyc3RhbmQqIG5hbWVzcGFjZXMsIGJ1dCBhdCB0aGUKKyAgICAgICAgdmVyeSBsZWFzdCB0aGV5IHNob3VsZCBub3QgY2hva2Ugb24gbmFtZXNwYWNlcyBvciBsb3NlCisgICAgICAgIGRhdGEuIiIiCisKKyAgICAgICAgbWFya3VwID0gYic8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sbnM6bWF0aG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48aGVhZD48L2hlYWQ+PGJvZHk+PG1hdGhtbDptc3FydD40PC9tYXRobWw6bXNxcnQ+PGIgc3ZnOmZpbGw9InJlZCI+PC9iPjwvYm9keT48L2h0bWw+JworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXJrdXAsIHNvdXAuZW5jb2RlKCkpCisgICAgICAgIGh0bWwgPSBzb3VwLmh0bWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsIHNvdXAuaHRtbFsneG1sbnMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJywgc291cC5odG1sWyd4bWxuczptYXRobWwnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIHNvdXAuaHRtbFsneG1sbnM6c3ZnJ10pCisKKyAgICBkZWYgdGVzdF9tdWx0aXZhbHVlZF9hdHRyaWJ1dGVfdmFsdWVfYmVjb21lc19saXN0KHNlbGYpOgorICAgICAgICBtYXJrdXAgPSBiJzxhIGNsYXNzPSJmb28gYmFyIj4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsnZm9vJywgJ2JhciddLCBzb3VwLmFbJ2NsYXNzJ10pCisKKyAgICAjCisgICAgIyBHZW5lcmFsbHkgc3BlYWtpbmcsIHRlc3RzIGJlbG93IHRoaXMgcG9pbnQgYXJlIG1vcmUgdGVzdHMgb2YKKyAgICAjIEJlYXV0aWZ1bCBTb3VwIHRoYW4gdGVzdHMgb2YgdGhlIHRyZWUgYnVpbGRlcnMuIEJ1dCBwYXJzZXJzIGFyZQorICAgICMgd2VpcmQsIHNvIHdlIHJ1biB0aGVzZSB0ZXN0cyBzZXBhcmF0ZWx5IGZvciBldmVyeSB0cmVlIGJ1aWxkZXIKKyAgICAjIHRvIGRldGVjdCBhbnkgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtLgorICAgICMKKworICAgIGRlZiB0ZXN0X2Nhbl9wYXJzZV91bmljb2RlX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAjIEEgc2VlbWluZ2x5IGlubm9jdW91cyBkb2N1bWVudC4uLiBidXQgaXQncyBpbiBVbmljb2RlISBBbmQKKyAgICAgICAgIyBpdCBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgcmVwcmVzZW50ZWQgaW4gdGhlCisgICAgICAgICMgZW5jb2RpbmcgZm91bmQgaW4gdGhlICBkZWNsYXJhdGlvbiEgVGhlIGhvcnJvciEKKyAgICAgICAgbWFya3VwID0gdSc8aHRtbD48aGVhZD48bWV0YSBlbmNvZGluZz0iZXVjLWpwIj48L2hlYWQ+PGJvZHk+U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhPC9ib2R5PicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdTYWNyXHhlOSBibGV1IScsIHNvdXAuYm9keS5zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9zb3Vwc3RyYWluZXIoc2VsZik6CisgICAgICAgICIiIlBhcnNlcnMgc2hvdWxkIGJlIGFibGUgdG8gd29yayB3aXRoIFNvdXBTdHJhaW5lcnMuIiIiCisgICAgICAgIHN0cmFpbmVyID0gU291cFN0cmFpbmVyKCJiIikKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiQSA8Yj5ib2xkPC9iPiA8bWV0YS8+IDxpPnN0YXRlbWVudDwvaT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX29ubHk9c3RyYWluZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5kZWNvZGUoKSwgIjxiPmJvbGQ8L2I+IikKKworICAgIGRlZiB0ZXN0X3NpbmdsZV9xdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX2JlY29tZV9kb3VibGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxmb28gYXR0cj0nYmFyJz48L2Zvbz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxmb28gYXR0cj0iYmFyIj48L2Zvbz4nKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX3ZhbHVlc193aXRoX25lc3RlZF9xdW90ZXNfYXJlX2xlZnRfYWxvbmUoc2VsZik6CisgICAgICAgIHRleHQgPSAiIiI8Zm9vIGF0dHI9J2JhciAiYnJhd2xzIiBoYXBwZW4nPmE8L2Zvbz4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKHRleHQpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfdmFsdWVzX3dpdGhfZG91YmxlX25lc3RlZF9xdW90ZXNfZ2V0X3F1b3RlZChzZWxmKToKKyAgICAgICAgdGV4dCA9ICIiIjxmb28gYXR0cj0nYmFyICJicmF3bHMiIGhhcHBlbic+YTwvZm9vPiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHRleHQpCisgICAgICAgIHNvdXAuZm9vWydhdHRyJ10gPSAnQnJhd2xzIGhhcHBlbiBhdCAiQm9iXCdzIEJhciInCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygKKyAgICAgICAgICAgIHNvdXAuZm9vLmRlY29kZSgpLAorICAgICAgICAgICAgIiIiPGZvbyBhdHRyPSJCcmF3bHMgaGFwcGVuIGF0ICZxdW90O0JvYlwncyBCYXImcXVvdDsiPmE8L2Zvbz4iIiIpCisKKyAgICBkZWYgdGVzdF9hbXBlcnNhbmRfaW5fYXR0cmlidXRlX3ZhbHVlX2dldHNfZXNjYXBlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKCc8dGhpcyBpcz0icmVhbGx5IG1lc3NlZCB1cCAmIHN0dWZmIj48L3RoaXM+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8dGhpcyBpcz0icmVhbGx5IG1lc3NlZCB1cCAmYW1wOyBzdHVmZiI+PC90aGlzPicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKAorICAgICAgICAgICAgJzxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZz9hPTEmYj0yOzMiPmZvbzwvYT4nLAorICAgICAgICAgICAgJzxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZz9hPTEmYW1wO2I9MjszIj5mb288L2E+JykKKworICAgIGRlZiB0ZXN0X2VzY2FwZWRfYW1wZXJzYW5kX2luX2F0dHJpYnV0ZV92YWx1ZV9pc19sZWZ0X2Fsb25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoJzxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZz9hPTEmYW1wO2I9MjszIj48L2E+JykKKworICAgIGRlZiB0ZXN0X2VudGl0aWVzX2luX3N0cmluZ3NfY29udmVydGVkX2R1cmluZ19wYXJzaW5nKHNlbGYpOgorICAgICAgICAjIEJvdGggWE1MIGFuZCBIVE1MIGVudGl0aWVzIGFyZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSBjaGFyYWN0ZXJzCisgICAgICAgICMgZHVyaW5nIHBhcnNpbmcuCisgICAgICAgIHRleHQgPSAiPHA+Jmx0OyZsdDtzYWNyJmVhY3V0ZTsmIzMyO2JsZXUhJmd0OyZndDs8L3A+IgorICAgICAgICBleHBlY3RlZCA9IHUiPHA+Jmx0OyZsdDtzYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSEmZ3Q7Jmd0OzwvcD4iCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscyh0ZXh0LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3NtYXJ0X3F1b3Rlc19jb252ZXJ0ZWRfb25fdGhlX3dheV9pbihzZWxmKToKKyAgICAgICAgIyBNaWNyb3NvZnQgc21hcnQgcXVvdGVzIGFyZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSBjaGFyYWN0ZXJzIGR1cmluZworICAgICAgICAjIHBhcnNpbmcuCisgICAgICAgIHF1b3RlID0gYiI8cD5ceDkxRm9vXHg5MjwvcD4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAocXVvdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLnAuc3RyaW5nLAorICAgICAgICAgICAgdSJcTntMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSS31Gb29cTntSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUkt9IikKKworICAgIGRlZiB0ZXN0X25vbl9icmVha2luZ19zcGFjZXNfY29udmVydGVkX29uX3RoZV93YXlfaW4oc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPiZuYnNwOyZuYnNwOzwvYT4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5zdHJpbmcsIHUiXE57Tk8tQlJFQUsgU1BBQ0V9IiAqIDIpCisKKyAgICBkZWYgdGVzdF9lbnRpdGllc19jb252ZXJ0ZWRfb25fdGhlX3dheV9vdXQoc2VsZik6CisgICAgICAgIHRleHQgPSAiPHA+Jmx0OyZsdDtzYWNyJmVhY3V0ZTsmIzMyO2JsZXUhJmd0OyZndDs8L3A+IgorICAgICAgICBleHBlY3RlZCA9IHUiPHA+Jmx0OyZsdDtzYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSEmZ3Q7Jmd0OzwvcD4iLmVuY29kZSgidXRmLTgiKQorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5wLmVuY29kZSgidXRmLTgiKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9yZWFsX2lzb19sYXRpbl9kb2N1bWVudChzZWxmKToKKyAgICAgICAgIyBTbW9rZSB0ZXN0IG9mIGludGVycmVsYXRlZCBmdW5jdGlvbmFsaXR5LCB1c2luZyBhbgorICAgICAgICAjIGVhc3ktdG8tdW5kZXJzdGFuZCBkb2N1bWVudC4KKworICAgICAgICAjIEhlcmUgaXQgaXMgaW4gVW5pY29kZS4gTm90ZSB0aGF0IGl0IGNsYWltcyB0byBiZSBpbiBJU08tTGF0aW4tMS4KKyAgICAgICAgdW5pY29kZV9odG1sID0gdSc8aHRtbD48aGVhZD48bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLUxhdGluLTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtdHlwZSIvPjwvaGVhZD48Ym9keT48cD5TYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSE8L3A+PC9ib2R5PjwvaHRtbD4nCisKKyAgICAgICAgIyBUaGF0J3MgYmVjYXVzZSB3ZSdyZSBnb2luZyB0byBlbmNvZGUgaXQgaW50byBJU08tTGF0aW4tMSwgYW5kIHVzZQorICAgICAgICAjIHRoYXQgdG8gdGVzdC4KKyAgICAgICAgaXNvX2xhdGluX2h0bWwgPSB1bmljb2RlX2h0bWwuZW5jb2RlKCJpc28tODg1OS0xIikKKworICAgICAgICAjIFBhcnNlIHRoZSBJU08tTGF0aW4tMSBIVE1MLgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGlzb19sYXRpbl9odG1sKQorICAgICAgICAjIEVuY29kZSBpdCB0byBVVEYtOC4KKyAgICAgICAgcmVzdWx0ID0gc291cC5lbmNvZGUoInV0Zi04IikKKworICAgICAgICAjIFdoYXQgZG8gd2UgZXhwZWN0IHRoZSByZXN1bHQgdG8gbG9vayBsaWtlPyBXZWxsLCBpdCB3b3VsZAorICAgICAgICAjIGxvb2sgbGlrZSB1bmljb2RlX2h0bWwsIGV4Y2VwdCB0aGF0IHRoZSBNRVRBIHRhZyB3b3VsZCBzYXkKKyAgICAgICAgIyBVVEYtOCBpbnN0ZWFkIG9mIElTTy1MYXRpbi0xLgorICAgICAgICBleHBlY3RlZCA9IHVuaWNvZGVfaHRtbC5yZXBsYWNlKCJJU08tTGF0aW4tMSIsICJ1dGYtOCIpCisKKyAgICAgICAgIyBBbmQsIG9mIGNvdXJzZSwgaXQgd291bGQgYmUgaW4gVVRGLTgsIG5vdCBVbmljb2RlLgorICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkLmVuY29kZSgidXRmLTgiKQorCisgICAgICAgICMgVGEtZGEhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3JlYWxfc2hpZnRfamlzX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAjIFNtb2tlIHRlc3QgdG8gbWFrZSBzdXJlIHRoZSBwYXJzZXIgY2FuIGhhbmRsZSBhIGRvY3VtZW50IGluCisgICAgICAgICMgU2hpZnQtSklTIGVuY29kaW5nLCB3aXRob3V0IGNob2tpbmcuCisgICAgICAgIHNoaWZ0X2ppc19odG1sID0gKAorICAgICAgICAgICAgYic8aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+PHByZT4nCisgICAgICAgICAgICBiJ1x4ODJceGIxXHg4Mlx4ZWFceDgyXHhjZFNoaWZ0LUpJU1x4ODJceGM1XHg4M1JceDgxW1x4ODNmJworICAgICAgICAgICAgYidceDgzQlx4ODNceDkzXHg4M09ceDgyXHhiM1x4ODJceGVhXHg4Mlx4YmRceDkzXHhmYVx4OTZ7XHg4YycKKyAgICAgICAgICAgIGInXHhlYVx4ODJceGNjXHg4M3RceDgzQFx4ODNDXHg4M1x4OGJceDgyXHhjNVx4ODJceGI3XHg4MUInCisgICAgICAgICAgICBiJzwvcHJlPjwvYm9keT48L2h0bWw+JykKKyAgICAgICAgdW5pY29kZV9odG1sID0gc2hpZnRfamlzX2h0bWwuZGVjb2RlKCJzaGlmdC1qaXMiKQorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHVuaWNvZGVfaHRtbCkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcGFyc2UgdHJlZSBpcyBjb3JyZWN0bHkgZW5jb2RlZCB0byB2YXJpb3VzCisgICAgICAgICMgZW5jb2RpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZW5jb2RlKCJ1dGYtOCIpLCB1bmljb2RlX2h0bWwuZW5jb2RlKCJ1dGYtOCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZW5jb2RlKCJldWNfanAiKSwgdW5pY29kZV9odG1sLmVuY29kZSgiZXVjX2pwIikpCisKKyAgICBkZWYgdGVzdF9yZWFsX2hlYnJld19kb2N1bWVudChzZWxmKToKKyAgICAgICAgIyBBIHJlYWwtd29ybGQgdGVzdCB0byBtYWtlIHN1cmUgd2UgY2FuIGNvbnZlcnQgSVNPLTg4NTktOSAoYQorICAgICAgICAjIEhlYnJldyBlbmNvZGluZykgdG8gVVRGLTguCisgICAgICAgIGhlYnJld19kb2N1bWVudCA9IGInPGh0bWw+PGhlYWQ+PHRpdGxlPkhlYnJldyAoSVNPIDg4NTktOCkgaW4gVmlzdWFsIERpcmVjdGlvbmFsaXR5PC90aXRsZT48L2hlYWQ+PGJvZHk+PGgxPkhlYnJldyAoSVNPIDg4NTktOCkgaW4gVmlzdWFsIERpcmVjdGlvbmFsaXR5PC9oMT5ceGVkXHhlNVx4ZWNceGY5PC9ib2R5PjwvaHRtbD4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoCisgICAgICAgICAgICBoZWJyZXdfZG9jdW1lbnQsIGZyb21fZW5jb2Rpbmc9Imlzbzg4NTktOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5vcmlnaW5hbF9lbmNvZGluZywgJ2lzbzg4NTktOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgIGhlYnJld19kb2N1bWVudC5kZWNvZGUoImlzbzg4NTktOCIpLmVuY29kZSgidXRmLTgiKSkKKworICAgIGRlZiB0ZXN0X21ldGFfdGFnX3JlZmxlY3RzX2N1cnJlbnRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICMgSGVyZSdzIHRoZSA8bWV0YT4gdGFnIHNheWluZyB0aGF0IGEgZG9jdW1lbnQgaXMKKyAgICAgICAgIyBlbmNvZGVkIGluIFNoaWZ0LUpJUy4KKyAgICAgICAgbWV0YV90YWcgPSAoJzxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD14LXNqaXMiICcKKyAgICAgICAgICAgICAgICAgICAgJ2h0dHAtZXF1aXY9IkNvbnRlbnQtdHlwZSIvPicpCisKKyAgICAgICAgIyBIZXJlJ3MgYSBkb2N1bWVudCBpbmNvcnBvcmF0aW5nIHRoYXQgbWV0YSB0YWcuCisgICAgICAgIHNoaWZ0X2ppc19odG1sID0gKAorICAgICAgICAgICAgJzxodG1sPjxoZWFkPlxuJXNcbicKKyAgICAgICAgICAgICc8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LWxhbmd1YWdlIiBjb250ZW50PSJqYSIvPicKKyAgICAgICAgICAgICc8L2hlYWQ+PGJvZHk+U2hpZnQtSklTIG1hcmt1cCBnb2VzIGhlcmUuJykgJSBtZXRhX3RhZworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHNoaWZ0X2ppc19odG1sKQorCisgICAgICAgICMgUGFyc2UgdGhlIGRvY3VtZW50LCBhbmQgdGhlIGNoYXJzZXQgaXMgc2VlbWluZ2x5IHVuYWZmZWN0ZWQuCisgICAgICAgIHBhcnNlZF9tZXRhID0gc291cC5maW5kKCdtZXRhJywgeydodHRwLWVxdWl2JzogJ0NvbnRlbnQtdHlwZSd9KQorICAgICAgICBjb250ZW50ID0gcGFyc2VkX21ldGFbJ2NvbnRlbnQnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd0ZXh0L2h0bWw7IGNoYXJzZXQ9eC1zamlzJywgY29udGVudCkKKworICAgICAgICAjIEJ1dCB0aGF0IHZhbHVlIGlzIGFjdHVhbGx5IGEgQ29udGVudE1ldGFBdHRyaWJ1dGVWYWx1ZSBvYmplY3QuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGNvbnRlbnQsIENvbnRlbnRNZXRhQXR0cmlidXRlVmFsdWUpKQorCisgICAgICAgICMgQW5kIGl0IHdpbGwgdGFrZSBvbiBhIHZhbHVlIHRoYXQgcmVmbGVjdHMgaXRzIGN1cnJlbnQKKyAgICAgICAgIyBlbmNvZGluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgndGV4dC9odG1sOyBjaGFyc2V0PXV0ZjgnLCBjb250ZW50LmVuY29kZSgidXRmOCIpKQorCisgICAgICAgICMgRm9yIHRoZSByZXN0IG9mIHRoZSBzdG9yeSwgc2VlIFRlc3RTdWJzdGl0dXRpb25zIGluCisgICAgICAgICMgdGVzdF90cmVlLnB5LgorCisgICAgZGVmIHRlc3RfaHRtbDVfc3R5bGVfbWV0YV90YWdfcmVmbGVjdHNfY3VycmVudF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIyBIZXJlJ3MgdGhlIDxtZXRhPiB0YWcgc2F5aW5nIHRoYXQgYSBkb2N1bWVudCBpcworICAgICAgICAjIGVuY29kZWQgaW4gU2hpZnQtSklTLgorICAgICAgICBtZXRhX3RhZyA9ICgnPG1ldGEgaWQ9ImVuY29kaW5nIiBjaGFyc2V0PSJ4LXNqaXMiIC8+JykKKworICAgICAgICAjIEhlcmUncyBhIGRvY3VtZW50IGluY29ycG9yYXRpbmcgdGhhdCBtZXRhIHRhZy4KKyAgICAgICAgc2hpZnRfamlzX2h0bWwgPSAoCisgICAgICAgICAgICAnPGh0bWw+PGhlYWQ+XG4lc1xuJworICAgICAgICAgICAgJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtbGFuZ3VhZ2UiIGNvbnRlbnQ9ImphIi8+JworICAgICAgICAgICAgJzwvaGVhZD48Ym9keT5TaGlmdC1KSVMgbWFya3VwIGdvZXMgaGVyZS4nKSAlIG1ldGFfdGFnCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoc2hpZnRfamlzX2h0bWwpCisKKyAgICAgICAgIyBQYXJzZSB0aGUgZG9jdW1lbnQsIGFuZCB0aGUgY2hhcnNldCBpcyBzZWVtaW5nbHkgdW5hZmZlY3RlZC4KKyAgICAgICAgcGFyc2VkX21ldGEgPSBzb3VwLmZpbmQoJ21ldGEnLCBpZD0iZW5jb2RpbmciKQorICAgICAgICBjaGFyc2V0ID0gcGFyc2VkX21ldGFbJ2NoYXJzZXQnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd4LXNqaXMnLCBjaGFyc2V0KQorCisgICAgICAgICMgQnV0IHRoYXQgdmFsdWUgaXMgYWN0dWFsbHkgYSBDaGFyc2V0TWV0YUF0dHJpYnV0ZVZhbHVlIG9iamVjdC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY2hhcnNldCwgQ2hhcnNldE1ldGFBdHRyaWJ1dGVWYWx1ZSkpCisKKyAgICAgICAgIyBBbmQgaXQgd2lsbCB0YWtlIG9uIGEgdmFsdWUgdGhhdCByZWZsZWN0cyBpdHMgY3VycmVudAorICAgICAgICAjIGVuY29kaW5nLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd1dGY4JywgY2hhcnNldC5lbmNvZGUoInV0ZjgiKSkKKworICAgIGRlZiB0ZXN0X3RhZ193aXRoX25vX2F0dHJpYnV0ZXNfY2FuX2hhdmVfYXR0cmlidXRlc19hZGRlZChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuc291cCgiPGE+dGV4dDwvYT4iKQorICAgICAgICBkYXRhLmFbJ2ZvbyddID0gJ2JhcicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnPGEgZm9vPSJiYXIiPnRleHQ8L2E+JywgZGF0YS5hLmRlY29kZSgpKQorCitjbGFzcyBYTUxUcmVlQnVpbGRlclNtb2tlVGVzdChvYmplY3QpOgorCisgICAgZGVmIHRlc3RfZG9jc3RyaW5nX2dlbmVyYXRlZChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPHJvb3QvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmVuY29kZSgpLCBiJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG48cm9vdC8+JykKKworICAgIGRlZiB0ZXN0X3JlYWxfeGh0bWxfZG9jdW1lbnQoc2VsZik6CisgICAgICAgICIiIkEgcmVhbCBYSFRNTCBkb2N1bWVudCBzaG91bGQgY29tZSBvdXQgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIGl0IHdlbnQgaW4uIiIiCisgICAgICAgIG1hcmt1cCA9IGIiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD48dGl0bGU+SGVsbG8uPC90aXRsZT48L2hlYWQ+Cis8Ym9keT5Hb29kYnllLjwvYm9keT4KKzwvaHRtbD4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmVuY29kZSgidXRmLTgiKSwgbWFya3VwKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGVyX3Byb2Nlc3Nlc19zY3JpcHRfdGFnX2Zvcl94bWxfZG9jdW1lbnRzKHNlbGYpOgorICAgICAgICBkb2MgPSAiIiIKKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICA8L3NjcmlwdD4KKyIiIgorICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChkb2MsICJ4bWwiKQorICAgICAgICAjIGx4bWwgd291bGQgaGF2ZSBzdHJpcHBlZCB0aGlzIHdoaWxlIHBhcnNpbmcsIGJ1dCB3ZSBjYW4gYWRkCisgICAgICAgICMgaXQgbGF0ZXIuCisgICAgICAgIHNvdXAuc2NyaXB0LnN0cmluZyA9ICdjb25zb2xlLmxvZygiPCA8IGhleSA+ID4gIik7JworICAgICAgICBlbmNvZGVkID0gc291cC5lbmNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiImbHQ7ICZsdDsgaGV5ICZndDsgJmd0OyIgaW4gZW5jb2RlZCkKKworICAgIGRlZiB0ZXN0X2Nhbl9wYXJzZV91bmljb2RlX2RvY3VtZW50KHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9ImV1Yy1qcCI+PHJvb3Q+U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhPC9yb290PicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdTYWNyXHhlOSBibGV1IScsIHNvdXAucm9vdC5zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9wb3BwaW5nX25hbWVzcGFjZWRfdGFnKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPHJzcyB4bWxuczpkYz0iZm9vIj48ZGM6Y3JlYXRvcj5iPC9kYzpjcmVhdG9yPjxkYzpkYXRlPjIwMTItMDctMDJUMjA6MzM6NDJaPC9kYzpkYXRlPjxkYzpyaWdodHM+YzwvZGM6cmlnaHRzPjxpbWFnZT5kPC9pbWFnZT48L3Jzcz4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdW5pY29kZShzb3VwLnJzcyksIG1hcmt1cCkKKworICAgIGRlZiB0ZXN0X2RvY3N0cmluZ19pbmNsdWRlc19jb3JyZWN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8cm9vdC8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZW5jb2RlKCJsYXRpbjEiKSwKKyAgICAgICAgICAgIGInPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0ibGF0aW4xIj8+XG48cm9vdC8+JykKKworICAgIGRlZiB0ZXN0X2xhcmdlX3htbF9kb2N1bWVudChzZWxmKToKKyAgICAgICAgIiIiQSBsYXJnZSBYTUwgZG9jdW1lbnQgc2hvdWxkIGNvbWUgb3V0IHRoZSBzYW1lIGFzIGl0IHdlbnQgaW4uIiIiCisgICAgICAgIG1hcmt1cCA9IChiJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG48cm9vdD4nCisgICAgICAgICAgICAgICAgICArIGInMCcgKiAoMioqMTIpCisgICAgICAgICAgICAgICAgICArIGInPC9yb290PicpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZW5jb2RlKCJ1dGYtOCIpLCBtYXJrdXApCisKKworICAgIGRlZiB0ZXN0X3RhZ3NfYXJlX2VtcHR5X2VsZW1lbnRfaWZfYW5kX29ubHlfaWZfdGhleV9hcmVfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygiPHA+IiwgIjxwLz4iKQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoIjxwPmZvbzwvcD4iKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlc19hcmVfcHJlc2VydmVkKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPHJvb3QgeG1sbnM6YT0iaHR0cDovL2V4YW1wbGUuY29tLyIgeG1sbnM6Yj0iaHR0cDovL2V4YW1wbGUubmV0LyI+PGE6Zm9vPlRoaXMgdGFnIGlzIGluIHRoZSBhIG5hbWVzcGFjZTwvYTpmb28+PGI6Zm9vPlRoaXMgdGFnIGlzIGluIHRoZSBiIG5hbWVzcGFjZTwvYjpmb28+PC9yb290PicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHJvb3QgPSBzb3VwLnJvb3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiaHR0cDovL2V4YW1wbGUuY29tLyIsIHJvb3RbJ3htbG5zOmEnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiaHR0cDovL2V4YW1wbGUubmV0LyIsIHJvb3RbJ3htbG5zOmInXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NpbmdfbmFtZXNwYWNlZF90YWcoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8cCB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPjxkYzpkYXRlPjIwMDEwNTA0PC9kYzpkYXRlPjwvcD4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoc291cC5wKSwgbWFya3VwKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlZF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPGZvbyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj48YmFyIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSIvPjwvZm9vPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShzb3VwLmZvbyksIG1hcmt1cCkKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZWRfYXR0cmlidXRlc194bWxfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPGZvbyB4bWw6bGFuZz0iZnIiPmJhcjwvZm9vPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShzb3VwLmZvbyksIG1hcmt1cCkKKworY2xhc3MgSFRNTDVUcmVlQnVpbGRlclNtb2tlVGVzdChIVE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3QpOgorICAgICIiIlNtb2tlIHRlc3QgZm9yIGEgdHJlZSBidWlsZGVyIHRoYXQgc3VwcG9ydHMgSFRNTDUuIiIiCisKKyAgICBkZWYgdGVzdF9yZWFsX3hodG1sX2RvY3VtZW50KHNlbGYpOgorICAgICAgICAjIFNpbmNlIFhIVE1MIGlzIG5vdCBIVE1MNSwgSFRNTDUgcGFyc2VycyBhcmUgbm90IHRlc3RlZCB0byBoYW5kbGUKKyAgICAgICAgIyBYSFRNTCBkb2N1bWVudHMgaW4gYW55IHBhcnRpY3VsYXIgd2F5LgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9odG1sX3RhZ3NfaGF2ZV9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICI8YT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgc291cC5hLm5hbWVzcGFjZSkKKworICAgIGRlZiB0ZXN0X3N2Z190YWdzX2hhdmVfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPHN2Zz48Y2lyY2xlLz48L3N2Zz4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBuYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLCBzb3VwLnN2Zy5uYW1lc3BhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLCBzb3VwLmNpcmNsZS5uYW1lc3BhY2UpCisKKworICAgIGRlZiB0ZXN0X21hdGhtbF90YWdzX2hhdmVfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPG1hdGg+PG1zcXJ0PjU8L21zcXJ0PjwvbWF0aD4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBuYW1lc3BhY2UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lc3BhY2UsIHNvdXAubWF0aC5uYW1lc3BhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlLCBzb3VwLm1zcXJ0Lm5hbWVzcGFjZSkKKworICAgIGRlZiB0ZXN0X3htbF9kZWNsYXJhdGlvbl9iZWNvbWVzX2NvbW1lbnQoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxodG1sPjwvaHRtbD4nCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzb3VwLmNvbnRlbnRzWzBdLCBDb21tZW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmNvbnRlbnRzWzBdLCAnP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiaHRtbCIsIHNvdXAuY29udGVudHNbMF0ubmV4dF9lbGVtZW50Lm5hbWUpCisKK2RlZiBza2lwSWYoY29uZGl0aW9uLCByZWFzb24pOgorICAgZGVmIG5vdGhpbmcodGVzdCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICByZXR1cm4gTm9uZQorCisgICBkZWYgZGVjb3JhdG9yKHRlc3RfaXRlbSk6CisgICAgICAgaWYgY29uZGl0aW9uOgorICAgICAgICAgICByZXR1cm4gbm90aGluZworICAgICAgIGVsc2U6CisgICAgICAgICAgIHJldHVybiB0ZXN0X2l0ZW0KKworICAgcmV0dXJuIGRlY29yYXRvcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RzL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvYnM0L3Rlc3RzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MmM4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIlRoZSBiZWF1dGlmdWxzb3VwIHRlc3RzLiIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2J1aWxkZXJfcmVnaXN0cnkucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9idWlsZGVyX3JlZ2lzdHJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWQxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9idWlsZGVyX3JlZ2lzdHJ5LnB5CkBAIC0wLDAgKzEsMTQxIEBACisiIiJUZXN0cyBvZiB0aGUgYnVpbGRlciByZWdpc3RyeS4iIiIKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gYnM0IGltcG9ydCBCZWF1dGlmdWxTb3VwCitmcm9tIGJzNC5idWlsZGVyIGltcG9ydCAoCisgICAgYnVpbGRlcl9yZWdpc3RyeSBhcyByZWdpc3RyeSwKKyAgICBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIsCisgICAgVHJlZUJ1aWxkZXJSZWdpc3RyeSwKKykKKwordHJ5OgorICAgIGZyb20gYnM0LmJ1aWxkZXIgaW1wb3J0IEhUTUw1VHJlZUJ1aWxkZXIKKyAgICBIVE1MNUxJQl9QUkVTRU5UID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIEhUTUw1TElCX1BSRVNFTlQgPSBGYWxzZQorCit0cnk6CisgICAgZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgKAorICAgICAgICBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwsCisgICAgICAgIExYTUxUcmVlQnVpbGRlciwKKyAgICAgICAgKQorICAgIExYTUxfUFJFU0VOVCA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBMWE1MX1BSRVNFTlQgPSBGYWxzZQorCisKK2NsYXNzIEJ1aWx0SW5SZWdpc3RyeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGJ1aWx0LWluIHJlZ2lzdHJ5IHdpdGggdGhlIGRlZmF1bHQgYnVpbGRlcnMgcmVnaXN0ZXJlZC4iIiIKKworICAgIGRlZiB0ZXN0X2NvbWJpbmF0aW9uKHNlbGYpOgorICAgICAgICBpZiBMWE1MX1BSRVNFTlQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnZmFzdCcsICdodG1sJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExYTUxUcmVlQnVpbGRlcikKKworICAgICAgICBpZiBMWE1MX1BSRVNFTlQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgncGVybWlzc2l2ZScsICd4bWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFhNTFRyZWVCdWlsZGVyRm9yWE1MKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnc3RyaWN0JywgJ2h0bWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFBhcnNlclRyZWVCdWlsZGVyKQorICAgICAgICBpZiBIVE1MNUxJQl9QUkVTRU5UOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWdpc3RyeS5sb29rdXAoJ2h0bWw1bGliJywgJ2h0bWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUw1VHJlZUJ1aWxkZXIpCisKKyAgICBkZWYgdGVzdF9sb29rdXBfYnlfbWFya3VwX3R5cGUoc2VsZik6CisgICAgICAgIGlmIExYTUxfUFJFU0VOVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCdodG1sJyksIExYTUxUcmVlQnVpbGRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVnaXN0cnkubG9va3VwKCd4bWwnKSwgTFhNTFRyZWVCdWlsZGVyRm9yWE1MKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWdpc3RyeS5sb29rdXAoJ3htbCcpLCBOb25lKQorICAgICAgICAgICAgaWYgSFRNTDVMSUJfUFJFU0VOVDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnaHRtbCcpLCBIVE1MNVRyZWVCdWlsZGVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnaHRtbCcpLCBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIpCisKKyAgICBkZWYgdGVzdF9uYW1lZF9saWJyYXJ5KHNlbGYpOgorICAgICAgICBpZiBMWE1MX1BSRVNFTlQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnbHhtbCcsICd4bWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFhNTFRyZWVCdWlsZGVyRm9yWE1MKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWdpc3RyeS5sb29rdXAoJ2x4bWwnLCAnaHRtbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMWE1MVHJlZUJ1aWxkZXIpCisgICAgICAgIGlmIEhUTUw1TElCX1BSRVNFTlQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZ2lzdHJ5Lmxvb2t1cCgnaHRtbDVsaWInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUw1VHJlZUJ1aWxkZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWdpc3RyeS5sb29rdXAoJ2h0bWwucGFyc2VyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxQYXJzZXJUcmVlQnVpbGRlcikKKworICAgIGRlZiB0ZXN0X2JlYXV0aWZ1bHNvdXBfY29uc3RydWN0b3JfZG9lc19sb29rdXAoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBwYXNzIGluIGEgc3RyaW5nLgorICAgICAgICBCZWF1dGlmdWxTb3VwKCIiLCBmZWF0dXJlcz0iaHRtbCIpCisgICAgICAgICMgT3IgYSBsaXN0IG9mIHN0cmluZ3MuCisgICAgICAgIEJlYXV0aWZ1bFNvdXAoIiIsIGZlYXR1cmVzPVsiaHRtbCIsICJmYXN0Il0pCisKKyAgICAgICAgIyBZb3UnbGwgZ2V0IGFuIGV4Y2VwdGlvbiBpZiBCUyBjYW4ndCBmaW5kIGFuIGFwcHJvcHJpYXRlCisgICAgICAgICMgYnVpbGRlci4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgQmVhdXRpZnVsU291cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIGZlYXR1cmVzPSJuby1zdWNoLWZlYXR1cmUiKQorCitjbGFzcyBSZWdpc3RyeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIFRyZWVCdWlsZGVyUmVnaXN0cnkgY2xhc3MgaW4gZ2VuZXJhbC4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yZWdpc3RyeSA9IFRyZWVCdWlsZGVyUmVnaXN0cnkoKQorCisgICAgZGVmIGJ1aWxkZXJfZm9yX2ZlYXR1cmVzKHNlbGYsICpmZWF0dXJlX2xpc3QpOgorICAgICAgICBjbHMgPSB0eXBlKCdCdWlsZGVyXycgKyAnXycuam9pbihmZWF0dXJlX2xpc3QpLAorICAgICAgICAgICAgICAgICAgIChvYmplY3QsKSwgeydmZWF0dXJlcycgOiBmZWF0dXJlX2xpc3R9KQorCisgICAgICAgIHNlbGYucmVnaXN0cnkucmVnaXN0ZXIoY2xzKQorICAgICAgICByZXR1cm4gY2xzCisKKyAgICBkZWYgdGVzdF9yZWdpc3Rlcl93aXRoX25vX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICBidWlsZGVyID0gc2VsZi5idWlsZGVyX2Zvcl9mZWF0dXJlcygpCisKKyAgICAgICAgIyBTaW5jZSB0aGUgYnVpbGRlciBhZHZlcnRpc2VzIG5vIGZlYXR1cmVzLCB5b3UgY2FuJ3QgZmluZCBpdAorICAgICAgICAjIGJ5IGxvb2tpbmcgdXAgZmVhdHVyZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWdpc3RyeS5sb29rdXAoJ2ZvbycpLCBOb25lKQorCisgICAgICAgICMgQnV0IHlvdSBjYW4gZmluZCBpdCBieSBkb2luZyBhIGxvb2t1cCB3aXRoIG5vIGZlYXR1cmVzLCBpZgorICAgICAgICAjIHRoaXMgaGFwcGVucyB0byBiZSB0aGUgb25seSByZWdpc3RlcmVkIGJ1aWxkZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWdpc3RyeS5sb29rdXAoKSwgYnVpbGRlcikKKworICAgIGRlZiB0ZXN0X3JlZ2lzdGVyX3dpdGhfZmVhdHVyZXNfbWFrZXNfbG9va3VwX3N1Y2NlZWQoc2VsZik6CisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgnZm9vJyksIGJ1aWxkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWdpc3RyeS5sb29rdXAoJ2JhcicpLCBidWlsZGVyKQorCisgICAgZGVmIHRlc3RfbG9va3VwX2ZhaWxzX3doZW5fbm9fYnVpbGRlcl9pbXBsZW1lbnRzX2ZlYXR1cmUoc2VsZik6CisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgnYmF6JyksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9sb29rdXBfZ2V0c19tb3N0X3JlY2VudF9yZWdpc3RyYXRpb25fd2hlbl9ub19mZWF0dXJlX3NwZWNpZmllZChzZWxmKToKKyAgICAgICAgYnVpbGRlcjEgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nKQorICAgICAgICBidWlsZGVyMiA9IHNlbGYuYnVpbGRlcl9mb3JfZmVhdHVyZXMoJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWdpc3RyeS5sb29rdXAoKSwgYnVpbGRlcjIpCisKKyAgICBkZWYgdGVzdF9sb29rdXBfZmFpbHNfd2hlbl9ub190cmVlX2J1aWxkZXJzX3JlZ2lzdGVyZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWdpc3RyeS5sb29rdXAoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2xvb2t1cF9nZXRzX21vc3RfcmVjZW50X2J1aWxkZXJfc3VwcG9ydGluZ19hbGxfZmVhdHVyZXMoc2VsZik6CisgICAgICAgIGhhc19vbmUgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nKQorICAgICAgICBoYXNfdGhlX290aGVyID0gc2VsZi5idWlsZGVyX2Zvcl9mZWF0dXJlcygnYmFyJykKKyAgICAgICAgaGFzX2JvdGhfZWFybHkgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nLCAnYmFyJywgJ2JheicpCisgICAgICAgIGhhc19ib3RoX2xhdGUgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nLCAnYmFyJywgJ3F1dXgnKQorICAgICAgICBsYWNrc19vbmUgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdiYXInKQorICAgICAgICBoYXNfdGhlX290aGVyID0gc2VsZi5idWlsZGVyX2Zvcl9mZWF0dXJlcygnZm9vJykKKworICAgICAgICAjIFRoZXJlIGFyZSB0d28gYnVpbGRlcnMgZmVhdHVyaW5nICdmb28nIGFuZCAnYmFyJywgYnV0CisgICAgICAgICMgdGhlIG9uZSB0aGF0IGFsc28gZmVhdHVyZXMgJ3F1dXgnIHdhcyByZWdpc3RlcmVkIGxhdGVyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVnaXN0cnkubG9va3VwKCdmb28nLCAnYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19ib3RoX2xhdGUpCisKKyAgICAgICAgIyBUaGVyZSBpcyBvbmx5IG9uZSBidWlsZGVyIGZlYXR1cmluZyAnZm9vJywgJ2JhcicsIGFuZCAnYmF6Jy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgnZm9vJywgJ2JhcicsICdiYXonKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2JvdGhfZWFybHkpCisKKyAgICBkZWYgdGVzdF9sb29rdXBfZmFpbHNfd2hlbl9jYW5ub3RfcmVjb25jaWxlX3JlcXVlc3RlZF9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgYnVpbGRlcjEgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nLCAnYmFyJykKKyAgICAgICAgYnVpbGRlcjIgPSBzZWxmLmJ1aWxkZXJfZm9yX2ZlYXR1cmVzKCdmb28nLCAnYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlZ2lzdHJ5Lmxvb2t1cCgnYmFyJywgJ2JheicpLCBOb25lKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfZG9jcy5weSBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2RvY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5ZjY3NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2RvY3MucHkKQEAgLTAsMCArMSwzNiBAQAorIlRlc3QgaGFybmVzcyBmb3IgZG9jdGVzdHMuIgorCisjIHB5bGludDogZGlzYWJsZS1tc2c9RTA2MTEsVzAxNDIKKworX19tZXRhY2xhc3NfXyA9IHR5cGUKK19fYWxsX18gPSBbCisgICAgJ2FkZGl0aW9uYWxfdGVzdHMnLAorICAgIF0KKworaW1wb3J0IGF0ZXhpdAoraW1wb3J0IGRvY3Rlc3QKK2ltcG9ydCBvcworI2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAorIyAgICByZXNvdXJjZV9maWxlbmFtZSwgcmVzb3VyY2VfZXhpc3RzLCByZXNvdXJjZV9saXN0ZGlyLCBjbGVhbnVwX3Jlc291cmNlcykKK2ltcG9ydCB1bml0dGVzdAorCitET0NURVNUX0ZMQUdTID0gKAorICAgIGRvY3Rlc3QuRUxMSVBTSVMgfAorICAgIGRvY3Rlc3QuTk9STUFMSVpFX1dISVRFU1BBQ0UgfAorICAgIGRvY3Rlc3QuUkVQT1JUX05ESUZGKQorCisKKyMgZGVmIGFkZGl0aW9uYWxfdGVzdHMoKToKKyMgICAgICJSdW4gdGhlIGRvYyB0ZXN0cyAoUkVBRE1FLnR4dCBhbmQgZG9jcy8qLCBpZiBhbnkgZXhpc3QpIgorIyAgICAgZG9jdGVzdF9maWxlcyA9IFsKKyMgICAgICAgICBvcy5wYXRoLmFic3BhdGgocmVzb3VyY2VfZmlsZW5hbWUoJ2JzNCcsICdSRUFETUUudHh0JykpXQorIyAgICAgaWYgcmVzb3VyY2VfZXhpc3RzKCdiczQnLCAnZG9jcycpOgorIyAgICAgICAgIGZvciBuYW1lIGluIHJlc291cmNlX2xpc3RkaXIoJ2JzNCcsICdkb2NzJyk6CisjICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy50eHQnKToKKyMgICAgICAgICAgICAgICAgIGRvY3Rlc3RfZmlsZXMuYXBwZW5kKAorIyAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aCgKKyMgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfZmlsZW5hbWUoJ2JzNCcsICdkb2NzLyVzJyAlIG5hbWUpKSkKKyMgICAgIGt3YXJncyA9IGRpY3QobW9kdWxlX3JlbGF0aXZlPUZhbHNlLCBvcHRpb25mbGFncz1ET0NURVNUX0ZMQUdTKQorIyAgICAgYXRleGl0LnJlZ2lzdGVyKGNsZWFudXBfcmVzb3VyY2VzKQorIyAgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoCisjICAgICAgICAgZG9jdGVzdC5Eb2NGaWxlU3VpdGUoKmRvY3Rlc3RfZmlsZXMsICoqa3dhcmdzKSkpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9odG1sNWxpYi5weSBiL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2h0bWw1bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NGMzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9odG1sNWxpYi5weQpAQCAtMCwwICsxLDg1IEBACisiIiJUZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIGdlbmVyYXRlcyBnb29kIHRyZWVzLiIiIgorCitpbXBvcnQgd2FybmluZ3MKKwordHJ5OgorICAgIGZyb20gYnM0LmJ1aWxkZXIgaW1wb3J0IEhUTUw1VHJlZUJ1aWxkZXIKKyAgICBIVE1MNUxJQl9QUkVTRU5UID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgIEhUTUw1TElCX1BSRVNFTlQgPSBGYWxzZQorZnJvbSBiczQuZWxlbWVudCBpbXBvcnQgU291cFN0cmFpbmVyCitmcm9tIGJzNC50ZXN0aW5nIGltcG9ydCAoCisgICAgSFRNTDVUcmVlQnVpbGRlclNtb2tlVGVzdCwKKyAgICBTb3VwVGVzdCwKKyAgICBza2lwSWYsCispCisKK0Bza2lwSWYoCisgICAgbm90IEhUTUw1TElCX1BSRVNFTlQsCisgICAgImh0bWw1bGliIHNlZW1zIG5vdCB0byBiZSBwcmVzZW50LCBub3QgdGVzdGluZyBpdHMgdHJlZSBidWlsZGVyLiIpCitjbGFzcyBIVE1MNUxpYkJ1aWxkZXJTbW9rZVRlc3QoU291cFRlc3QsIEhUTUw1VHJlZUJ1aWxkZXJTbW9rZVRlc3QpOgorICAgICIiIlNlZSBgYEhUTUw1VHJlZUJ1aWxkZXJTbW9rZVRlc3RgYC4iIiIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkZWZhdWx0X2J1aWxkZXIoc2VsZik6CisgICAgICAgIHJldHVybiBIVE1MNVRyZWVCdWlsZGVyKCkKKworICAgIGRlZiB0ZXN0X3NvdXBzdHJhaW5lcihzZWxmKToKKyAgICAgICAgIyBUaGUgaHRtbDVsaWIgdHJlZSBidWlsZGVyIGRvZXMgbm90IHN1cHBvcnQgU291cFN0cmFpbmVycy4KKyAgICAgICAgc3RyYWluZXIgPSBTb3VwU3RyYWluZXIoImIiKQorICAgICAgICBtYXJrdXAgPSAiPHA+QSA8Yj5ib2xkPC9iPiBzdGF0ZW1lbnQuPC9wPiIKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwLCBwYXJzZV9vbmx5PXN0cmFpbmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IobWFya3VwKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAidGhlIGh0bWw1bGliIHRyZWUgYnVpbGRlciBkb2Vzbid0IHN1cHBvcnQgcGFyc2Vfb25seSIgaW4KKyAgICAgICAgICAgIHN0cih3WzBdLm1lc3NhZ2UpKQorCisgICAgZGVmIHRlc3RfY29ycmVjdGx5X25lc3RlZF90YWJsZXMoc2VsZik6CisgICAgICAgICIiImh0bWw1bGliIGluc2VydHMgPHRib2R5PiB0YWdzIHdoZXJlIG90aGVyIHBhcnNlcnMgZG9uJ3QuIiIiCisgICAgICAgIG1hcmt1cCA9ICgnPHRhYmxlIGlkPSIxIj4nCisgICAgICAgICAgICAgICAgICAnPHRyPicKKyAgICAgICAgICAgICAgICAgICI8dGQ+SGVyZSdzIGFub3RoZXIgdGFibGU6IgorICAgICAgICAgICAgICAgICAgJzx0YWJsZSBpZD0iMiI+JworICAgICAgICAgICAgICAgICAgJzx0cj48dGQ+Zm9vPC90ZD48L3RyPicKKyAgICAgICAgICAgICAgICAgICc8L3RhYmxlPjwvdGQ+JykKKworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICBtYXJrdXAsCisgICAgICAgICAgICAnPHRhYmxlIGlkPSIxIj48dGJvZHk+PHRyPjx0ZD5IZXJlXCdzIGFub3RoZXIgdGFibGU6JworICAgICAgICAgICAgJzx0YWJsZSBpZD0iMiI+PHRib2R5Pjx0cj48dGQ+Zm9vPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nCisgICAgICAgICAgICAnPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U291cEVxdWFscygKKyAgICAgICAgICAgICI8dGFibGU+PHRoZWFkPjx0cj48dGQ+Rm9vPC90ZD48L3RyPjwvdGhlYWQ+IgorICAgICAgICAgICAgIjx0Ym9keT48dHI+PHRkPkJhcjwvdGQ+PC90cj48L3Rib2R5PiIKKyAgICAgICAgICAgICI8dGZvb3Q+PHRyPjx0ZD5CYXo8L3RkPjwvdHI+PC90Zm9vdD48L3RhYmxlPiIpCisKKyAgICBkZWYgdGVzdF94bWxfZGVjbGFyYXRpb25fZm9sbG93ZWRfYnlfZG9jdHlwZShzZWxmKToKKyAgICAgICAgbWFya3VwID0gJycnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+CisgIDxoZWFkPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgPHA+Zm9vPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+JycnCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiByZWFjaCB0aGUgPHA+IHRhZzsgdGhpcyBtZWFucyB0aGUgdHJlZSBpcyBjb25uZWN0ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiI8cD5mb288L3A+Iiwgc291cC5wLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3RfcmVwYXJlbnRlZF9tYXJrdXAoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8cD48ZW0+Zm9vPC9wPlxuPHA+YmFyPGE+PC9hPjwvZW0+PC9wPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSI8Ym9keT48cD48ZW0+Zm9vPC9lbT48L3A+PGVtPlxuPC9lbT48cD48ZW0+YmFyPGE+PC9hPjwvZW0+PC9wPjwvYm9keT4iLCBzb3VwLmJvZHkuZGVjb2RlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHNvdXAuZmluZF9hbGwoJ3AnKSkpCisKKworICAgIGRlZiB0ZXN0X3JlcGFyZW50ZWRfbWFya3VwX2VuZHNfd2l0aF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAnPHA+PGVtPmZvbzwvcD5cbjxwPmJhcjxhPjwvYT48L2VtPjwvcD5cbicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSI8Ym9keT48cD48ZW0+Zm9vPC9lbT48L3A+PGVtPlxuPC9lbT48cD48ZW0+YmFyPGE+PC9hPjwvZW0+PC9wPlxuPC9ib2R5PiIsIHNvdXAuYm9keS5kZWNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4oc291cC5maW5kX2FsbCgncCcpKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X2h0bWxwYXJzZXIucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9odG1scGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjVlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9odG1scGFyc2VyLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiIlRlc3RzIHRvIGVuc3VyZSB0aGF0IHRoZSBodG1sLnBhcnNlciB0cmVlIGJ1aWxkZXIgZ2VuZXJhdGVzIGdvb2QKK3RyZWVzLiIiIgorCitmcm9tIGJzNC50ZXN0aW5nIGltcG9ydCBTb3VwVGVzdCwgSFRNTFRyZWVCdWlsZGVyU21va2VUZXN0Citmcm9tIGJzNC5idWlsZGVyIGltcG9ydCBIVE1MUGFyc2VyVHJlZUJ1aWxkZXIKKworY2xhc3MgSFRNTFBhcnNlclRyZWVCdWlsZGVyU21va2VUZXN0KFNvdXBUZXN0LCBIVE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3QpOgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlZmF1bHRfYnVpbGRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIEhUTUxQYXJzZXJUcmVlQnVpbGRlcigpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2VkX3N5c3RlbV9kb2N0eXBlKHNlbGYpOgorICAgICAgICAjIGh0bWwucGFyc2VyIGNhbid0IGhhbmRsZSBuYW1lc3BhY2VkIGRvY3R5cGVzLCBzbyBza2lwIHRoaXMgb25lLgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2VkX3B1YmxpY19kb2N0eXBlKHNlbGYpOgorICAgICAgICAjIGh0bWwucGFyc2VyIGNhbid0IGhhbmRsZSBuYW1lc3BhY2VkIGRvY3R5cGVzLCBzbyBza2lwIHRoaXMgb25lLgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9seG1sLnB5IGIvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfbHhtbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJlOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvYnM0L3Rlc3RzL3Rlc3RfbHhtbC5weQpAQCAtMCwwICsxLDkxIEBACisiIiJUZXN0cyB0byBlbnN1cmUgdGhhdCB0aGUgbHhtbCB0cmVlIGJ1aWxkZXIgZ2VuZXJhdGVzIGdvb2QgdHJlZXMuIiIiCisKK2ltcG9ydCByZQoraW1wb3J0IHdhcm5pbmdzCisKK3RyeToKKyAgICBpbXBvcnQgbHhtbC5ldHJlZQorICAgIExYTUxfUFJFU0VOVCA9IFRydWUKKyAgICBMWE1MX1ZFUlNJT04gPSBseG1sLmV0cmVlLkxYTUxfVkVSU0lPTgorZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgIExYTUxfUFJFU0VOVCA9IEZhbHNlCisgICAgTFhNTF9WRVJTSU9OID0gKDAsKQorCitpZiBMWE1MX1BSRVNFTlQ6CisgICAgZnJvbSBiczQuYnVpbGRlciBpbXBvcnQgTFhNTFRyZWVCdWlsZGVyLCBMWE1MVHJlZUJ1aWxkZXJGb3JYTUwKKworZnJvbSBiczQgaW1wb3J0ICgKKyAgICBCZWF1dGlmdWxTb3VwLAorICAgIEJlYXV0aWZ1bFN0b25lU291cCwKKyAgICApCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCBDb21tZW50LCBEb2N0eXBlLCBTb3VwU3RyYWluZXIKK2Zyb20gYnM0LnRlc3RpbmcgaW1wb3J0IHNraXBJZgorZnJvbSBiczQudGVzdHMgaW1wb3J0IHRlc3RfaHRtbHBhcnNlcgorZnJvbSBiczQudGVzdGluZyBpbXBvcnQgKAorICAgIEhUTUxUcmVlQnVpbGRlclNtb2tlVGVzdCwKKyAgICBYTUxUcmVlQnVpbGRlclNtb2tlVGVzdCwKKyAgICBTb3VwVGVzdCwKKyAgICBza2lwSWYsCispCisKK0Bza2lwSWYoCisgICAgbm90IExYTUxfUFJFU0VOVCwKKyAgICAibHhtbCBzZWVtcyBub3QgdG8gYmUgcHJlc2VudCwgbm90IHRlc3RpbmcgaXRzIHRyZWUgYnVpbGRlci4iKQorY2xhc3MgTFhNTFRyZWVCdWlsZGVyU21va2VUZXN0KFNvdXBUZXN0LCBIVE1MVHJlZUJ1aWxkZXJTbW9rZVRlc3QpOgorICAgICIiIlNlZSBgYEhUTUxUcmVlQnVpbGRlclNtb2tlVGVzdGBgLiIiIgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlZmF1bHRfYnVpbGRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIExYTUxUcmVlQnVpbGRlcigpCisKKyAgICBkZWYgdGVzdF9vdXRfb2ZfcmFuZ2VfZW50aXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICAiPHA+Zm9vJiMxMDAwMDAwMDAwMDAwMDtiYXI8L3A+IiwgIjxwPmZvb2JhcjwvcD4iKQorICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMoCisgICAgICAgICAgICAiPHA+Zm9vJiN4MTAwMDAwMDAwMDAwMDA7YmFyPC9wPiIsICI8cD5mb29iYXI8L3A+IikKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VwRXF1YWxzKAorICAgICAgICAgICAgIjxwPmZvbyYjMTAwMDAwMDAwMDtiYXI8L3A+IiwgIjxwPmZvb2JhcjwvcD4iKQorCisgICAgIyBJbiBseG1sIDwgMi4zLjUsIGFuIGVtcHR5IGRvY3R5cGUgY2F1c2VzIGEgc2VnZmF1bHQuIFNraXAgdGhpcworICAgICMgdGVzdCBpZiBhbiBvbGQgdmVyc2lvbiBvZiBseG1sIGlzIGluc3RhbGxlZC4KKworICAgIEBza2lwSWYoCisgICAgICAgIG5vdCBMWE1MX1BSRVNFTlQgb3IgTFhNTF9WRVJTSU9OIDwgKDIsMyw1LDApLAorICAgICAgICAiU2tpcHBpbmcgZG9jdHlwZSB0ZXN0IGZvciBvbGQgdmVyc2lvbiBvZiBseG1sIHRvIGF2b2lkIHNlZ2ZhdWx0LiIpCisgICAgZGVmIHRlc3RfZW1wdHlfZG9jdHlwZShzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPCFET0NUWVBFPiIpCisgICAgICAgIGRvY3R5cGUgPSBzb3VwLmNvbnRlbnRzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiIsIGRvY3R5cGUuc3RyaXAoKSkKKworICAgIGRlZiB0ZXN0X2JlYXV0aWZ1bHN0b25lc291cF9pc194bWxfcGFyc2VyKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXByZWNhdGVkIEJTUyBjbGFzcyB1c2VzIGFuIHhtbCBidWlsZGVyCisgICAgICAgICMgaWYgb25lIGlzIGluc3RhbGxlZC4KKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHNvdXAgPSBCZWF1dGlmdWxTdG9uZVNvdXAoIjxiIC8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IjxiLz4iLCB1bmljb2RlKHNvdXAuYikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiQmVhdXRpZnVsU3RvbmVTb3VwIGNsYXNzIGlzIGRlcHJlY2F0ZWQiIGluIHN0cih3WzBdLm1lc3NhZ2UpKQorCisgICAgZGVmIHRlc3RfcmVhbF94aHRtbF9kb2N1bWVudChzZWxmKToKKyAgICAgICAgIiIibHhtbCBzdHJpcHMgdGhlIFhNTCBkZWZpbml0aW9uIGZyb20gYW4gWEhUTUwgZG9jLCB3aGljaCBpcyBmaW5lLiIiIgorICAgICAgICBtYXJrdXAgPSBiIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+PHRpdGxlPkhlbGxvLjwvdGl0bGU+PC9oZWFkPgorPGJvZHk+R29vZGJ5ZS48L2JvZHk+Cis8L2h0bWw+IiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5lbmNvZGUoInV0Zi04IikucmVwbGFjZShiIlxuIiwgYicnKSwKKyAgICAgICAgICAgIG1hcmt1cC5yZXBsYWNlKGInXG4nLCBiJycpLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgYic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PicsIGInJykpCisKKworQHNraXBJZigKKyAgICBub3QgTFhNTF9QUkVTRU5ULAorICAgICJseG1sIHNlZW1zIG5vdCB0byBiZSBwcmVzZW50LCBub3QgdGVzdGluZyBpdHMgWE1MIHRyZWUgYnVpbGRlci4iKQorY2xhc3MgTFhNTFhNTFRyZWVCdWlsZGVyU21va2VUZXN0KFNvdXBUZXN0LCBYTUxUcmVlQnVpbGRlclNtb2tlVGVzdCk6CisgICAgIiIiU2VlIGBgSFRNTFRyZWVCdWlsZGVyU21va2VUZXN0YGAuIiIiCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVmYXVsdF9idWlsZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gTFhNTFRyZWVCdWlsZGVyRm9yWE1MKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X3NvdXAucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9zb3VwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YWMyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF9zb3VwLnB5CkBAIC0wLDAgKzEsNDM0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiVGVzdHMgb2YgQmVhdXRpZnVsIFNvdXAgYXMgYSB3aG9sZS4iIiIKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCisKK2Zyb20gYnM0IGltcG9ydCAoCisgICAgQmVhdXRpZnVsU291cCwKKyAgICBCZWF1dGlmdWxTdG9uZVNvdXAsCispCitmcm9tIGJzNC5lbGVtZW50IGltcG9ydCAoCisgICAgQ2hhcnNldE1ldGFBdHRyaWJ1dGVWYWx1ZSwKKyAgICBDb250ZW50TWV0YUF0dHJpYnV0ZVZhbHVlLAorICAgIFNvdXBTdHJhaW5lciwKKyAgICBOYW1lc3BhY2VkQXR0cmlidXRlLAorICAgICkKK2ltcG9ydCBiczQuZGFtbWl0Citmcm9tIGJzNC5kYW1taXQgaW1wb3J0ICgKKyAgICBFbnRpdHlTdWJzdGl0dXRpb24sCisgICAgVW5pY29kZURhbW1pdCwKKykKK2Zyb20gYnM0LnRlc3RpbmcgaW1wb3J0ICgKKyAgICBTb3VwVGVzdCwKKyAgICBza2lwSWYsCispCitpbXBvcnQgd2FybmluZ3MKKwordHJ5OgorICAgIGZyb20gYnM0LmJ1aWxkZXIgaW1wb3J0IExYTUxUcmVlQnVpbGRlciwgTFhNTFRyZWVCdWlsZGVyRm9yWE1MCisgICAgTFhNTF9QUkVTRU5UID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgIExYTUxfUFJFU0VOVCA9IEZhbHNlCisKK1BZVEhPTl8yX1BSRV8yXzcgPSAoc3lzLnZlcnNpb25faW5mbyA8ICgyLDcpKQorUFlUSE9OXzNfUFJFXzNfMiA9IChzeXMudmVyc2lvbl9pbmZvWzBdID09IDMgYW5kIHN5cy52ZXJzaW9uX2luZm8gPCAoMywyKSkKKworY2xhc3MgVGVzdENvbnN0cnVjdG9yKFNvdXBUZXN0KToKKworICAgIGRlZiB0ZXN0X3Nob3J0X3VuaWNvZGVfaW5wdXQoc2VsZik6CisgICAgICAgIGRhdGEgPSB1IjxoMT7DqcOpPC9oMT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IsOpw6kiLCBzb3VwLmgxLnN0cmluZykKKworICAgIGRlZiB0ZXN0X2VtYmVkZGVkX251bGwoc2VsZik6CisgICAgICAgIGRhdGEgPSB1IjxoMT5mb29cMGJhcjwvaDE+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJmb29cMGJhciIsIHNvdXAuaDEuc3RyaW5nKQorCisKK2NsYXNzIFRlc3REZXByZWNhdGVkQ29uc3RydWN0b3JBcmd1bWVudHMoU291cFRlc3QpOgorCisgICAgZGVmIHRlc3RfcGFyc2VPbmx5VGhlc2VfcmVuYW1lZF90b19wYXJzZV9vbmx5KHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PGI+PC9iPjwvYT4iLCBwYXJzZU9ubHlUaGVzZT1Tb3VwU3RyYWluZXIoImIiKSkKKyAgICAgICAgbXNnID0gc3RyKHdbMF0ubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJwYXJzZU9ubHlUaGVzZSIgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInBhcnNlX29ubHkiIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIjxiPjwvYj4iLCBzb3VwLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3RfZnJvbUVuY29kaW5nX3JlbmFtZWRfdG9fZnJvbV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHV0ZjggPSBiIlx4YzNceGE5IgorICAgICAgICAgICAgc291cCA9IHNlbGYuc291cCh1dGY4LCBmcm9tRW5jb2Rpbmc9InV0ZjgiKQorICAgICAgICBtc2cgPSBzdHIod1swXS5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZyb21FbmNvZGluZyIgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZyb21fZW5jb2RpbmciIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidXRmOCIsIHNvdXAub3JpZ2luYWxfZW5jb2RpbmcpCisKKyAgICBkZWYgdGVzdF91bnJlY29nbml6ZWRfa2V5d29yZF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBUeXBlRXJyb3IsIHNlbGYuc291cCwgIjxhPiIsIG5vX3N1Y2hfYXJndW1lbnQ9VHJ1ZSkKKworY2xhc3MgVGVzdFdhcm5pbmdzKFNvdXBUZXN0KToKKworICAgIGRlZiB0ZXN0X2Rpc2tfZmlsZV93YXJuaW5nKHNlbGYpOgorICAgICAgICBmaWxlaGFuZGxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlaGFuZGxlLm5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGZpbGVuYW1lKQorICAgICAgICAgICAgbXNnID0gc3RyKHdbMF0ubWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibG9va3MgbGlrZSBhIGZpbGVuYW1lIiBpbiBtc2cpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlaGFuZGxlLmNsb3NlKCkKKworICAgICAgICAjIFRoZSBmaWxlIG5vIGxvbmdlciBleGlzdHMsIHNvIEJlYXV0aWZ1bCBTb3VwIHdpbGwgbm8gbG9uZ2VyIGlzc3VlIHRoZSB3YXJuaW5nLgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc291cCA9IHNlbGYuc291cChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4odykpCisKKyAgICBkZWYgdGVzdF91cmxfd2FybmluZyhzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoImh0dHA6Ly93d3cuY3J1bW15LmNvbS8iKQorICAgICAgICBtc2cgPSBzdHIod1swXS5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImxvb2tzIGxpa2UgYSBVUkwiIGluIG1zZykKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc291cCA9IHNlbGYuc291cCgiaHR0cDovL3d3dy5jcnVtbXkuY29tLyBpcyBncmVhdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHcpKQorCitjbGFzcyBUZXN0U2VsZWN0aXZlUGFyc2luZyhTb3VwVGVzdCk6CisKKyAgICBkZWYgdGVzdF9wYXJzZV93aXRoX3NvdXBzdHJhaW5lcihzZWxmKToKKyAgICAgICAgbWFya3VwID0gIk5vPGI+WWVzPC9iPjxhPk5vPGI+WWVzIDxjPlllczwvYz48L2I+IgorICAgICAgICBzdHJhaW5lciA9IFNvdXBTdHJhaW5lcigiYiIpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAobWFya3VwLCBwYXJzZV9vbmx5PXN0cmFpbmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZW5jb2RlKCksIGIiPGI+WWVzPC9iPjxiPlllcyA8Yz5ZZXM8L2M+PC9iPiIpCisKKworY2xhc3MgVGVzdEVudGl0eVN1YnN0aXR1dGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiU3RhbmRhbG9uZSB0ZXN0cyBvZiB0aGUgRW50aXR5U3Vic3RpdHV0aW9uIGNsYXNzLiIiIgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zdWIgPSBFbnRpdHlTdWJzdGl0dXRpb24KKworICAgIGRlZiB0ZXN0X3NpbXBsZV9odG1sX3N1YnN0aXR1dGlvbihzZWxmKToKKyAgICAgICAgIyBVbmljb2RlIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byBuYW1lZCBIVE1MIGVudGl0ZXMKKyAgICAgICAgIyBhcmUgc3Vic3RpdHV0ZWQsIGFuZCBubyBvdGhlcnMuCisgICAgICAgIHMgPSB1ImZvb1x1MjIwMFxOe1NOT1dNQU59XHUwMGY1YmFyIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfaHRtbChzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdSJmb28mZm9yYWxsO1xOe1NOT1dNQU59Jm90aWxkZTtiYXIiKQorCisgICAgZGVmIHRlc3Rfc21hcnRfcXVvdGVfc3Vic3RpdHV0aW9uKHNlbGYpOgorICAgICAgICAjIE1TIHNtYXJ0IHF1b3RlcyBhcmUgYSBjb21tb24gc291cmNlIG9mIGZydXN0cmF0aW9uLCBzbyB3ZQorICAgICAgICAjIGdpdmUgdGhlbSBhIHNwZWNpYWwgdGVzdC4KKyAgICAgICAgcXVvdGVzID0gYiJceDkxXHg5MmZvb1x4OTNceDk0IgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KHF1b3RlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX2h0bWwoZGFtbWl0Lm1hcmt1cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICImbHNxdW87JnJzcXVvO2ZvbyZsZHF1bzsmcmRxdW87IikKKworICAgIGRlZiB0ZXN0X3htbF9jb252ZXJzdGlvbl9pbmNsdWRlc19ub19xdW90ZXNfaWZfbWFrZV9xdW90ZWRfYXR0cmlidXRlX2lzX2ZhbHNlKHNlbGYpOgorICAgICAgICBzID0gJ1dlbGNvbWUgdG8gIm15IGJhciInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWIuc3Vic3RpdHV0ZV94bWwocywgRmFsc2UpLCBzKQorCisgICAgZGVmIHRlc3RfeG1sX2F0dHJpYnV0ZV9xdW90aW5nX25vcm1hbGx5X3VzZXNfZG91YmxlX3F1b3RlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbCgiV2VsY29tZSIsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnIldlbGNvbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbCgiQm9iJ3MgQmFyIiwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICciQm9iXCdzIEJhciInKQorCisgICAgZGVmIHRlc3RfeG1sX2F0dHJpYnV0ZV9xdW90aW5nX3VzZXNfc2luZ2xlX3F1b3Rlc193aGVuX3ZhbHVlX2NvbnRhaW5zX2RvdWJsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIHMgPSAnV2VsY29tZSB0byAibXkgYmFyIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbChzLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidXZWxjb21lIHRvIFwibXkgYmFyXCInIikKKworICAgIGRlZiB0ZXN0X3htbF9hdHRyaWJ1dGVfcXVvdGluZ19lc2NhcGVzX3NpbmdsZV9xdW90ZXNfd2hlbl92YWx1ZV9jb250YWluc19ib3RoX3NpbmdsZV9hbmRfZG91YmxlX3F1b3RlcyhzZWxmKToKKyAgICAgICAgcyA9ICdXZWxjb21lIHRvICJCb2JcJ3MgQmFyIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sKHMsIFRydWUpLAorICAgICAgICAgICAgJyJXZWxjb21lIHRvICZxdW90O0JvYlwncyBCYXImcXVvdDsiJykKKworICAgIGRlZiB0ZXN0X3htbF9xdW90ZXNfYXJlbnRfZXNjYXBlZF93aGVuX3ZhbHVlX2lzX25vdF9iZWluZ19xdW90ZWQoc2VsZik6CisgICAgICAgIHF1b3RlZCA9ICdXZWxjb21lIHRvICJCb2JcJ3MgQmFyIicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbChxdW90ZWQpLCBxdW90ZWQpCisKKyAgICBkZWYgdGVzdF94bWxfcXVvdGluZ19oYW5kbGVzX2FuZ2xlX2JyYWNrZXRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5zdWIuc3Vic3RpdHV0ZV94bWwoImZvbzxiYXI+IiksCisgICAgICAgICAgICAiZm9vJmx0O2JhciZndDsiKQorCisgICAgZGVmIHRlc3RfeG1sX3F1b3RpbmdfaGFuZGxlc19hbXBlcnNhbmRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3ViLnN1YnN0aXR1dGVfeG1sKCJBVCZUIiksICJBVCZhbXA7VCIpCisKKyAgICBkZWYgdGVzdF94bWxfcXVvdGluZ19pbmNsdWRpbmdfYW1wZXJzYW5kc193aGVuX3RoZXlfYXJlX3BhcnRfb2ZfYW5fZW50aXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5zdWIuc3Vic3RpdHV0ZV94bWwoIiZBYWN1dGU7VCZUIiksCisgICAgICAgICAgICAiJmFtcDtBYWN1dGU7VCZhbXA7VCIpCisKKyAgICBkZWYgdGVzdF94bWxfcXVvdGluZ19pZ25vcmluZ19hbXBlcnNhbmRzX3doZW5fdGhleV9hcmVfcGFydF9vZl9hbl9lbnRpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnN1Yi5zdWJzdGl0dXRlX3htbF9jb250YWluaW5nX2VudGl0aWVzKCImQWFjdXRlO1QmVCIpLAorICAgICAgICAgICAgIiZBYWN1dGU7VCZhbXA7VCIpCisKKyAgICBkZWYgdGVzdF9xdW90ZXNfbm90X2h0bWxfc3Vic3RpdHV0ZWQoc2VsZik6CisgICAgICAgICIiIlRoZXJlJ3Mgbm8gbmVlZCB0byBkbyB0aGlzIGV4Y2VwdCBpbnNpZGUgYXR0cmlidXRlIHZhbHVlcy4iIiIKKyAgICAgICAgdGV4dCA9ICdCb2JcJ3MgImJhciInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWIuc3Vic3RpdHV0ZV9odG1sKHRleHQpLCB0ZXh0KQorCisKK2NsYXNzIFRlc3RFbmNvZGluZ0NvbnZlcnNpb24oU291cFRlc3QpOgorICAgICMgVGVzdCBCZWF1dGlmdWwgU291cCdzIGFiaWxpdHkgdG8gZGVjb2RlIGFuZCBlbmNvZGUgZnJvbSB2YXJpb3VzCisgICAgIyBlbmNvZGluZ3MuCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RFbmNvZGluZ0NvbnZlcnNpb24sIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi51bmljb2RlX2RhdGEgPSB1JzxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+PC9oZWFkPjxib2R5Pjxmb28+U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhPC9mb28+PC9ib2R5PjwvaHRtbD4nCisgICAgICAgIHNlbGYudXRmOF9kYXRhID0gc2VsZi51bmljb2RlX2RhdGEuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgICMgSnVzdCBzbyB5b3Uga25vdyB3aGF0IGl0IGxvb2tzIGxpa2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnV0ZjhfZGF0YSwKKyAgICAgICAgICAgIGInPGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiLz48L2hlYWQ+PGJvZHk+PGZvbz5TYWNyXHhjM1x4YTkgYmxldSE8L2Zvbz48L2JvZHk+PC9odG1sPicpCisKKyAgICBkZWYgdGVzdF9hc2NpaV9pbl91bmljb2RlX291dChzZWxmKToKKyAgICAgICAgIyBBU0NJSSBpbnB1dCBpcyBjb252ZXJ0ZWQgdG8gVW5pY29kZS4gVGhlIG9yaWdpbmFsX2VuY29kaW5nCisgICAgICAgICMgYXR0cmlidXRlIGlzIHNldCB0byAndXRmLTgnLCBhIHN1cGVyc2V0IG9mIEFTQ0lJLgorICAgICAgICBjaGFyZGV0ID0gYnM0LmRhbW1pdC5jaGFyZGV0X2RhbW1pdAorICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5XQVJOSU5HKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWYgbm9vcChzdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAjIERpc2FibGUgY2hhcmRldCwgd2hpY2ggd2lsbCByZWFsaXplIHRoYXQgdGhlIEFTQ0lJIGlzIEFTQ0lJLgorICAgICAgICAgICAgYnM0LmRhbW1pdC5jaGFyZGV0X2RhbW1pdCA9IG5vb3AKKyAgICAgICAgICAgIGFzY2lpID0gYiI8Zm9vPmE8L2Zvbz4iCisgICAgICAgICAgICBzb3VwX2Zyb21fYXNjaWkgPSBzZWxmLnNvdXAoYXNjaWkpCisgICAgICAgICAgICB1bmljb2RlX291dHB1dCA9IHNvdXBfZnJvbV9hc2NpaS5kZWNvZGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodW5pY29kZV9vdXRwdXQsIHVuaWNvZGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX291dHB1dCwgc2VsZi5kb2N1bWVudF9mb3IoYXNjaWkuZGVjb2RlKCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwX2Zyb21fYXNjaWkub3JpZ2luYWxfZW5jb2RpbmcubG93ZXIoKSwgInV0Zi04IikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLk5PVFNFVCkKKyAgICAgICAgICAgIGJzNC5kYW1taXQuY2hhcmRldF9kYW1taXQgPSBjaGFyZGV0CisKKyAgICBkZWYgdGVzdF91bmljb2RlX2luX3VuaWNvZGVfb3V0KHNlbGYpOgorICAgICAgICAjIFVuaWNvZGUgaW5wdXQgaXMgbGVmdCBhbG9uZS4gVGhlIG9yaWdpbmFsX2VuY29kaW5nIGF0dHJpYnV0ZQorICAgICAgICAjIGlzIG5vdCBzZXQuCisgICAgICAgIHNvdXBfZnJvbV91bmljb2RlID0gc2VsZi5zb3VwKHNlbGYudW5pY29kZV9kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV91bmljb2RlLmRlY29kZSgpLCBzZWxmLnVuaWNvZGVfZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwX2Zyb21fdW5pY29kZS5mb28uc3RyaW5nLCB1J1NhY3JceGU5IGJsZXUhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwX2Zyb21fdW5pY29kZS5vcmlnaW5hbF9lbmNvZGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3V0ZjhfaW5fdW5pY29kZV9vdXQoc2VsZik6CisgICAgICAgICMgVVRGLTggaW5wdXQgaXMgY29udmVydGVkIHRvIFVuaWNvZGUuIFRoZSBvcmlnaW5hbF9lbmNvZGluZworICAgICAgICAjIGF0dHJpYnV0ZSBpcyBzZXQuCisgICAgICAgIHNvdXBfZnJvbV91dGY4ID0gc2VsZi5zb3VwKHNlbGYudXRmOF9kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV91dGY4LmRlY29kZSgpLCBzZWxmLnVuaWNvZGVfZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwX2Zyb21fdXRmOC5mb28uc3RyaW5nLCB1J1NhY3JceGU5IGJsZXUhJykKKworICAgIGRlZiB0ZXN0X3V0Zjhfb3V0KHNlbGYpOgorICAgICAgICAjIFRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgY2FuIGJlIGVuY29kZWQgYXMgVVRGLTguCisgICAgICAgIHNvdXBfZnJvbV91bmljb2RlID0gc2VsZi5zb3VwKHNlbGYudW5pY29kZV9kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXBfZnJvbV91bmljb2RlLmVuY29kZSgndXRmLTgnKSwgc2VsZi51dGY4X2RhdGEpCisKKyAgICBAc2tpcElmKAorICAgICAgICBQWVRIT05fMl9QUkVfMl83IG9yIFBZVEhPTl8zX1BSRV8zXzIsCisgICAgICAgICJCYWQgSFRNTFBhcnNlciBkZXRlY3RlZDsgc2tpcHBpbmcgdGVzdCBvZiBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBhdHRyaWJ1dGUgbmFtZS4iKQorICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZV9uYW1lX2NvbnRhaW5pbmdfdW5pY29kZV9jaGFyYWN0ZXJzKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1JzxkaXY+PGEgXE57U05PV01BTn09InNub3dtYW4iPjwvYT48L2Rpdj4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb3VwKG1hcmt1cCkuZGl2LmVuY29kZSgidXRmOCIpLCBtYXJrdXAuZW5jb2RlKCJ1dGY4IikpCisKK2NsYXNzIFRlc3RVbmljb2RlRGFtbWl0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJTdGFuZGFsb25lIHRlc3RzIG9mIFVuaWNvZGVEYW1taXQuIiIiCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2lucHV0KHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1IkknbSBhbHJlYWR5IFVuaWNvZGUhIFxOe1NOT1dNQU59IgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KG1hcmt1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQudW5pY29kZV9tYXJrdXAsIG1hcmt1cCkKKworICAgIGRlZiB0ZXN0X3NtYXJ0X3F1b3Rlc190b191bmljb2RlKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSBiIjxmb28+XHg5MVx4OTJceDkzXHg5NDwvZm9vPiIKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChtYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkYW1taXQudW5pY29kZV9tYXJrdXAsIHUiPGZvbz5cdTIwMThcdTIwMTlcdTIwMWNcdTIwMWQ8L2Zvbz4iKQorCisgICAgZGVmIHRlc3Rfc21hcnRfcXVvdGVzX3RvX3htbF9lbnRpdGllcyhzZWxmKToKKyAgICAgICAgbWFya3VwID0gYiI8Zm9vPlx4OTFceDkyXHg5M1x4OTQ8L2Zvbz4iCisgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQobWFya3VwLCBzbWFydF9xdW90ZXNfdG89InhtbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkYW1taXQudW5pY29kZV9tYXJrdXAsICI8Zm9vPiYjeDIwMTg7JiN4MjAxOTsmI3gyMDFDOyYjeDIwMUQ7PC9mb28+IikKKworICAgIGRlZiB0ZXN0X3NtYXJ0X3F1b3Rlc190b19odG1sX2VudGl0aWVzKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSBiIjxmb28+XHg5MVx4OTJceDkzXHg5NDwvZm9vPiIKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChtYXJrdXAsIHNtYXJ0X3F1b3Rlc190bz0iaHRtbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkYW1taXQudW5pY29kZV9tYXJrdXAsICI8Zm9vPiZsc3F1bzsmcnNxdW87JmxkcXVvOyZyZHF1bzs8L2Zvbz4iKQorCisgICAgZGVmIHRlc3Rfc21hcnRfcXVvdGVzX3RvX2FzY2lpKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSBiIjxmb28+XHg5MVx4OTJceDkzXHg5NDwvZm9vPiIKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChtYXJrdXAsIHNtYXJ0X3F1b3Rlc190bz0iYXNjaWkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZGFtbWl0LnVuaWNvZGVfbWFya3VwLCAiIiI8Zm9vPicnIiI8L2Zvbz4iIiIpCisKKyAgICBkZWYgdGVzdF9kZXRlY3RfdXRmOChzZWxmKToKKyAgICAgICAgdXRmOCA9IGIiXHhjM1x4YTkiCisgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQodXRmOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQudW5pY29kZV9tYXJrdXAsIHUnXHhlOScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nLmxvd2VyKCksICd1dGYtOCcpCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0X2hlYnJldyhzZWxmKToKKyAgICAgICAgaGVicmV3ID0gYiJceGVkXHhlNVx4ZWNceGY5IgorICAgICAgICBkYW1taXQgPSBVbmljb2RlRGFtbWl0KGhlYnJldywgWyJpc28tODg1OS04Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nLmxvd2VyKCksICdpc28tODg1OS04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQudW5pY29kZV9tYXJrdXAsIHUnXHUwNWRkXHUwNWQ1XHUwNWRjXHUwNWU5JykKKworICAgIGRlZiB0ZXN0X2RvbnRfc2VlX3NtYXJ0X3F1b3Rlc193aGVyZV90aGVyZV9hcmVfbm9uZShzZWxmKToKKyAgICAgICAgdXRmXzggPSBiIlwzNDNcMjAyXDI2MVwzNDNcMjAzXDI3NFwzNDNcMjAyXDI3N1wzNDNcMjAyXDI0NCBXYXRjaCIKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdCh1dGZfOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQub3JpZ2luYWxfZW5jb2RpbmcubG93ZXIoKSwgJ3V0Zi04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYW1taXQudW5pY29kZV9tYXJrdXAuZW5jb2RlKCJ1dGYtOCIpLCB1dGZfOCkKKworICAgIGRlZiB0ZXN0X2lnbm9yZV9pbmFwcHJvcHJpYXRlX2NvZGVjcyhzZWxmKToKKyAgICAgICAgdXRmOF9kYXRhID0gdSJSw6Rrc23DtnJnw6VzIi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdCh1dGY4X2RhdGEsIFsiaXNvLTg4NTktOCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhbW1pdC5vcmlnaW5hbF9lbmNvZGluZy5sb3dlcigpLCAndXRmLTgnKQorCisgICAgZGVmIHRlc3RfaWdub3JlX2ludmFsaWRfY29kZWNzKHNlbGYpOgorICAgICAgICB1dGY4X2RhdGEgPSB1IlLDpGtzbcO2cmfDpXMiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBmb3IgYmFkX2VuY29kaW5nIGluIFsnLnV0ZjgnLCAnLi4uJywgJ3V0Ri0tLTE2LiEnXToKKyAgICAgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQodXRmOF9kYXRhLCBbYmFkX2VuY29kaW5nXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nLmxvd2VyKCksICd1dGYtOCcpCisKKyAgICBkZWYgdGVzdF9kZXRlY3RfaHRtbDVfc3R5bGVfbWV0YV90YWcoc2VsZik6CisKKyAgICAgICAgZm9yIGRhdGEgaW4gKAorICAgICAgICAgICAgYic8aHRtbD48bWV0YSBjaGFyc2V0PSJldWMtanAiIC8+PC9odG1sPicsCisgICAgICAgICAgICBiIjxodG1sPjxtZXRhIGNoYXJzZXQ9J2V1Yy1qcCcgLz48L2h0bWw+IiwKKyAgICAgICAgICAgIGIiPGh0bWw+PG1ldGEgY2hhcnNldD1ldWMtanAgLz48L2h0bWw+IiwKKyAgICAgICAgICAgIGIiPGh0bWw+PG1ldGEgY2hhcnNldD1ldWMtanAvPjwvaHRtbD4iKToKKyAgICAgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQoZGF0YSwgaXNfaHRtbD1UcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAiZXVjLWpwIiwgZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nKQorCisgICAgZGVmIHRlc3RfbGFzdF9kaXRjaF9lbnRpdHlfcmVwbGFjZW1lbnQoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIFVURi04IGRvY3VtZW50IHRoYXQgY29udGFpbnMgYnl0ZXN0cmluZ3MKKyAgICAgICAgIyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSB3aXRoIFVURi04IChpZS4gZW5jb2RlZCB3aXRoIHNvbWUgb3RoZXIKKyAgICAgICAgIyBlbmNvZGluZykuCisgICAgICAgICMKKyAgICAgICAgIyBTaW5jZSB0aGVyZSBpcyBubyBjb25zaXN0ZW50IGVuY29kaW5nIGZvciB0aGUgZG9jdW1lbnQsCisgICAgICAgICMgVW5pY29kZSwgRGFtbWl0IHdpbGwgZXZlbnR1YWxseSBlbmNvZGUgdGhlIGRvY3VtZW50IGFzIFVURi04CisgICAgICAgICMgYW5kIGVuY29kZSB0aGUgaW5jb21wYXRpYmxlIGNoYXJhY3RlcnMgYXMgUkVQTEFDRU1FTlQKKyAgICAgICAgIyBDSEFSQUNURVIuCisgICAgICAgICMKKyAgICAgICAgIyBJZiBjaGFyZGV0IGlzIGluc3RhbGxlZCwgaXQgd2lsbCBkZXRlY3QgdGhhdCB0aGUgZG9jdW1lbnQKKyAgICAgICAgIyBjYW4gYmUgY29udmVydGVkIGludG8gSVNPLTg4NTktMSB3aXRob3V0IGVycm9ycy4gVGhpcyBoYXBwZW5zCisgICAgICAgICMgdG8gYmUgdGhlIHdyb25nIGVuY29kaW5nLCBidXQgaXQgaXMgYSBjb25zaXN0ZW50IGVuY29kaW5nLCBzbyB0aGUKKyAgICAgICAgIyBjb2RlIHdlJ3JlIHRlc3RpbmcgaGVyZSB3b24ndCBydW4uCisgICAgICAgICMKKyAgICAgICAgIyBTbyB3ZSB0ZW1wb3JhcmlseSBkaXNhYmxlIGNoYXJkZXQgaWYgaXQncyBwcmVzZW50LgorICAgICAgICBkb2MgPSBiIiIiXDM1N1wyNzNcMjc3PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxodG1sPjxiPlwzMzBcMjUwXDMzMFwyNTJcMzMwXDI2MTwvYj4KKzxpPlwzMTBcMzIyXDMyMVwyMjBcMzEyXDMyMVwzNTVcMzQ0PC9pPjwvaHRtbD4iIiIKKyAgICAgICAgY2hhcmRldCA9IGJzNC5kYW1taXQuY2hhcmRldF9kYW1taXQKKyAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuV0FSTklORykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIG5vb3Aoc3RyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgYnM0LmRhbW1pdC5jaGFyZGV0X2RhbW1pdCA9IG5vb3AKKyAgICAgICAgICAgIGRhbW1pdCA9IFVuaWNvZGVEYW1taXQoZG9jKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBkYW1taXQuY29udGFpbnNfcmVwbGFjZW1lbnRfY2hhcmFjdGVycykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1Ilx1ZmZmZCIgaW4gZGFtbWl0LnVuaWNvZGVfbWFya3VwKQorCisgICAgICAgICAgICBzb3VwID0gQmVhdXRpZnVsU291cChkb2MsICJodG1sLnBhcnNlciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc291cC5jb250YWluc19yZXBsYWNlbWVudF9jaGFyYWN0ZXJzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuTk9UU0VUKQorICAgICAgICAgICAgYnM0LmRhbW1pdC5jaGFyZGV0X2RhbW1pdCA9IGNoYXJkZXQKKworICAgIGRlZiB0ZXN0X2J5dGVfb3JkZXJfbWFya19yZW1vdmVkKHNlbGYpOgorICAgICAgICAjIEEgZG9jdW1lbnQgd3JpdHRlbiBpbiBVVEYtMTZMRSB3aWxsIGhhdmUgaXRzIGJ5dGUgb3JkZXIgbWFya2VyIHN0cmlwcGVkLgorICAgICAgICBkYXRhID0gYidceGZmXHhmZTxceDAwYVx4MDA+XHgwMFx4ZTFceDAwXHhlOVx4MDA8XHgwMC9ceDAwYVx4MDA+XHgwMCcKKyAgICAgICAgZGFtbWl0ID0gVW5pY29kZURhbW1pdChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiPGE+w6HDqTwvYT4iLCBkYW1taXQudW5pY29kZV9tYXJrdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInV0Zi0xNmxlIiwgZGFtbWl0Lm9yaWdpbmFsX2VuY29kaW5nKQorCisgICAgZGVmIHRlc3RfZGV0d2luZ2xlKHNlbGYpOgorICAgICAgICAjIEhlcmUncyBhIFVURjggZG9jdW1lbnQuCisgICAgICAgIHV0ZjggPSAodSJcTntTTk9XTUFOfSIgKiAzKS5lbmNvZGUoInV0ZjgiKQorCisgICAgICAgICMgSGVyZSdzIGEgV2luZG93cy0xMjUyIGRvY3VtZW50LgorICAgICAgICB3aW5kb3dzXzEyNTIgPSAoCisgICAgICAgICAgICB1IlxOe0xFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLfUhpLCBJIGxpa2UgV2luZG93cyEiCisgICAgICAgICAgICB1IlxOe1JJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSS30iKS5lbmNvZGUoIndpbmRvd3NfMTI1MiIpCisKKyAgICAgICAgIyBUaHJvdWdoIHNvbWUgdW5ob2x5IGFsY2hlbXksIHRoZXkndmUgYmVlbiBzdHVjayB0b2dldGhlci4KKyAgICAgICAgZG9jID0gdXRmOCArIHdpbmRvd3NfMTI1MiArIHV0ZjgKKworICAgICAgICAjIFRoZSBkb2N1bWVudCBjYW4ndCBiZSB0dXJuZWQgaW50byBVVEYtODoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkb2MuZGVjb2RlLCAidXRmOCIpCisKKyAgICAgICAgIyBVbmljb2RlLCBEYW1taXQgdGhpbmtzIHRoZSB3aG9sZSBkb2N1bWVudCBpcyBXaW5kb3dzLTEyNTIsCisgICAgICAgICMgYW5kIGRlY29kZXMgaXQgaW50byAiw6LLnMaSw6LLnMaSw6LLnMaS4oCcSGksIEkgbGlrZSBXaW5kb3dzIeKAncOiy5zGksOiy5zGksOiy5zGkiIKKworICAgICAgICAjIEJ1dCBpZiB3ZSBydW4gaXQgdGhyb3VnaCBmaXhfZW1iZWRkZWRfd2luZG93c18xMjUyLCBpdCdzIGZpeGVkOgorCisgICAgICAgIGZpeGVkID0gVW5pY29kZURhbW1pdC5kZXR3aW5nbGUoZG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSLimIPimIPimIPigJxIaSwgSSBsaWtlIFdpbmRvd3Mh4oCd4piD4piD4piDIiwgZml4ZWQuZGVjb2RlKCJ1dGY4IikpCisKKyAgICBkZWYgdGVzdF9kZXR3aW5nbGVfaWdub3Jlc19tdWx0aWJ5dGVfY2hhcmFjdGVycyhzZWxmKToKKyAgICAgICAgIyBFYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgaGFzIGEgVVRGLTggcmVwcmVzZW50YXRpb24gZW5kaW5nCisgICAgICAgICMgaW4gXHg5My4gXHg5MyBpcyBhIHNtYXJ0IHF1b3RlIGlmIGludGVycHJldGVkIGFzCisgICAgICAgICMgV2luZG93cy0xMjUyLiBCdXQgb3VyIGNvZGUga25vd3MgdG8gc2tpcCBvdmVyIG11bHRpYnl0ZQorICAgICAgICAjIFVURi04IGNoYXJhY3RlcnMsIHNvIHRoZXknbGwgc3Vydml2ZSB0aGUgcHJvY2VzcyB1bnNjYXRoZWQuCisgICAgICAgIGZvciB0cmlja3lfdW5pY29kZV9jaGFyIGluICgKKyAgICAgICAgICAgIHUiXE57TEFUSU4gU01BTEwgTElHQVRVUkUgT0V9IiwgIyAyLWJ5dGUgY2hhciAnXHhjNVx4OTMnCisgICAgICAgICAgICB1IlxOe0xBVElOIFNVQlNDUklQVCBTTUFMTCBMRVRURVIgWH0iLCAjIDMtYnl0ZSBjaGFyICdceGUyXHg4Mlx4OTMnCisgICAgICAgICAgICB1Ilx4ZjBceDkwXHg5MFx4OTMiLCAjIFRoaXMgaXMgYSBDSksgY2hhcmFjdGVyLCBub3Qgc3VyZSB3aGljaCBvbmUuCisgICAgICAgICAgICApOgorICAgICAgICAgICAgaW5wdXQgPSB0cmlja3lfdW5pY29kZV9jaGFyLmVuY29kZSgidXRmOCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5wdXQuZW5kc3dpdGgoYidceDkzJykpCisgICAgICAgICAgICBvdXRwdXQgPSBVbmljb2RlRGFtbWl0LmRldHdpbmdsZShpbnB1dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LCBpbnB1dCkKKworY2xhc3MgVGVzdE5hbWVkc3BhY2VkQXR0cmlidXRlKFNvdXBUZXN0KToKKworICAgIGRlZiB0ZXN0X25hbWVfbWF5X2JlX25vbmUoc2VsZik6CisgICAgICAgIGEgPSBOYW1lc3BhY2VkQXR0cmlidXRlKCJ4bWxucyIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgInhtbG5zIikKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZV9pc19lcXVpdmFsZW50X3RvX2NvbG9uX3NlcGFyYXRlZF9zdHJpbmcoc2VsZik6CisgICAgICAgIGEgPSBOYW1lc3BhY2VkQXR0cmlidXRlKCJhIiwgImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhOmIiLCBhKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc19hcmVfZXF1aXZhbGVudF9pZl9wcmVmaXhfYW5kX25hbWVfaWRlbnRpY2FsKHNlbGYpOgorICAgICAgICBhID0gTmFtZXNwYWNlZEF0dHJpYnV0ZSgiYSIsICJiIiwgImMiKQorICAgICAgICBiID0gTmFtZXNwYWNlZEF0dHJpYnV0ZSgiYSIsICJiIiwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICAgICAgIyBUaGUgYWN0dWFsIG5hbWVzcGFjZSBpcyBub3QgY29uc2lkZXJlZC4KKyAgICAgICAgYyA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoImEiLCAiYiIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYykKKworICAgICAgICAjIEJ1dCBuYW1lIGFuZCBwcmVmaXggYXJlIGltcG9ydGFudC4KKyAgICAgICAgZCA9IE5hbWVzcGFjZWRBdHRyaWJ1dGUoImEiLCAieiIsICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBkKQorCisgICAgICAgIGUgPSBOYW1lc3BhY2VkQXR0cmlidXRlKCJ6IiwgImIiLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgZSkKKworCitjbGFzcyBUZXN0QXR0cmlidXRlVmFsdWVXaXRoQ2hhcnNldFN1YnN0aXR1dGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb250ZW50X21ldGFfYXR0cmlidXRlX3ZhbHVlKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IENoYXJzZXRNZXRhQXR0cmlidXRlVmFsdWUoImV1Yy1qcCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImV1Yy1qcCIsIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJldWMtanAiLCB2YWx1ZS5vcmlnaW5hbF92YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidXRmOCIsIHZhbHVlLmVuY29kZSgidXRmOCIpKQorCisKKyAgICBkZWYgdGVzdF9jb250ZW50X21ldGFfYXR0cmlidXRlX3ZhbHVlKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IENvbnRlbnRNZXRhQXR0cmlidXRlVmFsdWUoInRleHQvaHRtbDsgY2hhcnNldD1ldWMtanAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9ZXVjLWpwIiwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInRleHQvaHRtbDsgY2hhcnNldD1ldWMtanAiLCB2YWx1ZS5vcmlnaW5hbF92YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidGV4dC9odG1sOyBjaGFyc2V0PXV0ZjgiLCB2YWx1ZS5lbmNvZGUoInV0ZjgiKSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2JzNC90ZXN0cy90ZXN0X3RyZWUucHkgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF90cmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTE1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9iczQvdGVzdHMvdGVzdF90cmVlLnB5CkBAIC0wLDAgKzEsMTgyOSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyIiIlRlc3RzIGZvciBCZWF1dGlmdWwgU291cCdzIHRyZWUgdHJhdmVyc2FsIG1ldGhvZHMuCisKK1RoZSB0cmVlIHRyYXZlcnNhbCBtZXRob2RzIGFyZSB0aGUgbWFpbiBhZHZhbnRhZ2Ugb2YgdXNpbmcgQmVhdXRpZnVsCitTb3VwIG92ZXIganVzdCB1c2luZyBhIHBhcnNlci4KKworRGlmZmVyZW50IHBhcnNlcnMgd2lsbCBidWlsZCBkaWZmZXJlbnQgQmVhdXRpZnVsIFNvdXAgdHJlZXMgZ2l2ZW4gdGhlCitzYW1lIG1hcmt1cCwgYnV0IGFsbCBCZWF1dGlmdWwgU291cCB0cmVlcyBjYW4gYmUgdHJhdmVyc2VkIHdpdGggdGhlCittZXRob2RzIHRlc3RlZCBoZXJlLgorIiIiCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgcGlja2xlCitpbXBvcnQgcmUKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBiczQgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKK2Zyb20gYnM0LmJ1aWxkZXIgaW1wb3J0ICgKKyAgICBidWlsZGVyX3JlZ2lzdHJ5LAorICAgIEhUTUxQYXJzZXJUcmVlQnVpbGRlciwKKykKK2Zyb20gYnM0LmVsZW1lbnQgaW1wb3J0ICgKKyAgICBDRGF0YSwKKyAgICBDb21tZW50LAorICAgIERvY3R5cGUsCisgICAgTmF2aWdhYmxlU3RyaW5nLAorICAgIFNvdXBTdHJhaW5lciwKKyAgICBUYWcsCispCitmcm9tIGJzNC50ZXN0aW5nIGltcG9ydCAoCisgICAgU291cFRlc3QsCisgICAgc2tpcElmLAorKQorCitYTUxfQlVJTERFUl9QUkVTRU5UID0gKGJ1aWxkZXJfcmVnaXN0cnkubG9va3VwKCJ4bWwiKSBpcyBub3QgTm9uZSkKK0xYTUxfUFJFU0VOVCA9IChidWlsZGVyX3JlZ2lzdHJ5Lmxvb2t1cCgibHhtbCIpIGlzIG5vdCBOb25lKQorCitjbGFzcyBUcmVlVGVzdChTb3VwVGVzdCk6CisKKyAgICBkZWYgYXNzZXJ0U2VsZWN0cyhzZWxmLCB0YWdzLCBzaG91bGRfbWF0Y2gpOgorICAgICAgICAiIiJNYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gdGFncyBoYXZlIHRoZSBjb3JyZWN0IHRleHQuCisKKyAgICAgICAgVGhpcyBpcyB1c2VkIGluIHRlc3RzIHRoYXQgZGVmaW5lIGEgYnVuY2ggb2YgdGFncywgZWFjaAorICAgICAgICBjb250YWluaW5nIGEgc2luZ2xlIHN0cmluZywgYW5kIHRoZW4gc2VsZWN0IGNlcnRhaW4gc3RyaW5ncyBieQorICAgICAgICBzb21lIG1lY2hhbmlzbS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3RhZy5zdHJpbmcgZm9yIHRhZyBpbiB0YWdzXSwgc2hvdWxkX21hdGNoKQorCisgICAgZGVmIGFzc2VydFNlbGVjdHNJRHMoc2VsZiwgdGFncywgc2hvdWxkX21hdGNoKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIHRhZ3MgaGF2ZSB0aGUgY29ycmVjdCBJRHMuCisKKyAgICAgICAgVGhpcyBpcyB1c2VkIGluIHRlc3RzIHRoYXQgZGVmaW5lIGEgYnVuY2ggb2YgdGFncywgZWFjaAorICAgICAgICBjb250YWluaW5nIGEgc2luZ2xlIHN0cmluZywgYW5kIHRoZW4gc2VsZWN0IGNlcnRhaW4gc3RyaW5ncyBieQorICAgICAgICBzb21lIG1lY2hhbmlzbS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3RhZ1snaWQnXSBmb3IgdGFnIGluIHRhZ3NdLCBzaG91bGRfbWF0Y2gpCisKKworY2xhc3MgVGVzdEZpbmQoVHJlZVRlc3QpOgorICAgICIiIkJhc2ljIHRlc3RzIG9mIHRoZSBmaW5kKCkgbWV0aG9kLgorCisgICAgZmluZCgpIGp1c3QgY2FsbHMgZmluZF9hbGwoKSB3aXRoIGxpbWl0PTEsIHNvIGl0J3Mgbm90IHRlc3RlZCBhbGwKKyAgICB0aGF0IHRob3Vyb3VnaGx5IGhlcmUuCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF9maW5kX3RhZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+MTwvYT48Yj4yPC9iPjxhPjM8L2E+PGI+NDwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZCgiYiIpLnN0cmluZywgIjIiKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV90ZXh0X2ZpbmQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodSc8aDE+UsOka3Ntw7ZyZ8OlczwvaDE+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmZpbmQodGV4dD11J1LDpGtzbcO2cmfDpXMnKSwgdSdSw6Rrc23DtnJnw6VzJykKKworICAgIGRlZiB0ZXN0X2ZpbmRfZXZlcnl0aGluZyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCBhbiBvcHRpbWl6YXRpb24gdGhhdCBmaW5kcyBhbGwgdGFncy4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPC9hPjxiPmJhcjwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihzb3VwLmZpbmRfYWxsKCkpKQorCisgICAgZGVmIHRlc3RfZmluZF9ldmVyeXRoaW5nX3dpdGhfbmFtZShzZWxmKToKKyAgICAgICAgIiIiVGVzdCBhbiBvcHRpbWl6YXRpb24gdGhhdCBmaW5kcyBhbGwgdGFncyB3aXRoIGEgZ2l2ZW4gbmFtZS4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+Zm9vPC9hPjxiPmJhcjwvYj48YT5iYXo8L2E+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4oc291cC5maW5kX2FsbCgnYScpKSkKKworY2xhc3MgVGVzdEZpbmRBbGwoVHJlZVRlc3QpOgorICAgICIiIkJhc2ljIHRlc3RzIG9mIHRoZSBmaW5kX2FsbCgpIG1ldGhvZC4iIiIKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3RleHRfbm9kZXMoc2VsZik6CisgICAgICAgICIiIllvdSBjYW4gc2VhcmNoIHRoZSB0cmVlIGZvciB0ZXh0IG5vZGVzLiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8aHRtbD5Gb288Yj5iYXI8L2I+XHhiYjwvaHRtbD4iKQorICAgICAgICAjIEV4YWN0IG1hdGNoLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZF9hbGwodGV4dD0iYmFyIiksIFt1ImJhciJdKQorICAgICAgICAjIE1hdGNoIGFueSBvZiBhIG51bWJlciBvZiBzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5maW5kX2FsbCh0ZXh0PVsiRm9vIiwgImJhciJdKSwgW3UiRm9vIiwgdSJiYXIiXSkKKyAgICAgICAgIyBNYXRjaCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmZpbmRfYWxsKHRleHQ9cmUuY29tcGlsZSgnLionKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgW3UiRm9vIiwgdSJiYXIiLCB1J1x4YmInXSkKKyAgICAgICAgIyBNYXRjaCBhbnl0aGluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmZpbmRfYWxsKHRleHQ9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgW3UiRm9vIiwgdSJiYXIiLCB1J1x4YmInXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2xpbWl0KHNlbGYpOgorICAgICAgICAiIiJZb3UgY2FuIGxpbWl0IHRoZSBudW1iZXIgb2YgaXRlbXMgcmV0dXJuZWQgYnkgZmluZF9hbGwuIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjE8L2E+PGE+MjwvYT48YT4zPC9hPjxhPjQ8L2E+PGE+NTwvYT4iKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc291cC5maW5kX2FsbCgnYScsIGxpbWl0PTMpLCBbIjEiLCAiMiIsICIzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzb3VwLmZpbmRfYWxsKCdhJywgbGltaXQ9MSksIFsiMSJdKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzb3VwLmZpbmRfYWxsKCdhJywgbGltaXQ9MTApLCBbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSJdKQorCisgICAgICAgICMgQSBsaW1pdCBvZiAwIG1lYW5zIG5vIGxpbWl0LgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzb3VwLmZpbmRfYWxsKCdhJywgbGltaXQ9MCksIFsiMSIsICIyIiwgIjMiLCAiNCIsICI1Il0pCisKKyAgICBkZWYgdGVzdF9jYWxsaW5nX2FfdGFnX2lzX2NhbGxpbmdfZmluZGFsbChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+MTwvYT48Yj4yPGEgaWQ9J2Zvbyc+MzwvYT48L2I+IikKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNvdXAoJ2EnLCBsaW1pdD0xKSwgWyIxIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzb3VwLmIoaWQ9ImZvbyIpLCBbIjMiXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfc2VsZl9yZWZlcmVudGlhbF9kYXRhX3N0cnVjdHVyZV9kb2VzX25vdF9jYXVzZV9pbmZpbml0ZV9yZWN1cnNpb24oc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjwvYT4iKQorICAgICAgICAjIENyZWF0ZSBhIHNlbGYtcmVmZXJlbnRpYWwgbGlzdC4KKyAgICAgICAgbCA9IFtdCisgICAgICAgIGwuYXBwZW5kKGwpCisKKyAgICAgICAgIyBXaXRob3V0IHNwZWNpYWwgY29kZSBpbiBfbm9ybWFsaXplX3NlYXJjaF92YWx1ZSwgdGhpcyB3b3VsZCBjYXVzZSBpbmZpbml0ZQorICAgICAgICAjIHJlY3Vyc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc291cC5maW5kX2FsbChsKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3Jlc3VsdHNldChzZWxmKToKKyAgICAgICAgIiIiQWxsIGZpbmRfYWxsIGNhbGxzIHJldHVybiBhIFJlc3VsdFNldCIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48L2E+IikKKyAgICAgICAgcmVzdWx0ID0gc291cC5maW5kX2FsbCgiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHJlc3VsdCwgInNvdXJjZSIpKQorCisgICAgICAgIHJlc3VsdCA9IHNvdXAuZmluZF9hbGwoVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVzdWx0LCAic291cmNlIikpCisKKyAgICAgICAgcmVzdWx0ID0gc291cC5maW5kX2FsbCh0ZXh0PSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihyZXN1bHQsICJzb3VyY2UiKSkKKworCitjbGFzcyBUZXN0RmluZEFsbEJhc2ljTmFtZXNwYWNlcyhUcmVlVGVzdCk6CisKKyAgICBkZWYgdGVzdF9maW5kX2J5X25hbWVzcGFjZWRfbmFtZShzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgnPG1hdGhtbDptc3FydD40PC9tYXRobWw6bXNxcnQ+PGEgc3ZnOmZpbGw9InJlZCI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiNCIsIHNvdXAuZmluZCgibWF0aG1sOm1zcXJ0Iikuc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgc291cC5maW5kKGF0dHJzPSB7ICJzdmc6ZmlsbCIgOiAicmVkIiB9KS5uYW1lKQorCisKK2NsYXNzIFRlc3RGaW5kQWxsQnlOYW1lKFRyZWVUZXN0KToKKyAgICAiIiJUZXN0IHdheXMgb2YgZmluZGluZyB0YWdzIGJ5IHRhZyBuYW1lLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUcmVlVGVzdCwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnRyZWUgPSAgc2VsZi5zb3VwKCIiIjxhPkZpcnN0IHRhZy48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+U2Vjb25kIHRhZy48L2I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGM+VGhpcmQgPGE+TmVzdGVkIHRhZy48L2E+IHRhZy48L2M+IiIiKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfYnlfdGFnX25hbWUoc2VsZik6CisgICAgICAgICMgRmluZCBhbGwgdGhlIDxhPiB0YWdzLgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzZWxmLnRyZWUuZmluZF9hbGwoJ2EnKSwgWydGaXJzdCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV9uYW1lX2FuZF90ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzZWxmLnRyZWUuZmluZF9hbGwoJ2EnLCB0ZXh0PSdGaXJzdCB0YWcuJyksIFsnRmlyc3QgdGFnLiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbCgnYScsIHRleHQ9VHJ1ZSksIFsnRmlyc3QgdGFnLicsICdOZXN0ZWQgdGFnLiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbCgnYScsIHRleHQ9cmUuY29tcGlsZSgidGFnIikpLAorICAgICAgICAgICAgWydGaXJzdCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX29uX25vbl9yb290X2VsZW1lbnQoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBjYWxsIGZpbmRfYWxsIG9uIGFueSBub2RlLCBub3QganVzdCB0aGUgcm9vdC4KKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNlbGYudHJlZS5jLmZpbmRfYWxsKCdhJyksIFsnTmVzdGVkIHRhZy4nXSkKKworICAgIGRlZiB0ZXN0X2NhbGxpbmdfZWxlbWVudF9pbnZva2VzX2ZpbmRfYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc2VsZi50cmVlKCdhJyksIFsnRmlyc3QgdGFnLicsICdOZXN0ZWQgdGFnLiddKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfYnlfdGFnX3N0cmFpbmVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICBzZWxmLnRyZWUuZmluZF9hbGwoU291cFN0cmFpbmVyKCdhJykpLAorICAgICAgICAgICAgWydGaXJzdCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV90YWdfbmFtZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbChbJ2EnLCAnYiddKSwKKyAgICAgICAgICAgIFsnRmlyc3QgdGFnLicsICdTZWNvbmQgdGFnLicsICdOZXN0ZWQgdGFnLiddKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfYnlfdGFnX2RpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbCh7J2EnIDogVHJ1ZSwgJ2InIDogVHJ1ZX0pLAorICAgICAgICAgICAgWydGaXJzdCB0YWcuJywgJ1NlY29uZCB0YWcuJywgJ05lc3RlZCB0YWcuJ10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV90YWdfcmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygKKyAgICAgICAgICAgIHNlbGYudHJlZS5maW5kX2FsbChyZS5jb21waWxlKCdeW2FiXSQnKSksCisgICAgICAgICAgICBbJ0ZpcnN0IHRhZy4nLCAnU2Vjb25kIHRhZy4nLCAnTmVzdGVkIHRhZy4nXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfdGFnc19tYXRjaGluZ19tZXRob2Qoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBkZWZpbmUgYW4gb3JhY2xlIG1ldGhvZCB0aGF0IGRldGVybWluZXMgd2hldGhlcgorICAgICAgICAjIGEgdGFnIG1hdGNoZXMgdGhlIHNlYXJjaC4KKyAgICAgICAgZGVmIGlkX21hdGNoZXNfbmFtZSh0YWcpOgorICAgICAgICAgICAgcmV0dXJuIHRhZy5uYW1lID09IHRhZy5nZXQoJ2lkJykKKworICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIjxhIGlkPSJhIj5NYXRjaCAxLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iMSI+RG9lcyBub3QgbWF0Y2guPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiIGlkPSJiIj5NYXRjaCAyLjwvYT4iIiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgdHJlZS5maW5kX2FsbChpZF9tYXRjaGVzX25hbWUpLCBbIk1hdGNoIDEuIiwgIk1hdGNoIDIuIl0pCisKKworY2xhc3MgVGVzdEZpbmRBbGxCeUF0dHJpYnV0ZShUcmVlVGVzdCk6CisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV9hdHRyaWJ1dGVfbmFtZShzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIHBhc3MgaW4ga2V5d29yZCBhcmd1bWVudHMgdG8gZmluZF9hbGwgdG8gc2VhcmNoIGJ5CisgICAgICAgICMgYXR0cmlidXRlLgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIgorICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJmaXJzdCI+TWF0Y2hpbmcgYS48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9InNlY29uZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbi1tYXRjaGluZyA8YiBpZD0iZmlyc3QiPk1hdGNoaW5nIGIuPC9iPmEuCisgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoaWQ9J2ZpcnN0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbIk1hdGNoaW5nIGEuIiwgIk1hdGNoaW5nIGIuIl0pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV91dGY4X2F0dHJpYnV0ZV92YWx1ZShzZWxmKToKKyAgICAgICAgcGVhY2UgPSB1Ited15XXnNepIi5lbmNvZGUoInV0ZjgiKQorICAgICAgICBkYXRhID0gdSc8YSB0aXRsZT0i153Xldec16kiPjwvYT4nLmVuY29kZSgidXRmOCIpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbc291cC5hXSwgc291cC5maW5kX2FsbCh0aXRsZT1wZWFjZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3NvdXAuYV0sIHNvdXAuZmluZF9hbGwodGl0bGU9cGVhY2UuZGVjb2RlKCJ1dGY4IikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtzb3VwLmFdLCBzb3VwLmZpbmRfYWxsKHRpdGxlPVtwZWFjZSwgInNvbWV0aGluZyBlbHNlIl0pKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfYnlfYXR0cmlidXRlX2RpY3Qoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBwYXNzIGluIGEgZGljdGlvbmFyeSBhcyB0aGUgYXJndW1lbnQgJ2F0dHJzJy4gVGhpcworICAgICAgICAjIGxldHMgeW91IHNlYXJjaCBmb3IgYXR0cmlidXRlcyBsaWtlICduYW1lJyAoYSBmaXhlZCBhcmd1bWVudAorICAgICAgICAjIHRvIGZpbmRfYWxsKSBhbmQgJ2NsYXNzJyAoYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4pCisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0ibmFtZTEiIGNsYXNzPSJjbGFzczEiPk5hbWUgbWF0Y2guPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9Im5hbWUyIiBjbGFzcz0iY2xhc3MyIj5DbGFzcyBtYXRjaC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0ibmFtZTMiIGNsYXNzPSJjbGFzczMiPk5vbi1tYXRjaC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWUxPkEgdGFnIGNhbGxlZCAnbmFtZTEnLjwvbmFtZTE+CisgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCisgICAgICAgICMgVGhpcyBkb2Vzbid0IGRvIHdoYXQgeW91IHdhbnQuCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKG5hbWU9J25hbWUxJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbIkEgdGFnIGNhbGxlZCAnbmFtZTEnLiJdKQorICAgICAgICAjIFRoaXMgZG9lcyB3aGF0IHlvdSB3YW50LgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbChhdHRycz17J25hbWUnIDogJ25hbWUxJ30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJOYW1lIG1hdGNoLiJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKGF0dHJzPXsnY2xhc3MnIDogJ2NsYXNzMid9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiQ2xhc3MgbWF0Y2guIl0pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9ieV9jbGFzcyhzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iMSI+Q2xhc3MgMS48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IjIiPkNsYXNzIDIuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzPSIxIj5DbGFzcyAxLjwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8YyBjbGFzcz0iMyA0Ij5DbGFzcyAzIGFuZCA0LjwvYz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgIyBQYXNzaW5nIGluIHRoZSBjbGFzc18ga2V5d29yZCBhcmd1bWVudCB3aWxsIHNlYXJjaCBhZ2FpbnN0CisgICAgICAgICMgdGhlICdjbGFzcycgYXR0cmlidXRlLgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHModHJlZS5maW5kX2FsbCgnYScsIGNsYXNzXz0nMScpLCBbJ0NsYXNzIDEuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKCdjJywgY2xhc3NfPSczJyksIFsnQ2xhc3MgMyBhbmQgNC4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoJ2MnLCBjbGFzc189JzQnKSwgWydDbGFzcyAzIGFuZCA0LiddKQorCisgICAgICAgICMgUGFzc2luZyBpbiBhIHN0cmluZyB0byAnYXR0cnMnIHdpbGwgYWxzbyBzZWFyY2ggdGhlIENTUyBjbGFzcy4KKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoJ2EnLCAnMScpLCBbJ0NsYXNzIDEuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKGF0dHJzPScxJyksIFsnQ2xhc3MgMS4nLCAnQ2xhc3MgMS4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoJ2MnLCAnMycpLCBbJ0NsYXNzIDMgYW5kIDQuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKCdjJywgJzQnKSwgWydDbGFzcyAzIGFuZCA0LiddKQorCisgICAgZGVmIHRlc3RfZmluZF9ieV9jbGFzc193aGVuX211bHRpcGxlX2NsYXNzZXNfcHJlc2VudChzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiPGdhciBjbGFzcz0nZm9vIGJhcic+Rm91bmQgaXQ8L2dhcj4iKQorCisgICAgICAgIGYgPSB0cmVlLmZpbmRfYWxsKCJnYXIiLCBjbGFzc189cmUuY29tcGlsZSgibyIpKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoZiwgWyJGb3VuZCBpdCJdKQorCisgICAgICAgIGYgPSB0cmVlLmZpbmRfYWxsKCJnYXIiLCBjbGFzc189cmUuY29tcGlsZSgiYSIpKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoZiwgWyJGb3VuZCBpdCJdKQorCisgICAgICAgICMgU2luY2UgdGhlIGNsYXNzIGlzIG5vdCB0aGUgc3RyaW5nICJmb28gYmFyIiwgYnV0IHRoZSB0d28KKyAgICAgICAgIyBzdHJpbmdzICJmb28iIGFuZCAiYmFyIiwgdGhpcyB3aWxsIG5vdCBmaW5kIGFueXRoaW5nLgorICAgICAgICBmID0gdHJlZS5maW5kX2FsbCgiZ2FyIiwgY2xhc3NfPXJlLmNvbXBpbGUoIm8gYiIpKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoZiwgW10pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF93aXRoX25vbl9kaWN0aW9uYXJ5X2Zvcl9hdHRyc19maW5kc19ieV9jbGFzcyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGEgY2xhc3M9J2Jhcic+Rm91bmQgaXQ8L2E+IikKKworICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc291cC5maW5kX2FsbCgiYSIsIHJlLmNvbXBpbGUoImJhIikpLCBbIkZvdW5kIGl0Il0pCisKKyAgICAgICAgZGVmIGJpZ19hdHRyaWJ1dGVfdmFsdWUodmFsdWUpOgorICAgICAgICAgICAgcmV0dXJuIGxlbih2YWx1ZSkgPiAzCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNvdXAuZmluZF9hbGwoImEiLCBiaWdfYXR0cmlidXRlX3ZhbHVlKSwgW10pCisKKyAgICAgICAgZGVmIHNtYWxsX2F0dHJpYnV0ZV92YWx1ZSh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gbGVuKHZhbHVlKSA8PSAzCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc291cC5maW5kX2FsbCgiYSIsIHNtYWxsX2F0dHJpYnV0ZV92YWx1ZSksIFsiRm91bmQgaXQiXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfc3RyaW5nX2Zvcl9hdHRyc19maW5kc19tdWx0aXBsZV9jbGFzc2VzKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8YSBjbGFzcz0iZm9vIGJhciI+PC9hPjxhIGNsYXNzPSJmb28iPjwvYT4nKQorICAgICAgICBhLCBhMiA9IHNvdXAuZmluZF9hbGwoImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFthLCBhMl0sIHNvdXAuZmluZF9hbGwoImEiLCAiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2FdLCBzb3VwLmZpbmRfYWxsKCJhIiwgImJhciIpKQorCisgICAgICAgICMgSWYgeW91IHNwZWNpZnkgdGhlIGNsYXNzIGFzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYQorICAgICAgICAjIHNwYWNlLCBvbmx5IHRoYXQgc3BlY2lmaWMgdmFsdWUgd2lsbCBiZSBmb3VuZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYV0sIHNvdXAuZmluZF9hbGwoImEiLCBjbGFzc189ImZvbyBiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYV0sIHNvdXAuZmluZF9hbGwoImEiLCAiZm9vIGJhciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzb3VwLmZpbmRfYWxsKCJhIiwgImJhciBmb28iKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX2J5X2F0dHJpYnV0ZV9zb3Vwc3RyYWluZXIoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImZpcnN0Ij5NYXRjaC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9InNlY29uZCI+Tm9uLW1hdGNoLjwvYT4iIiIpCisKKyAgICAgICAgc3RyYWluZXIgPSBTb3VwU3RyYWluZXIoYXR0cnM9eydpZCcgOiAnZmlyc3QnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoc3RyYWluZXIpLCBbJ01hdGNoLiddKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfd2l0aF9taXNzaW5nX2F0cmlidXRlKHNlbGYpOgorICAgICAgICAjIFlvdSBjYW4gcGFzcyBpbiBOb25lIGFzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgdG8gZmluZF9hbGwuCisgICAgICAgICMgVGhpcyB3aWxsIG1hdGNoIHRhZ3MgdGhhdCBkbyBub3QgaGF2ZSB0aGF0IGF0dHJpYnV0ZSBzZXQuCisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiPGEgaWQ9IjEiPklEIHByZXNlbnQuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhPk5vIElEIHByZXNlbnQuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSIiPklEIGlzIGVtcHR5LjwvYT4iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKCdhJywgaWQ9Tm9uZSksIFsiTm8gSUQgcHJlc2VudC4iXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfZGVmaW5lZF9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBwYXNzIGluIE5vbmUgYXMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSB0byBmaW5kX2FsbC4KKyAgICAgICAgIyBUaGlzIHdpbGwgbWF0Y2ggdGFncyB0aGF0IGhhdmUgdGhhdCBhdHRyaWJ1dGUgc2V0IHRvIGFueSB2YWx1ZS4KKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiI8YSBpZD0iMSI+SUQgcHJlc2VudC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+Tm8gSUQgcHJlc2VudC48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IiI+SUQgaXMgZW1wdHkuPC9hPiIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgdHJlZS5maW5kX2FsbChpZD1UcnVlKSwgWyJJRCBwcmVzZW50LiIsICJJRCBpcyBlbXB0eS4iXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX3dpdGhfbnVtZXJpY19hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgICMgSWYgeW91IHNlYXJjaCBmb3IgYSBudW1iZXIsIGl0J3MgdHJlYXRlZCBhcyBhIHN0cmluZy4KKyAgICAgICAgdHJlZSA9IHNlbGYuc291cCgiIiI8YSBpZD0xPlVucXVvdGVkIGF0dHJpYnV0ZS48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IjEiPlF1b3RlZCBhdHRyaWJ1dGUuPC9hPiIiIikKKworICAgICAgICBleHBlY3RlZCA9IFsiVW5xdW90ZWQgYXR0cmlidXRlLiIsICJRdW90ZWQgYXR0cmlidXRlLiJdCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0cmVlLmZpbmRfYWxsKGlkPTEpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoaWQ9IjEiKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF93aXRoX2xpc3RfYXR0cmlidXRlX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBZb3UgY2FuIHBhc3MgYSBsaXN0IG9mIGF0dHJpYnV0ZSB2YWx1ZXMgaW5zdGVhZCBvZiBqdXN0IG9uZSwKKyAgICAgICAgIyBhbmQgeW91J2xsIGdldCB0YWdzIHRoYXQgbWF0Y2ggYW55IG9mIHRoZSB2YWx1ZXMuCisgICAgICAgIHRyZWUgPSBzZWxmLnNvdXAoIiIiPGEgaWQ9IjEiPjE8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IjIiPjI8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9IjMiPjM8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+Tm8gSUQuPC9hPiIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoaWQ9WyIxIiwgIjMiLCAiNCJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiMSIsICIzIl0pCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF93aXRoX3JlZ3VsYXJfZXhwcmVzc2lvbl9hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgICMgWW91IGNhbiBwYXNzIGEgcmVndWxhciBleHByZXNzaW9uIGFzIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgYW5kCisgICAgICAgICMgeW91J2xsIGdldCB0YWdzIHdob3NlIHZhbHVlcyBmb3IgdGhhdCBhdHRyaWJ1dGUgbWF0Y2ggdGhlCisgICAgICAgICMgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIjxhIGlkPSJhIj5PbmUgYS48L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaWQ9ImFhIj5Ud28gYXMuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJhYiI+TWl4ZWQgYXMgYW5kIGJzLjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD0iYiI+T25lIGIuPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhPk5vIElELjwvYT4iIiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHRyZWUuZmluZF9hbGwoaWQ9cmUuY29tcGlsZSgiXmErJCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiT25lIGEuIiwgIlR3byBhcy4iXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYnlfbmFtZV9hbmRfY29udGFpbmluZ19zdHJpbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxiPmZvbzwvYj48Yj5iYXI8L2I+PGE+Zm9vPC9hPiIpCisgICAgICAgIGEgPSBzb3VwLmEKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFthXSwgc291cC5maW5kX2FsbCgiYSIsIHRleHQ9ImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzb3VwLmZpbmRfYWxsKCJhIiwgdGV4dD0iYmFyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNvdXAuZmluZF9hbGwoImEiLCB0ZXh0PSJiYXIiKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYnlfbmFtZV9hbmRfY29udGFpbmluZ19zdHJpbmdfd2hlbl9zdHJpbmdfaXNfYnVyaWVkKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT5mb288L2E+PGE+PGI+PGM+Zm9vPC9jPjwvYj48L2E+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmZpbmRfYWxsKCJhIiksIHNvdXAuZmluZF9hbGwoImEiLCB0ZXh0PSJmb28iKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYnlfYXR0cmlidXRlX2FuZF9jb250YWluaW5nX3N0cmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgnPGIgaWQ9IjEiPmZvbzwvYj48YSBpZD0iMiI+Zm9vPC9hPicpCisgICAgICAgIGEgPSBzb3VwLmEKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFthXSwgc291cC5maW5kX2FsbChpZD0yLCB0ZXh0PSJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc291cC5maW5kX2FsbChpZD0xLCB0ZXh0PSJiYXIiKSkKKworCisKKworY2xhc3MgVGVzdEluZGV4KFRyZWVUZXN0KToKKyAgICAiIiJUZXN0IFRhZy5pbmRleCIiIgorICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIjxkaXY+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+SWRlbnRpY2FsPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPk5vdCBpZGVudGljYWw8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE+SWRlbnRpY2FsPC9hPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGM+PGQ+SWRlbnRpY2FsIHdpdGggY2hpbGQ8L2Q+PC9jPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkFsc28gbm90IGlkZW50aWNhbDwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yz48ZD5JZGVudGljYWwgd2l0aCBjaGlsZDwvZD48L2M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IiIiKQorICAgICAgICBkaXYgPSB0cmVlLmRpdgorICAgICAgICBmb3IgaSwgZWxlbWVudCBpbiBlbnVtZXJhdGUoZGl2LmNvbnRlbnRzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgZGl2LmluZGV4KGVsZW1lbnQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0cmVlLmluZGV4LCAxKQorCisKK2NsYXNzIFRlc3RQYXJlbnRPcGVyYXRpb25zKFRyZWVUZXN0KToKKyAgICAiIiJUZXN0IG5hdmlnYXRpb24gYW5kIHNlYXJjaGluZyB0aHJvdWdoIGFuIGVsZW1lbnQncyBwYXJlbnRzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0UGFyZW50T3BlcmF0aW9ucywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnRyZWUgPSBzZWxmLnNvdXAoJycnPHVsIGlkPSJlbXB0eSI+PC91bD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBpZD0idG9wIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgaWQ9Im1pZGRsZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBpZD0iYm90dG9tIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPlN0YXJ0IGhlcmU8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4nJycpCisgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLnRyZWUuYgorCisKKyAgICBkZWYgdGVzdF9wYXJlbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5wYXJlbnRbJ2lkJ10sICdib3R0b20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQucGFyZW50LnBhcmVudFsnaWQnXSwgJ21pZGRsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5wYXJlbnQucGFyZW50LnBhcmVudFsnaWQnXSwgJ3RvcCcpCisKKyAgICBkZWYgdGVzdF9wYXJlbnRfb2ZfdG9wX3RhZ19pc19zb3VwX29iamVjdChzZWxmKToKKyAgICAgICAgdG9wX3RhZyA9IHNlbGYudHJlZS5jb250ZW50c1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvcF90YWcucGFyZW50LCBzZWxmLnRyZWUpCisKKyAgICBkZWYgdGVzdF9zb3VwX29iamVjdF9oYXNfbm9fcGFyZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYudHJlZS5wYXJlbnQpCisKKyAgICBkZWYgdGVzdF9maW5kX3BhcmVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0c0lEcygKKyAgICAgICAgICAgIHNlbGYuc3RhcnQuZmluZF9wYXJlbnRzKCd1bCcpLCBbJ2JvdHRvbScsICdtaWRkbGUnLCAndG9wJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0c0lEcygKKyAgICAgICAgICAgIHNlbGYuc3RhcnQuZmluZF9wYXJlbnRzKCd1bCcsIGlkPSJtaWRkbGUiKSwgWydtaWRkbGUnXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcGFyZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQuZmluZF9wYXJlbnQoJ3VsJylbJ2lkJ10sICdib3R0b20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQuZmluZF9wYXJlbnQoJ3VsJywgaWQ9J3RvcCcpWydpZCddLCAndG9wJykKKworICAgIGRlZiB0ZXN0X3BhcmVudF9vZl90ZXh0X2VsZW1lbnQoc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRyZWUuZmluZCh0ZXh0PSJTdGFydCBoZXJlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnBhcmVudC5uYW1lLCAnYicpCisKKyAgICBkZWYgdGVzdF90ZXh0X2VsZW1lbnRfZmluZF9wYXJlbnQoc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRyZWUuZmluZCh0ZXh0PSJTdGFydCBoZXJlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LmZpbmRfcGFyZW50KCd1bCcpWydpZCddLCAnYm90dG9tJykKKworICAgIGRlZiB0ZXN0X3BhcmVudF9nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHBhcmVudHMgPSBbcGFyZW50WydpZCddIGZvciBwYXJlbnQgaW4gc2VsZi5zdGFydC5wYXJlbnRzCisgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGlzIG5vdCBOb25lIGFuZCAnaWQnIGluIHBhcmVudC5hdHRyc10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJlbnRzLCBbJ2JvdHRvbScsICdtaWRkbGUnLCAndG9wJ10pCisKKworY2xhc3MgUHJveGltaXR5VGVzdChUcmVlVGVzdCk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRyZWVUZXN0LCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYudHJlZSA9IHNlbGYuc291cCgKKyAgICAgICAgICAgICc8aHRtbCBpZD0ic3RhcnQiPjxoZWFkPjwvaGVhZD48Ym9keT48YiBpZD0iMSI+T25lPC9iPjxiIGlkPSIyIj5Ud288L2I+PGIgaWQ9IjMiPlRocmVlPC9iPjwvYm9keT48L2h0bWw+JykKKworCitjbGFzcyBUZXN0TmV4dE9wZXJhdGlvbnMoUHJveGltaXR5VGVzdCk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3ROZXh0T3BlcmF0aW9ucywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnN0YXJ0ID0gc2VsZi50cmVlLmIKKworICAgIGRlZiB0ZXN0X25leHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5uZXh0X2VsZW1lbnQsICJPbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RhcnQubmV4dF9lbGVtZW50Lm5leHRfZWxlbWVudFsnaWQnXSwgIjIiKQorCisgICAgZGVmIHRlc3RfbmV4dF9vZl9sYXN0X2l0ZW1faXNfbm9uZShzZWxmKToKKyAgICAgICAgbGFzdCA9IHNlbGYudHJlZS5maW5kKHRleHQ9IlRocmVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYXN0Lm5leHRfZWxlbWVudCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25leHRfb2Zfcm9vdF9pc19ub25lKHNlbGYpOgorICAgICAgICAjIFRoZSBkb2N1bWVudCByb290IGlzIG91dHNpZGUgdGhlIG5leHQvcHJldmlvdXMgY2hhaW4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmVlLm5leHRfZWxlbWVudCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX25leHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxmLnN0YXJ0LmZpbmRfYWxsX25leHQoJ2InKSwgWyJUd28iLCAiVGhyZWUiXSkKKyAgICAgICAgc2VsZi5zdGFydC5maW5kX2FsbF9uZXh0KGlkPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxmLnN0YXJ0LmZpbmRfYWxsX25leHQoaWQ9MyksIFsiVGhyZWUiXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbmV4dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0LmZpbmRfbmV4dCgnYicpWydpZCddLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5maW5kX25leHQodGV4dD0iVGhyZWUiKSwgIlRocmVlIikKKworICAgIGRlZiB0ZXN0X2ZpbmRfbmV4dF9mb3JfdGV4dF9lbGVtZW50KHNlbGYpOgorICAgICAgICB0ZXh0ID0gc2VsZi50cmVlLmZpbmQodGV4dD0iT25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LmZpbmRfbmV4dCgiYiIpLnN0cmluZywgIlR3byIpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyh0ZXh0LmZpbmRfYWxsX25leHQoImIiKSwgWyJUd28iLCAiVGhyZWUiXSkKKworICAgIGRlZiB0ZXN0X25leHRfZ2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudHJlZS5maW5kKHRleHQ9IlR3byIpCisgICAgICAgIHN1Y2Nlc3NvcnMgPSBbbm9kZSBmb3Igbm9kZSBpbiBzdGFydC5uZXh0X2VsZW1lbnRzXQorICAgICAgICAjIFRoZXJlIGFyZSB0d28gc3VjY2Vzc29yczogdGhlIGZpbmFsIDxiPiB0YWcgYW5kIGl0cyB0ZXh0IGNvbnRlbnRzLgorICAgICAgICB0YWcsIGNvbnRlbnRzID0gc3VjY2Vzc29ycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhZ1snaWQnXSwgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCAiVGhyZWUiKQorCitjbGFzcyBUZXN0UHJldmlvdXNPcGVyYXRpb25zKFByb3hpbWl0eVRlc3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0UHJldmlvdXNPcGVyYXRpb25zLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuZW5kID0gc2VsZi50cmVlLmZpbmQodGV4dD0iVGhyZWUiKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmQucHJldmlvdXNfZWxlbWVudFsnaWQnXSwgIjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5kLnByZXZpb3VzX2VsZW1lbnQucHJldmlvdXNfZWxlbWVudCwgIlR3byIpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19vZl9maXJzdF9pdGVtX2lzX25vbmUoc2VsZik6CisgICAgICAgIGZpcnN0ID0gc2VsZi50cmVlLmZpbmQoJ2h0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0LnByZXZpb3VzX2VsZW1lbnQsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19vZl9yb290X2lzX25vbmUoc2VsZik6CisgICAgICAgICMgVGhlIGRvY3VtZW50IHJvb3QgaXMgb3V0c2lkZSB0aGUgbmV4dC9wcmV2aW91cyBjaGFpbi4KKyAgICAgICAgIyBYWFggVGhpcyBpcyBicm9rZW4hCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJlZS5wcmV2aW91c19lbGVtZW50LCBOb25lKQorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9wcmV2aW91cyhzZWxmKToKKyAgICAgICAgIyBUaGUgPGI+IHRhZyBjb250YWluaW5nIHRoZSAiVGhyZWUiIG5vZGUgaXMgdGhlIHByZWRlY2Vzc29yCisgICAgICAgICMgb2YgdGhlICJUaHJlZSIgbm9kZSBpdHNlbGYsIHdoaWNoIGlzIHdoeSAiVGhyZWUiIHNob3dzIHVwCisgICAgICAgICMgaGVyZS4KKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKAorICAgICAgICAgICAgc2VsZi5lbmQuZmluZF9hbGxfcHJldmlvdXMoJ2InKSwgWyJUaHJlZSIsICJUd28iLCAiT25lIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzZWxmLmVuZC5maW5kX2FsbF9wcmV2aW91cyhpZD0xKSwgWyJPbmUiXSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcHJldmlvdXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmQuZmluZF9wcmV2aW91cygnYicpWydpZCddLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmQuZmluZF9wcmV2aW91cyh0ZXh0PSJPbmUiKSwgIk9uZSIpCisKKyAgICBkZWYgdGVzdF9maW5kX3ByZXZpb3VzX2Zvcl90ZXh0X2VsZW1lbnQoc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRyZWUuZmluZCh0ZXh0PSJUaHJlZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5maW5kX3ByZXZpb3VzKCJiIikuc3RyaW5nLCAiVGhyZWUiKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoCisgICAgICAgICAgICB0ZXh0LmZpbmRfYWxsX3ByZXZpb3VzKCJiIiksIFsiVGhyZWUiLCAiVHdvIiwgIk9uZSJdKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXNfZ2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudHJlZS5maW5kKHRleHQ9Ik9uZSIpCisgICAgICAgIHByZWRlY2Vzc29ycyA9IFtub2RlIGZvciBub2RlIGluIHN0YXJ0LnByZXZpb3VzX2VsZW1lbnRzXQorCisgICAgICAgICMgVGhlcmUgYXJlIGZvdXIgcHJlZGVjZXNzb3JzOiB0aGUgPGI+IHRhZyBjb250YWluaW5nICJPbmUiCisgICAgICAgICMgdGhlIDxib2R5PiB0YWcsIHRoZSA8aGVhZD4gdGFnLCBhbmQgdGhlIDxodG1sPiB0YWcuCisgICAgICAgIGIsIGJvZHksIGhlYWQsIGh0bWwgPSBwcmVkZWNlc3NvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWydpZCddLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9keS5uYW1lLCAiYm9keSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZC5uYW1lLCAiaGVhZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHRtbC5uYW1lLCAiaHRtbCIpCisKKworY2xhc3MgU2libGluZ1Rlc3QoVHJlZVRlc3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihTaWJsaW5nVGVzdCwgc2VsZikuc2V0VXAoKQorICAgICAgICBtYXJrdXAgPSAnJyc8aHRtbD4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IjEiPgorICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IjEuMSI+PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSIyIj4KKyAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSIyLjEiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iMyI+CisgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iMy4xIj48L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IjQiPjwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sPicnJworICAgICAgICAjIEFsbCB0aGF0IHdoaXRlc3BhY2UgbG9va3MgZ29vZCBidXQgbWFrZXMgdGhlIHRlc3RzIG1vcmUKKyAgICAgICAgIyBkaWZmaWN1bHQuIEdldCByaWQgb2YgaXQuCisgICAgICAgIG1hcmt1cCA9IHJlLmNvbXBpbGUoIlxuXHMqIikuc3ViKCIiLCBtYXJrdXApCisgICAgICAgIHNlbGYudHJlZSA9IHNlbGYuc291cChtYXJrdXApCisKKworY2xhc3MgVGVzdE5leHRTaWJsaW5nKFNpYmxpbmdUZXN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdE5leHRTaWJsaW5nLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLnRyZWUuZmluZChpZD0iMSIpCisKKyAgICBkZWYgdGVzdF9uZXh0X3NpYmxpbmdfb2Zfcm9vdF9pc19ub25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJlZS5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9uZXh0X3NpYmxpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGFydC5uZXh0X3NpYmxpbmdbJ2lkJ10sICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0Lm5leHRfc2libGluZy5uZXh0X3NpYmxpbmdbJ2lkJ10sICczJykKKworICAgICAgICAjIE5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBuZXh0X3NpYmxpbmcgYW5kIG5leHRfZWxlbWVudC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0Lm5leHRfZWxlbWVudFsnaWQnXSwgJzEuMScpCisKKyAgICBkZWYgdGVzdF9uZXh0X3NpYmxpbmdfbWF5X25vdF9leGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyZWUuaHRtbC5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICAgICAgbmVzdGVkX3NwYW4gPSBzZWxmLnRyZWUuZmluZChpZD0iMS4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXN0ZWRfc3Bhbi5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICAgICAgbGFzdF9zcGFuID0gc2VsZi50cmVlLmZpbmQoaWQ9IjQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhc3Rfc3Bhbi5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9maW5kX25leHRfc2libGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0YXJ0LmZpbmRfbmV4dF9zaWJsaW5nKCdzcGFuJylbJ2lkJ10sICcyJykKKworICAgIGRlZiB0ZXN0X25leHRfc2libGluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0c0lEcyhzZWxmLnN0YXJ0LmZpbmRfbmV4dF9zaWJsaW5ncygic3BhbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWycyJywgJzMnLCAnNCddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0c0lEcyhzZWxmLnN0YXJ0LmZpbmRfbmV4dF9zaWJsaW5ncyhpZD0nMycpLCBbJzMnXSkKKworICAgIGRlZiB0ZXN0X25leHRfc2libGluZ19mb3JfdGV4dF9lbGVtZW50KHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCJGb288Yj5iYXI8L2I+YmF6IikKKyAgICAgICAgc3RhcnQgPSBzb3VwLmZpbmQodGV4dD0iRm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydC5uZXh0X3NpYmxpbmcubmFtZSwgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0Lm5leHRfc2libGluZy5uZXh0X3NpYmxpbmcsICdiYXonKQorCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cyhzdGFydC5maW5kX25leHRfc2libGluZ3MoJ2InKSwgWydiYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydC5maW5kX25leHRfc2libGluZyh0ZXh0PSJiYXoiKSwgImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnQuZmluZF9uZXh0X3NpYmxpbmcodGV4dD0ibm9uZXN1Y2giKSwgTm9uZSkKKworCitjbGFzcyBUZXN0UHJldmlvdXNTaWJsaW5nKFNpYmxpbmdUZXN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdFByZXZpb3VzU2libGluZywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLmVuZCA9IHNlbGYudHJlZS5maW5kKGlkPSI0IikKKworICAgIGRlZiB0ZXN0X3ByZXZpb3VzX3NpYmxpbmdfb2Zfcm9vdF9pc19ub25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJlZS5wcmV2aW91c19zaWJsaW5nLCBOb25lKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXNfc2libGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5wcmV2aW91c19zaWJsaW5nWydpZCddLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmQucHJldmlvdXNfc2libGluZy5wcmV2aW91c19zaWJsaW5nWydpZCddLCAnMicpCisKKyAgICAgICAgIyBOb3RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJldmlvdXNfc2libGluZyBhbmQgcHJldmlvdXNfZWxlbWVudC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5wcmV2aW91c19lbGVtZW50WydpZCddLCAnMy4xJykKKworICAgIGRlZiB0ZXN0X3ByZXZpb3VzX3NpYmxpbmdfbWF5X25vdF9leGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyZWUuaHRtbC5wcmV2aW91c19zaWJsaW5nLCBOb25lKQorCisgICAgICAgIG5lc3RlZF9zcGFuID0gc2VsZi50cmVlLmZpbmQoaWQ9IjEuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVzdGVkX3NwYW4ucHJldmlvdXNfc2libGluZywgTm9uZSkKKworICAgICAgICBmaXJzdF9zcGFuID0gc2VsZi50cmVlLmZpbmQoaWQ9IjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3NwYW4ucHJldmlvdXNfc2libGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcHJldmlvdXNfc2libGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuZC5maW5kX3ByZXZpb3VzX3NpYmxpbmcoJ3NwYW4nKVsnaWQnXSwgJzMnKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXNfc2libGluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0c0lEcyhzZWxmLmVuZC5maW5kX3ByZXZpb3VzX3NpYmxpbmdzKCJzcGFuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJzMnLCAnMicsICcxJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzSURzKHNlbGYuZW5kLmZpbmRfcHJldmlvdXNfc2libGluZ3MoaWQ9JzEnKSwgWycxJ10pCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19zaWJsaW5nX2Zvcl90ZXh0X2VsZW1lbnQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIkZvbzxiPmJhcjwvYj5iYXoiKQorICAgICAgICBzdGFydCA9IHNvdXAuZmluZCh0ZXh0PSJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LnByZXZpb3VzX3NpYmxpbmcubmFtZSwgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LnByZXZpb3VzX3NpYmxpbmcucHJldmlvdXNfc2libGluZywgJ0ZvbycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHN0YXJ0LmZpbmRfcHJldmlvdXNfc2libGluZ3MoJ2InKSwgWydiYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydC5maW5kX3ByZXZpb3VzX3NpYmxpbmcodGV4dD0iRm9vIiksICJGb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LmZpbmRfcHJldmlvdXNfc2libGluZyh0ZXh0PSJub25lc3VjaCIpLCBOb25lKQorCisKK2NsYXNzIFRlc3RUYWdDcmVhdGlvbihTb3VwVGVzdCk6CisgICAgIiIiVGVzdCB0aGUgYWJpbGl0eSB0byBjcmVhdGUgbmV3IHRhZ3MuIiIiCisgICAgZGVmIHRlc3RfbmV3X3RhZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiIikKKyAgICAgICAgbmV3X3RhZyA9IHNvdXAubmV3X3RhZygiZm9vIiwgYmFyPSJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShuZXdfdGFnLCBUYWcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJmb28iLCBuZXdfdGFnLm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChiYXI9ImJheiIpLCBuZXdfdGFnLmF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIG5ld190YWcucGFyZW50KQorCisgICAgZGVmIHRlc3RfdGFnX2luaGVyaXRzX3NlbGZfY2xvc2luZ19ydWxlc19mcm9tX2J1aWxkZXIoc2VsZik6CisgICAgICAgIGlmIFhNTF9CVUlMREVSX1BSRVNFTlQ6CisgICAgICAgICAgICB4bWxfc291cCA9IEJlYXV0aWZ1bFNvdXAoIiIsICJ4bWwiKQorICAgICAgICAgICAgeG1sX2JyID0geG1sX3NvdXAubmV3X3RhZygiYnIiKQorICAgICAgICAgICAgeG1sX3AgPSB4bWxfc291cC5uZXdfdGFnKCJwIikKKworICAgICAgICAgICAgIyBCb3RoIHRoZSA8YnI+IGFuZCA8cD4gdGFnIGFyZSBlbXB0eS1lbGVtZW50LCBqdXN0IGJlY2F1c2UKKyAgICAgICAgICAgICMgdGhleSBoYXZlIG5vIGNvbnRlbnRzLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIjxici8+IiwgeG1sX2JyLmVuY29kZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIjxwLz4iLCB4bWxfcC5lbmNvZGUoKSkKKworICAgICAgICBodG1sX3NvdXAgPSBCZWF1dGlmdWxTb3VwKCIiLCAiaHRtbCIpCisgICAgICAgIGh0bWxfYnIgPSBodG1sX3NvdXAubmV3X3RhZygiYnIiKQorICAgICAgICBodG1sX3AgPSBodG1sX3NvdXAubmV3X3RhZygicCIpCisKKyAgICAgICAgIyBUaGUgSFRNTCBidWlsZGVyIHVzZXJzIEhUTUwncyBydWxlcyBhYm91dCB3aGljaCB0YWdzIGFyZQorICAgICAgICAjIGVtcHR5LWVsZW1lbnQgdGFncywgYW5kIHRoZSBuZXcgdGFncyByZWZsZWN0IHRoZXNlIHJ1bGVzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiPGJyLz4iLCBodG1sX2JyLmVuY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiPHA+PC9wPiIsIGh0bWxfcC5lbmNvZGUoKSkKKworICAgIGRlZiB0ZXN0X25ld19zdHJpbmdfY3JlYXRlc19uYXZpZ2FibGVzdHJpbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIiIpCisgICAgICAgIHMgPSBzb3VwLm5ld19zdHJpbmcoImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImZvbyIsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHMsIE5hdmlnYWJsZVN0cmluZykpCisKKyAgICBkZWYgdGVzdF9uZXdfc3RyaW5nX2Nhbl9jcmVhdGVfbmF2aWdhYmxlc3RyaW5nX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCIiKQorICAgICAgICBzID0gc291cC5uZXdfc3RyaW5nKCJmb28iLCBDb21tZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJmb28iLCBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzLCBDb21tZW50KSkKKworY2xhc3MgVGVzdFRyZWVNb2RpZmljYXRpb24oU291cFRlc3QpOgorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX21vZGlmaWNhdGlvbihzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgnPGEgaWQ9IjEiPjwvYT4nKQorICAgICAgICBzb3VwLmFbJ2lkJ10gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoJzxhIGlkPSIyIj48L2E+JykpCisgICAgICAgIGRlbChzb3VwLmFbJ2lkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoJzxhPjwvYT4nKSkKKyAgICAgICAgc291cC5hWydpZDInXSA9ICdmb28nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoJzxhIGlkMj0iZm9vIj48L2E+JykpCisKKyAgICBkZWYgdGVzdF9uZXdfdGFnX2NyZWF0aW9uKHNlbGYpOgorICAgICAgICBidWlsZGVyID0gYnVpbGRlcl9yZWdpc3RyeS5sb29rdXAoJ2h0bWwnKSgpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxib2R5PjwvYm9keT4iLCBidWlsZGVyPWJ1aWxkZXIpCisgICAgICAgIGEgPSBUYWcoc291cCwgYnVpbGRlciwgJ2EnKQorICAgICAgICBvbCA9IFRhZyhzb3VwLCBidWlsZGVyLCAnb2wnKQorICAgICAgICBhWydocmVmJ10gPSAnaHR0cDovL2Zvby5jb20vJworICAgICAgICBzb3VwLmJvZHkuaW5zZXJ0KDAsIGEpCisgICAgICAgIHNvdXAuYm9keS5pbnNlcnQoMSwgb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmJvZHkuZW5jb2RlKCksCisgICAgICAgICAgICBiJzxib2R5PjxhIGhyZWY9Imh0dHA6Ly9mb28uY29tLyI+PC9hPjxvbD48L29sPjwvYm9keT4nKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX3RvX2NvbnRlbnRzX21vdmVzX3RhZyhzZWxmKToKKyAgICAgICAgZG9jID0gIiIiPHAgaWQ9IjEiPkRvbid0IGxlYXZlIG1lIDxiPmhlcmU8L2I+LjwvcD4KKyAgICAgICAgICAgICAgICA8cCBpZD0iMiI+RG9uXCd0IGxlYXZlITwvcD4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChkb2MpCisgICAgICAgIHNlY29uZF9wYXJhID0gc291cC5maW5kKGlkPScyJykKKyAgICAgICAgYm9sZCA9IHNvdXAuYgorCisgICAgICAgICMgTW92ZSB0aGUgPGI+IHRhZyB0byB0aGUgZW5kIG9mIHRoZSBzZWNvbmQgcGFyYWdyYXBoLgorICAgICAgICBzb3VwLmZpbmQoaWQ9JzInKS5hcHBlbmQoc291cC5iKQorCisgICAgICAgICMgVGhlIDxiPiB0YWcgaXMgbm93IGEgY2hpbGQgb2YgdGhlIHNlY29uZCBwYXJhZ3JhcGguCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9sZC5wYXJlbnQsIHNlY29uZF9wYXJhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigKKyAgICAgICAgICAgICAgICAnPHAgaWQ9IjEiPkRvblwndCBsZWF2ZSBtZSAuPC9wPlxuJworICAgICAgICAgICAgICAgICc8cCBpZD0iMiI+RG9uXCd0IGxlYXZlITxiPmhlcmU8L2I+PC9wPicpKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV93aXRoX3JldHVybnNfdGhpbmdfdGhhdF93YXNfcmVwbGFjZWQoc2VsZik6CisgICAgICAgIHRleHQgPSAiPGE+PC9hPjxiPjxjPjwvYz48L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHRleHQpCisgICAgICAgIGEgPSBzb3VwLmEKKyAgICAgICAgbmV3X2EgPSBhLnJlcGxhY2Vfd2l0aChzb3VwLmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgbmV3X2EpCisKKyAgICBkZWYgdGVzdF91bndyYXBfcmV0dXJuc190aGluZ190aGF0X3dhc19yZXBsYWNlZChzZWxmKToKKyAgICAgICAgdGV4dCA9ICI8YT48Yj48L2I+PGM+PC9jPjwvYT4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAodGV4dCkKKyAgICAgICAgYSA9IHNvdXAuYQorICAgICAgICBuZXdfYSA9IGEudW53cmFwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBuZXdfYSkKKworICAgIGRlZiB0ZXN0X3JlcGxhY2VfdGFnX3dpdGhfaXRzZWxmKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIjxhPjxiPjwvYj48Yz5Gb288ZD48L2Q+PC9jPjwvYT48YT48ZT48L2U+PC9hPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCh0ZXh0KQorICAgICAgICBjID0gc291cC5jCisgICAgICAgIHNvdXAuYy5yZXBsYWNlX3dpdGgoYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2Zvcih0ZXh0KSkKKworICAgIGRlZiB0ZXN0X3JlcGxhY2VfdGFnX3dpdGhfaXRzX3BhcmVudF9yYWlzZXNfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0ZXh0ID0gIjxhPjxiPjwvYj48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNvdXAuYi5yZXBsYWNlX3dpdGgsIHNvdXAuYSkKKworICAgIGRlZiB0ZXN0X2luc2VydF90YWdfaW50b19pdHNlbGZfcmFpc2VzX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGV4dCA9ICI8YT48Yj48L2I+PC9hPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCh0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzb3VwLmEuaW5zZXJ0LCAwLCBzb3VwLmEpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX3dpdGhfbWFpbnRhaW5zX25leHRfZWxlbWVudF90aHJvdWdob3V0KHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8cD48YT5vbmU8L2E+PGI+dGhyZWU8L2I+PC9wPicpCisgICAgICAgIGEgPSBzb3VwLmEKKyAgICAgICAgYiA9IGEuY29udGVudHNbMF0KKyAgICAgICAgIyBNYWtlIGl0IHNvIHRoZSA8YT4gdGFnIGhhcyB0d28gdGV4dCBjaGlsZHJlbi4KKyAgICAgICAgYS5pbnNlcnQoMSwgInR3byIpCisKKyAgICAgICAgIyBOb3cgcmVwbGFjZSBlYWNoIG9uZSB3aXRoIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICAgIGxlZnQsIHJpZ2h0ID0gYS5jb250ZW50cworICAgICAgICBsZWZ0LnJlcGxhY2VXaXRoKCcnKQorICAgICAgICByaWdodC5yZXBsYWNlV2l0aCgnJykKKworICAgICAgICAjIFRoZSA8Yj4gdGFnIGlzIHN0aWxsIGNvbm5lY3RlZCB0byB0aGUgdHJlZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidGhyZWUiLCBzb3VwLmIuc3RyaW5nKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV9maW5hbF9ub2RlKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8Yj5BcmdoITwvYj4iKQorICAgICAgICBzb3VwLmZpbmQodGV4dD0iQXJnaCEiKS5yZXBsYWNlX3dpdGgoIkhvb3JheSEiKQorICAgICAgICBuZXdfdGV4dCA9IHNvdXAuZmluZCh0ZXh0PSJIb29yYXkhIikKKyAgICAgICAgYiA9IHNvdXAuYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0LnByZXZpb3VzX2VsZW1lbnQsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3RleHQucGFyZW50LCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0LnByZXZpb3VzX2VsZW1lbnQubmV4dF9lbGVtZW50LCBuZXdfdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdGV4dC5uZXh0X2VsZW1lbnQsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jb25zZWN1dGl2ZV90ZXh0X25vZGVzKHNlbGYpOgorICAgICAgICAjIEEgYnVpbGRlciBzaG91bGQgbmV2ZXIgY3JlYXRlIHR3byBjb25zZWN1dGl2ZSB0ZXh0IG5vZGVzLAorICAgICAgICAjIGJ1dCBpZiB5b3UgaW5zZXJ0IG9uZSBuZXh0IHRvIGFub3RoZXIsIEJlYXV0aWZ1bCBTb3VwIHdpbGwKKyAgICAgICAgIyBoYW5kbGUgaXQgY29ycmVjdGx5LgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48Yj5BcmdoITwvYj48Yz48L2M+PC9hPiIpCisgICAgICAgIHNvdXAuYi5pbnNlcnQoMSwgIkhvb3JheSEiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigKKyAgICAgICAgICAgICAgICAiPGE+PGI+QXJnaCFIb29yYXkhPC9iPjxjPjwvYz48L2E+IikpCisKKyAgICAgICAgbmV3X3RleHQgPSBzb3VwLmZpbmQodGV4dD0iSG9vcmF5ISIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3RleHQucHJldmlvdXNfZWxlbWVudCwgIkFyZ2ghIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdGV4dC5wcmV2aW91c19lbGVtZW50Lm5leHRfZWxlbWVudCwgbmV3X3RleHQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdGV4dC5wcmV2aW91c19zaWJsaW5nLCAiQXJnaCEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0LnByZXZpb3VzX3NpYmxpbmcubmV4dF9zaWJsaW5nLCBuZXdfdGV4dCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld190ZXh0Lm5leHRfc2libGluZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdGV4dC5uZXh0X2VsZW1lbnQsIHNvdXAuYykKKworICAgIGRlZiB0ZXN0X2luc2VydF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjwvYT4iKQorICAgICAgICBzb3VwLmEuaW5zZXJ0KDAsICJiYXIiKQorICAgICAgICBzb3VwLmEuaW5zZXJ0KDAsICJmb28iKQorICAgICAgICAjIFRoZSBzdHJpbmcgd2VyZSBhZGRlZCB0byB0aGUgdGFnLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsiZm9vIiwgImJhciJdLCBzb3VwLmEuY29udGVudHMpCisgICAgICAgICMgQW5kIHRoZXkgd2VyZSBjb252ZXJ0ZWQgdG8gTmF2aWdhYmxlU3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmEuY29udGVudHNbMF0ubmV4dF9lbGVtZW50LCAiYmFyIikKKworICAgIGRlZiB0ZXN0X2luc2VydF90YWcoc2VsZik6CisgICAgICAgIGJ1aWxkZXIgPSBzZWxmLmRlZmF1bHRfYnVpbGRlcgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKAorICAgICAgICAgICAgIjxhPjxiPkZpbmQ8L2I+PGM+bGFkeSE8L2M+PGQ+PC9kPjwvYT4iLCBidWlsZGVyPWJ1aWxkZXIpCisgICAgICAgIG1hZ2ljX3RhZyA9IFRhZyhzb3VwLCBidWlsZGVyLCAnbWFnaWN0YWcnKQorICAgICAgICBtYWdpY190YWcuaW5zZXJ0KDAsICJ0aGUiKQorICAgICAgICBzb3VwLmEuaW5zZXJ0KDEsIG1hZ2ljX3RhZykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoCisgICAgICAgICAgICAgICAgIjxhPjxiPkZpbmQ8L2I+PG1hZ2ljdGFnPnRoZTwvbWFnaWN0YWc+PGM+bGFkeSE8L2M+PGQ+PC9kPjwvYT4iKSkKKworICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgdGhlIHJlbGF0aW9uc2hpcHMgYXJlIGhvb2tlZCB1cCBjb3JyZWN0bHkuCisgICAgICAgIGJfdGFnID0gc291cC5iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYl90YWcubmV4dF9zaWJsaW5nLCBtYWdpY190YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFnaWNfdGFnLnByZXZpb3VzX3NpYmxpbmcsIGJfdGFnKQorCisgICAgICAgIGZpbmQgPSBiX3RhZy5maW5kKHRleHQ9IkZpbmQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmQubmV4dF9lbGVtZW50LCBtYWdpY190YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFnaWNfdGFnLnByZXZpb3VzX2VsZW1lbnQsIGZpbmQpCisKKyAgICAgICAgY190YWcgPSBzb3VwLmMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWdpY190YWcubmV4dF9zaWJsaW5nLCBjX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3RhZy5wcmV2aW91c19zaWJsaW5nLCBtYWdpY190YWcpCisKKyAgICAgICAgdGhlID0gbWFnaWNfdGFnLmZpbmQodGV4dD0idGhlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGUucGFyZW50LCBtYWdpY190YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlLm5leHRfZWxlbWVudCwgY190YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY190YWcucHJldmlvdXNfZWxlbWVudCwgdGhlKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX2NoaWxkX3RoYXRzX2FscmVhZHlfYXRfdGhlX2VuZChzZWxmKToKKyAgICAgICAgZGF0YSA9ICI8YT48Yj48L2I+PC9hPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChkYXRhKQorICAgICAgICBzb3VwLmEuYXBwZW5kKHNvdXAuYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzb3VwLmRlY29kZSgpKQorCisgICAgZGVmIHRlc3RfbW92ZV90YWdfdG9fYmVnaW5uaW5nX29mX3BhcmVudChzZWxmKToKKyAgICAgICAgZGF0YSA9ICI8YT48Yj48L2I+PGM+PC9jPjxkPjwvZD48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRhdGEpCisgICAgICAgIHNvdXAuYS5pbnNlcnQoMCwgc291cC5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI8YT48ZD48L2Q+PGI+PC9iPjxjPjwvYz48L2E+Iiwgc291cC5kZWNvZGUoKSkKKworICAgIGRlZiB0ZXN0X2luc2VydF93b3Jrc19vbl9lbXB0eV9lbGVtZW50X3RhZyhzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzIGEgbGl0dGxlIHN0cmFuZ2UsIHNpbmNlIG1vc3QgSFRNTCBwYXJzZXJzIGRvbid0IGFsbG93CisgICAgICAgICMgbWFya3VwIGxpa2UgdGhpcyB0byBjb21lIHRocm91Z2guIEJ1dCBpbiBnZW5lcmFsLCB3ZSBkb24ndAorICAgICAgICAjIGtub3cgd2hhdCB0aGUgcGFyc2VyIHdvdWxkIG9yIHdvdWxkbid0IGhhdmUgYWxsb3dlZCwgc28KKyAgICAgICAgIyBJJ20gbGV0dGluZyB0aGlzIHN1Y2NlZWQgZm9yIG5vdy4KKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGJyLz4iKQorICAgICAgICBzb3VwLmJyLmluc2VydCgxLCAiQ29udGVudHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzb3VwLmJyKSwgIjxicj5Db250ZW50czwvYnI+IikKKworICAgIGRlZiB0ZXN0X2luc2VydF9iZWZvcmUoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzwvYT48Yj5iYXI8L2I+IikKKyAgICAgICAgc291cC5iLmluc2VydF9iZWZvcmUoIkJBWiIpCisgICAgICAgIHNvdXAuYS5pbnNlcnRfYmVmb3JlKCJRVVVYIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKCJRVVVYPGE+Zm9vPC9hPkJBWjxiPmJhcjwvYj4iKSkKKworICAgICAgICBzb3VwLmEuaW5zZXJ0X2JlZm9yZShzb3VwLmIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigiUVVVWDxiPmJhcjwvYj48YT5mb288L2E+QkFaIikpCisKKyAgICBkZWYgdGVzdF9pbnNlcnRfYWZ0ZXIoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzwvYT48Yj5iYXI8L2I+IikKKyAgICAgICAgc291cC5iLmluc2VydF9hZnRlcigiQkFaIikKKyAgICAgICAgc291cC5hLmluc2VydF9hZnRlcigiUVVVWCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigiPGE+Zm9vPC9hPlFVVVg8Yj5iYXI8L2I+QkFaIikpCisgICAgICAgIHNvdXAuYi5pbnNlcnRfYWZ0ZXIoc291cC5hKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoIlFVVVg8Yj5iYXI8L2I+PGE+Zm9vPC9hPkJBWiIpKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0X2FmdGVyX3JhaXNlc19leGNlcHRpb25faWZfYWZ0ZXJfaGFzX25vX21lYW5pbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIiIpCisgICAgICAgIHRhZyA9IHNvdXAubmV3X3RhZygiYSIpCisgICAgICAgIHN0cmluZyA9IHNvdXAubmV3X3N0cmluZygiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RyaW5nLmluc2VydF9hZnRlciwgdGFnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBzb3VwLmluc2VydF9hZnRlciwgdGFnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YWcuaW5zZXJ0X2FmdGVyLCB0YWcpCisKKyAgICBkZWYgdGVzdF9pbnNlcnRfYmVmb3JlX3JhaXNlc19ub3RpbXBsZW1lbnRlZGVycm9yX2lmX2JlZm9yZV9oYXNfbm9fbWVhbmluZyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiIikKKyAgICAgICAgdGFnID0gc291cC5uZXdfdGFnKCJhIikKKyAgICAgICAgc3RyaW5nID0gc291cC5uZXdfc3RyaW5nKCIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcuaW5zZXJ0X2JlZm9yZSwgdGFnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBzb3VwLmluc2VydF9iZWZvcmUsIHRhZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFnLmluc2VydF9iZWZvcmUsIHRhZykKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Vfd2l0aChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgKKyAgICAgICAgICAgICAgICAiPHA+VGhlcmUncyA8Yj5ubzwvYj4gYnVzaW5lc3MgbGlrZSA8Yj5zaG93PC9iPiBidXNpbmVzczwvcD4iKQorICAgICAgICBubywgc2hvdyA9IHNvdXAuZmluZF9hbGwoJ2InKQorICAgICAgICBzaG93LnJlcGxhY2Vfd2l0aChubykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksCisgICAgICAgICAgICBzZWxmLmRvY3VtZW50X2ZvcigKKyAgICAgICAgICAgICAgICAiPHA+VGhlcmUncyAgYnVzaW5lc3MgbGlrZSA8Yj5ubzwvYj4gYnVzaW5lc3M8L3A+IikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93LnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuby5wYXJlbnQsIHNvdXAucCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuby5uZXh0X2VsZW1lbnQsICJubyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm8ubmV4dF9zaWJsaW5nLCAiIGJ1c2luZXNzIikKKworICAgIGRlZiB0ZXN0X3JlcGxhY2VfZmlyc3RfY2hpbGQoc2VsZik6CisgICAgICAgIGRhdGEgPSAiPGE+PGI+PC9iPjxjPjwvYz48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRhdGEpCisgICAgICAgIHNvdXAuYi5yZXBsYWNlX3dpdGgoc291cC5jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI8YT48Yz48L2M+PC9hPiIsIHNvdXAuZGVjb2RlKCkpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX2xhc3RfY2hpbGQoc2VsZik6CisgICAgICAgIGRhdGEgPSAiPGE+PGI+PC9iPjxjPjwvYz48L2E+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGRhdGEpCisgICAgICAgIHNvdXAuYy5yZXBsYWNlX3dpdGgoc291cC5iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI8YT48Yj48L2I+PC9hPiIsIHNvdXAuZGVjb2RlKCkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfdGFnX3JlcGxhY2Vfd2l0aChzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgKKyAgICAgICAgICAgICIiIjxhPldlPGI+cmVzZXJ2ZTxjPnRoZTwvYz48ZD5yaWdodDwvZD48L2I+PC9hPjxlPnRvPGY+cmVmdXNlPC9mPjxnPnNlcnZpY2U8L2c+PC9lPiIiIikKKworICAgICAgICAjIFJlcGxhY2UgdGhlIGVudGlyZSA8Yj4gdGFnIGFuZCBpdHMgY29udGVudHMgKCJyZXNlcnZlIHRoZQorICAgICAgICAjIHJpZ2h0Iikgd2l0aCB0aGUgPGY+IHRhZyAoInJlZnVzZSIpLgorICAgICAgICByZW1vdmVfdGFnID0gc291cC5iCisgICAgICAgIG1vdmVfdGFnID0gc291cC5mCisgICAgICAgIHJlbW92ZV90YWcucmVwbGFjZV93aXRoKG1vdmVfdGFnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmRlY29kZSgpLCBzZWxmLmRvY3VtZW50X2ZvcigKKyAgICAgICAgICAgICAgICAiPGE+V2U8Zj5yZWZ1c2U8L2Y+PC9hPjxlPnRvPGc+c2VydmljZTwvZz48L2U+IikpCisKKyAgICAgICAgIyBUaGUgPGI+IHRhZyBpcyBub3cgYW4gb3JwaGFuLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlbW92ZV90YWcucGFyZW50LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlbW92ZV90YWcuZmluZCh0ZXh0PSJyaWdodCIpLm5leHRfZWxlbWVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZW1vdmVfdGFnLnByZXZpb3VzX2VsZW1lbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtb3ZlX3RhZy5uZXh0X3NpYmxpbmcsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtb3ZlX3RhZy5wcmV2aW91c19zaWJsaW5nLCBOb25lKQorCisgICAgICAgICMgVGhlIDxmPiB0YWcgaXMgbm93IGNvbm5lY3RlZCB0byB0aGUgPGE+IHRhZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb3ZlX3RhZy5wYXJlbnQsIHNvdXAuYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb3ZlX3RhZy5wcmV2aW91c19lbGVtZW50LCAiV2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vdmVfdGFnLm5leHRfZWxlbWVudC5uZXh0X2VsZW1lbnQsIHNvdXAuZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb3ZlX3RhZy5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICAgICAgIyBUaGUgZ2FwIHdoZXJlIHRoZSA8Zj4gdGFnIHVzZWQgdG8gYmUgaGFzIGJlZW4gbWVuZGVkLCBhbmQKKyAgICAgICAgIyB0aGUgd29yZCAidG8iIGlzIG5vdyBjb25uZWN0ZWQgdG8gdGhlIDxnPiB0YWcuCisgICAgICAgIHRvX3RleHQgPSBzb3VwLmZpbmQodGV4dD0idG8iKQorICAgICAgICBnX3RhZyA9IHNvdXAuZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvX3RleHQubmV4dF9lbGVtZW50LCBnX3RhZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0b190ZXh0Lm5leHRfc2libGluZywgZ190YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ190YWcucHJldmlvdXNfZWxlbWVudCwgdG9fdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnX3RhZy5wcmV2aW91c19zaWJsaW5nLCB0b190ZXh0KQorCisgICAgZGVmIHRlc3RfdW53cmFwKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5zb3VwKCIiIgorICAgICAgICAgICAgPHA+VW5uZWVkZWQgPGVtPmZvcm1hdHRpbmc8L2VtPiBpcyB1bm5lZWRlZDwvcD4KKyAgICAgICAgICAgICIiIikKKyAgICAgICAgdHJlZS5lbS51bndyYXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUuZW0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZS5wLnRleHQsICJVbm5lZWRlZCBmb3JtYXR0aW5nIGlzIHVubmVlZGVkIikKKworICAgIGRlZiB0ZXN0X3dyYXAoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIkkgd2lzaCBJIHdhcyBib2xkLiIpCisgICAgICAgIHZhbHVlID0gc291cC5zdHJpbmcud3JhcChzb3VwLm5ld190YWcoImIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5kZWNvZGUoKSwgIjxiPkkgd2lzaCBJIHdhcyBib2xkLjwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoIjxiPkkgd2lzaCBJIHdhcyBib2xkLjwvYj4iKSkKKworICAgIGRlZiB0ZXN0X3dyYXBfZXh0cmFjdHNfdGFnX2Zyb21fZWxzZXdoZXJlKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8Yj48L2I+SSB3aXNoIEkgd2FzIGJvbGQuIikKKyAgICAgICAgc291cC5iLm5leHRfc2libGluZy53cmFwKHNvdXAuYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZGVjb2RlKCksIHNlbGYuZG9jdW1lbnRfZm9yKCI8Yj5JIHdpc2ggSSB3YXMgYm9sZC48L2I+IikpCisKKyAgICBkZWYgdGVzdF93cmFwX3B1dHNfbmV3X2NvbnRlbnRzX2F0X3RoZV9lbmQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxiPkkgbGlrZSBiZWluZyBib2xkLjwvYj5JIHdpc2ggSSB3YXMgYm9sZC4iKQorICAgICAgICBzb3VwLmIubmV4dF9zaWJsaW5nLndyYXAoc291cC5iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihzb3VwLmIuY29udGVudHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgc2VsZi5kb2N1bWVudF9mb3IoCisgICAgICAgICAgICAgICAgIjxiPkkgbGlrZSBiZWluZyBib2xkLkkgd2lzaCBJIHdhcyBib2xkLjwvYj4iKSkKKworICAgIGRlZiB0ZXN0X2V4dHJhY3Qoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoCisgICAgICAgICAgICAnPGh0bWw+PGJvZHk+U29tZSBjb250ZW50LiA8ZGl2IGlkPSJuYXYiPk5hdiBjcmFwPC9kaXY+IE1vcmUgY29udGVudC48L2JvZHk+PC9odG1sPicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc291cC5ib2R5LmNvbnRlbnRzKSwgMykKKyAgICAgICAgZXh0cmFjdGVkID0gc291cC5maW5kKGlkPSJuYXYiKS5leHRyYWN0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc291cC5kZWNvZGUoKSwgIjxodG1sPjxib2R5PlNvbWUgY29udGVudC4gIE1vcmUgY29udGVudC48L2JvZHk+PC9odG1sPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdGVkLmRlY29kZSgpLCAnPGRpdiBpZD0ibmF2Ij5OYXYgY3JhcDwvZGl2PicpCisKKyAgICAgICAgIyBUaGUgZXh0cmFjdGVkIHRhZyBpcyBub3cgYW4gb3JwaGFuLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzb3VwLmJvZHkuY29udGVudHMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RlZC5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdGVkLnByZXZpb3VzX2VsZW1lbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdGVkLm5leHRfZWxlbWVudC5uZXh0X2VsZW1lbnQsIE5vbmUpCisKKyAgICAgICAgIyBUaGUgZ2FwIHdoZXJlIHRoZSBleHRyYWN0ZWQgdGFnIHVzZWQgdG8gYmUgaGFzIGJlZW4gbWVuZGVkLgorICAgICAgICBjb250ZW50XzEgPSBzb3VwLmZpbmQodGV4dD0iU29tZSBjb250ZW50LiAiKQorICAgICAgICBjb250ZW50XzIgPSBzb3VwLmZpbmQodGV4dD0iIE1vcmUgY29udGVudC4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRfMS5uZXh0X2VsZW1lbnQsIGNvbnRlbnRfMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50XzEubmV4dF9zaWJsaW5nLCBjb250ZW50XzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudF8yLnByZXZpb3VzX2VsZW1lbnQsIGNvbnRlbnRfMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50XzIucHJldmlvdXNfc2libGluZywgY29udGVudF8xKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9kaXN0aW5ndWlzaGVzX2JldHdlZW5faWRlbnRpY2FsX3N0cmluZ3Moc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzwvYT48Yj5iYXI8L2I+IikKKyAgICAgICAgZm9vXzEgPSBzb3VwLmEuc3RyaW5nCisgICAgICAgIGJhcl8xID0gc291cC5iLnN0cmluZworICAgICAgICBmb29fMiA9IHNvdXAubmV3X3N0cmluZygiZm9vIikKKyAgICAgICAgYmFyXzIgPSBzb3VwLm5ld19zdHJpbmcoImJhciIpCisgICAgICAgIHNvdXAuYS5hcHBlbmQoZm9vXzIpCisgICAgICAgIHNvdXAuYi5hcHBlbmQoYmFyXzIpCisKKyAgICAgICAgIyBOb3cgdGhlcmUgYXJlIHR3byBpZGVudGljYWwgc3RyaW5ncyBpbiB0aGUgPGE+IHRhZywgYW5kIHR3bworICAgICAgICAjIGluIHRoZSA8Yj4gdGFnLiBMZXQncyByZW1vdmUgdGhlIGZpcnN0ICJmb28iIGFuZCB0aGUgc2Vjb25kCisgICAgICAgICMgImJhciIuCisgICAgICAgIGZvb18xLmV4dHJhY3QoKQorICAgICAgICBiYXJfMi5leHRyYWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb29fMiwgc291cC5hLnN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXJfMiwgc291cC5iLnN0cmluZykKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgorICAgICAgICAiIiJUYWcuY2xlYXIoKSIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8cD48YT5TdHJpbmcgPGVtPkl0YWxpY2l6ZWQ8L2VtPjwvYT4gYW5kIGFub3RoZXI8L3A+IikKKyAgICAgICAgIyBjbGVhciB1c2luZyBleHRyYWN0KCkKKyAgICAgICAgYSA9IHNvdXAuYQorICAgICAgICBzb3VwLnAuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzb3VwLnAuY29udGVudHMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiY29udGVudHMiKSkKKworICAgICAgICAjIGNsZWFyIHVzaW5nIGRlY29tcG9zZSgpCisgICAgICAgIGVtID0gYS5lbQorICAgICAgICBhLmNsZWFyKGRlY29tcG9zZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihlbS5jb250ZW50cykpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfc2V0KHNlbGYpOgorICAgICAgICAiIiJUYWcuc3RyaW5nID0gJ3N0cmluZyciIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PC9hPiA8Yj48Yz48L2M+PC9iPiIpCisgICAgICAgIHNvdXAuYS5zdHJpbmcgPSAiZm9vIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5jb250ZW50cywgWyJmb28iXSkKKyAgICAgICAgc291cC5iLnN0cmluZyA9ICJiYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLmNvbnRlbnRzLCBbImJhciJdKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX3NldF9kb2VzX25vdF9hZmZlY3Rfb3JpZ2luYWxfc3RyaW5nKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48Yj5mb288L2I+PGM+YmFyPC9jPiIpCisgICAgICAgIHNvdXAuYi5zdHJpbmcgPSBzb3VwLmMuc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLmVuY29kZSgpLCBiIjxhPjxiPmJhcjwvYj48Yz5iYXI8L2M+PC9hPiIpCisKKyAgICBkZWYgdGVzdF9zZXRfc3RyaW5nX3ByZXNlcnZlc19jbGFzc19vZl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjwvYT4iKQorICAgICAgICBjZGF0YSA9IENEYXRhKCJmb28iKQorICAgICAgICBzb3VwLmEuc3RyaW5nID0gY2RhdGEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc291cC5hLnN0cmluZywgQ0RhdGEpKQorCitjbGFzcyBUZXN0RWxlbWVudE9iamVjdHMoU291cFRlc3QpOgorICAgICIiIlRlc3QgdmFyaW91cyBmZWF0dXJlcyBvZiBlbGVtZW50IG9iamVjdHMuIiIiCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgICIiIlRoZSBsZW5ndGggb2YgYW4gZWxlbWVudCBpcyBpdHMgbnVtYmVyIG9mIGNoaWxkcmVuLiIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8dG9wPjE8Yj4yPC9iPjM8L3RvcD4iKQorCisgICAgICAgICMgVGhlIEJlYXV0aWZ1bFNvdXAgb2JqZWN0IGl0c2VsZiBjb250YWlucyBvbmUgZWxlbWVudDogdGhlCisgICAgICAgICMgPHRvcD4gdGFnLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzb3VwLmNvbnRlbnRzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc291cCksIDEpCisKKyAgICAgICAgIyBUaGUgPHRvcD4gdGFnIGNvbnRhaW5zIHRocmVlIGVsZW1lbnRzOiB0aGUgdGV4dCBub2RlICIxIiwgdGhlCisgICAgICAgICMgPGI+IHRhZywgYW5kIHRoZSB0ZXh0IG5vZGUgIjMiLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzb3VwLnRvcCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNvdXAudG9wLmNvbnRlbnRzKSwgMykKKworICAgIGRlZiB0ZXN0X21lbWJlcl9hY2Nlc3NfaW52b2tlc19maW5kKHNlbGYpOgorICAgICAgICAiIiJBY2Nlc3NpbmcgYSBQeXRob24gbWVtYmVyIC5mb28gaW52b2tlcyBmaW5kKCdmb28nKSIiIgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8Yj48aT48L2k+PC9iPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLCBzb3VwLmZpbmQoJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIuaSwgc291cC5maW5kKCdiJykuZmluZCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfbWVtYmVyX2FjY2VzcyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgnPGI+PGk+PC9pPjwvYj4nKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgdGFnID0gc291cC5iVGFnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLCB0YWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAnLmJUYWcgaXMgZGVwcmVjYXRlZCwgdXNlIC5maW5kKCJiIikgaW5zdGVhZC4nLAorICAgICAgICAgICAgc3RyKHdbMF0ubWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9oYXNfYXR0cihzZWxmKToKKyAgICAgICAgIiIiaGFzX2F0dHIoKSBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbiBhdHRyaWJ1dGUuCisKKyAgICAgICAgUGxlYXNlIG5vdGUgbm90ZTogaGFzX2F0dHIoKSBpcyBkaWZmZXJlbnQgZnJvbQorICAgICAgICBfX2luX18uIGhhc19hdHRyKCkgY2hlY2tzIHRoZSB0YWcncyBhdHRyaWJ1dGVzIGFuZCBfX2luX18KKyAgICAgICAgY2hlY2tzIHRoZSB0YWcncyBjaGlkbHJlbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxmb28gYXR0cj0nYmFyJz4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc291cC5mb28uaGFzX2F0dHIoJ2F0dHInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzb3VwLmZvby5oYXNfYXR0cignYXR0cjInKSkKKworCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc19jb21lX291dF9pbl9hbHBoYWJldGljYWxfb3JkZXIoc2VsZik6CisgICAgICAgIG1hcmt1cCA9ICc8YiBhPSIxIiB6PSI1IiBtPSIzIiBmPSIyIiB5PSI0Ij48L2I+JworICAgICAgICBzZWxmLmFzc2VydFNvdXBFcXVhbHMobWFya3VwLCAnPGIgYT0iMSIgZj0iMiIgbT0iMyIgeT0iNCIgej0iNSI+PC9iPicpCisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgQSB0YWcgdGhhdCBjb250YWlucyBvbmx5IGEgdGV4dCBub2RlIG1ha2VzIHRoYXQgbm9kZQorICAgICAgICAjIGF2YWlsYWJsZSBhcyAuc3RyaW5nLgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8Yj5mb288L2I+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmIuc3RyaW5nLCAnZm9vJykKKworICAgIGRlZiB0ZXN0X2VtcHR5X3RhZ19oYXNfbm9fc3RyaW5nKHNlbGYpOgorICAgICAgICAjIEEgdGFnIHdpdGggbm8gY2hpbGRyZW4gaGFzIG5vIC5zdGlybmcuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxiPjwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYi5zdHJpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF90YWdfd2l0aF9tdWx0aXBsZV9jaGlsZHJlbl9oYXNfbm9fc3RyaW5nKHNlbGYpOgorICAgICAgICAjIEEgdGFnIHdpdGggbm8gY2hpbGRyZW4gaGFzIG5vIC5zdHJpbmcuCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzxiPjwvYj48Yj48L2I+PC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLnN0cmluZywgTm9uZSkKKworICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT5mb288Yj48L2I+YmFyPC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5iLnN0cmluZywgTm9uZSkKKworICAgICAgICAjIEV2ZW4gaWYgYWxsIHRoZSBjaGlsZHJlbiBhcmUgc3RyaW5ncywgZHVlIHRvIHRyaWNrZXJ5LAorICAgICAgICAjIGl0IHdvbid0IHdvcmstLWJ1dCB0aGlzIHdvdWxkIGJlIGEgZ29vZCBvcHRpbWl6YXRpb24uCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPmZvbzwvYj4iKQorICAgICAgICBzb3VwLmEuaW5zZXJ0KDEsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5zdHJpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF90YWdfd2l0aF9yZWN1cnNpdmVfc3RyaW5nX2hhc19zdHJpbmcoc2VsZik6CisgICAgICAgICMgQSB0YWcgd2l0aCBhIHNpbmdsZSBjaGlsZCB3aGljaCBoYXMgYSAuc3RyaW5nIGluaGVyaXRzIHRoYXQKKyAgICAgICAgIyAuc3RyaW5nLgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YT48Yj5mb288L2I+PC9hPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5hLnN0cmluZywgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5zdHJpbmcsICJmb28iKQorCisgICAgZGVmIHRlc3RfbGFja19vZl9zdHJpbmcoc2VsZik6CisgICAgICAgICIiIk9ubHkgYSB0YWcgY29udGFpbmluZyBhIHNpbmdsZSB0ZXh0IG5vZGUgaGFzIGEgLnN0cmluZy4iIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGI+ZjxpPmU8L2k+bzwvYj4iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNvdXAuYi5zdHJpbmcpCisKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGI+PC9iPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc291cC5iLnN0cmluZykKKworICAgIGRlZiB0ZXN0X2FsbF90ZXh0KHNlbGYpOgorICAgICAgICAiIiJUYWcudGV4dCBhbmQgVGFnLmdldF90ZXh0KHNlcD11IiIpIC0+IGFsbCBjaGlsZCB0ZXh0LCBjb25jYXRlbmF0ZWQiIiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+YTxiPnI8L2I+ICAgPHI+IHQgPC9yPjwvYT4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS50ZXh0LCAiYXIgIHQgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmEuZ2V0X3RleHQoc3RyaXA9VHJ1ZSksICJhcnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYS5nZXRfdGV4dCgiLCIpLCAiYSxyLCAsIHQgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmEuZ2V0X3RleHQoIiwiLCBzdHJpcD1UcnVlKSwgImEscix0IikKKworICAgIGRlZiB0ZXN0X2dldF90ZXh0X2lnbm9yZXNfY29tbWVudHMoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoImZvbzwhLS1JR05PUkUtLT5iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZ2V0X3RleHQoKSwgImZvb2JhciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZ2V0X3RleHQodHlwZXM9KE5hdmlnYWJsZVN0cmluZywgQ29tbWVudCkpLCAiZm9vSUdOT1JFYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNvdXAuZ2V0X3RleHQodHlwZXM9Tm9uZSksICJmb29JR05PUkViYXIiKQorCisgICAgZGVmIHRlc3RfYWxsX3N0cmluZ3NfaWdub3Jlc19jb21tZW50cyhzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiZm9vPCEtLUlHTk9SRS0tPmJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydmb28nLCAnYmFyJ10sIGxpc3Qoc291cC5zdHJpbmdzKSkKKworY2xhc3MgVGVzdENEQXRhTGlzdEF0dHJpYnV0ZXMoU291cFRlc3QpOgorCisgICAgIiIiVGVzdGluZyBjZGF0YS1saXN0IGF0dHJpYnV0ZXMgbGlrZSAnY2xhc3MnLgorICAgICIiIgorICAgIGRlZiB0ZXN0X3NpbmdsZV92YWx1ZV9iZWNvbWVzX2xpc3Qoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhIGNsYXNzPSdmb28nPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyJmb28iXSxzb3VwLmFbJ2NsYXNzJ10pCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV92YWx1ZXNfYmVjb21lc19saXN0KHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YSBjbGFzcz0nZm9vIGJhcic+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbImZvbyIsICJiYXIiXSwgc291cC5hWydjbGFzcyddKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfdmFsdWVzX3NlcGFyYXRlZF9ieV93ZWlyZF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YSBjbGFzcz0nZm9vXHRiYXJcbmJheic+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbImZvbyIsICJiYXIiLCAiYmF6Il0sc291cC5hWydjbGFzcyddKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc19qb2luZWRfaW50b19zdHJpbmdfb25fb3V0cHV0KHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCI8YSBjbGFzcz0nZm9vXHRiYXInPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYic8YSBjbGFzcz0iZm9vIGJhciI+PC9hPicsIHNvdXAuYS5lbmNvZGUoKSkKKworICAgIGRlZiB0ZXN0X2FjY2VwdF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCc8Zm9ybSBhY2NlcHQtY2hhcnNldD0iSVNPLTg4NTktMSBVVEYtOCI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbJ0lTTy04ODU5LTEnLCAnVVRGLTgnXSwgc291cC5mb3JtWydhY2NlcHQtY2hhcnNldCddKQorCisgICAgZGVmIHRlc3RfY2RhdGFfYXR0cmlidXRlX2FwcGx5aW5nX29ubHlfdG9fb25lX3RhZyhzZWxmKToKKyAgICAgICAgZGF0YSA9ICc8YSBhY2NlcHQtY2hhcnNldD0iSVNPLTg4NTktMSBVVEYtOCI+PC9hPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChkYXRhKQorICAgICAgICAjIFdlIHNhdyBpbiBhbm90aGVyIHRlc3QgdGhhdCBhY2NlcHQtY2hhcnNldCBpcyBhIGNkYXRhLWxpc3QKKyAgICAgICAgIyBhdHRyaWJ1dGUgZm9yIHRoZSA8Zm9ybT4gdGFnLiBCdXQgaXQncyBub3QgYSBjZGF0YS1saXN0CisgICAgICAgICMgYXR0cmlidXRlIGZvciBhbnkgb3RoZXIgdGFnLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdJU08tODg1OS0xIFVURi04Jywgc291cC5hWydhY2NlcHQtY2hhcnNldCddKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2hhc19pbW11dGFibGVfbmFtZV9wcm9wZXJ0eShzZWxmKToKKyAgICAgICAgc3RyaW5nID0gc2VsZi5zb3VwKCJzIikuc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc3RyaW5nLm5hbWUpCisgICAgICAgIGRlZiB0KCk6CisgICAgICAgICAgICBzdHJpbmcubmFtZSA9ICdmb28nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCB0KQorCitjbGFzcyBUZXN0UGVyc2lzdGVuY2UoU291cFRlc3QpOgorICAgICJUZXN0aW5nIGZlYXR1cmVzIGxpa2UgcGlja2xlIGFuZCBkZWVwY29weS4iCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RQZXJzaXN0ZW5jZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnBhZ2UgPSAiIiI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC90cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8dGl0bGU+QmVhdXRpZnVsIFNvdXA6IFdlIGNhbGxlZCBoaW0gVG9ydG9pc2UgYmVjYXVzZSBoZSB0YXVnaHQgdXMuPC90aXRsZT4KKzxsaW5rIHJldj0ibWFkZSIgaHJlZj0ibWFpbHRvOmxlb25hcmRyQHNlZ2ZhdWx0Lm9yZyI+Cis8bWV0YSBuYW1lPSJEZXNjcmlwdGlvbiIgY29udGVudD0iQmVhdXRpZnVsIFNvdXA6IGFuIEhUTUwgcGFyc2VyIG9wdGltaXplZCBmb3Igc2NyZWVuLXNjcmFwaW5nLiI+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik1hcmtvdiBBcHByb3hpbWF0aW9uIDEuNCAobW9kdWxlOiBsZW9uYXJkcikiPgorPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJMZW9uYXJkIFJpY2hhcmRzb24iPgorPC9oZWFkPgorPGJvZHk+Cis8YSBocmVmPSJmb28iPmZvbzwvYT4KKzxhIGhyZWY9ImZvbyI+PGI+YmFyPC9iPjwvYT4KKzwvYm9keT4KKzwvaHRtbD4iIiIKKyAgICAgICAgc2VsZi50cmVlID0gc2VsZi5zb3VwKHNlbGYucGFnZSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZV9hbmRfdW5waWNrbGVfaWRlbnRpdHkoc2VsZik6CisgICAgICAgICMgUGlja2xpbmcgYSB0cmVlLCB0aGVuIHVucGlja2xpbmcgaXQsIHlpZWxkcyBhIHRyZWUgaWRlbnRpY2FsCisgICAgICAgICMgdG8gdGhlIG9yaWdpbmFsLgorICAgICAgICBkdW1wZWQgPSBwaWNrbGUuZHVtcHMoc2VsZi50cmVlLCAyKQorICAgICAgICBsb2FkZWQgPSBwaWNrbGUubG9hZHMoZHVtcGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlZC5fX2NsYXNzX18sIEJlYXV0aWZ1bFNvdXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVkLmRlY29kZSgpLCBzZWxmLnRyZWUuZGVjb2RlKCkpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9pZGVudGl0eShzZWxmKToKKyAgICAgICAgIyBNYWtpbmcgYSBkZWVwY29weSBvZiBhIHRyZWUgeWllbGRzIGFuIGlkZW50aWNhbCB0cmVlLgorICAgICAgICBjb3BpZWQgPSBjb3B5LmRlZXBjb3B5KHNlbGYudHJlZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3BpZWQuZGVjb2RlKCksIHNlbGYudHJlZS5kZWNvZGUoKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfcGlja2xlKHNlbGYpOgorICAgICAgICAjIEEgdHJlZSBjb250YWluaW5nIFVuaWNvZGUgY2hhcmFjdGVycyBjYW4gYmUgcGlja2xlZC4KKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIGR1bXBlZCA9IHBpY2tsZS5kdW1wcyhzb3VwLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCkKKyAgICAgICAgbG9hZGVkID0gcGlja2xlLmxvYWRzKGR1bXBlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZWQuZGVjb2RlKCksIHNvdXAuZGVjb2RlKCkpCisKKworY2xhc3MgVGVzdFN1YnN0aXR1dGlvbnMoU291cFRlc3QpOgorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9mb3JtYXR0ZXJfaXNfbWluaW1hbChzZWxmKToKKyAgICAgICAgbWFya3VwID0gdSI8Yj4mbHQ7Jmx0O1NhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ISZndDsmZ3Q7PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIGRlY29kZWQgPSBzb3VwLmRlY29kZShmb3JtYXR0ZXI9Im1pbmltYWwiKQorICAgICAgICAjIFRoZSA8IGlzIGNvbnZlcnRlZCBiYWNrIGludG8gJmx0OyBidXQgdGhlIGUtd2l0aC1hY3V0ZSBpcyBsZWZ0IGFsb25lLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZGVjb2RlZCwKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRfZm9yKAorICAgICAgICAgICAgICAgIHUiPGI+Jmx0OyZsdDtTYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSEmZ3Q7Jmd0OzwvYj4iKSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRlcl9odG1sKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1IjxiPiZsdDsmbHQ7U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhJmd0OyZndDs8L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgZGVjb2RlZCA9IHNvdXAuZGVjb2RlKGZvcm1hdHRlcj0iaHRtbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkZWNvZGVkLAorICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9mb3IoIjxiPiZsdDsmbHQ7U2FjciZlYWN1dGU7IGJsZXUhJmd0OyZndDs8L2I+IikpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXJfbWluaW1hbChzZWxmKToKKyAgICAgICAgbWFya3VwID0gdSI8Yj4mbHQ7Jmx0O1NhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1ISZndDsmZ3Q7PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIGRlY29kZWQgPSBzb3VwLmRlY29kZShmb3JtYXR0ZXI9Im1pbmltYWwiKQorICAgICAgICAjIFRoZSA8IGlzIGNvbnZlcnRlZCBiYWNrIGludG8gJmx0OyBidXQgdGhlIGUtd2l0aC1hY3V0ZSBpcyBsZWZ0IGFsb25lLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZGVjb2RlZCwKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRfZm9yKAorICAgICAgICAgICAgICAgIHUiPGI+Jmx0OyZsdDtTYWNyXE57TEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURX0gYmxldSEmZ3Q7Jmd0OzwvYj4iKSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRlcl9udWxsKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSB1IjxiPiZsdDsmbHQ7U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhJmd0OyZndDs8L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgZGVjb2RlZCA9IHNvdXAuZGVjb2RlKGZvcm1hdHRlcj1Ob25lKQorICAgICAgICAjIE5laXRoZXIgdGhlIGFuZ2xlIGJyYWNrZXRzIG5vciB0aGUgZS13aXRoLWFjdXRlIGFyZSBjb252ZXJ0ZWQuCisgICAgICAgICMgVGhpcyBpcyBub3QgdmFsaWQgSFRNTCwgYnV0IGl0J3Mgd2hhdCB0aGUgdXNlciB3YW50ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9mb3IodSI8Yj48PFNhY3JcTntMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFfSBibGV1IT4+PC9iPiIpKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGVyX2N1c3RvbShzZWxmKToKKyAgICAgICAgbWFya3VwID0gdSI8Yj4mbHQ7Zm9vJmd0OzwvYj48Yj5iYXI8L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCkKKyAgICAgICAgZGVjb2RlZCA9IHNvdXAuZGVjb2RlKGZvcm1hdHRlciA9IGxhbWJkYSB4OiB4LnVwcGVyKCkpCisgICAgICAgICMgSW5zdGVhZCBvZiBub3JtYWwgZW50aXR5IGNvbnZlcnNpb24gY29kZSwgdGhlIGN1c3RvbQorICAgICAgICAjIGNhbGxhYmxlIGlzIGNhbGxlZCBvbiBldmVyeSBzdHJpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBkZWNvZGVkLAorICAgICAgICAgICAgc2VsZi5kb2N1bWVudF9mb3IodSI8Yj48Rk9PPjwvYj48Yj5CQVI8L2I+IikpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXJfaXNfcnVuX29uX2F0dHJpYnV0ZV92YWx1ZXMoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUnPGEgaHJlZj0iaHR0cDovL2EuY29tP2E9YiZjPcOpIj5lPC9hPicKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIGEgPSBzb3VwLmEKKworICAgICAgICBleHBlY3RfbWluaW1hbCA9IHUnPGEgaHJlZj0iaHR0cDovL2EuY29tP2E9YiZhbXA7Yz3DqSI+ZTwvYT4nCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RfbWluaW1hbCwgYS5kZWNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RfbWluaW1hbCwgYS5kZWNvZGUoZm9ybWF0dGVyPSJtaW5pbWFsIikpCisKKyAgICAgICAgZXhwZWN0X2h0bWwgPSB1JzxhIGhyZWY9Imh0dHA6Ly9hLmNvbT9hPWImYW1wO2M9JmVhY3V0ZTsiPmU8L2E+JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdF9odG1sLCBhLmRlY29kZShmb3JtYXR0ZXI9Imh0bWwiKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcmt1cCwgYS5kZWNvZGUoZm9ybWF0dGVyPU5vbmUpKQorICAgICAgICBleHBlY3RfdXBwZXIgPSB1JzxhIGhyZWY9IkhUVFA6Ly9BLkNPTT9BPUImQz3DiSI+RTwvYT4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0X3VwcGVyLCBhLmRlY29kZShmb3JtYXR0ZXI9bGFtYmRhIHg6IHgudXBwZXIoKSkpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXJfc2tpcHNfc2NyaXB0X3RhZ19mb3JfaHRtbF9kb2N1bWVudHMoc2VsZik6CisgICAgICAgIGRvYyA9ICIiIgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICBjb25zb2xlLmxvZygiPCA8IGhleSA+ID4gIik7CisgIDwvc2NyaXB0PgorIiIiCisgICAgICAgIGVuY29kZWQgPSBCZWF1dGlmdWxTb3VwKGRvYykuZW5jb2RlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIiPCA8IGhleSA+ID4iIGluIGVuY29kZWQpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXJfc2tpcHNfc3R5bGVfdGFnX2Zvcl9odG1sX2RvY3VtZW50cyhzZWxmKToKKyAgICAgICAgZG9jID0gIiIiCisgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICBjb25zb2xlLmxvZygiPCA8IGhleSA+ID4gIik7CisgIDwvc3R5bGU+CisiIiIKKyAgICAgICAgZW5jb2RlZCA9IEJlYXV0aWZ1bFNvdXAoZG9jKS5lbmNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiI8IDwgaGV5ID4gPiIgaW4gZW5jb2RlZCkKKworICAgIGRlZiB0ZXN0X3ByZXR0aWZ5X2xlYXZlc19wcmVmb3JtYXR0ZWRfdGV4dF9hbG9uZShzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGRpdj4gIGZvbyAgPHByZT4gIFx0YmFyXG4gIFxuICA8L3ByZT4gIGJheiAgIikKKyAgICAgICAgIyBFdmVyeXRoaW5nIG91dHNpZGUgdGhlIDxwcmU+IHRhZyBpcyByZWZvcm1hdHRlZCwgYnV0IGV2ZXJ5dGhpbmcKKyAgICAgICAgIyBpbnNpZGUgaXMgbGVmdCBhbG9uZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHUnPGRpdj5cbiBmb29cbiA8cHJlPiAgXHRiYXJcbiAgXG4gIDwvcHJlPlxuIGJhelxuPC9kaXY+JywKKyAgICAgICAgICAgIHNvdXAuZGl2LnByZXR0aWZ5KCkpCisKKyAgICBkZWYgdGVzdF9wcmV0dGlmeV9hY2NlcHRzX2Zvcm1hdHRlcihzZWxmKToKKyAgICAgICAgc291cCA9IEJlYXV0aWZ1bFNvdXAoIjxodG1sPjxib2R5PmZvbzwvYm9keT48L2h0bWw+IikKKyAgICAgICAgcHJldHR5ID0gc291cC5wcmV0dGlmeShmb3JtYXR0ZXIgPSBsYW1iZGEgeDogeC51cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIkZPTyIgaW4gcHJldHR5KQorCisgICAgZGVmIHRlc3RfcHJldHRpZnlfb3V0cHV0c191bmljb2RlX2J5X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIjxhPjwvYT4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUsIHR5cGUoc291cC5wcmV0dGlmeSgpKSkKKworICAgIGRlZiB0ZXN0X3ByZXR0aWZ5X2Nhbl9lbmNvZGVfZGF0YShzZWxmKToKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiPGE+PC9hPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMsIHR5cGUoc291cC5wcmV0dGlmeSgidXRmLTgiKSkpCisKKyAgICBkZWYgdGVzdF9odG1sX2VudGl0eV9zdWJzdGl0dXRpb25fb2ZmX2J5X2RlZmF1bHQoc2VsZik6CisgICAgICAgIG1hcmt1cCA9IHUiPGI+U2FjclxOe0xBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEV9IGJsZXUhPC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtYXJrdXApCisgICAgICAgIGVuY29kZWQgPSBzb3VwLmIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2RlZCwgbWFya3VwLmVuY29kZSgndXRmLTgnKSkKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nX3N1YnN0aXR1dGlvbihzZWxmKToKKyAgICAgICAgIyBIZXJlJ3MgdGhlIDxtZXRhPiB0YWcgc2F5aW5nIHRoYXQgYSBkb2N1bWVudCBpcworICAgICAgICAjIGVuY29kZWQgaW4gU2hpZnQtSklTLgorICAgICAgICBtZXRhX3RhZyA9ICgnPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXgtc2ppcyIgJworICAgICAgICAgICAgICAgICAgICAnaHR0cC1lcXVpdj0iQ29udGVudC10eXBlIi8+JykKKyAgICAgICAgc291cCA9IHNlbGYuc291cChtZXRhX3RhZykKKworICAgICAgICAjIFBhcnNlIHRoZSBkb2N1bWVudCwgYW5kIHRoZSBjaGFyc2V0IGFwcHJlYXJzIHVuY2hhbmdlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLm1ldGFbJ2NvbnRlbnQnXSwgJ3RleHQvaHRtbDsgY2hhcnNldD14LXNqaXMnKQorCisgICAgICAgICMgRW5jb2RlIHRoZSBkb2N1bWVudCBpbnRvIHNvbWUgZW5jb2RpbmcsIGFuZCB0aGUgZW5jb2RpbmcgaXMKKyAgICAgICAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBtZXRhIHRhZy4KKyAgICAgICAgdXRmXzggPSBzb3VwLmVuY29kZSgidXRmLTgiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiJjaGFyc2V0PXV0Zi04IiBpbiB1dGZfOCkKKworICAgICAgICBldWNfanAgPSBzb3VwLmVuY29kZSgiZXVjX2pwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIiY2hhcnNldD1ldWNfanAiIGluIGV1Y19qcCkKKworICAgICAgICBzaGlmdF9qaXMgPSBzb3VwLmVuY29kZSgic2hpZnQtamlzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIiY2hhcnNldD1zaGlmdC1qaXMiIGluIHNoaWZ0X2ppcykKKworICAgICAgICB1dGZfMTZfdSA9IHNvdXAuZW5jb2RlKCJ1dGYtMTYiKS5kZWNvZGUoInV0Zi0xNiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiY2hhcnNldD11dGYtMTYiIGluIHV0Zl8xNl91KQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmdfc3Vic3RpdHV0aW9uX2RvZXNudF9oYXBwZW5faWZfdGFnX2lzX3N0cmFpbmVkKHNlbGYpOgorICAgICAgICBtYXJrdXAgPSAoJzxoZWFkPjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD14LXNqaXMiICcKKyAgICAgICAgICAgICAgICAgICAgJ2h0dHAtZXF1aXY9IkNvbnRlbnQtdHlwZSIvPjwvaGVhZD48cHJlPmZvbzwvcHJlPicpCisKKyAgICAgICAgIyBCZWF1dGlmdWwgU291cCB1c2VkIHRvIHRyeSB0byByZXdyaXRlIHRoZSBtZXRhIHRhZyBldmVuIGlmIHRoZQorICAgICAgICAjIG1ldGEgdGFnIGdvdCBmaWx0ZXJlZCBvdXQgYnkgdGhlIHN0cmFpbmVyLiBUaGlzIHRlc3QgbWFrZXMKKyAgICAgICAgIyBzdXJlIHRoYXQgZG9lc24ndCBoYXBwZW4uCisgICAgICAgIHN0cmFpbmVyID0gU291cFN0cmFpbmVyKCdwcmUnKQorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKG1hcmt1cCwgcGFyc2Vfb25seT1zdHJhaW5lcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VwLmNvbnRlbnRzWzBdLm5hbWUsICdwcmUnKQorCitjbGFzcyBUZXN0RW5jb2RpbmcoU291cFRlc3QpOgorICAgICIiIlRlc3QgdGhlIGFiaWxpdHkgdG8gZW5jb2RlIG9iamVjdHMgaW50byBzdHJpbmdzLiIiIgorCisgICAgZGVmIHRlc3RfdW5pY29kZV9zdHJpbmdfY2FuX2JlX2VuY29kZWQoc2VsZik6CisgICAgICAgIGh0bWwgPSB1IjxiPlxOe1NOT1dNQU59PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChodG1sKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYi5zdHJpbmcuZW5jb2RlKCJ1dGYtOCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1IlxOe1NOT1dNQU59Ii5lbmNvZGUoInV0Zi04IikpCisKKyAgICBkZWYgdGVzdF90YWdfY29udGFpbmluZ191bmljb2RlX3N0cmluZ19jYW5fYmVfZW5jb2RlZChzZWxmKToKKyAgICAgICAgaHRtbCA9IHUiPGI+XE57U05PV01BTn08L2I+IgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKGh0bWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzb3VwLmIuZW5jb2RlKCJ1dGYtOCIpLCBodG1sLmVuY29kZSgidXRmLTgiKSkKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nX3N1YnN0aXR1dGVzX3VucmVjb2duaXplZF9jaGFyYWN0ZXJzX2J5X2RlZmF1bHQoc2VsZik6CisgICAgICAgIGh0bWwgPSB1IjxiPlxOe1NOT1dNQU59PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChodG1sKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuYi5lbmNvZGUoImFzY2lpIiksIGIiPGI+JiM5NzMxOzwvYj4iKQorCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfY2FuX2JlX21hZGVfc3RyaWN0KHNlbGYpOgorICAgICAgICBodG1sID0gdSI8Yj5cTntTTk9XTUFOfTwvYj4iCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoaHRtbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsIHNvdXAuZW5jb2RlLCAiYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfY29udGVudHMoc2VsZik6CisgICAgICAgIGh0bWwgPSB1IjxiPlxOe1NOT1dNQU59PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChodG1sKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXE57U05PV01BTn0iLCBzb3VwLmIuZGVjb2RlX2NvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfY29udGVudHMoc2VsZik6CisgICAgICAgIGh0bWwgPSB1IjxiPlxOe1NOT1dNQU59PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChodG1sKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSJcTntTTk9XTUFOfSIuZW5jb2RlKCJ1dGY4IiksIHNvdXAuYi5lbmNvZGVfY29udGVudHMoCisgICAgICAgICAgICAgICAgZW5jb2Rpbmc9InV0ZjgiKSkKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfcmVuZGVyQ29udGVudHMoc2VsZik6CisgICAgICAgIGh0bWwgPSB1IjxiPlxOe1NOT1dNQU59PC9iPiIKKyAgICAgICAgc291cCA9IHNlbGYuc291cChodG1sKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSJcTntTTk9XTUFOfSIuZW5jb2RlKCJ1dGY4IiksIHNvdXAuYi5yZW5kZXJDb250ZW50cygpKQorCitjbGFzcyBUZXN0TmF2aWdhYmxlU3RyaW5nU3ViY2xhc3NlcyhTb3VwVGVzdCk6CisKKyAgICBkZWYgdGVzdF9jZGF0YShzZWxmKToKKyAgICAgICAgIyBOb25lIG9mIHRoZSBjdXJyZW50IGJ1aWxkZXJzIHR1cm4gQ0RBVEEgc2VjdGlvbnMgaW50byBDRGF0YQorICAgICAgICAjIG9iamVjdHMsIGJ1dCB5b3UgY2FuIGNyZWF0ZSB0aGVtIG1hbnVhbGx5LgorICAgICAgICBzb3VwID0gc2VsZi5zb3VwKCIiKQorICAgICAgICBjZGF0YSA9IENEYXRhKCJmb28iKQorICAgICAgICBzb3VwLmluc2VydCgxLCBjZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc291cCksICI8IVtDREFUQVtmb29dXT4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXAuZmluZCh0ZXh0PSJmb28iKSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5jb250ZW50c1swXSwgImZvbyIpCisKKyAgICBkZWYgdGVzdF9jZGF0YV9pc19uZXZlcl9mb3JtYXR0ZWQoc2VsZik6CisgICAgICAgICIiIlRleHQgaW5zaWRlIGEgQ0RhdGEgb2JqZWN0IGlzIHBhc3NlZCBpbnRvIHRoZSBmb3JtYXR0ZXIuCisKKyAgICAgICAgQnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5jb3VudCA9IDAKKyAgICAgICAgZGVmIGluY3JlbWVudCgqYXJncyk6CisgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAiQklUVEVSIEZBSUxVUkUiCisKKyAgICAgICAgc291cCA9IHNlbGYuc291cCgiIikKKyAgICAgICAgY2RhdGEgPSBDRGF0YSgiPD48Pjw+IikKKyAgICAgICAgc291cC5pbnNlcnQoMSwgY2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBiIjwhW0NEQVRBWzw+PD48Pl1dPiIsIHNvdXAuZW5jb2RlKGZvcm1hdHRlcj1pbmNyZW1lbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHNlbGYuY291bnQpCisKKyAgICBkZWYgdGVzdF9kb2N0eXBlX2VuZHNfaW5fbmV3bGluZShzZWxmKToKKyAgICAgICAgIyBVbmxpa2Ugb3RoZXIgTmF2aWdhYmxlU3RyaW5nIHN1YmNsYXNzZXMsIGEgRE9DVFlQRSBhbHdheXMgZW5kcworICAgICAgICAjIGluIGEgbmV3bGluZS4KKyAgICAgICAgZG9jdHlwZSA9IERvY3R5cGUoImZvbyIpCisgICAgICAgIHNvdXAgPSBzZWxmLnNvdXAoIiIpCisgICAgICAgIHNvdXAuaW5zZXJ0KDEsIGRvY3R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291cC5lbmNvZGUoKSwgYiI8IURPQ1RZUEUgZm9vPlxuIikKKworCitjbGFzcyBUZXN0U291cFNlbGVjdG9yKFRyZWVUZXN0KToKKworICAgIEhUTUwgPSAiIiIKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+VGhlIHRpdGxlPC90aXRsZT4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYmxhaC5jc3MiIHR5cGU9InRleHQvY3NzIiBpZD0ibDEiPgorPC9oZWFkPgorPGJvZHk+CisKKzxkaXYgaWQ9Im1haW4iIGNsYXNzPSJmYW5jeSI+Cis8ZGl2IGlkPSJpbm5lciI+Cis8aDEgaWQ9ImhlYWRlcjEiPkFuIEgxPC9oMT4KKzxwPlNvbWUgdGV4dDwvcD4KKzxwIGNsYXNzPSJvbmVwIiBpZD0icDEiPlNvbWUgbW9yZSB0ZXh0PC9wPgorPGgyIGlkPSJoZWFkZXIyIj5BbiBIMjwvaDI+Cis8cCBjbGFzcz0iY2xhc3MxIGNsYXNzMiBjbGFzczMiIGlkPSJwbXVsdGkiPkFub3RoZXI8L3A+Cis8YSBocmVmPSJodHRwOi8vYm9iLmV4YW1wbGUub3JnLyIgcmVsPSJmcmllbmQgbWV0IiBpZD0iYm9iIj5Cb2I8L2E+Cis8aDIgaWQ9ImhlYWRlcjMiPkFub3RoZXIgSDI8L2gyPgorPGEgaWQ9Im1lIiBocmVmPSJodHRwOi8vc2ltb253aWxsaXNvbi5uZXQvIiByZWw9Im1lIj5tZTwvYT4KKzxzcGFuIGNsYXNzPSJzMSI+Cis8YSBocmVmPSIjIiBpZD0iczFhMSI+c3BhbjFhMTwvYT4KKzxhIGhyZWY9IiMiIGlkPSJzMWEyIj5zcGFuMWEyIDxzcGFuIGlkPSJzMWEyczEiPnRlc3Q8L3NwYW4+PC9hPgorPHNwYW4gY2xhc3M9InNwYW4yIj4KKzxhIGhyZWY9IiMiIGlkPSJzMmExIj5zcGFuMmExPC9hPgorPC9zcGFuPgorPHNwYW4gY2xhc3M9InNwYW4zIj48L3NwYW4+Cis8L3NwYW4+Cis8L2Rpdj4KKzxwIGxhbmc9ImVuIiBpZD0ibGFuZy1lbiI+RW5nbGlzaDwvcD4KKzxwIGxhbmc9ImVuLWdiIiBpZD0ibGFuZy1lbi1nYiI+RW5nbGlzaCBVSzwvcD4KKzxwIGxhbmc9ImVuLXVzIiBpZD0ibGFuZy1lbi11cyI+RW5nbGlzaCBVUzwvcD4KKzxwIGxhbmc9ImZyIiBpZD0ibGFuZy1mciI+RnJlbmNoPC9wPgorPC9kaXY+CisKKzxkaXYgaWQ9ImZvb3RlciI+Cis8L2Rpdj4KKyIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNvdXAgPSBCZWF1dGlmdWxTb3VwKHNlbGYuSFRNTCkKKworICAgIGRlZiBhc3NlcnRTZWxlY3RzKHNlbGYsIHNlbGVjdG9yLCBleHBlY3RlZF9pZHMpOgorICAgICAgICBlbF9pZHMgPSBbZWxbJ2lkJ10gZm9yIGVsIGluIHNlbGYuc291cC5zZWxlY3Qoc2VsZWN0b3IpXQorICAgICAgICBlbF9pZHMuc29ydCgpCisgICAgICAgIGV4cGVjdGVkX2lkcy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9pZHMsIGVsX2lkcywKKyAgICAgICAgICAgICJTZWxlY3RvciAlcywgZXhwZWN0ZWQgWyVzXSwgZ290IFslc10iICUgKAorICAgICAgICAgICAgICAgIHNlbGVjdG9yLCAnLCAnLmpvaW4oZXhwZWN0ZWRfaWRzKSwgJywgJy5qb2luKGVsX2lkcykKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorCisgICAgYXNzZXJ0U2VsZWN0ID0gYXNzZXJ0U2VsZWN0cworCisgICAgZGVmIGFzc2VydFNlbGVjdE11bHRpcGxlKHNlbGYsICp0ZXN0cyk6CisgICAgICAgIGZvciBzZWxlY3RvciwgZXhwZWN0ZWRfaWRzIGluIHRlc3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3Qoc2VsZWN0b3IsIGV4cGVjdGVkX2lkcykKKworICAgIGRlZiB0ZXN0X29uZV90YWdfb25lKHNlbGYpOgorICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KCd0aXRsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVscyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdLm5hbWUsICd0aXRsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdLmNvbnRlbnRzLCBbdSdUaGUgdGl0bGUnXSkKKworICAgIGRlZiB0ZXN0X29uZV90YWdfbWFueShzZWxmKToKKyAgICAgICAgZWxzID0gc2VsZi5zb3VwLnNlbGVjdCgnZGl2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMykKKyAgICAgICAgZm9yIGRpdiBpbiBlbHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdi5uYW1lLCAnZGl2JykKKworICAgIGRlZiB0ZXN0X3RhZ19pbl90YWdfb25lKHNlbGYpOgorICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KCdkaXYgZGl2JykKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCdkaXYgZGl2JywgWydpbm5lciddKQorCisgICAgZGVmIHRlc3RfdGFnX2luX3RhZ19tYW55KHNlbGYpOgorICAgICAgICBmb3Igc2VsZWN0b3IgaW4gKCdodG1sIGRpdicsICdodG1sIGJvZHkgZGl2JywgJ2JvZHkgZGl2Jyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc2VsZWN0b3IsIFsnbWFpbicsICdpbm5lcicsICdmb290ZXInXSkKKworICAgIGRlZiB0ZXN0X3RhZ19ub19tYXRjaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zb3VwLnNlbGVjdCgnZGVsJykpLCAwKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF90YWcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuc291cC5zZWxlY3QsICd0YWcldCcpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfdGFncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RNdWx0aXBsZSgKKyAgICAgICAgICAgICgnaDEnLCBbJ2hlYWRlcjEnXSksCisgICAgICAgICAgICAoJ2gyJywgWydoZWFkZXIyJywgJ2hlYWRlcjMnXSksCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2NsYXNzX29uZShzZWxmKToKKyAgICAgICAgZm9yIHNlbGVjdG9yIGluICgnLm9uZXAnLCAncC5vbmVwJywgJ2h0bWwgcC5vbmVwJyk6CisgICAgICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KHNlbGVjdG9yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdLm5hbWUsICdwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdWydjbGFzcyddLCBbJ29uZXAnXSkKKworICAgIGRlZiB0ZXN0X2NsYXNzX21pc21hdGNoZWRfdGFnKHNlbGYpOgorICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KCdkaXYub25lcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVscyksIDApCisKKyAgICBkZWYgdGVzdF9vbmVfaWQoc2VsZik6CisgICAgICAgIGZvciBzZWxlY3RvciBpbiAoJ2RpdiNpbm5lcicsICcjaW5uZXInLCAnZGl2IGRpdiNpbm5lcicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKHNlbGVjdG9yLCBbJ2lubmVyJ10pCisKKyAgICBkZWYgdGVzdF9iYWRfaWQoc2VsZik6CisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJyNkb2Vzbm90ZXhpc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAwKQorCisgICAgZGVmIHRlc3RfaXRlbXNfaW5faWQoc2VsZik6CisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ2RpdiNpbm5lciBwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMykKKyAgICAgICAgZm9yIGVsIGluIGVsczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWwubmFtZSwgJ3AnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVsc1sxXVsnY2xhc3MnXSwgWydvbmVwJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZWxzWzBdLmhhc19hdHRyKCdjbGFzcycpKQorCisgICAgZGVmIHRlc3RfYV9idW5jaF9vZl9lbXB0eXMoc2VsZik6CisgICAgICAgIGZvciBzZWxlY3RvciBpbiAoJ2RpdiNtYWluIGRlbCcsICdkaXYjbWFpbiBkaXYub29wcycsICdkaXYgZGl2I21haW4nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc291cC5zZWxlY3Qoc2VsZWN0b3IpKSwgMCkKKworICAgIGRlZiB0ZXN0X211bHRpX2NsYXNzX3N1cHBvcnQoc2VsZik6CisgICAgICAgIGZvciBzZWxlY3RvciBpbiAoJy5jbGFzczEnLCAncC5jbGFzczEnLCAnLmNsYXNzMicsICdwLmNsYXNzMicsCisgICAgICAgICAgICAnLmNsYXNzMycsICdwLmNsYXNzMycsICdodG1sIHAuY2xhc3MyJywgJ2RpdiNpbm5lciAuY2xhc3MyJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc2VsZWN0b3IsIFsncG11bHRpJ10pCisKKyAgICBkZWYgdGVzdF9tdWx0aV9jbGFzc19zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGZvciBzZWxlY3RvciBpbiAoJy5jbGFzczEuY2xhc3MzJywgJy5jbGFzczMuY2xhc3MyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLmNsYXNzMS5jbGFzczIuY2xhc3MzJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoc2VsZWN0b3IsIFsncG11bHRpJ10pCisKKyAgICBkZWYgdGVzdF9jaGlsZF9zZWxlY3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcuczEgPiBhJywgWydzMWExJywgJ3MxYTInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcuczEgPiBhIHNwYW4nLCBbJ3MxYTJzMSddKQorCisgICAgZGVmIHRlc3RfY2hpbGRfc2VsZWN0b3JfaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnLnMxID4gYSNzMWEyIHNwYW4nLCBbJ3MxYTJzMSddKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX2VxdWFscyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RNdWx0aXBsZSgKKyAgICAgICAgICAgICgncFtjbGFzcz0ib25lcCJdJywgWydwMSddKSwKKyAgICAgICAgICAgICgncFtpZD0icDEiXScsIFsncDEnXSksCisgICAgICAgICAgICAoJ1tjbGFzcz0ib25lcCJdJywgWydwMSddKSwKKyAgICAgICAgICAgICgnW2lkPSJwMSJdJywgWydwMSddKSwKKyAgICAgICAgICAgICgnbGlua1tyZWw9InN0eWxlc2hlZXQiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbdHlwZT0idGV4dC9jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbaHJlZj0iYmxhaC5jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbaHJlZj0ibm8tYmxhaC5jc3MiXScsIFtdKSwKKyAgICAgICAgICAgICgnW3JlbD0ic3R5bGVzaGVldCJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnW3R5cGU9InRleHQvY3NzIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdbaHJlZj0iYmxhaC5jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ1tocmVmPSJuby1ibGFoLmNzcyJdJywgW10pLAorICAgICAgICAgICAgKCdwW2hyZWY9Im5vLWJsYWguY3NzIl0nLCBbXSksCisgICAgICAgICAgICAoJ1tocmVmPSJuby1ibGFoLmNzcyJdJywgW10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfdGlsZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0TXVsdGlwbGUoCisgICAgICAgICAgICAoJ3BbY2xhc3N+PSJjbGFzczEiXScsIFsncG11bHRpJ10pLAorICAgICAgICAgICAgKCdwW2NsYXNzfj0iY2xhc3MyIl0nLCBbJ3BtdWx0aSddKSwKKyAgICAgICAgICAgICgncFtjbGFzc349ImNsYXNzMyJdJywgWydwbXVsdGknXSksCisgICAgICAgICAgICAoJ1tjbGFzc349ImNsYXNzMSJdJywgWydwbXVsdGknXSksCisgICAgICAgICAgICAoJ1tjbGFzc349ImNsYXNzMiJdJywgWydwbXVsdGknXSksCisgICAgICAgICAgICAoJ1tjbGFzc349ImNsYXNzMyJdJywgWydwbXVsdGknXSksCisgICAgICAgICAgICAoJ2FbcmVsfj0iZnJpZW5kIl0nLCBbJ2JvYiddKSwKKyAgICAgICAgICAgICgnYVtyZWx+PSJtZXQiXScsIFsnYm9iJ10pLAorICAgICAgICAgICAgKCdbcmVsfj0iZnJpZW5kIl0nLCBbJ2JvYiddKSwKKyAgICAgICAgICAgICgnW3JlbH49Im1ldCJdJywgWydib2InXSksCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZV9zdGFydHN3aXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdE11bHRpcGxlKAorICAgICAgICAgICAgKCdbcmVsXj0ic3R5bGUiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbcmVsXj0ic3R5bGUiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ25vdGxpbmtbcmVsXj0ibm90c3R5bGUiXScsIFtdKSwKKyAgICAgICAgICAgICgnW3JlbF49Im5vdHN0eWxlIl0nLCBbXSksCisgICAgICAgICAgICAoJ2xpbmtbcmVsXj0ibm90c3R5bGUiXScsIFtdKSwKKyAgICAgICAgICAgICgnbGlua1tocmVmXj0iYmxhIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdhW2hyZWZePSJodHRwOi8vIl0nLCBbJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnW2hyZWZePSJodHRwOi8vIl0nLCBbJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnW2lkXj0icCJdJywgWydwbXVsdGknLCAncDEnXSksCisgICAgICAgICAgICAoJ1tpZF49Im0iXScsIFsnbWUnLCAnbWFpbiddKSwKKyAgICAgICAgICAgICgnZGl2W2lkXj0ibSJdJywgWydtYWluJ10pLAorICAgICAgICAgICAgKCdhW2lkXj0ibSJdJywgWydtZSddKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX2VuZHN3aXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdE11bHRpcGxlKAorICAgICAgICAgICAgKCdbaHJlZiQ9Ii5jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbaHJlZiQ9Ii5jc3MiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbaWQkPSIxIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdbaWQkPSIxIl0nLCBbJ2wxJywgJ3AxJywgJ2hlYWRlcjEnLCAnczFhMScsICdzMmExJywgJ3MxYTJzMSddKSwKKyAgICAgICAgICAgICgnZGl2W2lkJD0iMSJdJywgW10pLAorICAgICAgICAgICAgKCdbaWQkPSJub2VuZGluZyJdJywgW10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfY29udGFpbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0TXVsdGlwbGUoCisgICAgICAgICAgICAjIEZyb20gdGVzdF9hdHRyaWJ1dGVfc3RhcnRzd2l0aAorICAgICAgICAgICAgKCdbcmVsKj0ic3R5bGUiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ2xpbmtbcmVsKj0ic3R5bGUiXScsIFsnbDEnXSksCisgICAgICAgICAgICAoJ25vdGxpbmtbcmVsKj0ibm90c3R5bGUiXScsIFtdKSwKKyAgICAgICAgICAgICgnW3JlbCo9Im5vdHN0eWxlIl0nLCBbXSksCisgICAgICAgICAgICAoJ2xpbmtbcmVsKj0ibm90c3R5bGUiXScsIFtdKSwKKyAgICAgICAgICAgICgnbGlua1tocmVmKj0iYmxhIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdhW2hyZWYqPSJodHRwOi8vIl0nLCBbJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnW2hyZWYqPSJodHRwOi8vIl0nLCBbJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnW2lkKj0icCJdJywgWydwbXVsdGknLCAncDEnXSksCisgICAgICAgICAgICAoJ2RpdltpZCo9Im0iXScsIFsnbWFpbiddKSwKKyAgICAgICAgICAgICgnYVtpZCo9Im0iXScsIFsnbWUnXSksCisgICAgICAgICAgICAjIEZyb20gdGVzdF9hdHRyaWJ1dGVfZW5kc3dpdGgKKyAgICAgICAgICAgICgnW2hyZWYqPSIuY3NzIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdsaW5rW2hyZWYqPSIuY3NzIl0nLCBbJ2wxJ10pLAorICAgICAgICAgICAgKCdsaW5rW2lkKj0iMSJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnW2lkKj0iMSJdJywgWydsMScsICdwMScsICdoZWFkZXIxJywgJ3MxYTEnLCAnczFhMicsICdzMmExJywgJ3MxYTJzMSddKSwKKyAgICAgICAgICAgICgnZGl2W2lkKj0iMSJdJywgW10pLAorICAgICAgICAgICAgKCdbaWQqPSJub2VuZGluZyJdJywgW10pLAorICAgICAgICAgICAgIyBOZXcgZm9yIHRoaXMgdGVzdAorICAgICAgICAgICAgKCdbaHJlZio9Ii4iXScsIFsnYm9iJywgJ21lJywgJ2wxJ10pLAorICAgICAgICAgICAgKCdhW2hyZWYqPSIuIl0nLCBbJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnbGlua1tocmVmKj0iLiJdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnZGl2W2lkKj0ibiJdJywgWydtYWluJywgJ2lubmVyJ10pLAorICAgICAgICAgICAgKCdkaXZbaWQqPSJubiJdJywgWydpbm5lciddKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX2V4YWN0X29yX2h5cGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdE11bHRpcGxlKAorICAgICAgICAgICAgKCdwW2xhbmd8PSJlbiJdJywgWydsYW5nLWVuJywgJ2xhbmctZW4tZ2InLCAnbGFuZy1lbi11cyddKSwKKyAgICAgICAgICAgICgnW2xhbmd8PSJlbiJdJywgWydsYW5nLWVuJywgJ2xhbmctZW4tZ2InLCAnbGFuZy1lbi11cyddKSwKKyAgICAgICAgICAgICgncFtsYW5nfD0iZnIiXScsIFsnbGFuZy1mciddKSwKKyAgICAgICAgICAgICgncFtsYW5nfD0iZ2IiXScsIFtdKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX2V4aXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RNdWx0aXBsZSgKKyAgICAgICAgICAgICgnW3JlbF0nLCBbJ2wxJywgJ2JvYicsICdtZSddKSwKKyAgICAgICAgICAgICgnbGlua1tyZWxdJywgWydsMSddKSwKKyAgICAgICAgICAgICgnYVtyZWxdJywgWydib2InLCAnbWUnXSksCisgICAgICAgICAgICAoJ1tsYW5nXScsIFsnbGFuZy1lbicsICdsYW5nLWVuLWdiJywgJ2xhbmctZW4tdXMnLCAnbGFuZy1mciddKSwKKyAgICAgICAgICAgICgncFtjbGFzc10nLCBbJ3AxJywgJ3BtdWx0aSddKSwKKyAgICAgICAgICAgICgnW2JsYWhdJywgW10pLAorICAgICAgICAgICAgKCdwW2JsYWhdJywgW10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9udGhfb2ZfdHlwZShzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gc2VsZWN0IGZpcnN0IHBhcmFncmFwaAorICAgICAgICBlbHMgPSBzZWxmLnNvdXAuc2VsZWN0KCdkaXYjaW5uZXIgcDpudGgtb2YtdHlwZSgxKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVscyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWxzWzBdLnN0cmluZywgdSdTb21lIHRleHQnKQorCisgICAgICAgICMgVHJ5IHRvIHNlbGVjdCB0aGlyZCBwYXJhZ3JhcGgKKyAgICAgICAgZWxzID0gc2VsZi5zb3VwLnNlbGVjdCgnZGl2I2lubmVyIHA6bnRoLW9mLXR5cGUoMyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVsc1swXS5zdHJpbmcsIHUnQW5vdGhlcicpCisKKyAgICAgICAgIyBUcnkgdG8gc2VsZWN0IChub24tZXhpc3RlbnQhKSBmb3VydGggcGFyYWdyYXBoCisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ2RpdiNpbm5lciBwOm50aC1vZi10eXBlKDQpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWxzKSwgMCkKKworICAgICAgICAjIFBhc3MgaW4gYW4gaW52YWxpZCB2YWx1ZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBWYWx1ZUVycm9yLCBzZWxmLnNvdXAuc2VsZWN0LCAnZGl2IHA6bnRoLW9mLXR5cGUoMCknKQorCisgICAgZGVmIHRlc3RfbnRoX29mX3R5cGVfZGlyZWN0X2Rlc2NlbmRhbnQoc2VsZik6CisgICAgICAgIGVscyA9IHNlbGYuc291cC5zZWxlY3QoJ2RpdiNpbm5lciA+IHA6bnRoLW9mLXR5cGUoMSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVsc1swXS5zdHJpbmcsIHUnU29tZSB0ZXh0JykKKworICAgIGRlZiB0ZXN0X2lkX2NoaWxkX3NlbGVjdG9yX250aF9vZl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJyNpbm5lciA+IHA6bnRoLW9mLXR5cGUoMiknLCBbJ3AxJ10pCisKKyAgICBkZWYgdGVzdF9zZWxlY3Rfb25fZWxlbWVudChzZWxmKToKKyAgICAgICAgIyBPdGhlciB0ZXN0cyBvcGVyYXRlIG9uIHRoZSB0cmVlOyB0aGlzIG9wZXJhdGVzIG9uIGFuIGVsZW1lbnQKKyAgICAgICAgIyB3aXRoaW4gdGhlIHRyZWUuCisgICAgICAgIGlubmVyID0gc2VsZi5zb3VwLmZpbmQoImRpdiIsIGlkPSJtYWluIikKKyAgICAgICAgc2VsZWN0ZWQgPSBpbm5lci5zZWxlY3QoImRpdiIpCisgICAgICAgICMgVGhlIDxkaXYgaWQ9ImlubmVyIj4gdGFnIHdhcyBzZWxlY3RlZC4gVGhlIDxkaXYgaWQ9ImZvb3RlciI+CisgICAgICAgICMgdGFnIHdhcyBub3QuCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0c0lEcyhzZWxlY3RlZCwgWydpbm5lciddKQorCisgICAgZGVmIHRlc3Rfb3ZlcnNwZWNpZmllZF9jaGlsZF9pZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCIuZmFuY3kgI2lubmVyIiwgWydpbm5lciddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoIi5ub3JtYWwgI2lubmVyIiwgW10pCisKKyAgICBkZWYgdGVzdF9hZGphY2VudF9zaWJsaW5nX3NlbGVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJyNwMSArIGgyJywgWydoZWFkZXIyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI3AxICsgaDIgKyBwJywgWydwbXVsdGknXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCcjcDEgKyAjaGVhZGVyMiArIC5jbGFzczEnLCBbJ3BtdWx0aSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzZWxmLnNvdXAuc2VsZWN0KCcjcDEgKyBwJykpCisKKyAgICBkZWYgdGVzdF9nZW5lcmFsX3NpYmxpbmdfc2VsZWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI3AxIH4gaDInLCBbJ2hlYWRlcjInLCAnaGVhZGVyMyddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJyNwMSB+ICNoZWFkZXIyJywgWydoZWFkZXIyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2VsZWN0cygnI3AxIH4gaDIgKyBhJywgWydtZSddKQorICAgICAgICBzZWxmLmFzc2VydFNlbGVjdHMoJyNwMSB+IGgyICsgW3JlbD0ibWUiXScsIFsnbWUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc2VsZi5zb3VwLnNlbGVjdCgnI2lubmVyIH4gaDInKSkKKworICAgIGRlZiB0ZXN0X2RhbmdsaW5nX2NvbWJpbmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuc291cC5zZWxlY3QsICdoMSA+JykKKworICAgIGRlZiB0ZXN0X3NpYmxpbmdfY29tYmluYXRvcl93b250X3NlbGVjdF9zYW1lX3RhZ190d2ljZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTZWxlY3RzKCdwW2xhbmddIH4gcCcsIFsnbGFuZy1lbi1nYicsICdsYW5nLWVuLXVzJywgJ2xhbmctZnInXSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL2NvZGVnZW4ucHkgYi9iaXRiYWtlL2xpYi9jb2RlZ2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzcyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9jb2RlZ2VuLnB5CkBAIC0wLDAgKzEsNTcwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiCisgICAgY29kZWdlbgorICAgIH5+fn5+fn4KKworICAgIEV4dGVuc2lvbiB0byBhc3QgdGhhdCBhbGxvdyBhc3QgLT4gcHl0aG9uIGNvZGUgZ2VuZXJhdGlvbi4KKworICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDA4IGJ5IEFybWluIFJvbmFjaGVyLgorICAgIDpsaWNlbnNlOiBCU0QuCisiIiIKK2Zyb20gYXN0IGltcG9ydCAqCisKK0JPT0xPUF9TWU1CT0xTID0geworICAgIEFuZDogICAgICAgICdhbmQnLAorICAgIE9yOiAgICAgICAgICdvcicKK30KKworQklOT1BfU1lNQk9MUyA9IHsKKyAgICBBZGQ6ICAgICAgICAnKycsCisgICAgU3ViOiAgICAgICAgJy0nLAorICAgIE11bHQ6ICAgICAgICcqJywKKyAgICBEaXY6ICAgICAgICAnLycsCisgICAgRmxvb3JEaXY6ICAgJy8vJywKKyAgICBNb2Q6ICAgICAgICAnJScsCisgICAgTFNoaWZ0OiAgICAgJzw8JywKKyAgICBSU2hpZnQ6ICAgICAnPj4nLAorICAgIEJpdE9yOiAgICAgICd8JywKKyAgICBCaXRBbmQ6ICAgICAnJicsCisgICAgQml0WG9yOiAgICAgJ14nCit9CisKK0NNUE9QX1NZTUJPTFMgPSB7CisgICAgRXE6ICAgICAgICAgJz09JywKKyAgICBHdDogICAgICAgICAnPicsCisgICAgR3RFOiAgICAgICAgJz49JywKKyAgICBJbjogICAgICAgICAnaW4nLAorICAgIElzOiAgICAgICAgICdpcycsCisgICAgSXNOb3Q6ICAgICAgJ2lzIG5vdCcsCisgICAgTHQ6ICAgICAgICAgJzwnLAorICAgIEx0RTogICAgICAgICc8PScsCisgICAgTm90RXE6ICAgICAgJyE9JywKKyAgICBOb3RJbjogICAgICAnbm90IGluJworfQorCitVTkFSWU9QX1NZTUJPTFMgPSB7CisgICAgSW52ZXJ0OiAgICAgJ34nLAorICAgIE5vdDogICAgICAgICdub3QnLAorICAgIFVBZGQ6ICAgICAgICcrJywKKyAgICBVU3ViOiAgICAgICAnLScKK30KKworQUxMX1NZTUJPTFMgPSB7fQorQUxMX1NZTUJPTFMudXBkYXRlKEJPT0xPUF9TWU1CT0xTKQorQUxMX1NZTUJPTFMudXBkYXRlKEJJTk9QX1NZTUJPTFMpCitBTExfU1lNQk9MUy51cGRhdGUoQ01QT1BfU1lNQk9MUykKK0FMTF9TWU1CT0xTLnVwZGF0ZShVTkFSWU9QX1NZTUJPTFMpCisKK2RlZiB0b19zb3VyY2Uobm9kZSwgaW5kZW50X3dpdGg9JyAnICogNCwgYWRkX2xpbmVfaW5mb3JtYXRpb249RmFsc2UpOgorICAgICIiIlRoaXMgZnVuY3Rpb24gY2FuIGNvbnZlcnQgYSBub2RlIHRyZWUgYmFjayBpbnRvIHB5dGhvbiBzb3VyY2Vjb2RlLgorICAgIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGVzcGVjaWFsbHkgaWYgeW91J3JlIGRlYWxpbmcgd2l0aAorICAgIGN1c3RvbSBhc3RzIG5vdCBnZW5lcmF0ZWQgYnkgcHl0aG9uIGl0c2VsZi4KKworICAgIEl0IGNvdWxkIGJlIHRoYXQgdGhlIHNvdXJjZWNvZGUgaXMgZXZhbHVhYmxlIHdoZW4gdGhlIEFTVCBpdHNlbGYgaXMgbm90CisgICAgY29tcGlsYWJsZSAvIGV2YWx1YWJsZS4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgQVNUIGNvbnRhaW5zIHNvbWUKKyAgICBtb3JlIGRhdGEgdGhhbiByZWd1bGFyIHNvdXJjZWNvZGUgZG9lcywgd2hpY2ggaXMgZHJvcHBlZCBkdXJpbmcKKyAgICBjb252ZXJzaW9uLgorCisgICAgRWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbiBpcyByZXBsYWNlZCB3aXRoIGBpbmRlbnRfd2l0aGAuICBQZXIgZGVmYXVsdCB0aGlzCisgICAgcGFyYW1ldGVyIGlzIGVxdWFsIHRvIGZvdXIgc3BhY2VzIGFzIHN1Z2dlc3RlZCBieSBQRVAgOCwgYnV0IGl0IG1pZ2h0IGJlCisgICAgYWRqdXN0ZWQgdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3Mgc3R5bGVndWlkZS4KKworICAgIElmIGBhZGRfbGluZV9pbmZvcm1hdGlvbmAgaXMgc2V0IHRvIGBUcnVlYCBjb21tZW50cyBmb3IgdGhlIGxpbmUgbnVtYmVycworICAgIG9mIHRoZSBub2RlcyBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3BvdCB3cm9uZyBsaW5lCisgICAgbnVtYmVyIGluZm9ybWF0aW9uIG9mIHN0YXRlbWVudCBub2Rlcy4KKyAgICAiIiIKKyAgICBnZW5lcmF0b3IgPSBTb3VyY2VHZW5lcmF0b3IoaW5kZW50X3dpdGgsIGFkZF9saW5lX2luZm9ybWF0aW9uKQorICAgIGdlbmVyYXRvci52aXNpdChub2RlKQorICAgIHJldHVybiAnJy5qb2luKGdlbmVyYXRvci5yZXN1bHQpCisKKworY2xhc3MgU291cmNlR2VuZXJhdG9yKE5vZGVWaXNpdG9yKToKKyAgICAiIiJUaGlzIHZpc2l0b3IgaXMgYWJsZSB0byB0cmFuc2Zvcm0gYSB3ZWxsIGZvcm1lZCBzeW50YXggdHJlZSBpbnRvIHB5dGhvbgorICAgIHNvdXJjZWNvZGUuICBGb3IgbW9yZSBkZXRhaWxzIGhhdmUgYSBsb29rIGF0IHRoZSBkb2NzdHJpbmcgb2YgdGhlCisgICAgYG5vZGVfdG9fc291cmNlYCBmdW5jdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRlbnRfd2l0aCwgYWRkX2xpbmVfaW5mb3JtYXRpb249RmFsc2UpOgorICAgICAgICBzZWxmLnJlc3VsdCA9IFtdCisgICAgICAgIHNlbGYuaW5kZW50X3dpdGggPSBpbmRlbnRfd2l0aAorICAgICAgICBzZWxmLmFkZF9saW5lX2luZm9ybWF0aW9uID0gYWRkX2xpbmVfaW5mb3JtYXRpb24KKyAgICAgICAgc2VsZi5pbmRlbnRhdGlvbiA9IDAKKyAgICAgICAgc2VsZi5uZXdfbGluZXMgPSAwCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgeCk6CisgICAgICAgIGlmIHNlbGYubmV3X2xpbmVzOgorICAgICAgICAgICAgaWYgc2VsZi5yZXN1bHQ6CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQuYXBwZW5kKCdcbicgKiBzZWxmLm5ld19saW5lcykKKyAgICAgICAgICAgIHNlbGYucmVzdWx0LmFwcGVuZChzZWxmLmluZGVudF93aXRoICogc2VsZi5pbmRlbnRhdGlvbikKKyAgICAgICAgICAgIHNlbGYubmV3X2xpbmVzID0gMAorICAgICAgICBzZWxmLnJlc3VsdC5hcHBlbmQoeCkKKworICAgIGRlZiBuZXdsaW5lKHNlbGYsIG5vZGU9Tm9uZSwgZXh0cmE9MCk6CisgICAgICAgIHNlbGYubmV3X2xpbmVzID0gbWF4KHNlbGYubmV3X2xpbmVzLCAxICsgZXh0cmEpCisgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYuYWRkX2xpbmVfaW5mb3JtYXRpb246CisgICAgICAgICAgICBzZWxmLndyaXRlKCcjIGxpbmU6ICVzJyAlIG5vZGUubGluZW5vKQorICAgICAgICAgICAgc2VsZi5uZXdfbGluZXMgPSAxCisKKyAgICBkZWYgYm9keShzZWxmLCBzdGF0ZW1lbnRzKToKKyAgICAgICAgc2VsZi5uZXdfbGluZSA9IFRydWUKKyAgICAgICAgc2VsZi5pbmRlbnRhdGlvbiArPSAxCisgICAgICAgIGZvciBzdG10IGluIHN0YXRlbWVudHM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KHN0bXQpCisgICAgICAgIHNlbGYuaW5kZW50YXRpb24gLT0gMQorCisgICAgZGVmIGJvZHlfb3JfZWxzZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5ib2R5KG5vZGUuYm9keSkKKyAgICAgICAgaWYgbm9kZS5vcmVsc2U6CisgICAgICAgICAgICBzZWxmLm5ld2xpbmUoKQorICAgICAgICAgICAgc2VsZi53cml0ZSgnZWxzZTonKQorICAgICAgICAgICAgc2VsZi5ib2R5KG5vZGUub3JlbHNlKQorCisgICAgZGVmIHNpZ25hdHVyZShzZWxmLCBub2RlKToKKyAgICAgICAgd2FudF9jb21tYSA9IFtdCisgICAgICAgIGRlZiB3cml0ZV9jb21tYSgpOgorICAgICAgICAgICAgaWYgd2FudF9jb21tYToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdhbnRfY29tbWEuYXBwZW5kKFRydWUpCisKKyAgICAgICAgcGFkZGluZyA9IFtOb25lXSAqIChsZW4obm9kZS5hcmdzKSAtIGxlbihub2RlLmRlZmF1bHRzKSkKKyAgICAgICAgZm9yIGFyZywgZGVmYXVsdCBpbiB6aXAobm9kZS5hcmdzLCBwYWRkaW5nICsgbm9kZS5kZWZhdWx0cyk6CisgICAgICAgICAgICB3cml0ZV9jb21tYSgpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGFyZykKKyAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnPScpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChkZWZhdWx0KQorICAgICAgICBpZiBub2RlLnZhcmFyZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdyaXRlX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyonICsgbm9kZS52YXJhcmcpCisgICAgICAgIGlmIG5vZGUua3dhcmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3cml0ZV9jb21tYSgpCisgICAgICAgICAgICBzZWxmLndyaXRlKCcqKicgKyBub2RlLmt3YXJnKQorCisgICAgZGVmIGRlY29yYXRvcnMoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBkZWNvcmF0b3IgaW4gbm9kZS5kZWNvcmF0b3JfbGlzdDoKKyAgICAgICAgICAgIHNlbGYubmV3bGluZShkZWNvcmF0b3IpCisgICAgICAgICAgICBzZWxmLndyaXRlKCdAJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoZGVjb3JhdG9yKQorCisgICAgIyBTdGF0ZW1lbnRzCisKKyAgICBkZWYgdmlzaXRfQXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgZm9yIGlkeCwgdGFyZ2V0IGluIGVudW1lcmF0ZShub2RlLnRhcmdldHMpOgorICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQodGFyZ2V0KQorICAgICAgICBzZWxmLndyaXRlKCcgPSAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisKKyAgICBkZWYgdmlzaXRfQXVnQXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRhcmdldCkKKyAgICAgICAgc2VsZi53cml0ZShCSU5PUF9TWU1CT0xTW3R5cGUobm9kZS5vcCldICsgJz0nKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisKKyAgICBkZWYgdmlzaXRfSW1wb3J0RnJvbShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ2Zyb20gJXMlcyBpbXBvcnQgJyAlICgnLicgKiBub2RlLmxldmVsLCBub2RlLm1vZHVsZSkpCisgICAgICAgIGZvciBpZHgsIGl0ZW0gaW4gZW51bWVyYXRlKG5vZGUubmFtZXMpOgorICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIHNlbGYud3JpdGUoaXRlbSkKKworICAgIGRlZiB2aXNpdF9JbXBvcnQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBmb3IgaXRlbSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnaW1wb3J0ICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGl0ZW0pCisKKyAgICBkZWYgdmlzaXRfRXhwcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYuZ2VuZXJpY192aXNpdChub2RlKQorCisgICAgZGVmIHZpc2l0X0Z1bmN0aW9uRGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUoZXh0cmE9MSkKKyAgICAgICAgc2VsZi5kZWNvcmF0b3JzKG5vZGUpCisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdkZWYgJXMoJyAlIG5vZGUubmFtZSkKKyAgICAgICAgc2VsZi5zaWduYXR1cmUobm9kZS5hcmdzKQorICAgICAgICBzZWxmLndyaXRlKCcpOicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmJvZHkpCisKKyAgICBkZWYgdmlzaXRfQ2xhc3NEZWYoc2VsZiwgbm9kZSk6CisgICAgICAgIGhhdmVfYXJncyA9IFtdCisgICAgICAgIGRlZiBwYXJlbl9vcl9jb21tYSgpOgorICAgICAgICAgICAgaWYgaGF2ZV9hcmdzOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGF2ZV9hcmdzLmFwcGVuZChUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJygnKQorCisgICAgICAgIHNlbGYubmV3bGluZShleHRyYT0yKQorICAgICAgICBzZWxmLmRlY29yYXRvcnMobm9kZSkKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ2NsYXNzICVzJyAlIG5vZGUubmFtZSkKKyAgICAgICAgZm9yIGJhc2UgaW4gbm9kZS5iYXNlczoKKyAgICAgICAgICAgIHBhcmVuX29yX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYudmlzaXQoYmFzZSkKKyAgICAgICAgIyBYWFg6IHRoZSBpZiBoZXJlIGlzIHVzZWQgdG8ga2VlcCB0aGlzIG1vZHVsZSBjb21wYXRpYmxlCisgICAgICAgICMgICAgICB3aXRoIHB5dGhvbiAyLjYuCisgICAgICAgIGlmIGhhc2F0dHIobm9kZSwgJ2tleXdvcmRzJyk6CisgICAgICAgICAgICBmb3Iga2V5d29yZCBpbiBub2RlLmtleXdvcmRzOgorICAgICAgICAgICAgICAgIHBhcmVuX29yX2NvbW1hKCkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGtleXdvcmQuYXJnICsgJz0nKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoa2V5d29yZC52YWx1ZSkKKyAgICAgICAgICAgIGlmIG5vZGUuc3RhcmFyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcGFyZW5fb3JfY29tbWEoKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJyonKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5zdGFyYXJncykKKyAgICAgICAgICAgIGlmIG5vZGUua3dhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHBhcmVuX29yX2NvbW1hKCkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcqKicpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmt3YXJncykKKyAgICAgICAgc2VsZi53cml0ZShoYXZlX2FyZ3MgYW5kICcpOicgb3IgJzonKQorICAgICAgICBzZWxmLmJvZHkobm9kZS5ib2R5KQorCisgICAgZGVmIHZpc2l0X0lmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnaWYgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRlc3QpCisgICAgICAgIHNlbGYud3JpdGUoJzonKQorICAgICAgICBzZWxmLmJvZHkobm9kZS5ib2R5KQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZWxzZV8gPSBub2RlLm9yZWxzZQorICAgICAgICAgICAgaWYgbGVuKGVsc2VfKSA9PSAxIGFuZCBpc2luc3RhbmNlKGVsc2VfWzBdLCBJZik6CisgICAgICAgICAgICAgICAgbm9kZSA9IGVsc2VfWzBdCisgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCdlbGlmICcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnRlc3QpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgICAgICAgICAgc2VsZi5ib2R5KG5vZGUuYm9keSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCdlbHNlOicpCisgICAgICAgICAgICAgICAgc2VsZi5ib2R5KGVsc2VfKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgdmlzaXRfRm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnZm9yICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS50YXJnZXQpCisgICAgICAgIHNlbGYud3JpdGUoJyBpbiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuaXRlcikKKyAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgIHNlbGYuYm9keV9vcl9lbHNlKG5vZGUpCisKKyAgICBkZWYgdmlzaXRfV2hpbGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCd3aGlsZSAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgIHNlbGYuYm9keV9vcl9lbHNlKG5vZGUpCisKKyAgICBkZWYgdmlzaXRfV2l0aChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3dpdGggJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmNvbnRleHRfZXhwcikKKyAgICAgICAgaWYgbm9kZS5vcHRpb25hbF92YXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnIGFzICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUub3B0aW9uYWxfdmFycykKKyAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmJvZHkpCisKKyAgICBkZWYgdmlzaXRfUGFzcyhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3Bhc3MnKQorCisgICAgZGVmIHZpc2l0X1ByaW50KHNlbGYsIG5vZGUpOgorICAgICAgICAjIFhYWDogcHl0aG9uIDIuNiBvbmx5CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdwcmludCAnKQorICAgICAgICB3YW50X2NvbW1hID0gRmFsc2UKKyAgICAgICAgaWYgbm9kZS5kZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnID4+ICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZGVzdCkKKyAgICAgICAgICAgIHdhbnRfY29tbWEgPSBUcnVlCisgICAgICAgIGZvciB2YWx1ZSBpbiBub2RlLnZhbHVlczoKKyAgICAgICAgICAgIGlmIHdhbnRfY29tbWE6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgc2VsZi52aXNpdCh2YWx1ZSkKKyAgICAgICAgICAgIHdhbnRfY29tbWEgPSBUcnVlCisgICAgICAgIGlmIG5vdCBub2RlLm5sOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnLCcpCisKKyAgICBkZWYgdmlzaXRfRGVsZXRlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnZGVsICcpCisgICAgICAgIGZvciBpZHgsIHRhcmdldCBpbiBlbnVtZXJhdGUobm9kZSk6CisgICAgICAgICAgICBpZiBpZHg6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgc2VsZi52aXNpdCh0YXJnZXQpCisKKyAgICBkZWYgdmlzaXRfVHJ5RXhjZXB0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgndHJ5OicpCisgICAgICAgIHNlbGYuYm9keShub2RlLmJvZHkpCisgICAgICAgIGZvciBoYW5kbGVyIGluIG5vZGUuaGFuZGxlcnM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGhhbmRsZXIpCisKKyAgICBkZWYgdmlzaXRfVHJ5RmluYWxseShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3RyeTonKQorICAgICAgICBzZWxmLmJvZHkobm9kZS5ib2R5KQorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnZmluYWxseTonKQorICAgICAgICBzZWxmLmJvZHkobm9kZS5maW5hbGJvZHkpCisKKyAgICBkZWYgdmlzaXRfR2xvYmFsKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5ld2xpbmUobm9kZSkKKyAgICAgICAgc2VsZi53cml0ZSgnZ2xvYmFsICcgKyAnLCAnLmpvaW4obm9kZS5uYW1lcykpCisKKyAgICBkZWYgdmlzaXRfTm9ubG9jYWwoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdub25sb2NhbCAnICsgJywgJy5qb2luKG5vZGUubmFtZXMpKQorCisgICAgZGVmIHZpc2l0X1JldHVybihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3JldHVybiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisKKyAgICBkZWYgdmlzaXRfQnJlYWsoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdicmVhaycpCisKKyAgICBkZWYgdmlzaXRfQ29udGludWUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdjb250aW51ZScpCisKKyAgICBkZWYgdmlzaXRfUmFpc2Uoc2VsZiwgbm9kZSk6CisgICAgICAgICMgWFhYOiBQeXRob24gMi42IC8gMy4wIGNvbXBhdGliaWxpdHkKKyAgICAgICAgc2VsZi5uZXdsaW5lKG5vZGUpCisgICAgICAgIHNlbGYud3JpdGUoJ3JhaXNlJykKKyAgICAgICAgaWYgaGFzYXR0cihub2RlLCAnZXhjJykgYW5kIG5vZGUuZXhjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhjKQorICAgICAgICAgICAgaWYgbm9kZS5jYXVzZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcgZnJvbSAnKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5jYXVzZSkKKyAgICAgICAgZWxpZiBoYXNhdHRyKG5vZGUsICd0eXBlJykgYW5kIG5vZGUudHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS50eXBlKQorICAgICAgICAgICAgaWYgbm9kZS5pbnN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJywgJykKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuaW5zdCkKKyAgICAgICAgICAgIGlmIG5vZGUudGJhY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnLCAnKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS50YmFjaykKKworICAgICMgRXhwcmVzc2lvbnMKKworICAgIGRlZiB2aXNpdF9BdHRyaWJ1dGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKyAgICAgICAgc2VsZi53cml0ZSgnLicgKyBub2RlLmF0dHIpCisKKyAgICBkZWYgdmlzaXRfQ2FsbChzZWxmLCBub2RlKToKKyAgICAgICAgd2FudF9jb21tYSA9IFtdCisgICAgICAgIGRlZiB3cml0ZV9jb21tYSgpOgorICAgICAgICAgICAgaWYgd2FudF9jb21tYToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdhbnRfY29tbWEuYXBwZW5kKFRydWUpCisKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmZ1bmMpCisgICAgICAgIHNlbGYud3JpdGUoJygnKQorICAgICAgICBmb3IgYXJnIGluIG5vZGUuYXJnczoKKyAgICAgICAgICAgIHdyaXRlX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYudmlzaXQoYXJnKQorICAgICAgICBmb3Iga2V5d29yZCBpbiBub2RlLmtleXdvcmRzOgorICAgICAgICAgICAgd3JpdGVfY29tbWEoKQorICAgICAgICAgICAgc2VsZi53cml0ZShrZXl3b3JkLmFyZyArICc9JykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoa2V5d29yZC52YWx1ZSkKKyAgICAgICAgaWYgbm9kZS5zdGFyYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdyaXRlX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyonKQorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnN0YXJhcmdzKQorICAgICAgICBpZiBub2RlLmt3YXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdyaXRlX2NvbW1hKCkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJyoqJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5rd2FyZ3MpCisgICAgICAgIHNlbGYud3JpdGUoJyknKQorCisgICAgZGVmIHZpc2l0X05hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUobm9kZS5pZCkKKworICAgIGRlZiB2aXNpdF9TdHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUocmVwcihub2RlLnMpKQorCisgICAgZGVmIHZpc2l0X0J5dGVzKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKHJlcHIobm9kZS5zKSkKKworICAgIGRlZiB2aXNpdF9OdW0oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUocmVwcihub2RlLm4pKQorCisgICAgZGVmIHZpc2l0X1R1cGxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCcoJykKKyAgICAgICAgaWR4ID0gLTEKKyAgICAgICAgZm9yIGlkeCwgaXRlbSBpbiBlbnVtZXJhdGUobm9kZS5lbHRzKToKKyAgICAgICAgICAgIGlmIGlkeDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGl0ZW0pCisgICAgICAgIHNlbGYud3JpdGUoaWR4IGFuZCAnKScgb3IgJywpJykKKworICAgIGRlZiBzZXF1ZW5jZV92aXNpdChsZWZ0LCByaWdodCk6CisgICAgICAgIGRlZiB2aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUobGVmdCkKKyAgICAgICAgICAgIGZvciBpZHgsIGl0ZW0gaW4gZW51bWVyYXRlKG5vZGUuZWx0cyk6CisgICAgICAgICAgICAgICAgaWYgaWR4OgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpdGVtKQorICAgICAgICAgICAgc2VsZi53cml0ZShyaWdodCkKKyAgICAgICAgcmV0dXJuIHZpc2l0CisKKyAgICB2aXNpdF9MaXN0ID0gc2VxdWVuY2VfdmlzaXQoJ1snLCAnXScpCisgICAgdmlzaXRfU2V0ID0gc2VxdWVuY2VfdmlzaXQoJ3snLCAnfScpCisgICAgZGVsIHNlcXVlbmNlX3Zpc2l0CisKKyAgICBkZWYgdmlzaXRfRGljdChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZSgneycpCisgICAgICAgIGZvciBpZHgsIChrZXksIHZhbHVlKSBpbiBlbnVtZXJhdGUoemlwKG5vZGUua2V5cywgbm9kZS52YWx1ZXMpKToKKyAgICAgICAgICAgIGlmIGlkeDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGtleSkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJzogJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQodmFsdWUpCisgICAgICAgIHNlbGYud3JpdGUoJ30nKQorCisgICAgZGVmIHZpc2l0X0Jpbk9wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUubGVmdCkKKyAgICAgICAgc2VsZi53cml0ZSgnICVzICcgJSBCSU5PUF9TWU1CT0xTW3R5cGUobm9kZS5vcCldKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUucmlnaHQpCisKKyAgICBkZWYgdmlzaXRfQm9vbE9wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCcoJykKKyAgICAgICAgZm9yIGlkeCwgdmFsdWUgaW4gZW51bWVyYXRlKG5vZGUudmFsdWVzKToKKyAgICAgICAgICAgIGlmIGlkeDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcgJXMgJyAlIEJPT0xPUF9TWU1CT0xTW3R5cGUobm9kZS5vcCldKQorICAgICAgICAgICAgc2VsZi52aXNpdCh2YWx1ZSkKKyAgICAgICAgc2VsZi53cml0ZSgnKScpCisKKyAgICBkZWYgdmlzaXRfQ29tcGFyZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZSgnKCcpCisgICAgICAgIHNlbGYud3JpdGUobm9kZS5sZWZ0KQorICAgICAgICBmb3Igb3AsIHJpZ2h0IGluIHppcChub2RlLm9wcywgbm9kZS5jb21wYXJhdG9ycyk6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgJXMgJSUnICUgQ01QT1BfU1lNQk9MU1t0eXBlKG9wKV0pCisgICAgICAgICAgICBzZWxmLnZpc2l0KHJpZ2h0KQorICAgICAgICBzZWxmLndyaXRlKCcpJykKKworICAgIGRlZiB2aXNpdF9VbmFyeU9wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCcoJykKKyAgICAgICAgb3AgPSBVTkFSWU9QX1NZTUJPTFNbdHlwZShub2RlLm9wKV0KKyAgICAgICAgc2VsZi53cml0ZShvcCkKKyAgICAgICAgaWYgb3AgPT0gJ25vdCc6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLm9wZXJhbmQpCisgICAgICAgIHNlbGYud3JpdGUoJyknKQorCisgICAgZGVmIHZpc2l0X1N1YnNjcmlwdChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnZhbHVlKQorICAgICAgICBzZWxmLndyaXRlKCdbJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnNsaWNlKQorICAgICAgICBzZWxmLndyaXRlKCddJykKKworICAgIGRlZiB2aXNpdF9TbGljZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZS5sb3dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5sb3dlcikKKyAgICAgICAgc2VsZi53cml0ZSgnOicpCisgICAgICAgIGlmIG5vZGUudXBwZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUudXBwZXIpCisgICAgICAgIGlmIG5vZGUuc3RlcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoJzonKQorICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKG5vZGUuc3RlcCwgTmFtZSkgYW5kIG5vZGUuc3RlcC5pZCA9PSAnTm9uZScpOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5zdGVwKQorCisgICAgZGVmIHZpc2l0X0V4dFNsaWNlKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgaWR4LCBpdGVtIGluIG5vZGUuZGltczoKKyAgICAgICAgICAgIGlmIGlkeDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCcsICcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGl0ZW0pCisKKyAgICBkZWYgdmlzaXRfWWllbGQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJ3lpZWxkICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKworICAgIGRlZiB2aXNpdF9MYW1iZGEoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJ2xhbWJkYSAnKQorICAgICAgICBzZWxmLnNpZ25hdHVyZShub2RlLmFyZ3MpCisgICAgICAgIHNlbGYud3JpdGUoJzogJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmJvZHkpCisKKyAgICBkZWYgdmlzaXRfRWxsaXBzaXMoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYud3JpdGUoJ0VsbGlwc2lzJykKKworICAgIGRlZiBnZW5lcmF0b3JfdmlzaXQobGVmdCwgcmlnaHQpOgorICAgICAgICBkZWYgdmlzaXQoc2VsZiwgbm9kZSk6CisgICAgICAgICAgICBzZWxmLndyaXRlKGxlZnQpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZWx0KQorICAgICAgICAgICAgZm9yIGNvbXByZWhlbnNpb24gaW4gbm9kZS5nZW5lcmF0b3JzOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoY29tcHJlaGVuc2lvbikKKyAgICAgICAgICAgIHNlbGYud3JpdGUocmlnaHQpCisgICAgICAgIHJldHVybiB2aXNpdAorCisgICAgdmlzaXRfTGlzdENvbXAgPSBnZW5lcmF0b3JfdmlzaXQoJ1snLCAnXScpCisgICAgdmlzaXRfR2VuZXJhdG9yRXhwID0gZ2VuZXJhdG9yX3Zpc2l0KCcoJywgJyknKQorICAgIHZpc2l0X1NldENvbXAgPSBnZW5lcmF0b3JfdmlzaXQoJ3snLCAnfScpCisgICAgZGVsIGdlbmVyYXRvcl92aXNpdAorCisgICAgZGVmIHZpc2l0X0RpY3RDb21wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCd7JykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmtleSkKKyAgICAgICAgc2VsZi53cml0ZSgnOiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisgICAgICAgIGZvciBjb21wcmVoZW5zaW9uIGluIG5vZGUuZ2VuZXJhdG9yczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoY29tcHJlaGVuc2lvbikKKyAgICAgICAgc2VsZi53cml0ZSgnfScpCisKKyAgICBkZWYgdmlzaXRfSWZFeHAoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ib2R5KQorICAgICAgICBzZWxmLndyaXRlKCcgaWYgJykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRlc3QpCisgICAgICAgIHNlbGYud3JpdGUoJyBlbHNlICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5vcmVsc2UpCisKKyAgICBkZWYgdmlzaXRfU3RhcnJlZChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZSgnKicpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKworICAgIGRlZiB2aXNpdF9SZXByKHNlbGYsIG5vZGUpOgorICAgICAgICAjIFhYWDogcHl0aG9uIDIuNiBvbmx5CisgICAgICAgIHNlbGYud3JpdGUoJ2AnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisgICAgICAgIHNlbGYud3JpdGUoJ2AnKQorCisgICAgIyBIZWxwZXIgTm9kZXMKKworICAgIGRlZiB2aXNpdF9hbGlhcyhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi53cml0ZShub2RlLm5hbWUpCisgICAgICAgIGlmIG5vZGUuYXNuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgnIGFzICcgKyBub2RlLmFzbmFtZSkKKworICAgIGRlZiB2aXNpdF9jb21wcmVoZW5zaW9uKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLndyaXRlKCcgZm9yICcpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS50YXJnZXQpCisgICAgICAgIHNlbGYud3JpdGUoJyBpbiAnKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuaXRlcikKKyAgICAgICAgaWYgbm9kZS5pZnM6CisgICAgICAgICAgICBmb3IgaWZfIGluIG5vZGUuaWZzOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJyBpZiAnKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoaWZfKQorCisgICAgZGVmIHZpc2l0X2V4Y2VwdGhhbmRsZXIoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmV3bGluZShub2RlKQorICAgICAgICBzZWxmLndyaXRlKCdleGNlcHQnKQorICAgICAgICBpZiBub2RlLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLndyaXRlKCcgJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS50eXBlKQorICAgICAgICAgICAgaWYgbm9kZS5uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoJyBhcyAnKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5uYW1lKQorICAgICAgICBzZWxmLndyaXRlKCc6JykKKyAgICAgICAgc2VsZi5ib2R5KG5vZGUuYm9keSkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3BseS9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL3BseS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNhOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvcGx5L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNCBAQAorIyBQTFkgcGFja2FnZQorIyBBdXRob3I6IERhdmlkIEJlYXpsZXkgKGRhdmVAZGFiZWF6LmNvbSkKKworX19hbGxfXyA9IFsnbGV4JywneWFjYyddCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9wbHkvbGV4LnB5IGIvYml0YmFrZS9saWIvcGx5L2xleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdlYzEwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvcGx5L2xleC5weQpAQCAtMCwwICsxLDEwNTggQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcGx5OiBsZXgucHkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDksCisjIERhdmlkIE0uIEJlYXpsZXkgKERhYmVheiBMTEMpCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoKKyMgCisjICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKKyMgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAorIyAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gIAorIyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIERhdmlkIEJlYXpsZXkgb3IgRGFiZWF6IExMQyBtYXkgYmUgdXNlZCB0bworIyAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisjICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK19fdmVyc2lvbl9fICAgID0gIjMuMyIKK19fdGFidmVyc2lvbl9fID0gIjMuMiIgICAgICAgIyBWZXJzaW9uIG9mIHRhYmxlIGZpbGUgdXNlZAorCitpbXBvcnQgcmUsIHN5cywgdHlwZXMsIGNvcHksIG9zCisKKyMgVGhpcyB0dXBsZSBjb250YWlucyBrbm93biBzdHJpbmcgdHlwZXMKK3RyeToKKyAgICAjIFB5dGhvbiAyLjYKKyAgICBTdHJpbmdUeXBlcyA9ICh0eXBlcy5TdHJpbmdUeXBlLCB0eXBlcy5Vbmljb2RlVHlwZSkKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAjIFB5dGhvbiAzLjAKKyAgICBTdHJpbmdUeXBlcyA9IChzdHIsIGJ5dGVzKQorCisjIEV4dHJhY3QgdGhlIGNvZGUgYXR0cmlidXRlIG9mIGEgZnVuY3Rpb24uIERpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMKKyMgYXJlIGZvciBQeXRob24gMi8zIGNvbXBhdGliaWxpdHkuCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgIGRlZiBmdW5jX2NvZGUoZik6CisgICAgICAgIHJldHVybiBmLmZ1bmNfY29kZQorZWxzZToKKyAgICBkZWYgZnVuY19jb2RlKGYpOgorICAgICAgICByZXR1cm4gZi5fX2NvZGVfXworCisjIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gbWF0Y2ggdmFsaWQgdG9rZW4gbmFtZXMKK19pc19pZGVudGlmaWVyID0gcmUuY29tcGlsZShyJ15bYS16QS1aMC05X10rJCcpCisKKyMgRXhjZXB0aW9uIHRocm93biB3aGVuIGludmFsaWQgdG9rZW4gZW5jb3VudGVyZWQgYW5kIG5vIGRlZmF1bHQgZXJyb3IKKyMgaGFuZGxlciBpcyBkZWZpbmVkLgorCitjbGFzcyBMZXhFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLG1lc3NhZ2Uscyk6CisgICAgICAgICBzZWxmLmFyZ3MgPSAobWVzc2FnZSwpCisgICAgICAgICBzZWxmLnRleHQgPSBzCisKKyMgVG9rZW4gY2xhc3MuICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB0b2tlbnMgcHJvZHVjZWQuCitjbGFzcyBMZXhUb2tlbihvYmplY3QpOgorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxleFRva2VuKCVzLCVyLCVkLCVkKSIgJSAoc2VsZi50eXBlLHNlbGYudmFsdWUsc2VsZi5saW5lbm8sc2VsZi5sZXhwb3MpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisKKyMgVGhpcyBvYmplY3QgaXMgYSBzdGFuZC1pbiBmb3IgYSBsb2dnaW5nIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSAKKyMgbG9nZ2luZyBtb2R1bGUuICAKKworY2xhc3MgUGx5TG9nZ2VyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsZik6CisgICAgICAgIHNlbGYuZiA9IGYKKyAgICBkZWYgY3JpdGljYWwoc2VsZixtc2csKmFyZ3MsKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmYud3JpdGUoKG1zZyAlIGFyZ3MpICsgIlxuIikKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsbXNnLCphcmdzLCoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5mLndyaXRlKCJXQVJOSU5HOiAiKyAobXNnICUgYXJncykgKyAiXG4iKQorCisgICAgZGVmIGVycm9yKHNlbGYsbXNnLCphcmdzLCoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5mLndyaXRlKCJFUlJPUjogIiArIChtc2cgJSBhcmdzKSArICJcbiIpCisKKyAgICBpbmZvID0gY3JpdGljYWwKKyAgICBkZWJ1ZyA9IGNyaXRpY2FsCisKKyMgTnVsbCBsb2dnZXIgaXMgdXNlZCB3aGVuIG5vIG91dHB1dCBpcyBnZW5lcmF0ZWQuIERvZXMgbm90aGluZy4KK2NsYXNzIE51bGxMb2dnZXIob2JqZWN0KToKKyAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCphcmdzLCoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgID09PSBMZXhpbmcgRW5naW5lID09PQorIworIyBUaGUgZm9sbG93aW5nIExleGVyIGNsYXNzIGltcGxlbWVudHMgdGhlIGxleGVyIHJ1bnRpbWUuICAgVGhlcmUgYXJlIG9ubHkKKyMgYSBmZXcgcHVibGljIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXM6CisjCisjICAgIGlucHV0KCkgICAgICAgICAgLSAgU3RvcmUgYSBuZXcgc3RyaW5nIGluIHRoZSBsZXhlcgorIyAgICB0b2tlbigpICAgICAgICAgIC0gIEdldCB0aGUgbmV4dCB0b2tlbgorIyAgICBjbG9uZSgpICAgICAgICAgIC0gIENsb25lIHRoZSBsZXhlcgorIworIyAgICBsaW5lbm8gICAgICAgICAgIC0gIEN1cnJlbnQgbGluZSBudW1iZXIKKyMgICAgbGV4cG9zICAgICAgICAgICAtICBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBpbnB1dCBzdHJpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTGV4ZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxleHJlID0gTm9uZSAgICAgICAgICAgICAjIE1hc3RlciByZWd1bGFyIGV4cHJlc3Npb24uIFRoaXMgaXMgYSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHVwbGVzIChyZSxmaW5kZXgpIHdoZXJlIHJlIGlzIGEgY29tcGlsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGZpbmRleCBpcyBhIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXBwaW5nIHJlZ2V4IGdyb3VwIG51bWJlcnMgdG8gcnVsZXMKKyAgICAgICAgc2VsZi5sZXhyZXRleHQgPSBOb25lICAgICAgICAgIyBDdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmdzCisgICAgICAgIHNlbGYubGV4c3RhdGVyZSA9IHt9ICAgICAgICAgICMgRGljdGlvbmFyeSBtYXBwaW5nIGxleGVyIHN0YXRlcyB0byBtYXN0ZXIgcmVnZXhzCisgICAgICAgIHNlbGYubGV4c3RhdGVyZXRleHQgPSB7fSAgICAgICMgRGljdGlvbmFyeSBtYXBwaW5nIGxleGVyIHN0YXRlcyB0byByZWdleCBzdHJpbmdzCisgICAgICAgIHNlbGYubGV4c3RhdGVyZW5hbWVzID0ge30gICAgICMgRGljdGlvbmFyeSBtYXBwaW5nIGxleGVyIHN0YXRlcyB0byBzeW1ib2wgbmFtZXMKKyAgICAgICAgc2VsZi5sZXhzdGF0ZSA9ICJJTklUSUFMIiAgICAgIyBDdXJyZW50IGxleGVyIHN0YXRlCisgICAgICAgIHNlbGYubGV4c3RhdGVzdGFjayA9IFtdICAgICAgICMgU3RhY2sgb2YgbGV4ZXIgc3RhdGVzCisgICAgICAgIHNlbGYubGV4c3RhdGVpbmZvID0gTm9uZSAgICAgICMgU3RhdGUgaW5mb3JtYXRpb24KKyAgICAgICAgc2VsZi5sZXhzdGF0ZWlnbm9yZSA9IHt9ICAgICAgIyBEaWN0aW9uYXJ5IG9mIGlnbm9yZWQgY2hhcmFjdGVycyBmb3IgZWFjaCBzdGF0ZQorICAgICAgICBzZWxmLmxleHN0YXRlZXJyb3JmID0ge30gICAgICAjIERpY3Rpb25hcnkgb2YgZXJyb3IgZnVuY3Rpb25zIGZvciBlYWNoIHN0YXRlCisgICAgICAgIHNlbGYubGV4cmVmbGFncyA9IDAgICAgICAgICAgICMgT3B0aW9uYWwgcmUgY29tcGlsZSBmbGFncworICAgICAgICBzZWxmLmxleGRhdGEgPSBOb25lICAgICAgICAgICAjIEFjdHVhbCBpbnB1dCBkYXRhIChhcyBhIHN0cmluZykKKyAgICAgICAgc2VsZi5sZXhwb3MgPSAwICAgICAgICAgICAgICAgIyBDdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IHRleHQKKyAgICAgICAgc2VsZi5sZXhsZW4gPSAwICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgdGhlIGlucHV0IHRleHQKKyAgICAgICAgc2VsZi5sZXhlcnJvcmYgPSBOb25lICAgICAgICAgIyBFcnJvciBydWxlIChpZiBhbnkpCisgICAgICAgIHNlbGYubGV4dG9rZW5zID0gTm9uZSAgICAgICAgICMgTGlzdCBvZiB2YWxpZCB0b2tlbnMKKyAgICAgICAgc2VsZi5sZXhpZ25vcmUgPSAiIiAgICAgICAgICAgIyBJZ25vcmVkIGNoYXJhY3RlcnMKKyAgICAgICAgc2VsZi5sZXhsaXRlcmFscyA9ICIiICAgICAgICAgIyBMaXRlcmFsIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2gKKyAgICAgICAgc2VsZi5sZXhtb2R1bGUgPSBOb25lICAgICAgICAgIyBNb2R1bGUKKyAgICAgICAgc2VsZi5saW5lbm8gPSAxICAgICAgICAgICAgICAgIyBDdXJyZW50IGxpbmUgbnVtYmVyCisgICAgICAgIHNlbGYubGV4b3B0aW1pemUgPSAwICAgICAgICAgICMgT3B0aW1pemVkIG1vZGUKKworICAgIGRlZiBjbG9uZShzZWxmLG9iamVjdD1Ob25lKToKKyAgICAgICAgYyA9IGNvcHkuY29weShzZWxmKQorCisgICAgICAgICMgSWYgdGhlIG9iamVjdCBwYXJhbWV0ZXIgaGFzIGJlZW4gc3VwcGxpZWQsIGl0IG1lYW5zIHdlIGFyZSBhdHRhY2hpbmcgdGhlCisgICAgICAgICMgbGV4ZXIgdG8gYSBuZXcgb2JqZWN0LiAgSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIHRvIHJlYmluZCBhbGwgbWV0aG9kcyBpbgorICAgICAgICAjIHRoZSBsZXhzdGF0ZXJlIGFuZCBsZXhzdGF0ZWVycm9yZiB0YWJsZXMuCisKKyAgICAgICAgaWYgb2JqZWN0OgorICAgICAgICAgICAgbmV3dGFiID0geyB9CisgICAgICAgICAgICBmb3Iga2V5LCByaXRlbSBpbiBzZWxmLmxleHN0YXRlcmUuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBuZXdyZSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGNyZSwgZmluZGV4IGluIHJpdGVtOgorICAgICAgICAgICAgICAgICAgICAgbmV3ZmluZGV4ID0gW10KKyAgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbmRleDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZiBvciBub3QgZlswXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZmluZGV4LmFwcGVuZChmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ZpbmRleC5hcHBlbmQoKGdldGF0dHIob2JqZWN0LGZbMF0uX19uYW1lX18pLGZbMV0pKQorICAgICAgICAgICAgICAgIG5ld3JlLmFwcGVuZCgoY3JlLG5ld2ZpbmRleCkpCisgICAgICAgICAgICAgICAgbmV3dGFiW2tleV0gPSBuZXdyZQorICAgICAgICAgICAgYy5sZXhzdGF0ZXJlID0gbmV3dGFiCisgICAgICAgICAgICBjLmxleHN0YXRlZXJyb3JmID0geyB9CisgICAgICAgICAgICBmb3Iga2V5LCBlZiBpbiBzZWxmLmxleHN0YXRlZXJyb3JmLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgYy5sZXhzdGF0ZWVycm9yZltrZXldID0gZ2V0YXR0cihvYmplY3QsZWYuX19uYW1lX18pCisgICAgICAgICAgICBjLmxleG1vZHVsZSA9IG9iamVjdAorICAgICAgICByZXR1cm4gYworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHdyaXRldGFiKCkgLSBXcml0ZSBsZXhlciBpbmZvcm1hdGlvbiB0byBhIHRhYmxlIGZpbGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiB3cml0ZXRhYihzZWxmLHRhYmZpbGUsb3V0cHV0ZGlyPSIiKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0YWJmaWxlLHR5cGVzLk1vZHVsZVR5cGUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGJhc2V0YWJmaWxlbmFtZSA9IHRhYmZpbGUuc3BsaXQoIi4iKVstMV0KKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLGJhc2V0YWJmaWxlbmFtZSkrIi5weSIKKyAgICAgICAgdGYgPSBvcGVuKGZpbGVuYW1lLCJ3IikKKyAgICAgICAgdGYud3JpdGUoIiMgJXMucHkuIFRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgUExZICh2ZXJzaW9uICVzKS4gRG9uJ3QgZWRpdCFcbiIgJSAodGFiZmlsZSxfX3ZlcnNpb25fXykpCisgICAgICAgIHRmLndyaXRlKCJfdGFidmVyc2lvbiAgID0gJXNcbiIgJSByZXByKF9fdmVyc2lvbl9fKSkKKyAgICAgICAgdGYud3JpdGUoIl9sZXh0b2tlbnMgICAgPSAlc1xuIiAlIHJlcHIoc2VsZi5sZXh0b2tlbnMpKQorICAgICAgICB0Zi53cml0ZSgiX2xleHJlZmxhZ3MgICA9ICVzXG4iICUgcmVwcihzZWxmLmxleHJlZmxhZ3MpKQorICAgICAgICB0Zi53cml0ZSgiX2xleGxpdGVyYWxzICA9ICVzXG4iICUgcmVwcihzZWxmLmxleGxpdGVyYWxzKSkKKyAgICAgICAgdGYud3JpdGUoIl9sZXhzdGF0ZWluZm8gPSAlc1xuIiAlIHJlcHIoc2VsZi5sZXhzdGF0ZWluZm8pKQorCisgICAgICAgIHRhYnJlID0geyB9CisgICAgICAgICMgQ29sbGVjdCBhbGwgZnVuY3Rpb25zIGluIHRoZSBpbml0aWFsIHN0YXRlCisgICAgICAgIGluaXRpYWwgPSBzZWxmLmxleHN0YXRlcmVbIklOSVRJQUwiXQorICAgICAgICBpbml0aWFsZnVuY3MgPSBbXQorICAgICAgICBmb3IgcGFydCBpbiBpbml0aWFsOgorICAgICAgICAgICAgZm9yIGYgaW4gcGFydFsxXToKKyAgICAgICAgICAgICAgICBpZiBmIGFuZCBmWzBdOgorICAgICAgICAgICAgICAgICAgICBpbml0aWFsZnVuY3MuYXBwZW5kKGYpCisKKyAgICAgICAgZm9yIGtleSwgbHJlIGluIHNlbGYubGV4c3RhdGVyZS5pdGVtcygpOgorICAgICAgICAgICAgIHRpdGVtID0gW10KKyAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obHJlKSk6CisgICAgICAgICAgICAgICAgICB0aXRlbS5hcHBlbmQoKHNlbGYubGV4c3RhdGVyZXRleHRba2V5XVtpXSxfZnVuY3NfdG9fbmFtZXMobHJlW2ldWzFdLHNlbGYubGV4c3RhdGVyZW5hbWVzW2tleV1baV0pKSkKKyAgICAgICAgICAgICB0YWJyZVtrZXldID0gdGl0ZW0KKworICAgICAgICB0Zi53cml0ZSgiX2xleHN0YXRlcmUgICA9ICVzXG4iICUgcmVwcih0YWJyZSkpCisgICAgICAgIHRmLndyaXRlKCJfbGV4c3RhdGVpZ25vcmUgPSAlc1xuIiAlIHJlcHIoc2VsZi5sZXhzdGF0ZWlnbm9yZSkpCisKKyAgICAgICAgdGFiZXJyID0geyB9CisgICAgICAgIGZvciBrZXksIGVmIGluIHNlbGYubGV4c3RhdGVlcnJvcmYuaXRlbXMoKToKKyAgICAgICAgICAgICBpZiBlZjoKKyAgICAgICAgICAgICAgICAgIHRhYmVycltrZXldID0gZWYuX19uYW1lX18KKyAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgdGFiZXJyW2tleV0gPSBOb25lCisgICAgICAgIHRmLndyaXRlKCJfbGV4c3RhdGVlcnJvcmYgPSAlc1xuIiAlIHJlcHIodGFiZXJyKSkKKyAgICAgICAgdGYuY2xvc2UoKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHJlYWR0YWIoKSAtIFJlYWQgbGV4ZXIgaW5mb3JtYXRpb24gZnJvbSBhIHRhYiBmaWxlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgcmVhZHRhYihzZWxmLHRhYmZpbGUsZmRpY3QpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRhYmZpbGUsdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICBsZXh0YWIgPSB0YWJmaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgICAgICBleGVjKCJpbXBvcnQgJXMgYXMgbGV4dGFiIiAlIHRhYmZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVudiA9IHsgfQorICAgICAgICAgICAgICAgIGV4ZWMoImltcG9ydCAlcyBhcyBsZXh0YWIiICUgdGFiZmlsZSwgZW52LGVudikKKyAgICAgICAgICAgICAgICBsZXh0YWIgPSBlbnZbJ2xleHRhYiddCisKKyAgICAgICAgaWYgZ2V0YXR0cihsZXh0YWIsIl90YWJ2ZXJzaW9uIiwiMC4wIikgIT0gX192ZXJzaW9uX186CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiSW5jb25zaXN0ZW50IFBMWSB2ZXJzaW9uIikKKworICAgICAgICBzZWxmLmxleHRva2VucyAgICAgID0gbGV4dGFiLl9sZXh0b2tlbnMKKyAgICAgICAgc2VsZi5sZXhyZWZsYWdzICAgICA9IGxleHRhYi5fbGV4cmVmbGFncworICAgICAgICBzZWxmLmxleGxpdGVyYWxzICAgID0gbGV4dGFiLl9sZXhsaXRlcmFscworICAgICAgICBzZWxmLmxleHN0YXRlaW5mbyAgID0gbGV4dGFiLl9sZXhzdGF0ZWluZm8KKyAgICAgICAgc2VsZi5sZXhzdGF0ZWlnbm9yZSA9IGxleHRhYi5fbGV4c3RhdGVpZ25vcmUKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXJlICAgICA9IHsgfQorICAgICAgICBzZWxmLmxleHN0YXRlcmV0ZXh0ID0geyB9CisgICAgICAgIGZvciBrZXksbHJlIGluIGxleHRhYi5fbGV4c3RhdGVyZS5pdGVtcygpOgorICAgICAgICAgICAgIHRpdGVtID0gW10KKyAgICAgICAgICAgICB0eHRpdGVtID0gW10KKyAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obHJlKSk6CisgICAgICAgICAgICAgICAgICB0aXRlbS5hcHBlbmQoKHJlLmNvbXBpbGUobHJlW2ldWzBdLGxleHRhYi5fbGV4cmVmbGFncyB8IHJlLlZFUkJPU0UpLF9uYW1lc190b19mdW5jcyhscmVbaV1bMV0sZmRpY3QpKSkKKyAgICAgICAgICAgICAgICAgIHR4dGl0ZW0uYXBwZW5kKGxyZVtpXVswXSkKKyAgICAgICAgICAgICBzZWxmLmxleHN0YXRlcmVba2V5XSA9IHRpdGVtCisgICAgICAgICAgICAgc2VsZi5sZXhzdGF0ZXJldGV4dFtrZXldID0gdHh0aXRlbQorICAgICAgICBzZWxmLmxleHN0YXRlZXJyb3JmID0geyB9CisgICAgICAgIGZvciBrZXksZWYgaW4gbGV4dGFiLl9sZXhzdGF0ZWVycm9yZi5pdGVtcygpOgorICAgICAgICAgICAgIHNlbGYubGV4c3RhdGVlcnJvcmZba2V5XSA9IGZkaWN0W2VmXQorICAgICAgICBzZWxmLmJlZ2luKCdJTklUSUFMJykKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBpbnB1dCgpIC0gUHVzaCBhIG5ldyBzdHJpbmcgaW50byB0aGUgbGV4ZXIKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBpbnB1dChzZWxmLHMpOgorICAgICAgICAjIFB1bGwgb2ZmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gc2VlIGlmIHMgbG9va3MgbGlrZSBhIHN0cmluZworICAgICAgICBjID0gc1s6MV0KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYyxTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFeHBlY3RlZCBhIHN0cmluZyIpCisgICAgICAgIHNlbGYubGV4ZGF0YSA9IHMKKyAgICAgICAgc2VsZi5sZXhwb3MgPSAwCisgICAgICAgIHNlbGYubGV4bGVuID0gbGVuKHMpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYmVnaW4oKSAtIENoYW5nZXMgdGhlIGxleGluZyBzdGF0ZQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIGJlZ2luKHNlbGYsc3RhdGUpOgorICAgICAgICBpZiBub3Qgc3RhdGUgaW4gc2VsZi5sZXhzdGF0ZXJlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5kZWZpbmVkIHN0YXRlIikKKyAgICAgICAgc2VsZi5sZXhyZSA9IHNlbGYubGV4c3RhdGVyZVtzdGF0ZV0KKyAgICAgICAgc2VsZi5sZXhyZXRleHQgPSBzZWxmLmxleHN0YXRlcmV0ZXh0W3N0YXRlXQorICAgICAgICBzZWxmLmxleGlnbm9yZSA9IHNlbGYubGV4c3RhdGVpZ25vcmUuZ2V0KHN0YXRlLCIiKQorICAgICAgICBzZWxmLmxleGVycm9yZiA9IHNlbGYubGV4c3RhdGVlcnJvcmYuZ2V0KHN0YXRlLE5vbmUpCisgICAgICAgIHNlbGYubGV4c3RhdGUgPSBzdGF0ZQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHB1c2hfc3RhdGUoKSAtIENoYW5nZXMgdGhlIGxleGluZyBzdGF0ZSBhbmQgc2F2ZXMgb2xkIG9uIHN0YWNrCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgcHVzaF9zdGF0ZShzZWxmLHN0YXRlKToKKyAgICAgICAgc2VsZi5sZXhzdGF0ZXN0YWNrLmFwcGVuZChzZWxmLmxleHN0YXRlKQorICAgICAgICBzZWxmLmJlZ2luKHN0YXRlKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHBvcF9zdGF0ZSgpIC0gUmVzdG9yZXMgdGhlIHByZXZpb3VzIHN0YXRlCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgcG9wX3N0YXRlKHNlbGYpOgorICAgICAgICBzZWxmLmJlZ2luKHNlbGYubGV4c3RhdGVzdGFjay5wb3AoKSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjdXJyZW50X3N0YXRlKCkgLSBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGluZyBzdGF0ZQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIGN1cnJlbnRfc3RhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxleHN0YXRlCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgc2tpcCgpIC0gU2tpcCBhaGVhZCBuIGNoYXJhY3RlcnMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBza2lwKHNlbGYsbik6CisgICAgICAgIHNlbGYubGV4cG9zICs9IG4KKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBvcHR0b2tlbigpIC0gUmV0dXJuIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIExleGVyCisgICAgIworICAgICMgTm90ZTogVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYXJlZnVsbHkgaW1wbGVtZW50ZWQgdG8gYmUgYXMgZmFzdAorICAgICMgYXMgcG9zc2libGUuICBEb24ndCBtYWtlIGNoYW5nZXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0CisgICAgIyB5b3UgYXJlIGRvaW5nCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgdG9rZW4oc2VsZik6CisgICAgICAgICMgTWFrZSBsb2NhbCBjb3BpZXMgb2YgZnJlcXVlbnRseSByZWZlcmVuY2VkIGF0dHJpYnV0ZXMKKyAgICAgICAgbGV4cG9zICAgID0gc2VsZi5sZXhwb3MKKyAgICAgICAgbGV4bGVuICAgID0gc2VsZi5sZXhsZW4KKyAgICAgICAgbGV4aWdub3JlID0gc2VsZi5sZXhpZ25vcmUKKyAgICAgICAgbGV4ZGF0YSAgID0gc2VsZi5sZXhkYXRhCisKKyAgICAgICAgd2hpbGUgbGV4cG9zIDwgbGV4bGVuOgorICAgICAgICAgICAgIyBUaGlzIGNvZGUgcHJvdmlkZXMgc29tZSBzaG9ydC1jaXJjdWl0IGNvZGUgZm9yIHdoaXRlc3BhY2UsIHRhYnMsIGFuZCBvdGhlciBpZ25vcmVkIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIGlmIGxleGRhdGFbbGV4cG9zXSBpbiBsZXhpZ25vcmU6CisgICAgICAgICAgICAgICAgbGV4cG9zICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIExvb2sgZm9yIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoCisgICAgICAgICAgICBmb3IgbGV4cmUsbGV4aW5kZXhmdW5jIGluIHNlbGYubGV4cmU6CisgICAgICAgICAgICAgICAgbSA9IGxleHJlLm1hdGNoKGxleGRhdGEsbGV4cG9zKQorICAgICAgICAgICAgICAgIGlmIG5vdCBtOiBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSB0b2tlbiBmb3IgcmV0dXJuCisgICAgICAgICAgICAgICAgdG9rID0gTGV4VG9rZW4oKQorICAgICAgICAgICAgICAgIHRvay52YWx1ZSA9IG0uZ3JvdXAoKQorICAgICAgICAgICAgICAgIHRvay5saW5lbm8gPSBzZWxmLmxpbmVubworICAgICAgICAgICAgICAgIHRvay5sZXhwb3MgPSBsZXhwb3MKKworICAgICAgICAgICAgICAgIGkgPSBtLmxhc3RpbmRleAorICAgICAgICAgICAgICAgIGZ1bmMsdG9rLnR5cGUgPSBsZXhpbmRleGZ1bmNbaV0KKworICAgICAgICAgICAgICAgIGlmIG5vdCBmdW5jOgorICAgICAgICAgICAgICAgICAgICMgSWYgbm8gdG9rZW4gdHlwZSB3YXMgc2V0LCBpdCdzIGFuIGlnbm9yZWQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICBpZiB0b2sudHlwZToKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxleHBvcyA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rCisgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICBsZXhwb3MgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIGxleHBvcyA9IG0uZW5kKCkKKworICAgICAgICAgICAgICAgICMgSWYgdG9rZW4gaXMgcHJvY2Vzc2VkIGJ5IGEgZnVuY3Rpb24sIGNhbGwgaXQKKworICAgICAgICAgICAgICAgIHRvay5sZXhlciA9IHNlbGYgICAgICAjIFNldCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdXNlZnVsIGluIHRva2VuIHJ1bGVzCisgICAgICAgICAgICAgICAgc2VsZi5sZXhtYXRjaCA9IG0KKyAgICAgICAgICAgICAgICBzZWxmLmxleHBvcyA9IGxleHBvcworCisgICAgICAgICAgICAgICAgbmV3dG9rID0gZnVuYyh0b2spCisKKyAgICAgICAgICAgICAgICAjIEV2ZXJ5IGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdG9rZW4sIGlmIG5vdGhpbmcsIHdlIGp1c3QgbW92ZSB0byBuZXh0IHRva2VuCisgICAgICAgICAgICAgICAgaWYgbm90IG5ld3RvazoKKyAgICAgICAgICAgICAgICAgICAgbGV4cG9zICAgID0gc2VsZi5sZXhwb3MgICAgICAgICAjIFRoaXMgaXMgaGVyZSBpbiBjYXNlIHVzZXIgaGFzIHVwZGF0ZWQgbGV4cG9zLgorICAgICAgICAgICAgICAgICAgICBsZXhpZ25vcmUgPSBzZWxmLmxleGlnbm9yZSAgICAgICMgVGhpcyBpcyBoZXJlIGluIGNhc2UgdGhlcmUgd2FzIGEgc3RhdGUgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAjIFZlcmlmeSB0eXBlIG9mIHRoZSB0b2tlbi4gIElmIG5vdCBpbiB0aGUgdG9rZW4gbWFwLCByYWlzZSBhbiBlcnJvcgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmxleG9wdGltaXplOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmV3dG9rLnR5cGUgaW4gc2VsZi5sZXh0b2tlbnM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMZXhFcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyByZXR1cm5lZCBhbiB1bmtub3duIHRva2VuIHR5cGUgJyVzJyIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19jb2RlKGZ1bmMpLmNvX2ZpbGVuYW1lLCBmdW5jX2NvZGUoZnVuYykuY29fZmlyc3RsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYy5fX25hbWVfXywgbmV3dG9rLnR5cGUpLGxleGRhdGFbbGV4cG9zOl0pCisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3dG9rCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm8gbWF0Y2gsIHNlZSBpZiBpbiBsaXRlcmFscworICAgICAgICAgICAgICAgIGlmIGxleGRhdGFbbGV4cG9zXSBpbiBzZWxmLmxleGxpdGVyYWxzOgorICAgICAgICAgICAgICAgICAgICB0b2sgPSBMZXhUb2tlbigpCisgICAgICAgICAgICAgICAgICAgIHRvay52YWx1ZSA9IGxleGRhdGFbbGV4cG9zXQorICAgICAgICAgICAgICAgICAgICB0b2subGluZW5vID0gc2VsZi5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgdG9rLnR5cGUgPSB0b2sudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgdG9rLmxleHBvcyA9IGxleHBvcworICAgICAgICAgICAgICAgICAgICBzZWxmLmxleHBvcyA9IGxleHBvcyArIDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvaworCisgICAgICAgICAgICAgICAgIyBObyBtYXRjaC4gQ2FsbCB0X2Vycm9yKCkgaWYgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxleGVycm9yZjoKKyAgICAgICAgICAgICAgICAgICAgdG9rID0gTGV4VG9rZW4oKQorICAgICAgICAgICAgICAgICAgICB0b2sudmFsdWUgPSBzZWxmLmxleGRhdGFbbGV4cG9zOl0KKyAgICAgICAgICAgICAgICAgICAgdG9rLmxpbmVubyA9IHNlbGYubGluZW5vCisgICAgICAgICAgICAgICAgICAgIHRvay50eXBlID0gImVycm9yIgorICAgICAgICAgICAgICAgICAgICB0b2subGV4ZXIgPSBzZWxmCisgICAgICAgICAgICAgICAgICAgIHRvay5sZXhwb3MgPSBsZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sZXhwb3MgPSBsZXhwb3MKKyAgICAgICAgICAgICAgICAgICAgbmV3dG9rID0gc2VsZi5sZXhlcnJvcmYodG9rKQorICAgICAgICAgICAgICAgICAgICBpZiBsZXhwb3MgPT0gc2VsZi5sZXhwb3M6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEVycm9yIG1ldGhvZCBkaWRuJ3QgY2hhbmdlIHRleHQgcG9zaXRpb24gYXQgYWxsLiBUaGlzIGlzIGFuIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGV4RXJyb3IoIlNjYW5uaW5nIGVycm9yLiBJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIiAlIChsZXhkYXRhW2xleHBvc10pLCBsZXhkYXRhW2xleHBvczpdKQorICAgICAgICAgICAgICAgICAgICBsZXhwb3MgPSBzZWxmLmxleHBvcworICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmV3dG9rOiBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3dG9rCisKKyAgICAgICAgICAgICAgICBzZWxmLmxleHBvcyA9IGxleHBvcworICAgICAgICAgICAgICAgIHJhaXNlIExleEVycm9yKCJJbGxlZ2FsIGNoYXJhY3RlciAnJXMnIGF0IGluZGV4ICVkIiAlIChsZXhkYXRhW2xleHBvc10sbGV4cG9zKSwgbGV4ZGF0YVtsZXhwb3M6XSkKKworICAgICAgICBzZWxmLmxleHBvcyA9IGxleHBvcyArIDEKKyAgICAgICAgaWYgc2VsZi5sZXhkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJObyBpbnB1dCBzdHJpbmcgZ2l2ZW4gd2l0aCBpbnB1dCgpIikKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgSXRlcmF0b3IgaW50ZXJmYWNlCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnRva2VuKCkKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gdAorCisgICAgX19uZXh0X18gPSBuZXh0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT09IExleCBCdWlsZGVyID09PQorIworIyBUaGUgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGJlbG93IGFyZSB1c2VkIHRvIGNvbGxlY3QgbGV4aW5nIGluZm9ybWF0aW9uCisjIGFuZCBidWlsZCBhIExleGVyIG9iamVjdCBmcm9tIGl0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGdldF9jYWxsZXJfbW9kdWxlX2RpY3QoKQorIworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgd2l0aGluCisjIGEgY2FsbGVyIGZ1cnRoZXIgZG93biB0aGUgY2FsbCBzdGFjay4gIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGVudmlyb25tZW50CisjIGFzc29jaWF0ZWQgd2l0aCB0aGUgeWFjYygpIGNhbGwgaWYgbm9uZSB3YXMgcHJvdmlkZWQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBnZXRfY2FsbGVyX21vZHVsZV9kaWN0KGxldmVscyk6CisgICAgdHJ5OgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICBlLGIsdCA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIGYgPSB0LnRiX2ZyYW1lCisgICAgICAgIHdoaWxlIGxldmVscyA+IDA6CisgICAgICAgICAgICBmID0gZi5mX2JhY2sgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBsZXZlbHMgLT0gMQorICAgICAgICBsZGljdCA9IGYuZl9nbG9iYWxzLmNvcHkoKQorICAgICAgICBpZiBmLmZfZ2xvYmFscyAhPSBmLmZfbG9jYWxzOgorICAgICAgICAgICAgbGRpY3QudXBkYXRlKGYuZl9sb2NhbHMpCisKKyAgICAgICAgcmV0dXJuIGxkaWN0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX2Z1bmNzX3RvX25hbWVzKCkKKyMKKyMgR2l2ZW4gYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBmdW5jdGlvbnMsIHRoaXMgY29udmVydHMgaXQgdG8gYSBsaXN0CisjIHN1aXRhYmxlIGZvciBvdXRwdXQgdG8gYSB0YWJsZSBmaWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBfZnVuY3NfdG9fbmFtZXMoZnVuY2xpc3QsbmFtZWxpc3QpOgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGYsbmFtZSBpbiB6aXAoZnVuY2xpc3QsbmFtZWxpc3QpOgorICAgICAgICAgaWYgZiBhbmQgZlswXToKKyAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChuYW1lLCBmWzFdKSkKKyAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmKQorICAgIHJldHVybiByZXN1bHQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfbmFtZXNfdG9fZnVuY3MoKQorIworIyBHaXZlbiBhIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIGZ1bmN0aW9uIG5hbWVzLCB0aGlzIGNvbnZlcnRzIGl0IGJhY2sgdG8KKyMgZnVuY3Rpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgX25hbWVzX3RvX2Z1bmNzKG5hbWVsaXN0LGZkaWN0KToKKyAgICAgcmVzdWx0ID0gW10KKyAgICAgZm9yIG4gaW4gbmFtZWxpc3Q6CisgICAgICAgICAgaWYgbiBhbmQgblswXToKKyAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoZmRpY3RbblswXV0sblsxXSkpCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChuKQorICAgICByZXR1cm4gcmVzdWx0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX2Zvcm1fbWFzdGVyX3JlKCkKKyMKKyMgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSByZWdleCBjb21wb25lbnRzIGFuZCBhdHRlbXB0cyB0bworIyBmb3JtIHRoZSBtYXN0ZXIgcmVndWxhciBleHByZXNzaW9uLiAgR2l2ZW4gbGltaXRhdGlvbnMgaW4gdGhlIFB5dGhvbiByZQorIyBtb2R1bGUsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gYnJlYWsgdGhlIG1hc3RlciByZWdleCBpbnRvIHNlcGFyYXRlIGV4cHJlc3Npb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgX2Zvcm1fbWFzdGVyX3JlKHJlbGlzdCxyZWZsYWdzLGxkaWN0LHRva25hbWVzKToKKyAgICBpZiBub3QgcmVsaXN0OiByZXR1cm4gW10KKyAgICByZWdleCA9ICJ8Ii5qb2luKHJlbGlzdCkKKyAgICB0cnk6CisgICAgICAgIGxleHJlID0gcmUuY29tcGlsZShyZWdleCxyZS5WRVJCT1NFIHwgcmVmbGFncykKKworICAgICAgICAjIEJ1aWxkIHRoZSBpbmRleCB0byBmdW5jdGlvbiBtYXAgZm9yIHRoZSBtYXRjaGluZyBlbmdpbmUKKyAgICAgICAgbGV4aW5kZXhmdW5jID0gWyBOb25lIF0gKiAobWF4KGxleHJlLmdyb3VwaW5kZXgudmFsdWVzKCkpKzEpCisgICAgICAgIGxleGluZGV4bmFtZXMgPSBsZXhpbmRleGZ1bmNbOl0KKworICAgICAgICBmb3IgZixpIGluIGxleHJlLmdyb3VwaW5kZXguaXRlbXMoKToKKyAgICAgICAgICAgIGhhbmRsZSA9IGxkaWN0LmdldChmLE5vbmUpCisgICAgICAgICAgICBpZiB0eXBlKGhhbmRsZSkgaW4gKHR5cGVzLkZ1bmN0aW9uVHlwZSwgdHlwZXMuTWV0aG9kVHlwZSk6CisgICAgICAgICAgICAgICAgbGV4aW5kZXhmdW5jW2ldID0gKGhhbmRsZSx0b2tuYW1lc1tmXSkKKyAgICAgICAgICAgICAgICBsZXhpbmRleG5hbWVzW2ldID0gZgorICAgICAgICAgICAgZWxpZiBoYW5kbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbGV4aW5kZXhuYW1lc1tpXSA9IGYKKyAgICAgICAgICAgICAgICBpZiBmLmZpbmQoImlnbm9yZV8iKSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxleGluZGV4ZnVuY1tpXSA9IChOb25lLE5vbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGV4aW5kZXhmdW5jW2ldID0gKE5vbmUsIHRva25hbWVzW2ZdKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIFsobGV4cmUsbGV4aW5kZXhmdW5jKV0sW3JlZ2V4XSxbbGV4aW5kZXhuYW1lc10KKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBtID0gaW50KGxlbihyZWxpc3QpLzIpCisgICAgICAgIGlmIG0gPT0gMDogbSA9IDEKKyAgICAgICAgbGxpc3QsIGxyZSwgbG5hbWVzID0gX2Zvcm1fbWFzdGVyX3JlKHJlbGlzdFs6bV0scmVmbGFncyxsZGljdCx0b2tuYW1lcykKKyAgICAgICAgcmxpc3QsIHJyZSwgcm5hbWVzID0gX2Zvcm1fbWFzdGVyX3JlKHJlbGlzdFttOl0scmVmbGFncyxsZGljdCx0b2tuYW1lcykKKyAgICAgICAgcmV0dXJuIGxsaXN0K3JsaXN0LCBscmUrcnJlLCBsbmFtZXMrcm5hbWVzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZGVmIF9zdGF0ZXRva2VuKHMsbmFtZXMpCisjCisjIEdpdmVuIGEgZGVjbGFyYXRpb24gbmFtZSBzIG9mIHRoZSBmb3JtICJ0XyIgYW5kIGEgZGljdGlvbmFyeSB3aG9zZSBrZXlzIGFyZQorIyBzdGF0ZSBuYW1lcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdHVwbGUgKHN0YXRlcyx0b2tlbm5hbWUpIHdoZXJlIHN0YXRlcworIyBpcyBhIHR1cGxlIG9mIHN0YXRlIG5hbWVzIGFuZCB0b2tlbm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHRva2VuLiAgRm9yIGV4YW1wbGUsCisjIGNhbGxpbmcgdGhpcyB3aXRoIHMgPSAidF9mb29fYmFyX1NQQU0iIG1pZ2h0IHJldHVybiAoKCdmb28nLCdiYXInKSwnU1BBTScpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBfc3RhdGV0b2tlbihzLG5hbWVzKToKKyAgICBub25zdGF0ZSA9IDEKKyAgICBwYXJ0cyA9IHMuc3BsaXQoIl8iKQorICAgIGZvciBpIGluIHJhbmdlKDEsbGVuKHBhcnRzKSk6CisgICAgICAgICBpZiBub3QgcGFydHNbaV0gaW4gbmFtZXMgYW5kIHBhcnRzW2ldICE9ICdBTlknOiBicmVhaworICAgIGlmIGkgPiAxOgorICAgICAgIHN0YXRlcyA9IHR1cGxlKHBhcnRzWzE6aV0pCisgICAgZWxzZToKKyAgICAgICBzdGF0ZXMgPSAoJ0lOSVRJQUwnLCkKKworICAgIGlmICdBTlknIGluIHN0YXRlczoKKyAgICAgICBzdGF0ZXMgPSB0dXBsZShuYW1lcykKKworICAgIHRva2VubmFtZSA9ICJfIi5qb2luKHBhcnRzW2k6XSkKKyAgICByZXR1cm4gKHN0YXRlcyx0b2tlbm5hbWUpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMZXhlclJlZmxlY3QoKQorIworIyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGJ1aWxkIGEgbGV4ZXIgYXMgZXh0cmFjdGVkIGZyb20gYQorIyB1c2VyJ3MgaW5wdXQgZmlsZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIExleGVyUmVmbGVjdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLGxkaWN0LGxvZz1Ob25lLHJlZmxhZ3M9MCk6CisgICAgICAgIHNlbGYubGRpY3QgICAgICA9IGxkaWN0CisgICAgICAgIHNlbGYuZXJyb3JfZnVuYyA9IE5vbmUKKyAgICAgICAgc2VsZi50b2tlbnMgICAgID0gW10KKyAgICAgICAgc2VsZi5yZWZsYWdzICAgID0gcmVmbGFncworICAgICAgICBzZWxmLnN0YXRlaW5mbyAgPSB7ICdJTklUSUFMJyA6ICdpbmNsdXNpdmUnfQorICAgICAgICBzZWxmLmZpbGVzICAgICAgPSB7fQorICAgICAgICBzZWxmLmVycm9yICAgICAgPSAwCisKKyAgICAgICAgaWYgbG9nIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2cgPSBsb2cKKworICAgICMgR2V0IGFsbCBvZiB0aGUgYmFzaWMgaW5mb3JtYXRpb24KKyAgICBkZWYgZ2V0X2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfdG9rZW5zKCkKKyAgICAgICAgc2VsZi5nZXRfbGl0ZXJhbHMoKQorICAgICAgICBzZWxmLmdldF9zdGF0ZXMoKQorICAgICAgICBzZWxmLmdldF9ydWxlcygpCisgICAgICAgIAorICAgICMgVmFsaWRhdGUgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbgorICAgIGRlZiB2YWxpZGF0ZV9hbGwoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGVfdG9rZW5zKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9saXRlcmFscygpCisgICAgICAgIHNlbGYudmFsaWRhdGVfcnVsZXMoKQorICAgICAgICByZXR1cm4gc2VsZi5lcnJvcgorCisgICAgIyBHZXQgdGhlIHRva2VucyBtYXAKKyAgICBkZWYgZ2V0X3Rva2VucyhzZWxmKToKKyAgICAgICAgdG9rZW5zID0gc2VsZi5sZGljdC5nZXQoInRva2VucyIsTm9uZSkKKyAgICAgICAgaWYgbm90IHRva2VuczoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJObyB0b2tlbiBsaXN0IGlzIGRlZmluZWQiKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRva2VucywobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJ0b2tlbnMgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUiKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAKKyAgICAgICAgaWYgbm90IHRva2VuczoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJ0b2tlbnMgaXMgZW1wdHkiKQorICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYudG9rZW5zID0gdG9rZW5zCisKKyAgICAjIFZhbGlkYXRlIHRoZSB0b2tlbnMKKyAgICBkZWYgdmFsaWRhdGVfdG9rZW5zKHNlbGYpOgorICAgICAgICB0ZXJtaW5hbHMgPSB7fQorICAgICAgICBmb3IgbiBpbiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIGlmIG5vdCBfaXNfaWRlbnRpZmllci5tYXRjaChuKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiQmFkIHRva2VuIG5hbWUgJyVzJyIsbikKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgaWYgbiBpbiB0ZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygiVG9rZW4gJyVzJyBtdWx0aXBseSBkZWZpbmVkIiwgbikKKyAgICAgICAgICAgIHRlcm1pbmFsc1tuXSA9IDEKKworICAgICMgR2V0IHRoZSBsaXRlcmFscyBzcGVjaWZpZXIKKyAgICBkZWYgZ2V0X2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzZWxmLmxpdGVyYWxzID0gc2VsZi5sZGljdC5nZXQoImxpdGVyYWxzIiwiIikKKworICAgICMgVmFsaWRhdGUgbGl0ZXJhbHMKKyAgICBkZWYgdmFsaWRhdGVfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBjIGluIHNlbGYubGl0ZXJhbHM6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYyxTdHJpbmdUeXBlcykgb3IgbGVuKGMpID4gMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIkludmFsaWQgbGl0ZXJhbCAlcy4gTXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiLCByZXByKGMpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiSW52YWxpZCBsaXRlcmFscyBzcGVjaWZpY2F0aW9uLiBsaXRlcmFscyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorCisgICAgZGVmIGdldF9zdGF0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuc3RhdGVzID0gc2VsZi5sZGljdC5nZXQoInN0YXRlcyIsTm9uZSkKKyAgICAgICAgIyBCdWlsZCBzdGF0ZW1hcAorICAgICAgICBpZiBzZWxmLnN0YXRlczoKKyAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnN0YXRlcywodHVwbGUsbGlzdCkpOgorICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInN0YXRlcyBtdXN0IGJlIGRlZmluZWQgYXMgYSB0dXBsZSBvciBsaXN0IikKKyAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgIGZvciBzIGluIHNlbGYuc3RhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uocyx0dXBsZSkgb3IgbGVuKHMpICE9IDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIkludmFsaWQgc3RhdGUgc3BlY2lmaWVyICVzLiBNdXN0IGJlIGEgdHVwbGUgKHN0YXRlbmFtZSwnZXhjbHVzaXZlfGluY2x1c2l2ZScpIixyZXByKHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHN0YXRldHlwZSA9IHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWUsU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJTdGF0ZSBuYW1lICVzIG11c3QgYmUgYSBzdHJpbmciLCByZXByKG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoc3RhdGV0eXBlID09ICdpbmNsdXNpdmUnIG9yIHN0YXRldHlwZSA9PSAnZXhjbHVzaXZlJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIlN0YXRlIHR5cGUgZm9yIHN0YXRlICVzIG11c3QgYmUgJ2luY2x1c2l2ZScgb3IgJ2V4Y2x1c2l2ZSciLG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnN0YXRlaW5mbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiU3RhdGUgJyVzJyBhbHJlYWR5IGRlZmluZWQiLG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZWluZm9bbmFtZV0gPSBzdGF0ZXR5cGUKKworICAgICMgR2V0IGFsbCBvZiB0aGUgc3ltYm9scyB3aXRoIGEgdF8gcHJlZml4IGFuZCBzb3J0IHRoZW0gaW50byB2YXJpb3VzCisgICAgIyBjYXRlZ29yaWVzIChmdW5jdGlvbnMsIHN0cmluZ3MsIGVycm9yIGZ1bmN0aW9ucywgYW5kIGlnbm9yZSBjaGFyYWN0ZXJzKQorCisgICAgZGVmIGdldF9ydWxlcyhzZWxmKToKKyAgICAgICAgdHN5bWJvbHMgPSBbZiBmb3IgZiBpbiBzZWxmLmxkaWN0IGlmIGZbOjJdID09ICd0XycgXQorCisgICAgICAgICMgTm93IGJ1aWxkIHVwIGEgbGlzdCBvZiBmdW5jdGlvbnMgYW5kIGEgbGlzdCBvZiBzdHJpbmdzCisKKyAgICAgICAgc2VsZi50b2tuYW1lcyA9IHsgfSAgICAgICAgIyBNYXBwaW5nIG9mIHN5bWJvbHMgdG8gdG9rZW4gbmFtZXMKKyAgICAgICAgc2VsZi5mdW5jc3ltID0gIHsgfSAgICAgICAgIyBTeW1ib2xzIGRlZmluZWQgYXMgZnVuY3Rpb25zCisgICAgICAgIHNlbGYuc3Ryc3ltID0gICB7IH0gICAgICAgICMgU3ltYm9scyBkZWZpbmVkIGFzIHN0cmluZ3MKKyAgICAgICAgc2VsZi5pZ25vcmUgICA9IHsgfSAgICAgICAgIyBJZ25vcmUgc3RyaW5ncyBieSBzdGF0ZQorICAgICAgICBzZWxmLmVycm9yZiAgID0geyB9ICAgICAgICAjIEVycm9yIGZ1bmN0aW9ucyBieSBzdGF0ZQorCisgICAgICAgIGZvciBzIGluIHNlbGYuc3RhdGVpbmZvOgorICAgICAgICAgICAgIHNlbGYuZnVuY3N5bVtzXSA9IFtdCisgICAgICAgICAgICAgc2VsZi5zdHJzeW1bc10gPSBbXQorCisgICAgICAgIGlmIGxlbih0c3ltYm9scykgPT0gMDoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJObyBydWxlcyBvZiB0aGUgZm9ybSB0X3J1bGVuYW1lIGFyZSBkZWZpbmVkIikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgZiBpbiB0c3ltYm9sczoKKyAgICAgICAgICAgIHQgPSBzZWxmLmxkaWN0W2ZdCisgICAgICAgICAgICBzdGF0ZXMsIHRva25hbWUgPSBfc3RhdGV0b2tlbihmLHNlbGYuc3RhdGVpbmZvKQorICAgICAgICAgICAgc2VsZi50b2tuYW1lc1tmXSA9IHRva25hbWUKKworICAgICAgICAgICAgaWYgaGFzYXR0cih0LCJfX2NhbGxfXyIpOgorICAgICAgICAgICAgICAgIGlmIHRva25hbWUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gc3RhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcmZbc10gPSB0CisgICAgICAgICAgICAgICAgZWxpZiB0b2tuYW1lID09ICdpZ25vcmUnOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gZnVuY19jb2RlKHQpLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmdW5jX2NvZGUodCkuY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgbXVzdCBiZSBkZWZpbmVkIGFzIGEgc3RyaW5nIixmaWxlLGxpbmUsdC5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZXM6IAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mdW5jc3ltW3NdLmFwcGVuZCgoZix0KSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0LCBTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgaWYgdG9rbmFtZSA9PSAnaWdub3JlJzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gc3RhdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVbc10gPSB0CisgICAgICAgICAgICAgICAgICAgIGlmICJcXCIgaW4gdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLndhcm5pbmcoIiVzIGNvbnRhaW5zIGEgbGl0ZXJhbCBiYWNrc2xhc2ggJ1xcJyIsZikKKworICAgICAgICAgICAgICAgIGVsaWYgdG9rbmFtZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiUnVsZSAnJXMnIG11c3QgYmUgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uIiwgZikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZXM6IAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJzeW1bc10uYXBwZW5kKChmLHQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXMgbm90IGRlZmluZWQgYXMgYSBmdW5jdGlvbiBvciBzdHJpbmciLCBmKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgIyBTb3J0IHRoZSBmdW5jdGlvbnMgYnkgbGluZSBudW1iZXIKKyAgICAgICAgZm9yIGYgaW4gc2VsZi5mdW5jc3ltLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgICAgICAgICAgICAgZi5zb3J0KGxhbWJkYSB4LHk6IGNtcChmdW5jX2NvZGUoeFsxXSkuY29fZmlyc3RsaW5lbm8sZnVuY19jb2RlKHlbMV0pLmNvX2ZpcnN0bGluZW5vKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBQeXRob24gMy4wCisgICAgICAgICAgICAgICAgZi5zb3J0KGtleT1sYW1iZGEgeDogZnVuY19jb2RlKHhbMV0pLmNvX2ZpcnN0bGluZW5vKQorCisgICAgICAgICMgU29ydCB0aGUgc3RyaW5ncyBieSByZWd1bGFyIGV4cHJlc3Npb24gbGVuZ3RoCisgICAgICAgIGZvciBzIGluIHNlbGYuc3Ryc3ltLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CisgICAgICAgICAgICAgICAgcy5zb3J0KGxhbWJkYSB4LHk6IChsZW4oeFsxXSkgPCBsZW4oeVsxXSkpIC0gKGxlbih4WzFdKSA+IGxlbih5WzFdKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgUHl0aG9uIDMuMAorICAgICAgICAgICAgICAgIHMuc29ydChrZXk9bGFtYmRhIHg6IGxlbih4WzFdKSxyZXZlcnNlPVRydWUpCisKKyAgICAjIFZhbGlkYXRlIGFsbCBvZiB0aGUgdF9ydWxlcyBjb2xsZWN0ZWQgCisgICAgZGVmIHZhbGlkYXRlX3J1bGVzKHNlbGYpOgorICAgICAgICBmb3Igc3RhdGUgaW4gc2VsZi5zdGF0ZWluZm86CisgICAgICAgICAgICAjIFZhbGlkYXRlIGFsbCBydWxlcyBkZWZpbmVkIGJ5IGZ1bmN0aW9ucworCisgICAgICAgICAgICAKKworICAgICAgICAgICAgZm9yIGZuYW1lLCBmIGluIHNlbGYuZnVuY3N5bVtzdGF0ZV06CisgICAgICAgICAgICAgICAgbGluZSA9IGZ1bmNfY29kZShmKS5jb19maXJzdGxpbmVubworICAgICAgICAgICAgICAgIGZpbGUgPSBmdW5jX2NvZGUoZikuY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVzW2ZpbGVdID0gMQorCisgICAgICAgICAgICAgICAgdG9rbmFtZSA9IHNlbGYudG9rbmFtZXNbZm5hbWVdCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgcmVxYXJncyA9IDIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXFhcmdzID0gMQorICAgICAgICAgICAgICAgIG5hcmdzID0gZnVuY19jb2RlKGYpLmNvX2FyZ2NvdW50CisgICAgICAgICAgICAgICAgaWYgbmFyZ3MgPiByZXFhcmdzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyBoYXMgdG9vIG1hbnkgYXJndW1lbnRzIixmaWxlLGxpbmUsZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIG5hcmdzIDwgcmVxYXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgcmVxdWlyZXMgYW4gYXJndW1lbnQiLCBmaWxlLGxpbmUsZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIG5vdCBmLl9fZG9jX186CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogTm8gcmVndWxhciBleHByZXNzaW9uIGRlZmluZWQgZm9yIHJ1bGUgJyVzJyIsZmlsZSxsaW5lLGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGMgPSByZS5jb21waWxlKCIoP1A8JXM+JXMpIiAlIChmbmFtZSxmLl9fZG9jX18pLCByZS5WRVJCT1NFIHwgc2VsZi5yZWZsYWdzKQorICAgICAgICAgICAgICAgICAgICBpZiBjLm1hdGNoKCIiKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUmVndWxhciBleHByZXNzaW9uIGZvciBydWxlICclcycgbWF0Y2hlcyBlbXB0eSBzdHJpbmciLCBmaWxlLGxpbmUsZi5fX25hbWVfXykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgZXhjZXB0IHJlLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBfZXR5cGUsIGUsIF9ldHJhY2UgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IEludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvciBydWxlICclcycuICVzIiwgZmlsZSxsaW5lLGYuX19uYW1lX18sZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgJyMnIGluIGYuX19kb2NfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZC4gTWFrZSBzdXJlICcjJyBpbiBydWxlICclcycgaXMgZXNjYXBlZCB3aXRoICdcXCMnIixmaWxlLGxpbmUsIGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgICAgICMgVmFsaWRhdGUgYWxsIHJ1bGVzIGRlZmluZWQgYnkgc3RyaW5ncworICAgICAgICAgICAgZm9yIG5hbWUsciBpbiBzZWxmLnN0cnN5bVtzdGF0ZV06CisgICAgICAgICAgICAgICAgdG9rbmFtZSA9IHNlbGYudG9rbmFtZXNbbmFtZV0KKyAgICAgICAgICAgICAgICBpZiB0b2tuYW1lID09ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJSdWxlICclcycgbXVzdCBiZSBkZWZpbmVkIGFzIGEgZnVuY3Rpb24iLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgbm90IHRva25hbWUgaW4gc2VsZi50b2tlbnMgYW5kIHRva25hbWUuZmluZCgiaWdub3JlXyIpIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIlJ1bGUgJyVzJyBkZWZpbmVkIGZvciBhbiB1bnNwZWNpZmllZCB0b2tlbiAlcyIsbmFtZSx0b2tuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjID0gcmUuY29tcGlsZSgiKD9QPCVzPiVzKSIgJSAobmFtZSxyKSxyZS5WRVJCT1NFIHwgc2VsZi5yZWZsYWdzKQorICAgICAgICAgICAgICAgICAgICBpZiAoYy5tYXRjaCgiIikpOgorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHJ1bGUgJyVzJyBtYXRjaGVzIGVtcHR5IHN0cmluZyIsbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgIGV4Y2VwdCByZS5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgX2V0eXBlLCBlLCBfZXRyYWNlID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uIGZvciBydWxlICclcycuICVzIixuYW1lLGUpCisgICAgICAgICAgICAgICAgICAgIGlmICcjJyBpbiByOgorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJNYWtlIHN1cmUgJyMnIGluIHJ1bGUgJyVzJyBpcyBlc2NhcGVkIHdpdGggJ1xcIyciLG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZ1bmNzeW1bc3RhdGVdIGFuZCBub3Qgc2VsZi5zdHJzeW1bc3RhdGVdOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJObyBydWxlcyBkZWZpbmVkIGZvciBzdGF0ZSAnJXMnIixzdGF0ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorCisgICAgICAgICAgICAjIFZhbGlkYXRlIHRoZSBlcnJvciBmdW5jdGlvbgorICAgICAgICAgICAgZWZ1bmMgPSBzZWxmLmVycm9yZi5nZXQoc3RhdGUsTm9uZSkKKyAgICAgICAgICAgIGlmIGVmdW5jOgorICAgICAgICAgICAgICAgIGYgPSBlZnVuYworICAgICAgICAgICAgICAgIGxpbmUgPSBmdW5jX2NvZGUoZikuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgICAgICBmaWxlID0gZnVuY19jb2RlKGYpLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICAgICAgc2VsZi5maWxlc1tmaWxlXSA9IDEKKworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgdHlwZXMuTWV0aG9kVHlwZSk6CisgICAgICAgICAgICAgICAgICAgIHJlcWFyZ3MgPSAyCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVxYXJncyA9IDEKKyAgICAgICAgICAgICAgICBuYXJncyA9IGZ1bmNfY29kZShmKS5jb19hcmdjb3VudAorICAgICAgICAgICAgICAgIGlmIG5hcmdzID4gcmVxYXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIsZmlsZSxsaW5lLGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgICAgICAgICBpZiBuYXJncyA8IHJlcWFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogUnVsZSAnJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwgZmlsZSxsaW5lLGYuX19uYW1lX18pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAgICAgZm9yIGYgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIHNlbGYudmFsaWRhdGVfZmlsZShmKQorCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB2YWxpZGF0ZV9maWxlKCkKKyAgICAjCisgICAgIyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZWQgdF9ydWxlbmFtZSgpIGZ1bmN0aW9ucyBvciBzdHJpbmdzCisgICAgIyBpbiB0aGUgcGFyc2VyIGlucHV0IGZpbGUuICBUaGlzIGlzIGRvbmUgdXNpbmcgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uCisgICAgIyBtYXRjaCBvbiBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGZpbGUuICAKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdmFsaWRhdGVfZmlsZShzZWxmLGZpbGVuYW1lKToKKyAgICAgICAgaW1wb3J0IG9zLnBhdGgKKyAgICAgICAgYmFzZSxleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBpZiBleHQgIT0gJy5weSc6IHJldHVybiAgICAgICAgICMgTm8gaWRlYSB3aGF0IHRoZSBmaWxlIGlzLiBSZXR1cm4gT0sKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAgICAgICAgICMgQ291bGRuJ3QgZmluZCB0aGUgZmlsZS4gIERvbid0IHdvcnJ5IGFib3V0IGl0CisKKyAgICAgICAgZnJlID0gcmUuY29tcGlsZShyJ1xzKmRlZlxzKyh0X1thLXpBLVpfMC05XSopXCgnKQorICAgICAgICBzcmUgPSByZS5jb21waWxlKHInXHMqKHRfW2EtekEtWl8wLTldKilccyo9JykKKworICAgICAgICBjb3VudGhhc2ggPSB7IH0KKyAgICAgICAgbGluZW4gPSAxCisgICAgICAgIGZvciBsIGluIGxpbmVzOgorICAgICAgICAgICAgbSA9IGZyZS5tYXRjaChsKQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgbSA9IHNyZS5tYXRjaChsKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgIHByZXYgPSBjb3VudGhhc2guZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IHByZXY6CisgICAgICAgICAgICAgICAgICAgIGNvdW50aGFzaFtuYW1lXSA9IGxpbmVuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICVzIHJlZGVmaW5lZC4gUHJldmlvdXNseSBkZWZpbmVkIG9uIGxpbmUgJWQiLGZpbGVuYW1lLGxpbmVuLG5hbWUscHJldikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIGxpbmVuICs9IDEKKyAgICAgICAgICAgIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBsZXgobW9kdWxlKQorIworIyBCdWlsZCBhbGwgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBydWxlcyBmcm9tIGRlZmluaXRpb25zIGluIHRoZSBzdXBwbGllZCBtb2R1bGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiBsZXgobW9kdWxlPU5vbmUsb2JqZWN0PU5vbmUsZGVidWc9MCxvcHRpbWl6ZT0wLGxleHRhYj0ibGV4dGFiIixyZWZsYWdzPTAsbm93YXJuPTAsb3V0cHV0ZGlyPSIiLCBkZWJ1Z2xvZz1Ob25lLCBlcnJvcmxvZz1Ob25lKToKKyAgICBnbG9iYWwgbGV4ZXIKKyAgICBsZGljdCA9IE5vbmUKKyAgICBzdGF0ZWluZm8gID0geyAnSU5JVElBTCcgOiAnaW5jbHVzaXZlJ30KKyAgICBsZXhvYmogPSBMZXhlcigpCisgICAgbGV4b2JqLmxleG9wdGltaXplID0gb3B0aW1pemUKKyAgICBnbG9iYWwgdG9rZW4saW5wdXQKKworICAgIGlmIGVycm9ybG9nIGlzIE5vbmU6CisgICAgICAgIGVycm9ybG9nID0gUGx5TG9nZ2VyKHN5cy5zdGRlcnIpCisKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgaWYgZGVidWdsb2cgaXMgTm9uZToKKyAgICAgICAgICAgIGRlYnVnbG9nID0gUGx5TG9nZ2VyKHN5cy5zdGRlcnIpCisKKyAgICAjIEdldCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgdXNlZCBmb3IgdGhlIGxleGVyCisgICAgaWYgb2JqZWN0OiBtb2R1bGUgPSBvYmplY3QKKworICAgIGlmIG1vZHVsZToKKyAgICAgICAgX2l0ZW1zID0gWyhrLGdldGF0dHIobW9kdWxlLGspKSBmb3IgayBpbiBkaXIobW9kdWxlKV0KKyAgICAgICAgbGRpY3QgPSBkaWN0KF9pdGVtcykKKyAgICBlbHNlOgorICAgICAgICBsZGljdCA9IGdldF9jYWxsZXJfbW9kdWxlX2RpY3QoMikKKworICAgICMgQ29sbGVjdCBwYXJzZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGljdGlvbmFyeQorICAgIGxpbmZvID0gTGV4ZXJSZWZsZWN0KGxkaWN0LGxvZz1lcnJvcmxvZyxyZWZsYWdzPXJlZmxhZ3MpCisgICAgbGluZm8uZ2V0X2FsbCgpCisgICAgaWYgbm90IG9wdGltaXplOgorICAgICAgICBpZiBsaW5mby52YWxpZGF0ZV9hbGwoKToKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJDYW4ndCBidWlsZCBsZXhlciIpCisKKyAgICBpZiBvcHRpbWl6ZSBhbmQgbGV4dGFiOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsZXhvYmoucmVhZHRhYihsZXh0YWIsbGRpY3QpCisgICAgICAgICAgICB0b2tlbiA9IGxleG9iai50b2tlbgorICAgICAgICAgICAgaW5wdXQgPSBsZXhvYmouaW5wdXQKKyAgICAgICAgICAgIGxleGVyID0gbGV4b2JqCisgICAgICAgICAgICByZXR1cm4gbGV4b2JqCisKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgIyBEdW1wIHNvbWUgYmFzaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uCisgICAgaWYgZGVidWc6CisgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogdG9rZW5zICAgPSAlciIsIGxpbmZvLnRva2VucykKKyAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiBsaXRlcmFscyA9ICVyIiwgbGluZm8ubGl0ZXJhbHMpCisgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogc3RhdGVzICAgPSAlciIsIGxpbmZvLnN0YXRlaW5mbykKKworICAgICMgQnVpbGQgYSBkaWN0aW9uYXJ5IG9mIHZhbGlkIHRva2VuIG5hbWVzCisgICAgbGV4b2JqLmxleHRva2VucyA9IHsgfQorICAgIGZvciBuIGluIGxpbmZvLnRva2VuczoKKyAgICAgICAgbGV4b2JqLmxleHRva2Vuc1tuXSA9IDEKKworICAgICMgR2V0IGxpdGVyYWxzIHNwZWNpZmljYXRpb24KKyAgICBpZiBpc2luc3RhbmNlKGxpbmZvLmxpdGVyYWxzLChsaXN0LHR1cGxlKSk6CisgICAgICAgIGxleG9iai5sZXhsaXRlcmFscyA9IHR5cGUobGluZm8ubGl0ZXJhbHNbMF0pKCkuam9pbihsaW5mby5saXRlcmFscykKKyAgICBlbHNlOgorICAgICAgICBsZXhvYmoubGV4bGl0ZXJhbHMgPSBsaW5mby5saXRlcmFscworCisgICAgIyBHZXQgdGhlIHN0YXRlaW5mbyBkaWN0aW9uYXJ5CisgICAgc3RhdGVpbmZvID0gbGluZm8uc3RhdGVpbmZvCisKKyAgICByZWdleHMgPSB7IH0KKyAgICAjIEJ1aWxkIHRoZSBtYXN0ZXIgcmVndWxhciBleHByZXNzaW9ucworICAgIGZvciBzdGF0ZSBpbiBzdGF0ZWluZm86CisgICAgICAgIHJlZ2V4X2xpc3QgPSBbXQorCisgICAgICAgICMgQWRkIHJ1bGVzIGRlZmluZWQgYnkgZnVuY3Rpb25zIGZpcnN0CisgICAgICAgIGZvciBmbmFtZSwgZiBpbiBsaW5mby5mdW5jc3ltW3N0YXRlXToKKyAgICAgICAgICAgIGxpbmUgPSBmdW5jX2NvZGUoZikuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgIGZpbGUgPSBmdW5jX2NvZGUoZikuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIHJlZ2V4X2xpc3QuYXBwZW5kKCIoP1A8JXM+JXMpIiAlIChmbmFtZSxmLl9fZG9jX18pKQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgZGVidWdsb2cuaW5mbygibGV4OiBBZGRpbmcgcnVsZSAlcyAtPiAnJXMnIChzdGF0ZSAnJXMnKSIsZm5hbWUsZi5fX2RvY19fLCBzdGF0ZSkKKworICAgICAgICAjIE5vdyBhZGQgYWxsIG9mIHRoZSBzaW1wbGUgcnVsZXMKKyAgICAgICAgZm9yIG5hbWUsciBpbiBsaW5mby5zdHJzeW1bc3RhdGVdOgorICAgICAgICAgICAgcmVnZXhfbGlzdC5hcHBlbmQoIig/UDwlcz4lcykiICUgKG5hbWUscikpCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJsZXg6IEFkZGluZyBydWxlICVzIC0+ICclcycgKHN0YXRlICclcycpIixuYW1lLHIsIHN0YXRlKQorCisgICAgICAgIHJlZ2V4c1tzdGF0ZV0gPSByZWdleF9saXN0CisKKyAgICAjIEJ1aWxkIHRoZSBtYXN0ZXIgcmVndWxhciBleHByZXNzaW9ucworCisgICAgaWYgZGVidWc6CisgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogPT09PSBNQVNURVIgUkVHRVhTIEZPTExPVyA9PT09IikKKworICAgIGZvciBzdGF0ZSBpbiByZWdleHM6CisgICAgICAgIGxleHJlLCByZV90ZXh0LCByZV9uYW1lcyA9IF9mb3JtX21hc3Rlcl9yZShyZWdleHNbc3RhdGVdLHJlZmxhZ3MsbGRpY3QsbGluZm8udG9rbmFtZXMpCisgICAgICAgIGxleG9iai5sZXhzdGF0ZXJlW3N0YXRlXSA9IGxleHJlCisgICAgICAgIGxleG9iai5sZXhzdGF0ZXJldGV4dFtzdGF0ZV0gPSByZV90ZXh0CisgICAgICAgIGxleG9iai5sZXhzdGF0ZXJlbmFtZXNbc3RhdGVdID0gcmVfbmFtZXMKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocmVfdGV4dCkpOgorICAgICAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oImxleDogc3RhdGUgJyVzJyA6IHJlZ2V4WyVkXSA9ICclcyciLHN0YXRlLCBpLCByZV90ZXh0W2ldKQorCisgICAgIyBGb3IgaW5jbHVzaXZlIHN0YXRlcywgd2UgbmVlZCB0byBhZGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZnJvbSB0aGUgSU5JVElBTCBzdGF0ZQorICAgIGZvciBzdGF0ZSxzdHlwZSBpbiBzdGF0ZWluZm8uaXRlbXMoKToKKyAgICAgICAgaWYgc3RhdGUgIT0gIklOSVRJQUwiIGFuZCBzdHlwZSA9PSAnaW5jbHVzaXZlJzoKKyAgICAgICAgICAgICBsZXhvYmoubGV4c3RhdGVyZVtzdGF0ZV0uZXh0ZW5kKGxleG9iai5sZXhzdGF0ZXJlWydJTklUSUFMJ10pCisgICAgICAgICAgICAgbGV4b2JqLmxleHN0YXRlcmV0ZXh0W3N0YXRlXS5leHRlbmQobGV4b2JqLmxleHN0YXRlcmV0ZXh0WydJTklUSUFMJ10pCisgICAgICAgICAgICAgbGV4b2JqLmxleHN0YXRlcmVuYW1lc1tzdGF0ZV0uZXh0ZW5kKGxleG9iai5sZXhzdGF0ZXJlbmFtZXNbJ0lOSVRJQUwnXSkKKworICAgIGxleG9iai5sZXhzdGF0ZWluZm8gPSBzdGF0ZWluZm8KKyAgICBsZXhvYmoubGV4cmUgPSBsZXhvYmoubGV4c3RhdGVyZVsiSU5JVElBTCJdCisgICAgbGV4b2JqLmxleHJldGV4dCA9IGxleG9iai5sZXhzdGF0ZXJldGV4dFsiSU5JVElBTCJdCisgICAgbGV4b2JqLmxleHJlZmxhZ3MgPSByZWZsYWdzCisKKyAgICAjIFNldCB1cCBpZ25vcmUgdmFyaWFibGVzCisgICAgbGV4b2JqLmxleHN0YXRlaWdub3JlID0gbGluZm8uaWdub3JlCisgICAgbGV4b2JqLmxleGlnbm9yZSA9IGxleG9iai5sZXhzdGF0ZWlnbm9yZS5nZXQoIklOSVRJQUwiLCIiKQorCisgICAgIyBTZXQgdXAgZXJyb3IgZnVuY3Rpb25zCisgICAgbGV4b2JqLmxleHN0YXRlZXJyb3JmID0gbGluZm8uZXJyb3JmCisgICAgbGV4b2JqLmxleGVycm9yZiA9IGxpbmZvLmVycm9yZi5nZXQoIklOSVRJQUwiLE5vbmUpCisgICAgaWYgbm90IGxleG9iai5sZXhlcnJvcmY6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIk5vIHRfZXJyb3IgcnVsZSBpcyBkZWZpbmVkIikKKworICAgICMgQ2hlY2sgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGlnbm9yZSBhbmQgZXJyb3IgcnVsZXMKKyAgICBmb3IgcyxzdHlwZSBpbiBzdGF0ZWluZm8uaXRlbXMoKToKKyAgICAgICAgaWYgc3R5cGUgPT0gJ2V4Y2x1c2l2ZSc6CisgICAgICAgICAgICAgIGlmIG5vdCBzIGluIGxpbmZvLmVycm9yZjoKKyAgICAgICAgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJObyBlcnJvciBydWxlIGlzIGRlZmluZWQgZm9yIGV4Y2x1c2l2ZSBzdGF0ZSAnJXMnIiwgcykKKyAgICAgICAgICAgICAgaWYgbm90IHMgaW4gbGluZm8uaWdub3JlIGFuZCBsZXhvYmoubGV4aWdub3JlOgorICAgICAgICAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIk5vIGlnbm9yZSBydWxlIGlzIGRlZmluZWQgZm9yIGV4Y2x1c2l2ZSBzdGF0ZSAnJXMnIiwgcykKKyAgICAgICAgZWxpZiBzdHlwZSA9PSAnaW5jbHVzaXZlJzoKKyAgICAgICAgICAgICAgaWYgbm90IHMgaW4gbGluZm8uZXJyb3JmOgorICAgICAgICAgICAgICAgICAgIGxpbmZvLmVycm9yZltzXSA9IGxpbmZvLmVycm9yZi5nZXQoIklOSVRJQUwiLE5vbmUpCisgICAgICAgICAgICAgIGlmIG5vdCBzIGluIGxpbmZvLmlnbm9yZToKKyAgICAgICAgICAgICAgICAgICBsaW5mby5pZ25vcmVbc10gPSBsaW5mby5pZ25vcmUuZ2V0KCJJTklUSUFMIiwiIikKKworICAgICMgQ3JlYXRlIGdsb2JhbCB2ZXJzaW9ucyBvZiB0aGUgdG9rZW4oKSBhbmQgaW5wdXQoKSBmdW5jdGlvbnMKKyAgICB0b2tlbiA9IGxleG9iai50b2tlbgorICAgIGlucHV0ID0gbGV4b2JqLmlucHV0CisgICAgbGV4ZXIgPSBsZXhvYmoKKworICAgICMgSWYgaW4gb3B0aW1pemUgbW9kZSwgd2Ugd3JpdGUgdGhlIGxleHRhYgorICAgIGlmIGxleHRhYiBhbmQgb3B0aW1pemU6CisgICAgICAgIGxleG9iai53cml0ZXRhYihsZXh0YWIsb3V0cHV0ZGlyKQorCisgICAgcmV0dXJuIGxleG9iagorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHJ1bm1haW4oKQorIworIyBUaGlzIHJ1bnMgdGhlIGxleGVyIGFzIGEgbWFpbiBwcm9ncmFtCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBydW5tYWluKGxleGVyPU5vbmUsZGF0YT1Ob25lKToKKyAgICBpZiBub3QgZGF0YToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlJlYWRpbmcgZnJvbSBzdGFuZGFyZCBpbnB1dCAodHlwZSBFT0YgdG8gZW5kKTpcbiIpCisgICAgICAgICAgICBkYXRhID0gc3lzLnN0ZGluLnJlYWQoKQorCisgICAgaWYgbGV4ZXI6CisgICAgICAgIF9pbnB1dCA9IGxleGVyLmlucHV0CisgICAgZWxzZToKKyAgICAgICAgX2lucHV0ID0gaW5wdXQKKyAgICBfaW5wdXQoZGF0YSkKKyAgICBpZiBsZXhlcjoKKyAgICAgICAgX3Rva2VuID0gbGV4ZXIudG9rZW4KKyAgICBlbHNlOgorICAgICAgICBfdG9rZW4gPSB0b2tlbgorCisgICAgd2hpbGUgMToKKyAgICAgICAgdG9rID0gX3Rva2VuKCkKKyAgICAgICAgaWYgbm90IHRvazogYnJlYWsKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiKCVzLCVyLCVkLCVkKVxuIiAlICh0b2sudHlwZSwgdG9rLnZhbHVlLCB0b2subGluZW5vLHRvay5sZXhwb3MpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEBUT0tFTihyZWdleCkKKyMKKyMgVGhpcyBkZWNvcmF0b3IgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSByZWdleCBleHByZXNzaW9uIG9uIGEgZnVuY3Rpb24KKyMgd2hlbiBpdHMgZG9jc3RyaW5nIG1pZ2h0IG5lZWQgdG8gYmUgc2V0IGluIGFuIGFsdGVybmF0aXZlIHdheQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgVE9LRU4ocik6CisgICAgZGVmIHNldF9kb2MoZik6CisgICAgICAgIGlmIGhhc2F0dHIociwiX19jYWxsX18iKToKKyAgICAgICAgICAgIGYuX19kb2NfXyA9IHIuX19kb2NfXworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5fX2RvY19fID0gcgorICAgICAgICByZXR1cm4gZgorICAgIHJldHVybiBzZXRfZG9jCisKKyMgQWx0ZXJuYXRpdmUgc3BlbGxpbmcgb2YgdGhlIFRPS0VOIGRlY29yYXRvcgorVG9rZW4gPSBUT0tFTgorCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9wbHkveWFjYy5weSBiL2JpdGJha2UvbGliL3BseS95YWNjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjhmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wbHkveWFjYy5weQpAQCAtMCwwICsxLDMyNzYgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcGx5OiB5YWNjLnB5CisjCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA5LAorIyBEYXZpZCBNLiBCZWF6bGV5IChEYWJlYXogTExDKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjIAorIyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyMgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCisjICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKKyMgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisjICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICAKKyMgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBEYXZpZCBCZWF6bGV5IG9yIERhYmVheiBMTEMgbWF5IGJlIHVzZWQgdG8KKyMgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorIyAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBUaGlzIGltcGxlbWVudHMgYW4gTFIgcGFyc2VyIHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSBncmFtbWFyIHJ1bGVzIGRlZmluZWQKKyMgYXMgUHl0aG9uIGZ1bmN0aW9ucy4gVGhlIGdyYW1tZXIgaXMgc3BlY2lmaWVkIGJ5IHN1cHBseWluZyB0aGUgQk5GIGluc2lkZQorIyBQeXRob24gZG9jdW1lbnRhdGlvbiBzdHJpbmdzLiAgVGhlIGluc3BpcmF0aW9uIGZvciB0aGlzIHRlY2huaXF1ZSB3YXMgYm9ycm93ZWQKKyMgZnJvbSBKb2huIEF5Y29jaydzIFNwYXJrIHBhcnNpbmcgc3lzdGVtLiAgUExZIG1pZ2h0IGJlIHZpZXdlZCBhcyBjcm9zcyBiZXR3ZWVuCisjIFNwYXJrIGFuZCB0aGUgR05VIGJpc29uIHV0aWxpdHkuCisjCisjIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG9ubHkgc29tZXdoYXQgb2JqZWN0LW9yaWVudGVkLiBUaGUKKyMgTFIgcGFyc2VyIGl0c2VsZiBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIGFuIG9iamVjdCAod2hpY2ggYWxsb3dzIG11bHRpcGxlCisjIHBhcnNlcnMgdG8gY28tZXhpc3QpLiAgSG93ZXZlciwgbW9zdCBvZiB0aGUgdmFyaWFibGVzIHVzZWQgZHVyaW5nIHRhYmxlCisjIGNvbnN0cnVjdGlvbiBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBnbG9iYWwgdmFyaWFibGVzLiAgVXNlcnMgc2hvdWxkbid0CisjIG5vdGljZSB1bmxlc3MgdGhleSBhcmUgdHJ5aW5nIHRvIGRlZmluZSBtdWx0aXBsZSBwYXJzZXJzIGF0IHRoZSBzYW1lCisjIHRpbWUgdXNpbmcgdGhyZWFkcyAoaW4gd2hpY2ggY2FzZSB0aGV5IHNob3VsZCBoYXZlIHRoZWlyIGhlYWQgZXhhbWluZWQpLgorIworIyBUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGJvdGggU0xSIGFuZCBMQUxSKDEpIHBhcnNpbmcuICBMQUxSKDEpCisjIHN1cHBvcnQgd2FzIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgYnkgRWxpYXMgSW91cCAoZXppb3VwQGFsdW1uaS51Y2hpY2Fnby5lZHUpLAorIyB1c2luZyB0aGUgYWxnb3JpdGhtIGZvdW5kIGluIEFobywgU2V0aGksIGFuZCBVbGxtYW4gIkNvbXBpbGVyczogUHJpbmNpcGxlcywKKyMgVGVjaG5pcXVlcywgYW5kIFRvb2xzIiAoVGhlIERyYWdvbiBCb29rKS4gIExBTFIoMSkgaGFzIHNpbmNlIGJlZW4gcmVwbGFjZWQKKyMgYnkgdGhlIG1vcmUgZWZmaWNpZW50IERlUmVtZXIgYW5kIFBlbm5lbGxvIGFsZ29yaXRobS4KKyMKKyMgOjo6Ojo6OjogV0FSTklORyA6Ojo6Ojo6CisjCisjIENvbnN0cnVjdGlvbiBvZiBMUiBwYXJzaW5nIHRhYmxlcyBpcyBmYWlybHkgY29tcGxpY2F0ZWQgYW5kIGV4cGVuc2l2ZS4KKyMgVG8gbWFrZSB0aGlzIG1vZHVsZSBydW4gZmFzdCwgYSAqTE9UKiBvZiB3b3JrIGhhcyBiZWVuIHB1dCBpbnRvCisjIG9wdGltaXphdGlvbi0tLW9mdGVuIGF0IHRoZSBleHBlbnNpdmUgb2YgcmVhZGFiaWxpdHkgYW5kIHdoYXQgbWlnaHQKKyMgY29uc2lkZXIgdG8gYmUgZ29vZCBQeXRob24gImNvZGluZyBzdHlsZS4iICAgTW9kaWZ5IHRoZSBjb2RlIGF0IHlvdXIKKyMgb3duIHJpc2shCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworX192ZXJzaW9uX18gICAgPSAiMy4zIgorX190YWJ2ZXJzaW9uX18gPSAiMy4yIiAgICAgICAjIFRhYmxlIHZlcnNpb24KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICAgICAgICAgICAgPT09IFVzZXIgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgPT09CisjCisjIENoYW5nZSB0aGVzZSB0byBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgeWFjYyAoaWYgeW91IHdpc2gpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeWFjY2RlYnVnICAgPSAwICAgICAgICAgICAgICAgICMgRGVidWdnaW5nIG1vZGUuICBJZiBzZXQsIHlhY2MgZ2VuZXJhdGVzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgJ3BhcnNlci5vdXQnIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisKK2RlYnVnX2ZpbGUgID0gJ3BhcnNlci5vdXQnICAgICAjIERlZmF1bHQgbmFtZSBvZiB0aGUgZGVidWdnaW5nIGZpbGUKK3RhYl9tb2R1bGUgID0gJ3BhcnNldGFiJyAgICAgICAjIERlZmF1bHQgbmFtZSBvZiB0aGUgdGFibGUgbW9kdWxlCitkZWZhdWx0X2xyICA9ICdMQUxSJyAgICAgICAgICAgIyBEZWZhdWx0IExSIHRhYmxlIGdlbmVyYXRpb24gbWV0aG9kCisKK2Vycm9yX2NvdW50ID0gMyAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBzeW1ib2xzIHRoYXQgbXVzdCBiZSBzaGlmdGVkIHRvIGxlYXZlIHJlY292ZXJ5IG1vZGUKKworeWFjY2RldmVsICAgPSAwICAgICAgICAgICAgICAgICMgU2V0IHRvIFRydWUgaWYgZGV2ZWxvcGluZyB5YWNjLiAgVGhpcyB0dXJucyBvZmYgb3B0aW1pemVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMgb2YgY2VydGFpbiBmdW5jdGlvbnMuCisKK3Jlc3VsdGxpbWl0ID0gNDAgICAgICAgICAgICAgICAjIFNpemUgbGltaXQgb2YgcmVzdWx0cyB3aGVuIHJ1bm5pbmcgaW4gZGVidWcgbW9kZS4KKworcGlja2xlX3Byb3RvY29sID0gMCAgICAgICAgICAgICMgUHJvdG9jb2wgdG8gdXNlIHdoZW4gd3JpdGluZyBwaWNrbGUgZmlsZXMKKworaW1wb3J0IHJlLCB0eXBlcywgc3lzLCBvcy5wYXRoCisKKyMgQ29tcGF0aWJpbGl0eSBmdW5jdGlvbiBmb3IgcHl0aG9uIDIuNi8zLjAKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgIGRlZiBmdW5jX2NvZGUoZik6CisgICAgICAgIHJldHVybiBmLmZ1bmNfY29kZQorZWxzZToKKyAgICBkZWYgZnVuY19jb2RlKGYpOgorICAgICAgICByZXR1cm4gZi5fX2NvZGVfXworCisjIENvbXBhdGliaWxpdHkKK3RyeToKKyAgICBNQVhJTlQgPSBzeXMubWF4aW50CitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgTUFYSU5UID0gc3lzLm1heHNpemUKKworIyBQeXRob24gMi54LzMuMCBjb21wYXRpYmlsaXR5LgorZGVmIGxvYWRfcGx5X2xleCgpOgorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICBpbXBvcnQgbGV4CisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IHBseS5sZXggYXMgbGV4CisgICAgcmV0dXJuIGxleAorCisjIFRoaXMgb2JqZWN0IGlzIGEgc3RhbmQtaW4gZm9yIGEgbG9nZ2luZyBvYmplY3QgY3JlYXRlZCBieSB0aGUgCisjIGxvZ2dpbmcgbW9kdWxlLiAgIFBMWSB3aWxsIHVzZSB0aGlzIGJ5IGRlZmF1bHQgdG8gY3JlYXRlIHRoaW5ncworIyBzdWNoIGFzIHRoZSBwYXJzZXIub3V0IGZpbGUuICBJZiBhIHVzZXIgd2FudHMgbW9yZSBkZXRhaWxlZAorIyBpbmZvcm1hdGlvbiwgdGhleSBjYW4gY3JlYXRlIHRoZWlyIG93biBsb2dnaW5nIG9iamVjdCBhbmQgcGFzcworIyBpdCBpbnRvIFBMWS4KKworY2xhc3MgUGx5TG9nZ2VyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsZik6CisgICAgICAgIHNlbGYuZiA9IGYKKyAgICBkZWYgZGVidWcoc2VsZixtc2csKmFyZ3MsKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmYud3JpdGUoKG1zZyAlIGFyZ3MpICsgIlxuIikKKyAgICBpbmZvICAgICA9IGRlYnVnCisKKyAgICBkZWYgd2FybmluZyhzZWxmLG1zZywqYXJncywqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgiV0FSTklORzogIisgKG1zZyAlIGFyZ3MpICsgIlxuIikKKworICAgIGRlZiBlcnJvcihzZWxmLG1zZywqYXJncywqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZi53cml0ZSgiRVJST1I6ICIgKyAobXNnICUgYXJncykgKyAiXG4iKQorCisgICAgY3JpdGljYWwgPSBkZWJ1ZworCisjIE51bGwgbG9nZ2VyIGlzIHVzZWQgd2hlbiBubyBvdXRwdXQgaXMgZ2VuZXJhdGVkLiBEb2VzIG5vdGhpbmcuCitjbGFzcyBOdWxsTG9nZ2VyKG9iamVjdCk6CisgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZixuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgX19jYWxsX18oc2VsZiwqYXJncywqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIAorIyBFeGNlcHRpb24gcmFpc2VkIGZvciB5YWNjLXJlbGF0ZWQgZXJyb3JzCitjbGFzcyBZYWNjRXJyb3IoRXhjZXB0aW9uKTogICBwYXNzCisKKyMgRm9ybWF0IHRoZSByZXN1bHQgbWVzc2FnZSB0aGF0IHRoZSBwYXJzZXIgcHJvZHVjZXMgd2hlbiBydW5uaW5nIGluIGRlYnVnIG1vZGUuCitkZWYgZm9ybWF0X3Jlc3VsdChyKToKKyAgICByZXByX3N0ciA9IHJlcHIocikKKyAgICBpZiAnXG4nIGluIHJlcHJfc3RyOiByZXByX3N0ciA9IHJlcHIocmVwcl9zdHIpCisgICAgaWYgbGVuKHJlcHJfc3RyKSA+IHJlc3VsdGxpbWl0OgorICAgICAgICByZXByX3N0ciA9IHJlcHJfc3RyWzpyZXN1bHRsaW1pdF0rIiAuLi4iCisgICAgcmVzdWx0ID0gIjwlcyBAIDB4JXg+ICglcykiICUgKHR5cGUocikuX19uYW1lX18saWQocikscmVwcl9zdHIpCisgICAgcmV0dXJuIHJlc3VsdAorCisKKyMgRm9ybWF0IHN0YWNrIGVudHJpZXMgd2hlbiB0aGUgcGFyc2VyIGlzIHJ1bm5pbmcgaW4gZGVidWcgbW9kZQorZGVmIGZvcm1hdF9zdGFja19lbnRyeShyKToKKyAgICByZXByX3N0ciA9IHJlcHIocikKKyAgICBpZiAnXG4nIGluIHJlcHJfc3RyOiByZXByX3N0ciA9IHJlcHIocmVwcl9zdHIpCisgICAgaWYgbGVuKHJlcHJfc3RyKSA8IDE2OgorICAgICAgICByZXR1cm4gcmVwcl9zdHIKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIjwlcyBAIDB4JXg+IiAlICh0eXBlKHIpLl9fbmFtZV9fLGlkKHIpKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICA9PT0gIExSIFBhcnNpbmcgRW5naW5lID09PQorIworIyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgZm9yIHRoZSBMUiBwYXJzZXIgaXRzZWxmLiAgVGhlc2UgYXJlIG5vdAorIyB1c2VkIGR1cmluZyB0YWJsZSBjb25zdHJ1Y3Rpb24gYW5kIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgYWN0dWFsIExSCisjIHRhYmxlIGdlbmVyYXRpb24gYWxnb3JpdGhtCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaG9sZCBub24tdGVybWluYWwgZ3JhbW1hciBzeW1ib2xzIGR1cmluZyBwYXJzaW5nLgorIyBJdCBub3JtYWxseSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHNldDoKKyMgICAgICAgIC50eXBlICAgICAgID0gR3JhbW1hciBzeW1ib2wgdHlwZQorIyAgICAgICAgLnZhbHVlICAgICAgPSBTeW1ib2wgdmFsdWUKKyMgICAgICAgIC5saW5lbm8gICAgID0gU3RhcnRpbmcgbGluZSBudW1iZXIKKyMgICAgICAgIC5lbmRsaW5lbm8gID0gRW5kaW5nIGxpbmUgbnVtYmVyIChvcHRpb25hbCwgc2V0IGF1dG9tYXRpY2FsbHkpCisjICAgICAgICAubGV4cG9zICAgICA9IFN0YXJ0aW5nIGxleCBwb3NpdGlvbgorIyAgICAgICAgLmVuZGxleHBvcyAgPSBFbmRpbmcgbGV4IHBvc2l0aW9uIChvcHRpb25hbCwgc2V0IGF1dG9tYXRpY2FsbHkpCisKK2NsYXNzIFlhY2NTeW1ib2w6CisgICAgZGVmIF9fc3RyX18oc2VsZik6ICAgIHJldHVybiBzZWxmLnR5cGUKKyAgICBkZWYgX19yZXByX18oc2VsZik6ICAgcmV0dXJuIHN0cihzZWxmKQorCisjIFRoaXMgY2xhc3MgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgb2JqZWN0cyBhY3R1YWxseSBwYXNzZWQgdG8gZWFjaAorIyBncmFtbWFyIHJ1bGUuICAgSW5kZXggbG9va3VwIGFuZCBhc3NpZ25tZW50IGFjdHVhbGx5IGFzc2lnbiB0aGUKKyMgLnZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgdW5kZXJseWluZyBZYWNjU3ltYm9sIG9iamVjdC4KKyMgVGhlIGxpbmVubygpIG1ldGhvZCByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiBhIGdpdmVuCisjIGl0ZW0gKG9yIDAgaWYgbm90IGRlZmluZWQpLiAgIFRoZSBsaW5lc3BhbigpIG1ldGhvZCByZXR1cm5zCisjIGEgdHVwbGUgb2YgKHN0YXJ0bGluZSxlbmRsaW5lKSByZXByZXNlbnRpbmcgdGhlIHJhbmdlIG9mIGxpbmVzCisjIGZvciBhIHN5bWJvbC4gIFRoZSBsZXhzcGFuKCkgbWV0aG9kIHJldHVybnMgYSB0dXBsZSAobGV4cG9zLGVuZGxleHBvcykKKyMgcmVwcmVzZW50aW5nIHRoZSByYW5nZSBvZiBwb3NpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4KKworY2xhc3MgWWFjY1Byb2R1Y3Rpb246CisgICAgZGVmIF9faW5pdF9fKHNlbGYscyxzdGFjaz1Ob25lKToKKyAgICAgICAgc2VsZi5zbGljZSA9IHMKKyAgICAgICAgc2VsZi5zdGFjayA9IHN0YWNrCisgICAgICAgIHNlbGYubGV4ZXIgPSBOb25lCisgICAgICAgIHNlbGYucGFyc2VyPSBOb25lCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsbik6CisgICAgICAgIGlmIG4gPj0gMDogcmV0dXJuIHNlbGYuc2xpY2Vbbl0udmFsdWUKKyAgICAgICAgZWxzZTogcmV0dXJuIHNlbGYuc3RhY2tbbl0udmFsdWUKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLG4sdik6CisgICAgICAgIHNlbGYuc2xpY2Vbbl0udmFsdWUgPSB2CisKKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsaSxqKToKKyAgICAgICAgcmV0dXJuIFtzLnZhbHVlIGZvciBzIGluIHNlbGYuc2xpY2VbaTpqXV0KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc2xpY2UpCisKKyAgICBkZWYgbGluZW5vKHNlbGYsbik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc2xpY2Vbbl0sImxpbmVubyIsMCkKKworICAgIGRlZiBzZXRfbGluZW5vKHNlbGYsbixsaW5lbm8pOgorICAgICAgICBzZWxmLnNsaWNlW25dLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGxpbmVzcGFuKHNlbGYsbik6CisgICAgICAgIHN0YXJ0bGluZSA9IGdldGF0dHIoc2VsZi5zbGljZVtuXSwibGluZW5vIiwwKQorICAgICAgICBlbmRsaW5lID0gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCJlbmRsaW5lbm8iLHN0YXJ0bGluZSkKKyAgICAgICAgcmV0dXJuIHN0YXJ0bGluZSxlbmRsaW5lCisKKyAgICBkZWYgbGV4cG9zKHNlbGYsbik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc2xpY2Vbbl0sImxleHBvcyIsMCkKKworICAgIGRlZiBsZXhzcGFuKHNlbGYsbik6CisgICAgICAgIHN0YXJ0cG9zID0gZ2V0YXR0cihzZWxmLnNsaWNlW25dLCJsZXhwb3MiLDApCisgICAgICAgIGVuZHBvcyA9IGdldGF0dHIoc2VsZi5zbGljZVtuXSwiZW5kbGV4cG9zIixzdGFydHBvcykKKyAgICAgICAgcmV0dXJuIHN0YXJ0cG9zLGVuZHBvcworCisgICAgZGVmIGVycm9yKHNlbGYpOgorICAgICAgIHJhaXNlIFN5bnRheEVycm9yCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBMUlBhcnNlciA9PQorIworIyBUaGUgTFIgUGFyc2luZyBlbmdpbmUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExSUGFyc2VyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLGxydGFiLGVycm9yZik6CisgICAgICAgIHNlbGYucHJvZHVjdGlvbnMgPSBscnRhYi5scl9wcm9kdWN0aW9ucworICAgICAgICBzZWxmLmFjdGlvbiAgICAgID0gbHJ0YWIubHJfYWN0aW9uCisgICAgICAgIHNlbGYuZ290byAgICAgICAgPSBscnRhYi5scl9nb3RvCisgICAgICAgIHNlbGYuZXJyb3JmdW5jICAgPSBlcnJvcmYKKworICAgIGRlZiBlcnJvayhzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcm9rICAgICA9IDEKKworICAgIGRlZiByZXN0YXJ0KHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5zdGF0ZXN0YWNrWzpdCisgICAgICAgIGRlbCBzZWxmLnN5bXN0YWNrWzpdCisgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICBzeW0udHlwZSA9ICckZW5kJworICAgICAgICBzZWxmLnN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgIHNlbGYuc3RhdGVzdGFjay5hcHBlbmQoMCkKKworICAgIGRlZiBwYXJzZShzZWxmLGlucHV0PU5vbmUsbGV4ZXI9Tm9uZSxkZWJ1Zz0wLHRyYWNraW5nPTAsdG9rZW5mdW5jPU5vbmUpOgorICAgICAgICBpZiBkZWJ1ZyBvciB5YWNjZGV2ZWw6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRlYnVnLGludCk6CisgICAgICAgICAgICAgICAgZGVidWcgPSBQbHlMb2dnZXIoc3lzLnN0ZGVycikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlZGVidWcoaW5wdXQsbGV4ZXIsZGVidWcsdHJhY2tpbmcsdG9rZW5mdW5jKQorICAgICAgICBlbGlmIHRyYWNraW5nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VvcHQoaW5wdXQsbGV4ZXIsZGVidWcsdHJhY2tpbmcsdG9rZW5mdW5jKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VvcHRfbm90cmFjayhpbnB1dCxsZXhlcixkZWJ1Zyx0cmFja2luZyx0b2tlbmZ1bmMpCisgICAgICAgIAorCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICMgcGFyc2VkZWJ1ZygpLgorICAgICMKKyAgICAjIFRoaXMgaXMgdGhlIGRlYnVnZ2luZyBlbmFibGVkIHZlcnNpb24gb2YgcGFyc2UoKS4gIEFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlCisgICAgIyBwYXJzaW5nIGVuZ2luZSBzaG91bGQgYmUgbWFkZSBoZXJlLiAgIEZvciB0aGUgbm9uLWRlYnVnZ2luZyB2ZXJzaW9uLAorICAgICMgY29weSB0aGlzIGNvZGUgdG8gYSBtZXRob2QgcGFyc2VvcHQoKSBhbmQgZGVsZXRlIGFsbCBvZiB0aGUgc2VjdGlvbnMKKyAgICAjIGVuY2xvc2VkIGluOgorICAgICMKKyAgICAjICAgICAgIy0tISBERUJVRworICAgICMgICAgICBzdGF0ZW1lbnRzCisgICAgIyAgICAgICMtLSEgREVCVUcKKyAgICAjCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisgICAgZGVmIHBhcnNlZGVidWcoc2VsZixpbnB1dD1Ob25lLGxleGVyPU5vbmUsZGVidWc9Tm9uZSx0cmFja2luZz0wLHRva2VuZnVuYz1Ob25lKToKKyAgICAgICAgbG9va2FoZWFkID0gTm9uZSAgICAgICAgICAgICAgICAgIyBDdXJyZW50IGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgbG9va2FoZWFkc3RhY2sgPSBbIF0gICAgICAgICAgICAgIyBTdGFjayBvZiBsb29rYWhlYWQgc3ltYm9scworICAgICAgICBhY3Rpb25zID0gc2VsZi5hY3Rpb24gICAgICAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBhY3Rpb24gdGFibGUgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgZ290byAgICA9IHNlbGYuZ290byAgICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gZ290byB0YWJsZSAodG8gYXZvaWQgbG9va3VwIG9uIHNlbGYuKQorICAgICAgICBwcm9kICAgID0gc2VsZi5wcm9kdWN0aW9ucyAgICAgICAjIExvY2FsIHJlZmVyZW5jZSB0byBwcm9kdWN0aW9uIGxpc3QgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgcHNsaWNlICA9IFlhY2NQcm9kdWN0aW9uKE5vbmUpICAgIyBQcm9kdWN0aW9uIG9iamVjdCBwYXNzZWQgdG8gZ3JhbW1hciBydWxlcworICAgICAgICBlcnJvcmNvdW50ID0gMCAgICAgICAgICAgICAgICAgICAjIFVzZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IAorCisgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgIGRlYnVnLmluZm8oIlBMWTogUEFSU0UgREVCVUcgU1RBUlQiKQorICAgICAgICAjIC0tISBERUJVRworCisgICAgICAgICMgSWYgbm8gbGV4ZXIgd2FzIGdpdmVuLCB3ZSB3aWxsIHRyeSB0byB1c2UgdGhlIGxleCBtb2R1bGUKKyAgICAgICAgaWYgbm90IGxleGVyOgorICAgICAgICAgICAgbGV4ID0gbG9hZF9wbHlfbGV4KCkKKyAgICAgICAgICAgIGxleGVyID0gbGV4LmxleGVyCisKKyAgICAgICAgIyBTZXQgdXAgdGhlIGxleGVyIGFuZCBwYXJzZXIgb2JqZWN0cyBvbiBwc2xpY2UKKyAgICAgICAgcHNsaWNlLmxleGVyID0gbGV4ZXIKKyAgICAgICAgcHNsaWNlLnBhcnNlciA9IHNlbGYKKworICAgICAgICAjIElmIGlucHV0IHdhcyBzdXBwbGllZCwgcGFzcyB0byBsZXhlcgorICAgICAgICBpZiBpbnB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxleGVyLmlucHV0KGlucHV0KQorCisgICAgICAgIGlmIHRva2VuZnVuYyBpcyBOb25lOgorICAgICAgICAgICAjIFRva2VuaXplIGZ1bmN0aW9uCisgICAgICAgICAgIGdldF90b2tlbiA9IGxleGVyLnRva2VuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIGdldF90b2tlbiA9IHRva2VuZnVuYworCisgICAgICAgICMgU2V0IHVwIHRoZSBzdGF0ZSBhbmQgc3ltYm9sIHN0YWNrcworCisgICAgICAgIHN0YXRlc3RhY2sgPSBbIF0gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBwYXJzaW5nIHN0YXRlcworICAgICAgICBzZWxmLnN0YXRlc3RhY2sgPSBzdGF0ZXN0YWNrCisgICAgICAgIHN5bXN0YWNrICAgPSBbIF0gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBncmFtbWFyIHN5bWJvbHMKKyAgICAgICAgc2VsZi5zeW1zdGFjayA9IHN5bXN0YWNrCisKKyAgICAgICAgcHNsaWNlLnN0YWNrID0gc3ltc3RhY2sgICAgICAgICAjIFB1dCBpbiB0aGUgcHJvZHVjdGlvbgorICAgICAgICBlcnJ0b2tlbiAgID0gTm9uZSAgICAgICAgICAgICAgICMgRXJyIHRva2VuCisKKyAgICAgICAgIyBUaGUgc3RhcnQgc3RhdGUgaXMgYXNzdW1lZCB0byBiZSAoMCwkZW5kKQorCisgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKDApCisgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICBzeW0udHlwZSA9ICIkZW5kIgorICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgR2V0IHRoZSBuZXh0IHN5bWJvbCBvbiB0aGUgaW5wdXQuICBJZiBhIGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgICAgICMgaXMgYWxyZWFkeSBzZXQsIHdlIGp1c3QgdXNlIHRoYXQuIE90aGVyd2lzZSwgd2UnbGwgcHVsbAorICAgICAgICAgICAgIyB0aGUgbmV4dCB0b2tlbiBvZmYgb2YgdGhlIGxvb2thaGVhZHN0YWNrIG9yIGZyb20gdGhlIGxleGVyCisKKyAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICBkZWJ1Zy5kZWJ1ZygnJykKKyAgICAgICAgICAgIGRlYnVnLmRlYnVnKCdTdGF0ZSAgOiAlcycsIHN0YXRlKQorICAgICAgICAgICAgIyAtLSEgREVCVUcKKworICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgbG9va2FoZWFkc3RhY2s6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGdldF90b2tlbigpICAgICAjIEdldCB0aGUgbmV4dCB0b2tlbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IGxvb2thaGVhZHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZDoKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZC50eXBlID0gIiRlbmQiCisKKyAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICBkZWJ1Zy5kZWJ1ZygnU3RhY2sgIDogJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgKCIlcyAuICVzIiAlICgiICIuam9pbihbeHgudHlwZSBmb3IgeHggaW4gc3ltc3RhY2tdWzE6XSksIHN0cihsb29rYWhlYWQpKSkubHN0cmlwKCkpCisgICAgICAgICAgICAjIC0tISBERUJVRworCisgICAgICAgICAgICAjIENoZWNrIHRoZSBhY3Rpb24gdGFibGUKKyAgICAgICAgICAgIGx0eXBlID0gbG9va2FoZWFkLnR5cGUKKyAgICAgICAgICAgIHQgPSBhY3Rpb25zW3N0YXRlXS5nZXQobHR5cGUpCisKKyAgICAgICAgICAgIGlmIHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgdCA+IDA6CisgICAgICAgICAgICAgICAgICAgICMgc2hpZnQgYSBzeW1ib2wgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gdAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgZGVidWcuZGVidWcoIkFjdGlvbiA6IFNoaWZ0IGFuZCBnb3RvIHN0YXRlICVzIiwgdCkKKyAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKworICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgIyBEZWNyZWFzZSBlcnJvciBjb3VudCBvbiBzdWNjZXNzZnVsIHNoaWZ0CisgICAgICAgICAgICAgICAgICAgIGlmIGVycm9yY291bnQ6IGVycm9yY291bnQgLT0xCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiB0IDwgMDoKKyAgICAgICAgICAgICAgICAgICAgIyByZWR1Y2UgYSBzeW1ib2wgb24gdGhlIHN0YWNrLCBlbWl0IGEgcHJvZHVjdGlvbgorICAgICAgICAgICAgICAgICAgICBwID0gcHJvZFstdF0KKyAgICAgICAgICAgICAgICAgICAgcG5hbWUgPSBwLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgcGxlbiAgPSBwLmxlbgorCisgICAgICAgICAgICAgICAgICAgICMgR2V0IHByb2R1Y3Rpb24gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgc3ltID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIHN5bS50eXBlID0gcG5hbWUgICAgICAgIyBQcm9kdWN0aW9uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgc3ltLnZhbHVlID0gTm9uZQorCisgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgIGlmIHBsZW46CisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5pbmZvKCJBY3Rpb24gOiBSZWR1Y2UgcnVsZSBbJXNdIHdpdGggJXMgYW5kIGdvdG8gc3RhdGUgJWQiLCBwLnN0ciwgIlsiKyIsIi5qb2luKFtmb3JtYXRfc3RhY2tfZW50cnkoX3YudmFsdWUpIGZvciBfdiBpbiBzeW1zdGFja1stcGxlbjpdXSkrIl0iLC10KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygiQWN0aW9uIDogUmVkdWNlIHJ1bGUgWyVzXSB3aXRoICVzIGFuZCBnb3RvIHN0YXRlICVkIiwgcC5zdHIsIFtdLC10KQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmcgPSBzeW1zdGFja1stcGxlbi0xOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdbMF0gPSBzeW0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgVFJBQ0tJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSB0YXJnWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGluZW5vID0gdDEubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGV4cG9zID0gdDEubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHRhcmdbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGluZW5vID0gZ2V0YXR0cih0MSwiZW5kbGluZW5vIix0MS5saW5lbm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGV4cG9zID0gZ2V0YXR0cih0MSwiZW5kbGV4cG9zIix0MS5sZXhwb3MpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIFRSQUNLSU5HCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgZW5jbG9zZWQgaW4gdGhpcyBzZWN0aW9uIGlzIGR1cGxpY2F0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlbG93IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoYW5nZXMgZ2V0IG1hZGUgaW4gYm90aCBsb2NhdGlvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzbGljZS5zbGljZSA9IHRhcmcKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbCB0aGUgZ3JhbW1hciBydWxlIHdpdGggb3VyIHNwZWNpYWwgc2xpY2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHN5bXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3RhdGVzdGFja1stcGxlbjpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYWxsYWJsZShwc2xpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5pbmZvKCJSZXN1bHQgOiAlcyIsIGZvcm1hdF9yZXN1bHQocHNsaWNlWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gc3ltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCA9IGVycm9yX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKworICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgVFJBQ0tJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmxpbmVubyA9IGxleGVyLmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLmxleHBvcyA9IGxleGVyLmxleHBvcworICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgVFJBQ0tJTkcKKworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZyA9IFsgc3ltIF0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdmUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oIlJlc3VsdCA6ICVzIiwgZm9ybWF0X3Jlc3VsdChwc2xpY2VbMF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdvdG9bc3RhdGVzdGFja1stMV1dW3BuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgYW4gZXJyb3Igd2FzIHNldC4gRW50ZXIgZXJyb3IgcmVjb3Zlcnkgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWRzdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBzeW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisgICAgICAgICAgICAgICAgaWYgdCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBuID0gc3ltc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldGF0dHIobiwidmFsdWUiLE5vbmUpCisgICAgICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgICAgIGRlYnVnLmluZm8oIkRvbmUgICA6IFJldHVybmluZyAlcyIsIGZvcm1hdF9yZXN1bHQocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgZGVidWcuaW5mbygiUExZOiBQQVJTRSBERUJVRyBFTkQiKQorICAgICAgICAgICAgICAgICAgICAjIC0tISBERUJVRworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGlmIHQgPT0gTm9uZToKKworICAgICAgICAgICAgICAgICMgLS0hIERFQlVHCisgICAgICAgICAgICAgICAgZGVidWcuZXJyb3IoJ0Vycm9yICA6ICVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiVzIC4gJXMiICUgKCIgIi5qb2luKFt4eC50eXBlIGZvciB4eCBpbiBzeW1zdGFja11bMTpdKSwgc3RyKGxvb2thaGVhZCkpKS5sc3RyaXAoKSkKKyAgICAgICAgICAgICAgICAjIC0tISBERUJVRworCisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHNvbWUga2luZCBvZiBwYXJzaW5nIGVycm9yIGhlcmUuICBUbyBoYW5kbGUKKyAgICAgICAgICAgICAgICAjIHRoaXMsIHdlIGFyZSBnb2luZyB0byBwdXNoIHRoZSBjdXJyZW50IHRva2VuIG9udG8KKyAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbnN0YWNrIGFuZCByZXBsYWNlIGl0IHdpdGggYW4gJ2Vycm9yJyB0b2tlbi4KKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBhbnkgc3luY2hyb25pemF0aW9uIHJ1bGVzLCB0aGV5IG1heQorICAgICAgICAgICAgICAgICMgY2F0Y2ggaXQuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gYWRkaXRpb24gdG8gcHVzaGluZyB0aGUgZXJyb3IgdG9rZW4sIHdlIGNhbGwgY2FsbAorICAgICAgICAgICAgICAgICMgdGhlIHVzZXIgZGVmaW5lZCBwX2Vycm9yKCkgZnVuY3Rpb24gaWYgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAjIGZpcnN0IHN5bnRheCBlcnJvci4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYKKyAgICAgICAgICAgICAgICAjIGVycm9yY291bnQgPT0gMC4KKyAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50ID09IDAgb3Igc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gMAorICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbi50eXBlID09ICIkZW5kIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZSAgICAgICAgICAgICAgICMgRW5kIG9mIGZpbGUhCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JmdW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIGVycm9rLHRva2VuLHJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9rID0gc2VsZi5lcnJvayAgICAgICAgIyBTZXQgc29tZSBzcGVjaWFsIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gZ2V0X3Rva2VuCisgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0ID0gc2VsZi5yZXN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbiBhbmQgbm90IGhhc2F0dHIoZXJydG9rZW4sJ2xleGVyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4ubGV4ZXIgPSBsZXhlcgorICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gc2VsZi5lcnJvcmZ1bmMoZXJydG9rZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgZXJyb2ssIHRva2VuLCByZXN0YXJ0ICAgIyBEZWxldGUgc3BlY2lhbCBmdW5jdGlvbnMKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlciBtdXN0IGhhdmUgZG9uZSBzb21lIGtpbmQgb2YgcGFuaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1vZGUgcmVjb3Zlcnkgb24gdGhlaXIgb3duLiAgVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXR1cm5lZCB0b2tlbiBpcyB0aGUgbmV4dCBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSB0b2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlcnJ0b2tlbiwibGluZW5vIik6IGxpbmVubyA9IGxvb2thaGVhZC5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOiBsaW5lbm8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ5YWNjOiBTeW50YXggZXJyb3IgYXQgbGluZSAlZCwgdG9rZW49JXNcbiIgJSAobGluZW5vLCBlcnJ0b2tlbi50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ5YWNjOiBTeW50YXggZXJyb3IsIHRva2VuPSVzIiAlIGVycnRva2VuLnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFBhcnNlIGVycm9yIGluIGlucHV0LiBFT0ZcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKworICAgICAgICAgICAgICAgICMgY2FzZSAxOiAgdGhlIHN0YXRlc3RhY2sgb25seSBoYXMgMSBlbnRyeSBvbiBpdC4gIElmIHdlJ3JlIGluIHRoaXMgc3RhdGUsIHRoZQorICAgICAgICAgICAgICAgICMgZW50aXJlIHBhcnNlIGhhcyBiZWVuIHJvbGxlZCBiYWNrIGFuZCB3ZSdyZSBjb21wbGV0ZWx5IGhvc2VkLiAgIFRoZSB0b2tlbiBpcworICAgICAgICAgICAgICAgICMgZGlzY2FyZGVkIGFuZCB3ZSBqdXN0IGtlZXAgZ29pbmcuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RhdGVzdGFjaykgPD0gMSBhbmQgbG9va2FoZWFkLnR5cGUgIT0gIiRlbmQiOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgIyBOdWtlIHRoZSBwdXNoYmFjayBzdGFjaworICAgICAgICAgICAgICAgICAgICBkZWwgbG9va2FoZWFkc3RhY2tbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgY2FzZSAyOiB0aGUgc3RhdGVzdGFjayBoYXMgYSBjb3VwbGUgb2YgZW50cmllcyBvbiBpdCwgYnV0IHdlJ3JlCisgICAgICAgICAgICAgICAgIyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBudWtlIHRoZSB0b3AgZW50cnkgYW5kIGdlbmVyYXRlIGFuIGVycm9yIHRva2VuCisKKyAgICAgICAgICAgICAgICAjIFN0YXJ0IG51a2luZyBlbnRyaWVzIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlID09ICIkZW5kIjoKKyAgICAgICAgICAgICAgICAgICAgIyBXaG9hLiBXZSdyZSByZWFsbHkgaG9zZWQgaGVyZS4gQmFpbCBvdXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsb29rYWhlYWQudHlwZSAhPSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgc3ltLnR5cGUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gRXJyb3IgaXMgb24gdG9wIG9mIHN0YWNrLCB3ZSdsbCBqdXN0IG51a2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3ltYm9sIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgdCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9va2FoZWFkLCJsaW5lbm8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubGluZW5vID0gbG9va2FoZWFkLmxpbmVubworICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0gICAgICAgIyBQb3RlbnRpYWwgYnVnIGZpeAorCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBDYWxsIGFuIGVycm9yIGZ1bmN0aW9uIGhlcmUKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigieWFjYzogaW50ZXJuYWwgcGFyc2VyIGVycm9yISEhXG4iKQorCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICMgcGFyc2VvcHQoKS4KKyAgICAjCisgICAgIyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiBwYXJzZSgpIG1ldGhvZC4gIERPIE5PVCBFRElUIFRISVMgQ09ERSBESVJFQ1RMWS4KKyAgICAjIEVkaXQgdGhlIGRlYnVnIHZlcnNpb24gYWJvdmUsIHRoZW4gY29weSBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgbWV0aG9kCisgICAgIyBiZWxvdyB3aGlsZSByZW1vdmluZyAjLS0hIERFQlVHIHNlY3Rpb25zLgorICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworCisgICAgZGVmIHBhcnNlb3B0KHNlbGYsaW5wdXQ9Tm9uZSxsZXhlcj1Ob25lLGRlYnVnPTAsdHJhY2tpbmc9MCx0b2tlbmZ1bmM9Tm9uZSk6CisgICAgICAgIGxvb2thaGVhZCA9IE5vbmUgICAgICAgICAgICAgICAgICMgQ3VycmVudCBsb29rYWhlYWQgc3ltYm9sCisgICAgICAgIGxvb2thaGVhZHN0YWNrID0gWyBdICAgICAgICAgICAgICMgU3RhY2sgb2YgbG9va2FoZWFkIHN5bWJvbHMKKyAgICAgICAgYWN0aW9ucyA9IHNlbGYuYWN0aW9uICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gYWN0aW9uIHRhYmxlICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIGdvdG8gICAgPSBzZWxmLmdvdG8gICAgICAgICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIGdvdG8gdGFibGUgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgcHJvZCAgICA9IHNlbGYucHJvZHVjdGlvbnMgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gcHJvZHVjdGlvbiBsaXN0ICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIHBzbGljZSAgPSBZYWNjUHJvZHVjdGlvbihOb25lKSAgICMgUHJvZHVjdGlvbiBvYmplY3QgcGFzc2VkIHRvIGdyYW1tYXIgcnVsZXMKKyAgICAgICAgZXJyb3Jjb3VudCA9IDAgICAgICAgICAgICAgICAgICAgIyBVc2VkIGR1cmluZyBlcnJvciByZWNvdmVyeSAKKworICAgICAgICAjIElmIG5vIGxleGVyIHdhcyBnaXZlbiwgd2Ugd2lsbCB0cnkgdG8gdXNlIHRoZSBsZXggbW9kdWxlCisgICAgICAgIGlmIG5vdCBsZXhlcjoKKyAgICAgICAgICAgIGxleCA9IGxvYWRfcGx5X2xleCgpCisgICAgICAgICAgICBsZXhlciA9IGxleC5sZXhlcgorICAgICAgICAKKyAgICAgICAgIyBTZXQgdXAgdGhlIGxleGVyIGFuZCBwYXJzZXIgb2JqZWN0cyBvbiBwc2xpY2UKKyAgICAgICAgcHNsaWNlLmxleGVyID0gbGV4ZXIKKyAgICAgICAgcHNsaWNlLnBhcnNlciA9IHNlbGYKKworICAgICAgICAjIElmIGlucHV0IHdhcyBzdXBwbGllZCwgcGFzcyB0byBsZXhlcgorICAgICAgICBpZiBpbnB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxleGVyLmlucHV0KGlucHV0KQorCisgICAgICAgIGlmIHRva2VuZnVuYyBpcyBOb25lOgorICAgICAgICAgICAjIFRva2VuaXplIGZ1bmN0aW9uCisgICAgICAgICAgIGdldF90b2tlbiA9IGxleGVyLnRva2VuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIGdldF90b2tlbiA9IHRva2VuZnVuYworCisgICAgICAgICMgU2V0IHVwIHRoZSBzdGF0ZSBhbmQgc3ltYm9sIHN0YWNrcworCisgICAgICAgIHN0YXRlc3RhY2sgPSBbIF0gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBwYXJzaW5nIHN0YXRlcworICAgICAgICBzZWxmLnN0YXRlc3RhY2sgPSBzdGF0ZXN0YWNrCisgICAgICAgIHN5bXN0YWNrICAgPSBbIF0gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBncmFtbWFyIHN5bWJvbHMKKyAgICAgICAgc2VsZi5zeW1zdGFjayA9IHN5bXN0YWNrCisKKyAgICAgICAgcHNsaWNlLnN0YWNrID0gc3ltc3RhY2sgICAgICAgICAjIFB1dCBpbiB0aGUgcHJvZHVjdGlvbgorICAgICAgICBlcnJ0b2tlbiAgID0gTm9uZSAgICAgICAgICAgICAgICMgRXJyIHRva2VuCisKKyAgICAgICAgIyBUaGUgc3RhcnQgc3RhdGUgaXMgYXNzdW1lZCB0byBiZSAoMCwkZW5kKQorCisgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKDApCisgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICBzeW0udHlwZSA9ICckZW5kJworICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgR2V0IHRoZSBuZXh0IHN5bWJvbCBvbiB0aGUgaW5wdXQuICBJZiBhIGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgICAgICMgaXMgYWxyZWFkeSBzZXQsIHdlIGp1c3QgdXNlIHRoYXQuIE90aGVyd2lzZSwgd2UnbGwgcHVsbAorICAgICAgICAgICAgIyB0aGUgbmV4dCB0b2tlbiBvZmYgb2YgdGhlIGxvb2thaGVhZHN0YWNrIG9yIGZyb20gdGhlIGxleGVyCisKKyAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZHN0YWNrOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBnZXRfdG9rZW4oKSAgICAgIyBHZXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBsb29rYWhlYWRzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQudHlwZSA9ICckZW5kJworCisgICAgICAgICAgICAjIENoZWNrIHRoZSBhY3Rpb24gdGFibGUKKyAgICAgICAgICAgIGx0eXBlID0gbG9va2FoZWFkLnR5cGUKKyAgICAgICAgICAgIHQgPSBhY3Rpb25zW3N0YXRlXS5nZXQobHR5cGUpCisKKyAgICAgICAgICAgIGlmIHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgdCA+IDA6CisgICAgICAgICAgICAgICAgICAgICMgc2hpZnQgYSBzeW1ib2wgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gdAorCisgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKworICAgICAgICAgICAgICAgICAgICAjIERlY3JlYXNlIGVycm9yIGNvdW50IG9uIHN1Y2Nlc3NmdWwgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyb3Jjb3VudDogZXJyb3Jjb3VudCAtPTEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHQgPCAwOgorICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSBhIHN5bWJvbCBvbiB0aGUgc3RhY2ssIGVtaXQgYSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHAgPSBwcm9kWy10XQorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHAubmFtZQorICAgICAgICAgICAgICAgICAgICBwbGVuICA9IHAubGVuCisKKyAgICAgICAgICAgICAgICAgICAgIyBHZXQgcHJvZHVjdGlvbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSBwbmFtZSAgICAgICAjIFByb2R1Y3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBzeW0udmFsdWUgPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmcgPSBzeW1zdGFja1stcGxlbi0xOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdbMF0gPSBzeW0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAtLSEgVFJBQ0tJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRyYWNraW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSB0YXJnWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGluZW5vID0gdDEubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGV4cG9zID0gdDEubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSA9IHRhcmdbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGluZW5vID0gZ2V0YXR0cih0MSwiZW5kbGluZW5vIix0MS5saW5lbm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0uZW5kbGV4cG9zID0gZ2V0YXR0cih0MSwiZW5kbGV4cG9zIix0MS5sZXhwb3MpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgLS0hIFRSQUNLSU5HCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgZW5jbG9zZWQgaW4gdGhpcyBzZWN0aW9uIGlzIGR1cGxpY2F0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlbG93IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoYW5nZXMgZ2V0IG1hZGUgaW4gYm90aCBsb2NhdGlvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzbGljZS5zbGljZSA9IHRhcmcKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbCB0aGUgZ3JhbW1hciBydWxlIHdpdGggb3VyIHNwZWNpYWwgc2xpY2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHN5bXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3RhdGVzdGFja1stcGxlbjpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYWxsYWJsZShwc2xpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdvdG9bc3RhdGVzdGFja1stMV1dW3BuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgYW4gZXJyb3Igd2FzIHNldC4gRW50ZXIgZXJyb3IgcmVjb3Zlcnkgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWRzdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBzeW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgIAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBUUkFDS0lORworICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHJhY2tpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGluZW5vID0gbGV4ZXIubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0ubGV4cG9zID0gbGV4ZXIubGV4cG9zCisgICAgICAgICAgICAgICAgICAgICAgICAjIC0tISBUUkFDS0lORworCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnID0gWyBzeW0gXQorCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGVuY2xvc2VkIGluIHRoaXMgc2VjdGlvbiBpcyBkdXBsaWNhdGVkIAorICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm92ZSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi4gIE1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2VzIGdldCBtYWRlIGluIGJvdGggbG9jYXRpb25zLgorCisgICAgICAgICAgICAgICAgICAgICAgICBwc2xpY2Uuc2xpY2UgPSB0YXJnCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgdGhlIGdyYW1tYXIgcnVsZSB3aXRoIG91ciBzcGVjaWFsIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuY2FsbGFibGUocHNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChzeW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBnb3RvW3N0YXRlc3RhY2tbLTFdXVtwbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElmIGFuIGVycm9yIHdhcyBzZXQuIEVudGVyIGVycm9yIHJlY292ZXJ5IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gc3ltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jjb3VudCA9IGVycm9yX2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworICAgICAgICAgICAgICAgIGlmIHQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbiA9IHN5bXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihuLCJ2YWx1ZSIsTm9uZSkKKworICAgICAgICAgICAgaWYgdCA9PSBOb25lOgorCisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHNvbWUga2luZCBvZiBwYXJzaW5nIGVycm9yIGhlcmUuICBUbyBoYW5kbGUKKyAgICAgICAgICAgICAgICAjIHRoaXMsIHdlIGFyZSBnb2luZyB0byBwdXNoIHRoZSBjdXJyZW50IHRva2VuIG9udG8KKyAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbnN0YWNrIGFuZCByZXBsYWNlIGl0IHdpdGggYW4gJ2Vycm9yJyB0b2tlbi4KKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBhbnkgc3luY2hyb25pemF0aW9uIHJ1bGVzLCB0aGV5IG1heQorICAgICAgICAgICAgICAgICMgY2F0Y2ggaXQuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gYWRkaXRpb24gdG8gcHVzaGluZyB0aGUgZXJyb3IgdG9rZW4sIHdlIGNhbGwgY2FsbAorICAgICAgICAgICAgICAgICMgdGhlIHVzZXIgZGVmaW5lZCBwX2Vycm9yKCkgZnVuY3Rpb24gaWYgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAjIGZpcnN0IHN5bnRheCBlcnJvci4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYKKyAgICAgICAgICAgICAgICAjIGVycm9yY291bnQgPT0gMC4KKyAgICAgICAgICAgICAgICBpZiBlcnJvcmNvdW50ID09IDAgb3Igc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm9rID0gMAorICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbi50eXBlID09ICckZW5kJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZSAgICAgICAgICAgICAgICMgRW5kIG9mIGZpbGUhCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JmdW5jOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIGVycm9rLHRva2VuLHJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9rID0gc2VsZi5lcnJvayAgICAgICAgIyBTZXQgc29tZSBzcGVjaWFsIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gZXJyb3IgcmVjb3ZlcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gZ2V0X3Rva2VuCisgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0ID0gc2VsZi5yZXN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbiBhbmQgbm90IGhhc2F0dHIoZXJydG9rZW4sJ2xleGVyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4ubGV4ZXIgPSBsZXhlcgorICAgICAgICAgICAgICAgICAgICAgICAgdG9rID0gc2VsZi5lcnJvcmZ1bmMoZXJydG9rZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgZXJyb2ssIHRva2VuLCByZXN0YXJ0ICAgIyBEZWxldGUgc3BlY2lhbCBmdW5jdGlvbnMKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcm9rOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlciBtdXN0IGhhdmUgZG9uZSBzb21lIGtpbmQgb2YgcGFuaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1vZGUgcmVjb3Zlcnkgb24gdGhlaXIgb3duLiAgVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXR1cm5lZCB0b2tlbiBpcyB0aGUgbmV4dCBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSB0b2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbiA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJydG9rZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlcnJ0b2tlbiwibGluZW5vIik6IGxpbmVubyA9IGxvb2thaGVhZC5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOiBsaW5lbm8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ5YWNjOiBTeW50YXggZXJyb3IgYXQgbGluZSAlZCwgdG9rZW49JXNcbiIgJSAobGluZW5vLCBlcnJ0b2tlbi50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ5YWNjOiBTeW50YXggZXJyb3IsIHRva2VuPSVzIiAlIGVycnRva2VuLnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFBhcnNlIGVycm9yIGluIGlucHV0LiBFT0ZcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKworICAgICAgICAgICAgICAgICMgY2FzZSAxOiAgdGhlIHN0YXRlc3RhY2sgb25seSBoYXMgMSBlbnRyeSBvbiBpdC4gIElmIHdlJ3JlIGluIHRoaXMgc3RhdGUsIHRoZQorICAgICAgICAgICAgICAgICMgZW50aXJlIHBhcnNlIGhhcyBiZWVuIHJvbGxlZCBiYWNrIGFuZCB3ZSdyZSBjb21wbGV0ZWx5IGhvc2VkLiAgIFRoZSB0b2tlbiBpcworICAgICAgICAgICAgICAgICMgZGlzY2FyZGVkIGFuZCB3ZSBqdXN0IGtlZXAgZ29pbmcuCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RhdGVzdGFjaykgPD0gMSBhbmQgbG9va2FoZWFkLnR5cGUgIT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgIyBOdWtlIHRoZSBwdXNoYmFjayBzdGFjaworICAgICAgICAgICAgICAgICAgICBkZWwgbG9va2FoZWFkc3RhY2tbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICMgY2FzZSAyOiB0aGUgc3RhdGVzdGFjayBoYXMgYSBjb3VwbGUgb2YgZW50cmllcyBvbiBpdCwgYnV0IHdlJ3JlCisgICAgICAgICAgICAgICAgIyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBudWtlIHRoZSB0b3AgZW50cnkgYW5kIGdlbmVyYXRlIGFuIGVycm9yIHRva2VuCisKKyAgICAgICAgICAgICAgICAjIFN0YXJ0IG51a2luZyBlbnRyaWVzIG9uIHRoZSBzdGFjaworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlID09ICckZW5kJzoKKyAgICAgICAgICAgICAgICAgICAgIyBXaG9hLiBXZSdyZSByZWFsbHkgaG9zZWQgaGVyZS4gQmFpbCBvdXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBsb29rYWhlYWQudHlwZSAhPSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBzeW1zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgc3ltLnR5cGUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gRXJyb3IgaXMgb24gdG9wIG9mIHN0YWNrLCB3ZSdsbCBqdXN0IG51a2UgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3ltYm9sIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgdCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9va2FoZWFkLCJsaW5lbm8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubGluZW5vID0gbG9va2FoZWFkLmxpbmVubworICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0gICAgICAgIyBQb3RlbnRpYWwgYnVnIGZpeAorCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBDYWxsIGFuIGVycm9yIGZ1bmN0aW9uIGhlcmUKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigieWFjYzogaW50ZXJuYWwgcGFyc2VyIGVycm9yISEhXG4iKQorCisgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICMgcGFyc2VvcHRfbm90cmFjaygpLgorICAgICMKKyAgICAjIE9wdGltaXplZCB2ZXJzaW9uIG9mIHBhcnNlb3B0KCkgd2l0aCBsaW5lIG51bWJlciB0cmFja2luZyByZW1vdmVkLiAKKyAgICAjIERPIE5PVCBFRElUIFRISVMgQ09ERSBESVJFQ1RMWS4gQ29weSB0aGUgb3B0aW1pemVkIHZlcnNpb24gYW5kIHJlbW92ZQorICAgICMgY29kZSBpbiB0aGUgIy0tISBUUkFDS0lORyBzZWN0aW9ucworICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKworICAgIGRlZiBwYXJzZW9wdF9ub3RyYWNrKHNlbGYsaW5wdXQ9Tm9uZSxsZXhlcj1Ob25lLGRlYnVnPTAsdHJhY2tpbmc9MCx0b2tlbmZ1bmM9Tm9uZSk6CisgICAgICAgIGxvb2thaGVhZCA9IE5vbmUgICAgICAgICAgICAgICAgICMgQ3VycmVudCBsb29rYWhlYWQgc3ltYm9sCisgICAgICAgIGxvb2thaGVhZHN0YWNrID0gWyBdICAgICAgICAgICAgICMgU3RhY2sgb2YgbG9va2FoZWFkIHN5bWJvbHMKKyAgICAgICAgYWN0aW9ucyA9IHNlbGYuYWN0aW9uICAgICAgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gYWN0aW9uIHRhYmxlICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIGdvdG8gICAgPSBzZWxmLmdvdG8gICAgICAgICAgICAgICMgTG9jYWwgcmVmZXJlbmNlIHRvIGdvdG8gdGFibGUgKHRvIGF2b2lkIGxvb2t1cCBvbiBzZWxmLikKKyAgICAgICAgcHJvZCAgICA9IHNlbGYucHJvZHVjdGlvbnMgICAgICAgIyBMb2NhbCByZWZlcmVuY2UgdG8gcHJvZHVjdGlvbiBsaXN0ICh0byBhdm9pZCBsb29rdXAgb24gc2VsZi4pCisgICAgICAgIHBzbGljZSAgPSBZYWNjUHJvZHVjdGlvbihOb25lKSAgICMgUHJvZHVjdGlvbiBvYmplY3QgcGFzc2VkIHRvIGdyYW1tYXIgcnVsZXMKKyAgICAgICAgZXJyb3Jjb3VudCA9IDAgICAgICAgICAgICAgICAgICAgIyBVc2VkIGR1cmluZyBlcnJvciByZWNvdmVyeSAKKworICAgICAgICAjIElmIG5vIGxleGVyIHdhcyBnaXZlbiwgd2Ugd2lsbCB0cnkgdG8gdXNlIHRoZSBsZXggbW9kdWxlCisgICAgICAgIGlmIG5vdCBsZXhlcjoKKyAgICAgICAgICAgIGxleCA9IGxvYWRfcGx5X2xleCgpCisgICAgICAgICAgICBsZXhlciA9IGxleC5sZXhlcgorICAgICAgICAKKyAgICAgICAgIyBTZXQgdXAgdGhlIGxleGVyIGFuZCBwYXJzZXIgb2JqZWN0cyBvbiBwc2xpY2UKKyAgICAgICAgcHNsaWNlLmxleGVyID0gbGV4ZXIKKyAgICAgICAgcHNsaWNlLnBhcnNlciA9IHNlbGYKKworICAgICAgICAjIElmIGlucHV0IHdhcyBzdXBwbGllZCwgcGFzcyB0byBsZXhlcgorICAgICAgICBpZiBpbnB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxleGVyLmlucHV0KGlucHV0KQorCisgICAgICAgIGlmIHRva2VuZnVuYyBpcyBOb25lOgorICAgICAgICAgICAjIFRva2VuaXplIGZ1bmN0aW9uCisgICAgICAgICAgIGdldF90b2tlbiA9IGxleGVyLnRva2VuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIGdldF90b2tlbiA9IHRva2VuZnVuYworCisgICAgICAgICMgU2V0IHVwIHRoZSBzdGF0ZSBhbmQgc3ltYm9sIHN0YWNrcworCisgICAgICAgIHN0YXRlc3RhY2sgPSBbIF0gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBwYXJzaW5nIHN0YXRlcworICAgICAgICBzZWxmLnN0YXRlc3RhY2sgPSBzdGF0ZXN0YWNrCisgICAgICAgIHN5bXN0YWNrICAgPSBbIF0gICAgICAgICAgICAgICAgIyBTdGFjayBvZiBncmFtbWFyIHN5bWJvbHMKKyAgICAgICAgc2VsZi5zeW1zdGFjayA9IHN5bXN0YWNrCisKKyAgICAgICAgcHNsaWNlLnN0YWNrID0gc3ltc3RhY2sgICAgICAgICAjIFB1dCBpbiB0aGUgcHJvZHVjdGlvbgorICAgICAgICBlcnJ0b2tlbiAgID0gTm9uZSAgICAgICAgICAgICAgICMgRXJyIHRva2VuCisKKyAgICAgICAgIyBUaGUgc3RhcnQgc3RhdGUgaXMgYXNzdW1lZCB0byBiZSAoMCwkZW5kKQorCisgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKDApCisgICAgICAgIHN5bSA9IFlhY2NTeW1ib2woKQorICAgICAgICBzeW0udHlwZSA9ICckZW5kJworICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgR2V0IHRoZSBuZXh0IHN5bWJvbCBvbiB0aGUgaW5wdXQuICBJZiBhIGxvb2thaGVhZCBzeW1ib2wKKyAgICAgICAgICAgICMgaXMgYWxyZWFkeSBzZXQsIHdlIGp1c3QgdXNlIHRoYXQuIE90aGVyd2lzZSwgd2UnbGwgcHVsbAorICAgICAgICAgICAgIyB0aGUgbmV4dCB0b2tlbiBvZmYgb2YgdGhlIGxvb2thaGVhZHN0YWNrIG9yIGZyb20gdGhlIGxleGVyCisKKyAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgaWYgbm90IGxvb2thaGVhZHN0YWNrOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBnZXRfdG9rZW4oKSAgICAgIyBHZXQgdGhlIG5leHQgdG9rZW4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBsb29rYWhlYWRzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsb29rYWhlYWQ6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IFlhY2NTeW1ib2woKQorICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQudHlwZSA9ICckZW5kJworCisgICAgICAgICAgICAjIENoZWNrIHRoZSBhY3Rpb24gdGFibGUKKyAgICAgICAgICAgIGx0eXBlID0gbG9va2FoZWFkLnR5cGUKKyAgICAgICAgICAgIHQgPSBhY3Rpb25zW3N0YXRlXS5nZXQobHR5cGUpCisKKyAgICAgICAgICAgIGlmIHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgdCA+IDA6CisgICAgICAgICAgICAgICAgICAgICMgc2hpZnQgYSBzeW1ib2wgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gdAorCisgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKworICAgICAgICAgICAgICAgICAgICAjIERlY3JlYXNlIGVycm9yIGNvdW50IG9uIHN1Y2Nlc3NmdWwgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyb3Jjb3VudDogZXJyb3Jjb3VudCAtPTEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmIHQgPCAwOgorICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSBhIHN5bWJvbCBvbiB0aGUgc3RhY2ssIGVtaXQgYSBwcm9kdWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHAgPSBwcm9kWy10XQorICAgICAgICAgICAgICAgICAgICBwbmFtZSA9IHAubmFtZQorICAgICAgICAgICAgICAgICAgICBwbGVuICA9IHAubGVuCisKKyAgICAgICAgICAgICAgICAgICAgIyBHZXQgcHJvZHVjdGlvbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICBzeW0gPSBZYWNjU3ltYm9sKCkKKyAgICAgICAgICAgICAgICAgICAgc3ltLnR5cGUgPSBwbmFtZSAgICAgICAjIFByb2R1Y3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBzeW0udmFsdWUgPSBOb25lCisKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmcgPSBzeW1zdGFja1stcGxlbi0xOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdbMF0gPSBzeW0KKworICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBlbmNsb3NlZCBpbiB0aGlzIHNlY3Rpb24gaXMgZHVwbGljYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVsb3cgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uICBNYWtlIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hhbmdlcyBnZXQgbWFkZSBpbiBib3RoIGxvY2F0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICAgICAgcHNsaWNlLnNsaWNlID0gdGFyZworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsIHRoZSBncmFtbWFyIHJ1bGUgd2l0aCBvdXIgc3BlY2lhbCBzbGljZSBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc3ltc3RhY2tbLXBsZW46XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzdGF0ZXN0YWNrWy1wbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxhYmxlKHBzbGljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zdGFjay5hcHBlbmQoc3ltKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gZ290b1tzdGF0ZXN0YWNrWy0xXV1bcG5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5hcHBlbmQoc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBhbiBlcnJvciB3YXMgc2V0LiBFbnRlciBlcnJvciByZWNvdmVyeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZHN0YWNrLmFwcGVuZChsb29rYWhlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bS50eXBlID0gJ2Vycm9yJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHN5bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JvayA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhCisgICAgCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmcgPSBbIHN5bSBdCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGNvZGUgZW5jbG9zZWQgaW4gdGhpcyBzZWN0aW9uIGlzIGR1cGxpY2F0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAjIGFib3ZlIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLiAgTWFrZSBzdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoYW5nZXMgZ2V0IG1hZGUgaW4gYm90aCBsb2NhdGlvbnMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzbGljZS5zbGljZSA9IHRhcmcKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbCB0aGUgZ3JhbW1hciBydWxlIHdpdGggb3VyIHNwZWNpYWwgc2xpY2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYWxsYWJsZShwc2xpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltc3RhY2suYXBwZW5kKHN5bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdvdG9bc3RhdGVzdGFja1stMV1dW3BuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2suYXBwZW5kKHN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgYW4gZXJyb3Igd2FzIHNldC4gRW50ZXIgZXJyb3IgcmVjb3Zlcnkgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWRzdGFjay5hcHBlbmQobG9va2FoZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW0udHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBzeW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmNvdW50ID0gZXJyb3JfY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisgICAgICAgICAgICAgICAgaWYgdCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBuID0gc3ltc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKG4sInZhbHVlIixOb25lKQorCisgICAgICAgICAgICBpZiB0ID09IE5vbmU6CisKKyAgICAgICAgICAgICAgICAjIFdlIGhhdmUgc29tZSBraW5kIG9mIHBhcnNpbmcgZXJyb3IgaGVyZS4gIFRvIGhhbmRsZQorICAgICAgICAgICAgICAgICMgdGhpcywgd2UgYXJlIGdvaW5nIHRvIHB1c2ggdGhlIGN1cnJlbnQgdG9rZW4gb250bworICAgICAgICAgICAgICAgICMgdGhlIHRva2Vuc3RhY2sgYW5kIHJlcGxhY2UgaXQgd2l0aCBhbiAnZXJyb3InIHRva2VuLgorICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgYXJlIGFueSBzeW5jaHJvbml6YXRpb24gcnVsZXMsIHRoZXkgbWF5CisgICAgICAgICAgICAgICAgIyBjYXRjaCBpdC4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBJbiBhZGRpdGlvbiB0byBwdXNoaW5nIHRoZSBlcnJvciB0b2tlbiwgd2UgY2FsbCBjYWxsCisgICAgICAgICAgICAgICAgIyB0aGUgdXNlciBkZWZpbmVkIHBfZXJyb3IoKSBmdW5jdGlvbiBpZiB0aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICMgZmlyc3Qgc3ludGF4IGVycm9yLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZgorICAgICAgICAgICAgICAgICMgZXJyb3Jjb3VudCA9PSAwLgorICAgICAgICAgICAgICAgIGlmIGVycm9yY291bnQgPT0gMCBvciBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yb2sgPSAwCisgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gbG9va2FoZWFkCisgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuLnR5cGUgPT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lICAgICAgICAgICAgICAgIyBFbmQgb2YgZmlsZSEKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmZ1bmM6CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgZXJyb2ssdG9rZW4scmVzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb2sgPSBzZWxmLmVycm9rICAgICAgICAjIFNldCBzb21lIHNwZWNpYWwgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiBlcnJvciByZWNvdmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBnZXRfdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnQgPSBzZWxmLnJlc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycnRva2VuIGFuZCBub3QgaGFzYXR0cihlcnJ0b2tlbiwnbGV4ZXInKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJ0b2tlbi5sZXhlciA9IGxleGVyCisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSBzZWxmLmVycm9yZnVuYyhlcnJ0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBlcnJvaywgdG9rZW4sIHJlc3RhcnQgICAjIERlbGV0ZSBzcGVjaWFsIGZ1bmN0aW9ucworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9yb2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyIG11c3QgaGF2ZSBkb25lIHNvbWUga2luZCBvZiBwYW5pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZSByZWNvdmVyeSBvbiB0aGVpciBvd24uICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybmVkIHRva2VuIGlzIHRoZSBuZXh0IGxvb2thaGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IHRvaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnRva2VuID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ0b2tlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycnRva2VuLCJsaW5lbm8iKTogbGluZW5vID0gbG9va2FoZWFkLmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6IGxpbmVubyA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFN5bnRheCBlcnJvciBhdCBsaW5lICVkLCB0b2tlbj0lc1xuIiAlIChsaW5lbm8sIGVycnRva2VuLnR5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInlhY2M6IFN5bnRheCBlcnJvciwgdG9rZW49JXMiICUgZXJydG9rZW4udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgieWFjYzogUGFyc2UgZXJyb3IgaW4gaW5wdXQuIEVPRlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVycm9yY291bnQgPSBlcnJvcl9jb3VudAorCisgICAgICAgICAgICAgICAgIyBjYXNlIDE6ICB0aGUgc3RhdGVzdGFjayBvbmx5IGhhcyAxIGVudHJ5IG9uIGl0LiAgSWYgd2UncmUgaW4gdGhpcyBzdGF0ZSwgdGhlCisgICAgICAgICAgICAgICAgIyBlbnRpcmUgcGFyc2UgaGFzIGJlZW4gcm9sbGVkIGJhY2sgYW5kIHdlJ3JlIGNvbXBsZXRlbHkgaG9zZWQuICAgVGhlIHRva2VuIGlzCisgICAgICAgICAgICAgICAgIyBkaXNjYXJkZWQgYW5kIHdlIGp1c3Qga2VlcCBnb2luZy4KKworICAgICAgICAgICAgICAgIGlmIGxlbihzdGF0ZXN0YWNrKSA8PSAxIGFuZCBsb29rYWhlYWQudHlwZSAhPSAnJGVuZCc6CisgICAgICAgICAgICAgICAgICAgIGxvb2thaGVhZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZXJydG9rZW4gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMAorICAgICAgICAgICAgICAgICAgICAjIE51a2UgdGhlIHB1c2hiYWNrIHN0YWNrCisgICAgICAgICAgICAgICAgICAgIGRlbCBsb29rYWhlYWRzdGFja1s6XQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyBjYXNlIDI6IHRoZSBzdGF0ZXN0YWNrIGhhcyBhIGNvdXBsZSBvZiBlbnRyaWVzIG9uIGl0LCBidXQgd2UncmUKKyAgICAgICAgICAgICAgICAjIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIG51a2UgdGhlIHRvcCBlbnRyeSBhbmQgZ2VuZXJhdGUgYW4gZXJyb3IgdG9rZW4KKworICAgICAgICAgICAgICAgICMgU3RhcnQgbnVraW5nIGVudHJpZXMgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgaWYgbG9va2FoZWFkLnR5cGUgPT0gJyRlbmQnOgorICAgICAgICAgICAgICAgICAgICAjIFdob2EuIFdlJ3JlIHJlYWxseSBob3NlZCBoZXJlLiBCYWlsIG91dAorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGlmIGxvb2thaGVhZC50eXBlICE9ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHN5bSA9IHN5bXN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICBpZiBzeW0udHlwZSA9PSAnZXJyb3InOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBIbW1tLiBFcnJvciBpcyBvbiB0b3Agb2Ygc3RhY2ssIHdlJ2xsIGp1c3QgbnVrZSBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgIyBzeW1ib2wgYW5kIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBsb29rYWhlYWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0ID0gWWFjY1N5bWJvbCgpCisgICAgICAgICAgICAgICAgICAgIHQudHlwZSA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb29rYWhlYWQsImxpbmVubyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgdC5saW5lbm8gPSBsb29rYWhlYWQubGluZW5vCisgICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBsb29rYWhlYWQKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkc3RhY2suYXBwZW5kKGxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgbG9va2FoZWFkID0gdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN5bXN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXN0YWNrWy0xXSAgICAgICAjIFBvdGVudGlhbCBidWcgZml4CisKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIENhbGwgYW4gZXJyb3IgZnVuY3Rpb24gaGVyZQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ5YWNjOiBpbnRlcm5hbCBwYXJzZXIgZXJyb3IhISFcbiIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBHcmFtbWFyIFJlcHJlc2VudGF0aW9uID09PQorIworIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucywgY2xhc3NlcywgYW5kIHZhcmlhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW5kCisjIG1hbmlwdWxhdGUgdGhlIHJ1bGVzIHRoYXQgbWFrZSB1cCBhIGdyYW1tYXIuIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgcmUKKworIyByZWdleCBtYXRjaGluZyBpZGVudGlmaWVycworX2lzX2lkZW50aWZpZXIgPSByZS5jb21waWxlKHInXlthLXpBLVowLTlfLV0rJCcpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2xhc3MgUHJvZHVjdGlvbjoKKyMKKyMgVGhpcyBjbGFzcyBzdG9yZXMgdGhlIHJhdyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBwcm9kdWN0aW9uIG9yIGdyYW1tYXIgcnVsZS4KKyMgQSBncmFtbWFyIHJ1bGUgcmVmZXJzIHRvIGEgc3BlY2lmaWNhdGlvbiBzdWNoIGFzIHRoaXM6CisjCisjICAgICAgIGV4cHIgOiBleHByIFBMVVMgdGVybSAKKyMKKyMgSGVyZSBhcmUgdGhlIGJhc2ljIGF0dHJpYnV0ZXMgZGVmaW5lZCBvbiBhbGwgcHJvZHVjdGlvbnMKKyMKKyMgICAgICAgbmFtZSAgICAgLSBOYW1lIG9mIHRoZSBwcm9kdWN0aW9uLiAgRm9yIGV4YW1wbGUgJ2V4cHInCisjICAgICAgIHByb2QgICAgIC0gQSBsaXN0IG9mIHN5bWJvbHMgb24gdGhlIHJpZ2h0IHNpZGUgWydleHByJywnUExVUycsJ3Rlcm0nXQorIyAgICAgICBwcmVjICAgICAtIFByb2R1Y3Rpb24gcHJlY2VkZW5jZSBsZXZlbAorIyAgICAgICBudW1iZXIgICAtIFByb2R1Y3Rpb24gbnVtYmVyLgorIyAgICAgICBmdW5jICAgICAtIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgb24gcmVkdWNlCisjICAgICAgIGZpbGUgICAgIC0gRmlsZSB3aGVyZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyMgICAgICAgbGluZW5vICAgLSBMaW5lIG51bWJlciB3aGVyZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIGlzIGRlZmluZWQKKyMKKyMgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIG9yIG9wdGlvbmFsLgorIworIyAgICAgICBsZW4gICAgICAgLSBMZW5ndGggb2YgdGhlIHByb2R1Y3Rpb24gKG51bWJlciBvZiBzeW1ib2xzIG9uIHJpZ2h0IGhhbmQgc2lkZSkKKyMgICAgICAgdXN5bXMgICAgIC0gU2V0IG9mIHVuaXF1ZSBzeW1ib2xzIGZvdW5kIGluIHRoZSBwcm9kdWN0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFByb2R1Y3Rpb24ob2JqZWN0KToKKyAgICByZWR1Y2VkID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLG51bWJlcixuYW1lLHByb2QscHJlY2VkZW5jZT0oJ3JpZ2h0JywwKSxmdW5jPU5vbmUsZmlsZT0nJyxsaW5lPTApOgorICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZQorICAgICAgICBzZWxmLnByb2QgICAgID0gdHVwbGUocHJvZCkKKyAgICAgICAgc2VsZi5udW1iZXIgICA9IG51bWJlcgorICAgICAgICBzZWxmLmZ1bmMgICAgID0gZnVuYworICAgICAgICBzZWxmLmNhbGxhYmxlID0gTm9uZQorICAgICAgICBzZWxmLmZpbGUgICAgID0gZmlsZQorICAgICAgICBzZWxmLmxpbmUgICAgID0gbGluZQorICAgICAgICBzZWxmLnByZWMgICAgID0gcHJlY2VkZW5jZQorCisgICAgICAgICMgSW50ZXJuYWwgc2V0dGluZ3MgdXNlZCBkdXJpbmcgdGFibGUgY29uc3RydWN0aW9uCisgICAgICAgIAorICAgICAgICBzZWxmLmxlbiAgPSBsZW4oc2VsZi5wcm9kKSAgICMgTGVuZ3RoIG9mIHRoZSBwcm9kdWN0aW9uCisKKyAgICAgICAgIyBDcmVhdGUgYSBsaXN0IG9mIHVuaXF1ZSBwcm9kdWN0aW9uIHN5bWJvbHMgdXNlZCBpbiB0aGUgcHJvZHVjdGlvbgorICAgICAgICBzZWxmLnVzeW1zID0gWyBdICAgICAgICAgICAgIAorICAgICAgICBmb3IgcyBpbiBzZWxmLnByb2Q6CisgICAgICAgICAgICBpZiBzIG5vdCBpbiBzZWxmLnVzeW1zOgorICAgICAgICAgICAgICAgIHNlbGYudXN5bXMuYXBwZW5kKHMpCisKKyAgICAgICAgIyBMaXN0IG9mIGFsbCBMUiBpdGVtcyBmb3IgdGhlIHByb2R1Y3Rpb24KKyAgICAgICAgc2VsZi5scl9pdGVtcyA9IFtdCisgICAgICAgIHNlbGYubHJfbmV4dCA9IE5vbmUKKworICAgICAgICAjIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAgICBpZiBzZWxmLnByb2Q6CisgICAgICAgICAgICBzZWxmLnN0ciA9ICIlcyAtPiAlcyIgJSAoc2VsZi5uYW1lLCIgIi5qb2luKHNlbGYucHJvZCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0ciA9ICIlcyAtPiA8ZW1wdHk+IiAlIHNlbGYubmFtZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0cgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlByb2R1Y3Rpb24oIitzdHIoc2VsZikrIikiCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnByb2QpCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnByb2RbaW5kZXhdCisgICAgICAgICAgICAKKyAgICAjIFJldHVybiB0aGUgbnRoIGxyX2l0ZW0gZnJvbSB0aGUgcHJvZHVjdGlvbiAob3IgTm9uZSBpZiBhdCB0aGUgZW5kKQorICAgIGRlZiBscl9pdGVtKHNlbGYsbik6CisgICAgICAgIGlmIG4gPiBsZW4oc2VsZi5wcm9kKTogcmV0dXJuIE5vbmUKKyAgICAgICAgcCA9IExSSXRlbShzZWxmLG4pCisKKyAgICAgICAgIyBQcmVjb21wdXRlIHRoZSBsaXN0IG9mIHByb2R1Y3Rpb25zIGltbWVkaWF0ZWx5IGZvbGxvd2luZy4gIEhhY2suIFJlbW92ZSBsYXRlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwLmxyX2FmdGVyID0gUHJvZG5hbWVzW3AucHJvZFtuKzFdXQorICAgICAgICBleGNlcHQgKEluZGV4RXJyb3IsS2V5RXJyb3IpOgorICAgICAgICAgICAgcC5scl9hZnRlciA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAubHJfYmVmb3JlID0gcC5wcm9kW24tMV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwLmxyX2JlZm9yZSA9IE5vbmUKKworICAgICAgICByZXR1cm4gcAorICAgIAorICAgICMgQmluZCB0aGUgcHJvZHVjdGlvbiBmdW5jdGlvbiBuYW1lIHRvIGEgY2FsbGFibGUKKyAgICBkZWYgYmluZChzZWxmLHBkaWN0KToKKyAgICAgICAgaWYgc2VsZi5mdW5jOgorICAgICAgICAgICAgc2VsZi5jYWxsYWJsZSA9IHBkaWN0W3NlbGYuZnVuY10KKworIyBUaGlzIGNsYXNzIHNlcnZlcyBhcyBhIG1pbmltYWwgc3RhbmRpbiBmb3IgUHJvZHVjdGlvbiBvYmplY3RzIHdoZW4KKyMgcmVhZGluZyB0YWJsZSBkYXRhIGZyb20gZmlsZXMuICAgSXQgb25seSBjb250YWlucyBpbmZvcm1hdGlvbgorIyBhY3R1YWxseSB1c2VkIGJ5IHRoZSBMUiBwYXJzaW5nIGVuZ2luZSwgcGx1cyBzb21lIGFkZGl0aW9uYWwKKyMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorY2xhc3MgTWluaVByb2R1Y3Rpb24ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZixzdHIsbmFtZSxsZW4sZnVuYyxmaWxlLGxpbmUpOgorICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZQorICAgICAgICBzZWxmLmxlbiAgICAgID0gbGVuCisgICAgICAgIHNlbGYuZnVuYyAgICAgPSBmdW5jCisgICAgICAgIHNlbGYuY2FsbGFibGUgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZSAgICAgPSBmaWxlCisgICAgICAgIHNlbGYubGluZSAgICAgPSBsaW5lCisgICAgICAgIHNlbGYuc3RyICAgICAgPSBzdHIKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk1pbmlQcm9kdWN0aW9uKCVzKSIgJSBzZWxmLnN0cgorCisgICAgIyBCaW5kIHRoZSBwcm9kdWN0aW9uIGZ1bmN0aW9uIG5hbWUgdG8gYSBjYWxsYWJsZQorICAgIGRlZiBiaW5kKHNlbGYscGRpY3QpOgorICAgICAgICBpZiBzZWxmLmZ1bmM6CisgICAgICAgICAgICBzZWxmLmNhbGxhYmxlID0gcGRpY3Rbc2VsZi5mdW5jXQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY2xhc3MgTFJJdGVtCisjCisjIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNwZWNpZmljIHN0YWdlIG9mIHBhcnNpbmcgYSBwcm9kdWN0aW9uIHJ1bGUuICBGb3IKKyMgZXhhbXBsZTogCisjCisjICAgICAgIGV4cHIgOiBleHByIC4gUExVUyB0ZXJtIAorIworIyBJbiB0aGUgYWJvdmUsIHRoZSAiLiIgcmVwcmVzZW50cyB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgcGFyc2UuICBIZXJlCisjIGJhc2ljIGF0dHJpYnV0ZXM6CisjCisjICAgICAgIG5hbWUgICAgICAgLSBOYW1lIG9mIHRoZSBwcm9kdWN0aW9uLiAgRm9yIGV4YW1wbGUgJ2V4cHInCisjICAgICAgIHByb2QgICAgICAgLSBBIGxpc3Qgb2Ygc3ltYm9scyBvbiB0aGUgcmlnaHQgc2lkZSBbJ2V4cHInLCcuJywgJ1BMVVMnLCd0ZXJtJ10KKyMgICAgICAgbnVtYmVyICAgICAtIFByb2R1Y3Rpb24gbnVtYmVyLgorIworIyAgICAgICBscl9uZXh0ICAgICAgTmV4dCBMUiBpdGVtLiBFeGFtcGxlLCBpZiB3ZSBhcmUgJyBleHByIC0+IGV4cHIgLiBQTFVTIHRlcm0nCisjICAgICAgICAgICAgICAgICAgICB0aGVuIGxyX25leHQgcmVmZXJzIHRvICdleHByIC0+IGV4cHIgUExVUyAuIHRlcm0nCisjICAgICAgIGxyX2luZGV4ICAgLSBMUiBpdGVtIGluZGV4IChsb2NhdGlvbiBvZiB0aGUgIi4iKSBpbiB0aGUgcHJvZCBsaXN0LgorIyAgICAgICBsb29rYWhlYWRzIC0gTEFMUiBsb29rYWhlYWQgc3ltYm9scyBmb3IgdGhpcyBpdGVtCisjICAgICAgIGxlbiAgICAgICAgLSBMZW5ndGggb2YgdGhlIHByb2R1Y3Rpb24gKG51bWJlciBvZiBzeW1ib2xzIG9uIHJpZ2h0IGhhbmQgc2lkZSkKKyMgICAgICAgbHJfYWZ0ZXIgICAgLSBMaXN0IG9mIGFsbCBwcm9kdWN0aW9ucyB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvdworIyAgICAgICBscl9iZWZvcmUgICAtIEdyYW1tYXIgc3ltYm9sIGltbWVkaWF0ZWx5IGJlZm9yZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMUkl0ZW0ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZixwLG4pOgorICAgICAgICBzZWxmLm5hbWUgICAgICAgPSBwLm5hbWUKKyAgICAgICAgc2VsZi5wcm9kICAgICAgID0gbGlzdChwLnByb2QpCisgICAgICAgIHNlbGYubnVtYmVyICAgICA9IHAubnVtYmVyCisgICAgICAgIHNlbGYubHJfaW5kZXggICA9IG4KKyAgICAgICAgc2VsZi5sb29rYWhlYWRzID0geyB9CisgICAgICAgIHNlbGYucHJvZC5pbnNlcnQobiwiLiIpCisgICAgICAgIHNlbGYucHJvZCAgICAgICA9IHR1cGxlKHNlbGYucHJvZCkKKyAgICAgICAgc2VsZi5sZW4gICAgICAgID0gbGVuKHNlbGYucHJvZCkKKyAgICAgICAgc2VsZi51c3ltcyAgICAgID0gcC51c3ltcworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYucHJvZDoKKyAgICAgICAgICAgIHMgPSAiJXMgLT4gJXMiICUgKHNlbGYubmFtZSwiICIuam9pbihzZWxmLnByb2QpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9ICIlcyAtPiA8ZW1wdHk+IiAlIHNlbGYubmFtZQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxSSXRlbSgiK3N0cihzZWxmKSsiKSIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyByaWdodG1vc3RfdGVybWluYWwoKQorIworIyBSZXR1cm4gdGhlIHJpZ2h0bW9zdCB0ZXJtaW5hbCBmcm9tIGEgbGlzdCBvZiBzeW1ib2xzLiAgVXNlZCBpbiBhZGRfcHJvZHVjdGlvbigpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgcmlnaHRtb3N0X3Rlcm1pbmFsKHN5bWJvbHMsIHRlcm1pbmFscyk6CisgICAgaSA9IGxlbihzeW1ib2xzKSAtIDEKKyAgICB3aGlsZSBpID49IDA6CisgICAgICAgIGlmIHN5bWJvbHNbaV0gaW4gdGVybWluYWxzOgorICAgICAgICAgICAgcmV0dXJuIHN5bWJvbHNbaV0KKyAgICAgICAgaSAtPSAxCisgICAgcmV0dXJuIE5vbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBHUkFNTUFSIENMQVNTID09PQorIworIyBUaGUgZm9sbG93aW5nIGNsYXNzIHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZ3JhbW1hciBhbG9uZworIyB3aXRoIHZhcmlvdXMgY29tcHV0ZWQgcHJvcGVydGllcyBzdWNoIGFzIGZpcnN0IHNldHMsIGZvbGxvdyBzZXRzLCBMUiBpdGVtcywgZXRjLgorIyBUaGlzIGRhdGEgaXMgdXNlZCBmb3IgY3JpdGljYWwgcGFydHMgb2YgdGhlIHRhYmxlIGdlbmVyYXRpb24gcHJvY2VzcyBsYXRlci4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgR3JhbW1hckVycm9yKFlhY2NFcnJvcik6IHBhc3MKKworY2xhc3MgR3JhbW1hcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHRlcm1pbmFscyk6CisgICAgICAgIHNlbGYuUHJvZHVjdGlvbnMgID0gW05vbmVdICAjIEEgbGlzdCBvZiBhbGwgb2YgdGhlIHByb2R1Y3Rpb25zLiAgVGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIGFsd2F5cyByZXNlcnZlZCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgYW4gYXVnbWVudGVkIGdyYW1tYXIKKworICAgICAgICBzZWxmLlByb2RuYW1lcyAgICA9IHsgfSAgICAgIyBBIGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgbmFtZXMgb2Ygbm9udGVybWluYWxzIHRvIGEgbGlzdCBvZiBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJvZHVjdGlvbnMgb2YgdGhhdCBub250ZXJtaW5hbC4KKworICAgICAgICBzZWxmLlByb2RtYXAgICAgICA9IHsgfSAgICAgIyBBIGRpY3Rpb25hcnkgdGhhdCBpcyBvbmx5IHVzZWQgdG8gZGV0ZWN0IGR1cGxpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcm9kdWN0aW9ucy4KKworICAgICAgICBzZWxmLlRlcm1pbmFscyAgICA9IHsgfSAgICAgIyBBIGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgbmFtZXMgb2YgdGVybWluYWwgc3ltYm9scyB0byBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgdGhlIHJ1bGVzIHdoZXJlIHRoZXkgYXJlIHVzZWQuCisKKyAgICAgICAgZm9yIHRlcm0gaW4gdGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5UZXJtaW5hbHNbdGVybV0gPSBbXQorCisgICAgICAgIHNlbGYuVGVybWluYWxzWydlcnJvciddID0gW10KKworICAgICAgICBzZWxmLk5vbnRlcm1pbmFscyA9IHsgfSAgICAgIyBBIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBvZiBub250ZXJtaW5hbHMgdG8gYSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIHJ1bGUgbnVtYmVycyB3aGVyZSB0aGV5IGFyZSB1c2VkLgorCisgICAgICAgIHNlbGYuRmlyc3QgICAgICAgID0geyB9ICAgICAjIEEgZGljdGlvbmFyeSBvZiBwcmVjb21wdXRlZCBGSVJTVCh4KSBzeW1ib2xzCisKKyAgICAgICAgc2VsZi5Gb2xsb3cgICAgICAgPSB7IH0gICAgICMgQSBkaWN0aW9uYXJ5IG9mIHByZWNvbXB1dGVkIEZPTExPVyh4KSBzeW1ib2xzCisKKyAgICAgICAgc2VsZi5QcmVjZWRlbmNlICAgPSB7IH0gICAgICMgUHJlY2VkZW5jZSBydWxlcyBmb3IgZWFjaCB0ZXJtaW5hbC4gQ29udGFpbnMgdHVwbGVzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3JtICgncmlnaHQnLGxldmVsKSBvciAoJ25vbmFzc29jJywgbGV2ZWwpIG9yICgnbGVmdCcsbGV2ZWwpCisKKyAgICAgICAgc2VsZi5Vc2VkUHJlY2VkZW5jZSA9IHsgfSAgICMgUHJlY2VkZW5jZSBydWxlcyB0aGF0IHdlcmUgYWN0dWFsbHkgdXNlZCBieSB0aGUgZ3JhbW1lci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBvbmx5IHVzZWQgdG8gcHJvdmlkZSBlcnJvciBjaGVja2luZyBhbmQgdG8gZ2VuZXJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSB3YXJuaW5nIGFib3V0IHVudXNlZCBwcmVjZWRlbmNlIHJ1bGVzLgorCisgICAgICAgIHNlbGYuU3RhcnQgPSBOb25lICAgICAgICAgICAjIFN0YXJ0aW5nIHN5bWJvbCBmb3IgdGhlIGdyYW1tYXIKKworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5Qcm9kdWN0aW9ucykKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuUHJvZHVjdGlvbnNbaW5kZXhdCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBzZXRfcHJlY2VkZW5jZSgpCisgICAgIworICAgICMgU2V0cyB0aGUgcHJlY2VkZW5jZSBmb3IgYSBnaXZlbiB0ZXJtaW5hbC4gYXNzb2MgaXMgdGhlIGFzc29jaWF0aXZpdHkgc3VjaCBhcworICAgICMgJ2xlZnQnLCdyaWdodCcsIG9yICdub25hc3NvYycuICBsZXZlbCBpcyBhIG51bWVyaWMgbGV2ZWwuCisgICAgIworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBzZXRfcHJlY2VkZW5jZShzZWxmLHRlcm0sYXNzb2MsbGV2ZWwpOgorICAgICAgICBhc3NlcnQgc2VsZi5Qcm9kdWN0aW9ucyA9PSBbTm9uZV0sIk11c3QgY2FsbCBzZXRfcHJlY2VkZW5jZSgpIGJlZm9yZSBhZGRfcHJvZHVjdGlvbigpIgorICAgICAgICBpZiB0ZXJtIGluIHNlbGYuUHJlY2VkZW5jZToKKyAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiUHJlY2VkZW5jZSBhbHJlYWR5IHNwZWNpZmllZCBmb3IgdGVybWluYWwgJyVzJyIgJSB0ZXJtKQorICAgICAgICBpZiBhc3NvYyBub3QgaW4gWydsZWZ0JywncmlnaHQnLCdub25hc3NvYyddOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCJBc3NvY2lhdGl2aXR5IG11c3QgYmUgb25lIG9mICdsZWZ0JywncmlnaHQnLCBvciAnbm9uYXNzb2MnIikKKyAgICAgICAgc2VsZi5QcmVjZWRlbmNlW3Rlcm1dID0gKGFzc29jLGxldmVsKQorIAorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGFkZF9wcm9kdWN0aW9uKCkKKyAgICAjCisgICAgIyBHaXZlbiBhbiBhY3Rpb24gZnVuY3Rpb24sIHRoaXMgZnVuY3Rpb24gYXNzZW1ibGVzIGEgcHJvZHVjdGlvbiBydWxlIGFuZAorICAgICMgY29tcHV0ZXMgaXRzIHByZWNlZGVuY2UgbGV2ZWwuCisgICAgIworICAgICMgVGhlIHByb2R1Y3Rpb24gcnVsZSBpcyBzdXBwbGllZCBhcyBhIGxpc3Qgb2Ygc3ltYm9scy4gICBGb3IgZXhhbXBsZSwKKyAgICAjIGEgcnVsZSBzdWNoIGFzICdleHByIDogZXhwciBQTFVTIHRlcm0nIGhhcyBhIHByb2R1Y3Rpb24gbmFtZSBvZiAnZXhwcicgYW5kCisgICAgIyBzeW1ib2xzIFsnZXhwcicsJ1BMVVMnLCd0ZXJtJ10uCisgICAgIworICAgICMgUHJlY2VkZW5jZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwcmVjZWRlbmNlIG9mIHRoZSByaWdodC1tb3N0IG5vbi10ZXJtaW5hbAorICAgICMgb3IgdGhlIHByZWNlZGVuY2Ugb2YgYSB0ZXJtaW5hbCBzcGVjaWZpZWQgYnkgJXByZWMuCisgICAgIworICAgICMgQSB2YXJpZXR5IG9mIGVycm9yIGNoZWNrcyBhcmUgcGVyZm9ybWVkIHRvIG1ha2Ugc3VyZSBwcm9kdWN0aW9uIHN5bWJvbHMKKyAgICAjIGFyZSB2YWxpZCBhbmQgdGhhdCAlcHJlYyBpcyB1c2VkIGNvcnJlY3RseS4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgYWRkX3Byb2R1Y3Rpb24oc2VsZixwcm9kbmFtZSxzeW1zLGZ1bmM9Tm9uZSxmaWxlPScnLGxpbmU9MCk6CisKKyAgICAgICAgaWYgcHJvZG5hbWUgaW4gc2VsZi5UZXJtaW5hbHM6CisgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIiVzOiVkOiBJbGxlZ2FsIHJ1bGUgbmFtZSAnJXMnLiBBbHJlYWR5IGRlZmluZWQgYXMgYSB0b2tlbiIgJSAoZmlsZSxsaW5lLHByb2RuYW1lKSkKKyAgICAgICAgaWYgcHJvZG5hbWUgPT0gJ2Vycm9yJzoKKyAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IElsbGVnYWwgcnVsZSBuYW1lICclcycuIGVycm9yIGlzIGEgcmVzZXJ2ZWQgd29yZCIgJSAoZmlsZSxsaW5lLHByb2RuYW1lKSkKKyAgICAgICAgaWYgbm90IF9pc19pZGVudGlmaWVyLm1hdGNoKHByb2RuYW1lKToKKyAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IElsbGVnYWwgcnVsZSBuYW1lICclcyciICUgKGZpbGUsbGluZSxwcm9kbmFtZSkpCisKKyAgICAgICAgIyBMb29rIGZvciBsaXRlcmFsIHRva2VucyAKKyAgICAgICAgZm9yIG4scyBpbiBlbnVtZXJhdGUoc3ltcyk6CisgICAgICAgICAgICBpZiBzWzBdIGluICInXCIiOgorICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICBjID0gZXZhbChzKQorICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihjKSA+IDEpOgorICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIiVzOiVkOiBMaXRlcmFsIHRva2VuICVzIGluIHJ1bGUgJyVzJyBtYXkgb25seSBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiICUgKGZpbGUsbGluZSxzLCBwcm9kbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICBpZiBub3QgYyBpbiBzZWxmLlRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5UZXJtaW5hbHNbY10gPSBbXQorICAgICAgICAgICAgICAgICAgICAgc3ltc1tuXSA9IGMKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIG5vdCBfaXNfaWRlbnRpZmllci5tYXRjaChzKSBhbmQgcyAhPSAnJXByZWMnOgorICAgICAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IElsbGVnYWwgbmFtZSAnJXMnIGluIHJ1bGUgJyVzJyIgJSAoZmlsZSxsaW5lLHMsIHByb2RuYW1lKSkKKyAgICAgICAgCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBwcmVjZWRlbmNlIGxldmVsCisgICAgICAgIGlmICclcHJlYycgaW4gc3ltczoKKyAgICAgICAgICAgIGlmIHN5bXNbLTFdID09ICclcHJlYyc6CisgICAgICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCIlczolZDogU3ludGF4IGVycm9yLiBOb3RoaW5nIGZvbGxvd3MgJSVwcmVjIiAlIChmaWxlLGxpbmUpKQorICAgICAgICAgICAgaWYgc3ltc1stMl0gIT0gJyVwcmVjJzoKKyAgICAgICAgICAgICAgICByYWlzZSBHcmFtbWFyRXJyb3IoIiVzOiVkOiBTeW50YXggZXJyb3IuICUlcHJlYyBjYW4gb25seSBhcHBlYXIgYXQgdGhlIGVuZCBvZiBhIGdyYW1tYXIgcnVsZSIgJSAoZmlsZSxsaW5lKSkKKyAgICAgICAgICAgIHByZWNuYW1lID0gc3ltc1stMV0KKyAgICAgICAgICAgIHByb2RwcmVjID0gc2VsZi5QcmVjZWRlbmNlLmdldChwcmVjbmFtZSxOb25lKQorICAgICAgICAgICAgaWYgbm90IHByb2RwcmVjOgorICAgICAgICAgICAgICAgIHJhaXNlIEdyYW1tYXJFcnJvcigiJXM6JWQ6IE5vdGhpbmcga25vd24gYWJvdXQgdGhlIHByZWNlZGVuY2Ugb2YgJyVzJyIgJSAoZmlsZSxsaW5lLHByZWNuYW1lKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5Vc2VkUHJlY2VkZW5jZVtwcmVjbmFtZV0gPSAxCisgICAgICAgICAgICBkZWwgc3ltc1stMjpdICAgICAjIERyb3AgJXByZWMgZnJvbSB0aGUgcnVsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiBubyAlcHJlYywgcHJlY2VkZW5jZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSByaWdodG1vc3QgdGVybWluYWwgc3ltYm9sCisgICAgICAgICAgICBwcmVjbmFtZSA9IHJpZ2h0bW9zdF90ZXJtaW5hbChzeW1zLHNlbGYuVGVybWluYWxzKQorICAgICAgICAgICAgcHJvZHByZWMgPSBzZWxmLlByZWNlZGVuY2UuZ2V0KHByZWNuYW1lLCgncmlnaHQnLDApKSAKKyAgICAgICAgICAgIAorICAgICAgICAjIFNlZSBpZiB0aGUgcnVsZSBpcyBhbHJlYWR5IGluIHRoZSBydWxlbWFwCisgICAgICAgIG1hcCA9ICIlcyAtPiAlcyIgJSAocHJvZG5hbWUsc3ltcykKKyAgICAgICAgaWYgbWFwIGluIHNlbGYuUHJvZG1hcDoKKyAgICAgICAgICAgIG0gPSBzZWxmLlByb2RtYXBbbWFwXQorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCIlczolZDogRHVwbGljYXRlIHJ1bGUgJXMuICIgJSAoZmlsZSxsaW5lLCBtKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXZpb3VzIGRlZmluaXRpb24gYXQgJXM6JWQiICUgKG0uZmlsZSwgbS5saW5lKSkKKworICAgICAgICAjIEZyb20gdGhpcyBwb2ludCBvbiwgZXZlcnl0aGluZyBpcyB2YWxpZC4gIENyZWF0ZSBhIG5ldyBQcm9kdWN0aW9uIGluc3RhbmNlCisgICAgICAgIHBudW1iZXIgID0gbGVuKHNlbGYuUHJvZHVjdGlvbnMpCisgICAgICAgIGlmIG5vdCBwcm9kbmFtZSBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgIHNlbGYuTm9udGVybWluYWxzW3Byb2RuYW1lXSA9IFsgXQorCisgICAgICAgICMgQWRkIHRoZSBwcm9kdWN0aW9uIG51bWJlciB0byBUZXJtaW5hbHMgYW5kIE5vbnRlcm1pbmFscworICAgICAgICBmb3IgdCBpbiBzeW1zOgorICAgICAgICAgICAgaWYgdCBpbiBzZWxmLlRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICBzZWxmLlRlcm1pbmFsc1t0XS5hcHBlbmQocG51bWJlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IHQgaW4gc2VsZi5Ob250ZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuTm9udGVybWluYWxzW3RdID0gWyBdCisgICAgICAgICAgICAgICAgc2VsZi5Ob250ZXJtaW5hbHNbdF0uYXBwZW5kKHBudW1iZXIpCisKKyAgICAgICAgIyBDcmVhdGUgYSBwcm9kdWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcHJvZHVjdGlvbnMKKyAgICAgICAgcCA9IFByb2R1Y3Rpb24ocG51bWJlcixwcm9kbmFtZSxzeW1zLHByb2RwcmVjLGZ1bmMsZmlsZSxsaW5lKQorICAgICAgICBzZWxmLlByb2R1Y3Rpb25zLmFwcGVuZChwKQorICAgICAgICBzZWxmLlByb2RtYXBbbWFwXSA9IHAKKworICAgICAgICAjIEFkZCB0byB0aGUgZ2xvYmFsIHByb2R1Y3Rpb25zIGxpc3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5Qcm9kbmFtZXNbcHJvZG5hbWVdLmFwcGVuZChwKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLlByb2RuYW1lc1twcm9kbmFtZV0gPSBbIHAgXQorICAgICAgICByZXR1cm4gMAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgc2V0X3N0YXJ0KCkKKyAgICAjCisgICAgIyBTZXRzIHRoZSBzdGFydGluZyBzeW1ib2wgYW5kIGNyZWF0ZXMgdGhlIGF1Z21lbnRlZCBncmFtbWFyLiAgUHJvZHVjdGlvbiAKKyAgICAjIHJ1bGUgMCBpcyBTJyAtPiBzdGFydCB3aGVyZSBzdGFydCBpcyB0aGUgc3RhcnQgc3ltYm9sLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBzZXRfc3RhcnQoc2VsZixzdGFydD1Ob25lKToKKyAgICAgICAgaWYgbm90IHN0YXJ0OgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLlByb2R1Y3Rpb25zWzFdLm5hbWUKKyAgICAgICAgaWYgc3RhcnQgbm90IGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgcmFpc2UgR3JhbW1hckVycm9yKCJzdGFydCBzeW1ib2wgJXMgdW5kZWZpbmVkIiAlIHN0YXJ0KQorICAgICAgICBzZWxmLlByb2R1Y3Rpb25zWzBdID0gUHJvZHVjdGlvbigwLCJTJyIsW3N0YXJ0XSkKKyAgICAgICAgc2VsZi5Ob250ZXJtaW5hbHNbc3RhcnRdLmFwcGVuZCgwKQorICAgICAgICBzZWxmLlN0YXJ0ID0gc3RhcnQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGZpbmRfdW5yZWFjaGFibGUoKQorICAgICMKKyAgICAjIEZpbmQgYWxsIG9mIHRoZSBub250ZXJtaW5hbCBzeW1ib2xzIHRoYXQgY2FuJ3QgYmUgcmVhY2hlZCBmcm9tIHRoZSBzdGFydGluZworICAgICMgc3ltYm9sLiAgUmV0dXJucyBhIGxpc3Qgb2Ygbm9udGVybWluYWxzIHRoYXQgY2FuJ3QgYmUgcmVhY2hlZC4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZmluZF91bnJlYWNoYWJsZShzZWxmKToKKyAgICAgICAgCisgICAgICAgICMgTWFyayBhbGwgc3ltYm9scyB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSBhIHN5bWJvbCBzCisgICAgICAgIGRlZiBtYXJrX3JlYWNoYWJsZV9mcm9tKHMpOgorICAgICAgICAgICAgaWYgcmVhY2hhYmxlW3NdOgorICAgICAgICAgICAgICAgICMgV2UndmUgYWxyZWFkeSByZWFjaGVkIHN5bWJvbCBzLgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmVhY2hhYmxlW3NdID0gMQorICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5Qcm9kbmFtZXMuZ2V0KHMsW10pOgorICAgICAgICAgICAgICAgIGZvciByIGluIHAucHJvZDoKKyAgICAgICAgICAgICAgICAgICAgbWFya19yZWFjaGFibGVfZnJvbShyKQorCisgICAgICAgIHJlYWNoYWJsZSAgID0geyB9CisgICAgICAgIGZvciBzIGluIGxpc3Qoc2VsZi5UZXJtaW5hbHMpICsgbGlzdChzZWxmLk5vbnRlcm1pbmFscyk6CisgICAgICAgICAgICByZWFjaGFibGVbc10gPSAwCisKKyAgICAgICAgbWFya19yZWFjaGFibGVfZnJvbSggc2VsZi5Qcm9kdWN0aW9uc1swXS5wcm9kWzBdICkKKworICAgICAgICByZXR1cm4gW3MgZm9yIHMgaW4gbGlzdChzZWxmLk5vbnRlcm1pbmFscykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFjaGFibGVbc11dCisgICAgCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgaW5maW5pdGVfY3ljbGVzKCkKKyAgICAjCisgICAgIyBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IHRoZSB2YXJpb3VzIHBhcnNpbmcgcnVsZXMgYW5kIHRyaWVzIHRvIGRldGVjdAorICAgICMgaW5maW5pdGUgcmVjdXJzaW9uIGN5Y2xlcyAoZ3JhbW1hciBydWxlcyB3aGVyZSB0aGVyZSBpcyBubyBwb3NzaWJsZSB3YXkKKyAgICAjIHRvIGRlcml2ZSBhIHN0cmluZyBvZiBvbmx5IHRlcm1pbmFscykuCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGluZmluaXRlX2N5Y2xlcyhzZWxmKToKKyAgICAgICAgdGVybWluYXRlcyA9IHt9CisKKyAgICAgICAgIyBUZXJtaW5hbHM6CisgICAgICAgIGZvciB0IGluIHNlbGYuVGVybWluYWxzOgorICAgICAgICAgICAgdGVybWluYXRlc1t0XSA9IDEKKworICAgICAgICB0ZXJtaW5hdGVzWyckZW5kJ10gPSAxCisKKyAgICAgICAgIyBOb250ZXJtaW5hbHM6CisKKyAgICAgICAgIyBJbml0aWFsaXplIHRvIGZhbHNlOgorICAgICAgICBmb3IgbiBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgIHRlcm1pbmF0ZXNbbl0gPSAwCisKKyAgICAgICAgIyBUaGVuIHByb3BhZ2F0ZSB0ZXJtaW5hdGlvbiB1bnRpbCBubyBjaGFuZ2U6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzb21lX2NoYW5nZSA9IDAKKyAgICAgICAgICAgIGZvciAobixwbCkgaW4gc2VsZi5Qcm9kbmFtZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAjIE5vbnRlcm1pbmFsIG4gdGVybWluYXRlcyBpZmYgYW55IG9mIGl0cyBwcm9kdWN0aW9ucyB0ZXJtaW5hdGVzLgorICAgICAgICAgICAgICAgIGZvciBwIGluIHBsOgorICAgICAgICAgICAgICAgICAgICAjIFByb2R1Y3Rpb24gcCB0ZXJtaW5hdGVzIGlmZiBhbGwgb2YgaXRzIHJocyBzeW1ib2xzIHRlcm1pbmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gcC5wcm9kOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRlcm1pbmF0ZXNbc106CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgc3ltYm9sIHMgZG9lcyBub3QgdGVybWluYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc28gcHJvZHVjdGlvbiBwIGRvZXMgbm90IHRlcm1pbmF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Rlcm1pbmF0ZXMgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZGlkbid0IGJyZWFrIGZyb20gdGhlIGxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAjIHNvIGV2ZXJ5IHN5bWJvbCBzIHRlcm1pbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc28gcHJvZHVjdGlvbiBwIHRlcm1pbmF0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBwX3Rlcm1pbmF0ZXMgPSAxCisKKyAgICAgICAgICAgICAgICAgICAgaWYgcF90ZXJtaW5hdGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzeW1ib2wgbiB0ZXJtaW5hdGVzIQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRlcm1pbmF0ZXNbbl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlc1tuXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lX2NoYW5nZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgbmVlZCB0byBjb25zaWRlciBhbnkgbW9yZSBwcm9kdWN0aW9ucyBmb3IgdGhpcyBuLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgbm90IHNvbWVfY2hhbmdlOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaW5maW5pdGUgPSBbXQorICAgICAgICBmb3IgKHMsdGVybSkgaW4gdGVybWluYXRlcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IHRlcm06CisgICAgICAgICAgICAgICAgaWYgbm90IHMgaW4gc2VsZi5Qcm9kbmFtZXMgYW5kIG5vdCBzIGluIHNlbGYuVGVybWluYWxzIGFuZCBzICE9ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgICMgcyBpcyB1c2VkLWJ1dC1ub3QtZGVmaW5lZCwgYW5kIHdlJ3ZlIGFscmVhZHkgd2FybmVkIG9mIHRoYXQsCisgICAgICAgICAgICAgICAgICAgICMgc28gaXQgd291bGQgYmUgb3ZlcmtpbGwgdG8gc2F5IHRoYXQgaXQncyBhbHNvIG5vbi10ZXJtaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGluZmluaXRlLmFwcGVuZChzKQorCisgICAgICAgIHJldHVybiBpbmZpbml0ZQorCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyB1bmRlZmluZWRfc3ltYm9scygpCisgICAgIworICAgICMgRmluZCBhbGwgc3ltYm9scyB0aGF0IHdlcmUgdXNlZCB0aGUgZ3JhbW1hciwgYnV0IG5vdCBkZWZpbmVkIGFzIHRva2VucyBvcgorICAgICMgZ3JhbW1hciBydWxlcy4gIFJldHVybnMgYSBsaXN0IG9mIHR1cGxlcyAoc3ltLCBwcm9kKSB3aGVyZSBzeW0gaW4gdGhlIHN5bWJvbAorICAgICMgYW5kIHByb2QgaXMgdGhlIHByb2R1Y3Rpb24gd2hlcmUgdGhlIHN5bWJvbCB3YXMgdXNlZC4gCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiB1bmRlZmluZWRfc3ltYm9scyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHAgaW4gc2VsZi5Qcm9kdWN0aW9uczoKKyAgICAgICAgICAgIGlmIG5vdCBwOiBjb250aW51ZQorCisgICAgICAgICAgICBmb3IgcyBpbiBwLnByb2Q6CisgICAgICAgICAgICAgICAgaWYgbm90IHMgaW4gc2VsZi5Qcm9kbmFtZXMgYW5kIG5vdCBzIGluIHNlbGYuVGVybWluYWxzIGFuZCBzICE9ICdlcnJvcic6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHMscCkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVudXNlZF90ZXJtaW5hbHMoKQorICAgICMKKyAgICAjIEZpbmQgYWxsIHRlcm1pbmFscyB0aGF0IHdlcmUgZGVmaW5lZCwgYnV0IG5vdCB1c2VkIGJ5IHRoZSBncmFtbWFyLiAgUmV0dXJucworICAgICMgYSBsaXN0IG9mIGFsbCBzeW1ib2xzLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgdW51c2VkX3Rlcm1pbmFscyhzZWxmKToKKyAgICAgICAgdW51c2VkX3RvayA9IFtdCisgICAgICAgIGZvciBzLHYgaW4gc2VsZi5UZXJtaW5hbHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHMgIT0gJ2Vycm9yJyBhbmQgbm90IHY6CisgICAgICAgICAgICAgICAgdW51c2VkX3Rvay5hcHBlbmQocykKKworICAgICAgICByZXR1cm4gdW51c2VkX3RvaworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVudXNlZF9ydWxlcygpCisgICAgIworICAgICMgRmluZCBhbGwgZ3JhbW1hciBydWxlcyB0aGF0IHdlcmUgZGVmaW5lZCwgIGJ1dCBub3QgdXNlZCAobWF5YmUgbm90IHJlYWNoYWJsZSkKKyAgICAjIFJldHVybnMgYSBsaXN0IG9mIHByb2R1Y3Rpb25zLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdW51c2VkX3J1bGVzKHNlbGYpOgorICAgICAgICB1bnVzZWRfcHJvZCA9IFtdCisgICAgICAgIGZvciBzLHYgaW4gc2VsZi5Ob250ZXJtaW5hbHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCB2OgorICAgICAgICAgICAgICAgIHAgPSBzZWxmLlByb2RuYW1lc1tzXVswXQorICAgICAgICAgICAgICAgIHVudXNlZF9wcm9kLmFwcGVuZChwKQorICAgICAgICByZXR1cm4gdW51c2VkX3Byb2QKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHVudXNlZF9wcmVjZWRlbmNlKCkKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgKHRlcm0scHJlY2VkZW5jZSkgY29ycmVzcG9uZGluZyB0byBwcmVjZWRlbmNlCisgICAgIyBydWxlcyB0aGF0IHdlcmUgbmV2ZXIgdXNlZCBieSB0aGUgZ3JhbW1hci4gIHRlcm0gaXMgdGhlIG5hbWUgb2YgdGhlIHRlcm1pbmFsCisgICAgIyBvbiB3aGljaCBwcmVjZWRlbmNlIHdhcyBhcHBsaWVkIGFuZCBwcmVjZWRlbmNlIGlzIGEgc3RyaW5nIHN1Y2ggYXMgJ2xlZnQnIG9yCisgICAgIyAncmlnaHQnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgb2YgcHJlY2VkZW5jZS4gCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHVudXNlZF9wcmVjZWRlbmNlKHNlbGYpOgorICAgICAgICB1bnVzZWQgPSBbXQorICAgICAgICBmb3IgdGVybW5hbWUgaW4gc2VsZi5QcmVjZWRlbmNlOgorICAgICAgICAgICAgaWYgbm90ICh0ZXJtbmFtZSBpbiBzZWxmLlRlcm1pbmFscyBvciB0ZXJtbmFtZSBpbiBzZWxmLlVzZWRQcmVjZWRlbmNlKToKKyAgICAgICAgICAgICAgICB1bnVzZWQuYXBwZW5kKCh0ZXJtbmFtZSxzZWxmLlByZWNlZGVuY2VbdGVybW5hbWVdWzBdKSkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIHVudXNlZAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBfZmlyc3QoKQorICAgICMKKyAgICAjIENvbXB1dGUgdGhlIHZhbHVlIG9mIEZJUlNUMShiZXRhKSB3aGVyZSBiZXRhIGlzIGEgdHVwbGUgb2Ygc3ltYm9scy4KKyAgICAjCisgICAgIyBEdXJpbmcgZXhlY3V0aW9uIG9mIGNvbXB1dGVfZmlyc3QxLCB0aGUgcmVzdWx0IG1heSBiZSBpbmNvbXBsZXRlLgorICAgICMgQWZ0ZXJ3YXJkIChlLmcuLCB3aGVuIGNhbGxlZCBmcm9tIGNvbXB1dGVfZm9sbG93KCkpLCBpdCB3aWxsIGJlIGNvbXBsZXRlLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBfZmlyc3Qoc2VsZixiZXRhKToKKworICAgICAgICAjIFdlIGFyZSBjb21wdXRpbmcgRmlyc3QoeDEseDIseDMsLi4uLHhuKQorICAgICAgICByZXN1bHQgPSBbIF0KKyAgICAgICAgZm9yIHggaW4gYmV0YToKKyAgICAgICAgICAgIHhfcHJvZHVjZXNfZW1wdHkgPSAwCisKKyAgICAgICAgICAgICMgQWRkIGFsbCB0aGUgbm9uLTxlbXB0eT4gc3ltYm9scyBvZiBGaXJzdFt4XSB0byB0aGUgcmVzdWx0LgorICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5GaXJzdFt4XToKKyAgICAgICAgICAgICAgICBpZiBmID09ICc8ZW1wdHk+JzoKKyAgICAgICAgICAgICAgICAgICAgeF9wcm9kdWNlc19lbXB0eSA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBmIG5vdCBpbiByZXN1bHQ6IHJlc3VsdC5hcHBlbmQoZikKKworICAgICAgICAgICAgaWYgeF9wcm9kdWNlc19lbXB0eToKKyAgICAgICAgICAgICAgICAjIFdlIGhhdmUgdG8gY29uc2lkZXIgdGhlIG5leHQgeCBpbiBiZXRhLAorICAgICAgICAgICAgICAgICMgaS5lLiBzdGF5IGluIHRoZSBsb29wLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBXZSBkb24ndCBoYXZlIHRvIGNvbnNpZGVyIGFueSBmdXJ0aGVyIHN5bWJvbHMgaW4gYmV0YS4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGVyZSB3YXMgbm8gJ2JyZWFrJyBmcm9tIHRoZSBsb29wLAorICAgICAgICAgICAgIyBzbyB4X3Byb2R1Y2VzX2VtcHR5IHdhcyB0cnVlIGZvciBhbGwgeCBpbiBiZXRhLAorICAgICAgICAgICAgIyBzbyBiZXRhIHByb2R1Y2VzIGVtcHR5IGFzIHdlbGwuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc8ZW1wdHk+JykKKworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNvbXB1dGVfZmlyc3QoKQorICAgICMKKyAgICAjIENvbXB1dGUgdGhlIHZhbHVlIG9mIEZJUlNUMShYKSBmb3IgYWxsIHN5bWJvbHMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgY29tcHV0ZV9maXJzdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5GaXJzdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkZpcnN0CisKKyAgICAgICAgIyBUZXJtaW5hbHM6CisgICAgICAgIGZvciB0IGluIHNlbGYuVGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5GaXJzdFt0XSA9IFt0XQorCisgICAgICAgIHNlbGYuRmlyc3RbJyRlbmQnXSA9IFsnJGVuZCddCisKKyAgICAgICAgIyBOb250ZXJtaW5hbHM6CisKKyAgICAgICAgIyBJbml0aWFsaXplIHRvIHRoZSBlbXB0eSBzZXQ6CisgICAgICAgIGZvciBuIGluIHNlbGYuTm9udGVybWluYWxzOgorICAgICAgICAgICAgc2VsZi5GaXJzdFtuXSA9IFtdCisKKyAgICAgICAgIyBUaGVuIHByb3BhZ2F0ZSBzeW1ib2xzIHVudGlsIG5vIGNoYW5nZToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHNvbWVfY2hhbmdlID0gMAorICAgICAgICAgICAgZm9yIG4gaW4gc2VsZi5Ob250ZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5Qcm9kbmFtZXNbbl06CisgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIHNlbGYuX2ZpcnN0KHAucHJvZCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLkZpcnN0W25dOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRmlyc3Rbbl0uYXBwZW5kKCBmICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lX2NoYW5nZSA9IDEKKyAgICAgICAgICAgIGlmIG5vdCBzb21lX2NoYW5nZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNlbGYuRmlyc3QKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX2ZvbGxvdygpCisgICAgIworICAgICMgQ29tcHV0ZXMgYWxsIG9mIHRoZSBmb2xsb3cgc2V0cyBmb3IgZXZlcnkgbm9uLXRlcm1pbmFsIHN5bWJvbC4gIFRoZQorICAgICMgZm9sbG93IHNldCBpcyB0aGUgc2V0IG9mIGFsbCBzeW1ib2xzIHRoYXQgbWlnaHQgZm9sbG93IGEgZ2l2ZW4KKyAgICAjIG5vbi10ZXJtaW5hbC4gIFNlZSB0aGUgRHJhZ29uIGJvb2ssIDJuZCBFZC4gcC4gMTg5LgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIGNvbXB1dGVfZm9sbG93KHNlbGYsc3RhcnQ9Tm9uZSk6CisgICAgICAgICMgSWYgYWxyZWFkeSBjb21wdXRlZCwgcmV0dXJuIHRoZSByZXN1bHQKKyAgICAgICAgaWYgc2VsZi5Gb2xsb3c6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5Gb2xsb3cKKworICAgICAgICAjIElmIGZpcnN0IHNldHMgbm90IGNvbXB1dGVkIHlldCwgZG8gdGhhdCBmaXJzdC4KKyAgICAgICAgaWYgbm90IHNlbGYuRmlyc3Q6CisgICAgICAgICAgICBzZWxmLmNvbXB1dGVfZmlyc3QoKQorCisgICAgICAgICMgQWRkICckZW5kJyB0byB0aGUgZm9sbG93IGxpc3Qgb2YgdGhlIHN0YXJ0IHN5bWJvbAorICAgICAgICBmb3IgayBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgIHNlbGYuRm9sbG93W2tdID0gWyBdCisKKyAgICAgICAgaWYgbm90IHN0YXJ0OgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLlByb2R1Y3Rpb25zWzFdLm5hbWUKKworICAgICAgICBzZWxmLkZvbGxvd1tzdGFydF0gPSBbICckZW5kJyBdCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGRpZGFkZCA9IDAKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYuUHJvZHVjdGlvbnNbMTpdOgorICAgICAgICAgICAgICAgICMgSGVyZSBpcyB0aGUgcHJvZHVjdGlvbiBzZXQKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocC5wcm9kKSk6CisgICAgICAgICAgICAgICAgICAgIEIgPSBwLnByb2RbaV0KKyAgICAgICAgICAgICAgICAgICAgaWYgQiBpbiBzZWxmLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgT2theS4gV2UgZ290IGEgbm9uLXRlcm1pbmFsIGluIGEgcHJvZHVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgZnN0ID0gc2VsZi5fZmlyc3QocC5wcm9kW2krMTpdKQorICAgICAgICAgICAgICAgICAgICAgICAgaGFzZW1wdHkgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZiAhPSAnPGVtcHR5PicgYW5kIGYgbm90IGluIHNlbGYuRm9sbG93W0JdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZvbGxvd1tCXS5hcHBlbmQoZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkYWRkID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGYgPT0gJzxlbXB0eT4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNlbXB0eSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2VtcHR5IG9yIGkgPT0gKGxlbihwLnByb2QpLTEpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIGVsZW1lbnRzIG9mIGZvbGxvdyhhKSB0byBmb2xsb3coYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBzZWxmLkZvbGxvd1twLm5hbWVdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLkZvbGxvd1tCXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRm9sbG93W0JdLmFwcGVuZChmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkYWRkID0gMQorICAgICAgICAgICAgaWYgbm90IGRpZGFkZDogYnJlYWsKKyAgICAgICAgcmV0dXJuIHNlbGYuRm9sbG93CisKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGJ1aWxkX2xyaXRlbXMoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIGxpc3Qgb2YgcHJvZHVjdGlvbnMgYW5kIGJ1aWxkcyBhIGNvbXBsZXRlIHNldCBvZiB0aGUKKyAgICAjIExSIGl0ZW1zLiAgVGhlIExSIGl0ZW1zIGFyZSBzdG9yZWQgaW4gdHdvIHdheXM6ICBGaXJzdCwgdGhleSBhcmUgdW5pcXVlbHkKKyAgICAjIG51bWJlcmVkIGFuZCBwbGFjZWQgaW4gdGhlIGxpc3QgX2xyaXRlbXMuICBTZWNvbmQsIGEgbGlua2VkIGxpc3Qgb2YgTFIgaXRlbXMKKyAgICAjIGlzIGJ1aWx0IGZvciBlYWNoIHByb2R1Y3Rpb24uICBGb3IgZXhhbXBsZToKKyAgICAjCisgICAgIyAgIEUgLT4gRSBQTFVTIEUKKyAgICAjCisgICAgIyBDcmVhdGVzIHRoZSBsaXN0CisgICAgIworICAgICMgIFtFIC0+IC4gRSBQTFVTIEUsIEUgLT4gRSAuIFBMVVMgRSwgRSAtPiBFIFBMVVMgLiBFLCBFIC0+IEUgUExVUyBFIC4gXQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBidWlsZF9scml0ZW1zKHNlbGYpOgorICAgICAgICBmb3IgcCBpbiBzZWxmLlByb2R1Y3Rpb25zOgorICAgICAgICAgICAgbGFzdGxyaSA9IHAKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICBscl9pdGVtcyA9IFtdCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIGkgPiBsZW4ocCk6CisgICAgICAgICAgICAgICAgICAgIGxyaSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBscmkgPSBMUkl0ZW0ocCxpKQorICAgICAgICAgICAgICAgICAgICAjIFByZWNvbXB1dGUgdGhlIGxpc3Qgb2YgcHJvZHVjdGlvbnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaS5scl9hZnRlciA9IHNlbGYuUHJvZG5hbWVzW2xyaS5wcm9kW2krMV1dCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW5kZXhFcnJvcixLZXlFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICBscmkubHJfYWZ0ZXIgPSBbXQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBscmkubHJfYmVmb3JlID0gbHJpLnByb2RbaS0xXQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaS5scl9iZWZvcmUgPSBOb25lCisKKyAgICAgICAgICAgICAgICBsYXN0bHJpLmxyX25leHQgPSBscmkKKyAgICAgICAgICAgICAgICBpZiBub3QgbHJpOiBicmVhaworICAgICAgICAgICAgICAgIGxyX2l0ZW1zLmFwcGVuZChscmkpCisgICAgICAgICAgICAgICAgbGFzdGxyaSA9IGxyaQorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgcC5scl9pdGVtcyA9IGxyX2l0ZW1zCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQ2xhc3MgTFJUYWJsZSA9PQorIworIyBUaGlzIGJhc2ljIGNsYXNzIHJlcHJlc2VudHMgYSBiYXNpYyB0YWJsZSBvZiBMUiBwYXJzaW5nIGluZm9ybWF0aW9uLiAgCisjIE1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgdGhlIHRhYmxlcyBhcmUgbm90IGRlZmluZWQgaGVyZS4gIFRoZXkgYXJlIGRlZmluZWQKKyMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgTFJHZW5lcmF0ZWRUYWJsZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVmVyc2lvbkVycm9yKFlhY2NFcnJvcik6IHBhc3MKKworY2xhc3MgTFJUYWJsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5scl9hY3Rpb24gPSBOb25lCisgICAgICAgIHNlbGYubHJfZ290byA9IE5vbmUKKyAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucyA9IE5vbmUKKyAgICAgICAgc2VsZi5scl9tZXRob2QgPSBOb25lCisKKyAgICBkZWYgcmVhZF90YWJsZShzZWxmLG1vZHVsZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlLHR5cGVzLk1vZHVsZVR5cGUpOgorICAgICAgICAgICAgcGFyc2V0YWIgPSBtb2R1bGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICAgICAgICAgIGV4ZWMoImltcG9ydCAlcyBhcyBwYXJzZXRhYiIgJSBtb2R1bGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVudiA9IHsgfQorICAgICAgICAgICAgICAgIGV4ZWMoImltcG9ydCAlcyBhcyBwYXJzZXRhYiIgJSBtb2R1bGUsIGVudiwgZW52KQorICAgICAgICAgICAgICAgIHBhcnNldGFiID0gZW52WydwYXJzZXRhYiddCisKKyAgICAgICAgaWYgcGFyc2V0YWIuX3RhYnZlcnNpb24gIT0gX190YWJ2ZXJzaW9uX186CisgICAgICAgICAgICByYWlzZSBWZXJzaW9uRXJyb3IoInlhY2MgdGFibGUgZmlsZSB2ZXJzaW9uIGlzIG91dCBvZiBkYXRlIikKKworICAgICAgICBzZWxmLmxyX2FjdGlvbiA9IHBhcnNldGFiLl9scl9hY3Rpb24KKyAgICAgICAgc2VsZi5scl9nb3RvID0gcGFyc2V0YWIuX2xyX2dvdG8KKworICAgICAgICBzZWxmLmxyX3Byb2R1Y3Rpb25zID0gW10KKyAgICAgICAgZm9yIHAgaW4gcGFyc2V0YWIuX2xyX3Byb2R1Y3Rpb25zOgorICAgICAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucy5hcHBlbmQoTWluaVByb2R1Y3Rpb24oKnApKQorCisgICAgICAgIHNlbGYubHJfbWV0aG9kID0gcGFyc2V0YWIuX2xyX21ldGhvZAorICAgICAgICByZXR1cm4gcGFyc2V0YWIuX2xyX3NpZ25hdHVyZQorCisgICAgZGVmIHJlYWRfcGlja2xlKHNlbGYsZmlsZW5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaW1wb3J0IHBpY2tsZQorCisgICAgICAgIGluX2YgPSBvcGVuKGZpbGVuYW1lLCJyYiIpCisKKyAgICAgICAgdGFidmVyc2lvbiA9IHBpY2tsZS5sb2FkKGluX2YpCisgICAgICAgIGlmIHRhYnZlcnNpb24gIT0gX190YWJ2ZXJzaW9uX186CisgICAgICAgICAgICByYWlzZSBWZXJzaW9uRXJyb3IoInlhY2MgdGFibGUgZmlsZSB2ZXJzaW9uIGlzIG91dCBvZiBkYXRlIikKKyAgICAgICAgc2VsZi5scl9tZXRob2QgPSBwaWNrbGUubG9hZChpbl9mKQorICAgICAgICBzaWduYXR1cmUgICAgICA9IHBpY2tsZS5sb2FkKGluX2YpCisgICAgICAgIHNlbGYubHJfYWN0aW9uID0gcGlja2xlLmxvYWQoaW5fZikKKyAgICAgICAgc2VsZi5scl9nb3RvICAgPSBwaWNrbGUubG9hZChpbl9mKQorICAgICAgICBwcm9kdWN0aW9ucyAgICA9IHBpY2tsZS5sb2FkKGluX2YpCisKKyAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucyA9IFtdCisgICAgICAgIGZvciBwIGluIHByb2R1Y3Rpb25zOgorICAgICAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucy5hcHBlbmQoTWluaVByb2R1Y3Rpb24oKnApKQorCisgICAgICAgIGluX2YuY2xvc2UoKQorICAgICAgICByZXR1cm4gc2lnbmF0dXJlCisKKyAgICAjIEJpbmQgYWxsIHByb2R1Y3Rpb24gZnVuY3Rpb24gbmFtZXMgdG8gY2FsbGFibGUgb2JqZWN0cyBpbiBwZGljdAorICAgIGRlZiBiaW5kX2NhbGxhYmxlcyhzZWxmLHBkaWN0KToKKyAgICAgICAgZm9yIHAgaW4gc2VsZi5scl9wcm9kdWN0aW9uczoKKyAgICAgICAgICAgIHAuYmluZChwZGljdCkKKyAgICAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gTFIgR2VuZXJhdG9yID09PQorIworIyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBnZW5lcmF0ZSBMUiBwYXJzaW5nIHRhYmxlcyBvbiAKKyMgYSBncmFtbWFyLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGRpZ3JhcGgoKQorIyB0cmF2ZXJzZSgpCisjCisjIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb21wdXRlIHNldCB2YWx1ZWQgZnVuY3Rpb25zCisjIG9mIHRoZSBmb3JtOgorIworIyAgICAgRih4KSA9IEYnKHgpIFUgVXtGKHkpIHwgeCBSIHl9CisjCisjIFRoaXMgaXMgdXNlZCB0byBjb21wdXRlIHRoZSB2YWx1ZXMgb2YgUmVhZCgpIHNldHMgYXMgd2VsbCBhcyBGT0xMT1cgc2V0cworIyBpbiBMQUxSKDEpIGdlbmVyYXRpb24uCisjCisjIElucHV0czogIFggICAgLSBBbiBpbnB1dCBzZXQKKyMgICAgICAgICAgUiAgICAtIEEgcmVsYXRpb24KKyMgICAgICAgICAgRlAgICAtIFNldC12YWx1ZWQgZnVuY3Rpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBkaWdyYXBoKFgsUixGUCk6CisgICAgTiA9IHsgfQorICAgIGZvciB4IGluIFg6CisgICAgICAgTlt4XSA9IDAKKyAgICBzdGFjayA9IFtdCisgICAgRiA9IHsgfQorICAgIGZvciB4IGluIFg6CisgICAgICAgIGlmIE5beF0gPT0gMDogdHJhdmVyc2UoeCxOLHN0YWNrLEYsWCxSLEZQKQorICAgIHJldHVybiBGCisKK2RlZiB0cmF2ZXJzZSh4LE4sc3RhY2ssRixYLFIsRlApOgorICAgIHN0YWNrLmFwcGVuZCh4KQorICAgIGQgPSBsZW4oc3RhY2spCisgICAgTlt4XSA9IGQKKyAgICBGW3hdID0gRlAoeCkgICAgICAgICAgICAgIyBGKFgpIDwtIEYnKHgpCisKKyAgICByZWwgPSBSKHgpICAgICAgICAgICAgICAgIyBHZXQgeSdzIHJlbGF0ZWQgdG8geAorICAgIGZvciB5IGluIHJlbDoKKyAgICAgICAgaWYgTlt5XSA9PSAwOgorICAgICAgICAgICAgIHRyYXZlcnNlKHksTixzdGFjayxGLFgsUixGUCkKKyAgICAgICAgTlt4XSA9IG1pbihOW3hdLE5beV0pCisgICAgICAgIGZvciBhIGluIEYuZ2V0KHksW10pOgorICAgICAgICAgICAgaWYgYSBub3QgaW4gRlt4XTogRlt4XS5hcHBlbmQoYSkKKyAgICBpZiBOW3hdID09IGQ6CisgICAgICAgTltzdGFja1stMV1dID0gTUFYSU5UCisgICAgICAgRltzdGFja1stMV1dID0gRlt4XQorICAgICAgIGVsZW1lbnQgPSBzdGFjay5wb3AoKQorICAgICAgIHdoaWxlIGVsZW1lbnQgIT0geDoKKyAgICAgICAgICAgTltzdGFja1stMV1dID0gTUFYSU5UCisgICAgICAgICAgIEZbc3RhY2tbLTFdXSA9IEZbeF0KKyAgICAgICAgICAgZWxlbWVudCA9IHN0YWNrLnBvcCgpCisKK2NsYXNzIExBTFJFcnJvcihZYWNjRXJyb3IpOiBwYXNzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IExSR2VuZXJhdGVkVGFibGUgPT0KKyMKKyMgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBMUiB0YWJsZSBnZW5lcmF0aW9uIGFsZ29yaXRobS4gIFRoZXJlIGFyZSBubworIyBwdWJsaWMgbWV0aG9kcyBleGNlcHQgZm9yIHdyaXRlKCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTFJHZW5lcmF0ZWRUYWJsZShMUlRhYmxlKToKKyAgICBkZWYgX19pbml0X18oc2VsZixncmFtbWFyLG1ldGhvZD0nTEFMUicsbG9nPU5vbmUpOgorICAgICAgICBpZiBtZXRob2Qgbm90IGluIFsnU0xSJywnTEFMUiddOgorICAgICAgICAgICAgcmFpc2UgTEFMUkVycm9yKCJVbnN1cHBvcnRlZCBtZXRob2QgJXMiICUgbWV0aG9kKQorCisgICAgICAgIHNlbGYuZ3JhbW1hciA9IGdyYW1tYXIKKyAgICAgICAgc2VsZi5scl9tZXRob2QgPSBtZXRob2QKKworICAgICAgICAjIFNldCB1cCB0aGUgbG9nZ2VyCisgICAgICAgIGlmIG5vdCBsb2c6CisgICAgICAgICAgICBsb2cgPSBOdWxsTG9nZ2VyKCkKKyAgICAgICAgc2VsZi5sb2cgPSBsb2cKKworICAgICAgICAjIEludGVybmFsIGF0dHJpYnV0ZXMKKyAgICAgICAgc2VsZi5scl9hY3Rpb24gICAgID0ge30gICAgICAgICMgQWN0aW9uIHRhYmxlCisgICAgICAgIHNlbGYubHJfZ290byAgICAgICA9IHt9ICAgICAgICAjIEdvdG8gdGFibGUKKyAgICAgICAgc2VsZi5scl9wcm9kdWN0aW9ucyAgPSBncmFtbWFyLlByb2R1Y3Rpb25zICAgICMgQ29weSBvZiBncmFtbWFyIFByb2R1Y3Rpb24gYXJyYXkKKyAgICAgICAgc2VsZi5scl9nb3RvX2NhY2hlID0ge30gICAgICAgICMgQ2FjaGUgb2YgY29tcHV0ZWQgZ290b3MKKyAgICAgICAgc2VsZi5scjBfY2lkaGFzaCAgID0ge30gICAgICAgICMgQ2FjaGUgb2YgY2xvc3VyZXMKKworICAgICAgICBzZWxmLl9hZGRfY291bnQgICAgPSAwICAgICAgICAgIyBJbnRlcm5hbCBjb3VudGVyIHVzZWQgdG8gZGV0ZWN0IGN5Y2xlcworCisgICAgICAgICMgRGlhZ29uaXN0aWMgaW5mb3JtYXRpb24gZmlsbGVkIGluIGJ5IHRoZSB0YWJsZSBnZW5lcmF0b3IKKyAgICAgICAgc2VsZi5zcl9jb25mbGljdCAgID0gMAorICAgICAgICBzZWxmLnJyX2NvbmZsaWN0ICAgPSAwCisgICAgICAgIHNlbGYuY29uZmxpY3RzICAgICA9IFtdICAgICAgICAjIExpc3Qgb2YgY29uZmxpY3RzCisKKyAgICAgICAgc2VsZi5zcl9jb25mbGljdHMgID0gW10KKyAgICAgICAgc2VsZi5ycl9jb25mbGljdHMgID0gW10KKworICAgICAgICAjIEJ1aWxkIHRoZSB0YWJsZXMKKyAgICAgICAgc2VsZi5ncmFtbWFyLmJ1aWxkX2xyaXRlbXMoKQorICAgICAgICBzZWxmLmdyYW1tYXIuY29tcHV0ZV9maXJzdCgpCisgICAgICAgIHNlbGYuZ3JhbW1hci5jb21wdXRlX2ZvbGxvdygpCisgICAgICAgIHNlbGYubHJfcGFyc2VfdGFibGUoKQorCisgICAgIyBDb21wdXRlIHRoZSBMUigwKSBjbG9zdXJlIG9wZXJhdGlvbiBvbiBJLCB3aGVyZSBJIGlzIGEgc2V0IG9mIExSKDApIGl0ZW1zLgorCisgICAgZGVmIGxyMF9jbG9zdXJlKHNlbGYsSSk6CisgICAgICAgIHNlbGYuX2FkZF9jb3VudCArPSAxCisKKyAgICAgICAgIyBBZGQgZXZlcnl0aGluZyBpbiBJIHRvIEoKKyAgICAgICAgSiA9IElbOl0KKyAgICAgICAgZGlkYWRkID0gMQorICAgICAgICB3aGlsZSBkaWRhZGQ6CisgICAgICAgICAgICBkaWRhZGQgPSAwCisgICAgICAgICAgICBmb3IgaiBpbiBKOgorICAgICAgICAgICAgICAgIGZvciB4IGluIGoubHJfYWZ0ZXI6CisgICAgICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoeCwibHIwX2FkZGVkIiwwKSA9PSBzZWxmLl9hZGRfY291bnQ6IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICMgQWRkIEIgLS0+IC5HIHRvIEoKKyAgICAgICAgICAgICAgICAgICAgSi5hcHBlbmQoeC5scl9uZXh0KQorICAgICAgICAgICAgICAgICAgICB4LmxyMF9hZGRlZCA9IHNlbGYuX2FkZF9jb3VudAorICAgICAgICAgICAgICAgICAgICBkaWRhZGQgPSAxCisKKyAgICAgICAgcmV0dXJuIEoKKworICAgICMgQ29tcHV0ZSB0aGUgTFIoMCkgZ290byBmdW5jdGlvbiBnb3RvKEksWCkgd2hlcmUgSSBpcyBhIHNldAorICAgICMgb2YgTFIoMCkgaXRlbXMgYW5kIFggaXMgYSBncmFtbWFyIHN5bWJvbC4gICBUaGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4KKyAgICAjIGluIGEgd2F5IHRoYXQgZ3VhcmFudGVlcyB1bmlxdWVuZXNzIG9mIHRoZSBnZW5lcmF0ZWQgZ290byBzZXRzCisgICAgIyAoaS5lLiB0aGUgc2FtZSBnb3RvIHNldCB3aWxsIG5ldmVyIGJlIHJldHVybmVkIGFzIHR3byBkaWZmZXJlbnQgUHl0aG9uCisgICAgIyBvYmplY3RzKS4gIFdpdGggdW5pcXVlbmVzcywgd2UgY2FuIGxhdGVyIGRvIGZhc3Qgc2V0IGNvbXBhcmlzb25zIHVzaW5nCisgICAgIyBpZChvYmopIGluc3RlYWQgb2YgZWxlbWVudC13aXNlIGNvbXBhcmlzb24uCisKKyAgICBkZWYgbHIwX2dvdG8oc2VsZixJLHgpOgorICAgICAgICAjIEZpcnN0IHdlIGxvb2sgZm9yIGEgcHJldmlvdXNseSBjYWNoZWQgZW50cnkKKyAgICAgICAgZyA9IHNlbGYubHJfZ290b19jYWNoZS5nZXQoKGlkKEkpLHgpLE5vbmUpCisgICAgICAgIGlmIGc6IHJldHVybiBnCisKKyAgICAgICAgIyBOb3cgd2UgZ2VuZXJhdGUgdGhlIGdvdG8gc2V0IGluIGEgd2F5IHRoYXQgZ3VhcmFudGVlcyB1bmlxdWVuZXNzCisgICAgICAgICMgb2YgdGhlIHJlc3VsdAorCisgICAgICAgIHMgPSBzZWxmLmxyX2dvdG9fY2FjaGUuZ2V0KHgsTm9uZSkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICBzID0geyB9CisgICAgICAgICAgICBzZWxmLmxyX2dvdG9fY2FjaGVbeF0gPSBzCisKKyAgICAgICAgZ3MgPSBbIF0KKyAgICAgICAgZm9yIHAgaW4gSToKKyAgICAgICAgICAgIG4gPSBwLmxyX25leHQKKyAgICAgICAgICAgIGlmIG4gYW5kIG4ubHJfYmVmb3JlID09IHg6CisgICAgICAgICAgICAgICAgczEgPSBzLmdldChpZChuKSxOb25lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzMToKKyAgICAgICAgICAgICAgICAgICAgczEgPSB7IH0KKyAgICAgICAgICAgICAgICAgICAgc1tpZChuKV0gPSBzMQorICAgICAgICAgICAgICAgIGdzLmFwcGVuZChuKQorICAgICAgICAgICAgICAgIHMgPSBzMQorICAgICAgICBnID0gcy5nZXQoJyRlbmQnLE5vbmUpCisgICAgICAgIGlmIG5vdCBnOgorICAgICAgICAgICAgaWYgZ3M6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYubHIwX2Nsb3N1cmUoZ3MpCisgICAgICAgICAgICAgICAgc1snJGVuZCddID0gZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzWyckZW5kJ10gPSBncworICAgICAgICBzZWxmLmxyX2dvdG9fY2FjaGVbKGlkKEkpLHgpXSA9IGcKKyAgICAgICAgcmV0dXJuIGcKKworICAgICMgQ29tcHV0ZSB0aGUgTFIoMCkgc2V0cyBvZiBpdGVtIGZ1bmN0aW9uCisgICAgZGVmIGxyMF9pdGVtcyhzZWxmKToKKworICAgICAgICBDID0gWyBzZWxmLmxyMF9jbG9zdXJlKFtzZWxmLmdyYW1tYXIuUHJvZHVjdGlvbnNbMF0ubHJfbmV4dF0pIF0KKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIEkgaW4gQzoKKyAgICAgICAgICAgIHNlbGYubHIwX2NpZGhhc2hbaWQoSSldID0gaQorICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgIyBMb29wIG92ZXIgdGhlIGl0ZW1zIGluIEMgYW5kIGVhY2ggZ3JhbW1hciBzeW1ib2xzCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIGkgPCBsZW4oQyk6CisgICAgICAgICAgICBJID0gQ1tpXQorICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgICAgICMgQ29sbGVjdCBhbGwgb2YgdGhlIHN5bWJvbHMgdGhhdCBjb3VsZCBwb3NzaWJseSBiZSBpbiB0aGUgZ290byhJLFgpIHNldHMKKyAgICAgICAgICAgIGFzeW1zID0geyB9CisgICAgICAgICAgICBmb3IgaWkgaW4gSToKKyAgICAgICAgICAgICAgICBmb3IgcyBpbiBpaS51c3ltczoKKyAgICAgICAgICAgICAgICAgICAgYXN5bXNbc10gPSBOb25lCisKKyAgICAgICAgICAgIGZvciB4IGluIGFzeW1zOgorICAgICAgICAgICAgICAgIGcgPSBzZWxmLmxyMF9nb3RvKEkseCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZzogIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgaWQoZykgaW4gc2VsZi5scjBfY2lkaGFzaDogY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmxyMF9jaWRoYXNoW2lkKGcpXSA9IGxlbihDKQorICAgICAgICAgICAgICAgIEMuYXBwZW5kKGcpCisKKyAgICAgICAgcmV0dXJuIEMKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgICAgICAgICAgICAgICAgICA9PT09IExBTFIoMSkgUGFyc2luZyA9PT09CisgICAgIworICAgICMgTEFMUigxKSBwYXJzaW5nIGlzIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIGFzIFNMUiBleGNlcHQgdGhhdCBpbnN0ZWFkIG9mCisgICAgIyByZWx5aW5nIHVwb24gRm9sbG93KCkgc2V0cyB3aGVuIHBlcmZvcm1pbmcgcmVkdWN0aW9ucywgYSBtb3JlIHNlbGVjdGl2ZQorICAgICMgbG9va2FoZWFkIHNldCB0aGF0IGluY29ycG9yYXRlcyB0aGUgc3RhdGUgb2YgdGhlIExSKDApIG1hY2hpbmUgaXMgdXRpbGl6ZWQuCisgICAgIyBUaHVzLCB3ZSBtYWlubHkganVzdCBoYXZlIHRvIGZvY3VzIG9uIGNhbGN1bGF0aW5nIHRoZSBsb29rYWhlYWQgc2V0cy4KKyAgICAjCisgICAgIyBUaGUgbWV0aG9kIHVzZWQgaGVyZSBpcyBkdWUgdG8gRGVSZW1lciBhbmQgUGVubmVsbyAoMTk4MikuCisgICAgIworICAgICMgRGVSZW1lciwgRi4gTC4sIGFuZCBULiBKLiBQZW5uZWxvOiAiRWZmaWNpZW50IENvbXB1dGF0aW9uIG9mIExBTFIoMSkKKyAgICAjICAgICBMb29rYWhlYWQgU2V0cyIsIEFDTSBUcmFuc2FjdGlvbnMgb24gUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIGFuZCBTeXN0ZW1zLAorICAgICMgICAgIFZvbC4gNCwgTm8uIDQsIE9jdC4gMTk4MiwgcHAuIDYxNS02NDkKKyAgICAjCisgICAgIyBGdXJ0aGVyIGRldGFpbHMgY2FuIGFsc28gYmUgZm91bmQgaW46CisgICAgIworICAgICMgIEouIFRyZW1ibGF5IGFuZCBQLiBTb3JlbnNvbiwgIlRoZSBUaGVvcnkgYW5kIFByYWN0aWNlIG9mIENvbXBpbGVyIFdyaXRpbmciLAorICAgICMgICAgICBNY0dyYXctSGlsbCBCb29rIENvbXBhbnksICgxOTg1KS4KKyAgICAjCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgY29tcHV0ZV9udWxsYWJsZV9ub250ZXJtaW5hbHMoKQorICAgICMKKyAgICAjIENyZWF0ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBub24tdGVybWluYWxzIHRoYXQgbWlnaHQgcHJvZHVjZQorICAgICMgYW4gZW1wdHkgcHJvZHVjdGlvbi4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29tcHV0ZV9udWxsYWJsZV9ub250ZXJtaW5hbHMoc2VsZik6CisgICAgICAgIG51bGxhYmxlID0ge30KKyAgICAgICAgbnVtX251bGxhYmxlID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmdyYW1tYXIuUHJvZHVjdGlvbnNbMTpdOgorICAgICAgICAgICAgICAgaWYgcC5sZW4gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbnVsbGFibGVbcC5uYW1lXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgIGZvciB0IGluIHAucHJvZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHQgaW4gbnVsbGFibGU6IGJyZWFrCisgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBudWxsYWJsZVtwLm5hbWVdID0gMQorICAgICAgICAgICBpZiBsZW4obnVsbGFibGUpID09IG51bV9udWxsYWJsZTogYnJlYWsKKyAgICAgICAgICAgbnVtX251bGxhYmxlID0gbGVuKG51bGxhYmxlKQorICAgICAgICByZXR1cm4gbnVsbGFibGUKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGZpbmRfbm9udGVybWluYWxfdHJhbnMoQykKKyAgICAjCisgICAgIyBHaXZlbiBhIHNldCBvZiBMUigwKSBpdGVtcywgdGhpcyBmdW5jdGlvbnMgZmluZHMgYWxsIG9mIHRoZSBub24tdGVybWluYWwKKyAgICAjIHRyYW5zaXRpb25zLiAgICBUaGVzZSBhcmUgdHJhbnNpdGlvbnMgaW4gd2hpY2ggYSBkb3QgYXBwZWFycyBpbW1lZGlhdGVseSBiZWZvcmUKKyAgICAjIGEgbm9uLXRlcm1pbmFsLiAgIFJldHVybnMgYSBsaXN0IG9mIHR1cGxlcyBvZiB0aGUgZm9ybSAoc3RhdGUsTikgd2hlcmUgc3RhdGUKKyAgICAjIGlzIHRoZSBzdGF0ZSBudW1iZXIgYW5kIE4gaXMgdGhlIG5vbnRlcm1pbmFsIHN5bWJvbC4KKyAgICAjCisgICAgIyBUaGUgaW5wdXQgQyBpcyB0aGUgc2V0IG9mIExSKDApIGl0ZW1zLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBmaW5kX25vbnRlcm1pbmFsX3RyYW5zaXRpb25zKHNlbGYsQyk6CisgICAgICAgICB0cmFucyA9IFtdCisgICAgICAgICBmb3Igc3RhdGUgaW4gcmFuZ2UobGVuKEMpKToKKyAgICAgICAgICAgICBmb3IgcCBpbiBDW3N0YXRlXToKKyAgICAgICAgICAgICAgICAgaWYgcC5scl9pbmRleCA8IHAubGVuIC0gMToKKyAgICAgICAgICAgICAgICAgICAgICB0ID0gKHN0YXRlLHAucHJvZFtwLmxyX2luZGV4KzFdKQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRbMV0gaW4gc2VsZi5ncmFtbWFyLk5vbnRlcm1pbmFsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0IG5vdCBpbiB0cmFuczogdHJhbnMuYXBwZW5kKHQpCisgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZSArIDEKKyAgICAgICAgIHJldHVybiB0cmFucworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgZHJfcmVsYXRpb24oKQorICAgICMKKyAgICAjIENvbXB1dGVzIHRoZSBEUihwLEEpIHJlbGF0aW9uc2hpcHMgZm9yIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9ucy4gIFRoZSBpbnB1dAorICAgICMgaXMgYSB0dXBsZSAoc3RhdGUsTikgd2hlcmUgc3RhdGUgaXMgYSBudW1iZXIgYW5kIE4gaXMgYSBub250ZXJtaW5hbCBzeW1ib2wuCisgICAgIworICAgICMgUmV0dXJucyBhIGxpc3Qgb2YgdGVybWluYWxzLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBkcl9yZWxhdGlvbihzZWxmLEMsdHJhbnMsbnVsbGFibGUpOgorICAgICAgICBkcl9zZXQgPSB7IH0KKyAgICAgICAgc3RhdGUsTiA9IHRyYW5zCisgICAgICAgIHRlcm1zID0gW10KKworICAgICAgICBnID0gc2VsZi5scjBfZ290byhDW3N0YXRlXSxOKQorICAgICAgICBmb3IgcCBpbiBnOgorICAgICAgICAgICBpZiBwLmxyX2luZGV4IDwgcC5sZW4gLSAxOgorICAgICAgICAgICAgICAgYSA9IHAucHJvZFtwLmxyX2luZGV4KzFdCisgICAgICAgICAgICAgICBpZiBhIGluIHNlbGYuZ3JhbW1hci5UZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgICAgaWYgYSBub3QgaW4gdGVybXM6IHRlcm1zLmFwcGVuZChhKQorCisgICAgICAgICMgVGhpcyBleHRyYSBiaXQgaXMgdG8gaGFuZGxlIHRoZSBzdGFydCBzdGF0ZQorICAgICAgICBpZiBzdGF0ZSA9PSAwIGFuZCBOID09IHNlbGYuZ3JhbW1hci5Qcm9kdWN0aW9uc1swXS5wcm9kWzBdOgorICAgICAgICAgICB0ZXJtcy5hcHBlbmQoJyRlbmQnKQorCisgICAgICAgIHJldHVybiB0ZXJtcworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgcmVhZHNfcmVsYXRpb24oKQorICAgICMKKyAgICAjIENvbXB1dGVzIHRoZSBSRUFEUygpIHJlbGF0aW9uIChwLEEpIFJFQURTICh0LEMpLgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiByZWFkc19yZWxhdGlvbihzZWxmLEMsIHRyYW5zLCBlbXB0eSk6CisgICAgICAgICMgTG9vayBmb3IgZW1wdHkgdHJhbnNpdGlvbnMKKyAgICAgICAgcmVsID0gW10KKyAgICAgICAgc3RhdGUsIE4gPSB0cmFucworCisgICAgICAgIGcgPSBzZWxmLmxyMF9nb3RvKENbc3RhdGVdLE4pCisgICAgICAgIGogPSBzZWxmLmxyMF9jaWRoYXNoLmdldChpZChnKSwtMSkKKyAgICAgICAgZm9yIHAgaW4gZzoKKyAgICAgICAgICAgIGlmIHAubHJfaW5kZXggPCBwLmxlbiAtIDE6CisgICAgICAgICAgICAgICAgIGEgPSBwLnByb2RbcC5scl9pbmRleCArIDFdCisgICAgICAgICAgICAgICAgIGlmIGEgaW4gZW1wdHk6CisgICAgICAgICAgICAgICAgICAgICAgcmVsLmFwcGVuZCgoaixhKSkKKworICAgICAgICByZXR1cm4gcmVsCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjb21wdXRlX2xvb2tiYWNrX2luY2x1ZGVzKCkKKyAgICAjCisgICAgIyBEZXRlcm1pbmVzIHRoZSBsb29rYmFjayBhbmQgaW5jbHVkZXMgcmVsYXRpb25zCisgICAgIworICAgICMgTE9PS0JBQ0s6CisgICAgIworICAgICMgVGhpcyByZWxhdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHJ1bm5pbmcgdGhlIExSKDApIHN0YXRlIG1hY2hpbmUgZm9yd2FyZC4KKyAgICAjIEZvciBleGFtcGxlLCBzdGFydGluZyB3aXRoIGEgcHJvZHVjdGlvbiAiTiA6IC4gQSBCIEMiLCB3ZSBydW4gaXQgZm9yd2FyZAorICAgICMgdG8gb2J0YWluICJOIDogQSBCIEMgLiIgICBXZSB0aGVuIGJ1aWxkIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBmaW5hbAorICAgICMgc3RhdGUgYW5kIHRoZSBzdGFydGluZyBzdGF0ZS4gICBUaGVzZSByZWxhdGlvbnNoaXBzIGFyZSBzdG9yZWQgaW4gYSBkaWN0aW9uYXJ5CisgICAgIyBsb29rZGljdC4KKyAgICAjCisgICAgIyBJTkNMVURFUzoKKyAgICAjCisgICAgIyBDb21wdXRlcyB0aGUgSU5DTFVERSgpIHJlbGF0aW9uIChwLEEpIElOQ0xVREVTIChwJyxCKS4KKyAgICAjCisgICAgIyBUaGlzIHJlbGF0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9ucyB0aGF0IG9jY3VyCisgICAgIyBpbnNpZGUgb2Ygb3RoZXIgbm9uLXRlcm1pbmFsIHRyYW5zaXRpb24gc3RhdGVzLiAgIChwLEEpIElOQ0xVREVTIChwJywgQikKKyAgICAjIGlmIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgICAgIworICAgICMgICAgICAgQiAtPiBMQVQsIHdoZXJlIFQgLT4gZXBzaWxvbiBhbmQgcCcgLUwtPiBwCisgICAgIworICAgICMgTCBpcyBlc3NlbnRpYWxseSBhIHByZWZpeCAod2hpY2ggbWF5IGJlIGVtcHR5KSwgVCBpcyBhIHN1ZmZpeCB0aGF0IG11c3QgYmUKKyAgICAjIGFibGUgdG8gZGVyaXZlIGFuIGVtcHR5IHN0cmluZy4gIFN0YXRlIHAnIG11c3QgbGVhZCB0byBzdGF0ZSBwIHdpdGggdGhlIHN0cmluZyBMLgorICAgICMKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29tcHV0ZV9sb29rYmFja19pbmNsdWRlcyhzZWxmLEMsdHJhbnMsbnVsbGFibGUpOgorCisgICAgICAgIGxvb2tkaWN0ID0ge30gICAgICAgICAgIyBEaWN0aW9uYXJ5IG9mIGxvb2tiYWNrIHJlbGF0aW9ucworICAgICAgICBpbmNsdWRlZGljdCA9IHt9ICAgICAgICMgRGljdGlvbmFyeSBvZiBpbmNsdWRlIHJlbGF0aW9ucworCisgICAgICAgICMgTWFrZSBhIGRpY3Rpb25hcnkgb2Ygbm9uLXRlcm1pbmFsIHRyYW5zaXRpb25zCisgICAgICAgIGR0cmFucyA9IHt9CisgICAgICAgIGZvciB0IGluIHRyYW5zOgorICAgICAgICAgICAgZHRyYW5zW3RdID0gMQorCisgICAgICAgICMgTG9vcCBvdmVyIGFsbCB0cmFuc2l0aW9ucyBhbmQgY29tcHV0ZSBsb29rYmFja3MgYW5kIGluY2x1ZGVzCisgICAgICAgIGZvciBzdGF0ZSxOIGluIHRyYW5zOgorICAgICAgICAgICAgbG9va2IgPSBbXQorICAgICAgICAgICAgaW5jbHVkZXMgPSBbXQorICAgICAgICAgICAgZm9yIHAgaW4gQ1tzdGF0ZV06CisgICAgICAgICAgICAgICAgaWYgcC5uYW1lICE9IE46IGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIE9rYXksIHdlIGhhdmUgYSBuYW1lIG1hdGNoLiAgV2Ugbm93IGZvbGxvdyB0aGUgcHJvZHVjdGlvbiBhbGwgdGhlIHdheQorICAgICAgICAgICAgICAgICMgdGhyb3VnaCB0aGUgc3RhdGUgbWFjaGluZSB1bnRpbCB3ZSBnZXQgdGhlIC4gb24gdGhlIHJpZ2h0IGhhbmQgc2lkZQorCisgICAgICAgICAgICAgICAgbHJfaW5kZXggPSBwLmxyX2luZGV4CisgICAgICAgICAgICAgICAgaiA9IHN0YXRlCisgICAgICAgICAgICAgICAgd2hpbGUgbHJfaW5kZXggPCBwLmxlbiAtIDE6CisgICAgICAgICAgICAgICAgICAgICBscl9pbmRleCA9IGxyX2luZGV4ICsgMQorICAgICAgICAgICAgICAgICAgICAgdCA9IHAucHJvZFtscl9pbmRleF0KKworICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBzeW1ib2wgYW5kIHN0YXRlIGFyZSBhIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICBpZiAoaix0KSBpbiBkdHJhbnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFllcy4gIE9rYXksIHRoZXJlIGlzIHNvbWUgY2hhbmNlIHRoYXQgdGhpcyBpcyBhbiBpbmNsdWRlcyByZWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb25seSB3YXkgdG8ga25vdyBmb3IgY2VydGFpbiBpcyB3aGV0aGVyIHRoZSByZXN0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcm9kdWN0aW9uIGRlcml2ZXMgZW1wdHkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkgPSBscl9pbmRleCArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGxpIDwgcC5sZW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAucHJvZFtsaV0gaW4gc2VsZi5ncmFtbWFyLlRlcm1pbmFsczogYnJlYWsgICAgICAjIE5vIGZvcmdldCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcC5wcm9kW2xpXSBpbiBudWxsYWJsZTogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGkgPSBsaSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQXBwZWFycyB0byBiZSBhIHJlbGF0aW9uIGJldHdlZW4gKGosdCkgYW5kIChzdGF0ZSxOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcy5hcHBlbmQoKGosdCkpCisKKyAgICAgICAgICAgICAgICAgICAgIGcgPSBzZWxmLmxyMF9nb3RvKENbal0sdCkgICAgICAgICAgICAgICAjIEdvIHRvIG5leHQgc2V0CisgICAgICAgICAgICAgICAgICAgICBqID0gc2VsZi5scjBfY2lkaGFzaC5nZXQoaWQoZyksLTEpICAgICAjIEdvIHRvIG5leHQgc3RhdGUKKworICAgICAgICAgICAgICAgICMgV2hlbiB3ZSBnZXQgaGVyZSwgaiBpcyB0aGUgZmluYWwgc3RhdGUsIG5vdyB3ZSBoYXZlIHRvIGxvY2F0ZSB0aGUgcHJvZHVjdGlvbgorICAgICAgICAgICAgICAgIGZvciByIGluIENbal06CisgICAgICAgICAgICAgICAgICAgICBpZiByLm5hbWUgIT0gcC5uYW1lOiBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgaWYgci5sZW4gIT0gcC5sZW46ICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbG9vayBpcyBjb21wYXJpbmcgYSBwcm9kdWN0aW9uICIuIEEgQiBDIiB3aXRoICJBIEIgQyAuIgorICAgICAgICAgICAgICAgICAgICAgd2hpbGUgaSA8IHIubHJfaW5kZXg6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHIucHJvZFtpXSAhPSBwLnByb2RbaSsxXTogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rYi5hcHBlbmQoKGoscikpCisgICAgICAgICAgICBmb3IgaSBpbiBpbmNsdWRlczoKKyAgICAgICAgICAgICAgICAgaWYgbm90IGkgaW4gaW5jbHVkZWRpY3Q6IGluY2x1ZGVkaWN0W2ldID0gW10KKyAgICAgICAgICAgICAgICAgaW5jbHVkZWRpY3RbaV0uYXBwZW5kKChzdGF0ZSxOKSkKKyAgICAgICAgICAgIGxvb2tkaWN0WyhzdGF0ZSxOKV0gPSBsb29rYgorCisgICAgICAgIHJldHVybiBsb29rZGljdCxpbmNsdWRlZGljdAorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgY29tcHV0ZV9yZWFkX3NldHMoKQorICAgICMKKyAgICAjIEdpdmVuIGEgc2V0IG9mIExSKDApIGl0ZW1zLCB0aGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSByZWFkIHNldHMuCisgICAgIworICAgICMgSW5wdXRzOiAgQyAgICAgICAgPSAgU2V0IG9mIExSKDApIGl0ZW1zCisgICAgIyAgICAgICAgICBudHJhbnMgICA9IFNldCBvZiBub250ZXJtaW5hbCB0cmFuc2l0aW9ucworICAgICMgICAgICAgICAgbnVsbGFibGUgPSBTZXQgb2YgZW1wdHkgdHJhbnNpdGlvbnMKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgdGhlIHJlYWQgc2V0cworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBjb21wdXRlX3JlYWRfc2V0cyhzZWxmLEMsIG50cmFucywgbnVsbGFibGUpOgorICAgICAgICBGUCA9IGxhbWJkYSB4OiBzZWxmLmRyX3JlbGF0aW9uKEMseCxudWxsYWJsZSkKKyAgICAgICAgUiA9ICBsYW1iZGEgeDogc2VsZi5yZWFkc19yZWxhdGlvbihDLHgsbnVsbGFibGUpCisgICAgICAgIEYgPSBkaWdyYXBoKG50cmFucyxSLEZQKQorICAgICAgICByZXR1cm4gRgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgY29tcHV0ZV9mb2xsb3dfc2V0cygpCisgICAgIworICAgICMgR2l2ZW4gYSBzZXQgb2YgTFIoMCkgaXRlbXMsIGEgc2V0IG9mIG5vbi10ZXJtaW5hbCB0cmFuc2l0aW9ucywgYSByZWFkc2V0LAorICAgICMgYW5kIGFuIGluY2x1ZGUgc2V0LCB0aGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBmb2xsb3cgc2V0cworICAgICMKKyAgICAjIEZvbGxvdyhwLEEpID0gUmVhZChwLEEpIFUgVSB7Rm9sbG93KHAnLEIpIHwgKHAsQSkgSU5DTFVERVMgKHAnLEIpfQorICAgICMKKyAgICAjIElucHV0czoKKyAgICAjICAgICAgICAgICAgbnRyYW5zICAgICA9IFNldCBvZiBub250ZXJtaW5hbCB0cmFuc2l0aW9ucworICAgICMgICAgICAgICAgICByZWFkc2V0cyAgID0gUmVhZHNldCAocHJldmlvdXNseSBjb21wdXRlZCkKKyAgICAjICAgICAgICAgICAgaW5jbHNldHMgICA9IEluY2x1ZGUgc2V0cyAocHJldmlvdXNseSBjb21wdXRlZCkKKyAgICAjCisgICAgIyBSZXR1cm5zIGEgc2V0IGNvbnRhaW5pbmcgdGhlIGZvbGxvdyBzZXRzCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNvbXB1dGVfZm9sbG93X3NldHMoc2VsZixudHJhbnMscmVhZHNldHMsaW5jbHNldHMpOgorICAgICAgICAgRlAgPSBsYW1iZGEgeDogcmVhZHNldHNbeF0KKyAgICAgICAgIFIgID0gbGFtYmRhIHg6IGluY2xzZXRzLmdldCh4LFtdKQorICAgICAgICAgRiA9IGRpZ3JhcGgobnRyYW5zLFIsRlApCisgICAgICAgICByZXR1cm4gRgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYWRkX2xvb2thaGVhZHMoKQorICAgICMKKyAgICAjIEF0dGFjaGVzIHRoZSBsb29rYWhlYWQgc3ltYm9scyB0byBncmFtbWFyIHJ1bGVzLgorICAgICMKKyAgICAjIElucHV0czogICAgbG9va2JhY2tzICAgICAgICAgLSAgU2V0IG9mIGxvb2tiYWNrIHJlbGF0aW9ucworICAgICMgICAgICAgICAgICBmb2xsb3dzZXQgICAgICAgICAtICBDb21wdXRlZCBmb2xsb3cgc2V0CisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiBkaXJlY3RseSBhdHRhY2hlcyB0aGUgbG9va2FoZWFkcyB0byBwcm9kdWN0aW9ucyBjb250YWluZWQKKyAgICAjIGluIHRoZSBsb29rYmFja3Mgc2V0CisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGFkZF9sb29rYWhlYWRzKHNlbGYsbG9va2JhY2tzLGZvbGxvd3NldCk6CisgICAgICAgIGZvciB0cmFucyxsYiBpbiBsb29rYmFja3MuaXRlbXMoKToKKyAgICAgICAgICAgICMgTG9vcCBvdmVyIHByb2R1Y3Rpb25zIGluIGxvb2tiYWNrCisgICAgICAgICAgICBmb3Igc3RhdGUscCBpbiBsYjoKKyAgICAgICAgICAgICAgICAgaWYgbm90IHN0YXRlIGluIHAubG9va2FoZWFkczoKKyAgICAgICAgICAgICAgICAgICAgICBwLmxvb2thaGVhZHNbc3RhdGVdID0gW10KKyAgICAgICAgICAgICAgICAgZiA9IGZvbGxvd3NldC5nZXQodHJhbnMsW10pCisgICAgICAgICAgICAgICAgIGZvciBhIGluIGY6CisgICAgICAgICAgICAgICAgICAgICAgaWYgYSBub3QgaW4gcC5sb29rYWhlYWRzW3N0YXRlXTogcC5sb29rYWhlYWRzW3N0YXRlXS5hcHBlbmQoYSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGFkZF9sYWxyX2xvb2thaGVhZHMoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgb2YgdGhlIHdvcmsgb2YgYWRkaW5nIGxvb2thaGVhZCBpbmZvcm1hdGlvbiBmb3IgdXNlCisgICAgIyB3aXRoIExBTFIgcGFyc2luZworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhZGRfbGFscl9sb29rYWhlYWRzKHNlbGYsQyk6CisgICAgICAgICMgRGV0ZXJtaW5lIGFsbCBvZiB0aGUgbnVsbGFibGUgbm9udGVybWluYWxzCisgICAgICAgIG51bGxhYmxlID0gc2VsZi5jb21wdXRlX251bGxhYmxlX25vbnRlcm1pbmFscygpCisKKyAgICAgICAgIyBGaW5kIGFsbCBub24tdGVybWluYWwgdHJhbnNpdGlvbnMKKyAgICAgICAgdHJhbnMgPSBzZWxmLmZpbmRfbm9udGVybWluYWxfdHJhbnNpdGlvbnMoQykKKworICAgICAgICAjIENvbXB1dGUgcmVhZCBzZXRzCisgICAgICAgIHJlYWRzZXRzID0gc2VsZi5jb21wdXRlX3JlYWRfc2V0cyhDLHRyYW5zLG51bGxhYmxlKQorCisgICAgICAgICMgQ29tcHV0ZSBsb29rYmFjay9pbmNsdWRlcyByZWxhdGlvbnMKKyAgICAgICAgbG9va2QsIGluY2x1ZGVkID0gc2VsZi5jb21wdXRlX2xvb2tiYWNrX2luY2x1ZGVzKEMsdHJhbnMsbnVsbGFibGUpCisKKyAgICAgICAgIyBDb21wdXRlIExBTFIgRk9MTE9XIHNldHMKKyAgICAgICAgZm9sbG93c2V0cyA9IHNlbGYuY29tcHV0ZV9mb2xsb3dfc2V0cyh0cmFucyxyZWFkc2V0cyxpbmNsdWRlZCkKKworICAgICAgICAjIEFkZCBhbGwgb2YgdGhlIGxvb2thaGVhZHMKKyAgICAgICAgc2VsZi5hZGRfbG9va2FoZWFkcyhsb29rZCxmb2xsb3dzZXRzKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgbHJfcGFyc2VfdGFibGUoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyB0aGUgcGFyc2UgdGFibGVzIGZvciBTTFIgb3IgTEFMUgorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBkZWYgbHJfcGFyc2VfdGFibGUoc2VsZik6CisgICAgICAgIFByb2R1Y3Rpb25zID0gc2VsZi5ncmFtbWFyLlByb2R1Y3Rpb25zCisgICAgICAgIFByZWNlZGVuY2UgID0gc2VsZi5ncmFtbWFyLlByZWNlZGVuY2UKKyAgICAgICAgZ290byAgID0gc2VsZi5scl9nb3RvICAgICAgICAgIyBHb3RvIGFycmF5CisgICAgICAgIGFjdGlvbiA9IHNlbGYubHJfYWN0aW9uICAgICAgICMgQWN0aW9uIGFycmF5CisgICAgICAgIGxvZyAgICA9IHNlbGYubG9nICAgICAgICAgICAgICMgTG9nZ2VyIGZvciBvdXRwdXQKKworICAgICAgICBhY3Rpb25wID0geyB9ICAgICAgICAgICAgICAgICAjIEFjdGlvbiBwcm9kdWN0aW9uIGFycmF5ICh0ZW1wb3JhcnkpCisgICAgICAgIAorICAgICAgICBsb2cuaW5mbygiUGFyc2luZyBtZXRob2Q6ICVzIiwgc2VsZi5scl9tZXRob2QpCisKKyAgICAgICAgIyBTdGVwIDE6IENvbnN0cnVjdCBDID0geyBJMCwgSTEsIC4uLiBJTn0sIGNvbGxlY3Rpb24gb2YgTFIoMCkgaXRlbXMKKyAgICAgICAgIyBUaGlzIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBzdGF0ZXMKKworICAgICAgICBDID0gc2VsZi5scjBfaXRlbXMoKQorCisgICAgICAgIGlmIHNlbGYubHJfbWV0aG9kID09ICdMQUxSJzoKKyAgICAgICAgICAgIHNlbGYuYWRkX2xhbHJfbG9va2FoZWFkcyhDKQorCisgICAgICAgICMgQnVpbGQgdGhlIHBhcnNlciB0YWJsZSwgc3RhdGUgYnkgc3RhdGUKKyAgICAgICAgc3QgPSAwCisgICAgICAgIGZvciBJIGluIEM6CisgICAgICAgICAgICAjIExvb3Agb3ZlciBlYWNoIHByb2R1Y3Rpb24gaW4gSQorICAgICAgICAgICAgYWN0bGlzdCA9IFsgXSAgICAgICAgICAgICAgIyBMaXN0IG9mIGFjdGlvbnMKKyAgICAgICAgICAgIHN0X2FjdGlvbiAgPSB7IH0KKyAgICAgICAgICAgIHN0X2FjdGlvbnAgPSB7IH0KKyAgICAgICAgICAgIHN0X2dvdG8gICAgPSB7IH0KKyAgICAgICAgICAgIGxvZy5pbmZvKCIiKQorICAgICAgICAgICAgbG9nLmluZm8oInN0YXRlICVkIiwgc3QpCisgICAgICAgICAgICBsb2cuaW5mbygiIikKKyAgICAgICAgICAgIGZvciBwIGluIEk6CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgICAoJWQpICVzIiwgcC5udW1iZXIsIHN0cihwKSkKKyAgICAgICAgICAgIGxvZy5pbmZvKCIiKQorCisgICAgICAgICAgICBmb3IgcCBpbiBJOgorICAgICAgICAgICAgICAgICAgICBpZiBwLmxlbiA9PSBwLmxyX2luZGV4ICsgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHAubmFtZSA9PSAiUyciOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgc3ltYm9sLiBBY2NlcHQhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uWyIkZW5kIl0gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9ucFsiJGVuZCJdID0gcAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgcHJvZHVjdGlvbi4gIFJlZHVjZSEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmxyX21ldGhvZCA9PSAnTEFMUic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhaGVhZHMgPSBwLmxvb2thaGVhZHNbc3RdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFoZWFkcyA9IHNlbGYuZ3JhbW1hci5Gb2xsb3dbcC5uYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIGxhaGVhZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGxpc3QuYXBwZW5kKChhLHAsInJlZHVjZSB1c2luZyBydWxlICVkICglcykiICUgKHAubnVtYmVyLHApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHN0X2FjdGlvbi5nZXQoYSxOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXaG9hLiBIYXZlIGEgc2hpZnQvcmVkdWNlIG9yIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHIgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTmVlZCB0byBkZWNpZGUgb24gc2hpZnQgb3IgcmVkdWNlIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5IGRlZmF1bHQgd2UgZmF2b3Igc2hpZnRpbmcuIE5lZWQgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzb21lIHByZWNlZGVuY2UgcnVsZXMgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJlYyxzbGV2ZWwgPSBQcm9kdWN0aW9uc1tzdF9hY3Rpb25wW2FdLm51bWJlcl0ucHJlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwcmVjLHJsZXZlbCA9IFByZWNlZGVuY2UuZ2V0KGEsKCdyaWdodCcsMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsZXZlbCA8IHJsZXZlbCkgb3IgKChzbGV2ZWwgPT0gcmxldmVsKSBhbmQgKHJwcmVjID09ICdsZWZ0JykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIHJlYWxseSBuZWVkIHRvIHJlZHVjZSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSAtcC5udW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9ucFthXSA9IHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNsZXZlbCBhbmQgbm90IHJsZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0IGZvciAlcyByZXNvbHZlZCBhcyByZWR1Y2UiLGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNyX2NvbmZsaWN0cy5hcHBlbmQoKHN0LGEsJ3JlZHVjZScpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0aW9uc1twLm51bWJlcl0ucmVkdWNlZCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiAoc2xldmVsID09IHJsZXZlbCkgYW5kIChycHJlYyA9PSAnbm9uYXNzb2MnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uW2FdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gR3Vlc3Mgd2UnbGwga2VlcCB0aGUgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJsZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICEgc2hpZnQvcmVkdWNlIGNvbmZsaWN0IGZvciAlcyByZXNvbHZlZCBhcyBzaGlmdCIsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JfY29uZmxpY3RzLmFwcGVuZCgoc3QsYSwnc2hpZnQnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgciA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWR1Y2UvcmVkdWNlIGNvbmZsaWN0LiAgIEluIHRoaXMgY2FzZSwgd2UgZmF2b3IgdGhlIHJ1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoYXQgd2FzIGRlZmluZWQgZmlyc3QgaW4gdGhlIGdyYW1tYXIgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZHAgPSBQcm9kdWN0aW9uc1stcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCA9IFByb2R1Y3Rpb25zW3AubnVtYmVyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9sZHAubGluZSA+IHBwLmxpbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvblthXSA9IC1wLm51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25wW2FdID0gcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5wLHJlamVjdHAgPSBwcCxvbGRwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3Rpb25zW3AubnVtYmVyXS5yZWR1Y2VkICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbb2xkcC5udW1iZXJdLnJlZHVjZWQgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob3NlbnAscmVqZWN0cCA9IG9sZHAscHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJyX2NvbmZsaWN0cy5hcHBlbmQoKHN0LGNob3NlbnAscmVqZWN0cCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgISByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGZvciAlcyByZXNvbHZlZCB1c2luZyBydWxlICVkICglcykiLCBhLHN0X2FjdGlvbnBbYV0ubnVtYmVyLCBzdF9hY3Rpb25wW2FdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMQUxSRXJyb3IoIlVua25vd24gY29uZmxpY3QgaW4gc3RhdGUgJWQiICUgc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSAtcC5udW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvbnBbYV0gPSBwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0aW9uc1twLm51bWJlcl0ucmVkdWNlZCArPSAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gcC5scl9pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHAucHJvZFtpKzFdICAgICAgICMgR2V0IHN5bWJvbCByaWdodCBhZnRlciB0aGUgIi4iCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhIGluIHNlbGYuZ3JhbW1hci5UZXJtaW5hbHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHNlbGYubHIwX2dvdG8oSSxhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBzZWxmLmxyMF9jaWRoYXNoLmdldChpZChnKSwtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBqID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgYXJlIGluIGEgc2hpZnQgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0bGlzdC5hcHBlbmQoKGEscCwic2hpZnQgYW5kIGdvIHRvIHN0YXRlICVkIiAlIGopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gc3RfYWN0aW9uLmdldChhLE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdob2EgaGF2ZSBhIHNoaWZ0L3JlZHVjZSBvciBzaGlmdC9zaGlmdCBjb25mbGljdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgciAhPSBqOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMQUxSRXJyb3IoIlNoaWZ0L3NoaWZ0IGNvbmZsaWN0IGluIHN0YXRlICVkIiAlIHN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiByIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIERvIGEgcHJlY2VkZW5jZSBjaGVjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgLSAgaWYgcHJlY2VkZW5jZSBvZiByZWR1Y2UgcnVsZSBpcyBoaWdoZXIsIHdlIHJlZHVjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgLSAgaWYgcHJlY2VkZW5jZSBvZiByZWR1Y2UgaXMgc2FtZSBhbmQgbGVmdCBhc3NvYywgd2UgcmVkdWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAtICBvdGhlcndpc2Ugd2Ugc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHJlYyxybGV2ZWwgPSBQcm9kdWN0aW9uc1tzdF9hY3Rpb25wW2FdLm51bWJlcl0ucHJlYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmVjLHNsZXZlbCA9IFByZWNlZGVuY2UuZ2V0KGEsKCdyaWdodCcsMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsZXZlbCA+IHJsZXZlbCkgb3IgKChzbGV2ZWwgPT0gcmxldmVsKSBhbmQgKHJwcmVjID09ICdyaWdodCcpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSBkZWNpZGUgdG8gc2hpZnQgaGVyZS4uLiBoaWdoZXN0IHByZWNlZGVuY2UgdG8gc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdGlvbnNbc3RfYWN0aW9ucFthXS5udW1iZXJdLnJlZHVjZWQgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSBqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2FjdGlvbnBbYV0gPSBwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBybGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgYXMgc2hpZnQiLGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNyX2NvbmZsaWN0cy5hcHBlbmQoKHN0LGEsJ3NoaWZ0JykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiAoc2xldmVsID09IHJsZXZlbCkgYW5kIChycHJlYyA9PSAnbm9uYXNzb2MnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfYWN0aW9uW2FdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSG1tbS4gR3Vlc3Mgd2UnbGwga2VlcCB0aGUgcmVkdWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzbGV2ZWwgYW5kIG5vdCBybGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBmb3IgJXMgcmVzb2x2ZWQgYXMgcmVkdWNlIixhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcl9jb25mbGljdHMuYXBwZW5kKChzdCxhLCdyZWR1Y2UnKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMQUxSRXJyb3IoIlVua25vd24gY29uZmxpY3QgaW4gc3RhdGUgJWQiICUgc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25bYV0gPSBqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9hY3Rpb25wW2FdID0gcAorCisgICAgICAgICAgICAjIFByaW50IHRoZSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRlcm1pbmFsCisgICAgICAgICAgICBfYWN0cHJpbnQgPSB7IH0KKyAgICAgICAgICAgIGZvciBhLHAsbSBpbiBhY3RsaXN0OgorICAgICAgICAgICAgICAgIGlmIGEgaW4gc3RfYWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBpZiBwIGlzIHN0X2FjdGlvbnBbYV06CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgICUtMTVzICVzIixhLG0pCisgICAgICAgICAgICAgICAgICAgICAgICBfYWN0cHJpbnRbKGEsbSldID0gMQorICAgICAgICAgICAgbG9nLmluZm8oIiIpCisgICAgICAgICAgICAjIFByaW50IHRoZSBhY3Rpb25zIHRoYXQgd2VyZSBub3QgdXNlZC4gKGRlYnVnZ2luZykKKyAgICAgICAgICAgIG5vdF91c2VkID0gMAorICAgICAgICAgICAgZm9yIGEscCxtIGluIGFjdGxpc3Q6CisgICAgICAgICAgICAgICAgaWYgYSBpbiBzdF9hY3Rpb246CisgICAgICAgICAgICAgICAgICAgIGlmIHAgaXMgbm90IHN0X2FjdGlvbnBbYV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKGEsbSkgaW4gX2FjdHByaW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAhICUtMTVzIFsgJXMgXSIsYSxtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdF91c2VkID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3RwcmludFsoYSxtKV0gPSAxCisgICAgICAgICAgICBpZiBub3RfdXNlZDoKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiIpCisKKyAgICAgICAgICAgICMgQ29uc3RydWN0IHRoZSBnb3RvIHRhYmxlIGZvciB0aGlzIHN0YXRlCisKKyAgICAgICAgICAgIG5rZXlzID0geyB9CisgICAgICAgICAgICBmb3IgaWkgaW4gSToKKyAgICAgICAgICAgICAgICBmb3IgcyBpbiBpaS51c3ltczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcyBpbiBzZWxmLmdyYW1tYXIuTm9udGVybWluYWxzOgorICAgICAgICAgICAgICAgICAgICAgICAgbmtleXNbc10gPSBOb25lCisgICAgICAgICAgICBmb3IgbiBpbiBua2V5czoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5scjBfZ290byhJLG4pCisgICAgICAgICAgICAgICAgaiA9IHNlbGYubHIwX2NpZGhhc2guZ2V0KGlkKGcpLC0xKQorICAgICAgICAgICAgICAgIGlmIGogPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgc3RfZ290b1tuXSA9IGoKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgICAlLTMwcyBzaGlmdCBhbmQgZ28gdG8gc3RhdGUgJWQiLG4saikKKworICAgICAgICAgICAgYWN0aW9uW3N0XSA9IHN0X2FjdGlvbgorICAgICAgICAgICAgYWN0aW9ucFtzdF0gPSBzdF9hY3Rpb25wCisgICAgICAgICAgICBnb3RvW3N0XSA9IHN0X2dvdG8KKyAgICAgICAgICAgIHN0ICs9IDEKKworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgd3JpdGUoKQorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBMUiBwYXJzaW5nIHRhYmxlcyB0byBhIGZpbGUKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgd3JpdGVfdGFibGUoc2VsZixtb2R1bGVuYW1lLG91dHB1dGRpcj0nJyxzaWduYXR1cmU9IiIpOgorICAgICAgICBiYXNlbW9kdWxlbmFtZSA9IG1vZHVsZW5hbWUuc3BsaXQoIi4iKVstMV0KKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLGJhc2Vtb2R1bGVuYW1lKSArICIucHkiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCJ3IikKKworICAgICAgICAgICAgZi53cml0ZSgiIiIKKyMgJXMKKyMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdC4KK190YWJ2ZXJzaW9uID0gJXIKKworX2xyX21ldGhvZCA9ICVyCisKK19scl9zaWduYXR1cmUgPSAlcgorICAgICIiIiAlIChmaWxlbmFtZSwgX190YWJ2ZXJzaW9uX18sIHNlbGYubHJfbWV0aG9kLCBzaWduYXR1cmUpKQorCisgICAgICAgICAgICAjIENoYW5nZSBzbWFsbGVyIHRvIDAgdG8gZ28gYmFjayB0byBvcmlnaW5hbCB0YWJsZXMKKyAgICAgICAgICAgIHNtYWxsZXIgPSAxCisKKyAgICAgICAgICAgICMgRmFjdG9yIG91dCBuYW1lcyB0byB0cnkgYW5kIG1ha2Ugc21hbGxlcgorICAgICAgICAgICAgaWYgc21hbGxlcjoKKyAgICAgICAgICAgICAgICBpdGVtcyA9IHsgfQorCisgICAgICAgICAgICAgICAgZm9yIHMsbmQgaW4gc2VsZi5scl9hY3Rpb24uaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSx2IGluIG5kLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgaSA9IGl0ZW1zLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpOgorICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoW10sW10pCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbbmFtZV0gPSBpCisgICAgICAgICAgICAgICAgICAgICAgaVswXS5hcHBlbmQocykKKyAgICAgICAgICAgICAgICAgICAgICBpWzFdLmFwcGVuZCh2KQorCisgICAgICAgICAgICAgICAgZi53cml0ZSgiXG5fbHJfYWN0aW9uX2l0ZW1zID0geyIpCisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBpdGVtcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlcjooWyIgJSBrKQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB2WzBdOgorICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiJXIsIiAlIGkpCisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIl0sWyIpCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHZbMV06CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIlciwiICUgaSkKKworICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCJdKSwiKQorICAgICAgICAgICAgICAgIGYud3JpdGUoIn1cbiIpCisKKyAgICAgICAgICAgICAgICBmLndyaXRlKCIiIgorX2xyX2FjdGlvbiA9IHsgfQorZm9yIF9rLCBfdiBpbiBfbHJfYWN0aW9uX2l0ZW1zLml0ZW1zKCk6CisgICBmb3IgX3gsX3kgaW4gemlwKF92WzBdLF92WzFdKToKKyAgICAgIGlmIG5vdCBfeCBpbiBfbHJfYWN0aW9uOiAgX2xyX2FjdGlvbltfeF0gPSB7IH0KKyAgICAgIF9scl9hY3Rpb25bX3hdW19rXSA9IF95CitkZWwgX2xyX2FjdGlvbl9pdGVtcworIiIiKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIlxuX2xyX2FjdGlvbiA9IHsgIik7CisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBzZWxmLmxyX2FjdGlvbi5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIoJXIsJXIpOiVyLCIgJSAoa1swXSxrWzFdLHYpKQorICAgICAgICAgICAgICAgIGYud3JpdGUoIn1cbiIpOworCisgICAgICAgICAgICBpZiBzbWFsbGVyOgorICAgICAgICAgICAgICAgICMgRmFjdG9yIG91dCBuYW1lcyB0byB0cnkgYW5kIG1ha2Ugc21hbGxlcgorICAgICAgICAgICAgICAgIGl0ZW1zID0geyB9CisKKyAgICAgICAgICAgICAgICBmb3IgcyxuZCBpbiBzZWxmLmxyX2dvdG8uaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSx2IGluIG5kLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgaSA9IGl0ZW1zLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpOgorICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoW10sW10pCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbbmFtZV0gPSBpCisgICAgICAgICAgICAgICAgICAgICAgaVswXS5hcHBlbmQocykKKyAgICAgICAgICAgICAgICAgICAgICBpWzFdLmFwcGVuZCh2KQorCisgICAgICAgICAgICAgICAgZi53cml0ZSgiXG5fbHJfZ290b19pdGVtcyA9IHsiKQorICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gaXRlbXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiJXI6KFsiICUgaykKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gdlswXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiVyLCIgJSBpKQorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCJdLFsiKQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiJXIsIiAlIGkpCisKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiXSksIikKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJ9XG4iKQorCisgICAgICAgICAgICAgICAgZi53cml0ZSgiIiIKK19scl9nb3RvID0geyB9Citmb3IgX2ssIF92IGluIF9scl9nb3RvX2l0ZW1zLml0ZW1zKCk6CisgICBmb3IgX3gsX3kgaW4gemlwKF92WzBdLF92WzFdKToKKyAgICAgICBpZiBub3QgX3ggaW4gX2xyX2dvdG86IF9scl9nb3RvW194XSA9IHsgfQorICAgICAgIF9scl9nb3RvW194XVtfa10gPSBfeQorZGVsIF9scl9nb3RvX2l0ZW1zCisiIiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIlxuX2xyX2dvdG8gPSB7ICIpOworICAgICAgICAgICAgICAgIGZvciBrLHYgaW4gc2VsZi5scl9nb3RvLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiglciwlcik6JXIsIiAlIChrWzBdLGtbMV0sdikpCisgICAgICAgICAgICAgICAgZi53cml0ZSgifVxuIik7CisKKyAgICAgICAgICAgICMgV3JpdGUgcHJvZHVjdGlvbiB0YWJsZQorICAgICAgICAgICAgZi53cml0ZSgiX2xyX3Byb2R1Y3Rpb25zID0gW1xuIikKKyAgICAgICAgICAgIGZvciBwIGluIHNlbGYubHJfcHJvZHVjdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgcC5mdW5jOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIgICglciwlciwlZCwlciwlciwlZCksXG4iICUgKHAuc3RyLHAubmFtZSwgcC5sZW4sIHAuZnVuYyxwLmZpbGUscC5saW5lKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIgICglciwlciwlZCxOb25lLE5vbmUsTm9uZSksXG4iICUgKHN0cihwKSxwLm5hbWUsIHAubGVuKSkKKyAgICAgICAgICAgIGYud3JpdGUoIl1cbiIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnXG4iICUgZmlsZW5hbWUpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHN0cihlKSsiXG4iKQorICAgICAgICAgICAgcmV0dXJuCisKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHBpY2tsZV90YWJsZSgpCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiBwaWNrbGVzIHRoZSBMUiBwYXJzaW5nIHRhYmxlcyB0byBhIHN1cHBsaWVkIGZpbGUgb2JqZWN0CisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHBpY2tsZV90YWJsZShzZWxmLGZpbGVuYW1lLHNpZ25hdHVyZT0iIik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIG91dGYgPSBvcGVuKGZpbGVuYW1lLCJ3YiIpCisgICAgICAgIHBpY2tsZS5kdW1wKF9fdGFidmVyc2lvbl9fLG91dGYscGlja2xlX3Byb3RvY29sKQorICAgICAgICBwaWNrbGUuZHVtcChzZWxmLmxyX21ldGhvZCxvdXRmLHBpY2tsZV9wcm90b2NvbCkKKyAgICAgICAgcGlja2xlLmR1bXAoc2lnbmF0dXJlLG91dGYscGlja2xlX3Byb3RvY29sKQorICAgICAgICBwaWNrbGUuZHVtcChzZWxmLmxyX2FjdGlvbixvdXRmLHBpY2tsZV9wcm90b2NvbCkKKyAgICAgICAgcGlja2xlLmR1bXAoc2VsZi5scl9nb3RvLG91dGYscGlja2xlX3Byb3RvY29sKQorCisgICAgICAgIG91dHAgPSBbXQorICAgICAgICBmb3IgcCBpbiBzZWxmLmxyX3Byb2R1Y3Rpb25zOgorICAgICAgICAgICAgaWYgcC5mdW5jOgorICAgICAgICAgICAgICAgIG91dHAuYXBwZW5kKChwLnN0cixwLm5hbWUsIHAubGVuLCBwLmZ1bmMscC5maWxlLHAubGluZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dHAuYXBwZW5kKChzdHIocCkscC5uYW1lLHAubGVuLE5vbmUsTm9uZSxOb25lKSkKKyAgICAgICAgcGlja2xlLmR1bXAob3V0cCxvdXRmLHBpY2tsZV9wcm90b2NvbCkKKyAgICAgICAgb3V0Zi5jbG9zZSgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IElOVFJPU1BFQ1RJT04gPT09CisjCisjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgUExZCisjIGludHJvc3BlY3Rpb24gZmVhdHVyZXMgZm9sbG93ZWQgYnkgdGhlIHlhY2MoKSBmdW5jdGlvbiBpdHNlbGYuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZ2V0X2NhbGxlcl9tb2R1bGVfZGljdCgpCisjCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgb2YgdGhlIHN5bWJvbHMgZGVmaW5lZCB3aXRoaW4KKyMgYSBjYWxsZXIgZnVydGhlciBkb3duIHRoZSBjYWxsIHN0YWNrLiAgVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgZW52aXJvbm1lbnQKKyMgYXNzb2NpYXRlZCB3aXRoIHRoZSB5YWNjKCkgY2FsbCBpZiBub25lIHdhcyBwcm92aWRlZC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGdldF9jYWxsZXJfbW9kdWxlX2RpY3QobGV2ZWxzKToKKyAgICB0cnk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgIGUsYix0ID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgZiA9IHQudGJfZnJhbWUKKyAgICAgICAgd2hpbGUgbGV2ZWxzID4gMDoKKyAgICAgICAgICAgIGYgPSBmLmZfYmFjayAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGxldmVscyAtPSAxCisgICAgICAgIGxkaWN0ID0gZi5mX2dsb2JhbHMuY29weSgpCisgICAgICAgIGlmIGYuZl9nbG9iYWxzICE9IGYuZl9sb2NhbHM6CisgICAgICAgICAgICBsZGljdC51cGRhdGUoZi5mX2xvY2FscykKKworICAgICAgICByZXR1cm4gbGRpY3QKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBwYXJzZV9ncmFtbWFyKCkKKyMKKyMgVGhpcyB0YWtlcyBhIHJhdyBncmFtbWFyIHJ1bGUgc3RyaW5nIGFuZCBwYXJzZXMgaXQgaW50byBwcm9kdWN0aW9uIGRhdGEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiBwYXJzZV9ncmFtbWFyKGRvYyxmaWxlLGxpbmUpOgorICAgIGdyYW1tYXIgPSBbXQorICAgICMgU3BsaXQgdGhlIGRvYyBzdHJpbmcgaW50byBsaW5lcworICAgIHBzdHJpbmdzID0gZG9jLnNwbGl0bGluZXMoKQorICAgIGxhc3RwID0gTm9uZQorICAgIGRsaW5lID0gbGluZQorICAgIGZvciBwcyBpbiBwc3RyaW5nczoKKyAgICAgICAgZGxpbmUgKz0gMQorICAgICAgICBwID0gcHMuc3BsaXQoKQorICAgICAgICBpZiBub3QgcDogY29udGludWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgcFswXSA9PSAnfCc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgY29udGludWF0aW9uIG9mIGEgcHJldmlvdXMgcnVsZQorICAgICAgICAgICAgICAgIGlmIG5vdCBsYXN0cDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIiVzOiVkOiBNaXNwbGFjZWQgJ3wnIiAlIChmaWxlLGRsaW5lKSkKKyAgICAgICAgICAgICAgICBwcm9kbmFtZSA9IGxhc3RwCisgICAgICAgICAgICAgICAgc3ltcyA9IHBbMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByb2RuYW1lID0gcFswXQorICAgICAgICAgICAgICAgIGxhc3RwID0gcHJvZG5hbWUKKyAgICAgICAgICAgICAgICBzeW1zICAgPSBwWzI6XQorICAgICAgICAgICAgICAgIGFzc2lnbiA9IHBbMV0KKyAgICAgICAgICAgICAgICBpZiBhc3NpZ24gIT0gJzonIGFuZCBhc3NpZ24gIT0gJzo6PSc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCIlczolZDogU3ludGF4IGVycm9yLiBFeHBlY3RlZCAnOiciICUgKGZpbGUsZGxpbmUpKQorCisgICAgICAgICAgICBncmFtbWFyLmFwcGVuZCgoZmlsZSxkbGluZSxwcm9kbmFtZSxzeW1zKSkKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCIlczolZDogU3ludGF4IGVycm9yIGluIHJ1bGUgJyVzJyIgJSAoZmlsZSxkbGluZSxwcy5zdHJpcCgpKSkKKworICAgIHJldHVybiBncmFtbWFyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUGFyc2VyUmVmbGVjdCgpCisjCisjIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZm9yIGJ1aWxkaW5nIGEgcGFyc2VyIGluY2x1ZGluZworIyBzdGFydCBzeW1ib2wsIGVycm9yIGZ1bmN0aW9uLCB0b2tlbnMsIHByZWNlZGVuY2UgbGlzdCwgYWN0aW9uIGZ1bmN0aW9ucywKKyMgZXRjLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgUGFyc2VyUmVmbGVjdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHBkaWN0LGxvZz1Ob25lKToKKyAgICAgICAgc2VsZi5wZGljdCAgICAgID0gcGRpY3QKKyAgICAgICAgc2VsZi5zdGFydCAgICAgID0gTm9uZQorICAgICAgICBzZWxmLmVycm9yX2Z1bmMgPSBOb25lCisgICAgICAgIHNlbGYudG9rZW5zICAgICA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlcyAgICAgID0ge30KKyAgICAgICAgc2VsZi5ncmFtbWFyICAgID0gW10KKyAgICAgICAgc2VsZi5lcnJvciAgICAgID0gMAorCisgICAgICAgIGlmIGxvZyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5sb2cgPSBQbHlMb2dnZXIoc3lzLnN0ZGVycikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubG9nID0gbG9nCisKKyAgICAjIEdldCBhbGwgb2YgdGhlIGJhc2ljIGluZm9ybWF0aW9uCisgICAgZGVmIGdldF9hbGwoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0X3N0YXJ0KCkKKyAgICAgICAgc2VsZi5nZXRfZXJyb3JfZnVuYygpCisgICAgICAgIHNlbGYuZ2V0X3Rva2VucygpCisgICAgICAgIHNlbGYuZ2V0X3ByZWNlZGVuY2UoKQorICAgICAgICBzZWxmLmdldF9wZnVuY3Rpb25zKCkKKyAgICAgICAgCisgICAgIyBWYWxpZGF0ZSBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisgICAgZGVmIHZhbGlkYXRlX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9zdGFydCgpCisgICAgICAgIHNlbGYudmFsaWRhdGVfZXJyb3JfZnVuYygpCisgICAgICAgIHNlbGYudmFsaWRhdGVfdG9rZW5zKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9wcmVjZWRlbmNlKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9wZnVuY3Rpb25zKCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9maWxlcygpCisgICAgICAgIHJldHVybiBzZWxmLmVycm9yCisKKyAgICAjIENvbXB1dGUgYSBzaWduYXR1cmUgb3ZlciB0aGUgZ3JhbW1hcgorICAgIGRlZiBzaWduYXR1cmUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gaGFzaGxpYiBpbXBvcnQgbWQ1CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGZyb20gbWQ1IGltcG9ydCBtZDUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2lnID0gbWQ1KCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhcnQ6CisgICAgICAgICAgICAgICAgc2lnLnVwZGF0ZShzZWxmLnN0YXJ0LmVuY29kZSgnbGF0aW4tMScpKQorICAgICAgICAgICAgaWYgc2VsZi5wcmVjOgorICAgICAgICAgICAgICAgIHNpZy51cGRhdGUoIiIuam9pbihbIiIuam9pbihwKSBmb3IgcCBpbiBzZWxmLnByZWNdKS5lbmNvZGUoJ2xhdGluLTEnKSkKKyAgICAgICAgICAgIGlmIHNlbGYudG9rZW5zOgorICAgICAgICAgICAgICAgIHNpZy51cGRhdGUoIiAiLmpvaW4oc2VsZi50b2tlbnMpLmVuY29kZSgnbGF0aW4tMScpKQorICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi5wZnVuY3M6CisgICAgICAgICAgICAgICAgaWYgZlszXToKKyAgICAgICAgICAgICAgICAgICAgc2lnLnVwZGF0ZShmWzNdLmVuY29kZSgnbGF0aW4tMScpKQorICAgICAgICBleGNlcHQgKFR5cGVFcnJvcixWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHNpZy5kaWdlc3QoKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgdmFsaWRhdGVfZmlsZSgpCisgICAgIworICAgICMgVGhpcyBtZXRob2QgY2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBhcmUgZHVwbGljYXRlZCBwX3J1bGVuYW1lKCkgZnVuY3Rpb25zCisgICAgIyBpbiB0aGUgcGFyc2VyIG1vZHVsZSBmaWxlLiAgV2l0aG91dCB0aGlzIGZ1bmN0aW9uLCBpdCBpcyByZWFsbHkgZWFzeSBmb3IKKyAgICAjIHVzZXJzIHRvIG1ha2UgbWlzdGFrZXMgYnkgY3V0dGluZyBhbmQgcGFzdGluZyBjb2RlIGZyYWdtZW50cyAoYW5kIGl0J3MgYSByZWFsCisgICAgIyBidWdnZXIgdG8gdHJ5IGFuZCBmaWd1cmUgb3V0IHdoeSB0aGUgcmVzdWx0aW5nIHBhcnNlciBkb2Vzbid0IHdvcmspLiAgVGhlcmVmb3JlLAorICAgICMgd2UganVzdCBkbyBhIGxpdHRsZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBtYXRjaGluZyBvZiBkZWYgc3RhdGVtZW50cworICAgICMgdG8gdHJ5IGFuZCBkZXRlY3QgZHVwbGljYXRlcy4KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdmFsaWRhdGVfZmlsZXMoc2VsZik6CisgICAgICAgICMgTWF0Y2ggZGVmIHBfZnVuY25hbWUoCisgICAgICAgIGZyZSA9IHJlLmNvbXBpbGUocidccypkZWZccysocF9bYS16QS1aXzAtOV0qKVwoJykKKworICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc2VsZi5maWxlcy5rZXlzKCk6CisgICAgICAgICAgICBiYXNlLGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBleHQgIT0gJy5weSc6IHJldHVybiAxICAgICAgICAgICMgTm8gaWRlYS4gQXNzdW1lIGl0J3Mgb2theS4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgY291bnRoYXNoID0geyB9CisgICAgICAgICAgICBmb3IgbGluZW4sbCBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgICAgIGxpbmVuICs9IDEKKyAgICAgICAgICAgICAgICBtID0gZnJlLm1hdGNoKGwpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGNvdW50aGFzaC5nZXQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByZXY6CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGhhc2hbbmFtZV0gPSBsaW5lbgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygiJXM6JWQ6IEZ1bmN0aW9uICVzIHJlZGVmaW5lZC4gUHJldmlvdXNseSBkZWZpbmVkIG9uIGxpbmUgJWQiLCBmaWxlbmFtZSxsaW5lbixuYW1lLHByZXYpCisKKyAgICAjIEdldCB0aGUgc3RhcnQgc3ltYm9sCisgICAgZGVmIGdldF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYucGRpY3QuZ2V0KCdzdGFydCcpCisKKyAgICAjIFZhbGlkYXRlIHRoZSBzdGFydCBzeW1ib2wKKyAgICBkZWYgdmFsaWRhdGVfc3RhcnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnN0YXJ0LHN0cik6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIidzdGFydCcgbXVzdCBiZSBhIHN0cmluZyIpCisKKyAgICAjIExvb2sgZm9yIGVycm9yIGhhbmRsZXIKKyAgICBkZWYgZ2V0X2Vycm9yX2Z1bmMoc2VsZik6CisgICAgICAgIHNlbGYuZXJyb3JfZnVuYyA9IHNlbGYucGRpY3QuZ2V0KCdwX2Vycm9yJykKKworICAgICMgVmFsaWRhdGUgdGhlIGVycm9yIGZ1bmN0aW9uCisgICAgZGVmIHZhbGlkYXRlX2Vycm9yX2Z1bmMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZXJyb3JfZnVuYzoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5lcnJvcl9mdW5jLHR5cGVzLkZ1bmN0aW9uVHlwZSk6CisgICAgICAgICAgICAgICAgaXNtZXRob2QgPSAwCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZi5lcnJvcl9mdW5jLCB0eXBlcy5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICBpc21ldGhvZCA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIidwX2Vycm9yJyBkZWZpbmVkLCBidXQgaXMgbm90IGEgZnVuY3Rpb24gb3IgbWV0aG9kIikKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBlbGluZSA9IGZ1bmNfY29kZShzZWxmLmVycm9yX2Z1bmMpLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICBlZmlsZSA9IGZ1bmNfY29kZShzZWxmLmVycm9yX2Z1bmMpLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBzZWxmLmZpbGVzW2VmaWxlXSA9IDEKKworICAgICAgICAgICAgaWYgKGZ1bmNfY29kZShzZWxmLmVycm9yX2Z1bmMpLmNvX2FyZ2NvdW50ICE9IDEraXNtZXRob2QpOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlczolZDogcF9lcnJvcigpIHJlcXVpcmVzIDEgYXJndW1lbnQiLGVmaWxlLGVsaW5lKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisKKyAgICAjIEdldCB0aGUgdG9rZW5zIG1hcAorICAgIGRlZiBnZXRfdG9rZW5zKHNlbGYpOgorICAgICAgICB0b2tlbnMgPSBzZWxmLnBkaWN0LmdldCgidG9rZW5zIixOb25lKQorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIk5vIHRva2VuIGxpc3QgaXMgZGVmaW5lZCIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodG9rZW5zLChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInRva2VucyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICBpZiBub3QgdG9rZW5zOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInRva2VucyBpcyBlbXB0eSIpCisgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi50b2tlbnMgPSB0b2tlbnMKKworICAgICMgVmFsaWRhdGUgdGhlIHRva2VucworICAgIGRlZiB2YWxpZGF0ZV90b2tlbnMoc2VsZik6CisgICAgICAgICMgVmFsaWRhdGUgdGhlIHRva2Vucy4KKyAgICAgICAgaWYgJ2Vycm9yJyBpbiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJJbGxlZ2FsIHRva2VuIG5hbWUgJ2Vycm9yJy4gSXMgYSByZXNlcnZlZCB3b3JkIikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0ZXJtaW5hbHMgPSB7fQorICAgICAgICBmb3IgbiBpbiBzZWxmLnRva2VuczoKKyAgICAgICAgICAgIGlmIG4gaW4gdGVybWluYWxzOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLndhcm5pbmcoIlRva2VuICclcycgbXVsdGlwbHkgZGVmaW5lZCIsIG4pCisgICAgICAgICAgICB0ZXJtaW5hbHNbbl0gPSAxCisKKyAgICAjIEdldCB0aGUgcHJlY2VkZW5jZSBtYXAgKGlmIGFueSkKKyAgICBkZWYgZ2V0X3ByZWNlZGVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYucHJlYyA9IHNlbGYucGRpY3QuZ2V0KCJwcmVjZWRlbmNlIixOb25lKQorCisgICAgIyBWYWxpZGF0ZSBhbmQgcGFyc2UgdGhlIHByZWNlZGVuY2UgbWFwCisgICAgZGVmIHZhbGlkYXRlX3ByZWNlZGVuY2Uoc2VsZik6CisgICAgICAgIHByZWNsaXN0ID0gW10KKyAgICAgICAgaWYgc2VsZi5wcmVjOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5wcmVjLChsaXN0LHR1cGxlKSk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInByZWNlZGVuY2UgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUiKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmb3IgbGV2ZWwscCBpbiBlbnVtZXJhdGUoc2VsZi5wcmVjKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwLChsaXN0LHR1cGxlKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJCYWQgcHJlY2VkZW5jZSB0YWJsZSIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAgICAgaWYgbGVuKHApIDwgMjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIk1hbGZvcm1lZCBwcmVjZWRlbmNlIGVudHJ5ICVzLiBNdXN0IGJlIChhc3NvYywgdGVybSwgLi4uLCB0ZXJtKSIscCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgYXNzb2MgPSBwWzBdCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXNzb2Msc3RyKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoInByZWNlZGVuY2UgYXNzb2NpYXRpdml0eSBtdXN0IGJlIGEgc3RyaW5nIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZm9yIHRlcm0gaW4gcFsxOl06CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRlcm0sc3RyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJwcmVjZWRlbmNlIGl0ZW1zIG11c3QgYmUgc3RyaW5ncyIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHByZWNsaXN0LmFwcGVuZCgodGVybSxhc3NvYyxsZXZlbCsxKSkKKyAgICAgICAgc2VsZi5wcmVjbGlzdCA9IHByZWNsaXN0CisKKyAgICAjIEdldCBhbGwgcF9mdW5jdGlvbnMgZnJvbSB0aGUgZ3JhbW1hcgorICAgIGRlZiBnZXRfcGZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgcF9mdW5jdGlvbnMgPSBbXQorICAgICAgICBmb3IgbmFtZSwgaXRlbSBpbiBzZWxmLnBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lWzoyXSAhPSAncF8nOiBjb250aW51ZQorICAgICAgICAgICAgaWYgbmFtZSA9PSAncF9lcnJvcic6IGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sKHR5cGVzLkZ1bmN0aW9uVHlwZSx0eXBlcy5NZXRob2RUeXBlKSk6CisgICAgICAgICAgICAgICAgbGluZSA9IGZ1bmNfY29kZShpdGVtKS5jb19maXJzdGxpbmVubworICAgICAgICAgICAgICAgIGZpbGUgPSBmdW5jX2NvZGUoaXRlbSkuY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBwX2Z1bmN0aW9ucy5hcHBlbmQoKGxpbmUsZmlsZSxuYW1lLGl0ZW0uX19kb2NfXykpCisKKyAgICAgICAgIyBTb3J0IGFsbCBvZiB0aGUgYWN0aW9ucyBieSBsaW5lIG51bWJlcgorICAgICAgICBwX2Z1bmN0aW9ucy5zb3J0KCkKKyAgICAgICAgc2VsZi5wZnVuY3MgPSBwX2Z1bmN0aW9ucworCisKKyAgICAjIFZhbGlkYXRlIGFsbCBvZiB0aGUgcF9mdW5jdGlvbnMKKyAgICBkZWYgdmFsaWRhdGVfcGZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgZ3JhbW1hciA9IFtdCisgICAgICAgICMgQ2hlY2sgZm9yIG5vbi1lbXB0eSBzeW1ib2xzCisgICAgICAgIGlmIGxlbihzZWxmLnBmdW5jcykgPT0gMDoKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJubyBydWxlcyBvZiB0aGUgZm9ybSBwX3J1bGVuYW1lIGFyZSBkZWZpbmVkIikKKyAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAxCisgICAgICAgICAgICByZXR1cm4gCisgICAgICAgIAorICAgICAgICBmb3IgbGluZSwgZmlsZSwgbmFtZSwgZG9jIGluIHNlbGYucGZ1bmNzOgorICAgICAgICAgICAgZnVuYyA9IHNlbGYucGRpY3RbbmFtZV0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnVuYywgdHlwZXMuTWV0aG9kVHlwZSk6CisgICAgICAgICAgICAgICAgcmVxYXJncyA9IDIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVxYXJncyA9IDEKKyAgICAgICAgICAgIGlmIGZ1bmNfY29kZShmdW5jKS5jb19hcmdjb3VudCA+IHJlcWFyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzOiVkOiBSdWxlICclcycgaGFzIHRvbyBtYW55IGFyZ3VtZW50cyIsZmlsZSxsaW5lLGZ1bmMuX19uYW1lX18pCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIGVsaWYgZnVuY19jb2RlKGZ1bmMpLmNvX2FyZ2NvdW50IDwgcmVxYXJnczoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigiJXM6JWQ6IFJ1bGUgJyVzJyByZXF1aXJlcyBhbiBhcmd1bWVudCIsZmlsZSxsaW5lLGZ1bmMuX19uYW1lX18pCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvciA9IDEKKyAgICAgICAgICAgIGVsaWYgbm90IGZ1bmMuX19kb2NfXzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCIlczolZDogTm8gZG9jdW1lbnRhdGlvbiBzdHJpbmcgc3BlY2lmaWVkIGluIGZ1bmN0aW9uICclcycgKGlnbm9yZWQpIixmaWxlLGxpbmUsZnVuYy5fX25hbWVfXykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXJzZWRfZyA9IHBhcnNlX2dyYW1tYXIoZG9jLGZpbGUsbGluZSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGcgaW4gcGFyc2VkX2c6CisgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyLmFwcGVuZCgobmFtZSwgZykpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3Ioc3RyKGUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yID0gMQorCisgICAgICAgICAgICAgICAgIyBMb29rcyBsaWtlIGEgdmFsaWQgZ3JhbW1hciBydWxlCisgICAgICAgICAgICAgICAgIyBNYXJrIHRoZSBmaWxlIGluIHdoaWNoIGRlZmluZWQuCisgICAgICAgICAgICAgICAgc2VsZi5maWxlc1tmaWxlXSA9IDEKKworICAgICAgICAjIFNlY29uZGFyeSB2YWxpZGF0aW9uIHN0ZXAgdGhhdCBsb29rcyBmb3IgcF8gZGVmaW5pdGlvbnMgdGhhdCBhcmUgbm90IGZ1bmN0aW9ucworICAgICAgICAjIG9yIGZ1bmN0aW9ucyB0aGF0IGxvb2sgbGlrZSB0aGV5IG1pZ2h0IGJlIGdyYW1tYXIgcnVsZXMuCisKKyAgICAgICAgZm9yIG4sdiBpbiBzZWxmLnBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuWzA6Ml0gPT0gJ3BfJyBhbmQgaXNpbnN0YW5jZSh2LCAodHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5NZXRob2RUeXBlKSk6IGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuWzA6Ml0gPT0gJ3RfJzogY29udGludWUKKyAgICAgICAgICAgIGlmIG5bMDoyXSA9PSAncF8nIGFuZCBuICE9ICdwX2Vycm9yJzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCInJXMnIG5vdCBkZWZpbmVkIGFzIGEgZnVuY3Rpb24iLCBuKQorICAgICAgICAgICAgaWYgKChpc2luc3RhbmNlKHYsdHlwZXMuRnVuY3Rpb25UeXBlKSBhbmQgZnVuY19jb2RlKHYpLmNvX2FyZ2NvdW50ID09IDEpIG9yCisgICAgICAgICAgICAgICAgKGlzaW5zdGFuY2Uodix0eXBlcy5NZXRob2RUeXBlKSBhbmQgZnVuY19jb2RlKHYpLmNvX2FyZ2NvdW50ID09IDIpKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRvYyA9IHYuX19kb2NfXy5zcGxpdCgiICIpCisgICAgICAgICAgICAgICAgICAgIGlmIGRvY1sxXSA9PSAnOic6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy53YXJuaW5nKCIlczolZDogUG9zc2libGUgZ3JhbW1hciBydWxlICclcycgZGVmaW5lZCB3aXRob3V0IHBfIHByZWZpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfY29kZSh2KS5jb19maWxlbmFtZSwgZnVuY19jb2RlKHYpLmNvX2ZpcnN0bGluZW5vLG4pCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuZ3JhbW1hciA9IGdyYW1tYXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB5YWNjKG1vZHVsZSkKKyMKKyMgQnVpbGQgYSBwYXJzZXIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHlhY2MobWV0aG9kPSdMQUxSJywgZGVidWc9eWFjY2RlYnVnLCBtb2R1bGU9Tm9uZSwgdGFibW9kdWxlPXRhYl9tb2R1bGUsIHN0YXJ0PU5vbmUsIAorICAgICAgICAgY2hlY2tfcmVjdXJzaW9uPTEsIG9wdGltaXplPTAsIHdyaXRlX3RhYmxlcz0xLCBkZWJ1Z2ZpbGU9ZGVidWdfZmlsZSxvdXRwdXRkaXI9JycsCisgICAgICAgICBkZWJ1Z2xvZz1Ob25lLCBlcnJvcmxvZyA9IE5vbmUsIHBpY2tsZWZpbGU9Tm9uZSk6CisKKyAgICBnbG9iYWwgcGFyc2UgICAgICAgICAgICAgICAgICMgUmVmZXJlbmNlIHRvIHRoZSBwYXJzaW5nIG1ldGhvZCBvZiB0aGUgbGFzdCBidWlsdCBwYXJzZXIKKworICAgICMgSWYgcGlja2xpbmcgaXMgZW5hYmxlZCwgdGFibGUgZmlsZXMgYXJlIG5vdCBjcmVhdGVkCisKKyAgICBpZiBwaWNrbGVmaWxlOgorICAgICAgICB3cml0ZV90YWJsZXMgPSAwCisKKyAgICBpZiBlcnJvcmxvZyBpcyBOb25lOgorICAgICAgICBlcnJvcmxvZyA9IFBseUxvZ2dlcihzeXMuc3RkZXJyKQorCisgICAgIyBHZXQgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHVzZWQgZm9yIHRoZSBwYXJzZXIKKyAgICBpZiBtb2R1bGU6CisgICAgICAgIF9pdGVtcyA9IFsoayxnZXRhdHRyKG1vZHVsZSxrKSkgZm9yIGsgaW4gZGlyKG1vZHVsZSldCisgICAgICAgIHBkaWN0ID0gZGljdChfaXRlbXMpCisgICAgZWxzZToKKyAgICAgICAgcGRpY3QgPSBnZXRfY2FsbGVyX21vZHVsZV9kaWN0KDIpCisKKyAgICAjIENvbGxlY3QgcGFyc2VyIGluZm9ybWF0aW9uIGZyb20gdGhlIGRpY3Rpb25hcnkKKyAgICBwaW5mbyA9IFBhcnNlclJlZmxlY3QocGRpY3QsbG9nPWVycm9ybG9nKQorICAgIHBpbmZvLmdldF9hbGwoKQorCisgICAgaWYgcGluZm8uZXJyb3I6CisgICAgICAgIHJhaXNlIFlhY2NFcnJvcigiVW5hYmxlIHRvIGJ1aWxkIHBhcnNlciIpCisKKyAgICAjIENoZWNrIHNpZ25hdHVyZSBhZ2FpbnN0IHRhYmxlIGZpbGVzIChpZiBhbnkpCisgICAgc2lnbmF0dXJlID0gcGluZm8uc2lnbmF0dXJlKCkKKworICAgICMgUmVhZCB0aGUgdGFibGVzCisgICAgdHJ5OgorICAgICAgICBsciA9IExSVGFibGUoKQorICAgICAgICBpZiBwaWNrbGVmaWxlOgorICAgICAgICAgICAgcmVhZF9zaWduYXR1cmUgPSBsci5yZWFkX3BpY2tsZShwaWNrbGVmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVhZF9zaWduYXR1cmUgPSBsci5yZWFkX3RhYmxlKHRhYm1vZHVsZSkKKyAgICAgICAgaWYgb3B0aW1pemUgb3IgKHJlYWRfc2lnbmF0dXJlID09IHNpZ25hdHVyZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbHIuYmluZF9jYWxsYWJsZXMocGluZm8ucGRpY3QpCisgICAgICAgICAgICAgICAgcGFyc2VyID0gTFJQYXJzZXIobHIscGluZm8uZXJyb3JfZnVuYykKKyAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlci5wYXJzZQorICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXIKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygiVGhlcmUgd2FzIGEgcHJvYmxlbSBsb2FkaW5nIHRoZSB0YWJsZSBmaWxlOiAlcyIsIHJlcHIoZSkpCisgICAgZXhjZXB0IFZlcnNpb25FcnJvcjoKKyAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoc3RyKGUpKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHBhc3MKKworICAgIGlmIGRlYnVnbG9nIGlzIE5vbmU6CisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgZGVidWdsb2cgPSBQbHlMb2dnZXIob3BlbihkZWJ1Z2ZpbGUsInciKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlYnVnbG9nID0gTnVsbExvZ2dlcigpCisKKyAgICBkZWJ1Z2xvZy5pbmZvKCJDcmVhdGVkIGJ5IFBMWSB2ZXJzaW9uICVzIChodHRwOi8vd3d3LmRhYmVhei5jb20vcGx5KSIsIF9fdmVyc2lvbl9fKQorCisKKyAgICBlcnJvcnMgPSAwCisKKyAgICAjIFZhbGlkYXRlIHRoZSBwYXJzZXIgaW5mb3JtYXRpb24KKyAgICBpZiBwaW5mby52YWxpZGF0ZV9hbGwoKToKKyAgICAgICAgcmFpc2UgWWFjY0Vycm9yKCJVbmFibGUgdG8gYnVpbGQgcGFyc2VyIikKKyAgICAKKyAgICBpZiBub3QgcGluZm8uZXJyb3JfZnVuYzoKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygibm8gcF9lcnJvcigpIGZ1bmN0aW9uIGlzIGRlZmluZWQiKQorCisgICAgIyBDcmVhdGUgYSBncmFtbWFyIG9iamVjdAorICAgIGdyYW1tYXIgPSBHcmFtbWFyKHBpbmZvLnRva2VucykKKworICAgICMgU2V0IHByZWNlZGVuY2UgbGV2ZWwgZm9yIHRlcm1pbmFscworICAgIGZvciB0ZXJtLCBhc3NvYywgbGV2ZWwgaW4gcGluZm8ucHJlY2xpc3Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdyYW1tYXIuc2V0X3ByZWNlZGVuY2UodGVybSxhc3NvYyxsZXZlbCkKKyAgICAgICAgZXhjZXB0IEdyYW1tYXJFcnJvcjoKKyAgICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygiJXMiLHN0cihlKSkKKworICAgICMgQWRkIHByb2R1Y3Rpb25zIHRvIHRoZSBncmFtbWFyCisgICAgZm9yIGZ1bmNuYW1lLCBncmFtIGluIHBpbmZvLmdyYW1tYXI6CisgICAgICAgIGZpbGUsIGxpbmUsIHByb2RuYW1lLCBzeW1zID0gZ3JhbQorICAgICAgICB0cnk6CisgICAgICAgICAgICBncmFtbWFyLmFkZF9wcm9kdWN0aW9uKHByb2RuYW1lLHN5bXMsZnVuY25hbWUsZmlsZSxsaW5lKQorICAgICAgICBleGNlcHQgR3JhbW1hckVycm9yOgorICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICBlcnJvcmxvZy5lcnJvcigiJXMiLHN0cihlKSkKKyAgICAgICAgICAgIGVycm9ycyA9IDEKKworICAgICMgU2V0IHRoZSBncmFtbWFyIHN0YXJ0IHN5bWJvbHMKKyAgICB0cnk6CisgICAgICAgIGlmIHN0YXJ0IGlzIE5vbmU6CisgICAgICAgICAgICBncmFtbWFyLnNldF9zdGFydChwaW5mby5zdGFydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdyYW1tYXIuc2V0X3N0YXJ0KHN0YXJ0KQorICAgIGV4Y2VwdCBHcmFtbWFyRXJyb3I6CisgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICBlcnJvcmxvZy5lcnJvcihzdHIoZSkpCisgICAgICAgIGVycm9ycyA9IDEKKworICAgIGlmIGVycm9yczoKKyAgICAgICAgcmFpc2UgWWFjY0Vycm9yKCJVbmFibGUgdG8gYnVpbGQgcGFyc2VyIikKKworICAgICMgVmVyaWZ5IHRoZSBncmFtbWFyIHN0cnVjdHVyZQorICAgIHVuZGVmaW5lZF9zeW1ib2xzID0gZ3JhbW1hci51bmRlZmluZWRfc3ltYm9scygpCisgICAgZm9yIHN5bSwgcHJvZCBpbiB1bmRlZmluZWRfc3ltYm9sczoKKyAgICAgICAgZXJyb3Jsb2cuZXJyb3IoIiVzOiVkOiBTeW1ib2wgJyVzJyB1c2VkLCBidXQgbm90IGRlZmluZWQgYXMgYSB0b2tlbiBvciBhIHJ1bGUiLHByb2QuZmlsZSxwcm9kLmxpbmUsc3ltKQorICAgICAgICBlcnJvcnMgPSAxCisKKyAgICB1bnVzZWRfdGVybWluYWxzID0gZ3JhbW1hci51bnVzZWRfdGVybWluYWxzKCkKKyAgICBpZiB1bnVzZWRfdGVybWluYWxzOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIiKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJVbnVzZWQgdGVybWluYWxzOiIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIGZvciB0ZXJtIGluIHVudXNlZF90ZXJtaW5hbHM6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJUb2tlbiAnJXMnIGRlZmluZWQsIGJ1dCBub3QgdXNlZCIsIHRlcm0pCisgICAgICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIgICAgJXMiLCB0ZXJtKQorCisgICAgIyBQcmludCBvdXQgYWxsIHByb2R1Y3Rpb25zIHRvIHRoZSBkZWJ1ZyBsb2cKKyAgICBpZiBkZWJ1ZzoKKyAgICAgICAgZGVidWdsb2cuaW5mbygiIikKKyAgICAgICAgZGVidWdsb2cuaW5mbygiR3JhbW1hciIpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisgICAgICAgIGZvciBuLHAgaW4gZW51bWVyYXRlKGdyYW1tYXIuUHJvZHVjdGlvbnMpOgorICAgICAgICAgICAgZGVidWdsb2cuaW5mbygiUnVsZSAlLTVkICVzIiwgbiwgcCkKKworICAgICMgRmluZCB1bnVzZWQgbm9uLXRlcm1pbmFscworICAgIHVudXNlZF9ydWxlcyA9IGdyYW1tYXIudW51c2VkX3J1bGVzKCkKKyAgICBmb3IgcHJvZCBpbiB1bnVzZWRfcnVsZXM6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIiVzOiVkOiBSdWxlICclcycgZGVmaW5lZCwgYnV0IG5vdCB1c2VkIiwgcHJvZC5maWxlLCBwcm9kLmxpbmUsIHByb2QubmFtZSkKKworICAgIGlmIGxlbih1bnVzZWRfdGVybWluYWxzKSA9PSAxOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJUaGVyZSBpcyAxIHVudXNlZCB0b2tlbiIpCisgICAgaWYgbGVuKHVudXNlZF90ZXJtaW5hbHMpID4gMToKKyAgICAgICAgZXJyb3Jsb2cud2FybmluZygiVGhlcmUgYXJlICVkIHVudXNlZCB0b2tlbnMiLCBsZW4odW51c2VkX3Rlcm1pbmFscykpCisKKyAgICBpZiBsZW4odW51c2VkX3J1bGVzKSA9PSAxOgorICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJUaGVyZSBpcyAxIHVudXNlZCBydWxlIikKKyAgICBpZiBsZW4odW51c2VkX3J1bGVzKSA+IDE6CisgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIlRoZXJlIGFyZSAlZCB1bnVzZWQgcnVsZXMiLCBsZW4odW51c2VkX3J1bGVzKSkKKworICAgIGlmIGRlYnVnOgorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIiKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJUZXJtaW5hbHMsIHdpdGggcnVsZXMgd2hlcmUgdGhleSBhcHBlYXIiKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIiKQorICAgICAgICB0ZXJtcyA9IGxpc3QoZ3JhbW1hci5UZXJtaW5hbHMpCisgICAgICAgIHRlcm1zLnNvcnQoKQorICAgICAgICBmb3IgdGVybSBpbiB0ZXJtczoKKyAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oIiUtMjBzIDogJXMiLCB0ZXJtLCAiICIuam9pbihbc3RyKHMpIGZvciBzIGluIGdyYW1tYXIuVGVybWluYWxzW3Rlcm1dXSkpCisgICAgICAgIAorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIiKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCJOb250ZXJtaW5hbHMsIHdpdGggcnVsZXMgd2hlcmUgdGhleSBhcHBlYXIiKQorICAgICAgICBkZWJ1Z2xvZy5pbmZvKCIiKQorICAgICAgICBub250ZXJtcyA9IGxpc3QoZ3JhbW1hci5Ob250ZXJtaW5hbHMpCisgICAgICAgIG5vbnRlcm1zLnNvcnQoKQorICAgICAgICBmb3Igbm9udGVybSBpbiBub250ZXJtczoKKyAgICAgICAgICAgIGRlYnVnbG9nLmluZm8oIiUtMjBzIDogJXMiLCBub250ZXJtLCAiICIuam9pbihbc3RyKHMpIGZvciBzIGluIGdyYW1tYXIuTm9udGVybWluYWxzW25vbnRlcm1dXSkpCisgICAgICAgIGRlYnVnbG9nLmluZm8oIiIpCisKKyAgICBpZiBjaGVja19yZWN1cnNpb246CisgICAgICAgIHVucmVhY2hhYmxlID0gZ3JhbW1hci5maW5kX3VucmVhY2hhYmxlKCkKKyAgICAgICAgZm9yIHUgaW4gdW5yZWFjaGFibGU6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJTeW1ib2wgJyVzJyBpcyB1bnJlYWNoYWJsZSIsdSkKKworICAgICAgICBpbmZpbml0ZSA9IGdyYW1tYXIuaW5maW5pdGVfY3ljbGVzKCkKKyAgICAgICAgZm9yIGluZiBpbiBpbmZpbml0ZToKKyAgICAgICAgICAgIGVycm9ybG9nLmVycm9yKCJJbmZpbml0ZSByZWN1cnNpb24gZGV0ZWN0ZWQgZm9yIHN5bWJvbCAnJXMnIiwgaW5mKQorICAgICAgICAgICAgZXJyb3JzID0gMQorICAgICAgICAKKyAgICB1bnVzZWRfcHJlYyA9IGdyYW1tYXIudW51c2VkX3ByZWNlZGVuY2UoKQorICAgIGZvciB0ZXJtLCBhc3NvYyBpbiB1bnVzZWRfcHJlYzoKKyAgICAgICAgZXJyb3Jsb2cuZXJyb3IoIlByZWNlZGVuY2UgcnVsZSAnJXMnIGRlZmluZWQgZm9yIHVua25vd24gc3ltYm9sICclcyciLCBhc3NvYywgdGVybSkKKyAgICAgICAgZXJyb3JzID0gMQorCisgICAgaWYgZXJyb3JzOgorICAgICAgICByYWlzZSBZYWNjRXJyb3IoIlVuYWJsZSB0byBidWlsZCBwYXJzZXIiKQorICAgIAorICAgICMgUnVuIHRoZSBMUkdlbmVyYXRlZFRhYmxlIG9uIHRoZSBncmFtbWFyCisgICAgaWYgZGVidWc6CisgICAgICAgIGVycm9ybG9nLmRlYnVnKCJHZW5lcmF0aW5nICVzIHRhYmxlcyIsIG1ldGhvZCkKKyAgICAgICAgICAgIAorICAgIGxyID0gTFJHZW5lcmF0ZWRUYWJsZShncmFtbWFyLG1ldGhvZCxkZWJ1Z2xvZykKKworICAgIGlmIGRlYnVnOgorICAgICAgICBudW1fc3IgPSBsZW4obHIuc3JfY29uZmxpY3RzKQorCisgICAgICAgICMgUmVwb3J0IHNoaWZ0L3JlZHVjZSBhbmQgcmVkdWNlL3JlZHVjZSBjb25mbGljdHMKKyAgICAgICAgaWYgbnVtX3NyID09IDE6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCIxIHNoaWZ0L3JlZHVjZSBjb25mbGljdCIpCisgICAgICAgIGVsaWYgbnVtX3NyID4gMToKKyAgICAgICAgICAgIGVycm9ybG9nLndhcm5pbmcoIiVkIHNoaWZ0L3JlZHVjZSBjb25mbGljdHMiLCBudW1fc3IpCisKKyAgICAgICAgbnVtX3JyID0gbGVuKGxyLnJyX2NvbmZsaWN0cykKKyAgICAgICAgaWYgbnVtX3JyID09IDE6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCIxIHJlZHVjZS9yZWR1Y2UgY29uZmxpY3QiKQorICAgICAgICBlbGlmIG51bV9yciA+IDE6CisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCIlZCByZWR1Y2UvcmVkdWNlIGNvbmZsaWN0cyIsIG51bV9ycikKKworICAgICMgV3JpdGUgb3V0IGNvbmZsaWN0cyB0byB0aGUgb3V0cHV0IGZpbGUKKyAgICBpZiBkZWJ1ZyBhbmQgKGxyLnNyX2NvbmZsaWN0cyBvciBsci5ycl9jb25mbGljdHMpOgorICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCIiKQorICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCJDb25mbGljdHM6IikKKyAgICAgICAgZGVidWdsb2cud2FybmluZygiIikKKworICAgICAgICBmb3Igc3RhdGUsIHRvaywgcmVzb2x1dGlvbiBpbiBsci5zcl9jb25mbGljdHM6CisgICAgICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCJzaGlmdC9yZWR1Y2UgY29uZmxpY3QgZm9yICVzIGluIHN0YXRlICVkIHJlc29sdmVkIGFzICVzIiwgIHRvaywgc3RhdGUsIHJlc29sdXRpb24pCisgICAgICAgIAorICAgICAgICBhbHJlYWR5X3JlcG9ydGVkID0ge30KKyAgICAgICAgZm9yIHN0YXRlLCBydWxlLCByZWplY3RlZCBpbiBsci5ycl9jb25mbGljdHM6CisgICAgICAgICAgICBpZiAoc3RhdGUsaWQocnVsZSksaWQocmVqZWN0ZWQpKSBpbiBhbHJlYWR5X3JlcG9ydGVkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkZWJ1Z2xvZy53YXJuaW5nKCJyZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGluIHN0YXRlICVkIHJlc29sdmVkIHVzaW5nIHJ1bGUgKCVzKSIsIHN0YXRlLCBydWxlKQorICAgICAgICAgICAgZGVidWdsb2cud2FybmluZygicmVqZWN0ZWQgcnVsZSAoJXMpIGluIHN0YXRlICVkIiwgcmVqZWN0ZWQsc3RhdGUpCisgICAgICAgICAgICBlcnJvcmxvZy53YXJuaW5nKCJyZWR1Y2UvcmVkdWNlIGNvbmZsaWN0IGluIHN0YXRlICVkIHJlc29sdmVkIHVzaW5nIHJ1bGUgKCVzKSIsIHN0YXRlLCBydWxlKQorICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygicmVqZWN0ZWQgcnVsZSAoJXMpIGluIHN0YXRlICVkIiwgcmVqZWN0ZWQsIHN0YXRlKQorICAgICAgICAgICAgYWxyZWFkeV9yZXBvcnRlZFtzdGF0ZSxpZChydWxlKSxpZChyZWplY3RlZCldID0gMQorICAgICAgICAKKyAgICAgICAgd2FybmVkX25ldmVyID0gW10KKyAgICAgICAgZm9yIHN0YXRlLCBydWxlLCByZWplY3RlZCBpbiBsci5ycl9jb25mbGljdHM6CisgICAgICAgICAgICBpZiBub3QgcmVqZWN0ZWQucmVkdWNlZCBhbmQgKHJlamVjdGVkIG5vdCBpbiB3YXJuZWRfbmV2ZXIpOgorICAgICAgICAgICAgICAgIGRlYnVnbG9nLndhcm5pbmcoIlJ1bGUgKCVzKSBpcyBuZXZlciByZWR1Y2VkIiwgcmVqZWN0ZWQpCisgICAgICAgICAgICAgICAgZXJyb3Jsb2cud2FybmluZygiUnVsZSAoJXMpIGlzIG5ldmVyIHJlZHVjZWQiLCByZWplY3RlZCkKKyAgICAgICAgICAgICAgICB3YXJuZWRfbmV2ZXIuYXBwZW5kKHJlamVjdGVkKQorCisgICAgIyBXcml0ZSB0aGUgdGFibGUgZmlsZSBpZiByZXF1ZXN0ZWQKKyAgICBpZiB3cml0ZV90YWJsZXM6CisgICAgICAgIGxyLndyaXRlX3RhYmxlKHRhYm1vZHVsZSxvdXRwdXRkaXIsc2lnbmF0dXJlKQorCisgICAgIyBXcml0ZSBhIHBpY2tsZWQgdmVyc2lvbiBvZiB0aGUgdGFibGVzCisgICAgaWYgcGlja2xlZmlsZToKKyAgICAgICAgbHIucGlja2xlX3RhYmxlKHBpY2tsZWZpbGUsc2lnbmF0dXJlKQorCisgICAgIyBCdWlsZCB0aGUgcGFyc2VyCisgICAgbHIuYmluZF9jYWxsYWJsZXMocGluZm8ucGRpY3QpCisgICAgcGFyc2VyID0gTFJQYXJzZXIobHIscGluZm8uZXJyb3JfZnVuYykKKworICAgIHBhcnNlID0gcGFyc2VyLnBhcnNlCisgICAgcmV0dXJuIHBhcnNlcgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvcHJvZ3Jlc3NiYXIucHkgYi9iaXRiYWtlL2xpYi9wcm9ncmVzc2Jhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRjZGMxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvcHJvZ3Jlc3NiYXIucHkKQEAgLTAsMCArMSwzODQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIworIyBwcm9ncmVzc2JhciAgLSBUZXh0IHByb2dyZXNzYmFyIGxpYnJhcnkgZm9yIHB5dGhvbi4KKyMgQ29weXJpZ2h0IChjKSAyMDA1IE5pbHRvbiBWb2xwYXRvCisjCisjIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworCisiIiJUZXh0IHByb2dyZXNzYmFyIGxpYnJhcnkgZm9yIHB5dGhvbi4KKworVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGEgdGV4dCBtb2RlIHByb2dyZXNzYmFyLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkCit0byBkaXNwbGF5IHRoZSBwcm9ncmVzcyBvZiBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24sIHByb3ZpZGluZyBhCit2aXN1YWwgY2x1ZSB0aGF0IHByb2Nlc3NpbmcgaXMgdW5kZXJ3YXkuCisKK1RoZSBQcm9ncmVzc0JhciBjbGFzcyBtYW5hZ2VzIHRoZSBwcm9ncmVzcywgYW5kIHRoZSBmb3JtYXQgb2YgdGhlIGxpbmUKK2lzIGdpdmVuIGJ5IGEgbnVtYmVyIG9mIHdpZGdldHMuIEEgd2lkZ2V0IGlzIGFuIG9iamVjdCB0aGF0IG1heQorZGlzcGxheSBkaWZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIHByb2dyZXNzLiBUaGVyZSBhcmUKK3RocmVlIHR5cGVzIG9mIHdpZGdldDoKKy0gYSBzdHJpbmcsIHdoaWNoIGFsd2F5cyBzaG93cyBpdHNlbGY7CistIGEgUHJvZ3Jlc3NCYXJXaWRnZXQsIHdoaWNoIG1heSByZXR1cm4gYSBkaWZlcmVudCB2YWx1ZSBldmVyeSB0aW1lCitpdCdzIHVwZGF0ZSBtZXRob2QgaXMgY2FsbGVkOyBhbmQKKy0gYSBQcm9ncmVzc0JhcldpZGdldEhGaWxsLCB3aGljaCBpcyBsaWtlIFByb2dyZXNzQmFyV2lkZ2V0LCBleGNlcHQgaXQKK2V4cGFuZHMgdG8gZmlsbCB0aGUgcmVtYWluaW5nIHdpZHRoIG9mIHRoZSBsaW5lLgorCitUaGUgcHJvZ3Jlc3NiYXIgbW9kdWxlIGlzIHZlcnkgZWFzeSB0byB1c2UsIHlldCB2ZXJ5IHBvd2VyZnVsLiBBbmQKK2F1dG9tYXRpY2FsbHkgc3VwcG9ydHMgZmVhdHVyZXMgbGlrZSBhdXRvLXJlc2l6aW5nIHdoZW4gYXZhaWxhYmxlLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KKworX19hdXRob3JfXyA9ICJOaWx0b24gVm9scGF0byIKK19fYXV0aG9yX2VtYWlsX18gPSAiZmlyc3QtbmFtZSBkb3QgbGFzdC1uYW1lIEAgZ21haWwuY29tIgorX19kYXRlX18gPSAiMjAwNi0wNS0wNyIKK19fdmVyc2lvbl9fID0gIjIuMy1kZXYiCisKK2ltcG9ydCBzeXMsIHRpbWUsIG9zCitmcm9tIGFycmF5IGltcG9ydCBhcnJheQordHJ5OgorICAgIGZyb20gZmNudGwgaW1wb3J0IGlvY3RsCisgICAgaW1wb3J0IHRlcm1pb3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitpbXBvcnQgc2lnbmFsCit0cnk6CisgICAgYmFzZXN0cmluZworZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBiYXNlc3RyaW5nID0gKHN0ciwpCisKK2NsYXNzIFByb2dyZXNzQmFyV2lkZ2V0KG9iamVjdCk6CisgICAgIiIiVGhpcyBpcyBhbiBlbGVtZW50IG9mIFByb2dyZXNzQmFyIGZvcm1hdHRpbmcuCisKKyAgICBUaGUgUHJvZ3Jlc3NCYXIgb2JqZWN0IHdpbGwgY2FsbCBpdCdzIHVwZGF0ZSB2YWx1ZSB3aGVuIGFuIHVwZGF0ZQorICAgIGlzIG5lZWRlZC4gSXQncyBzaXplIG1heSBjaGFuZ2UgYmV0d2VlbiBjYWxsLCBidXQgdGhlIHJlc3VsdHMgd2lsbAorICAgIG5vdCBiZSBnb29kIGlmIHRoZSBzaXplIGNoYW5nZXMgZHJhc3RpY2FsbHkgYW5kIHJlcGVhdGVkbHkuCisgICAgIiIiCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgd2lkZ2V0LgorCisgICAgICAgIFRoZSBwYXJhbWV0ZXIgcGJhciBpcyBhIHJlZmVyZW5jZSB0byB0aGUgY2FsbGluZyBQcm9ncmVzc0JhciwKKyAgICAgICAgd2hlcmUgb25lIGNhbiBhY2Nlc3MgYXR0cmlidXRlcyBvZiB0aGUgY2xhc3MgZm9yIGtub3dpbmcgaG93CisgICAgICAgIHRoZSB1cGRhdGUgbXVzdCBiZSBtYWRlLgorCisgICAgICAgIEF0IGxlYXN0IHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBvdmVycmlkZW4uIiIiCisgICAgICAgIHBhc3MKKworY2xhc3MgUHJvZ3Jlc3NCYXJXaWRnZXRIRmlsbChvYmplY3QpOgorICAgICIiIlRoaXMgaXMgYSB2YXJpYWJsZSB3aWR0aCBlbGVtZW50IG9mIFByb2dyZXNzQmFyIGZvcm1hdHRpbmcuCisKKyAgICBUaGUgUHJvZ3Jlc3NCYXIgb2JqZWN0IHdpbGwgY2FsbCBpdCdzIHVwZGF0ZSB2YWx1ZSwgaW5mb3JtaW5nIHRoZQorICAgIHdpZHRoIHRoaXMgb2JqZWN0IG11c3QgdGhlIG1hZGUuIFRoaXMgaXMgbGlrZSBUZVggXFxoZmlsbCwgaXQgd2lsbAorICAgIGV4cGFuZCB0byBmaWxsIHRoZSBsaW5lLiBZb3UgY2FuIHVzZSBtb3JlIHRoYW4gb25lIGluIHRoZSBzYW1lCisgICAgbGluZSwgYW5kIHRoZXkgd2lsbCBhbGwgaGF2ZSB0aGUgc2FtZSB3aWR0aCwgYW5kIHRvZ2V0aGVyIHdpbGwKKyAgICBmaWxsIHRoZSBsaW5lLgorICAgICIiIgorICAgIGRlZiB1cGRhdGUoc2VsZiwgcGJhciwgd2lkdGgpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB3aWRnZXQuCisKKyAgICAgICAgVGhlIHBhcmFtZXRlciBwYmFyIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsaW5nIFByb2dyZXNzQmFyLAorICAgICAgICB3aGVyZSBvbmUgY2FuIGFjY2VzcyBhdHRyaWJ1dGVzIG9mIHRoZSBjbGFzcyBmb3Iga25vd2luZyBob3cKKyAgICAgICAgdGhlIHVwZGF0ZSBtdXN0IGJlIG1hZGUuIFRoZSBwYXJhbWV0ZXIgd2lkdGggaXMgdGhlIHRvdGFsCisgICAgICAgIGhvcml6b250YWwgd2lkdGggdGhlIHdpZGdldCBtdXN0IGhhdmUuCisKKyAgICAgICAgQXQgbGVhc3QgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIG92ZXJyaWRlbi4iIiIKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEVUQShQcm9ncmVzc0JhcldpZGdldCk6CisgICAgIldpZGdldCBmb3IgdGhlIEVzdGltYXRlZCBUaW1lIG9mIEFycml2YWwiCisgICAgZGVmIGZvcm1hdF90aW1lKHNlbGYsIHNlY29uZHMpOgorICAgICAgICByZXR1cm4gdGltZS5zdHJmdGltZSgnJUg6JU06JVMnLCB0aW1lLmdtdGltZShzZWNvbmRzKSkKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBiYXIpOgorICAgICAgICBpZiBwYmFyLmN1cnJ2YWwgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnRVRBOiAgLS06LS06LS0nCisgICAgICAgIGVsaWYgcGJhci5maW5pc2hlZDoKKyAgICAgICAgICAgIHJldHVybiAnVGltZTogJXMnICUgc2VsZi5mb3JtYXRfdGltZShwYmFyLnNlY29uZHNfZWxhcHNlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsYXBzZWQgPSBwYmFyLnNlY29uZHNfZWxhcHNlZAorICAgICAgICAgICAgZXRhID0gZWxhcHNlZCAqIHBiYXIubWF4dmFsIC8gcGJhci5jdXJydmFsIC0gZWxhcHNlZAorICAgICAgICAgICAgcmV0dXJuICdFVEE6ICAlcycgJSBzZWxmLmZvcm1hdF90aW1lKGV0YSkKKworY2xhc3MgRmlsZVRyYW5zZmVyU3BlZWQoUHJvZ3Jlc3NCYXJXaWRnZXQpOgorICAgICJXaWRnZXQgZm9yIHNob3dpbmcgdGhlIHRyYW5zZmVyIHNwZWVkICh1c2VmdWwgZm9yIGZpbGUgdHJhbnNmZXJzKS4iCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVuaXQ9J0InKToKKyAgICAgICAgc2VsZi51bml0ID0gdW5pdAorICAgICAgICBzZWxmLmZtdCA9ICclNi4yZiAlcycKKyAgICAgICAgc2VsZi5wcmVmaXhlcyA9IFsnJywgJ0snLCAnTScsICdHJywgJ1QnLCAnUCddCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyKToKKyAgICAgICAgaWYgcGJhci5zZWNvbmRzX2VsYXBzZWQgPCAyZS02OiM9PSAwOgorICAgICAgICAgICAgYnBzID0gMC4wCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicHMgPSBwYmFyLmN1cnJ2YWwgLyBwYmFyLnNlY29uZHNfZWxhcHNlZAorICAgICAgICBzcGQgPSBicHMKKyAgICAgICAgZm9yIHUgaW4gc2VsZi5wcmVmaXhlczoKKyAgICAgICAgICAgIGlmIHNwZCA8IDEwMDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNwZCAvPSAxMDAwCisgICAgICAgIHJldHVybiBzZWxmLmZtdCAlIChzcGQsIHUgKyBzZWxmLnVuaXQgKyAnL3MnKQorCitjbGFzcyBSb3RhdGluZ01hcmtlcihQcm9ncmVzc0JhcldpZGdldCk6CisgICAgIkEgcm90YXRpbmcgbWFya2VyIGZvciBmaWxsaW5nIHRoZSBiYXIgb2YgcHJvZ3Jlc3MuIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXJrZXJzPSd8Ly1cXCcpOgorICAgICAgICBzZWxmLm1hcmtlcnMgPSBtYXJrZXJzCisgICAgICAgIHNlbGYuY3VybWFyayA9IC0xCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyKToKKyAgICAgICAgaWYgcGJhci5maW5pc2hlZDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1hcmtlcnNbMF0KKyAgICAgICAgc2VsZi5jdXJtYXJrID0gKHNlbGYuY3VybWFyayArIDEpICUgbGVuKHNlbGYubWFya2VycykKKyAgICAgICAgcmV0dXJuIHNlbGYubWFya2Vyc1tzZWxmLmN1cm1hcmtdCisKK2NsYXNzIFBlcmNlbnRhZ2UoUHJvZ3Jlc3NCYXJXaWRnZXQpOgorICAgICJKdXN0IHRoZSBwZXJjZW50YWdlIGRvbmUuIgorICAgIGRlZiB1cGRhdGUoc2VsZiwgcGJhcik6CisgICAgICAgIHJldHVybiAnJTNkJSUnICUgcGJhci5wZXJjZW50YWdlKCkKKworY2xhc3MgU2ltcGxlUHJvZ3Jlc3MoUHJvZ3Jlc3NCYXJXaWRnZXQpOgorICAgICJSZXR1cm5zIHdoYXQgaXMgYWxyZWFkeSBkb25lIGFuZCB0aGUgdG90YWwsIGUuZy46ICc1IG9mIDQ3JyIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VwPScgb2YgJyk6CisgICAgICAgIHNlbGYuc2VwID0gc2VwCisgICAgZGVmIHVwZGF0ZShzZWxmLCBwYmFyKToKKyAgICAgICAgcmV0dXJuICclZCVzJWQnICUgKHBiYXIuY3VycnZhbCwgc2VsZi5zZXAsIHBiYXIubWF4dmFsKQorCitjbGFzcyBCYXIoUHJvZ3Jlc3NCYXJXaWRnZXRIRmlsbCk6CisgICAgIlRoZSBiYXIgb2YgcHJvZ3Jlc3MuIEl0IHdpbGwgc3RyZXRjaCB0byBmaWxsIHRoZSBsaW5lLiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFya2VyPScjJywgbGVmdD0nfCcsIHJpZ2h0PSd8Jyk6CisgICAgICAgIHNlbGYubWFya2VyID0gbWFya2VyCisgICAgICAgIHNlbGYubGVmdCA9IGxlZnQKKyAgICAgICAgc2VsZi5yaWdodCA9IHJpZ2h0CisgICAgZGVmIF9mb3JtYXRfbWFya2VyKHNlbGYsIHBiYXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWFya2VyLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1hcmtlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWFya2VyLnVwZGF0ZShwYmFyKQorICAgIGRlZiB1cGRhdGUoc2VsZiwgcGJhciwgd2lkdGgpOgorICAgICAgICBwZXJjZW50ID0gcGJhci5wZXJjZW50YWdlKCkKKyAgICAgICAgY3dpZHRoID0gd2lkdGggLSBsZW4oc2VsZi5sZWZ0KSAtIGxlbihzZWxmLnJpZ2h0KQorICAgICAgICBtYXJrZWRfd2lkdGggPSBpbnQocGVyY2VudCAqIGN3aWR0aCAvLyAxMDApCisgICAgICAgIG0gPSBzZWxmLl9mb3JtYXRfbWFya2VyKHBiYXIpCisgICAgICAgIGJhciA9IChzZWxmLmxlZnQgKyAobSAqIG1hcmtlZF93aWR0aCkubGp1c3QoY3dpZHRoKSArIHNlbGYucmlnaHQpCisgICAgICAgIHJldHVybiBiYXIKKworY2xhc3MgUmV2ZXJzZUJhcihCYXIpOgorICAgICJUaGUgcmV2ZXJzZSBiYXIgb2YgcHJvZ3Jlc3MsIG9yIGJhciBvZiByZWdyZXNzLiA6KSIKKyAgICBkZWYgdXBkYXRlKHNlbGYsIHBiYXIsIHdpZHRoKToKKyAgICAgICAgcGVyY2VudCA9IHBiYXIucGVyY2VudGFnZSgpCisgICAgICAgIGN3aWR0aCA9IHdpZHRoIC0gbGVuKHNlbGYubGVmdCkgLSBsZW4oc2VsZi5yaWdodCkKKyAgICAgICAgbWFya2VkX3dpZHRoID0gaW50KHBlcmNlbnQgKiBjd2lkdGggLy8gMTAwKQorICAgICAgICBtID0gc2VsZi5fZm9ybWF0X21hcmtlcihwYmFyKQorICAgICAgICBiYXIgPSAoc2VsZi5sZWZ0ICsgKG0qbWFya2VkX3dpZHRoKS5yanVzdChjd2lkdGgpICsgc2VsZi5yaWdodCkKKyAgICAgICAgcmV0dXJuIGJhcgorCitkZWZhdWx0X3dpZGdldHMgPSBbUGVyY2VudGFnZSgpLCAnICcsIEJhcigpXQorY2xhc3MgUHJvZ3Jlc3NCYXIob2JqZWN0KToKKyAgICAiIiJUaGlzIGlzIHRoZSBQcm9ncmVzc0JhciBjbGFzcywgaXQgdXBkYXRlcyBhbmQgcHJpbnRzIHRoZSBiYXIuCisKKyAgICBBIGNvbW1vbiB3YXkgb2YgdXNpbmcgaXQgaXMgbGlrZToKKyAgICA+Pj4gcGJhciA9IFByb2dyZXNzQmFyKCkuc3RhcnQoKQorICAgID4+PiBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAuLi4gICAgIyBkbyBzb21ldGhpbmcKKyAgICAuLi4gICAgcGJhci51cGRhdGUoaSsxKQorICAgIC4uLgorICAgID4+PiBwYmFyLmZpbmlzaCgpCisKKyAgICBZb3UgY2FuIGFsc28gdXNlIGEgcHJvZ3Jlc3NiYXIgYXMgYW4gaXRlcmF0b3I6CisgICAgPj4+IHByb2dyZXNzID0gUHJvZ3Jlc3NCYXIoKQorICAgID4+PiBmb3IgaSBpbiBwcm9ncmVzcyhzb21lX2l0ZXJhYmxlKToKKyAgICAuLi4gICAgIyBkbyBzb21ldGhpbmcKKyAgICAuLi4KKworICAgIEJ1dCBhbnl0aGluZyB5b3Ugd2FudCB0byBkbyBpcyBwb3NzaWJsZSAod2VsbCwgYWxtb3N0IGFueXRoaW5nKS4KKyAgICBZb3UgY2FuIHN1cHBseSBkaWZmZXJlbnQgd2lkZ2V0cyBvZiBhbnkgdHlwZSBpbiBhbnkgb3JkZXIuIEFuZCB5b3UKKyAgICBjYW4gZXZlbiB3cml0ZSB5b3VyIG93biB3aWRnZXRzISBUaGVyZSBhcmUgbWFueSB3aWRnZXRzIGFscmVhZHkKKyAgICBzaGlwcGVkIGFuZCB5b3Ugc2hvdWxkIGV4cGVyaW1lbnQgd2l0aCB0aGVtLgorCisgICAgVGhlIHRlcm1fd2lkdGggcGFyYW1ldGVyIG11c3QgYmUgYW4gaW50ZWdlciBvciBOb25lLiBJbiB0aGUgbGF0dGVyIGNhc2UKKyAgICBpdCB3aWxsIHRyeSB0byBndWVzcyBpdCwgaWYgaXQgZmFpbHMgaXQgd2lsbCBkZWZhdWx0IHRvIDgwIGNvbHVtbnMuCisKKyAgICBXaGVuIGltcGxlbWVudGluZyBhIHdpZGdldCB1cGRhdGUgbWV0aG9kIHlvdSBtYXkgYWNjZXNzIGFueQorICAgIGF0dHJpYnV0ZSBvciBmdW5jdGlvbiBvZiB0aGUgUHJvZ3Jlc3NCYXIgb2JqZWN0IGNhbGxpbmcgdGhlCisgICAgd2lkZ2V0J3MgdXBkYXRlIG1ldGhvZC4gVGhlIG1vc3QgaW1wb3J0YW50IGF0dHJpYnV0ZXMgeW91IHdvdWxkCisgICAgbGlrZSB0byBhY2Nlc3MgYXJlOgorICAgIC0gY3VycnZhbDogY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MsIDAgPD0gY3VycnZhbCA8PSBtYXh2YWwKKyAgICAtIG1heHZhbDogbWF4aW11bSAoYW5kIGZpbmFsKSB2YWx1ZSBvZiB0aGUgcHJvZ3Jlc3MKKyAgICAtIGZpbmlzaGVkOiBUcnVlIGlmIHRoZSBiYXIgaGFzIGZpbmlzaGVkIChyZWFjaGVkIDEwMCUpLCBGYWxzZSBvL3cKKyAgICAtIHN0YXJ0X3RpbWU6IHRoZSB0aW1lIHdoZW4gc3RhcnQoKSBtZXRob2Qgb2YgUHJvZ3Jlc3NCYXIgd2FzIGNhbGxlZAorICAgIC0gc2Vjb25kc19lbGFwc2VkOiBzZWNvbmRzIGVsYXBzZWQgc2luY2Ugc3RhcnRfdGltZQorICAgIC0gcGVyY2VudGFnZSgpOiBwZXJjZW50YWdlIG9mIHRoZSBwcm9ncmVzcyBbMC4uMTAwXS4gVGhpcyBpcyBhIG1ldGhvZC4KKworICAgIFRoZSBhdHRyaWJ1dGVzIGFib3ZlIGFyZSB1bmxpa2VseSB0byBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMsCisgICAgdGhlIG90aGVyIG9uZXMgbWF5IGNoYW5nZSBvciBjZWFzZSB0byBleGlzdCB3aXRob3V0IG5vdGljZSwgc28gdHJ5IHRvIHJlbHkKKyAgICBvbmx5IG9uIHRoZSBvbmVzIGRvY3VtZW50ZWQgYWJvdmUgaWYgeW91IGFyZSBleHRlbmRpbmcgdGhlIHByb2dyZXNzIGJhci4KKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICgnY3VycnZhbCcsICdmZCcsICdmaW5pc2hlZCcsICdsYXN0X3VwZGF0ZV90aW1lJywgJ21heHZhbCcsCisgICAgICAgICAgICAgICAgICduZXh0X3VwZGF0ZScsICdudW1faW50ZXJ2YWxzJywgJ3NlY29uZHNfZWxhcHNlZCcsCisgICAgICAgICAgICAgICAgICdzaWduYWxfc2V0JywgJ3N0YXJ0X3RpbWUnLCAndGVybV93aWR0aCcsICd1cGRhdGVfaW50ZXJ2YWwnLAorICAgICAgICAgICAgICAgICAnd2lkZ2V0cycsICdfaXRlcmFibGUnKQorCisgICAgX0RFRkFVTFRfTUFYVkFMID0gMTAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4dmFsPU5vbmUsIHdpZGdldHM9ZGVmYXVsdF93aWRnZXRzLCB0ZXJtX3dpZHRoPU5vbmUsCisgICAgICAgICAgICAgICAgIGZkPXN5cy5zdGRlcnIpOgorICAgICAgICBzZWxmLm1heHZhbCA9IG1heHZhbAorICAgICAgICBzZWxmLndpZGdldHMgPSB3aWRnZXRzCisgICAgICAgIHNlbGYuZmQgPSBmZAorICAgICAgICBzZWxmLnNpZ25hbF9zZXQgPSBGYWxzZQorICAgICAgICBpZiB0ZXJtX3dpZHRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXJtX3dpZHRoID0gdGVybV93aWR0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9yZXNpemUoTm9uZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdXSU5DSCwgc2VsZi5faGFuZGxlX3Jlc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNpZ25hbF9zZXQgPSBUcnVlCisgICAgICAgICAgICBleGNlcHQgKFN5c3RlbUV4aXQsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYudGVybV93aWR0aCA9IGludChvcy5lbnZpcm9uLmdldCgnQ09MVU1OUycsIDgwKSkgLSAxCisKKyAgICAgICAgc2VsZi5jdXJydmFsID0gMAorICAgICAgICBzZWxmLmZpbmlzaGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQorICAgICAgICBzZWxmLmxhc3RfdXBkYXRlX3RpbWUgPSBOb25lCisgICAgICAgIHNlbGYuc2Vjb25kc19lbGFwc2VkID0gMAorICAgICAgICBzZWxmLl9pdGVyYWJsZSA9IE5vbmUKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBpdGVyYWJsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubWF4dmFsID0gbGVuKGl0ZXJhYmxlKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgIyBJZiB0aGUgaXRlcmFibGUgaGFzIG5vIGxlbmd0aCwgdGhlbiByZWx5IG9uIHRoZSB2YWx1ZSBwcm92aWRlZAorICAgICAgICAgICAgIyBieSB0aGUgdXNlciwgb3RoZXJ3aXNlIGZhaWwuCisgICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2Uoc2VsZi5tYXh2YWwsIChpbnQsIGxvbmcpKSBhbmQgc2VsZi5tYXh2YWwgPiAwKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgbWF4dmFsIGZyb20gaXRlcmFibGUuICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1lvdSBtdXN0IGV4cGxpY2l0bHkgcHJvdmlkZSBhIG1heHZhbC4nKQorICAgICAgICBzZWxmLl9pdGVyYWJsZSA9IGl0ZXIoaXRlcmFibGUpCisgICAgICAgIHNlbGYuc3RhcnQoKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHQgPSBzZWxmLl9pdGVyYWJsZS5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKHNlbGYuY3VycnZhbCArIDEpCisgICAgICAgICAgICByZXR1cm4gbmV4dAorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHNlbGYuZmluaXNoKCkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX2hhbmRsZV9yZXNpemUoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CisgICAgICAgIGgsIHcgPSBhcnJheSgnaCcsIGlvY3RsKHNlbGYuZmQsIHRlcm1pb3MuVElPQ0dXSU5TWiwgJ1wwJyAqIDgpKVs6Ml0KKyAgICAgICAgc2VsZi50ZXJtX3dpZHRoID0gdworCisgICAgZGVmIHBlcmNlbnRhZ2Uoc2VsZik6CisgICAgICAgICJSZXR1cm5zIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwcm9ncmVzcy4iCisgICAgICAgIHJldHVybiBzZWxmLmN1cnJ2YWwgKiAxMDAuMCAvIHNlbGYubWF4dmFsCisKKyAgICBkZWYgX2Zvcm1hdF93aWRnZXRzKHNlbGYpOgorICAgICAgICByID0gW10KKyAgICAgICAgaGZpbGxfaW5kcyA9IFtdCisgICAgICAgIG51bV9oZmlsbCA9IDAKKyAgICAgICAgY3VycndpZHRoID0gMAorICAgICAgICBmb3IgaSwgdyBpbiBlbnVtZXJhdGUoc2VsZi53aWRnZXRzKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodywgUHJvZ3Jlc3NCYXJXaWRnZXRIRmlsbCk6CisgICAgICAgICAgICAgICAgci5hcHBlbmQodykKKyAgICAgICAgICAgICAgICBoZmlsbF9pbmRzLmFwcGVuZChpKQorICAgICAgICAgICAgICAgIG51bV9oZmlsbCArPSAxCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgci5hcHBlbmQodykKKyAgICAgICAgICAgICAgICBjdXJyd2lkdGggKz0gbGVuKHcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdldmFsID0gdy51cGRhdGUoc2VsZikKKyAgICAgICAgICAgICAgICBjdXJyd2lkdGggKz0gbGVuKHdldmFsKQorICAgICAgICAgICAgICAgIHIuYXBwZW5kKHdldmFsKQorICAgICAgICBmb3IgaXcgaW4gaGZpbGxfaW5kczoKKyAgICAgICAgICAgIHdpZGdldF93aWR0aCA9IGludCgoc2VsZi50ZXJtX3dpZHRoIC0gY3VycndpZHRoKSAvLyBudW1faGZpbGwpCisgICAgICAgICAgICByW2l3XSA9IHJbaXddLnVwZGF0ZShzZWxmLCB3aWRnZXRfd2lkdGgpCisgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgX2Zvcm1hdF9saW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gJycuam9pbihzZWxmLl9mb3JtYXRfd2lkZ2V0cygpKS5sanVzdChzZWxmLnRlcm1fd2lkdGgpCisKKyAgICBkZWYgX25leHRfdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gaW50KChpbnQoc2VsZi5udW1faW50ZXJ2YWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmN1cnJ2YWwgLyBzZWxmLm1heHZhbCkpICsgMSkgKgorICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2ludGVydmFsKQorCisgICAgZGVmIF9uZWVkX3VwZGF0ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0cnVlIHdoZW4gdGhlIHByb2dyZXNzYmFyIHNob3VsZCBwcmludCBhbiB1cGRhdGVkIGxpbmUuCisKKyAgICAgICAgWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3Ugd2FudCBmaW5lciBncmFpbmVkIGNvbnRyb2wgb3ZlcgorICAgICAgICB1cGRhdGVzLgorCisgICAgICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG9wdGltaXplZCB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlIGFuZAorICAgICAgICBhcyBlY29ub21pY2FsIGFzIHBvc3NpYmxlIGluIHRoZSBudW1iZXIgb2YgdXBkYXRlcy4gSG93ZXZlciwgZGVwZW5kaW5nCisgICAgICAgIG9uIHlvdXIgdXNhZ2UgeW91IG1heSB3YW50IHRvIGRvIG1vcmUgdXBkYXRlcy4gRm9yIGluc3RhbmNlLCBpZiB5b3VyCisgICAgICAgIHByb2dyZXNzYmFyIHN0YXlzIGluIHRoZSBzYW1lIHBlcmNlbnRhZ2UgZm9yIGEgbG9uZyB0aW1lLCBhbmQgeW91IHdhbnQKKyAgICAgICAgdG8gdXBkYXRlIG90aGVyIHdpZGdldHMsIGxpa2UgRVRBLCB0aGVuIHlvdSBjb3VsZCByZXR1cm4gVHJ1ZSBhZnRlcgorICAgICAgICBzb21lIHRpbWUgaGFzIHBhc3NlZCB3aXRoIG5vIHVwZGF0ZXMuCisKKyAgICAgICAgSWRlYWxseSB5b3UgY291bGQgY2FsbCBzZWxmLl9mb3JtYXRfbGluZSgpIGFuZCBzZWUgaWYgaXQncyBkaWZmZXJlbnQKKyAgICAgICAgZnJvbSB0aGUgcHJldmlvdXMgX2Zvcm1hdF9saW5lKCkgY2FsbCwgYnV0IGNhbGxpbmcgX2Zvcm1hdF9saW5lKCkgdGFrZXMKKyAgICAgICAgYXJvdW5kIDIwIHRpbWVzIG1vcmUgdGltZSB0aGFuIGNhbGxpbmcgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICBfbmVlZF91cGRhdGUoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmN1cnJ2YWwgPj0gc2VsZi5uZXh0X3VwZGF0ZQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgICJVcGRhdGVzIHRoZSBwcm9ncmVzcyBiYXIgdG8gYSBuZXcgdmFsdWUuIgorICAgICAgICBhc3NlcnQgMCA8PSB2YWx1ZSA8PSBzZWxmLm1heHZhbCwgJzAgPD0gJWQgPD0gJWQnICUgKHZhbHVlLCBzZWxmLm1heHZhbCkKKyAgICAgICAgc2VsZi5jdXJydmFsID0gdmFsdWUKKyAgICAgICAgaWYgbm90IHNlbGYuX25lZWRfdXBkYXRlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5zdGFydF90aW1lIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1lvdSBtdXN0IGNhbGwgc3RhcnQoKSBiZWZvcmUgY2FsbGluZyB1cGRhdGUoKScpCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuc2Vjb25kc19lbGFwc2VkID0gbm93IC0gc2VsZi5zdGFydF90aW1lCisgICAgICAgIHNlbGYubmV4dF91cGRhdGUgPSBzZWxmLl9uZXh0X3VwZGF0ZSgpCisgICAgICAgIHNlbGYuZmQud3JpdGUoc2VsZi5fZm9ybWF0X2xpbmUoKSArICdccicpCisgICAgICAgIHNlbGYubGFzdF91cGRhdGVfdGltZSA9IG5vdworCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICAiIiJTdGFydHMgbWVhc3VyaW5nIHRpbWUsIGFuZCBwcmludHMgdGhlIGJhciBhdCAwJS4KKworICAgICAgICBJdCByZXR1cm5zIHNlbGYgc28geW91IGNhbiB1c2UgaXQgbGlrZSB0aGlzOgorICAgICAgICA+Pj4gcGJhciA9IFByb2dyZXNzQmFyKCkuc3RhcnQoKQorICAgICAgICA+Pj4gZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgIC4uLiAgICAjIGRvIHNvbWV0aGluZworICAgICAgICAuLi4gICAgcGJhci51cGRhdGUoaSsxKQorICAgICAgICAuLi4KKyAgICAgICAgPj4+IHBiYXIuZmluaXNoKCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubWF4dmFsIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLm1heHZhbCA9IHNlbGYuX0RFRkFVTFRfTUFYVkFMCisgICAgICAgIGFzc2VydCBzZWxmLm1heHZhbCA+IDAKKworICAgICAgICBzZWxmLm51bV9pbnRlcnZhbHMgPSBtYXgoMTAwLCBzZWxmLnRlcm1fd2lkdGgpCisgICAgICAgIHNlbGYudXBkYXRlX2ludGVydmFsID0gc2VsZi5tYXh2YWwgLyBzZWxmLm51bV9pbnRlcnZhbHMKKyAgICAgICAgc2VsZi5uZXh0X3VwZGF0ZSA9IDAKKworICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBzZWxmLmxhc3RfdXBkYXRlX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLnVwZGF0ZSgwKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgIiIiVXNlZCB0byB0ZWxsIHRoZSBwcm9ncmVzcyBpcyBmaW5pc2hlZC4iIiIKKyAgICAgICAgc2VsZi5maW5pc2hlZCA9IFRydWUKKyAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5tYXh2YWwpCisgICAgICAgIHNlbGYuZmQud3JpdGUoJ1xuJykKKyAgICAgICAgaWYgc2VsZi5zaWduYWxfc2V0OgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHV0lOQ0gsIHNpZ25hbC5TSUdfREZMKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvcHJzZXJ2L19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvcHJzZXJ2L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzY2I3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wcnNlcnYvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNCBAQAorX192ZXJzaW9uX18gPSAiMS4wLjAiCisKK2ltcG9ydCBvcywgdGltZQoraW1wb3J0IHN5cyxsb2dnaW5nCisKK2RlZiBpbml0X2xvZ2dlcihsb2dmaWxlLCBsb2dsZXZlbCk6CisgICAgbnVtZXJpY19sZXZlbCA9IGdldGF0dHIobG9nZ2luZywgbG9nbGV2ZWwudXBwZXIoKSwgTm9uZSkKKyAgICBpZiBub3QgaXNpbnN0YW5jZShudW1lcmljX2xldmVsLCBpbnQpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIGxvZyBsZXZlbDogJXMnICUgbG9nbGV2ZWwpCisgICAgRk9STUFUID0gJyUoYXNjdGltZSktMTVzICUobWVzc2FnZSlzJworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bnVtZXJpY19sZXZlbCwgZmlsZW5hbWU9bG9nZmlsZSwgZm9ybWF0PUZPUk1BVCkKKworY2xhc3MgTm90Rm91bmRFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3Byc2Vydi9kYi5weSBiL2JpdGJha2UvbGliL3Byc2Vydi9kYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc5NTgwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvcHJzZXJ2L2RiLnB5CkBAIC0wLDAgKzEsMjY4IEBACitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBlcnJubworaW1wb3J0IHByc2VydgoraW1wb3J0IHRpbWUKKwordHJ5OgorICAgIGltcG9ydCBzcWxpdGUzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBweXNxbGl0ZTIgaW1wb3J0IGRiYXBpMiBhcyBzcWxpdGUzCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlBSc2VydiIpCisKK3NxbHZlcnNpb24gPSBzcWxpdGUzLnNxbGl0ZV92ZXJzaW9uX2luZm8KK2lmIHNxbHZlcnNpb25bMF0gPCAzIG9yIChzcWx2ZXJzaW9uWzBdID09IDMgYW5kIHNxbHZlcnNpb25bMV0gPCAzKToKKyAgICByYWlzZSBFeGNlcHRpb24oInNxbGl0ZTMgdmVyc2lvbiAzLjMuMCBvciBsYXRlciBpcyByZXF1aXJlZC4iKQorCisjCisjICJObyBIaXN0b3J5IiBtb2RlIC0gZm9yIGEgZ2l2ZW4gcXVlcnkgdHVwbGUgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSwKKyMgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdGhlIGxhcmdlc3QgYW1vbmcgYWxsIHRoZSB2YWx1ZXMgb2YgdGhlIHNhbWUKKyMgKHZlcnNpb24sIHBrZ2FyY2gpLiBUaGlzIG1lYW5zIHRoZSBQUiB2YWx1ZSByZXR1cm5lZCBjYW4gTk9UIGJlIGRlY3JlbWVudGVkLgorIworIyAiSGlzdG9yeSIgbW9kZSAtIFJldHVybiBhIG5ldyBoaWdoZXIgdmFsdWUgZm9yIHByZXZpb3VzbHkgdW5zZWVuIHF1ZXJ5CisjIHR1cGxlICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSksIG90aGVyd2lzZSByZXR1cm4gaGlzdG9yaWNhbCB2YWx1ZS4KKyMgVmFsdWUgY2FuIGRlY3JlbWVudCBpZiByZXR1cm5pbmcgdG8gYSBwcmV2aW91cyBidWlsZC4KKyMKKworY2xhc3MgUFJUYWJsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCB0YWJsZSwgbm9oaXN0KToKKyAgICAgICAgc2VsZi5jb25uID0gY29ubgorICAgICAgICBzZWxmLm5vaGlzdCA9IG5vaGlzdAorICAgICAgICBzZWxmLmRpcnR5ID0gRmFsc2UKKyAgICAgICAgaWYgbm9oaXN0OgorICAgICAgICAgICAgc2VsZi50YWJsZSA9ICIlc19ub2hpc3QiICUgdGFibGUgCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRhYmxlID0gIiVzX2hpc3QiICUgdGFibGUgCisKKyAgICAgICAgc2VsZi5fZXhlY3V0ZSgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJXMgXAorICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiBURVhUIE5PVCBOVUxMLCBcCisgICAgICAgICAgICAgICAgICAgIHBrZ2FyY2ggVEVYVCBOT1QgTlVMTCwgIFwKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gVEVYVCBOT1QgTlVMTCwgXAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSBJTlRFR0VSLCBcCisgICAgICAgICAgICAgICAgICAgIFBSSU1BUlkgS0VZICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkpOyIgJSBzZWxmLnRhYmxlKQorCisgICAgZGVmIF9leGVjdXRlKHNlbGYsICpxdWVyeSk6CisgICAgICAgICIiIkV4ZWN1dGUgYSBxdWVyeSwgd2FpdGluZyB0byBhY3F1aXJlIGEgbG9jayBpZiBuZWNlc3NhcnkiIiIKKyAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgICAgICBlbmQgPSBzdGFydCArIDIwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5leGVjdXRlKCpxdWVyeSkKKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUzLk9wZXJhdGlvbmFsRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgIGlmICdpcyBsb2NrZWQnIGluIHN0cihleGMpIGFuZCBlbmQgPiB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByYWlzZSBleGMKKworICAgIGRlZiBzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLmNvbm4uY29tbWl0KCkKKyAgICAgICAgc2VsZi5fZXhlY3V0ZSgiQkVHSU4gRVhDTFVTSVZFIFRSQU5TQUNUSU9OIikKKworICAgIGRlZiBzeW5jX2lmX2RpcnR5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRpcnR5OgorICAgICAgICAgICAgc2VsZi5zeW5jKCkKKyAgICAgICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQorCisgICAgZGVmIF9nZXRWYWx1ZUhpc3Qoc2VsZiwgdmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pOgorICAgICAgICBkYXRhPXNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKSkKKyAgICAgICAgcm93PWRhdGEuZmV0Y2hvbmUoKQorICAgICAgICBpZiByb3cgIT0gTm9uZToKKyAgICAgICAgICAgIHJldHVybiByb3dbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNubyB2YWx1ZSBmb3VuZCwgdHJ5IHRvIGluc2VydAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2V4ZWN1dGUoIklOU0VSVCBJTlRPICVzIFZBTFVFUyAoPywgPywgPywgKHNlbGVjdCBpZm51bGwobWF4KHZhbHVlKSsxLDApIGZyb20gJXMgd2hlcmUgdmVyc2lvbj0/IEFORCBwa2dhcmNoPT8pKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnRhYmxlLHNlbGYudGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24scGtnYXJjaCwgY2hlY2tzdW0sdmVyc2lvbiwgcGtnYXJjaCkpCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlMy5JbnRlZ3JpdHlFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHN0cihleGMpKQorCisgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZQorCisgICAgICAgICAgICBkYXRhPXNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/OyIgJSBzZWxmLnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkpCisgICAgICAgICAgICByb3c9ZGF0YS5mZXRjaG9uZSgpCisgICAgICAgICAgICBpZiByb3cgIT0gTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcm93WzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIHByc2Vydi5Ob3RGb3VuZEVycm9yCisKKyAgICBkZWYgX2dldFZhbHVlTm9oaXN0KHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKToKKyAgICAgICAgZGF0YT1zZWxmLl9leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSAlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgdmVyc2lvbj0/IEFORCBwa2dhcmNoPT8gQU5EIGNoZWNrc3VtPT8gQU5EIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA+PSAoc2VsZWN0IG1heCh2YWx1ZSkgZnJvbSAlcyB3aGVyZSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9Pyk7IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnRhYmxlLCBzZWxmLnRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZlcnNpb24sIHBrZ2FyY2gpKQorICAgICAgICByb3c9ZGF0YS5mZXRjaG9uZSgpCisgICAgICAgIGlmIHJvdyAhPSBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHJvd1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI25vIHZhbHVlIGZvdW5kLCB0cnkgdG8gaW5zZXJ0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZSgiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyAlcyBWQUxVRVMgKD8sID8sID8sIChzZWxlY3QgaWZudWxsKG1heCh2YWx1ZSkrMSwwKSBmcm9tICVzIHdoZXJlIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/KSk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYudGFibGUsc2VsZi50YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2ZXJzaW9uLCBwa2dhcmNoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUzLkludGVncml0eUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisgICAgICAgICAgICAgICAgc2VsZi5jb25uLnJvbGxiYWNrKCkKKworICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUKKworICAgICAgICAgICAgZGF0YT1zZWxmLl9leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSAlcyBXSEVSRSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9PyBBTkQgY2hlY2tzdW09PzsiICUgc2VsZi50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pKQorICAgICAgICAgICAgcm93PWRhdGEuZmV0Y2hvbmUoKQorICAgICAgICAgICAgaWYgcm93ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1swXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBwcnNlcnYuTm90Rm91bmRFcnJvcgorCisgICAgZGVmIGdldFZhbHVlKHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKToKKyAgICAgICAgaWYgc2VsZi5ub2hpc3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0VmFsdWVOb2hpc3QodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0VmFsdWVIaXN0KHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKQorCisgICAgZGVmIF9pbXBvcnRIaXN0KHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSk6CisgICAgICAgIHZhbCA9IE5vbmUgCisgICAgICAgIGRhdGEgPSBzZWxmLl9leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSAlcyBXSEVSRSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9PyBBTkQgY2hlY2tzdW09PzsiICUgc2VsZi50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkpCisgICAgICAgIHJvdyA9IGRhdGEuZmV0Y2hvbmUoKQorICAgICAgICBpZiByb3cgIT0gTm9uZToKKyAgICAgICAgICAgIHZhbD1yb3dbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNubyB2YWx1ZSBmb3VuZCwgdHJ5IHRvIGluc2VydAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2V4ZWN1dGUoIklOU0VSVCBJTlRPICVzIFZBTFVFUyAoPywgPywgPywgPyk7IiAgJSAoc2VsZi50YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZhbHVlKSkKKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUzLkludGVncml0eUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisKKyAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCisKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSAlcyBXSEVSRSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9PyBBTkQgY2hlY2tzdW09PzsiICUgc2VsZi50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSkpCisgICAgICAgICAgICByb3cgPSBkYXRhLmZldGNob25lKCkKKyAgICAgICAgICAgIGlmIHJvdyAhPSBOb25lOgorICAgICAgICAgICAgICAgIHZhbCA9IHJvd1swXQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgX2ltcG9ydE5vaGlzdChzZWxmLCB2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmFsdWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjdHJ5IHRvIGluc2VydAorICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgVkFMVUVTICg/LCA/LCA/LCA/KTsiICAlIChzZWxmLnRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSx2YWx1ZSkpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUzLkludGVncml0eUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICNhbHJlYWR5IGhhdmUgdGhlIHJlY29yZCwgdHJ5IHRvIHVwZGF0ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2V4ZWN1dGUoIlVQREFURSAlcyBTRVQgdmFsdWU9PyBXSEVSRSB2ZXJzaW9uPT8gQU5EIHBrZ2FyY2g9PyBBTkQgY2hlY2tzdW09PyBBTkQgdmFsdWU8PyIgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlLHZlcnNpb24scGtnYXJjaCxjaGVja3N1bSx2YWx1ZSkpCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlMy5JbnRlZ3JpdHlFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHN0cihleGMpKQorCisgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlCisKKyAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NICVzIFdIRVJFIHZlcnNpb249PyBBTkQgcGtnYXJjaD0/IEFORCBjaGVja3N1bT0/IEFORCB2YWx1ZT49PzsiICUgc2VsZi50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbixwa2dhcmNoLGNoZWNrc3VtLHZhbHVlKSkKKyAgICAgICAgcm93PWRhdGEuZmV0Y2hvbmUoKQorICAgICAgICBpZiByb3cgIT0gTm9uZToKKyAgICAgICAgICAgIHJldHVybiByb3dbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaW1wb3J0b25lKHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSk6CisgICAgICAgIGlmIHNlbGYubm9oaXN0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ltcG9ydE5vaGlzdCh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faW1wb3J0SGlzdCh2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmFsdWUpCisKKyAgICBkZWYgZXhwb3J0KHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCBjb2xpbmZvKToKKyAgICAgICAgbWV0YWluZm8gPSB7fQorICAgICAgICAjY29sdW1uIGluZm8gCisgICAgICAgIGlmIGNvbGluZm86CisgICAgICAgICAgICBtZXRhaW5mb1sndGJsX25hbWUnXSA9IHNlbGYudGFibGUKKyAgICAgICAgICAgIG1ldGFpbmZvWydjb3JlX3ZlciddID0gcHJzZXJ2Ll9fdmVyc2lvbl9fCisgICAgICAgICAgICBtZXRhaW5mb1snY29sX2luZm8nXSA9IFtdCisgICAgICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZSgiUFJBR01BIHRhYmxlX2luZm8oJXMpOyIgJSBzZWxmLnRhYmxlKQorICAgICAgICAgICAgZm9yIHJvdyBpbiBkYXRhOgorICAgICAgICAgICAgICAgIGNvbCA9IHt9CisgICAgICAgICAgICAgICAgY29sWyduYW1lJ10gPSByb3dbJ25hbWUnXQorICAgICAgICAgICAgICAgIGNvbFsndHlwZSddID0gcm93Wyd0eXBlJ10KKyAgICAgICAgICAgICAgICBjb2xbJ25vdG51bGwnXSA9IHJvd1snbm90bnVsbCddCisgICAgICAgICAgICAgICAgY29sWydkZmx0X3ZhbHVlJ10gPSByb3dbJ2RmbHRfdmFsdWUnXQorICAgICAgICAgICAgICAgIGNvbFsncGsnXSA9IHJvd1sncGsnXQorICAgICAgICAgICAgICAgIG1ldGFpbmZvWydjb2xfaW5mbyddLmFwcGVuZChjb2wpCisKKyAgICAgICAgI2RhdGEgaW5mbworICAgICAgICBkYXRhaW5mbyA9IFtdCisKKyAgICAgICAgaWYgc2VsZi5ub2hpc3Q6CisgICAgICAgICAgICBzcWxzdG10ID0gIlNFTEVDVCBUMS52ZXJzaW9uLCBUMS5wa2dhcmNoLCBUMS5jaGVja3N1bSwgVDEudmFsdWUgRlJPTSAlcyBhcyBUMSwgXAorICAgICAgICAgICAgICAgICAgICAoU0VMRUNUIHZlcnNpb24scGtnYXJjaCxtYXgodmFsdWUpIGFzIG1heHZhbHVlIEZST00gJXMgR1JPVVAgQlkgdmVyc2lvbixwa2dhcmNoKSBhcyBUMiBcCisgICAgICAgICAgICAgICAgICAgIFdIRVJFIFQxLnZlcnNpb249VDIudmVyc2lvbiBBTkQgVDEucGtnYXJjaD1UMi5wa2dhcmNoIEFORCBUMS52YWx1ZT1UMi5tYXh2YWx1ZSAiICUgKHNlbGYudGFibGUsIHNlbGYudGFibGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzcWxzdG10ID0gIlNFTEVDVCAqIEZST00gJXMgYXMgVDEgV0hFUkUgMT0xICIgJSBzZWxmLnRhYmxlCisgICAgICAgIHNxbGFyZyA9IFtdCisgICAgICAgIHdoZXJlID0gIiIKKyAgICAgICAgaWYgdmVyc2lvbjoKKyAgICAgICAgICAgIHdoZXJlICs9ICJBTkQgVDEudmVyc2lvbj0/ICIKKyAgICAgICAgICAgIHNxbGFyZy5hcHBlbmQoc3RyKHZlcnNpb24pKQorICAgICAgICBpZiBwa2dhcmNoOgorICAgICAgICAgICAgd2hlcmUgKz0gIkFORCBUMS5wa2dhcmNoPT8gIgorICAgICAgICAgICAgc3FsYXJnLmFwcGVuZChzdHIocGtnYXJjaCkpCisgICAgICAgIGlmIGNoZWNrc3VtOgorICAgICAgICAgICAgd2hlcmUgKz0gIkFORCBUMS5jaGVja3N1bT0/ICIKKyAgICAgICAgICAgIHNxbGFyZy5hcHBlbmQoc3RyKGNoZWNrc3VtKSkKKworICAgICAgICBzcWxzdG10ICs9IHdoZXJlICsgIjsiCisKKyAgICAgICAgaWYgbGVuKHNxbGFyZyk6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fZXhlY3V0ZShzcWxzdG10LCB0dXBsZShzcWxhcmcpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2V4ZWN1dGUoc3Fsc3RtdCkKKyAgICAgICAgZm9yIHJvdyBpbiBkYXRhOgorICAgICAgICAgICAgaWYgcm93Wyd2ZXJzaW9uJ106CisgICAgICAgICAgICAgICAgY29sID0ge30KKyAgICAgICAgICAgICAgICBjb2xbJ3ZlcnNpb24nXSA9IHJvd1sndmVyc2lvbiddCisgICAgICAgICAgICAgICAgY29sWydwa2dhcmNoJ10gPSByb3dbJ3BrZ2FyY2gnXQorICAgICAgICAgICAgICAgIGNvbFsnY2hlY2tzdW0nXSA9IHJvd1snY2hlY2tzdW0nXQorICAgICAgICAgICAgICAgIGNvbFsndmFsdWUnXSA9IHJvd1sndmFsdWUnXQorICAgICAgICAgICAgICAgIGRhdGFpbmZvLmFwcGVuZChjb2wpCisgICAgICAgIHJldHVybiAobWV0YWluZm8sIGRhdGFpbmZvKQorCitjbGFzcyBQUkRhdGEob2JqZWN0KToKKyAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBQUiBkYXRhYmFzZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbm9oaXN0PVRydWUpOgorICAgICAgICBzZWxmLmZpbGVuYW1lPW9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5ub2hpc3Q9bm9oaXN0CisgICAgICAgICNidWlsZCBkaXJlY3RvcnkgaGllcmFyY2h5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShzZWxmLmZpbGVuYW1lKSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIHJhaXNlIGUKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uPXNxbGl0ZTMuY29ubmVjdChzZWxmLmZpbGVuYW1lLCBpc29sYXRpb25fbGV2ZWw9IkVYQ0xVU0lWRSIsIGNoZWNrX3NhbWVfdGhyZWFkID0gRmFsc2UpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5yb3dfZmFjdG9yeT1zcWxpdGUzLlJvdworICAgICAgICBzZWxmLmNvbm5lY3Rpb24uZXhlY3V0ZSgicHJhZ21hIHN5bmNocm9ub3VzID0gb2ZmOyIpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5leGVjdXRlKCJQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMOyIpCisgICAgICAgIHNlbGYuX3RhYmxlcz17fQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5jbG9zZSgpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZix0YmxuYW1lKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGJsbmFtZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRibG5hbWUgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgbm90ICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHRibG5hbWUpKQorICAgICAgICBpZiB0YmxuYW1lIGluIHNlbGYuX3RhYmxlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWJsZXNbdGJsbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhYmxlb2JqID0gc2VsZi5fdGFibGVzW3RibG5hbWVdID0gUFJUYWJsZShzZWxmLmNvbm5lY3Rpb24sIHRibG5hbWUsIHNlbGYubm9oaXN0KQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlb2JqCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgdGJsbmFtZSk6CisgICAgICAgIGlmIHRibG5hbWUgaW4gc2VsZi5fdGFibGVzOgorICAgICAgICAgICAgZGVsIHNlbGYuX3RhYmxlc1t0YmxuYW1lXQorICAgICAgICBsb2dnZXIuaW5mbygiZHJvcCB0YWJsZSAlcyIgJSAodGJsbmFtZSkpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5leGVjdXRlKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAlczsiICUgdGJsbmFtZSkgCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi9wcnNlcnYvc2Vydi5weSBiL2JpdGJha2UvbGliL3Byc2Vydi9zZXJ2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGZmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi9wcnNlcnYvc2Vydi5weQpAQCAtMCwwICsxLDQxOCBAQAoraW1wb3J0IG9zLHN5cyxsb2dnaW5nCitpbXBvcnQgc2lnbmFsLCB0aW1lCitmcm9tIFNpbXBsZVhNTFJQQ1NlcnZlciBpbXBvcnQgU2ltcGxlWE1MUlBDU2VydmVyLCBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IFF1ZXVlCisKK3RyeToKKyAgICBpbXBvcnQgc3FsaXRlMworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworCitpbXBvcnQgYmIuc2VydmVyLnhtbHJwYworaW1wb3J0IHByc2VydgoraW1wb3J0IHByc2Vydi5kYgoraW1wb3J0IGVycm5vCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJCaXRCYWtlLlBSc2VydiIpCisKK2lmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMjA2MDBGMDoKKyAgICBwcmludCgiU29ycnksIHB5dGhvbiAyLjYgb3IgbGF0ZXIgaXMgcmVxdWlyZWQuIikKKyAgICBzeXMuZXhpdCgxKQorCitjbGFzcyBIYW5kbGVyKFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgX2Rpc3BhdGNoKHNlbGYsbWV0aG9kLHBhcmFtcyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlPXNlbGYuc2VydmVyLmZ1bmNzW21ldGhvZF0oKnBhcmFtcykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gdmFsdWUKKworUElEUFJFRklYID0gIi90bXAvUFJTZXJ2ZXJfJXNfJXMucGlkIgorc2luZ2xldG9uID0gTm9uZQorCisKK2NsYXNzIFBSU2VydmVyKFNpbXBsZVhNTFJQQ1NlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiZmlsZSwgbG9nZmlsZSwgaW50ZXJmYWNlLCBkYWVtb249VHJ1ZSk6CisgICAgICAgICcnJyBjb25zdHJ1Y3RvciAnJycKKyAgICAgICAgaW1wb3J0IHNvY2tldAorICAgICAgICB0cnk6CisgICAgICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuX19pbml0X18oc2VsZiwgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPUZhbHNlLCBhbGxvd19ub25lPVRydWUpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBpcD1zb2NrZXQuZ2V0aG9zdGJ5bmFtZShpbnRlcmZhY2VbMF0pCisgICAgICAgICAgICBwb3J0PWludGVyZmFjZVsxXQorICAgICAgICAgICAgbXNnPSJQUiBTZXJ2ZXIgdW5hYmxlIHRvIGJpbmQgdG8gJXM6JXNcbiIgJSAoaXAsIHBvcnQpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZykKKyAgICAgICAgICAgIHJhaXNlIFBSU2VydmljZUNvbmZpZ0Vycm9yCisKKyAgICAgICAgc2VsZi5kYmZpbGU9ZGJmaWxlCisgICAgICAgIHNlbGYuZGFlbW9uPWRhZW1vbgorICAgICAgICBzZWxmLmxvZ2ZpbGU9bG9nZmlsZQorICAgICAgICBzZWxmLndvcmtpbmdfdGhyZWFkPU5vbmUKKyAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIHNlbGYucGlkZmlsZT1QSURQUkVGSVggJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisKKyAgICAgICAgc2VsZi5yZWdpc3Rlcl9mdW5jdGlvbihzZWxmLmdldFBSLCAiZ2V0UFIiKQorICAgICAgICBzZWxmLnJlZ2lzdGVyX2Z1bmN0aW9uKHNlbGYucXVpdCwgInF1aXQiKQorICAgICAgICBzZWxmLnJlZ2lzdGVyX2Z1bmN0aW9uKHNlbGYucGluZywgInBpbmciKQorICAgICAgICBzZWxmLnJlZ2lzdGVyX2Z1bmN0aW9uKHNlbGYuZXhwb3J0LCAiZXhwb3J0IikKKyAgICAgICAgc2VsZi5yZWdpc3Rlcl9mdW5jdGlvbihzZWxmLmltcG9ydG9uZSwgImltcG9ydG9uZSIpCisgICAgICAgIHNlbGYucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQorCisgICAgICAgIHNlbGYuZGIgPSBwcnNlcnYuZGIuUFJEYXRhKHNlbGYuZGJmaWxlKQorICAgICAgICBzZWxmLnRhYmxlID0gc2VsZi5kYlsiUFJNQUlOIl0KKworICAgICAgICBzZWxmLnJlcXVlc3RxdWV1ZSA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5oYW5kbGVydGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQgPSBzZWxmLnByb2Nlc3NfcmVxdWVzdF90aHJlYWQpCisgICAgICAgIHNlbGYuaGFuZGxlcnRocmVhZC5kYWVtb24gPSBGYWxzZQorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdF90aHJlYWQoc2VsZik6CisgICAgICAgICIiIlNhbWUgYXMgaW4gQmFzZVNlcnZlciBidXQgYXMgYSB0aHJlYWQuCisKKyAgICAgICAgSW4gYWRkaXRpb24sIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBkb25lIGhlcmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGl0ZXJfY291bnQgPSAxCisgICAgICAgICMgNjAgaXRlcmF0aW9ucyBiZXR3ZWVuIHN5bmNzIG9yIHN5bmMgaWYgZGlydHkgZXZlcnkgfjMwIHNlY29uZHMKKyAgICAgICAgaXRlcmF0aW9uc19iZXR3ZWVuX3N5bmMgPSA2MAorCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKSA9IHNlbGYucmVxdWVzdHF1ZXVlLmdldChUcnVlLCAzMCkKKyAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLnN5bmNfaWZfZGlydHkoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICBpdGVyX2NvdW50ID0gKGl0ZXJfY291bnQgKyAxKSAlIGl0ZXJhdGlvbnNfYmV0d2Vlbl9zeW5jCisgICAgICAgICAgICAgICAgaWYgaXRlcl9jb3VudCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYmxlLnN5bmNfaWZfZGlydHkoKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHNlbGYudGFibGUuc3luYygpCisgICAgICAgICAgICBzZWxmLnRhYmxlLnN5bmNfaWZfZGlydHkoKQorCisgICAgZGVmIHNpZ2ludF9oYW5kbGVyKHNlbGYsIHNpZ251bSwgc3RhY2spOgorICAgICAgICBzZWxmLnRhYmxlLnN5bmMoKQorCisgICAgZGVmIHNpZ3Rlcm1faGFuZGxlcihzZWxmLCBzaWdudW0sIHN0YWNrKToKKyAgICAgICAgc2VsZi50YWJsZS5zeW5jKCkKKyAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgIHNlbGYucmVxdWVzdHF1ZXVlLnB1dCgocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpKQorCisgICAgZGVmIGV4cG9ydChzZWxmLCB2ZXJzaW9uPU5vbmUsIHBrZ2FyY2g9Tm9uZSwgY2hlY2tzdW09Tm9uZSwgY29saW5mbz1UcnVlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGFibGUuZXhwb3J0KHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCBjb2xpbmZvKQorICAgICAgICBleGNlcHQgc3FsaXRlMy5FcnJvciBhcyBleGM6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGV4YykpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGltcG9ydG9uZShzZWxmLCB2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSwgdmFsdWUpOgorICAgICAgICByZXR1cm4gc2VsZi50YWJsZS5pbXBvcnRvbmUodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIHZhbHVlKQorCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5xdWl0CisKKyAgICBkZWYgZ2V0aW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgIGRlZiBnZXRQUihzZWxmLCB2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRhYmxlLmdldFZhbHVlKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtKQorICAgICAgICBleGNlcHQgcHJzZXJ2Lk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImNhbiBub3QgZmluZCB2YWx1ZSBmb3IgKCVzLCAlcykiLHZlcnNpb24sIGNoZWNrc3VtKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZXhjZXB0IHNxbGl0ZTMuRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHN0cihleGMpKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICBzZWxmLnF1aXQ9VHJ1ZQorICAgICAgICByZXR1cm4KKworICAgIGRlZiB3b3JrX2ZvcmV2ZXIoc2VsZiwpOgorICAgICAgICBzZWxmLnF1aXQgPSBGYWxzZQorICAgICAgICBzZWxmLnRpbWVvdXQgPSAwLjUKKworICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRlZCBQUlNlcnZlciB3aXRoIERCZmlsZTogJXMsIElQOiAlcywgUE9SVDogJXMsIFBJRDogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRiZmlsZSwgc2VsZi5ob3N0LCBzZWxmLnBvcnQsIHN0cihvcy5nZXRwaWQoKSkpKQorCisgICAgICAgIHNlbGYuaGFuZGxlcnRocmVhZC5zdGFydCgpCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgc2VsZi5oYW5kbGVydGhyZWFkLmpvaW4oKQorICAgICAgICBzZWxmLnRhYmxlLnN5bmMoKQorICAgICAgICBsb2dnZXIuaW5mbygiUFJTZXJ2ZXI6IHN0b3BwaW5nLi4uIikKKyAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYWVtb246CisgICAgICAgICAgICBwaWQgPSBzZWxmLmRhZW1vbml6ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwaWQgPSBzZWxmLmZvcmsoKQorCisgICAgICAgICMgRW5zdXJlIGJvdGggdGhlIHBhcmVudCBzZWVzIHRoaXMgYW5kIHRoZSBjaGlsZCBmcm9tIHRoZSB3b3JrX2ZvcmV2ZXIgbG9nIGVudHJ5IGFib3ZlCisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGVkIFBSU2VydmVyIHdpdGggREJmaWxlOiAlcywgSVA6ICVzLCBQT1JUOiAlcywgUElEOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZGJmaWxlLCBzZWxmLmhvc3QsIHNlbGYucG9ydCwgc3RyKHBpZCkpKQorCisgICAgZGVmIGRlbHBpZChzZWxmKToKKyAgICAgICAgb3MucmVtb3ZlKHNlbGYucGlkZmlsZSkKKworICAgIGRlZiBkYWVtb25pemUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZWUgQWR2YW5jZWQgUHJvZ3JhbW1pbmcgaW4gdGhlIFVOSVgsIFNlYyAxMy4zCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIHBpZCA+IDA6CisgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChwaWQsIDApCisgICAgICAgICAgICAgICAgI3BhcmVudCByZXR1cm4gaW5zdGVhZCBvZiBleGl0IHRvIGdpdmUgY29udHJvbCAKKyAgICAgICAgICAgICAgICByZXR1cm4gcGlkCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIiVzIFslZF0iICUgKGUuc3RyZXJyb3IsIGUuZXJybm8pKQorCisgICAgICAgIG9zLnNldHNpZCgpCisgICAgICAgICIiIgorICAgICAgICBmb3JrIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgZGFlbW9uIGlzIG5vdCBzZXNzaW9uIGxlYWRlciwgCisgICAgICAgIHdoaWNoIHByZXZlbnRzIGl0IGZyb20gYWNxdWlyaW5nIGNvbnRyb2xsaW5nIHRlcm1pbmFsCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIHBpZCA+IDA6ICNwYXJlbnQKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIlcyBbJWRdIiAlIChlLnN0cmVycm9yLCBlLmVycm5vKSkKKworICAgICAgICBzZWxmLmNsZWFudXBfaGFuZGxlcygpCisgICAgICAgIG9zLl9leGl0KDApCisKKyAgICBkZWYgZm9yayhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBwaWQgPiAwOgorICAgICAgICAgICAgICAgIHJldHVybiBwaWQKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiJXMgWyVkXSIgJSAoZS5zdHJlcnJvciwgZS5lcnJubykpCisKKyAgICAgICAgYmIudXRpbHMuc2lnbmFsX29uX3BhcmVudF9leGl0KCJTSUdURVJNIikKKyAgICAgICAgc2VsZi5jbGVhbnVwX2hhbmRsZXMoKQorICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgZGVmIGNsZWFudXBfaGFuZGxlcyhzZWxmKToKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzZWxmLnNpZ2ludF9oYW5kbGVyKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdURVJNLCBzZWxmLnNpZ3Rlcm1faGFuZGxlcikKKyAgICAgICAgb3MudW1hc2soMCkKKyAgICAgICAgb3MuY2hkaXIoIi8iKQorCisgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgc2kgPSBmaWxlKCcvZGV2L251bGwnLCAncicpCisgICAgICAgIHNvID0gZmlsZShzZWxmLmxvZ2ZpbGUsICdhKycpCisgICAgICAgIHNlID0gc28KKyAgICAgICAgb3MuZHVwMihzaS5maWxlbm8oKSxzeXMuc3RkaW4uZmlsZW5vKCkpCisgICAgICAgIG9zLmR1cDIoc28uZmlsZW5vKCksc3lzLnN0ZG91dC5maWxlbm8oKSkKKyAgICAgICAgb3MuZHVwMihzZS5maWxlbm8oKSxzeXMuc3RkZXJyLmZpbGVubygpKQorCisgICAgICAgICMgQ2xlYXIgb3V0IGFsbCBsb2cgaGFuZGxlcnMgcHJpb3IgdG8gdGhlIGZvcmsoKSB0byBhdm9pZCBjYWxsaW5nCisgICAgICAgICMgZXZlbnQgaGFuZGxlcnMgbm90IHBhcnQgb2YgdGhlIFBSc2VydmVyCisgICAgICAgIGZvciBsb2dnZXJfaXRlciBpbiBsb2dnaW5nLkxvZ2dlci5tYW5hZ2VyLmxvZ2dlckRpY3Qua2V5cygpOgorICAgICAgICAgICAgbG9nZ2luZy5nZXRMb2dnZXIobG9nZ2VyX2l0ZXIpLmhhbmRsZXJzID0gW10KKworICAgICAgICAjIEVuc3VyZSBsb2dnaW5nIG1ha2VzIGl0IHRvIHRoZSBsb2dmaWxlCisgICAgICAgIHN0cmVhbWhhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKQorICAgICAgICBzdHJlYW1oYW5kbGVyLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCisgICAgICAgIGZvcm1hdHRlciA9IGJiLm1zZy5CQkxvZ0Zvcm1hdHRlcigiJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiKQorICAgICAgICBzdHJlYW1oYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKHN0cmVhbWhhbmRsZXIpCisKKyAgICAgICAgIyB3cml0ZSBwaWRmaWxlCisgICAgICAgIHBpZCA9IHN0cihvcy5nZXRwaWQoKSkgCisgICAgICAgIHBmID0gZmlsZShzZWxmLnBpZGZpbGUsICd3JykKKyAgICAgICAgcGYud3JpdGUoIiVzXG4iICUgcGlkKQorICAgICAgICBwZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi53b3JrX2ZvcmV2ZXIoKQorICAgICAgICBzZWxmLmRlbHBpZCgpCisKK2NsYXNzIFBSU2VydlNpbmdsZXRvbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYmZpbGUsIGxvZ2ZpbGUsIGludGVyZmFjZSk6CisgICAgICAgIHNlbGYuZGJmaWxlID0gZGJmaWxlCisgICAgICAgIHNlbGYubG9nZmlsZSA9IGxvZ2ZpbGUKKyAgICAgICAgc2VsZi5pbnRlcmZhY2UgPSBpbnRlcmZhY2UKKyAgICAgICAgc2VsZi5ob3N0ID0gTm9uZQorICAgICAgICBzZWxmLnBvcnQgPSBOb25lCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYucHJzZXJ2ID0gUFJTZXJ2ZXIoc2VsZi5kYmZpbGUsIHNlbGYubG9nZmlsZSwgc2VsZi5pbnRlcmZhY2UsIGRhZW1vbj1GYWxzZSkKKyAgICAgICAgc2VsZi5wcnNlcnYuc3RhcnQoKQorICAgICAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCA9IHNlbGYucHJzZXJ2LmdldGluZm8oKQorCisgICAgZGVmIGdldGluZm8oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisKK2NsYXNzIFBSU2VydmVyQ29ubmVjdGlvbihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgaWYgaXNfbG9jYWxfc3BlY2lhbChob3N0LCBwb3J0KToKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBzaW5nbGV0b24uZ2V0aW5mbygpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmNvbm5lY3Rpb24sIHNlbGYudHJhbnNwb3J0ID0gYmIuc2VydmVyLnhtbHJwYy5fY3JlYXRlX3NlcnZlcihzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUZXJtaW5hdGluZyBQUlNlcnZlci4uLiIpCisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24ucXVpdCgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXNcbiIgJSBzdHIoZXhjKSkKKworICAgIGRlZiBnZXRQUihzZWxmLCB2ZXJzaW9uLCBwa2dhcmNoLCBjaGVja3N1bSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uZ2V0UFIodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0pCisKKyAgICBkZWYgcGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5waW5nKCkKKworICAgIGRlZiBleHBvcnQoc2VsZix2ZXJzaW9uPU5vbmUsIHBrZ2FyY2g9Tm9uZSwgY2hlY2tzdW09Tm9uZSwgY29saW5mbz1UcnVlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5leHBvcnQodmVyc2lvbiwgcGtnYXJjaCwgY2hlY2tzdW0sIGNvbGluZm8pCisKKyAgICBkZWYgaW1wb3J0b25lKHNlbGYsIHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uaW1wb3J0b25lKHZlcnNpb24sIHBrZ2FyY2gsIGNoZWNrc3VtLCB2YWx1ZSkKKworICAgIGRlZiBnZXRpbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ob3N0LCBzZWxmLnBvcnQKKworZGVmIHN0YXJ0X2RhZW1vbihkYmZpbGUsIGhvc3QsIHBvcnQsIGxvZ2ZpbGUpOgorICAgIHBpZGZpbGUgPSBQSURQUkVGSVggJSAoaG9zdCwgcG9ydCkKKyAgICB0cnk6CisgICAgICAgIHBmID0gZmlsZShwaWRmaWxlLCdyJykKKyAgICAgICAgcGlkID0gaW50KHBmLnJlYWRsaW5lKCkuc3RyaXAoKSkKKyAgICAgICAgcGYuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBwaWQgPSBOb25lCisKKyAgICBpZiBwaWQ6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInBpZGZpbGUgJXMgYWxyZWFkeSBleGlzdC4gRGFlbW9uIGFscmVhZHkgcnVubmluZz9cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHBpZGZpbGUpCisgICAgICAgIHJldHVybiAxCisKKyAgICBzZXJ2ZXIgPSBQUlNlcnZlcihvcy5wYXRoLmFic3BhdGgoZGJmaWxlKSwgb3MucGF0aC5hYnNwYXRoKGxvZ2ZpbGUpLCAoaG9zdCxwb3J0KSkKKyAgICBzZXJ2ZXIuc3RhcnQoKQorICAgIHJldHVybiAwCisKK2RlZiBzdG9wX2RhZW1vbihob3N0LCBwb3J0KToKKyAgICBwaWRmaWxlID0gUElEUFJFRklYICUgKGhvc3QsIHBvcnQpCisgICAgdHJ5OgorICAgICAgICBwZiA9IGZpbGUocGlkZmlsZSwncicpCisgICAgICAgIHBpZCA9IGludChwZi5yZWFkbGluZSgpLnN0cmlwKCkpCisgICAgICAgIHBmLmNsb3NlKCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGlkID0gTm9uZQorCisgICAgaWYgbm90IHBpZDoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgicGlkZmlsZSAlcyBkb2VzIG5vdCBleGlzdC4gRGFlbW9uIG5vdCBydW5uaW5nP1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBwaWRmaWxlKQorCisgICAgdHJ5OgorICAgICAgICBQUlNlcnZlckNvbm5lY3Rpb24oaG9zdCwgcG9ydCkudGVybWluYXRlKCkKKyAgICBleGNlcHQ6CisgICAgICAgIGxvZ2dlci5jcml0aWNhbCgiU3RvcCBQUlNlcnZpY2UgJXM6JWQgZmFpbGVkIiAlIChob3N0LHBvcnQpKQorCisgICAgdHJ5OgorICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICB3YWl0X3RpbWVvdXQgPSAwCisgICAgICAgICAgICBwcmludCgiV2FpdGluZyBmb3IgcHItc2VydmVyIHRvIGV4aXQuIikKKyAgICAgICAgICAgIHdoaWxlIGlzX3J1bm5pbmcocGlkKSBhbmQgd2FpdF90aW1lb3V0IDwgNTA6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICAgICAgd2FpdF90aW1lb3V0ICs9IDEKKworICAgICAgICAgICAgaWYgaXNfcnVubmluZyhwaWQpOgorICAgICAgICAgICAgICAgIHByaW50KCJTZW5kaW5nIFNJR1RFUk0gdG8gcHItc2VydmVyLiIpCisgICAgICAgICAgICAgICAgb3Mua2lsbChwaWQsc2lnbmFsLlNJR1RFUk0pCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBpZGZpbGUpOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwaWRmaWxlKQorCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgZXJyID0gc3RyKGUpCisgICAgICAgIGlmIGVyci5maW5kKCJObyBzdWNoIHByb2Nlc3MiKSA8PSAwOgorICAgICAgICAgICAgcmFpc2UgZQorCisgICAgcmV0dXJuIDAKKworZGVmIGlzX3J1bm5pbmcocGlkKToKKyAgICB0cnk6CisgICAgICAgIG9zLmtpbGwocGlkLCAwKQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKKyAgICAgICAgaWYgZXJyLmVycm5vID09IGVycm5vLkVTUkNIOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIGlzX2xvY2FsX3NwZWNpYWwoaG9zdCwgcG9ydCk6CisgICAgaWYgaG9zdC5zdHJpcCgpLnVwcGVyKCkgPT0gJ2xvY2FsaG9zdCcudXBwZXIoKSBhbmQgKG5vdCBwb3J0KToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgUFJTZXJ2aWNlQ29uZmlnRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2RlZiBhdXRvX3N0YXJ0KGQpOgorICAgIGdsb2JhbCBzaW5nbGV0b24KKworICAgIGhvc3RfcGFyYW1zID0gZmlsdGVyKE5vbmUsIChkLmdldFZhcignUFJTRVJWX0hPU1QnLCBUcnVlKSBvciAnJykuc3BsaXQoJzonKSkKKyAgICBpZiBub3QgaG9zdF9wYXJhbXM6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBpZiBsZW4oaG9zdF9wYXJhbXMpICE9IDI6CisgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnXG4nLmpvaW4oWydQUlNFUlZfSE9TVDogaW5jb3JyZWN0IGZvcm1hdCcsCisgICAgICAgICAgICAgICAgJ1VzYWdlOiBQUlNFUlZfSE9TVCA9ICI8aG9zdG5hbWU+Ojxwb3J0PiInXSkpCisgICAgICAgIHJhaXNlIFBSU2VydmljZUNvbmZpZ0Vycm9yCisKKyAgICBpZiBpc19sb2NhbF9zcGVjaWFsKGhvc3RfcGFyYW1zWzBdLCBpbnQoaG9zdF9wYXJhbXNbMV0pKSBhbmQgbm90IHNpbmdsZXRvbjoKKyAgICAgICAgaW1wb3J0IGJiLnV0aWxzCisgICAgICAgIGNhY2hlZGlyID0gKGQuZ2V0VmFyKCJQRVJTSVNURU5UX0RJUiIsIFRydWUpIG9yIGQuZ2V0VmFyKCJDQUNIRSIsIFRydWUpKQorICAgICAgICBpZiBub3QgY2FjaGVkaXI6CisgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoIlBsZWFzZSBzZXQgdGhlICdQRVJTSVNURU5UX0RJUicgb3IgJ0NBQ0hFJyB2YXJpYWJsZSIpCisgICAgICAgICAgICByYWlzZSBQUlNlcnZpY2VDb25maWdFcnJvcgorICAgICAgICBiYi51dGlscy5ta2RpcmhpZXIoY2FjaGVkaXIpCisgICAgICAgIGRiZmlsZSA9IG9zLnBhdGguam9pbihjYWNoZWRpciwgInByc2Vydi5zcWxpdGUzIikKKyAgICAgICAgbG9nZmlsZSA9IG9zLnBhdGguam9pbihjYWNoZWRpciwgInByc2Vydi5sb2ciKQorICAgICAgICBzaW5nbGV0b24gPSBQUlNlcnZTaW5nbGV0b24ob3MucGF0aC5hYnNwYXRoKGRiZmlsZSksIG9zLnBhdGguYWJzcGF0aChsb2dmaWxlKSwgKCJsb2NhbGhvc3QiLDApKQorICAgICAgICBzaW5nbGV0b24uc3RhcnQoKQorICAgIGlmIHNpbmdsZXRvbjoKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNpbmdsZXRvbi5nZXRpbmZvKCkKKyAgICBlbHNlOgorICAgICAgICBob3N0ID0gaG9zdF9wYXJhbXNbMF0KKyAgICAgICAgcG9ydCA9IGludChob3N0X3BhcmFtc1sxXSkKKworICAgIHRyeToKKyAgICAgICAgY29ubmVjdGlvbiA9IFBSU2VydmVyQ29ubmVjdGlvbihob3N0LHBvcnQpCisgICAgICAgIGNvbm5lY3Rpb24ucGluZygpCisgICAgICAgIHJlYWxob3N0LCByZWFscG9ydCA9IGNvbm5lY3Rpb24uZ2V0aW5mbygpCisgICAgICAgIHJldHVybiBzdHIocmVhbGhvc3QpICsgIjoiICsgc3RyKHJlYWxwb3J0KQorICAgICAgICAKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBsb2dnZXIuY3JpdGljYWwoIlBSc2VydmljZSAlczolZCBub3QgYXZhaWxhYmxlIiAlIChob3N0LCBwb3J0KSkKKyAgICAgICAgcmFpc2UgUFJTZXJ2aWNlQ29uZmlnRXJyb3IKKworZGVmIGF1dG9fc2h1dGRvd24oZD1Ob25lKToKKyAgICBnbG9iYWwgc2luZ2xldG9uCisgICAgaWYgc2luZ2xldG9uOgorICAgICAgICBob3N0LCBwb3J0ID0gc2luZ2xldG9uLmdldGluZm8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBQUlNlcnZlckNvbm5lY3Rpb24oaG9zdCwgcG9ydCkudGVybWluYXRlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCJTdG9wIFBSU2VydmljZSAlczolZCBmYWlsZWQiICUgKGhvc3QscG9ydCkpCisgICAgICAgIHNpbmdsZXRvbiA9IE5vbmUKKworZGVmIHBpbmcoaG9zdCwgcG9ydCk6CisgICAgY29ubj1QUlNlcnZlckNvbm5lY3Rpb24oaG9zdCwgcG9ydCkKKyAgICByZXR1cm4gY29ubi5waW5nKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3B5aW5vdGlmeS5weSBiL2JpdGJha2UvbGliL3B5aW5vdGlmeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFlMDAyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvcHlpbm90aWZ5LnB5CkBAIC0wLDAgKzEsMjQxNiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgcHlpbm90aWZ5LnB5IC0gcHl0aG9uIGludGVyZmFjZSB0byBpbm90aWZ5CisjIENvcHlyaWdodCAoYykgMjAwNS0yMDE1IFNlYmFzdGllbiBNYXJ0aW5pIDxzZWJAZGJ6dGVhbS5vcmc+CisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworIyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisjIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisjIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyMgVEhFIFNPRlRXQVJFLgorIiIiCitweWlub3RpZnkKKworQGF1dGhvcjogU2ViYXN0aWVuIE1hcnRpbmkKK0BsaWNlbnNlOiBNSVQgTGljZW5zZQorQGNvbnRhY3Q6IHNlYkBkYnp0ZWFtLm9yZworIiIiCisKK2NsYXNzIFB5aW5vdGlmeUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiSW5kaWNhdGVzIGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IGEgUHlpbm90aWZ5IGNsYXNzLiIiIgorICAgIHBhc3MKKworCitjbGFzcyBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb25FcnJvcihQeWlub3RpZnlFcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIG9uIHVuc3VwcG9ydGVkIFB5dGhvbiB2ZXJzaW9ucy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gdmVyc2lvbjogQ3VycmVudCBQeXRob24gdmVyc2lvbgorICAgICAgICBAdHlwZSB2ZXJzaW9uOiBzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGVyciA9ICdQeXRob24gJXMgaXMgdW5zdXBwb3J0ZWQsIHJlcXVpcmVzIGF0IGxlYXN0IFB5dGhvbiAyLjQnCisgICAgICAgIFB5aW5vdGlmeUVycm9yLl9faW5pdF9fKHNlbGYsIGVyciAlIHZlcnNpb24pCisKKworIyBDaGVjayBQeXRob24gdmVyc2lvbgoraW1wb3J0IHN5cworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA0KToKKyAgICByYWlzZSBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb25FcnJvcihzeXMudmVyc2lvbikKKworCisjIEltcG9ydCBkaXJlY3RpdmVzCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBmY250bAoraW1wb3J0IGVycm5vCitpbXBvcnQgdGVybWlvcworaW1wb3J0IGFycmF5CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGF0ZXhpdAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKK2ltcG9ydCB0aW1lCitpbXBvcnQgcmUKK2ltcG9ydCBhc3luY29yZQoraW1wb3J0IHN1YnByb2Nlc3MKKwordHJ5OgorICAgIGZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzICAjIFdpbGwgZmFpbCBvbiBQeXRob24gMi40IHdoaWNoIGhhcyByZWR1Y2UoKSBidWlsdGluIGFueXdheS4KKwordHJ5OgorICAgIGZyb20gZ2xvYiBpbXBvcnQgaWdsb2IgYXMgZ2xvYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUHl0aG9uIDIuNCBkb2VzIG5vdCBoYXZlIGdsb2IuaWdsb2IoKS4KKyAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IgYXMgZ2xvYgorCit0cnk6CisgICAgaW1wb3J0IGN0eXBlcworICAgIGltcG9ydCBjdHlwZXMudXRpbAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGN0eXBlcyA9IE5vbmUKKwordHJ5OgorICAgIGltcG9ydCBpbm90aWZ5X3N5c2NhbGxzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW5vdGlmeV9zeXNjYWxscyA9IE5vbmUKKworCitfX2F1dGhvcl9fID0gInNlYkBkYnp0ZWFtLm9yZyAoU2ViYXN0aWVuIE1hcnRpbmkpIgorCitfX3ZlcnNpb25fXyA9ICIwLjkuNSIKKworX19tZXRhY2xhc3NfXyA9IHR5cGUgICMgVXNlIG5ldy1zdHlsZSBjbGFzc2VzIGJ5IGRlZmF1bHQKKworCisjIENvbXBhdGliaXR5IG1vZGU6IHNldCB0byBUcnVlIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoCisjIFB5aW5vdGlmeSAwLjcuMS4gRG8gbm90IHNldCB0aGlzIHZhcmlhYmxlIHlvdXJzZWxmLCBjYWxsIHRoZQorIyBmdW5jdGlvbiBjb21wYXRpYmlsaXR5X21vZGUoKSBpbnN0ZWFkLgorQ09NUEFUSUJJTElUWV9NT0RFID0gRmFsc2UKKworCitjbGFzcyBJbm90aWZ5QmluZGluZ05vdEZvdW5kRXJyb3IoUHlpbm90aWZ5RXJyb3IpOgorICAgICIiIgorICAgIFJhaXNlZCB3aGVuIG5vIGlub3RpZnkgc3VwcG9ydCBjb3VsZG4ndCBiZSBmb3VuZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGVyciA9ICJDb3VsZG4ndCBmaW5kIGFueSBpbm90aWZ5IGJpbmRpbmciCisgICAgICAgIFB5aW5vdGlmeUVycm9yLl9faW5pdF9fKHNlbGYsIGVycikKKworCitjbGFzcyBJTm90aWZ5V3JhcHBlcjoKKyAgICAiIiIKKyAgICBBYnN0cmFjdCBjbGFzcyB3cmFwcGluZyBhY2Nlc3MgdG8gaW5vdGlmeSdzIGZ1bmN0aW9ucy4gVGhpcyBpcyBhbgorICAgIGludGVybmFsIGNsYXNzLgorICAgICIiIgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgY3JlYXRlKCk6CisgICAgICAgICMgRmlyc3QsIHRyeSB0byB1c2UgY3R5cGVzLgorICAgICAgICBpZiBjdHlwZXM6CisgICAgICAgICAgICBpbm90aWZ5ID0gX0N0eXBlc0xpYmNJTm90aWZ5V3JhcHBlcigpCisgICAgICAgICAgICBpZiBpbm90aWZ5LmluaXQoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5vdGlmeQorICAgICAgICAjIFNlY29uZCwgc2VlIGlmIEMgZXh0ZW5zaW9uIGlzIGNvbXBpbGVkLgorICAgICAgICBpZiBpbm90aWZ5X3N5c2NhbGxzOgorICAgICAgICAgICAgaW5vdGlmeSA9IF9JTm90aWZ5U3lzY2FsbHNXcmFwcGVyKCkKKyAgICAgICAgICAgIGlmIGlub3RpZnkuaW5pdCgpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbm90aWZ5CisKKyAgICBkZWYgZ2V0X2Vycm5vKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIE5vbmUgaXMgbm8gZXJybm8gY29kZSBpcyBhdmFpbGFibGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2Vycm5vKCkKKworICAgIGRlZiBzdHJfZXJybm8oc2VsZik6CisgICAgICAgIGNvZGUgPSBzZWxmLmdldF9lcnJubygpCisgICAgICAgIGlmIGNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnRXJybm86IG5vIGVycm5vIHN1cHBvcnQnCisgICAgICAgIHJldHVybiAnRXJybm89JXMgKCVzKScgJSAob3Muc3RyZXJyb3IoY29kZSksIGVycm5vLmVycm9yY29kZVtjb2RlXSkKKworICAgIGRlZiBpbm90aWZ5X2luaXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pbm90aWZ5X2luaXQoKQorCisgICAgZGVmIGlub3RpZnlfYWRkX3dhdGNoKHNlbGYsIGZkLCBwYXRobmFtZSwgbWFzayk6CisgICAgICAgICMgVW5pY29kZSBzdHJpbmdzIG11c3QgYmUgZW5jb2RlZCB0byBzdHJpbmcgcHJpb3IgdG8gY2FsbGluZyB0aGlzCisgICAgICAgICMgbWV0aG9kLgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwYXRobmFtZSwgc3RyKQorICAgICAgICByZXR1cm4gc2VsZi5faW5vdGlmeV9hZGRfd2F0Y2goZmQsIHBhdGhuYW1lLCBtYXNrKQorCisgICAgZGVmIGlub3RpZnlfcm1fd2F0Y2goc2VsZiwgZmQsIHdkKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lub3RpZnlfcm1fd2F0Y2goZmQsIHdkKQorCisKK2NsYXNzIF9JTm90aWZ5U3lzY2FsbHNXcmFwcGVyKElOb3RpZnlXcmFwcGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgU3RvcmVzIHRoZSBsYXN0IGVycm5vIHZhbHVlLgorICAgICAgICBzZWxmLl9sYXN0X2Vycm5vID0gTm9uZQorCisgICAgZGVmIGluaXQoc2VsZik6CisgICAgICAgIGFzc2VydCBpbm90aWZ5X3N5c2NhbGxzCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX2dldF9lcnJubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xhc3RfZXJybm8KKworICAgIGRlZiBfaW5vdGlmeV9pbml0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmZCA9IGlub3RpZnlfc3lzY2FsbHMuaW5vdGlmeV9pbml0KCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuX2xhc3RfZXJybm8gPSBlcnIuZXJybm8KKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICByZXR1cm4gZmQKKworICAgIGRlZiBfaW5vdGlmeV9hZGRfd2F0Y2goc2VsZiwgZmQsIHBhdGhuYW1lLCBtYXNrKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2QgPSBpbm90aWZ5X3N5c2NhbGxzLmlub3RpZnlfYWRkX3dhdGNoKGZkLCBwYXRobmFtZSwgbWFzaykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuX2xhc3RfZXJybm8gPSBlcnIuZXJybm8KKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICByZXR1cm4gd2QKKworICAgIGRlZiBfaW5vdGlmeV9ybV93YXRjaChzZWxmLCBmZCwgd2QpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXQgPSBpbm90aWZ5X3N5c2NhbGxzLmlub3RpZnlfcm1fd2F0Y2goZmQsIHdkKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5fbGFzdF9lcnJubyA9IGVyci5lcnJubworICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiByZXQKKworCitjbGFzcyBfQ3R5cGVzTGliY0lOb3RpZnlXcmFwcGVyKElOb3RpZnlXcmFwcGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xpYmMgPSBOb25lCisgICAgICAgIHNlbGYuX2dldF9lcnJub19mdW5jID0gTm9uZQorCisgICAgZGVmIGluaXQoc2VsZik6CisgICAgICAgIGFzc2VydCBjdHlwZXMKKworICAgICAgICB0cnlfbGliY19uYW1lID0gJ2MnCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJyk6CisgICAgICAgICAgICB0cnlfbGliY19uYW1lID0gJ2lub3RpZnknCisKKyAgICAgICAgbGliY19uYW1lID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaWJjX25hbWUgPSBjdHlwZXMudXRpbC5maW5kX2xpYnJhcnkodHJ5X2xpYmNfbmFtZSkKKyAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgIHBhc3MgICMgV2lsbCBhdHRlbXAgdG8gbG9hZCBpdCB3aXRoIE5vbmUgYW55d2F5LgorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDYpOgorICAgICAgICAgICAgc2VsZi5fbGliYyA9IGN0eXBlcy5DRExMKGxpYmNfbmFtZSwgdXNlX2Vycm5vPVRydWUpCisgICAgICAgICAgICBzZWxmLl9nZXRfZXJybm9fZnVuYyA9IGN0eXBlcy5nZXRfZXJybm8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2xpYmMgPSBjdHlwZXMuQ0RMTChsaWJjX25hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBzZWxmLl9saWJjLl9fZXJybm9fbG9jYXRpb24KKyAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZXN0eXBlID0gY3R5cGVzLlBPSU5URVIoY3R5cGVzLmNfaW50KQorICAgICAgICAgICAgICAgIHNlbGYuX2dldF9lcnJub19mdW5jID0gbGFtYmRhOiBsb2NhdGlvbigpLmNvbnRlbnRzLnZhbHVlCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgRXZlbnR1YWxseSBjaGVjayB0aGF0IGxpYmMgaGFzIG5lZWRlZCBpbm90aWZ5IGJpbmRpbmdzLgorICAgICAgICBpZiAobm90IGhhc2F0dHIoc2VsZi5fbGliYywgJ2lub3RpZnlfaW5pdCcpIG9yCisgICAgICAgICAgICBub3QgaGFzYXR0cihzZWxmLl9saWJjLCAnaW5vdGlmeV9hZGRfd2F0Y2gnKSBvcgorICAgICAgICAgICAgbm90IGhhc2F0dHIoc2VsZi5fbGliYywgJ2lub3RpZnlfcm1fd2F0Y2gnKSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBzZWxmLl9saWJjLmlub3RpZnlfaW5pdC5hcmd0eXBlcyA9IFtdCisgICAgICAgIHNlbGYuX2xpYmMuaW5vdGlmeV9pbml0LnJlc3R5cGUgPSBjdHlwZXMuY19pbnQKKyAgICAgICAgc2VsZi5fbGliYy5pbm90aWZ5X2FkZF93YXRjaC5hcmd0eXBlcyA9IFtjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2NoYXJfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuY191aW50MzJdCisgICAgICAgIHNlbGYuX2xpYmMuaW5vdGlmeV9hZGRfd2F0Y2gucmVzdHlwZSA9IGN0eXBlcy5jX2ludAorICAgICAgICBzZWxmLl9saWJjLmlub3RpZnlfcm1fd2F0Y2guYXJndHlwZXMgPSBbY3R5cGVzLmNfaW50LCBjdHlwZXMuY19pbnRdCisgICAgICAgIHNlbGYuX2xpYmMuaW5vdGlmeV9ybV93YXRjaC5yZXN0eXBlID0gY3R5cGVzLmNfaW50CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX2dldF9lcnJubyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZ2V0X2Vycm5vX2Z1bmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2Vycm5vX2Z1bmMoKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9pbm90aWZ5X2luaXQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLl9saWJjIGlzIG5vdCBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9saWJjLmlub3RpZnlfaW5pdCgpCisKKyAgICBkZWYgX2lub3RpZnlfYWRkX3dhdGNoKHNlbGYsIGZkLCBwYXRobmFtZSwgbWFzayk6CisgICAgICAgIGFzc2VydCBzZWxmLl9saWJjIGlzIG5vdCBOb25lCisgICAgICAgIHBhdGhuYW1lID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHBhdGhuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5fbGliYy5pbm90aWZ5X2FkZF93YXRjaChmZCwgcGF0aG5hbWUsIG1hc2spCisKKyAgICBkZWYgX2lub3RpZnlfcm1fd2F0Y2goc2VsZiwgZmQsIHdkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpYmMgaXMgbm90IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpYmMuaW5vdGlmeV9ybV93YXRjaChmZCwgd2QpCisKKyAgICBkZWYgX3N5c2N0bChzZWxmLCAqYXJncyk6CisgICAgICAgIGFzc2VydCBzZWxmLl9saWJjIGlzIG5vdCBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9saWJjLnN5c2N0bCgqYXJncykKKworCisjIExvZ2dpbmcKK2RlZiBsb2dnZXJfaW5pdCgpOgorICAgICIiIkluaXRpYWxpemUgbG9nZ2VyIGluc3RhbmNlLiIiIgorICAgIGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJweWlub3RpZnkiKQorICAgIGNvbnNvbGVfaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgY29uc29sZV9oYW5kbGVyLnNldEZvcm1hdHRlcigKKyAgICAgICAgbG9nZ2luZy5Gb3JtYXR0ZXIoIlslKGFzY3RpbWUpcyAlKG5hbWUpcyAlKGxldmVsbmFtZSlzXSAlKG1lc3NhZ2UpcyIpKQorICAgIGxvZy5hZGRIYW5kbGVyKGNvbnNvbGVfaGFuZGxlcikKKyAgICBsb2cuc2V0TGV2ZWwoMjApCisgICAgcmV0dXJuIGxvZworCitsb2cgPSBsb2dnZXJfaW5pdCgpCisKKworIyBpbm90aWZ5J3MgdmFyaWFibGVzCitjbGFzcyBTeXNDdGxJTm90aWZ5OgorICAgICIiIgorICAgIEFjY2VzcyAocmVhZCwgd3JpdGUpIGlub3RpZnkncyB2YXJpYWJsZXMgdGhyb3VnaCBzeXNjdGwuIFVzdWFsbHkgaXQKKyAgICByZXF1aXJlcyBhZG1pbmlzdHJhdG9yIHJpZ2h0cyB0byB1cGRhdGUgdGhlbS4KKworICAgIEV4YW1wbGVzOgorICAgICAgLSBSZWFkIG1heF9xdWV1ZWRfZXZlbnRzIGF0dHJpYnV0ZTogbXl2YXIgPSBtYXhfcXVldWVkX2V2ZW50cy52YWx1ZQorICAgICAgLSBVcGRhdGUgbWF4X3F1ZXVlZF9ldmVudHMgYXR0cmlidXRlOiBtYXhfcXVldWVkX2V2ZW50cy52YWx1ZSA9IDQyCisgICAgIiIiCisKKyAgICBpbm90aWZ5X2F0dHJzID0geydtYXhfdXNlcl9pbnN0YW5jZXMnOiAxLAorICAgICAgICAgICAgICAgICAgICAgJ21heF91c2VyX3dhdGNoZXMnOiAyLAorICAgICAgICAgICAgICAgICAgICAgJ21heF9xdWV1ZWRfZXZlbnRzJzogM30KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRybmFtZSwgaW5vdGlmeV93cmFwcGVyKToKKyAgICAgICAgIyBGSVhNRTogcmlnaHQgbm93IG9ubHkgc3VwcG9ydGluZyBjdHlwZXMKKyAgICAgICAgYXNzZXJ0IGN0eXBlcworICAgICAgICBzZWxmLl9hdHRybmFtZSA9IGF0dHJuYW1lCisgICAgICAgIHNlbGYuX2lub3RpZnlfd3JhcHBlciA9IGlub3RpZnlfd3JhcHBlcgorICAgICAgICBzaW5vID0gY3R5cGVzLmNfaW50ICogMworICAgICAgICBzZWxmLl9hdHRyID0gc2lubyg1LCAyMCwgU3lzQ3RsSU5vdGlmeS5pbm90aWZ5X2F0dHJzW2F0dHJuYW1lXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgY3JlYXRlKGF0dHJuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIEZhY3RvcnkgbWV0aG9kIGluc3RhbmNpYXRpbmcgYW5kIHJldHVybmluZyB0aGUgcmlnaHQgd3JhcHBlci4KKyAgICAgICAgIiIiCisgICAgICAgICMgRklYTUU6IHJpZ2h0IG5vdyBvbmx5IHN1cHBvcnRpbmcgY3R5cGVzCisgICAgICAgIGlmIGN0eXBlcyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaW5vdGlmeV93cmFwcGVyID0gX0N0eXBlc0xpYmNJTm90aWZ5V3JhcHBlcigpCisgICAgICAgIGlmIG5vdCBpbm90aWZ5X3dyYXBwZXIuaW5pdCgpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIFN5c0N0bElOb3RpZnkoYXR0cm5hbWUsIGlub3RpZnlfd3JhcHBlcikKKworICAgIGRlZiBnZXRfdmFsKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0cyBhdHRyaWJ1dGUncyB2YWx1ZS4gUmFpc2VzIE9TRXJyb3IgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuCisKKyAgICAgICAgQHJldHVybjogc3RvcmVkIHZhbHVlLgorICAgICAgICBAcnR5cGU6IGludAorICAgICAgICAiIiIKKyAgICAgICAgb2xkdiA9IGN0eXBlcy5jX2ludCgwKQorICAgICAgICBzaXplID0gY3R5cGVzLmNfaW50KGN0eXBlcy5zaXplb2Yob2xkdikpCisgICAgICAgIHN5c2N0bCA9IHNlbGYuX2lub3RpZnlfd3JhcHBlci5fc3lzY3RsCisgICAgICAgIHJlcyA9IHN5c2N0bChzZWxmLl9hdHRyLCAzLAorICAgICAgICAgICAgICAgICAgICAgY3R5cGVzLmNfdm9pZHAoY3R5cGVzLmFkZHJlc3NvZihvbGR2KSksCisgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuYWRkcmVzc29mKHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgTm9uZSwgMCkKKyAgICAgICAgaWYgcmVzID09IC0xOgorICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihzZWxmLl9pbm90aWZ5X3dyYXBwZXIuZ2V0X2Vycm5vKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lub3RpZnlfd3JhcHBlci5zdHJfZXJybm8oKSkKKyAgICAgICAgcmV0dXJuIG9sZHYudmFsdWUKKworICAgIGRlZiBzZXRfdmFsKHNlbGYsIG52YWwpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0cyBuZXcgYXR0cmlidXRlJ3MgdmFsdWUuIFJhaXNlcyBPU0Vycm9yIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLgorCisgICAgICAgIEBwYXJhbSBudmFsOiByZXBsYWNlcyBjdXJyZW50IHZhbHVlIGJ5IG52YWwuCisgICAgICAgIEB0eXBlIG52YWw6IGludAorICAgICAgICAiIiIKKyAgICAgICAgb2xkdiA9IGN0eXBlcy5jX2ludCgwKQorICAgICAgICBzaXplbyA9IGN0eXBlcy5jX2ludChjdHlwZXMuc2l6ZW9mKG9sZHYpKQorICAgICAgICBuZXd2ID0gY3R5cGVzLmNfaW50KG52YWwpCisgICAgICAgIHNpemVuID0gY3R5cGVzLmNfaW50KGN0eXBlcy5zaXplb2YobmV3dikpCisgICAgICAgIHN5c2N0bCA9IHNlbGYuX2lub3RpZnlfd3JhcHBlci5fc3lzY3RsCisgICAgICAgIHJlcyA9IHN5c2N0bChzZWxmLl9hdHRyLCAzLAorICAgICAgICAgICAgICAgICAgICAgY3R5cGVzLmNfdm9pZHAoY3R5cGVzLmFkZHJlc3NvZihvbGR2KSksCisgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuYWRkcmVzc29mKHNpemVvKSwKKyAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5jX3ZvaWRwKGN0eXBlcy5hZGRyZXNzb2YobmV3dikpLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW4pCisgICAgICAgIGlmIHJlcyA9PSAtMToKKyAgICAgICAgICAgIHJhaXNlIE9TRXJyb3Ioc2VsZi5faW5vdGlmeV93cmFwcGVyLmdldF9lcnJubygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuc3RyX2Vycm5vKCkpCisKKyAgICB2YWx1ZSA9IHByb3BlcnR5KGdldF92YWwsIHNldF92YWwpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzPSVkPicgJSAoc2VsZi5fYXR0cm5hbWUsIHNlbGYuZ2V0X3ZhbCgpKQorCisKKyMgSW5vdGlmeSdzIHZhcmlhYmxlcworIworIyBGSVhNRTogY3VycmVudGx5IHRoZXNlIHZhcmlhYmxlcyBhcmUgb25seSBhY2Nlc3NpYmxlIHdoZW4gY3R5cGVzIGlzIHVzZWQsCisjICAgICAgICBvdGhlcndpc2UgdGhlcmUgYXJlIHNldCB0byBOb25lLgorIworIyByZWFkOiBteXZhciA9IG1heF9xdWV1ZWRfZXZlbnRzLnZhbHVlCisjIHVwZGF0ZTogbWF4X3F1ZXVlZF9ldmVudHMudmFsdWUgPSA0MgorIworZm9yIGF0dHJuYW1lIGluICgnbWF4X3F1ZXVlZF9ldmVudHMnLCAnbWF4X3VzZXJfaW5zdGFuY2VzJywgJ21heF91c2VyX3dhdGNoZXMnKToKKyAgICBnbG9iYWxzKClbYXR0cm5hbWVdID0gU3lzQ3RsSU5vdGlmeS5jcmVhdGUoYXR0cm5hbWUpCisKKworY2xhc3MgRXZlbnRzQ29kZXM6CisgICAgIiIiCisgICAgU2V0IG9mIGNvZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBraW5kIG9mIGV2ZW50cy4KKyAgICBTb21lIG9mIHRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggaW5vdGlmeSwgd2hlcmVhcworICAgIHRoZSBvdGhlcnMgYXJlIHNlbnQgdG8gdXNlcnNwYWNlIGJ5IGlub3RpZnkgbm90aWZ5aW5nIHNvbWUgZXZlbnRzLgorCisgICAgQGN2YXIgSU5fQUNDRVNTOiBGaWxlIHdhcyBhY2Nlc3NlZC4KKyAgICBAdHlwZSBJTl9BQ0NFU1M6IGludAorICAgIEBjdmFyIElOX01PRElGWTogRmlsZSB3YXMgbW9kaWZpZWQuCisgICAgQHR5cGUgSU5fTU9ESUZZOiBpbnQKKyAgICBAY3ZhciBJTl9BVFRSSUI6IE1ldGFkYXRhIGNoYW5nZWQuCisgICAgQHR5cGUgSU5fQVRUUklCOiBpbnQKKyAgICBAY3ZhciBJTl9DTE9TRV9XUklURTogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZC4KKyAgICBAdHlwZSBJTl9DTE9TRV9XUklURTogaW50CisgICAgQGN2YXIgSU5fQ0xPU0VfTk9XUklURTogVW53cml0dGFibGUgZmlsZSBjbG9zZWQuCisgICAgQHR5cGUgSU5fQ0xPU0VfTk9XUklURTogaW50CisgICAgQGN2YXIgSU5fT1BFTjogRmlsZSB3YXMgb3BlbmVkLgorICAgIEB0eXBlIElOX09QRU46IGludAorICAgIEBjdmFyIElOX01PVkVEX0ZST006IEZpbGUgd2FzIG1vdmVkIGZyb20gWC4KKyAgICBAdHlwZSBJTl9NT1ZFRF9GUk9NOiBpbnQKKyAgICBAY3ZhciBJTl9NT1ZFRF9UTzogRmlsZSB3YXMgbW92ZWQgdG8gWS4KKyAgICBAdHlwZSBJTl9NT1ZFRF9UTzogaW50CisgICAgQGN2YXIgSU5fQ1JFQVRFOiBTdWJmaWxlIHdhcyBjcmVhdGVkLgorICAgIEB0eXBlIElOX0NSRUFURTogaW50CisgICAgQGN2YXIgSU5fREVMRVRFOiBTdWJmaWxlIHdhcyBkZWxldGVkLgorICAgIEB0eXBlIElOX0RFTEVURTogaW50CisgICAgQGN2YXIgSU5fREVMRVRFX1NFTEY6IFNlbGYgKHdhdGNoZWQgaXRlbSBpdHNlbGYpIHdhcyBkZWxldGVkLgorICAgIEB0eXBlIElOX0RFTEVURV9TRUxGOiBpbnQKKyAgICBAY3ZhciBJTl9NT1ZFX1NFTEY6IFNlbGYgKHdhdGNoZWQgaXRlbSBpdHNlbGYpIHdhcyBtb3ZlZC4KKyAgICBAdHlwZSBJTl9NT1ZFX1NFTEY6IGludAorICAgIEBjdmFyIElOX1VOTU9VTlQ6IEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZC4KKyAgICBAdHlwZSBJTl9VTk1PVU5UOiBpbnQKKyAgICBAY3ZhciBJTl9RX09WRVJGTE9XOiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZC4KKyAgICBAdHlwZSBJTl9RX09WRVJGTE9XOiBpbnQKKyAgICBAY3ZhciBJTl9JR05PUkVEOiBGaWxlIHdhcyBpZ25vcmVkLgorICAgIEB0eXBlIElOX0lHTk9SRUQ6IGludAorICAgIEBjdmFyIElOX09OTFlESVI6IG9ubHkgd2F0Y2ggdGhlIHBhdGggaWYgaXQgaXMgYSBkaXJlY3RvcnkgKG5ldworICAgICAgICAgICAgICAgICAgICAgIGluIGtlcm5lbCAyLjYuMTUpLgorICAgIEB0eXBlIElOX09OTFlESVI6IGludAorICAgIEBjdmFyIElOX0RPTlRfRk9MTE9XOiBkb24ndCBmb2xsb3cgYSBzeW1saW5rIChuZXcgaW4ga2VybmVsIDIuNi4xNSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgIElOX09OTFlESVIgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHdhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YXJnZXQgb2Ygc3ltbGlua3MuCisgICAgQHR5cGUgSU5fRE9OVF9GT0xMT1c6IGludAorICAgIEBjdmFyIElOX0VYQ0xfVU5MSU5LOiBFdmVudHMgYXJlIG5vdCBnZW5lcmF0ZWQgZm9yIGNoaWxkcmVuIGFmdGVyIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIHVubGlua2VkIGZyb20gdGhlIHdhdGNoZWQgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IGluIGtlcm5lbCAyLjYuMzYpLgorICAgIEB0eXBlIElOX0VYQ0xfVU5MSU5LOiBpbnQKKyAgICBAY3ZhciBJTl9NQVNLX0FERDogYWRkIHRvIHRoZSBtYXNrIG9mIGFuIGFscmVhZHkgZXhpc3Rpbmcgd2F0Y2ggKG5ldworICAgICAgICAgICAgICAgICAgICAgICBpbiBrZXJuZWwgMi42LjE0KS4KKyAgICBAdHlwZSBJTl9NQVNLX0FERDogaW50CisgICAgQGN2YXIgSU5fSVNESVI6IEV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyLgorICAgIEB0eXBlIElOX0lTRElSOiBpbnQKKyAgICBAY3ZhciBJTl9PTkVTSE9UOiBPbmx5IHNlbmQgZXZlbnQgb25jZS4KKyAgICBAdHlwZSBJTl9PTkVTSE9UOiBpbnQKKyAgICBAY3ZhciBBTExfRVZFTlRTOiBBbGlhcyBmb3IgY29uc2lkZXJpbmcgYWxsIG9mIHRoZSBldmVudHMuCisgICAgQHR5cGUgQUxMX0VWRU5UUzogaW50CisgICAgIiIiCisKKyAgICAjIFRoZSBpZGVhIGhlcmUgaXMgJ2NvbmZpZ3VyYXRpb24tYXMtY29kZScgLSB0aGlzIHdheSwgd2UgZ2V0IG91ciBuaWNlIGNsYXNzCisgICAgIyBjb25zdGFudHMsIGJ1dCB3ZSBhbHNvIGdldCBuaWNlIGh1bWFuLWZyaWVuZGx5IHRleHQgbWFwcGluZ3MgdG8gZG8gbG9va3VwcworICAgICMgYWdhaW5zdCBhcyB3ZWxsLCBmb3IgZnJlZToKKyAgICBGTEFHX0NPTExFQ1RJT05TID0geydPUF9GTEFHUyc6IHsKKyAgICAgICAgJ0lOX0FDQ0VTUycgICAgICAgIDogMHgwMDAwMDAwMSwgICMgRmlsZSB3YXMgYWNjZXNzZWQKKyAgICAgICAgJ0lOX01PRElGWScgICAgICAgIDogMHgwMDAwMDAwMiwgICMgRmlsZSB3YXMgbW9kaWZpZWQKKyAgICAgICAgJ0lOX0FUVFJJQicgICAgICAgIDogMHgwMDAwMDAwNCwgICMgTWV0YWRhdGEgY2hhbmdlZAorICAgICAgICAnSU5fQ0xPU0VfV1JJVEUnICAgOiAweDAwMDAwMDA4LCAgIyBXcml0YWJsZSBmaWxlIHdhcyBjbG9zZWQKKyAgICAgICAgJ0lOX0NMT1NFX05PV1JJVEUnIDogMHgwMDAwMDAxMCwgICMgVW53cml0YWJsZSBmaWxlIGNsb3NlZAorICAgICAgICAnSU5fT1BFTicgICAgICAgICAgOiAweDAwMDAwMDIwLCAgIyBGaWxlIHdhcyBvcGVuZWQKKyAgICAgICAgJ0lOX01PVkVEX0ZST00nICAgIDogMHgwMDAwMDA0MCwgICMgRmlsZSB3YXMgbW92ZWQgZnJvbSBYCisgICAgICAgICdJTl9NT1ZFRF9UTycgICAgICA6IDB4MDAwMDAwODAsICAjIEZpbGUgd2FzIG1vdmVkIHRvIFkKKyAgICAgICAgJ0lOX0NSRUFURScgICAgICAgIDogMHgwMDAwMDEwMCwgICMgU3ViZmlsZSB3YXMgY3JlYXRlZAorICAgICAgICAnSU5fREVMRVRFJyAgICAgICAgOiAweDAwMDAwMjAwLCAgIyBTdWJmaWxlIHdhcyBkZWxldGVkCisgICAgICAgICdJTl9ERUxFVEVfU0VMRicgICA6IDB4MDAwMDA0MDAsICAjIFNlbGYgKHdhdGNoZWQgaXRlbSBpdHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdhcyBkZWxldGVkCisgICAgICAgICdJTl9NT1ZFX1NFTEYnICAgICA6IDB4MDAwMDA4MDAsICAjIFNlbGYgKHdhdGNoZWQgaXRlbSBpdHNlbGYpIHdhcyBtb3ZlZAorICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgJ0VWRU5UX0ZMQUdTJzogeworICAgICAgICAnSU5fVU5NT1VOVCcgICAgICAgOiAweDAwMDAyMDAwLCAgIyBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQKKyAgICAgICAgJ0lOX1FfT1ZFUkZMT1cnICAgIDogMHgwMDAwNDAwMCwgICMgRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQKKyAgICAgICAgJ0lOX0lHTk9SRUQnICAgICAgIDogMHgwMDAwODAwMCwgICMgRmlsZSB3YXMgaWdub3JlZAorICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgJ1NQRUNJQUxfRkxBR1MnOiB7CisgICAgICAgICdJTl9PTkxZRElSJyAgICAgICA6IDB4MDEwMDAwMDAsICAjIG9ubHkgd2F0Y2ggdGhlIHBhdGggaWYgaXQgaXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKKyAgICAgICAgJ0lOX0RPTlRfRk9MTE9XJyAgIDogMHgwMjAwMDAwMCwgICMgZG9uJ3QgZm9sbG93IGEgc3ltbGluaworICAgICAgICAnSU5fRVhDTF9VTkxJTksnICAgOiAweDA0MDAwMDAwLCAgIyBleGNsdWRlIGV2ZW50cyBvbiB1bmxpbmtlZCBvYmplY3RzCisgICAgICAgICdJTl9NQVNLX0FERCcgICAgICA6IDB4MjAwMDAwMDAsICAjIGFkZCB0byB0aGUgbWFzayBvZiBhbiBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIHdhdGNoCisgICAgICAgICdJTl9JU0RJUicgICAgICAgICA6IDB4NDAwMDAwMDAsICAjIGV2ZW50IG9jY3VycmVkIGFnYWluc3QgZGlyCisgICAgICAgICdJTl9PTkVTSE9UJyAgICAgICA6IDB4ODAwMDAwMDAsICAjIG9ubHkgc2VuZCBldmVudCBvbmNlCisgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICBkZWYgbWFza25hbWUobWFzayk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIHRoZSBldmVudCBuYW1lIGFzc29jaWF0ZWQgdG8gbWFzay4gSU5fSVNESVIgaXMgYXBwZW5kZWQgdG8KKyAgICAgICAgdGhlIHJlc3VsdCB3aGVuIGFwcHJvcHJpYXRlLiBOb3RlOiBvbmx5IG9uZSBldmVudCBpcyByZXR1cm5lZCwgYmVjYXVzZQorICAgICAgICBvbmx5IG9uZSBldmVudCBjYW4gYmUgcmFpc2VkIGF0IGEgZ2l2ZW4gdGltZS4KKworICAgICAgICBAcGFyYW0gbWFzazogbWFzay4KKyAgICAgICAgQHR5cGUgbWFzazogaW50CisgICAgICAgIEByZXR1cm46IGV2ZW50IG5hbWUuCisgICAgICAgIEBydHlwZTogc3RyCisgICAgICAgICIiIgorICAgICAgICBtcyA9IG1hc2sKKyAgICAgICAgbmFtZSA9ICclcycKKyAgICAgICAgaWYgbWFzayAmIElOX0lTRElSOgorICAgICAgICAgICAgbXMgPSBtYXNrIC0gSU5fSVNESVIKKyAgICAgICAgICAgIG5hbWUgPSAnJXN8SU5fSVNESVInCisgICAgICAgIHJldHVybiBuYW1lICUgRXZlbnRzQ29kZXMuQUxMX1ZBTFVFU1ttc10KKworICAgIG1hc2tuYW1lID0gc3RhdGljbWV0aG9kKG1hc2tuYW1lKQorCisKKyMgU28gbGV0J3Mgbm93IHR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gaW50byBjb2RlCitFdmVudHNDb2Rlcy5BTExfRkxBR1MgPSB7fQorRXZlbnRzQ29kZXMuQUxMX1ZBTFVFUyA9IHt9Citmb3IgZmxhZ2MsIHZhbGMgaW4gRXZlbnRzQ29kZXMuRkxBR19DT0xMRUNUSU9OUy5pdGVtcygpOgorICAgICMgTWFrZSB0aGUgY29sbGVjdGlvbnMnIG1lbWJlcnMgZGlyZWN0bHkgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZQorICAgICMgY2xhc3MgZGljdGlvbmFyeQorICAgIHNldGF0dHIoRXZlbnRzQ29kZXMsIGZsYWdjLCB2YWxjKQorCisgICAgIyBDb2xsZWN0IGFsbCB0aGUgZmxhZ3MgdW5kZXIgYSBjb21tb24gdW1icmVsbGEKKyAgICBFdmVudHNDb2Rlcy5BTExfRkxBR1MudXBkYXRlKHZhbGMpCisKKyAgICAjIE1ha2UgdGhlIGluZGl2aWR1YWwgbWFza3MgYWNjZXNzaWJsZSBhcyAnY29uc3RhbnRzJyBhdCBnbG9iYWxzKCkgc2NvcGUKKyAgICAjIGFuZCBtYXNrbmFtZXMgYWNjZXNzaWJsZSBieSB2YWx1ZXMuCisgICAgZm9yIG5hbWUsIHZhbCBpbiB2YWxjLml0ZW1zKCk6CisgICAgICAgIGdsb2JhbHMoKVtuYW1lXSA9IHZhbAorICAgICAgICBFdmVudHNDb2Rlcy5BTExfVkFMVUVTW3ZhbF0gPSBuYW1lCisKKworIyBhbGwgJ25vcm1hbCcgZXZlbnRzCitBTExfRVZFTlRTID0gcmVkdWNlKGxhbWJkYSB4LCB5OiB4IHwgeSwgRXZlbnRzQ29kZXMuT1BfRkxBR1MudmFsdWVzKCkpCitFdmVudHNDb2Rlcy5BTExfRkxBR1NbJ0FMTF9FVkVOVFMnXSA9IEFMTF9FVkVOVFMKK0V2ZW50c0NvZGVzLkFMTF9WQUxVRVNbQUxMX0VWRU5UU10gPSAnQUxMX0VWRU5UUycKKworCitjbGFzcyBfRXZlbnQ6CisgICAgIiIiCisgICAgRXZlbnQgc3RydWN0dXJlLCByZXByZXNlbnQgZXZlbnRzIHJhaXNlZCBieSB0aGUgc3lzdGVtLiBUaGlzCisgICAgaXMgdGhlIGJhc2UgY2xhc3MgYW5kIHNob3VsZCBiZSBzdWJjbGFzc2VkLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3RfKToKKyAgICAgICAgIiIiCisgICAgICAgIEF0dGFjaCBhdHRyaWJ1dGVzIChjb250YWluZWQgaW4gZGljdF8pIHRvIHNlbGYuCisKKyAgICAgICAgQHBhcmFtIGRpY3RfOiBTZXQgb2YgYXR0cmlidXRlcy4KKyAgICAgICAgQHR5cGUgZGljdF86IGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIGZvciB0cGwgaW4gZGljdF8uaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgKnRwbCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEByZXR1cm46IEdlbmVyaWMgZXZlbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAgICBAcnR5cGU6IHN0cgorICAgICAgICAiIiIKKyAgICAgICAgcyA9ICcnCisgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiBzb3J0ZWQoc2VsZi5fX2RpY3RfXy5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMF0pOgorICAgICAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGF0dHIgPT0gJ21hc2snOgorICAgICAgICAgICAgICAgIHZhbHVlID0gaGV4KGdldGF0dHIoc2VsZiwgYXR0cikpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpIGFuZCBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAiJyciCisgICAgICAgICAgICBzICs9ICcgJXMlcyVzJyAlIChvdXRwdXRfZm9ybWF0LmZpZWxkX25hbWUoYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LnB1bmN0dWF0aW9uKCc9JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LmZpZWxkX3ZhbHVlKHZhbHVlKSkKKworICAgICAgICBzID0gJyVzJXMlcyAlcycgJSAob3V0cHV0X2Zvcm1hdC5wdW5jdHVhdGlvbignPCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5jbGFzc19uYW1lKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LnB1bmN0dWF0aW9uKCc+JykpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlcHIoc2VsZikKKworCitjbGFzcyBfUmF3RXZlbnQoX0V2ZW50KToKKyAgICAiIiIKKyAgICBSYXcgZXZlbnQsIGl0IGNvbnRhaW5zIG9ubHkgdGhlIGluZm9ybWF0aW9ucyBwcm92aWRlZCBieSB0aGUgc3lzdGVtLgorICAgIEl0IGRvZXNuJ3QgaW5mZXIgYW55dGhpbmcuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdkLCBtYXNrLCBjb29raWUsIG5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIHdkOiBXYXRjaCBEZXNjcmlwdG9yLgorICAgICAgICBAdHlwZSB3ZDogaW50CisgICAgICAgIEBwYXJhbSBtYXNrOiBCaXRtYXNrIG9mIGV2ZW50cy4KKyAgICAgICAgQHR5cGUgbWFzazogaW50CisgICAgICAgIEBwYXJhbSBjb29raWU6IENvb2tpZS4KKyAgICAgICAgQHR5cGUgY29va2llOiBpbnQKKyAgICAgICAgQHBhcmFtIG5hbWU6IEJhc2VuYW1lIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXZlbnQgd2FzIHJhaXNlZCBpbiBjYXNlIHdoZXJlIHRoZSB3YXRjaGVkIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHBhcmVudCBkaXJlY3RvcnkuIE5vbmUgaWYgdGhlIGV2ZW50IHdhcyByYWlzZWQKKyAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSB3YXRjaGVkIGl0ZW0gaXRzZWxmLgorICAgICAgICBAdHlwZSBuYW1lOiBzdHJpbmcgb3IgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgIyBVc2UgdGhpcyB2YXJpYWJsZSB0byBjYWNoZSB0aGUgcmVzdWx0IG9mIHN0cihzZWxmKSwgdGhpcyBvYmplY3QKKyAgICAgICAgIyBpcyBpbW11dGFibGUuCisgICAgICAgIHNlbGYuX3N0ciA9IE5vbmUKKyAgICAgICAgIyBuYW1lOiByZW1vdmUgdHJhaWxpbmcgJ1wwJworICAgICAgICBkID0geyd3ZCc6IHdkLAorICAgICAgICAgICAgICdtYXNrJzogbWFzaywKKyAgICAgICAgICAgICAnY29va2llJzogY29va2llLAorICAgICAgICAgICAgICduYW1lJzogbmFtZS5yc3RyaXAoJ1wwJyl9CisgICAgICAgIF9FdmVudC5fX2luaXRfXyhzZWxmLCBkKQorICAgICAgICBsb2cuZGVidWcoc3RyKHNlbGYpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3N0ciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fc3RyID0gX0V2ZW50Ll9fc3RyX18oc2VsZikKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N0cgorCisKK2NsYXNzIEV2ZW50KF9FdmVudCk6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBjb250YWlucyBhbGwgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG9ic2VydmVkCisgICAgZXZlbnQuIEhvd2V2ZXIsIHRoZSBwcmVzZW5jZSBvZiBlYWNoIGZpZWxkIGlzIG5vdCBndWFyYW50ZWVkIGFuZAorICAgIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgZXZlbnQuIEluIGVmZmVjdCwgc29tZSBmaWVsZHMgYXJlIGlycmVsZXZhbnQKKyAgICBmb3Igc29tZSBraW5kIG9mIGV2ZW50IChmb3IgZXhhbXBsZSAnY29va2llJyBpcyBtZWFuaW5nbGVzcyBmb3IKKyAgICBJTl9DUkVBVEUgd2hlcmVhcyBpdCBpcyBtYW5kYXRvcnkgZm9yIElOX01PVkVfVE8pLgorCisgICAgVGhlIHBvc3NpYmxlIGZpZWxkcyBhcmU6CisgICAgICAtIHdkIChpbnQpOiBXYXRjaCBEZXNjcmlwdG9yLgorICAgICAgLSBtYXNrIChpbnQpOiBNYXNrLgorICAgICAgLSBtYXNrbmFtZSAoc3RyKTogUmVhZGFibGUgZXZlbnQgbmFtZS4KKyAgICAgIC0gcGF0aCAoc3RyKTogcGF0aCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYmVpbmcgd2F0Y2hlZC4KKyAgICAgIC0gbmFtZSAoc3RyKTogQmFzZW5hbWUgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGFnYWluc3Qgd2hpY2ggdGhlCisgICAgICAgICAgICAgIGV2ZW50IHdhcyByYWlzZWQgaW4gY2FzZSB3aGVyZSB0aGUgd2F0Y2hlZCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgaXMgdGhlIHBhcmVudCBkaXJlY3RvcnkuIE5vbmUgaWYgdGhlIGV2ZW50IHdhcyByYWlzZWQKKyAgICAgICAgICAgICAgb24gdGhlIHdhdGNoZWQgaXRlbSBpdHNlbGYuIFRoaXMgZmllbGQgaXMgYWx3YXlzIHByb3ZpZGVkCisgICAgICAgICAgICAgIGV2ZW4gaWYgdGhlIHN0cmluZyBpcyAnJy4KKyAgICAgIC0gcGF0aG5hbWUgKHN0cik6IENvbmNhdGVuYXRpb24gb2YgJ3BhdGgnIGFuZCAnbmFtZScuCisgICAgICAtIHNyY19wYXRobmFtZSAoc3RyKTogT25seSBwcmVzZW50IGZvciBJTl9NT1ZFRF9UTyBldmVudHMgYW5kIG9ubHkgaW4KKyAgICAgICAgICAgICAgdGhlIGNhc2Ugd2hlcmUgSU5fTU9WRURfRlJPTSBldmVudHMgYXJlIHdhdGNoZWQgdG9vLiBIb2xkcyB0aGUKKyAgICAgICAgICAgICAgc291cmNlIHBhdGhuYW1lIGZyb20gd2hlcmUgcGF0aG5hbWUgd2FzIG1vdmVkIGZyb20uCisgICAgICAtIGNvb2tpZSAoaW50KTogQ29va2llLgorICAgICAgLSBkaXIgKGJvb2wpOiBUcnVlIGlmIHRoZSBldmVudCB3YXMgcmFpc2VkIGFnYWluc3QgYSBkaXJlY3RvcnkuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmF3KToKKyAgICAgICAgIiIiCisgICAgICAgIENvbmNyZXRlbHksIHRoaXMgaXMgdGhlIHJhdyBldmVudCBwbHVzIGluZmVycmVkIGluZm9zLgorICAgICAgICAiIiIKKyAgICAgICAgX0V2ZW50Ll9faW5pdF9fKHNlbGYsIHJhdykKKyAgICAgICAgc2VsZi5tYXNrbmFtZSA9IEV2ZW50c0NvZGVzLm1hc2tuYW1lKHNlbGYubWFzaykKKyAgICAgICAgaWYgQ09NUEFUSUJJTElUWV9NT0RFOgorICAgICAgICAgICAgc2VsZi5ldmVudF9uYW1lID0gc2VsZi5tYXNrbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLm5hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRobmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGF0aG5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5wYXRoKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGVycjoKKyAgICAgICAgICAgICMgVXN1YWxseSBpdCBpcyBub3QgYW4gZXJyb3Igc29tZSBldmVudHMgYXJlIHBlcmZlY3RseSB2YWxpZHMKKyAgICAgICAgICAgICMgZGVzcGl0ZSB0aGUgbGFjayBvZiB0aGVzZSBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgbG9nLmRlYnVnKGVycikKKworCitjbGFzcyBQcm9jZXNzRXZlbnRFcnJvcihQeWlub3RpZnlFcnJvcik6CisgICAgIiIiCisgICAgUHJvY2Vzc0V2ZW50RXJyb3IgRXhjZXB0aW9uLiBSYWlzZWQgb24gUHJvY2Vzc0V2ZW50IGVycm9yLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnIpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIGVycjogRXhjZXB0aW9uIGVycm9yIGRlc2NyaXB0aW9uLgorICAgICAgICBAdHlwZSBlcnI6IHN0cmluZworICAgICAgICAiIiIKKyAgICAgICAgUHlpbm90aWZ5RXJyb3IuX19pbml0X18oc2VsZiwgZXJyKQorCisKK2NsYXNzIF9Qcm9jZXNzRXZlbnQ6CisgICAgIiIiCisgICAgQWJzdHJhY3QgcHJvY2Vzc2luZyBldmVudCBjbGFzcy4KKyAgICAiIiIKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgVG8gYmVoYXZlIGxpa2UgYSBmdW5jdG9yIHRoZSBvYmplY3QgbXVzdCBiZSBjYWxsYWJsZS4KKyAgICAgICAgVGhpcyBtZXRob2QgaXMgYSBkaXNwYXRjaCBtZXRob2QuIEl0cyBsb29rdXAgb3JkZXIgaXM6CisgICAgICAgICAgMS4gcHJvY2Vzc19NQVNLTkFNRSBtZXRob2QKKyAgICAgICAgICAyLiBwcm9jZXNzX0ZBTUlMWV9OQU1FIG1ldGhvZAorICAgICAgICAgIDMuIG90aGVyd2lzZSBjYWxscyBwcm9jZXNzX2RlZmF1bHQKKworICAgICAgICBAcGFyYW0gZXZlbnQ6IEV2ZW50IHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgQHR5cGUgZXZlbnQ6IEV2ZW50IG9iamVjdAorICAgICAgICBAcmV0dXJuOiBCeSBjb252ZW50aW9uIHdoZW4gdXNlZCBmcm9tIHRoZSBQcm9jZXNzRXZlbnQgY2xhc3M6CisgICAgICAgICAgICAgICAgIC0gUmV0dXJuaW5nIEZhbHNlIG9yIE5vbmUgKGRlZmF1bHQgdmFsdWUpIG1lYW5zIGtlZXAgb24KKyAgICAgICAgICAgICAgICAgZXhlY3V0aW5nIG5leHQgY2hhaW5lZCBmdW5jdG9ycyAoc2VlIGNoYWluLnB5IGV4YW1wbGUpLgorICAgICAgICAgICAgICAgICAtIFJldHVybmluZyBUcnVlIGluc3RlYWQgbWVhbnMgZG8gbm90IGV4ZWN1dGUgbmV4dAorICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgorICAgICAgICBAcnR5cGU6IGJvb2wKKyAgICAgICAgQHJhaXNlIFByb2Nlc3NFdmVudEVycm9yOiBFdmVudCBvYmplY3QgdW5kaXNwYXRjaGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBldmVudC4KKyAgICAgICAgIiIiCisgICAgICAgIHN0cmlwcGVkX21hc2sgPSBldmVudC5tYXNrIC0gKGV2ZW50Lm1hc2sgJiBJTl9JU0RJUikKKyAgICAgICAgbWFza25hbWUgPSBFdmVudHNDb2Rlcy5BTExfVkFMVUVTLmdldChzdHJpcHBlZF9tYXNrKQorICAgICAgICBpZiBtYXNrbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgUHJvY2Vzc0V2ZW50RXJyb3IoIlVua25vd24gbWFzayAweCUwOHgiICUgc3RyaXBwZWRfbWFzaykKKworICAgICAgICAjIDEtIGxvb2sgZm9yIHByb2Nlc3NfTUFTS05BTUUKKyAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgJ3Byb2Nlc3NfJyArIG1hc2tuYW1lLCBOb25lKQorICAgICAgICBpZiBtZXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG1ldGgoZXZlbnQpCisgICAgICAgICMgMi0gbG9vayBmb3IgcHJvY2Vzc19GQU1JTFlfTkFNRQorICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAncHJvY2Vzc19JTl8nICsgbWFza25hbWUuc3BsaXQoJ18nKVsxXSwgTm9uZSkKKyAgICAgICAgaWYgbWV0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBtZXRoKGV2ZW50KQorICAgICAgICAjIDMtIGRlZmF1bHQgY2FsbCBtZXRob2QgcHJvY2Vzc19kZWZhdWx0CisgICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3NfZGVmYXVsdChldmVudCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXM+JyAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKworY2xhc3MgX1N5c1Byb2Nlc3NFdmVudChfUHJvY2Vzc0V2ZW50KToKKyAgICAiIiIKKyAgICBUaGVyZSBpcyB0aHJlZSBraW5kIG9mIHByb2Nlc3NpbmcgYWNjb3JkaW5nIHRvIGVhY2ggZXZlbnQ6CisKKyAgICAgIDEuIHNwZWNpYWwgaGFuZGxpbmcgKGRlbGV0aW9uIGZyb20gaW50ZXJuYWwgY29udGFpbmVyLCBidWcsIC4uLikuCisgICAgICAyLiBkZWZhdWx0IHRyZWF0bWVudDogd2hpY2ggaXMgYXBwbGllZCB0byB0aGUgbWFqb3JpdHkgb2YgZXZlbnRzLgorICAgICAgMy4gSU5fSVNESVIgaXMgbmV2ZXIgc2VudCBhbG9uZSwgaGUgaXMgcGlnZ3liYWNrZWQgd2l0aCBhIHN0YW5kYXJkCisgICAgICAgICBldmVudCwgaGUgaXMgbm90IHByb2Nlc3NlZCBhcyB0aGUgb3RoZXJzIGV2ZW50cywgaW5zdGVhZCwgaXRzCisgICAgICAgICB2YWx1ZSBpcyBjYXB0dXJlZCBhbmQgYXBwcm9wcmlhdGVseSBhZ2dyZWdhdGVkIHRvIGRzdCBldmVudC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd20sIG5vdGlmaWVyKToKKyAgICAgICAgIiIiCisKKyAgICAgICAgQHBhcmFtIHdtOiBXYXRjaCBNYW5hZ2VyLgorICAgICAgICBAdHlwZSB3bTogV2F0Y2hNYW5hZ2VyIGluc3RhbmNlCisgICAgICAgIEBwYXJhbSBub3RpZmllcjogTm90aWZpZXIuCisgICAgICAgIEB0eXBlIG5vdGlmaWVyOiBOb3RpZmllciBpbnN0YW5jZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fd2F0Y2hfbWFuYWdlciA9IHdtICAjIHdhdGNoIG1hbmFnZXIKKyAgICAgICAgc2VsZi5fbm90aWZpZXIgPSBub3RpZmllciAgIyBub3RpZmllcgorICAgICAgICBzZWxmLl9tdl9jb29raWUgPSB7fSAgIyB7Y29va2llKGludCk6IChzcmNfcGF0aChzdHIpLCBkYXRlKSwgLi4ufQorICAgICAgICBzZWxmLl9tdiA9IHt9ICAjIHtzcmNfcGF0aChzdHIpOiAoZHN0X3BhdGgoc3RyKSwgZGF0ZSksIC4uLn0KKworICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2xlYW51cCAoZGVsZXRlKSBvbGQgKD4xbW4pIHJlY29yZHMgY29udGFpbmVkIGluIHNlbGYuX212X2Nvb2tpZQorICAgICAgICBhbmQgc2VsZi5fbXYuCisgICAgICAgICIiIgorICAgICAgICBkYXRlX2N1cl8gPSBkYXRldGltZS5ub3coKQorICAgICAgICBmb3Igc2VxIGluIFtzZWxmLl9tdl9jb29raWUsIHNlbGYuX212XToKKyAgICAgICAgICAgIGZvciBrIGluIHNlcS5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgKGRhdGVfY3VyXyAtIHNlcVtrXVsxXSkgPiB0aW1lZGVsdGEobWludXRlcz0xKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCdDbGVhbnVwOiBkZWxldGluZyBlbnRyeSAlcycsIHNlcVtrXVswXSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlcVtrXQorCisgICAgZGVmIHByb2Nlc3NfSU5fQ1JFQVRFKHNlbGYsIHJhd19ldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBJZiB0aGUgZXZlbnQgYWZmZWN0cyBhIGRpcmVjdG9yeSBhbmQgdGhlIGF1dG9fYWRkIGZsYWcgb2YgdGhlCisgICAgICAgIHRhcmdldHRlZCB3YXRjaCBpcyBzZXQgdG8gVHJ1ZSwgYSBuZXcgd2F0Y2ggaXMgYWRkZWQgb24gdGhpcworICAgICAgICBuZXcgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIGF0dHJpYnV0ZSB2YWx1ZXMgdGhhbiB0aG9zZSBvZgorICAgICAgICB0aGlzIHdhdGNoLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcmF3X2V2ZW50Lm1hc2sgJiBJTl9JU0RJUjoKKyAgICAgICAgICAgIHdhdGNoXyA9IHNlbGYuX3dhdGNoX21hbmFnZXIuZ2V0X3dhdGNoKHJhd19ldmVudC53ZCkKKyAgICAgICAgICAgIGNyZWF0ZWRfZGlyID0gb3MucGF0aC5qb2luKHdhdGNoXy5wYXRoLCByYXdfZXZlbnQubmFtZSkKKyAgICAgICAgICAgIGlmIHdhdGNoXy5hdXRvX2FkZCBhbmQgbm90IHdhdGNoXy5leGNsdWRlX2ZpbHRlcihjcmVhdGVkX2Rpcik6CisgICAgICAgICAgICAgICAgYWRkdyA9IHNlbGYuX3dhdGNoX21hbmFnZXIuYWRkX3dhdGNoCisgICAgICAgICAgICAgICAgIyBUaGUgbmV3bHkgbW9uaXRvcmVkIGRpcmVjdG9yeSBpbmhlcml0cyBhdHRyaWJ1dGVzIGZyb20gaXRzCisgICAgICAgICAgICAgICAgIyBwYXJlbnQgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIGFkZHdfcmV0ID0gYWRkdyhjcmVhdGVkX2Rpciwgd2F0Y2hfLm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfZnVuPXdhdGNoXy5wcm9jX2Z1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjPUZhbHNlLCBhdXRvX2FkZD13YXRjaF8uYXV0b19hZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVfZmlsdGVyPXdhdGNoXy5leGNsdWRlX2ZpbHRlcikKKworICAgICAgICAgICAgICAgICMgVHJpY2sgdG8gaGFuZGxlIG1rZGlyIC1wIC9kMS9kMi90MyB3aGVyZSBkMSBpcyB3YXRjaGVkIGFuZAorICAgICAgICAgICAgICAgICMgZDIgYW5kIHQzIChkaXJlY3Rvcnkgb3IgZmlsZSkgYXJlIGNyZWF0ZWQuCisgICAgICAgICAgICAgICAgIyBTaW5jZSB0aGUgZGlyZWN0b3J5IGQyIGlzIG5ldywgdGhlbiBldmVyeXRoaW5nIGluc2lkZSBpdCBtdXN0CisgICAgICAgICAgICAgICAgIyBhbHNvIGJlIG5ldy4KKyAgICAgICAgICAgICAgICBjcmVhdGVkX2Rpcl93ZCA9IGFkZHdfcmV0LmdldChjcmVhdGVkX2RpcikKKyAgICAgICAgICAgICAgICBpZiAoKGNyZWF0ZWRfZGlyX3dkIGlzIG5vdCBOb25lKSBhbmQgKGNyZWF0ZWRfZGlyX3dkID4gMCkgYW5kCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNkaXIoY3JlYXRlZF9kaXIpKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihjcmVhdGVkX2Rpcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXIgPSBvcy5wYXRoLmpvaW4oY3JlYXRlZF9kaXIsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2QoaW5uZXIpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgKHNpbXVsYXRlKSBjcmVhdGlvbiBldmVudHMgZm9yIHN1Yi0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpbm5lcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3ltbGlua3MgYXJlIGhhbmRsZWQgYXMgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gSU5fQ1JFQVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGlubmVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBJTl9DUkVBVEUgfCBJTl9JU0RJUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBwYXRoIHNob3VsZCBub3QgYmUgdGFrZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZXZlbnQgPSBfUmF3RXZlbnQoY3JlYXRlZF9kaXJfd2QsIGZsYWdzLCAwLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGlmaWVyLmFwcGVuZF9ldmVudChyYXdldmVudCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJwcm9jZXNzX0lOX0NSRUFURSwgaW52YWxpZCBkaXJlY3RvcnkgJXM6ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZyAlIChjcmVhdGVkX2Rpciwgc3RyKGVycikpKQorICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzX2RlZmF1bHQocmF3X2V2ZW50KQorCisgICAgZGVmIHByb2Nlc3NfSU5fTU9WRURfRlJPTShzZWxmLCByYXdfZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFwIHRoZSBjb29raWUgd2l0aCB0aGUgc291cmNlIHBhdGggKCsgZGF0ZSBmb3IgY2xlYW5pbmcpLgorICAgICAgICAiIiIKKyAgICAgICAgd2F0Y2hfID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICBwYXRoXyA9IHdhdGNoXy5wYXRoCisgICAgICAgIHNyY19wYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4ocGF0aF8sIHJhd19ldmVudC5uYW1lKSkKKyAgICAgICAgc2VsZi5fbXZfY29va2llW3Jhd19ldmVudC5jb29raWVdID0gKHNyY19wYXRoLCBkYXRldGltZS5ub3coKSkKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19kZWZhdWx0KHJhd19ldmVudCwgeydjb29raWUnOiByYXdfZXZlbnQuY29va2llfSkKKworICAgIGRlZiBwcm9jZXNzX0lOX01PVkVEX1RPKHNlbGYsIHJhd19ldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBNYXAgdGhlIHNvdXJjZSBwYXRoIHdpdGggdGhlIGRlc3RpbmF0aW9uIHBhdGggKCsgZGF0ZSBmb3IKKyAgICAgICAgY2xlYW5pbmcpLgorICAgICAgICAiIiIKKyAgICAgICAgd2F0Y2hfID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICBwYXRoXyA9IHdhdGNoXy5wYXRoCisgICAgICAgIGRzdF9wYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4ocGF0aF8sIHJhd19ldmVudC5uYW1lKSkKKyAgICAgICAgbXZfID0gc2VsZi5fbXZfY29va2llLmdldChyYXdfZXZlbnQuY29va2llKQorICAgICAgICB0b19hcHBlbmQgPSB7J2Nvb2tpZSc6IHJhd19ldmVudC5jb29raWV9CisgICAgICAgIGlmIG12XyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX212W212X1swXV0gPSAoZHN0X3BhdGgsIGRhdGV0aW1lLm5vdygpKQorICAgICAgICAgICAgIyBMZXQncyBhc3N1bWUgdGhhdCBJTl9NT1ZFRF9GUk9NIGV2ZW50IGlzIGFsd2F5cyBxdWV1ZWQgYmVmb3JlCisgICAgICAgICAgICAjIHRoYXQgaXRzIGFzc29jaWF0ZWQgKHRoZXkgc2hhcmUgYSBjb21tb24gY29va2llKSBJTl9NT1ZFRF9UTworICAgICAgICAgICAgIyBldmVudCBpcyBxdWV1ZWQgaXRzZWxmLiBJdCBpcyB0aGVuIHBvc3NpYmxlIGluIHRoYXQgc2NlbmFyaW8KKyAgICAgICAgICAgICMgdG8gcHJvdmlkZSBhcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBJTl9NT1ZFRF9UTyBldmVudAorICAgICAgICAgICAgIyB0aGUgb3JpZ2luYWwgcGF0aG5hbWUgb2YgdGhlIG1vdmVkIGZpbGUvZGlyZWN0b3J5LgorICAgICAgICAgICAgdG9fYXBwZW5kWydzcmNfcGF0aG5hbWUnXSA9IG12X1swXQorICAgICAgICBlbGlmIChyYXdfZXZlbnQubWFzayAmIElOX0lTRElSIGFuZCB3YXRjaF8uYXV0b19hZGQgYW5kCisgICAgICAgICAgICAgIG5vdCB3YXRjaF8uZXhjbHVkZV9maWx0ZXIoZHN0X3BhdGgpKToKKyAgICAgICAgICAgICMgV2UgZ290IGEgZGlyZXRvcnkgdGhhdCdzICJtb3ZlZCBpbiIgZnJvbSBhbiB1bmtub3duIHNvdXJjZSBhbmQKKyAgICAgICAgICAgICMgYXV0b19hZGQgaXMgZW5hYmxlZC4gTWFudWFsbHkgYWRkIHdhdGNoZXMgdG8gdGhlIGlubmVyIHN1YnRyZWVzLgorICAgICAgICAgICAgIyBUaGUgbmV3bHkgbW9uaXRvcmVkIGRpcmVjdG9yeSBpbmhlcml0cyBhdHRyaWJ1dGVzIGZyb20gaXRzCisgICAgICAgICAgICAjIHBhcmVudCBkaXJlY3RvcnkuCisgICAgICAgICAgICBzZWxmLl93YXRjaF9tYW5hZ2VyLmFkZF93YXRjaChkc3RfcGF0aCwgd2F0Y2hfLm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2Z1bj13YXRjaF8ucHJvY19mdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWM9VHJ1ZSwgYXV0b19hZGQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVfZmlsdGVyPXdhdGNoXy5leGNsdWRlX2ZpbHRlcikKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19kZWZhdWx0KHJhd19ldmVudCwgdG9fYXBwZW5kKQorCisgICAgZGVmIHByb2Nlc3NfSU5fTU9WRV9TRUxGKHNlbGYsIHJhd19ldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBTVEFUVVM6IHRoZSBmb2xsb3dpbmcgYnVnIGhhcyBiZWVuIGZpeGVkIGluIHJlY2VudCBrZXJuZWxzIChGSVhNRToKKyAgICAgICAgd2hpY2ggdmVyc2lvbiA/KS4gTm93IGl0IHJhaXNlcyBJTl9ERUxFVEVfU0VMRiBpbnN0ZWFkLgorCisgICAgICAgIE9sZCBrZXJuZWxzIHdlcmUgYnVnZ2VkLCB0aGlzIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3YXRjaGVkIGl0ZW0KKyAgICAgICAgd2VyZSBtb3ZlZCwgc28gd2UgaGFkIHRvIHVwZGF0ZSBpdHMgcGF0aCwgYnV0IHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcworICAgICAgICBpdCB3YXMgaW1wb3NzaWJsZTogaWYgaXRzIHBhcmVudCBkaXJlY3RvcnkgYW5kIGl0cyBkZXN0aW5hdGlvbgorICAgICAgICBkaXJlY3Rvcnkgd2Fzbid0IHdhdGNoZWQuIFRoZSBrZXJuZWwgKHNlZSBpbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgpCisgICAgICAgIGRvZXNuJ3QgYnJpbmcgdXMgZW5vdWdoIGluZm9ybWF0aW9ucyBsaWtlIHRoZSBkZXN0aW5hdGlvbiBwYXRoIG9mCisgICAgICAgIG1vdmVkIGl0ZW1zLgorICAgICAgICAiIiIKKyAgICAgICAgd2F0Y2hfID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICBzcmNfcGF0aCA9IHdhdGNoXy5wYXRoCisgICAgICAgIG12XyA9IHNlbGYuX212LmdldChzcmNfcGF0aCkKKyAgICAgICAgaWYgbXZfOgorICAgICAgICAgICAgZGVzdF9wYXRoID0gbXZfWzBdCisgICAgICAgICAgICB3YXRjaF8ucGF0aCA9IGRlc3RfcGF0aAorICAgICAgICAgICAgIyBhZGQgdGhlIHNlcGFyYXRvciB0byB0aGUgc291cmNlIHBhdGggdG8gYXZvaWQgb3ZlcmxhcHBpbmcKKyAgICAgICAgICAgICMgcGF0aCBpc3N1ZSB3aGVuIHRlc3Rpbmcgd2l0aCBzdGFydHN3aXRoKCkKKyAgICAgICAgICAgIHNyY19wYXRoICs9IG9zLnBhdGguc2VwCisgICAgICAgICAgICBzcmNfcGF0aF9sZW4gPSBsZW4oc3JjX3BhdGgpCisgICAgICAgICAgICAjIFRoZSBuZXh0IGxvb3AgcmVuYW1lcyBhbGwgd2F0Y2hlcyB3aXRoIHNyY19wYXRoIGFzIGJhc2UgcGF0aC4KKyAgICAgICAgICAgICMgSXQgc2VlbXMgdGhhdCBJTl9NT1ZFX1NFTEYgZG9lcyBub3QgcHJvdmlkZSBJTl9JU0RJUiBpbmZvcm1hdGlvbgorICAgICAgICAgICAgIyB0aGVyZWZvcmUgdGhlIG5leHQgbG9vcCBpcyBpdGVyYXRlZCBldmVuIGlmIHJhd19ldmVudCBpcyBhIGZpbGUuCisgICAgICAgICAgICBmb3IgdyBpbiBzZWxmLl93YXRjaF9tYW5hZ2VyLndhdGNoZXMudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgaWYgdy5wYXRoLnN0YXJ0c3dpdGgoc3JjX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCBkZXN0X3BhdGggaXMgYSBub3JtYWxpemVkIHBhdGguCisgICAgICAgICAgICAgICAgICAgIHcucGF0aCA9IG9zLnBhdGguam9pbihkZXN0X3BhdGgsIHcucGF0aFtzcmNfcGF0aF9sZW46XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVGhlIHBhdGhuYW1lICclcycgb2YgdGhpcyB3YXRjaCAlcyBoYXMgcHJvYmFibHkgY2hhbmdlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImFuZCBjb3VsZG4ndCBiZSB1cGRhdGVkLCBzbyBpdCBjYW5ub3QgYmUgdHJ1c3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImFueW1vcmUuIFRvIGZpeCB0aGlzIGVycm9yIG1vdmUgZGlyZWN0b3JpZXMvZmlsZXMgb25seSAiCisgICAgICAgICAgICAgICAgICAgICAgImJldHdlZW4gd2F0Y2hlZCBwYXJlbnRzIGRpcmVjdG9yaWVzLCBpbiB0aGlzIGNhc2UgZS5nLiAiCisgICAgICAgICAgICAgICAgICAgICAgInB1dCBhIHdhdGNoIG9uICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgICB3YXRjaF8ucGF0aCwgd2F0Y2hfLAorICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHdhdGNoXy5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucGFyZGlyKSkpCisgICAgICAgICAgICBpZiBub3Qgd2F0Y2hfLnBhdGguZW5kc3dpdGgoJy11bmtub3duLXBhdGgnKToKKyAgICAgICAgICAgICAgICB3YXRjaF8ucGF0aCArPSAnLXVua25vd24tcGF0aCcKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvY2Vzc19kZWZhdWx0KHJhd19ldmVudCkKKworICAgIGRlZiBwcm9jZXNzX0lOX1FfT1ZFUkZMT1coc2VsZiwgcmF3X2V2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIE9ubHkgc2lnbmFsIGFuIG92ZXJmbG93LCBtb3N0IG9mIHRoZSBjb21tb24gZmxhZ3MgYXJlIGlycmVsZXZhbnQKKyAgICAgICAgZm9yIHRoaXMgZXZlbnQgKHBhdGgsIHdkLCBuYW1lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBFdmVudCh7J21hc2snOiByYXdfZXZlbnQubWFza30pCisKKyAgICBkZWYgcHJvY2Vzc19JTl9JR05PUkVEKHNlbGYsIHJhd19ldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBUaGUgd2F0Y2ggZGVzY3JpcHRvciByYWlzZWQgYnkgdGhpcyBldmVudCBpcyBub3cgaWdub3JlZCAoZm9yZXZlciksCisgICAgICAgIGl0IGNhbiBiZSBzYWZlbHkgZGVsZXRlZCBmcm9tIHRoZSB3YXRjaCBtYW5hZ2VyIGRpY3Rpb25hcnkuCisgICAgICAgIEFmdGVyIHRoaXMgZXZlbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCBuZWl0aGVyIHRoZSBldmVudCBxdWV1ZSBub3IKKyAgICAgICAgdGhlIHN5c3RlbSB3aWxsIHJhaXNlIGFuIGV2ZW50IGFzc29jaWF0ZWQgdG8gdGhpcyB3ZCBhZ2Fpbi4KKyAgICAgICAgIiIiCisgICAgICAgIGV2ZW50XyA9IHNlbGYucHJvY2Vzc19kZWZhdWx0KHJhd19ldmVudCkKKyAgICAgICAgc2VsZi5fd2F0Y2hfbWFuYWdlci5kZWxfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICByZXR1cm4gZXZlbnRfCisKKyAgICBkZWYgcHJvY2Vzc19kZWZhdWx0KHNlbGYsIHJhd19ldmVudCwgdG9fYXBwZW5kPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29tbW9ucyBoYW5kbGluZyBmb3IgdGhlIGZvbGxvd2luZ3MgZXZlbnRzOgorCisgICAgICAgIElOX0FDQ0VTUywgSU5fTU9ESUZZLCBJTl9BVFRSSUIsIElOX0NMT1NFX1dSSVRFLCBJTl9DTE9TRV9OT1dSSVRFLAorICAgICAgICBJTl9PUEVOLCBJTl9ERUxFVEUsIElOX0RFTEVURV9TRUxGLCBJTl9VTk1PVU5ULgorICAgICAgICAiIiIKKyAgICAgICAgd2F0Y2hfID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICBpZiByYXdfZXZlbnQubWFzayAmIChJTl9ERUxFVEVfU0VMRiB8IElOX01PVkVfU0VMRik6CisgICAgICAgICAgICAjIFVuZm9ybnVsYXRlbHkgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbAorICAgICAgICAgICAgZGlyXyA9IHdhdGNoXy5kaXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpcl8gPSBib29sKHJhd19ldmVudC5tYXNrICYgSU5fSVNESVIpCisgICAgICAgIGRpY3RfID0geyd3ZCc6IHJhd19ldmVudC53ZCwKKyAgICAgICAgICAgICAgICAgJ21hc2snOiByYXdfZXZlbnQubWFzaywKKyAgICAgICAgICAgICAgICAgJ3BhdGgnOiB3YXRjaF8ucGF0aCwKKyAgICAgICAgICAgICAgICAgJ25hbWUnOiByYXdfZXZlbnQubmFtZSwKKyAgICAgICAgICAgICAgICAgJ2Rpcic6IGRpcl99CisgICAgICAgIGlmIENPTVBBVElCSUxJVFlfTU9ERToKKyAgICAgICAgICAgIGRpY3RfWydpc19kaXInXSA9IGRpcl8KKyAgICAgICAgaWYgdG9fYXBwZW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGljdF8udXBkYXRlKHRvX2FwcGVuZCkKKyAgICAgICAgcmV0dXJuIEV2ZW50KGRpY3RfKQorCisKK2NsYXNzIFByb2Nlc3NFdmVudChfUHJvY2Vzc0V2ZW50KToKKyAgICAiIiIKKyAgICBQcm9jZXNzIGV2ZW50cyBvYmplY3RzLCBjYW4gYmUgc3BlY2lhbGl6ZWQgdmlhIHN1YmNsYXNzaW5nLCB0aHVzIGl0cworICAgIGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZW46CisKKyAgICBOb3RlOiB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSBfX2luaXRfXyBpbiB5b3VyIHN1YmNsYXNzIGluc3RlYWQgZGVmaW5lCisgICAgYSBteV9pbml0KCkgbWV0aG9kLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCisgICAgY29uc3RydWN0b3Igb2YgdGhpcyBjbGFzcyB3aXRoIGl0cyBvcHRpb25hbHMgcGFyYW1ldGVycy4KKworICAgICAgMS4gUHJvdmlkZSBzcGVjaWFsaXplZCBpbmRpdmlkdWFsIG1ldGhvZHMsIGUuZy4gcHJvY2Vzc19JTl9ERUxFVEUgZm9yCisgICAgICAgICBwcm9jZXNzaW5nIGEgcHJlY2lzZSB0eXBlIG9mIGV2ZW50IChlLmcuIElOX0RFTEVURSBpbiB0aGlzIGNhc2UpLgorICAgICAgMi4gT3IvYW5kIHByb3ZpZGUgbWV0aG9kcyBmb3IgcHJvY2Vzc2luZyBldmVudHMgYnkgJ2ZhbWlseScsIGUuZy4KKyAgICAgICAgIHByb2Nlc3NfSU5fQ0xPU0UgbWV0aG9kIHdpbGwgcHJvY2VzcyBib3RoIElOX0NMT1NFX1dSSVRFIGFuZAorICAgICAgICAgSU5fQ0xPU0VfTk9XUklURSBldmVudHMgKGlmIHByb2Nlc3NfSU5fQ0xPU0VfV1JJVEUgYW5kCisgICAgICAgICBwcm9jZXNzX0lOX0NMT1NFX05PV1JJVEUgYXJlbid0IGRlZmluZWQgdGhvdWdoKS4KKyAgICAgIDMuIE9yL2FuZCBvdmVycmlkZSBwcm9jZXNzX2RlZmF1bHQgZm9yIGNhdGNoaW5nIGFuZCBwcm9jZXNzaW5nIGFsbAorICAgICAgICAgdGhlIHJlbWFpbmluZyB0eXBlcyBvZiBldmVudHMuCisgICAgIiIiCisgICAgcGV2ZW50ID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBldmVudD1Ob25lLCAqKmthcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuYWJsZSBjaGFpbmluZyBvZiBQcm9jZXNzRXZlbnQgaW5zdGFuY2VzLgorCisgICAgICAgIEBwYXJhbSBwZXZlbnQ6IE9wdGlvbmFsIGNhbGxhYmxlIG9iamVjdCwgd2lsbCBiZSBjYWxsZWQgb24gZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAoYmVmb3JlIHNlbGYpLgorICAgICAgICBAdHlwZSBwZXZlbnQ6IGNhbGxhYmxlCisgICAgICAgIEBwYXJhbSBrYXJnczogVGhpcyBjb25zdHJ1Y3RvciBpcyBpbXBsZW1lbnRlZCBhcyBhIHRlbXBsYXRlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRpbmcgaXRzIG9wdGlvbmFscyBrZXl3b3JkZWQgYXJndW1lbnRzIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBteV9pbml0KCkuCisgICAgICAgIEB0eXBlIGthcmdzOiBkaWN0CisgICAgICAgICIiIgorICAgICAgICBzZWxmLnBldmVudCA9IHBldmVudAorICAgICAgICBzZWxmLm15X2luaXQoKiprYXJncykKKworICAgIGRlZiBteV9pbml0KHNlbGYsICoqa2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gUHJvY2Vzc0V2ZW50Ll9faW5pdF9fKCkuIFRoaXMgbWV0aG9kIGlzCisgICAgICAgIGVtcHR5IGhlcmUgYW5kIG11c3QgYmUgcmVkZWZpbmVkIHRvIGJlIHVzZWZ1bC4gSW4gZWZmZWN0LCBpZiB5b3UKKyAgICAgICAgbmVlZCB0byBzcGVjaWZpY2FsbHkgaW5pdGlhbGl6ZSB5b3VyIHN1YmNsYXNzJyBpbnN0YW5jZSB0aGVuIHlvdQorICAgICAgICBqdXN0IGhhdmUgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBzdWJjbGFzcy4gVGhlbiBhbGwgdGhlCisgICAgICAgIGtleXdvcmRlZCBhcmd1bWVudHMgcGFzc2VkIHRvIFByb2Nlc3NFdmVudC5fX2luaXRfXygpIHdpbGwgYmUKKyAgICAgICAgdHJhbnNtaXR0ZWQgYXMgcGFyYW1ldGVycyB0byB0aGlzIG1ldGhvZC4gQmV3YXJlIHlvdSBNVVNUIHBhc3MKKyAgICAgICAga2V5d29yZCBhcmd1bWVudHMgdGhvdWdoLgorCisgICAgICAgIEBwYXJhbSBrYXJnczogb3B0aW9uYWwgZGVsZWdhdGVkIGFyZ3VtZW50cyBmcm9tIF9faW5pdF9fKCkuCisgICAgICAgIEB0eXBlIGthcmdzOiBkaWN0CisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgZXZlbnQpOgorICAgICAgICBzdG9wX2NoYWluaW5nID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5wZXZlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIEJ5IGRlZmF1bHQgbWV0aG9kcyByZXR1cm4gTm9uZSBzbyB3ZSBzZXQgYXMgZ3VpZGVsaW5lCisgICAgICAgICAgICAjIHRoYXQgbWV0aG9kcyBhc2tpbmcgZm9yIHN0b3AgY2hhaW5pbmcgbXVzdCBleHBsaWNpdGVseQorICAgICAgICAgICAgIyByZXR1cm4gbm9uIE5vbmUgb3Igbm9uIEZhbHNlIHZhbHVlcywgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAjIGJlaGF2aW9yIHdpbGwgYmUgdG8gYWNjZXB0IGNoYWluIGNhbGwgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICMgbG9jYWwgbWV0aG9kLgorICAgICAgICAgICAgc3RvcF9jaGFpbmluZyA9IHNlbGYucGV2ZW50KGV2ZW50KQorICAgICAgICBpZiBub3Qgc3RvcF9jaGFpbmluZzoKKyAgICAgICAgICAgIHJldHVybiBfUHJvY2Vzc0V2ZW50Ll9fY2FsbF9fKHNlbGYsIGV2ZW50KQorCisgICAgZGVmIG5lc3RlZF9wZXZlbnQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBldmVudAorCisgICAgZGVmIHByb2Nlc3NfSU5fUV9PVkVSRkxPVyhzZWxmLCBldmVudCk6CisgICAgICAgICIiIgorICAgICAgICBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIG9ubHkgcmVwb3J0cyB3YXJuaW5nIG1lc3NhZ2VzLCB5b3UgY2FuIG92ZXJyZWRpZGUKKyAgICAgICAgaXQgYnkgc3ViY2xhc3NpbmcgUHJvY2Vzc0V2ZW50IGFuZCBpbXBsZW1lbnQgeW91ciBvd24KKyAgICAgICAgcHJvY2Vzc19JTl9RX09WRVJGTE9XIG1ldGhvZC4gVGhlIGFjdGlvbnMgeW91IGNhbiB0YWtlIG9uIHJlY2VpdmluZyB0aGlzCisgICAgICAgIGV2ZW50IGlzIGVpdGhlciB0byB1cGRhdGUgdGhlIHZhcmlhYmxlIG1heF9xdWV1ZWRfZXZlbnRzIGluIG9yZGVyIHRvCisgICAgICAgIGhhbmRsZSBtb3JlIHNpbXVsdGFuZW91cyBldmVudHMgb3IgdG8gbW9kaWZ5IHlvdXIgY29kZSBpbiBvcmRlciB0bworICAgICAgICBhY2NvbXBsaXNoIGEgYmV0dGVyIGZpbHRlcmluZyBkaW1pbmlzaGluZyB0aGUgbnVtYmVyIG9mIHJhaXNlZCBldmVudHMuCisgICAgICAgIEJlY2F1c2UgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCwgSU5fUV9PVkVSRkxPVyB3aWxsIG5ldmVyIGdldAorICAgICAgICB0cmFuc21pdHRlZCBhcyBhcmd1bWVudHMgdG8gcHJvY2Vzc19kZWZhdWx0IGNhbGxzLgorCisgICAgICAgIEBwYXJhbSBldmVudDogSU5fUV9PVkVSRkxPVyBldmVudC4KKyAgICAgICAgQHR5cGUgZXZlbnQ6IGRpY3QKKyAgICAgICAgIiIiCisgICAgICAgIGxvZy53YXJuaW5nKCdFdmVudCBxdWV1ZSBvdmVyZmxvd2VkLicpCisKKyAgICBkZWYgcHJvY2Vzc19kZWZhdWx0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIERlZmF1bHQgcHJvY2Vzc2luZyBldmVudCBtZXRob2QuIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nLiBTdWJjbGFzcworICAgICAgICBQcm9jZXNzRXZlbnQgYW5kIHJlZGVmaW5lIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIG1vZGlmeSBpdHMgYmVoYXZpb3IuCisKKyAgICAgICAgQHBhcmFtIGV2ZW50OiBFdmVudCB0byBiZSBwcm9jZXNzZWQuIENhbiBiZSBvZiBhbnkgdHlwZSBvZiBldmVudHMgYnV0CisgICAgICAgICAgICAgICAgICAgICAgSU5fUV9PVkVSRkxPVyBldmVudHMgKHNlZSBtZXRob2QgcHJvY2Vzc19JTl9RX09WRVJGTE9XKS4KKyAgICAgICAgQHR5cGUgZXZlbnQ6IEV2ZW50IGluc3RhbmNlCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworY2xhc3MgUHJpbnRBbGxFdmVudHMoUHJvY2Vzc0V2ZW50KToKKyAgICAiIiIKKyAgICBEdW1teSBjbGFzcyB1c2VkIHRvIHByaW50IGV2ZW50cyBzdHJpbmdzIHJlcHJlc2VudGF0aW9ucy4gRm9yIGluc3RhbmNlIHRoaXMKKyAgICBjbGFzcyBpcyB1c2VkIGZyb20gY29tbWFuZCBsaW5lIHRvIHByaW50IGFsbCByZWNlaXZlZCBldmVudHMgdG8gc3Rkb3V0LgorICAgICIiIgorICAgIGRlZiBteV9pbml0KHNlbGYsIG91dD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSBvdXQ6IFdoZXJlIGV2ZW50cyB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICAgIEB0eXBlIG91dDogT2JqZWN0IHByb3ZpZGluZyBhIHZhbGlkIGZpbGUgb2JqZWN0IGludGVyZmFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICAgICAgb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9vdXQgPSBvdXQKKworICAgIGRlZiBwcm9jZXNzX2RlZmF1bHQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgV3JpdGVzIGV2ZW50IHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBmaWxlIG9iamVjdCBwcm92aWRlZCB0bworICAgICAgICBteV9pbml0KCkuCisKKyAgICAgICAgQHBhcmFtIGV2ZW50OiBFdmVudCB0byBiZSBwcm9jZXNzZWQuIENhbiBiZSBvZiBhbnkgdHlwZSBvZiBldmVudHMgYnV0CisgICAgICAgICAgICAgICAgICAgICAgSU5fUV9PVkVSRkxPVyBldmVudHMgKHNlZSBtZXRob2QgcHJvY2Vzc19JTl9RX09WRVJGTE9XKS4KKyAgICAgICAgQHR5cGUgZXZlbnQ6IEV2ZW50IGluc3RhbmNlCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9vdXQud3JpdGUoc3RyKGV2ZW50KSkKKyAgICAgICAgc2VsZi5fb3V0LndyaXRlKCdcbicpCisgICAgICAgIHNlbGYuX291dC5mbHVzaCgpCisKKworY2xhc3MgQ2hhaW5JZlRydWUoUHJvY2Vzc0V2ZW50KToKKyAgICAiIiIKKyAgICBNYWtlcyBjb25kaXRpb25hbCBjaGFpbmluZyBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgbmVzdGVkCisgICAgcHJvY2Vzc2luZyBpbnN0YW5jZS4KKyAgICAiIiIKKyAgICBkZWYgbXlfaW5pdChzZWxmLCBmdW5jKToKKyAgICAgICAgIiIiCisgICAgICAgIE1ldGhvZCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBmcm9tIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9mdW5jID0gZnVuYworCisgICAgZGVmIHByb2Nlc3NfZGVmYXVsdChzZWxmLCBldmVudCk6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fZnVuYyhldmVudCkKKworCitjbGFzcyBTdGF0cyhQcm9jZXNzRXZlbnQpOgorICAgICIiIgorICAgIENvbXB1dGUgYW5kIGRpc3BsYXkgdHJpdmlhbCBzdGF0aXN0aWNzIGFib3V0IHByb2Nlc3NlZCBldmVudHMuCisgICAgIiIiCisgICAgZGVmIG15X2luaXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBNZXRob2QgYXV0b21hdGljYWxseSBjYWxsZWQgZnJvbSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuX3N0YXRzID0ge30KKyAgICAgICAgc2VsZi5fc3RhdHNfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKworICAgIGRlZiBwcm9jZXNzX2RlZmF1bHQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJvY2Vzc2VzIHxldmVudHwuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9zdGF0c19sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBldmVudHMgPSBldmVudC5tYXNrbmFtZS5zcGxpdCgnfCcpCisgICAgICAgICAgICBmb3IgZXZlbnRfbmFtZSBpbiBldmVudHM6CisgICAgICAgICAgICAgICAgY291bnQgPSBzZWxmLl9zdGF0cy5nZXQoZXZlbnRfbmFtZSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGF0c1tldmVudF9uYW1lXSA9IGNvdW50ICsgMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fc3RhdHNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfc3RhdHNfY29weShzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhdHNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRzLmNvcHkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fc3RhdHNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgc3RhdHMgPSBzZWxmLl9zdGF0c19jb3B5KCkKKworICAgICAgICBlbGFwc2VkID0gaW50KHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZSkKKyAgICAgICAgZWxhcHNlZF9zdHIgPSAnJworICAgICAgICBpZiBlbGFwc2VkIDwgNjA6CisgICAgICAgICAgICBlbGFwc2VkX3N0ciA9IHN0cihlbGFwc2VkKSArICdzZWMnCisgICAgICAgIGVsaWYgNjAgPD0gZWxhcHNlZCA8IDM2MDA6CisgICAgICAgICAgICBlbGFwc2VkX3N0ciA9ICclZG1uJWRzZWMnICUgKGVsYXBzZWQgLyA2MCwgZWxhcHNlZCAlIDYwKQorICAgICAgICBlbGlmIDM2MDAgPD0gZWxhcHNlZCA8IDg2NDAwOgorICAgICAgICAgICAgZWxhcHNlZF9zdHIgPSAnJWRoJWRtbicgJSAoZWxhcHNlZCAvIDM2MDAsIChlbGFwc2VkICUgMzYwMCkgLyA2MCkKKyAgICAgICAgZWxpZiBlbGFwc2VkID49IDg2NDAwOgorICAgICAgICAgICAgZWxhcHNlZF9zdHIgPSAnJWRkJWRoJyAlIChlbGFwc2VkIC8gODY0MDAsIChlbGFwc2VkICUgODY0MDApIC8gMzYwMCkKKyAgICAgICAgc3RhdHNbJ0VsYXBzZWRUaW1lJ10gPSBlbGFwc2VkX3N0cgorCisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgZXYsIHZhbHVlIGluIHNvcnRlZChzdGF0cy5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMF0pOgorICAgICAgICAgICAgbC5hcHBlbmQoJyAlcz0lcycgJSAob3V0cHV0X2Zvcm1hdC5maWVsZF9uYW1lKGV2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQuZmllbGRfdmFsdWUodmFsdWUpKSkKKyAgICAgICAgcyA9ICc8JXMlcyA+JyAlIChvdXRwdXRfZm9ybWF0LmNsYXNzX25hbWUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICcnLmpvaW4obCkpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgZHVtcChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBEdW1wcyBzdGF0aXN0aWNzLgorCisgICAgICAgIEBwYXJhbSBmaWxlbmFtZTogZmlsZW5hbWUgd2hlcmUgc3RhdHMgd2lsbCBiZSBkdW1wZWQsIGZpbGVuYW1lIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBhbmQgbXVzdCBub3QgZXhpc3QgcHJpb3IgdG8gdGhpcyBjYWxsLgorICAgICAgICBAdHlwZSBmaWxlbmFtZTogc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBmbGFncyA9IG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVR8b3MuT19OT0ZPTExPV3xvcy5PX0VYQ0wKKyAgICAgICAgZmQgPSBvcy5vcGVuKGZpbGVuYW1lLCBmbGFncywgMDYwMCkKKyAgICAgICAgb3Mud3JpdGUoZmQsIHN0cihzZWxmKSkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmLCBzY2FsZT00NSk6CisgICAgICAgIHN0YXRzID0gc2VsZi5fc3RhdHNfY29weSgpCisgICAgICAgIGlmIG5vdCBzdGF0czoKKyAgICAgICAgICAgIHJldHVybiAnJworCisgICAgICAgIG0gPSBtYXgoc3RhdHMudmFsdWVzKCkpCisgICAgICAgIHVuaXR5ID0gZmxvYXQoc2NhbGUpIC8gbQorICAgICAgICBmbXQgPSAnJSUtMjZzJSUtJWRzJSVzJyAlIChsZW4ob3V0cHV0X2Zvcm1hdC5maWVsZF92YWx1ZSgnQCcgKiBzY2FsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSkKKyAgICAgICAgZGVmIGZ1bmMoeCk6CisgICAgICAgICAgICByZXR1cm4gZm10ICUgKG91dHB1dF9mb3JtYXQuZmllbGRfbmFtZSh4WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5maWVsZF92YWx1ZSgnQCcgKiBpbnQoeFsxXSAqIHVuaXR5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQuc2ltcGxlKCclZCcgJSB4WzFdLCAneWVsbG93JykpCisgICAgICAgIHMgPSAnXG4nLmpvaW4obWFwKGZ1bmMsIHNvcnRlZChzdGF0cy5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMF0pKSkKKyAgICAgICAgcmV0dXJuIHMKKworCitjbGFzcyBOb3RpZmllckVycm9yKFB5aW5vdGlmeUVycm9yKToKKyAgICAiIiIKKyAgICBOb3RpZmllciBFeGNlcHRpb24uIFJhaXNlZCBvbiBOb3RpZmllciBlcnJvci4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnIpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIGVycjogRXhjZXB0aW9uIHN0cmluZydzIGRlc2NyaXB0aW9uLgorICAgICAgICBAdHlwZSBlcnI6IHN0cmluZworICAgICAgICAiIiIKKyAgICAgICAgUHlpbm90aWZ5RXJyb3IuX19pbml0X18oc2VsZiwgZXJyKQorCisKK2NsYXNzIE5vdGlmaWVyOgorICAgICIiIgorICAgIFJlYWQgbm90aWZpY2F0aW9ucywgcHJvY2VzcyBldmVudHMuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2F0Y2hfbWFuYWdlciwgZGVmYXVsdF9wcm9jX2Z1bj1Ob25lLCByZWFkX2ZyZXE9MCwKKyAgICAgICAgICAgICAgICAgdGhyZXNob2xkPTAsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXphdGlvbi4gcmVhZF9mcmVxLCB0aHJlc2hvbGQgYW5kIHRpbWVvdXQgcGFyYW1ldGVycyBhcmUgdXNlZAorICAgICAgICB3aGVuIGxvb3BpbmcuCisKKyAgICAgICAgQHBhcmFtIHdhdGNoX21hbmFnZXI6IFdhdGNoIE1hbmFnZXIuCisgICAgICAgIEB0eXBlIHdhdGNoX21hbmFnZXI6IFdhdGNoTWFuYWdlciBpbnN0YW5jZQorICAgICAgICBAcGFyYW0gZGVmYXVsdF9wcm9jX2Z1bjogRGVmYXVsdCBwcm9jZXNzaW5nIG1ldGhvZC4gSWYgTm9uZSwgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG9mIFByaW50QWxsRXZlbnRzIHdpbGwgYmUgYXNzaWduZWQuCisgICAgICAgIEB0eXBlIGRlZmF1bHRfcHJvY19mdW46IGluc3RhbmNlIG9mIFByb2Nlc3NFdmVudAorICAgICAgICBAcGFyYW0gcmVhZF9mcmVxOiBpZiByZWFkX2ZyZXEgPT0gMCwgZXZlbnRzIGFyZSByZWFkIGFzYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlYWRfZnJlcSBpcyA+IDAsIHRoaXMgdGhyZWFkIHNsZWVwcworICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoMCwgcmVhZF9mcmVxIC0gdGltZW91dCkgc2Vjb25kcy4gQnV0IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgaXMgTm9uZSBpdCBtYXkgYmUgZGlmZmVyZW50IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sbCBpcyBibG9ja2luZyB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gcmVhZC4KKyAgICAgICAgQHR5cGUgcmVhZF9mcmVxOiBpbnQKKyAgICAgICAgQHBhcmFtIHRocmVzaG9sZDogRmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgcmVhZCBvbmx5IGlmIHRoZSBhY2N1bXVsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIHRvIHJlYWQgYmVjb21lcyA+PSB0aHJlc2hvbGQuIElmICE9IDAsIHlvdSBsaWtlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UgaXQgaW4gY29tYmluYXRpb24gd2l0aCBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBmb3IgcmVhZF9mcmVxIGJlY2F1c2Ugd2l0aG91dCB0aGF0IHlvdSB3b3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwIGxvb3Bpbmcgd2l0aG91dCByZWFsbHkgcmVhZGluZyBhbnl0aGluZyBhbmQgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgYW1vdW50IG9mIGV2ZW50cyB0byByZWFkIGlzID49IHRocmVzaG9sZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgd2l0aCByZWFkX2ZyZXEgc2V0IHlvdSBtaWdodCBzbGVlcC4KKyAgICAgICAgQHR5cGUgdGhyZXNob2xkOiBpbnQKKyAgICAgICAgQHBhcmFtIHRpbWVvdXQ6CisgICAgICAgICAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvc2VsZWN0Lmh0bWwjcG9sbGluZy1vYmplY3RzCisgICAgICAgIEB0eXBlIHRpbWVvdXQ6IGludAorICAgICAgICAiIiIKKyAgICAgICAgIyBXYXRjaCBNYW5hZ2VyIGluc3RhbmNlCisgICAgICAgIHNlbGYuX3dhdGNoX21hbmFnZXIgPSB3YXRjaF9tYW5hZ2VyCisgICAgICAgICMgRmlsZSBkZXNjcmlwdG9yCisgICAgICAgIHNlbGYuX2ZkID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfZmQoKQorICAgICAgICAjIFBvbGwgb2JqZWN0IGFuZCByZWdpc3RyYXRpb24KKyAgICAgICAgc2VsZi5fcG9sbG9iaiA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgc2VsZi5fcG9sbG9iai5yZWdpc3RlcihzZWxmLl9mZCwgc2VsZWN0LlBPTExJTikKKyAgICAgICAgIyBUaGlzIHBpcGUgaXMgY29ycmVjdGVseSBpbml0aWFsaXplZCBhbmQgdXNlZCBieSBUaHJlYWRlZE5vdGlmaWVyCisgICAgICAgIHNlbGYuX3BpcGUgPSAoLTEsIC0xKQorICAgICAgICAjIEV2ZW50IHF1ZXVlCisgICAgICAgIHNlbGYuX2V2ZW50cSA9IGRlcXVlKCkKKyAgICAgICAgIyBTeXN0ZW0gcHJvY2Vzc2luZyBmdW5jdG9yLCBjb21tb24gdG8gYWxsIGV2ZW50cworICAgICAgICBzZWxmLl9zeXNfcHJvY19mdW4gPSBfU3lzUHJvY2Vzc0V2ZW50KHNlbGYuX3dhdGNoX21hbmFnZXIsIHNlbGYpCisgICAgICAgICMgRGVmYXVsdCBwcm9jZXNzaW5nIG1ldGhvZAorICAgICAgICBzZWxmLl9kZWZhdWx0X3Byb2NfZnVuID0gZGVmYXVsdF9wcm9jX2Z1bgorICAgICAgICBpZiBkZWZhdWx0X3Byb2NfZnVuIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kZWZhdWx0X3Byb2NfZnVuID0gUHJpbnRBbGxFdmVudHMoKQorICAgICAgICAjIExvb3AgcGFyYW1ldGVycworICAgICAgICBzZWxmLl9yZWFkX2ZyZXEgPSByZWFkX2ZyZXEKKyAgICAgICAgc2VsZi5fdGhyZXNob2xkID0gdGhyZXNob2xkCisgICAgICAgIHNlbGYuX3RpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgICMgQ29hbGVzY2UgZXZlbnRzIG9wdGlvbgorICAgICAgICBzZWxmLl9jb2FsZXNjZSA9IEZhbHNlCisgICAgICAgICMgc2V0IG9mIHN0cihyYXdfZXZlbnQpLCBvbmx5IHVzZWQgd2hlbiBjb2FsZXNjZSBvcHRpb24gaXMgVHJ1ZQorICAgICAgICBzZWxmLl9ldmVudHNldCA9IHNldCgpCisKKyAgICBkZWYgYXBwZW5kX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIEFwcGVuZCBhIHJhdyBldmVudCB0byB0aGUgZXZlbnQgcXVldWUuCisKKyAgICAgICAgQHBhcmFtIGV2ZW50OiBBbiBldmVudC4KKyAgICAgICAgQHR5cGUgZXZlbnQ6IF9SYXdFdmVudCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2V2ZW50cS5hcHBlbmQoZXZlbnQpCisKKyAgICBkZWYgcHJvY19mdW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZWZhdWx0X3Byb2NfZnVuCisKKyAgICBkZWYgY29hbGVzY2VfZXZlbnRzKHNlbGYsIGNvYWxlc2NlPVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29hbGVzY2luZyBldmVudHMuIEV2ZW50cyBhcmUgdXN1YWxseSBwcm9jZXNzZWQgYnkgYmF0Y2hzLCB0aGVpciBzaXplCisgICAgICAgIGRlcGVuZCBvbiB2YXJpb3VzIGZhY3RvcnMuIFRodXMsIGJlZm9yZSBwcm9jZXNzaW5nIHRoZW0sIGV2ZW50cyByZWNlaXZlZAorICAgICAgICBmcm9tIGlub3RpZnkgYXJlIGFnZ3JlZ2F0ZWQgaW4gYSBmaWZvIHF1ZXVlLiBJZiB0aGlzIGNvYWxlc2NpbmcKKyAgICAgICAgb3B0aW9uIGlzIGVuYWJsZWQgZXZlbnRzIGFyZSBmaWx0ZXJlZCBiYXNlZCBvbiB0aGVpciB1bmljaXR5LCBvbmx5CisgICAgICAgIHVuaXF1ZSBldmVudHMgYXJlIGVucXVldWVkLCBkb3VibG9ucyBhcmUgZGlzY2FyZGVkLiBBbiBldmVudCBpcyB1bmlxdWUKKyAgICAgICAgd2hlbiB0aGUgY29tYmluYXRpb24gb2YgaXRzIGZpZWxkcyAod2QsIG1hc2ssIGNvb2tpZSwgbmFtZSkgaXMgdW5pcXVlCisgICAgICAgIGFtb25nIGV2ZW50cyBvZiBhIHNhbWUgYmF0Y2guIEFmdGVyIGEgYmF0Y2ggb2YgZXZlbnRzIGlzIHByb2Nlc3NlZCBhbnkKKyAgICAgICAgZXZlbnRzIGlzIGFjY2VwdGVkIGFnYWluLiBCeSBkZWZhdWx0IHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLCB5b3UgaGF2ZQorICAgICAgICB0byBleHBsaWN0bHkgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHR1cm4gaXQgb24uCisKKyAgICAgICAgQHBhcmFtIGNvYWxlc2NlOiBPcHRpb25hbCBuZXcgY29hbGVzY2luZyB2YWx1ZS4gVHJ1ZSBieSBkZWZhdWx0LgorICAgICAgICBAdHlwZSBjb2FsZXNjZTogQm9vbAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY29hbGVzY2UgPSBjb2FsZXNjZQorICAgICAgICBpZiBub3QgY29hbGVzY2U6CisgICAgICAgICAgICBzZWxmLl9ldmVudHNldC5jbGVhcigpCisKKyAgICBkZWYgY2hlY2tfZXZlbnRzKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayBmb3IgbmV3IGV2ZW50cyBhdmFpbGFibGUgdG8gcmVhZCwgYmxvY2tzIHVwIHRvIHRpbWVvdXQKKyAgICAgICAgbWlsbGlzZWNvbmRzLgorCisgICAgICAgIEBwYXJhbSB0aW1lb3V0OiBJZiBzcGVjaWZpZWQgaXQgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgX3RpbWVvdXQuCisgICAgICAgIEB0eXBlIHRpbWVvdXQ6IGludAorCisgICAgICAgIEByZXR1cm46IE5ldyBldmVudHMgdG8gcmVhZC4KKyAgICAgICAgQHJ0eXBlOiBib29sCisgICAgICAgICIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgYmxvY2tzIHVwIHRvICd0aW1lb3V0JyBtaWxsaXNlY29uZHMKKyAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzZWxmLl90aW1lb3V0CisgICAgICAgICAgICAgICAgcmV0ID0gc2VsZi5fcG9sbG9iai5wb2xsKHRpbWVvdXQpCisgICAgICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgaWYgZXJyWzBdID09IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAjIGludGVycnVwdGVkLCByZXRyeQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgbm90IHJldCBvciAoc2VsZi5fcGlwZVswXSA9PSByZXRbMF1bMF0pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICMgb25seSBvbmUgZmQgaXMgcG9sbGVkCisgICAgICAgIHJldHVybiByZXRbMF1bMV0gJiBzZWxlY3QuUE9MTElOCisKKyAgICBkZWYgcmVhZF9ldmVudHMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZWFkIGV2ZW50cyBmcm9tIGRldmljZSwgYnVpbGQgX1Jhd0V2ZW50cywgYW5kIGVucXVldWUgdGhlbS4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1Zl8gPSBhcnJheS5hcnJheSgnaScsIFswXSkKKyAgICAgICAgIyBnZXQgZXZlbnQgcXVldWUgc2l6ZQorICAgICAgICBpZiBmY250bC5pb2N0bChzZWxmLl9mZCwgdGVybWlvcy5GSU9OUkVBRCwgYnVmXywgMSkgPT0gLTE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcXVldWVfc2l6ZSA9IGJ1Zl9bMF0KKyAgICAgICAgaWYgcXVldWVfc2l6ZSA8IHNlbGYuX3RocmVzaG9sZDoKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygnKGZkOiAlZCkgJWQgYnl0ZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnV0IHRocmVzaG9sZCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAgJ2ZpeGVkIHRvICVkIGJ5dGVzJywgc2VsZi5fZmQsIHF1ZXVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGhyZXNob2xkKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBSZWFkIGNvbnRlbnQgZnJvbSBmaWxlCisgICAgICAgICAgICByID0gb3MucmVhZChzZWxmLl9mZCwgcXVldWVfc2l6ZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgbXNnOgorICAgICAgICAgICAgcmFpc2UgTm90aWZpZXJFcnJvcihtc2cpCisgICAgICAgIGxvZy5kZWJ1ZygnRXZlbnQgcXVldWUgc2l6ZTogJWQnLCBxdWV1ZV9zaXplKQorICAgICAgICByc3VtID0gMCAgIyBjb3VudGVyCisgICAgICAgIHdoaWxlIHJzdW0gPCBxdWV1ZV9zaXplOgorICAgICAgICAgICAgc19zaXplID0gMTYKKyAgICAgICAgICAgICMgUmV0cmlldmUgd2QsIG1hc2ssIGNvb2tpZSBhbmQgZm5hbWVfbGVuCisgICAgICAgICAgICB3ZCwgbWFzaywgY29va2llLCBmbmFtZV9sZW4gPSBzdHJ1Y3QudW5wYWNrKCdpSUlJJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltyc3VtOnJzdW0rc19zaXplXSkKKyAgICAgICAgICAgICMgUmV0cmlldmUgbmFtZQorICAgICAgICAgICAgZm5hbWUsID0gc3RydWN0LnVucGFjaygnJWRzJyAlIGZuYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltyc3VtICsgc19zaXplOnJzdW0gKyBzX3NpemUgKyBmbmFtZV9sZW5dKQorICAgICAgICAgICAgcmF3ZXZlbnQgPSBfUmF3RXZlbnQod2QsIG1hc2ssIGNvb2tpZSwgZm5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLl9jb2FsZXNjZToKKyAgICAgICAgICAgICAgICAjIE9ubHkgZW5xdWV1ZSBuZXcgKHVuaXF1ZSkgZXZlbnRzLgorICAgICAgICAgICAgICAgIHJhd2V2ZW50c3RyID0gc3RyKHJhd2V2ZW50KQorICAgICAgICAgICAgICAgIGlmIHJhd2V2ZW50c3RyIG5vdCBpbiBzZWxmLl9ldmVudHNldDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXZlbnRzZXQuYWRkKHJhd2V2ZW50c3RyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ldmVudHEuYXBwZW5kKHJhd2V2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9ldmVudHEuYXBwZW5kKHJhd2V2ZW50KQorICAgICAgICAgICAgcnN1bSArPSBzX3NpemUgKyBmbmFtZV9sZW4KKworICAgIGRlZiBwcm9jZXNzX2V2ZW50cyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJvdXRpbmUgZm9yIHByb2Nlc3NpbmcgZXZlbnRzIGZyb20gcXVldWUgYnkgY2FsbGluZyB0aGVpcgorICAgICAgICBhc3NvY2lhdGVkIHByb2NjZXNzaW5nIG1ldGhvZCAoYW4gaW5zdGFuY2Ugb2YgUHJvY2Vzc0V2ZW50KS4KKyAgICAgICAgSXQgYWxzbyBkb2VzIGludGVybmFsIHByb2Nlc3NpbmdzLCB0byBrZWVwIHRoZSBzeXN0ZW0gdXBkYXRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIHNlbGYuX2V2ZW50cToKKyAgICAgICAgICAgIHJhd19ldmVudCA9IHNlbGYuX2V2ZW50cS5wb3BsZWZ0KCkgICMgcG9wIG5leHQgZXZlbnQKKyAgICAgICAgICAgIGlmIHNlbGYuX3dhdGNoX21hbmFnZXIuaWdub3JlX2V2ZW50czoKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV2ZW50IGlnbm9yZWQ6ICVzIiAlIHJlcHIocmF3X2V2ZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgd2F0Y2hfID0gc2VsZi5fd2F0Y2hfbWFuYWdlci5nZXRfd2F0Y2gocmF3X2V2ZW50LndkKQorICAgICAgICAgICAgaWYgKHdhdGNoXyBpcyBOb25lKSBhbmQgbm90IChyYXdfZXZlbnQubWFzayAmIElOX1FfT1ZFUkZMT1cpOgorICAgICAgICAgICAgICAgIGlmIG5vdCAocmF3X2V2ZW50Lm1hc2sgJiBJTl9JR05PUkVEKToKKyAgICAgICAgICAgICAgICAgICAgIyBOb3QgcmVhbGx5IHN1cmUgaG93IHdlIGVuZGVkIHVwIGhlcmUsIG5vciBob3cgd2Ugc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICMgaGFuZGxlIHRoZXNlIHR5cGVzIG9mIGV2ZW50cyBhbmQgaWYgaXQgaXMgYXBwcm9wcmlhdGUgdG8KKyAgICAgICAgICAgICAgICAgICAgIyBjb21wbGV0bHkgc2tpcCB0aGVtIChsaWtlIHdlIGFyZSBkb2luZyBoZXJlKS4KKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoIlVuYWJsZSB0byByZXRyaWV2ZSBXYXRjaCBvYmplY3QgYXNzb2NpYXRlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIocmF3X2V2ZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmV2ZW50ID0gc2VsZi5fc3lzX3Byb2NfZnVuKHJhd19ldmVudCkgICMgc3lzdGVtIHByb2Nlc3NpbmdzCisgICAgICAgICAgICBpZiB3YXRjaF8gYW5kIHdhdGNoXy5wcm9jX2Z1bjoKKyAgICAgICAgICAgICAgICB3YXRjaF8ucHJvY19mdW4ocmV2ZW50KSAgIyB1c2VyIHByb2Nlc3NpbmdzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRfcHJvY19mdW4ocmV2ZW50KQorICAgICAgICBzZWxmLl9zeXNfcHJvY19mdW4uY2xlYW51cCgpICAjIHJlbW92ZSBvbGRzIE1PVkVEXyogZXZlbnRzIHJlY29yZHMKKyAgICAgICAgaWYgc2VsZi5fY29hbGVzY2U6CisgICAgICAgICAgICBzZWxmLl9ldmVudHNldC5jbGVhcigpCisKKyAgICBkZWYgX19kYWVtb25pemUoc2VsZiwgcGlkX2ZpbGU9Tm9uZSwgc3RkaW49b3MuZGV2bnVsbCwgc3Rkb3V0PW9zLmRldm51bGwsCisgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1vcy5kZXZudWxsKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSBwaWRfZmlsZTogZmlsZSB3aGVyZSB0aGUgcGlkIHdpbGwgYmUgd3JpdHRlbi4gSWYgcGlkX2ZpbGU9Tm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwaWQgaXMgd3JpdHRlbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgIC92YXIvcnVuLzxzeXMuYXJndlswXXxweWlub3RpZnk+LnBpZCwgaWYgcGlkX2ZpbGU9RmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICBubyBwaWRfZmlsZSBpcyB3cml0dGVuLgorICAgICAgICBAcGFyYW0gc3RkaW46CisgICAgICAgIEBwYXJhbSBzdGRvdXQ6CisgICAgICAgIEBwYXJhbSBzdGRlcnI6IGZpbGVzIGFzc29jaWF0ZWQgdG8gY29tbW9uIHN0cmVhbXMuCisgICAgICAgICIiIgorICAgICAgICBpZiBwaWRfZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgZGlybmFtZSA9ICcvdmFyL3J1bi8nCisgICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pIG9yICdweWlub3RpZnknCisgICAgICAgICAgICBwaWRfZmlsZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSArICcucGlkJykKKworICAgICAgICBpZiBwaWRfZmlsZSAhPSBGYWxzZSBhbmQgb3MucGF0aC5sZXhpc3RzKHBpZF9maWxlKToKKyAgICAgICAgICAgIGVyciA9ICdDYW5ub3QgZGFlbW9uaXplOiBwaWQgZmlsZSAlcyBhbHJlYWR5IGV4aXN0cy4nICUgcGlkX2ZpbGUKKyAgICAgICAgICAgIHJhaXNlIE5vdGlmaWVyRXJyb3IoZXJyKQorCisgICAgICAgIGRlZiBmb3JrX2RhZW1vbigpOgorICAgICAgICAgICAgIyBBZGFwdGVkIGZyb20gQ2hhZCBKLiBTY2hyb2VkZXIncyByZWNpcGUKKyAgICAgICAgICAgICMgQHNlZSBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8yNzg3MzEvCisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIChwaWQgPT0gMCk6CisgICAgICAgICAgICAgICAgIyBwYXJlbnQgMgorICAgICAgICAgICAgICAgIG9zLnNldHNpZCgpCisgICAgICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICAgICAgaWYgKHBpZCA9PSAwKToKKyAgICAgICAgICAgICAgICAgICAgIyBjaGlsZAorICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcignLycpCisgICAgICAgICAgICAgICAgICAgIG9zLnVtYXNrKDAyMikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIHBhcmVudCAyCisgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgcGFyZW50IDEKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgICAgICAgICBmZF9pbnAgPSBvcy5vcGVuKHN0ZGluLCBvcy5PX1JET05MWSkKKyAgICAgICAgICAgIG9zLmR1cDIoZmRfaW5wLCAwKQorICAgICAgICAgICAgZmRfb3V0ID0gb3Mub3BlbihzdGRvdXQsIG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVQsIDA2MDApCisgICAgICAgICAgICBvcy5kdXAyKGZkX291dCwgMSkKKyAgICAgICAgICAgIGZkX2VyciA9IG9zLm9wZW4oc3RkZXJyLCBvcy5PX1dST05MWXxvcy5PX0NSRUFULCAwNjAwKQorICAgICAgICAgICAgb3MuZHVwMihmZF9lcnIsIDIpCisKKyAgICAgICAgIyBEZXRhY2ggdGFzaworICAgICAgICBmb3JrX2RhZW1vbigpCisKKyAgICAgICAgIyBXcml0ZSBwaWQKKyAgICAgICAgaWYgcGlkX2ZpbGUgIT0gRmFsc2U6CisgICAgICAgICAgICBmbGFncyA9IG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVR8b3MuT19OT0ZPTExPV3xvcy5PX0VYQ0wKKyAgICAgICAgICAgIGZkX3BpZCA9IG9zLm9wZW4ocGlkX2ZpbGUsIGZsYWdzLCAwNjAwKQorICAgICAgICAgICAgb3Mud3JpdGUoZmRfcGlkLCBzdHIob3MuZ2V0cGlkKCkpICsgJ1xuJykKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkX3BpZCkKKyAgICAgICAgICAgICMgUmVnaXN0ZXIgdW5saW5rIGZ1bmN0aW9uCisgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhIDogb3MudW5saW5rKHBpZF9maWxlKSkKKworICAgIGRlZiBfc2xlZXAoc2VsZiwgcmVmX3RpbWUpOgorICAgICAgICAjIE9ubHkgY29uc2lkZXIgc2xlZXBpbmcgaWYgcmVhZF9mcmVxIGlzID4gMAorICAgICAgICBpZiBzZWxmLl9yZWFkX2ZyZXEgPiAwOgorICAgICAgICAgICAgY3VyX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgc2xlZXBfYW1vdW50ID0gc2VsZi5fcmVhZF9mcmVxIC0gKGN1cl90aW1lIC0gcmVmX3RpbWUpCisgICAgICAgICAgICBpZiBzbGVlcF9hbW91bnQgPiAwOgorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygnTm93IHNsZWVwaW5nICVkIHNlY29uZHMnLCBzbGVlcF9hbW91bnQpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9hbW91bnQpCisKKyAgICBkZWYgbG9vcChzZWxmLCBjYWxsYmFjaz1Ob25lLCBkYWVtb25pemU9RmFsc2UsICoqYXJncyk6CisgICAgICAgICIiIgorICAgICAgICBFdmVudHMgYXJlIHJlYWQgb25seSBvbmUgdGltZSBldmVyeSBtaW4ocmVhZF9mcmVxLCB0aW1lb3V0KQorICAgICAgICBzZWNvbmRzIGF0IGJlc3QgYW5kIG9ubHkgaWYgdGhlIHNpemUgdG8gcmVhZCBpcyA+PSB0aHJlc2hvbGQuCisgICAgICAgIEFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMgaXQgbXVzdCBub3QgYmUgY2FsbGVkIGFnYWluIGZvciB0aGUgc2FtZQorICAgICAgICBpbnN0YW5jZS4KKworICAgICAgICBAcGFyYW0gY2FsbGJhY2s6IEZ1bmN0b3IgY2FsbGVkIGFmdGVyIGVhY2ggZXZlbnQgcHJvY2Vzc2luZyBpdGVyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0cyB0byByZWNlaXZlIHRoZSBub3RpZmllciBvYmplY3QgKHNlbGYpIGFzIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgVHJ1ZSB0aGUgbG9vcCBpcworICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZWQgb3RoZXJ3aXNlIHRoZSBsb29wIG1ldGhvZCBrZWVwcworICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BpbmcuCisgICAgICAgIEB0eXBlIGNhbGxiYWNrOiBjYWxsYWJsZSBvYmplY3Qgb3IgZnVuY3Rpb24KKyAgICAgICAgQHBhcmFtIGRhZW1vbml6ZTogVGhpcyB0aHJlYWQgaXMgZGFlbW9uaXplZCBpZiBzZXQgdG8gVHJ1ZS4KKyAgICAgICAgQHR5cGUgZGFlbW9uaXplOiBib29sZWFuCisgICAgICAgIEBwYXJhbSBhcmdzOiBPcHRpb25hbCBhbmQgcmVsZXZhbnQgb25seSBpZiBkYWVtb25pemUgaXMgVHJ1ZS4gUmVtYWluaW5nCisgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkZWQgYXJndW1lbnRzIGFyZSBkaXJlY3RseSBwYXNzZWQgdG8gZGFlbW9uaXplIHNlZQorICAgICAgICAgICAgICAgICAgICAgX19kYWVtb25pemUoKSBtZXRob2QuIElmIHBpZF9maWxlPU5vbmUgb3IgaXMgc2V0IHRvIGEKKyAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgcHlpbm90aWZ5Lk5vdGlmaWVyRXJyb3Igd2lsbCBiZSByYWlzZWQuIElmIHBpZF9maWxlPUZhbHNlCisgICAgICAgICAgICAgICAgICAgICBpdCBpcyBzdGlsbCBkYWVtb25pemVkIGJ1dCB0aGUgcGlkIGlzIG5vdCB3cml0dGVuIGluIGFueQorICAgICAgICAgICAgICAgICAgICAgZmlsZS4KKyAgICAgICAgQHR5cGUgYXJnczogdmFyaW91cworICAgICAgICAiIiIKKyAgICAgICAgaWYgZGFlbW9uaXplOgorICAgICAgICAgICAgc2VsZi5fX2RhZW1vbml6ZSgqKmFyZ3MpCisKKyAgICAgICAgIyBSZWFkIGFuZCBwcm9jZXNzIGV2ZW50cyBmb3JldmVyCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2V2ZW50cygpCisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrIGlzIG5vdCBOb25lKSBhbmQgKGNhbGxiYWNrKHNlbGYpIGlzIFRydWUpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJlZl90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICAjIGNoZWNrX2V2ZW50cyBpcyBibG9ja2luZworICAgICAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfZXZlbnRzKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NsZWVwKHJlZl90aW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAjIFN0b3AgbW9uaXRvcmluZyBpZiBzaWdpbnQgaXMgY2F1Z2h0IChDb250cm9sLUMpLgorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygnUHlpbm90aWZ5IHN0b3BzIG1vbml0b3JpbmcuJykKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAjIENsb3NlIGludGVybmFscworICAgICAgICBzZWxmLnN0b3AoKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbG9zZSBpbm90aWZ5J3MgaW5zdGFuY2UgKGNsb3NlIGl0cyBmaWxlIGRlc2NyaXB0b3IpLgorICAgICAgICBJdCBkZXN0cm95cyBhbGwgZXhpc3Rpbmcgd2F0Y2hlcywgcGVuZGluZyBldmVudHMsLi4uCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGF0IHRoZSBlbmQgb2YgbG9vcCgpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcG9sbG9iai51bnJlZ2lzdGVyKHNlbGYuX2ZkKQorICAgICAgICBvcy5jbG9zZShzZWxmLl9mZCkKKyAgICAgICAgc2VsZi5fc3lzX3Byb2NfZnVuID0gTm9uZQorCisKK2NsYXNzIFRocmVhZGVkTm90aWZpZXIodGhyZWFkaW5nLlRocmVhZCwgTm90aWZpZXIpOgorICAgICIiIgorICAgIFRoaXMgbm90aWZpZXIgaW5oZXJpdHMgZnJvbSB0aHJlYWRpbmcuVGhyZWFkIGZvciBpbnN0YW5jaWF0aW5nIGEgc2VwYXJhdGUKKyAgICB0aHJlYWQsIGFuZCBhbHNvIGluaGVyaXRzIGZyb20gTm90aWZpZXIsIGJlY2F1c2UgaXQgaXMgYSB0aHJlYWRlZCBub3RpZmllci4KKworICAgIE5vdGUgdGhhdCBldmVyeSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgaXMgYWxzbyBwcm92aWRlZAorICAgIHRocm91Z2ggTm90aWZpZXIgY2xhc3MuIE1vcmVvdmVyIE5vdGlmaWVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpcnN0IGJlY2F1c2UKKyAgICBpdCBpcyBub3QgdGhyZWFkZWQgYW5kIGNvdWxkIGJlIGVhc2lseSBkYWVtb25pemVkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBkZWZhdWx0X3Byb2NfZnVuPU5vbmUsIHJlYWRfZnJlcT0wLAorICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ9MCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemF0aW9uLCBpbml0aWFsaXplIGJhc2UgY2xhc3Nlcy4gcmVhZF9mcmVxLCB0aHJlc2hvbGQgYW5kCisgICAgICAgIHRpbWVvdXQgcGFyYW1ldGVycyBhcmUgdXNlZCB3aGVuIGxvb3BpbmcuCisKKyAgICAgICAgQHBhcmFtIHdhdGNoX21hbmFnZXI6IFdhdGNoIE1hbmFnZXIuCisgICAgICAgIEB0eXBlIHdhdGNoX21hbmFnZXI6IFdhdGNoTWFuYWdlciBpbnN0YW5jZQorICAgICAgICBAcGFyYW0gZGVmYXVsdF9wcm9jX2Z1bjogRGVmYXVsdCBwcm9jZXNzaW5nIG1ldGhvZC4gU2VlIGJhc2UgY2xhc3MuCisgICAgICAgIEB0eXBlIGRlZmF1bHRfcHJvY19mdW46IGluc3RhbmNlIG9mIFByb2Nlc3NFdmVudAorICAgICAgICBAcGFyYW0gcmVhZF9mcmVxOiBpZiByZWFkX2ZyZXEgPT0gMCwgZXZlbnRzIGFyZSByZWFkIGFzYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlYWRfZnJlcSBpcyA+IDAsIHRoaXMgdGhyZWFkIHNsZWVwcworICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoMCwgcmVhZF9mcmVxIC0gdGltZW91dCkgc2Vjb25kcy4KKyAgICAgICAgQHR5cGUgcmVhZF9mcmVxOiBpbnQKKyAgICAgICAgQHBhcmFtIHRocmVzaG9sZDogRmlsZSBkZXNjcmlwdG9yIHdpbGwgYmUgcmVhZCBvbmx5IGlmIHRoZSBhY2N1bXVsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIHRvIHJlYWQgYmVjb21lcyA+PSB0aHJlc2hvbGQuIElmICE9IDAsIHlvdSBsaWtlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UgaXQgaW4gY29tYmluYXRpb24gd2l0aCBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBzZXQgZm9yIHJlYWRfZnJlcSBiZWNhdXNlIHdpdGhvdXQgdGhhdCB5b3Ugd291bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcCBsb29waW5nIHdpdGhvdXQgcmVhbGx5IHJlYWRpbmcgYW55dGhpbmcgYW5kIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIGFtb3VudCBvZiBldmVudHMgdG8gcmVhZCBpcyA+PSB0aHJlc2hvbGQuIEF0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYXN0IHdpdGggcmVhZF9mcmVxIHlvdSBtaWdodCBzbGVlcC4KKyAgICAgICAgQHR5cGUgdGhyZXNob2xkOiBpbnQKKyAgICAgICAgQHBhcmFtIHRpbWVvdXQ6CisgICAgICAgICAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvc2VsZWN0Lmh0bWwjcG9sbGluZy1vYmplY3RzCisgICAgICAgIEB0eXBlIHRpbWVvdXQ6IGludAorICAgICAgICAiIiIKKyAgICAgICAgIyBJbml0IHRocmVhZGluZyBiYXNlIGNsYXNzCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgIyBTdG9wIGNvbmRpdGlvbgorICAgICAgICBzZWxmLl9zdG9wX2V2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgIyBJbml0IE5vdGlmaWVyIGJhc2UgY2xhc3MKKyAgICAgICAgTm90aWZpZXIuX19pbml0X18oc2VsZiwgd2F0Y2hfbWFuYWdlciwgZGVmYXVsdF9wcm9jX2Z1biwgcmVhZF9mcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIHRpbWVvdXQpCisgICAgICAgICMgQ3JlYXRlIGEgbmV3IHBpcGUgdXNlZCBmb3IgdGhyZWFkIHRlcm1pbmF0aW9uCisgICAgICAgIHNlbGYuX3BpcGUgPSBvcy5waXBlKCkKKyAgICAgICAgc2VsZi5fcG9sbG9iai5yZWdpc3RlcihzZWxmLl9waXBlWzBdLCBzZWxlY3QuUE9MTElOKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTdG9wIG5vdGlmaWVyJ3MgbG9vcC4gU3RvcCBub3RpZmljYXRpb24uIEpvaW4gdGhlIHRocmVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3N0b3BfZXZlbnQuc2V0KCkKKyAgICAgICAgb3Mud3JpdGUoc2VsZi5fcGlwZVsxXSwgJ3N0b3AnKQorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLmpvaW4oc2VsZikKKyAgICAgICAgTm90aWZpZXIuc3RvcChzZWxmKQorICAgICAgICBzZWxmLl9wb2xsb2JqLnVucmVnaXN0ZXIoc2VsZi5fcGlwZVswXSkKKyAgICAgICAgb3MuY2xvc2Uoc2VsZi5fcGlwZVswXSkKKyAgICAgICAgb3MuY2xvc2Uoc2VsZi5fcGlwZVsxXSkKKworICAgIGRlZiBsb29wKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhyZWFkJ3MgbWFpbiBsb29wLiBEb24ndCBtZWFudCB0byBiZSBjYWxsZWQgYnkgdXNlciBkaXJlY3RseS4KKyAgICAgICAgQ2FsbCBpbmhlcml0ZWQgc3RhcnQoKSBtZXRob2QgaW5zdGVhZC4KKworICAgICAgICBFdmVudHMgYXJlIHJlYWQgb25seSBvbmNlIHRpbWUgZXZlcnkgbWluKHJlYWRfZnJlcSwgdGltZW91dCkKKyAgICAgICAgc2Vjb25kcyBhdCBiZXN0IGFuZCBvbmx5IGlmIHRoZSBzaXplIG9mIGV2ZW50cyB0byByZWFkIGlzID49IHRocmVzaG9sZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgV2hlbiB0aGUgbG9vcCBtdXN0IGJlIHRlcm1pbmF0ZWQgLnN0b3AoKSBpcyBjYWxsZWQsICdzdG9wJworICAgICAgICAjIGlzIHdyaXR0ZW4gdG8gcGlwZSBmZCBzbyBwb2xsKCkgcmV0dXJucyBhbmQgLmNoZWNrX2V2ZW50cygpCisgICAgICAgICMgcmV0dXJucyBGYWxzZSB3aGljaCBtYWtlIGV2YWx1YXRlIHRoZSBXaGlsZSdzIHN0b3AgY29uZGl0aW9uCisgICAgICAgICMgLl9zdG9wX2V2ZW50LmlzU2V0KCkgd2ljaCBwdXQgYW4gZW5kIHRvIHRoZSB0aHJlYWQncyBleGVjdXRpb24uCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9zdG9wX2V2ZW50LmlzU2V0KCk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZXZlbnRzKCkKKyAgICAgICAgICAgIHJlZl90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2tfZXZlbnRzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5fc2xlZXAocmVmX3RpbWUpCisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX2V2ZW50cygpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgU3RhcnQgdGhyZWFkJ3MgbG9vcDogcmVhZCBhbmQgcHJvY2VzcyBldmVudHMgdW50aWwgdGhlIG1ldGhvZAorICAgICAgICBzdG9wKCkgaXMgY2FsbGVkLgorICAgICAgICBOZXZlciBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LCBpbnN0ZWFkIGNhbGwgdGhlIHN0YXJ0KCkgbWV0aG9kCisgICAgICAgIGluaGVyaXRlZCBmcm9tIHRocmVhZGluZy5UaHJlYWQsIHdoaWNoIHRoZW4gd2lsbCBjYWxsIHJ1bigpIGluCisgICAgICAgIGl0cyB0dXJuLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5sb29wKCkKKworCitjbGFzcyBBc3luY05vdGlmaWVyKGFzeW5jb3JlLmZpbGVfZGlzcGF0Y2hlciwgTm90aWZpZXIpOgorICAgICIiIgorICAgIFRoaXMgbm90aWZpZXIgaW5oZXJpdHMgZnJvbSBhc3luY29yZS5maWxlX2Rpc3BhdGNoZXIgaW4gb3JkZXIgdG8gYmUgYWJsZSB0bworICAgIHVzZSBweWlub3RpZnkgYWxvbmcgd2l0aCB0aGUgYXN5bmNvcmUgZnJhbWV3b3JrLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhdGNoX21hbmFnZXIsIGRlZmF1bHRfcHJvY19mdW49Tm9uZSwgcmVhZF9mcmVxPTAsCisgICAgICAgICAgICAgICAgIHRocmVzaG9sZD0wLCB0aW1lb3V0PU5vbmUsIGNoYW5uZWxfbWFwPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIGFzeW5jIG5vdGlmaWVyLiBUaGUgb25seSBhZGRpdGlvbmFsIHBhcmFtZXRlciBpcworICAgICAgICAnY2hhbm5lbF9tYXAnIHdoaWNoIGlzIHRoZSBvcHRpb25hbCBhc3luY29yZSBwcml2YXRlIG1hcC4gU2VlCisgICAgICAgIE5vdGlmaWVyIGNsYXNzIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgb3RoZXJzIHBhcmFtZXRlcnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGlmaWVyLl9faW5pdF9fKHNlbGYsIHdhdGNoX21hbmFnZXIsIGRlZmF1bHRfcHJvY19mdW4sIHJlYWRfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLCB0aW1lb3V0KQorICAgICAgICBhc3luY29yZS5maWxlX2Rpc3BhdGNoZXIuX19pbml0X18oc2VsZiwgc2VsZi5fZmQsIGNoYW5uZWxfbWFwKQorCisgICAgZGVmIGhhbmRsZV9yZWFkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgV2hlbiBhc3luY29yZSB0ZWxscyB1cyB3ZSBjYW4gcmVhZCBmcm9tIHRoZSBmZCwgd2UgcHJvY2VlZCBwcm9jZXNzaW5nCisgICAgICAgIGV2ZW50cy4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIGhhbmRsaW5nIGEgbm90aWZpY2F0aW9uCisgICAgICAgIGRpZmZlcmVudGx5LgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzX2V2ZW50cygpCisKKworY2xhc3MgVG9ybmFkb0FzeW5jTm90aWZpZXIoTm90aWZpZXIpOgorICAgICIiIgorICAgIFRvcm5hZG8gaW9sb29wIGFkYXB0ZXIuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2F0Y2hfbWFuYWdlciwgaW9sb29wLCBjYWxsYmFjaz1Ob25lLAorICAgICAgICAgICAgICAgICBkZWZhdWx0X3Byb2NfZnVuPU5vbmUsIHJlYWRfZnJlcT0wLCB0aHJlc2hvbGQ9MCwgdGltZW91dD1Ob25lLAorICAgICAgICAgICAgICAgICBjaGFubmVsX21hcD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIE5vdGUgdGhhdCBpZiBsYXRlciB5b3UgbXVzdCBjYWxsIGlvbG9vcC5jbG9zZSgpIGJlIHN1cmUgdG8gbGV0IHRoZQorICAgICAgICBkZWZhdWx0IHBhcmFtZXRlciB0byBhbGxfZmRzPUZhbHNlLgorCisgICAgICAgIFNlZSBleGFtcGxlIHRvcm5hZG9fbm90aWZpZXIucHkgZm9yIGFuIGV4YW1wbGUgdXNpbmcgdGhpcyBub3RpZmllci4KKworICAgICAgICBAcGFyYW0gaW9sb29wOiBUb3JuYWRvJ3MgSU8gbG9vcC4KKyAgICAgICAgQHR5cGUgaW9sb29wOiB0b3JuYWRvLmlvbG9vcC5JT0xvb3AgaW5zdGFuY2UuCisgICAgICAgIEBwYXJhbSBjYWxsYmFjazogRnVuY3RvciBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGNhbGwgdG8gaGFuZGxlX3JlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSU9Mb29wJ3MgcmVhZCBoYW5kbGVyKS4gRXhwZWN0cyB0byByZWNlaXZlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyIG9iamVjdCAoc2VsZikgYXMgc2luZ2xlIHBhcmFtZXRlci4KKyAgICAgICAgQHR5cGUgY2FsbGJhY2s6IGNhbGxhYmxlIG9iamVjdCBvciBmdW5jdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5pb19sb29wID0gaW9sb29wCisgICAgICAgIHNlbGYuaGFuZGxlX3JlYWRfY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBOb3RpZmllci5fX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBkZWZhdWx0X3Byb2NfZnVuLCByZWFkX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgdGltZW91dCkKKyAgICAgICAgaW9sb29wLmFkZF9oYW5kbGVyKHNlbGYuX2ZkLCBzZWxmLmhhbmRsZV9yZWFkLCBpb2xvb3AuUkVBRCkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBzZWxmLmlvX2xvb3AucmVtb3ZlX2hhbmRsZXIoc2VsZi5fZmQpCisgICAgICAgIE5vdGlmaWVyLnN0b3Aoc2VsZikKKworICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VlIGNvbW1lbnQgaW4gQXN5bmNOb3RpZmllci4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5yZWFkX2V2ZW50cygpCisgICAgICAgIHNlbGYucHJvY2Vzc19ldmVudHMoKQorICAgICAgICBpZiBzZWxmLmhhbmRsZV9yZWFkX2NhbGxiYWNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVhZF9jYWxsYmFjayhzZWxmKQorCisKK2NsYXNzIEFzeW5jaW9Ob3RpZmllcihOb3RpZmllcik6CisgICAgIiIiCisKKyAgICBhc3luY2lvL3Ryb2xsaXVzIGV2ZW50IGxvb3AgYWRhcHRlci4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBsb29wLCBjYWxsYmFjaz1Ob25lLAorICAgICAgICAgICAgICAgICBkZWZhdWx0X3Byb2NfZnVuPU5vbmUsIHJlYWRfZnJlcT0wLCB0aHJlc2hvbGQ9MCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiCisKKyAgICAgICAgU2VlIGV4YW1wbGVzL2FzeW5jaW9fbm90aWZpZXIucHkgZm9yIGFuIGV4YW1wbGUgdXNhZ2UuCisKKyAgICAgICAgQHBhcmFtIGxvb3A6IGFzeW5jaW8gb3IgdHJvbGxpdXMgZXZlbnQgbG9vcCBpbnN0YW5jZS4KKyAgICAgICAgQHR5cGUgbG9vcDogYXN5bmNpby5CYXNlRXZlbnRMb29wIG9yIHRyb2xsaXVzLkJhc2VFdmVudExvb3AgaW5zdGFuY2UuCisgICAgICAgIEBwYXJhbSBjYWxsYmFjazogRnVuY3RvciBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGNhbGwgdG8gaGFuZGxlX3JlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0cyB0byByZWNlaXZlIHRoZSBub3RpZmllciBvYmplY3QgKHNlbGYpIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIHBhcmFtZXRlci4KKyAgICAgICAgQHR5cGUgY2FsbGJhY2s6IGNhbGxhYmxlIG9iamVjdCBvciBmdW5jdGlvbgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxvb3AgPSBsb29wCisgICAgICAgIHNlbGYuaGFuZGxlX3JlYWRfY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBOb3RpZmllci5fX2luaXRfXyhzZWxmLCB3YXRjaF9tYW5hZ2VyLCBkZWZhdWx0X3Byb2NfZnVuLCByZWFkX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgdGltZW91dCkKKyAgICAgICAgbG9vcC5hZGRfcmVhZGVyKHNlbGYuX2ZkLCBzZWxmLmhhbmRsZV9yZWFkKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYubG9vcC5yZW1vdmVfcmVhZGVyKHNlbGYuX2ZkKQorICAgICAgICBOb3RpZmllci5zdG9wKHNlbGYpCisKKyAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5yZWFkX2V2ZW50cygpCisgICAgICAgIHNlbGYucHJvY2Vzc19ldmVudHMoKQorICAgICAgICBpZiBzZWxmLmhhbmRsZV9yZWFkX2NhbGxiYWNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVhZF9jYWxsYmFjayhzZWxmKQorCisKK2NsYXNzIFdhdGNoOgorICAgICIiIgorICAgIFJlcHJlc2VudCBhIHdhdGNoLCBpLmUuIGEgZmlsZSBvciBkaXJlY3RvcnkgYmVpbmcgd2F0Y2hlZC4KKworICAgICIiIgorICAgIF9fc2xvdHNfXyA9ICgnd2QnLCAncGF0aCcsICdtYXNrJywgJ3Byb2NfZnVuJywgJ2F1dG9fYWRkJywKKyAgICAgICAgICAgICAgICAgJ2V4Y2x1ZGVfZmlsdGVyJywgJ2RpcicpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2QsIHBhdGgsIG1hc2ssIHByb2NfZnVuLCBhdXRvX2FkZCwgZXhjbHVkZV9maWx0ZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6YXRpb25zLgorCisgICAgICAgIEBwYXJhbSB3ZDogV2F0Y2ggZGVzY3JpcHRvci4KKyAgICAgICAgQHR5cGUgd2Q6IGludAorICAgICAgICBAcGFyYW0gcGF0aDogUGF0aCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgYmVpbmcgd2F0Y2hlZC4KKyAgICAgICAgQHR5cGUgcGF0aDogc3RyCisgICAgICAgIEBwYXJhbSBtYXNrOiBNYXNrLgorICAgICAgICBAdHlwZSBtYXNrOiBpbnQKKyAgICAgICAgQHBhcmFtIHByb2NfZnVuOiBQcm9jZXNzaW5nIGNhbGxhYmxlIG9iamVjdC4KKyAgICAgICAgQHR5cGUgcHJvY19mdW46CisgICAgICAgIEBwYXJhbSBhdXRvX2FkZDogQXV0b21hdGljYWxseSBhZGQgd2F0Y2hlcyBvbiBuZXcgZGlyZWN0b3JpZXMuCisgICAgICAgIEB0eXBlIGF1dG9fYWRkOiBib29sCisgICAgICAgIEBwYXJhbSBleGNsdWRlX2ZpbHRlcjogQm9vbGVhbiBmdW5jdGlvbiwgdXNlZCB0byBleGNsdWRlIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGZyb20gYmVpbmcgYXV0b21hdGljYWxseSB3YXRjaGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBXYXRjaE1hbmFnZXIuX19pbml0X18KKyAgICAgICAgQHR5cGUgZXhjbHVkZV9maWx0ZXI6IGNhbGxhYmxlIG9iamVjdAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53ZCA9IHdkCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5tYXNrID0gbWFzaworICAgICAgICBzZWxmLnByb2NfZnVuID0gcHJvY19mdW4KKyAgICAgICAgc2VsZi5hdXRvX2FkZCA9IGF1dG9fYWRkCisgICAgICAgIHNlbGYuZXhjbHVkZV9maWx0ZXIgPSBleGNsdWRlX2ZpbHRlcgorICAgICAgICBzZWxmLmRpciA9IG9zLnBhdGguaXNkaXIoc2VsZi5wYXRoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQHJldHVybjogU3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICAgICBAcnR5cGU6IHN0cgorICAgICAgICAiIiIKKyAgICAgICAgcyA9ICcgJy5qb2luKFsnJXMlcyVzJyAlIChvdXRwdXRfZm9ybWF0LmZpZWxkX25hbWUoYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Zvcm1hdC5wdW5jdHVhdGlvbignPScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQuZmllbGRfdmFsdWUoZ2V0YXR0cihzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyKSkpIFwKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXyBpZiBub3QgYXR0ci5zdGFydHN3aXRoKCdfJyldKQorCisgICAgICAgIHMgPSAnJXMlcyAlcyAlcycgJSAob3V0cHV0X2Zvcm1hdC5wdW5jdHVhdGlvbignPCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQuY2xhc3NfbmFtZShzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZm9ybWF0LnB1bmN0dWF0aW9uKCc+JykpCisgICAgICAgIHJldHVybiBzCisKKworY2xhc3MgRXhjbHVkZUZpbHRlcjoKKyAgICAiIiIKKyAgICBFeGNsdWRlRmlsdGVyIGlzIGFuIGV4Y2x1c2lvbiBmaWx0ZXIuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnX2xzdCk6CisgICAgICAgICIiIgorICAgICAgICBFeGFtcGxlczoKKyAgICAgICAgICBlZjEgPSBFeGNsdWRlRmlsdGVyKFsiL2V0Yy9yYy4qIiwgIi9ldGMvaG9zdG5hbWUiXSkKKyAgICAgICAgICBlZjIgPSBFeGNsdWRlRmlsdGVyKCIvbXkvcGF0aC9leGNsdWRlLmxzdCIpCisgICAgICAgICAgV2hlcmUgZXhjbHVkZS5sc3QgY29udGFpbnM6CisgICAgICAgICAgL2V0Yy9yYy4qCisgICAgICAgICAgL2V0Yy9ob3N0bmFtZQorCisgICAgICAgIE5vdGU6IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBleGNsdWRlIGEgZmlsZSBpZiBpdHMgZW5jYXBzdWxhdGluZworICAgICAgICAgICAgICBkaXJlY3RvcnkgaXMgaXRzZWxmIHdhdGNoZWQuIFNlZSB0aGlzIGlzc3VlIGZvciBtb3JlIGRldGFpbHMKKyAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3NlYi1tL3B5aW5vdGlmeS9pc3N1ZXMvMzEKKworICAgICAgICBAcGFyYW0gYXJnX2xzdDogaXMgZWl0aGVyIGEgbGlzdCBvZiBwYXR0ZXJucyBvciBhIGZpbGVuYW1lIGZyb20gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zIHdpbGwgYmUgbG9hZGVkLgorICAgICAgICBAdHlwZSBhcmdfbHN0OiBsaXN0IG9mIHN0ciBvciBzdHIKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnX2xzdCwgc3RyKToKKyAgICAgICAgICAgIGxzdCA9IHNlbGYuX2xvYWRfcGF0dGVybnNfZnJvbV9maWxlKGFyZ19sc3QpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmdfbHN0LCBsaXN0KToKKyAgICAgICAgICAgIGxzdCA9IGFyZ19sc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorCisgICAgICAgIHNlbGYuX2xyZWdleCA9IFtdCisgICAgICAgIGZvciByZWdleCBpbiBsc3Q6CisgICAgICAgICAgICBzZWxmLl9scmVnZXguYXBwZW5kKHJlLmNvbXBpbGUocmVnZXgsIHJlLlVOSUNPREUpKQorCisgICAgZGVmIF9sb2FkX3BhdHRlcm5zX2Zyb21fZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGxzdCA9IFtdCisgICAgICAgIGZpbGVfb2JqID0gZmlsZShmaWxlbmFtZSwgJ3InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmaWxlX29iai5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICAjIFRyaW0gbGVhZGluZyBhbiB0cmFpbGluZyB3aGl0ZXNwYWNlcworICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgcGF0dGVybiBvciBwYXR0ZXJuLnN0YXJ0c3dpdGgoJyMnKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBsc3QuYXBwZW5kKHBhdHRlcm4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlX29iai5jbG9zZSgpCisgICAgICAgIHJldHVybiBsc3QKKworICAgIGRlZiBfbWF0Y2goc2VsZiwgcmVnZXgsIHBhdGgpOgorICAgICAgICByZXR1cm4gcmVnZXgubWF0Y2gocGF0aCkgaXMgbm90IE5vbmUKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSBwYXRoOiBQYXRoIHRvIG1hdGNoIGFnYWluc3QgcHJvdmlkZWQgcmVnZXhwcy4KKyAgICAgICAgQHR5cGUgcGF0aDogc3RyCisgICAgICAgIEByZXR1cm46IFJldHVybiBUcnVlIGlmIHBhdGggaGFzIGJlZW4gbWF0Y2hlZCBhbmQgc2hvdWxkCisgICAgICAgICAgICAgICAgIGJlIGV4Y2x1ZGVkLCBGYWxzZSBvdGhlcndpc2UuCisgICAgICAgIEBydHlwZTogYm9vbAorICAgICAgICAiIiIKKyAgICAgICAgZm9yIHJlZ2V4IGluIHNlbGYuX2xyZWdleDoKKyAgICAgICAgICAgIGlmIHNlbGYuX21hdGNoKHJlZ2V4LCBwYXRoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBXYXRjaE1hbmFnZXJFcnJvcihFeGNlcHRpb24pOgorICAgICIiIgorICAgIFdhdGNoTWFuYWdlciBFeGNlcHRpb24uIFJhaXNlZCBvbiBlcnJvciBlbmNvdW50ZXJlZCBvbiB3YXRjaGVzCisgICAgb3BlcmF0aW9ucy4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIHdtZCk6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gbXNnOiBFeGNlcHRpb24gc3RyaW5nJ3MgZGVzY3JpcHRpb24uCisgICAgICAgIEB0eXBlIG1zZzogc3RyaW5nCisgICAgICAgIEBwYXJhbSB3bWQ6IFRoaXMgZGljdGlvbmFyeSBjb250YWlucyB0aGUgd2QgYXNzaWduZWQgdG8gcGF0aHMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIHNhbWUgY2FsbCBmb3Igd2hpY2ggd2F0Y2hlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBhZGRlZC4KKyAgICAgICAgQHR5cGUgd21kOiBkaWN0CisgICAgICAgICIiIgorICAgICAgICBzZWxmLndtZCA9IHdtZAorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorCisKK2NsYXNzIFdhdGNoTWFuYWdlcjoKKyAgICAiIiIKKyAgICBQcm92aWRlIG9wZXJhdGlvbnMgZm9yIHdhdGNoaW5nIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gSXRzIGludGVybmFsCisgICAgZGljdGlvbmFyeSBpcyB1c2VkIHRvIHJlZmVyZW5jZSB3YXRjaGVkIGl0ZW1zLiBXaGVuIHVzZWQgaW5zaWRlCisgICAgdGhyZWFkZWQgY29kZSwgb25lIG11c3QgaW5zdGFuY2lhdGUgYXMgbWFueSBXYXRjaE1hbmFnZXIgaW5zdGFuY2VzIGFzCisgICAgdGhlcmUgYXJlIFRocmVhZGVkTm90aWZpZXIgaW5zdGFuY2VzLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4Y2x1ZGVfZmlsdGVyPWxhbWJkYSBwYXRoOiBGYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXphdGlvbjogaW5pdCBpbm90aWZ5LCBpbml0IHdhdGNoIG1hbmFnZXIgZGljdGlvbmFyeS4KKyAgICAgICAgUmFpc2UgT1NFcnJvciBpZiBpbml0aWFsaXphdGlvbiBmYWlscywgcmFpc2UgSW5vdGlmeUJpbmRpbmdOb3RGb3VuZEVycm9yCisgICAgICAgIGlmIG5vIGlub3RpZnkgYmluZGluZyB3YXMgZm91bmQgKHRocm91Z2ggY3R5cGVzIG9yIGZyb20gZGlyZWN0IGFjY2VzcyB0bworICAgICAgICBzeXNjYWxscykuCisKKyAgICAgICAgQHBhcmFtIGV4Y2x1ZGVfZmlsdGVyOiBib29sZWFuIGZ1bmN0aW9uLCByZXR1cm5zIFRydWUgaWYgY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggbXVzdCBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIHdhdGNoZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVuaWVudCBmb3IgcHJvdmlkaW5nIGEgY29tbW9uIGV4Y2x1c2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBmb3IgZXZlcnkgY2FsbCB0byBhZGRfd2F0Y2guCisgICAgICAgIEB0eXBlIGV4Y2x1ZGVfZmlsdGVyOiBjYWxsYWJsZSBvYmplY3QKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2lnbm9yZV9ldmVudHMgPSBGYWxzZQorICAgICAgICBzZWxmLl9leGNsdWRlX2ZpbHRlciA9IGV4Y2x1ZGVfZmlsdGVyCisgICAgICAgIHNlbGYuX3dtZCA9IHt9ICAjIHdhdGNoIGRpY3Qga2V5OiB3YXRjaCBkZXNjcmlwdG9yLCB2YWx1ZTogd2F0Y2gKKworICAgICAgICBzZWxmLl9pbm90aWZ5X3dyYXBwZXIgPSBJTm90aWZ5V3JhcHBlci5jcmVhdGUoKQorICAgICAgICBpZiBzZWxmLl9pbm90aWZ5X3dyYXBwZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIElub3RpZnlCaW5kaW5nTm90Rm91bmRFcnJvcigpCisKKyAgICAgICAgc2VsZi5fZmQgPSBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuaW5vdGlmeV9pbml0KCkgIyBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgaWYgc2VsZi5fZmQgPCAwOgorICAgICAgICAgICAgZXJyID0gJ0Nhbm5vdCBpbml0aWFsaXplIG5ldyBpbnN0YW5jZSBvZiBpbm90aWZ5LCAlcycKKyAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoZXJyICUgc2VsZi5faW5vdGlmeV93cmFwcGVyLnN0cl9lcnJubygpKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2xvc2UgaW5vdGlmeSdzIGZpbGUgZGVzY3JpcHRvciwgdGhpcyBhY3Rpb24gd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgcmVtb3ZlIChpLmUuIHN0b3Agd2F0Y2hpbmcpIGFsbCBpdHMgYXNzb2NpYXRlZCB3YXRjaCBkZXNjcmlwdG9ycy4KKyAgICAgICAgQWZ0ZXIgYSBjYWxsIHRvIHRoaXMgbWV0aG9kIHRoZSBXYXRjaE1hbmFnZXIncyBpbnN0YW5jZSBiZWNvbWUgdXNlbGVzcworICAgICAgICBhbmQgY2Fubm90IGJlIHJldXNlZCwgYSBuZXcgaW5zdGFuY2UgbXVzdCB0aGVuIGJlIGluc3RhbmNpYXRlZC4gSXQKKyAgICAgICAgbWFrZXMgc2Vuc2UgdG8gY2FsbCB0aGlzIG1ldGhvZCBpbiBmZXcgc2l0dWF0aW9ucyBmb3IgaW5zdGFuY2UgaWYKKyAgICAgICAgc2V2ZXJhbCBpbmRlcGVuZGFudCBXYXRjaE1hbmFnZXIgbXVzdCBiZSBpbnN0YW5jaWF0ZWQgb3IgaWYgYWxsIHdhdGNoZXMKKyAgICAgICAgbXVzdCBiZSByZW1vdmVkIGFuZCBubyBvdGhlciB3YXRjaGVzIG5lZWQgdG8gYmUgYWRkZWQuCisgICAgICAgICIiIgorICAgICAgICBvcy5jbG9zZShzZWxmLl9mZCkKKworICAgIGRlZiBnZXRfZmQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYXNzaWduZWQgaW5vdGlmeSdzIGZpbGUgZGVzY3JpcHRvci4KKworICAgICAgICBAcmV0dXJuOiBGaWxlIGRlc2NyaXB0b3IuCisgICAgICAgIEBydHlwZTogaW50CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmQKKworICAgIGRlZiBnZXRfd2F0Y2goc2VsZiwgd2QpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHdhdGNoIGZyb20gcHJvdmlkZWQgd2F0Y2ggZGVzY3JpcHRvciB3ZC4KKworICAgICAgICBAcGFyYW0gd2Q6IFdhdGNoIGRlc2NyaXB0b3IuCisgICAgICAgIEB0eXBlIHdkOiBpbnQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl93bWQuZ2V0KHdkKQorCisgICAgZGVmIGRlbF93YXRjaChzZWxmLCB3ZCk6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgd2F0Y2ggZW50cnkgYXNzb2NpYXRlZCB0byB3YXRjaCBkZXNjcmlwdG9yIHdkLgorCisgICAgICAgIEBwYXJhbSB3ZDogV2F0Y2ggZGVzY3JpcHRvci4KKyAgICAgICAgQHR5cGUgd2Q6IGludAorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuX3dtZFt3ZF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlcnI6CisgICAgICAgICAgICBsb2cuZXJyb3IoJ0Nhbm5vdCBkZWxldGUgdW5rbm93biB3YXRjaCBkZXNjcmlwdG9yICVzJyAlIHN0cihlcnIpKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHdhdGNoZXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYSByZWZlcmVuY2Ugb24gdGhlIGludGVybmFsIHdhdGNoIG1hbmFnZXIgZGljdGlvbmFyeS4KKworICAgICAgICBAcmV0dXJuOiBJbnRlcm5hbCB3YXRjaCBtYW5hZ2VyIGRpY3Rpb25hcnkuCisgICAgICAgIEBydHlwZTogZGljdAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3dtZAorCisgICAgZGVmIF9fZm9ybWF0X3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIgorICAgICAgICBGb3JtYXQgcGF0aCB0byBpdHMgaW50ZXJuYWwgKHN0b3JlZCBpbiB3YXRjaCBtYW5hZ2VyKSByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgICMgVW5pY29kZSBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgYmFjayB0byBzdHJpbmdzLCBiZWNhdXNlIGl0IHNlZW1zCisgICAgICAgICMgdGhhdCBpbm90aWZ5X2FkZF93YXRjaCBmcm9tIGN0eXBlcyBkb2VzIG5vdCB3b3JrIHdlbGwgd2hlbgorICAgICAgICAjIGl0IHJlY2VpdmVzIGFuIGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIgaW5zdGFuY2UgYXMgYXJndW1lbnQuCisgICAgICAgICMgVGhlcmVmb3JlIGV2ZW4gd2QgYXJlIGluZGV4ZWQgd2l0aCBieXRlcyBzdHJpbmcgYW5kIG5vdCB3aXRoCisgICAgICAgICMgdW5pY29kZSBwYXRocy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCB1bmljb2RlKToKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCisgICAgICAgIHJldHVybiBvcy5wYXRoLm5vcm1wYXRoKHBhdGgpCisKKyAgICBkZWYgX19hZGRfd2F0Y2goc2VsZiwgcGF0aCwgbWFzaywgcHJvY19mdW4sIGF1dG9fYWRkLCBleGNsdWRlX2ZpbHRlcik6CisgICAgICAgICIiIgorICAgICAgICBBZGQgYSB3YXRjaCBvbiBwYXRoLCBidWlsZCBhIFdhdGNoIG9iamVjdCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorICAgICAgICB3YXRjaCBtYW5hZ2VyIGRpY3Rpb25hcnkuIFJldHVybiB0aGUgd2QgdmFsdWUuCisgICAgICAgICIiIgorICAgICAgICBwYXRoID0gc2VsZi5fX2Zvcm1hdF9wYXRoKHBhdGgpCisgICAgICAgIGlmIGF1dG9fYWRkIGFuZCBub3QgbWFzayAmIElOX0NSRUFURToKKyAgICAgICAgICAgIG1hc2sgfD0gSU5fQ1JFQVRFCisgICAgICAgIHdkID0gc2VsZi5faW5vdGlmeV93cmFwcGVyLmlub3RpZnlfYWRkX3dhdGNoKHNlbGYuX2ZkLCBwYXRoLCBtYXNrKQorICAgICAgICBpZiB3ZCA8IDA6CisgICAgICAgICAgICByZXR1cm4gd2QKKyAgICAgICAgd2F0Y2ggPSBXYXRjaCh3ZD13ZCwgcGF0aD1wYXRoLCBtYXNrPW1hc2ssIHByb2NfZnVuPXByb2NfZnVuLAorICAgICAgICAgICAgICAgICAgICAgIGF1dG9fYWRkPWF1dG9fYWRkLCBleGNsdWRlX2ZpbHRlcj1leGNsdWRlX2ZpbHRlcikKKyAgICAgICAgc2VsZi5fd21kW3dkXSA9IHdhdGNoCisgICAgICAgIGxvZy5kZWJ1ZygnTmV3ICVzJywgd2F0Y2gpCisgICAgICAgIHJldHVybiB3ZAorCisgICAgZGVmIF9fZ2xvYihzZWxmLCBwYXRoLCBkb19nbG9iKToKKyAgICAgICAgaWYgZG9fZ2xvYjoKKyAgICAgICAgICAgIHJldHVybiBnbG9iKHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW3BhdGhdCisKKyAgICBkZWYgYWRkX3dhdGNoKHNlbGYsIHBhdGgsIG1hc2ssIHByb2NfZnVuPU5vbmUsIHJlYz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgIGF1dG9fYWRkPUZhbHNlLCBkb19nbG9iPUZhbHNlLCBxdWlldD1UcnVlLAorICAgICAgICAgICAgICAgICAgZXhjbHVkZV9maWx0ZXI9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBBZGQgd2F0Y2gocykgb24gdGhlIHByb3ZpZGVkIHxwYXRofChzKSB3aXRoIGFzc29jaWF0ZWQgfG1hc2t8IGZsYWcKKyAgICAgICAgdmFsdWUgYW5kIG9wdGlvbmFsbHkgd2l0aCBhIHByb2Nlc3NpbmcgfHByb2NfZnVufCBmdW5jdGlvbiBhbmQKKyAgICAgICAgcmVjdXJzaXZlIGZsYWcgfHJlY3wgc2V0IHRvIFRydWUuCisgICAgICAgIElkZWFsbHkgfHBhdGh8IGNvbXBvbmVudHMgc2hvdWxkIG5vdCBiZSB1bmljb2RlIG9iamVjdHMuIE5vdGUgdGhhdAorICAgICAgICBhbHRob3VnaCB1bmljb2RlIHBhdGhzIGFyZSBhY2NlcHRlZCB0aGVyZSBhcmUgY29udmVydGVkIHRvIGJ5dGUKKyAgICAgICAgc3RyaW5ncyBiZWZvcmUgYSB3YXRjaCBpcyBwdXQgb24gdGhhdCBwYXRoLiBUaGUgZW5jb2RpbmcgdXNlZCBmb3IKKyAgICAgICAgY29udmVydGluZyB0aGUgdW5pY29kZSBvYmplY3QgaXMgZ2l2ZW4gYnkgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpLgorICAgICAgICBJZiB8cGF0aHwgc2kgYWxyZWFkeSB3YXRjaGVkIGl0IGlzIGlnbm9yZWQsIGJ1dCBpZiBpdCBpcyBjYWxsZWQgd2l0aAorICAgICAgICBvcHRpb24gcmVjPVRydWUgYSB3YXRjaCBpcyBwdXQgb24gZWFjaCBvbmUgb2YgaXRzIG5vdC13YXRjaGVkCisgICAgICAgIHN1YmRpcmVjdG9yeS4KKworICAgICAgICBAcGFyYW0gcGF0aDogUGF0aCB0byB3YXRjaCwgdGhlIHBhdGggY2FuIGVpdGhlciBiZSBhIGZpbGUgb3IgYQorICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LiBBbHNvIGFjY2VwdHMgYSBzZXF1ZW5jZSAobGlzdCkgb2YgcGF0aHMuCisgICAgICAgIEB0eXBlIHBhdGg6IHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MKKyAgICAgICAgQHBhcmFtIG1hc2s6IEJpdG1hc2sgb2YgZXZlbnRzLgorICAgICAgICBAdHlwZSBtYXNrOiBpbnQKKyAgICAgICAgQHBhcmFtIHByb2NfZnVuOiBQcm9jZXNzaW5nIG9iamVjdC4KKyAgICAgICAgQHR5cGUgcHJvY19mdW46IGZ1bmN0aW9uIG9yIFByb2Nlc3NFdmVudCBpbnN0YW5jZSBvciBpbnN0YW5jZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mIGl0cyBzdWJjbGFzc2VzIG9yIGNhbGxhYmxlIG9iamVjdC4KKyAgICAgICAgQHBhcmFtIHJlYzogUmVjdXJzaXZlbHkgYWRkIHdhdGNoZXMgZnJvbSBwYXRoIG9uIGFsbCBpdHMKKyAgICAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3JpZXMsIHNldCB0byBGYWxzZSBieSBkZWZhdWx0IChkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgIGZvbGxvd3Mgc3ltbGlua3MgaW4gYW55IGNhc2UpLgorICAgICAgICBAdHlwZSByZWM6IGJvb2wKKyAgICAgICAgQHBhcmFtIGF1dG9fYWRkOiBBdXRvbWF0aWNhbGx5IGFkZCB3YXRjaGVzIG9uIG5ld2x5IGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBpbiB3YXRjaGVkIHBhcmVudCB8cGF0aHwgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgIElmIHxhdXRvX2FkZHwgaXMgVHJ1ZSwgSU5fQ1JFQVRFIGlzIG9yZWQgd2l0aCB8bWFza3wKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB3YXRjaCBpcyBhZGRlZC4KKyAgICAgICAgQHR5cGUgYXV0b19hZGQ6IGJvb2wKKyAgICAgICAgQHBhcmFtIGRvX2dsb2I6IERvIGdsb2JiaW5nIG9uIHBhdGhuYW1lIChzZWUgc3RhbmRhcmQgZ2xvYmJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbnMpLgorICAgICAgICBAdHlwZSBkb19nbG9iOiBib29sCisgICAgICAgIEBwYXJhbSBxdWlldDogaWYgRmFsc2UgcmFpc2VzIGEgV2F0Y2hNYW5hZ2VyRXJyb3IgZXhjZXB0aW9uIG9uCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuIFNlZSBleGFtcGxlIG5vdF9xdWlldC5weS4KKyAgICAgICAgQHR5cGUgcXVpZXQ6IGJvb2wKKyAgICAgICAgQHBhcmFtIGV4Y2x1ZGVfZmlsdGVyOiBwcmVkaWNhdGUgKGJvb2xlYW4gZnVuY3Rpb24pLCB3aGljaCByZXR1cm5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgY3VycmVudCBwYXRoIG11c3QgYmUgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGJlaW5nIHdhdGNoZWQuIFRoaXMgYXJndW1lbnQgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZSBvdmVyIGV4Y2x1ZGVfZmlsdGVyIHBhc3NlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcycgY29uc3RydWN0b3IuCisgICAgICAgIEB0eXBlIGV4Y2x1ZGVfZmlsdGVyOiBjYWxsYWJsZSBvYmplY3QKKyAgICAgICAgQHJldHVybjogZGljdCBvZiBwYXRocyBhc3NvY2lhdGVkIHRvIHdhdGNoIGRlc2NyaXB0b3JzLiBBIHdkIHZhbHVlCisgICAgICAgICAgICAgICAgIGlzIHBvc2l0aXZlIGlmIHRoZSB3YXRjaCB3YXMgYWRkZWQgc3VjZXNzZnVsbHksCisgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuIElmIHRoZSBwYXRoIHdhcyBpbnZhbGlkCisgICAgICAgICAgICAgICAgIG9yIHdhcyBhbHJlYWR5IHdhdGNoZWQgaXQgaXMgbm90IGluY2x1ZGVkIGludG8gdGhpcyByZXR1cm5lZAorICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LgorICAgICAgICBAcnR5cGU6IGRpY3Qgb2Yge3N0cjogaW50fQorICAgICAgICAiIiIKKyAgICAgICAgcmV0XyA9IHt9ICMgcmV0dXJuIHtwYXRoOiB3ZCwgLi4ufQorCisgICAgICAgIGlmIGV4Y2x1ZGVfZmlsdGVyIGlzIE5vbmU6CisgICAgICAgICAgICBleGNsdWRlX2ZpbHRlciA9IHNlbGYuX2V4Y2x1ZGVfZmlsdGVyCisKKyAgICAgICAgIyBub3JtYWxpemUgYXJncyBhcyBsaXN0IGVsZW1lbnRzCisgICAgICAgIGZvciBucGF0aCBpbiBzZWxmLl9fZm9ybWF0X3BhcmFtKHBhdGgpOgorICAgICAgICAgICAgIyB1bml4IHBhdGhuYW1lIHBhdHRlcm4gZXhwYW5zaW9uCisgICAgICAgICAgICBmb3IgYXBhdGggaW4gc2VsZi5fX2dsb2IobnBhdGgsIGRvX2dsb2IpOgorICAgICAgICAgICAgICAgICMgcmVjdXJzaXZlbHkgbGlzdCBzdWJkaXJzIGFjY29yZGluZyB0byByZWMgcGFyYW0KKyAgICAgICAgICAgICAgICBmb3IgcnBhdGggaW4gc2VsZi5fX3dhbGtfcmVjKGFwYXRoLCByZWMpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXhjbHVkZV9maWx0ZXIocnBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgd2QgPSByZXRfW3JwYXRoXSA9IHNlbGYuX19hZGRfd2F0Y2gocnBhdGgsIG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2Z1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fYWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9maWx0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3ZCA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gKCdhZGRfd2F0Y2g6IGNhbm5vdCB3YXRjaCAlcyBXRD0lZCwgJXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJwYXRoLCB3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuc3RyX2Vycm5vKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHF1aWV0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFdhdGNoTWFuYWdlckVycm9yKGVyciwgcmV0XykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTGV0J3Mgc2F5IC0yIG1lYW5zICdleHBsaWNpdGVseSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgIyBmcm9tIHdhdGNoaW5nJy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF9bcnBhdGhdID0gLTIKKyAgICAgICAgcmV0dXJuIHJldF8KKworICAgIGRlZiBfX2dldF9zdWJfcmVjKHNlbGYsIGxwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBldmVyeSB3ZCBmcm9tIHNlbGYuX3dtZCBpZiBpdHMgcGF0aCBpcyB1bmRlciB0aGUgcGF0aCBvZgorICAgICAgICBvbmUgKGF0IGxlYXN0KSBvZiB0aG9zZSBpbiBscGF0aC4gRG9lc24ndCBmb2xsb3cgc3ltbGlua3MuCisKKyAgICAgICAgQHBhcmFtIGxwYXRoOiBsaXN0IG9mIHdhdGNoIGRlc2NyaXB0b3IKKyAgICAgICAgQHR5cGUgbHBhdGg6IGxpc3Qgb2YgaW50CisgICAgICAgIEByZXR1cm46IGxpc3Qgb2Ygd2F0Y2ggZGVzY3JpcHRvcgorICAgICAgICBAcnR5cGU6IGxpc3Qgb2YgaW50CisgICAgICAgICIiIgorICAgICAgICBmb3IgZCBpbiBscGF0aDoKKyAgICAgICAgICAgIHJvb3QgPSBzZWxmLmdldF9wYXRoKGQpCisgICAgICAgICAgICBpZiByb290IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgYWx3YXlzIGtlZXAgcm9vdAorICAgICAgICAgICAgICAgIHlpZWxkIGQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBpZiBpbnZhbGlkCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBub3RoaW5nIGVsc2UgdG8gZXhwZWN0CisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihyb290KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIG5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgIHJvb3QgPSBvcy5wYXRoLm5vcm1wYXRoKHJvb3QpCisgICAgICAgICAgICAjIHJlY3Vyc2lvbgorICAgICAgICAgICAgbGVuZCA9IGxlbihyb290KQorICAgICAgICAgICAgZm9yIGl3ZCBpbiBzZWxmLl93bWQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBjdXIgPSBpd2RbMV0ucGF0aAorICAgICAgICAgICAgICAgIHByZWYgPSBvcy5wYXRoLmNvbW1vbnByZWZpeChbcm9vdCwgY3VyXSkKKyAgICAgICAgICAgICAgICBpZiByb290ID09IG9zLnNlcCBvciAobGVuKHByZWYpID09IGxlbmQgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGN1cikgPiBsZW5kIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cltsZW5kXSA9PSBvcy5zZXApOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBpd2RbMV0ud2QKKworICAgIGRlZiB1cGRhdGVfd2F0Y2goc2VsZiwgd2QsIG1hc2s9Tm9uZSwgcHJvY19mdW49Tm9uZSwgcmVjPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgYXV0b19hZGQ9RmFsc2UsIHF1aWV0PVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgVXBkYXRlIGV4aXN0aW5nIHdhdGNoIGRlc2NyaXB0b3JzIHx3ZHwuIFRoZSB8bWFza3wgdmFsdWUsIHRoZQorICAgICAgICBwcm9jZXNzaW5nIG9iamVjdCB8cHJvY19mdW58LCB0aGUgcmVjdXJzaXZlIHBhcmFtIHxyZWN8IGFuZCB0aGUKKyAgICAgICAgfGF1dG9fYWRkfCBhbmQgfHF1aWV0fCBmbGFncyBjYW4gYWxsIGJlIHVwZGF0ZWQuCisKKyAgICAgICAgQHBhcmFtIHdkOiBXYXRjaCBEZXNjcmlwdG9yIHRvIHVwZGF0ZS4gQWxzbyBhY2NlcHRzIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgIHdhdGNoIGRlc2NyaXB0b3JzLgorICAgICAgICBAdHlwZSB3ZDogaW50IG9yIGxpc3Qgb2YgaW50CisgICAgICAgIEBwYXJhbSBtYXNrOiBPcHRpb25hbCBuZXcgYml0bWFzayBvZiBldmVudHMuCisgICAgICAgIEB0eXBlIG1hc2s6IGludAorICAgICAgICBAcGFyYW0gcHJvY19mdW46IE9wdGlvbmFsIG5ldyBwcm9jZXNzaW5nIGZ1bmN0aW9uLgorICAgICAgICBAdHlwZSBwcm9jX2Z1bjogZnVuY3Rpb24gb3IgUHJvY2Vzc0V2ZW50IGluc3RhbmNlIG9yIGluc3RhbmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2YgaXRzIHN1YmNsYXNzZXMgb3IgY2FsbGFibGUgb2JqZWN0LgorICAgICAgICBAcGFyYW0gcmVjOiBPcHRpb25hbGx5IGFkZHMgd2F0Y2hlcyByZWN1cnNpdmVseSBvbiBhbGwKKyAgICAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3JpZXMgY29udGFpbmVkIGludG8gfHdkfCBkaXJlY3RvcnkuCisgICAgICAgIEB0eXBlIHJlYzogYm9vbAorICAgICAgICBAcGFyYW0gYXV0b19hZGQ6IEF1dG9tYXRpY2FsbHkgYWRkcyB3YXRjaGVzIG9uIG5ld2x5IGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBpbiB0aGUgd2F0Y2gncyBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gfHdkfC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBJZiB8YXV0b19hZGR8IGlzIFRydWUsIElOX0NSRUFURSBpcyBvcmVkIHdpdGggfG1hc2t8CisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgd2F0Y2ggaXMgdXBkYXRlZC4KKyAgICAgICAgQHR5cGUgYXV0b19hZGQ6IGJvb2wKKyAgICAgICAgQHBhcmFtIHF1aWV0OiBJZiBGYWxzZSByYWlzZXMgYSBXYXRjaE1hbmFnZXJFcnJvciBleGNlcHRpb24gb24KKyAgICAgICAgICAgICAgICAgICAgICBlcnJvci4gU2VlIGV4YW1wbGUgbm90X3F1aWV0LnB5CisgICAgICAgIEB0eXBlIHF1aWV0OiBib29sCisgICAgICAgIEByZXR1cm46IGRpY3Qgb2Ygd2F0Y2ggZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB0byBib29sZWFucyB2YWx1ZXMuCisgICAgICAgICAgICAgICAgIFRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgd2QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgICAgICAgIHVwZGF0ZWQsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgQHJ0eXBlOiBkaWN0IG9mIHtpbnQ6IGJvb2x9CisgICAgICAgICIiIgorICAgICAgICBsd2QgPSBzZWxmLl9fZm9ybWF0X3BhcmFtKHdkKQorICAgICAgICBpZiByZWM6CisgICAgICAgICAgICBsd2QgPSBzZWxmLl9fZ2V0X3N1Yl9yZWMobHdkKQorCisgICAgICAgIHJldF8gPSB7fSAgIyByZXR1cm4ge3dkOiBib29sLCAuLi59CisgICAgICAgIGZvciBhd2QgaW4gbHdkOgorICAgICAgICAgICAgYXBhdGggPSBzZWxmLmdldF9wYXRoKGF3ZCkKKyAgICAgICAgICAgIGlmIG5vdCBhcGF0aCBvciBhd2QgPCAwOgorICAgICAgICAgICAgICAgIGVyciA9ICd1cGRhdGVfd2F0Y2g6IGludmFsaWQgV0Q9JWQnICUgYXdkCisgICAgICAgICAgICAgICAgaWYgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmFpc2UgV2F0Y2hNYW5hZ2VyRXJyb3IoZXJyLCByZXRfKQorCisgICAgICAgICAgICBpZiBtYXNrOgorICAgICAgICAgICAgICAgIHdkXyA9IHNlbGYuX2lub3RpZnlfd3JhcHBlci5pbm90aWZ5X2FkZF93YXRjaChzZWxmLl9mZCwgYXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spCisgICAgICAgICAgICAgICAgaWYgd2RfIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0X1thd2RdID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gKCd1cGRhdGVfd2F0Y2g6IGNhbm5vdCB1cGRhdGUgJXMgV0Q9JWQsICVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBhdGgsIHdkXywgc2VsZi5faW5vdGlmeV93cmFwcGVyLnN0cl9lcnJubygpKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgV2F0Y2hNYW5hZ2VyRXJyb3IoZXJyLCByZXRfKQorCisgICAgICAgICAgICAgICAgYXNzZXJ0KGF3ZCA9PSB3ZF8pCisKKyAgICAgICAgICAgIGlmIHByb2NfZnVuIG9yIGF1dG9fYWRkOgorICAgICAgICAgICAgICAgIHdhdGNoXyA9IHNlbGYuX3dtZFthd2RdCisKKyAgICAgICAgICAgIGlmIHByb2NfZnVuOgorICAgICAgICAgICAgICAgIHdhdGNoXy5wcm9jX2Z1biA9IHByb2NfZnVuCisKKyAgICAgICAgICAgIGlmIGF1dG9fYWRkOgorICAgICAgICAgICAgICAgIHdhdGNoXy5hdXRvX2FkZCA9IGF1dG9fYWRkCisKKyAgICAgICAgICAgIHJldF9bYXdkXSA9IFRydWUKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygnVXBkYXRlZCB3YXRjaCAtICVzJywgc2VsZi5fd21kW2F3ZF0pCisgICAgICAgIHJldHVybiByZXRfCisKKyAgICBkZWYgX19mb3JtYXRfcGFyYW0oc2VsZiwgcGFyYW0pOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIHBhcmFtOiBQYXJhbWV0ZXIuCisgICAgICAgIEB0eXBlIHBhcmFtOiBzdHJpbmcgb3IgaW50CisgICAgICAgIEByZXR1cm46IHdyYXAgcGFyYW0uCisgICAgICAgIEBydHlwZTogbGlzdCBvZiB0eXBlKHBhcmFtKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgbGlzdCk6CisgICAgICAgICAgICBmb3IgcF8gaW4gcGFyYW06CisgICAgICAgICAgICAgICAgeWllbGQgcF8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHlpZWxkIHBhcmFtCisKKyAgICBkZWYgZ2V0X3dkKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyB0aGUgd2F0Y2ggZGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHBhdGguIFRoaXMgbWV0aG9kCisgICAgICAgIHByZXNlbnRzIGEgcHJvaGliaXRpdmUgY29zdCwgYWx3YXlzIHByZWZlciB0byBrZWVwIHRoZSBXRAorICAgICAgICByZXR1cm5lZCBieSBhZGRfd2F0Y2goKS4gSWYgdGhlIHBhdGggaXMgdW5rbm93biBpdCByZXR1cm5zIE5vbmUuCisKKyAgICAgICAgQHBhcmFtIHBhdGg6IFBhdGguCisgICAgICAgIEB0eXBlIHBhdGg6IHN0cgorICAgICAgICBAcmV0dXJuOiBXRCBvciBOb25lLgorICAgICAgICBAcnR5cGU6IGludCBvciBOb25lCisgICAgICAgICIiIgorICAgICAgICBwYXRoID0gc2VsZi5fX2Zvcm1hdF9wYXRoKHBhdGgpCisgICAgICAgIGZvciBpd2QgaW4gc2VsZi5fd21kLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBpd2RbMV0ucGF0aCA9PSBwYXRoOgorICAgICAgICAgICAgICAgIHJldHVybiBpd2RbMF0KKworICAgIGRlZiBnZXRfcGF0aChzZWxmLCB3ZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIHRoZSBwYXRoIGFzc29jaWF0ZWQgdG8gV0QsIGlmIFdEIGlzIHVua25vd24gaXQgcmV0dXJucyBOb25lLgorCisgICAgICAgIEBwYXJhbSB3ZDogV2F0Y2ggZGVzY3JpcHRvci4KKyAgICAgICAgQHR5cGUgd2Q6IGludAorICAgICAgICBAcmV0dXJuOiBQYXRoIG9yIE5vbmUuCisgICAgICAgIEBydHlwZTogc3RyaW5nIG9yIE5vbmUKKyAgICAgICAgIiIiCisgICAgICAgIHdhdGNoXyA9IHNlbGYuX3dtZC5nZXQod2QpCisgICAgICAgIGlmIHdhdGNoXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB3YXRjaF8ucGF0aAorCisgICAgZGVmIF9fd2Fsa19yZWMoc2VsZiwgdG9wLCByZWMpOgorICAgICAgICAiIiIKKyAgICAgICAgWWllbGRzIGVhY2ggc3ViZGlyZWN0b3JpZXMgb2YgdG9wLCBkb2Vzbid0IGZvbGxvdyBzeW1saW5rcy4KKyAgICAgICAgSWYgcmVjIGlzIGZhbHNlLCBvbmx5IHlpZWxkIHRvcC4KKworICAgICAgICBAcGFyYW0gdG9wOiByb290IGRpcmVjdG9yeS4KKyAgICAgICAgQHR5cGUgdG9wOiBzdHJpbmcKKyAgICAgICAgQHBhcmFtIHJlYzogcmVjdXJzaXZlIGZsYWcuCisgICAgICAgIEB0eXBlIHJlYzogYm9vbAorICAgICAgICBAcmV0dXJuOiBwYXRoIG9mIG9uZSBzdWJkaXJlY3RvcnkuCisgICAgICAgIEBydHlwZTogc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgcmVjIG9yIG9zLnBhdGguaXNsaW5rKHRvcCkgb3Igbm90IG9zLnBhdGguaXNkaXIodG9wKToKKyAgICAgICAgICAgIHlpZWxkIHRvcAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodG9wKToKKyAgICAgICAgICAgICAgICB5aWVsZCByb290CisKKyAgICBkZWYgcm1fd2F0Y2goc2VsZiwgd2QsIHJlYz1GYWxzZSwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmVzIHdhdGNoKHMpLgorCisgICAgICAgIEBwYXJhbSB3ZDogV2F0Y2ggRGVzY3JpcHRvciBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gdW53YXRjaC4KKyAgICAgICAgICAgICAgICAgICBBbHNvIGFjY2VwdHMgYSBsaXN0IG9mIFdEcy4KKyAgICAgICAgQHR5cGUgd2Q6IGludCBvciBsaXN0IG9mIGludC4KKyAgICAgICAgQHBhcmFtIHJlYzogUmVjdXJzaXZlbHkgcmVtb3ZlcyB3YXRjaGVzIG9uIGV2ZXJ5IGFscmVhZHkgd2F0Y2hlZAorICAgICAgICAgICAgICAgICAgICBzdWJkaXJlY3RvcmllcyBhbmQgc3ViZmlsZXMuCisgICAgICAgIEB0eXBlIHJlYzogYm9vbAorICAgICAgICBAcGFyYW0gcXVpZXQ6IElmIEZhbHNlIHJhaXNlcyBhIFdhdGNoTWFuYWdlckVycm9yIGV4Y2VwdGlvbiBvbgorICAgICAgICAgICAgICAgICAgICAgIGVycm9yLiBTZWUgZXhhbXBsZSBub3RfcXVpZXQucHkKKyAgICAgICAgQHR5cGUgcXVpZXQ6IGJvb2wKKyAgICAgICAgQHJldHVybjogZGljdCBvZiB3YXRjaCBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkIHRvIGJvb2xlYW5zIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyB3ZCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAgICAgICAgICAgICAgICAgcmVtb3ZlZCwgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICBAcnR5cGU6IGRpY3Qgb2Yge2ludDogYm9vbH0KKyAgICAgICAgIiIiCisgICAgICAgIGx3ZCA9IHNlbGYuX19mb3JtYXRfcGFyYW0od2QpCisgICAgICAgIGlmIHJlYzoKKyAgICAgICAgICAgIGx3ZCA9IHNlbGYuX19nZXRfc3ViX3JlYyhsd2QpCisKKyAgICAgICAgcmV0XyA9IHt9ICAjIHJldHVybiB7d2Q6IGJvb2wsIC4uLn0KKyAgICAgICAgZm9yIGF3ZCBpbiBsd2Q6CisgICAgICAgICAgICAjIHJlbW92ZSB3YXRjaAorICAgICAgICAgICAgd2RfID0gc2VsZi5faW5vdGlmeV93cmFwcGVyLmlub3RpZnlfcm1fd2F0Y2goc2VsZi5fZmQsIGF3ZCkKKyAgICAgICAgICAgIGlmIHdkXyA8IDA6CisgICAgICAgICAgICAgICAgcmV0X1thd2RdID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlcnIgPSAoJ3JtX3dhdGNoOiBjYW5ub3QgcmVtb3ZlIFdEPSVkLCAlcycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdkLCBzZWxmLl9pbm90aWZ5X3dyYXBwZXIuc3RyX2Vycm5vKCkpKQorICAgICAgICAgICAgICAgIGlmIHF1aWV0OgorICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJhaXNlIFdhdGNoTWFuYWdlckVycm9yKGVyciwgcmV0XykKKworICAgICAgICAgICAgIyBSZW1vdmUgd2F0Y2ggZnJvbSBvdXIgZGljdGlvbmFyeQorICAgICAgICAgICAgaWYgYXdkIGluIHNlbGYuX3dtZDoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fd21kW2F3ZF0KKyAgICAgICAgICAgIHJldF9bYXdkXSA9IFRydWUKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygnV2F0Y2ggV0Q9JWQgKCVzKSByZW1vdmVkJywgYXdkLCBzZWxmLmdldF9wYXRoKGF3ZCkpCisgICAgICAgIHJldHVybiByZXRfCisKKworICAgIGRlZiB3YXRjaF90cmFuc2llbnRfZmlsZShzZWxmLCBmaWxlbmFtZSwgbWFzaywgcHJvY19jbGFzcyk6CisgICAgICAgICIiIgorICAgICAgICBXYXRjaCBhIHRyYW5zaWVudCBmaWxlLCB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgYW5kIGRlbGV0ZWQgZnJlcXVlbnRseQorICAgICAgICBvdmVyIHRpbWUgKGUuZy4gcGlkIGZpbGUpLgorCisgICAgICAgIEBhdHRlbnRpb246IEN1cnJlbnRseSB1bmRlciB0aGUgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGl0IGlzIG5vdAorICAgICAgICBwb3NzaWJsZSB0byBjb3JyZWN0bHkgd2F0Y2ggdGhlIGV2ZW50cyB0cmlnZ2VyZWQgaW50byB0aGUgc2FtZQorICAgICAgICBiYXNlIGRpcmVjdG9yeSB0aGFuIHRoZSBkaXJlY3Rvcnkgd2hlcmUgaXMgbG9jYXRlZCB0aGlzIHdhdGNoZWQKKyAgICAgICAgdHJhbnNpZW50IGZpbGUuIEZvciBpbnN0YW5jZSBpdCB3b3VsZCBiZSB3cm9uZyB0byBtYWtlIHRoZXNlCisgICAgICAgIHR3byBzdWNjZXNzaXZlIGNhbGxzOiB3bS53YXRjaF90cmFuc2llbnRfZmlsZSgnL3Zhci9ydW4vZm9vLnBpZCcsIC4uLikKKyAgICAgICAgYW5kIHdtLmFkZF93YXRjaCgnL3Zhci9ydW4vJywgLi4uKQorCisgICAgICAgIEBwYXJhbSBmaWxlbmFtZTogRmlsZW5hbWUuCisgICAgICAgIEB0eXBlIGZpbGVuYW1lOiBzdHJpbmcKKyAgICAgICAgQHBhcmFtIG1hc2s6IEJpdG1hc2sgb2YgZXZlbnRzLCBzaG91bGQgY29udGFpbiBJTl9DUkVBVEUgYW5kIElOX0RFTEVURS4KKyAgICAgICAgQHR5cGUgbWFzazogaW50CisgICAgICAgIEBwYXJhbSBwcm9jX2NsYXNzOiBQcm9jZXNzRXZlbnQgKG9yIG9mIG9uZSBvZiBpdHMgc3ViY2xhc3MpLCBiZXdhcmUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGluZyBhIFByb2Nlc3NFdmVudCdzIGluc3RhbmNlIGFzIGFyZ3VtZW50IGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW5pdF9fLCBzZWUgdHJhbnNpZW50X2ZpbGUucHkgZXhhbXBsZSBmb3IgbW9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscy4KKyAgICAgICAgQHR5cGUgcHJvY19jbGFzczogUHJvY2Vzc0V2ZW50J3MgaW5zdGFuY2Ugb3Igb2Ygb25lIG9mIGl0cyBzdWJjbGFzc2VzLgorICAgICAgICBAcmV0dXJuOiBTYW1lIGFzIGFkZF93YXRjaCgpLgorICAgICAgICBAcnR5cGU6IFNhbWUgYXMgYWRkX3dhdGNoKCkuCisgICAgICAgICIiIgorICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQorICAgICAgICBpZiBkaXJuYW1lID09ICcnOgorICAgICAgICAgICAgcmV0dXJuIHt9ICAjIE1haW50YWlucyBjb2hlcmVuY2Ugd2l0aCBhZGRfd2F0Y2goKQorICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgICAgICMgQXNzdW1pbmcgd2UgYXJlIHdhdGNoaW5nIGF0IGxlYXN0IGZvciBJTl9DUkVBVEUgYW5kIElOX0RFTEVURQorICAgICAgICBtYXNrIHw9IElOX0NSRUFURSB8IElOX0RFTEVURQorCisgICAgICAgIGRlZiBjbXBfbmFtZShldmVudCk6CisgICAgICAgICAgICBpZiBnZXRhdHRyKGV2ZW50LCAnbmFtZScpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gYmFzZW5hbWUgPT0gZXZlbnQubmFtZQorICAgICAgICByZXR1cm4gc2VsZi5hZGRfd2F0Y2goZGlybmFtZSwgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfZnVuPXByb2NfY2xhc3MoQ2hhaW5JZlRydWUoZnVuYz1jbXBfbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19hZGQ9RmFsc2UsIGRvX2dsb2I9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX2ZpbHRlcj1sYW1iZGEgcGF0aDogRmFsc2UpCisKKyAgICBkZWYgZ2V0X2lnbm9yZV9ldmVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pZ25vcmVfZXZlbnRzCisKKyAgICBkZWYgc2V0X2lnbm9yZV9ldmVudHMoc2VsZiwgbnZhbCk6CisgICAgICAgIHNlbGYuX2lnbm9yZV9ldmVudHMgPSBudmFsCisKKyAgICBpZ25vcmVfZXZlbnRzID0gcHJvcGVydHkoZ2V0X2lnbm9yZV9ldmVudHMsIHNldF9pZ25vcmVfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFrZSB3YXRjaCBtYW5hZ2VyIGlnbm9yaW5nIG5ldyBldmVudHMuIikKKworCisKK2NsYXNzIFJhd091dHB1dEZvcm1hdDoKKyAgICAiIiIKKyAgICBGb3JtYXQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0PU5vbmUpOgorICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdCBvciB7fQorCisgICAgZGVmIHNpbXBsZShzZWxmLCBzLCBhdHRyaWJ1dGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCBzdHIpOgorICAgICAgICAgICAgcyA9IHN0cihzKQorICAgICAgICByZXR1cm4gKHNlbGYuZm9ybWF0LmdldChhdHRyaWJ1dGUsICcnKSArIHMgKworICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0LmdldCgnbm9ybWFsJywgJycpKQorCisgICAgZGVmIHB1bmN0dWF0aW9uKHNlbGYsIHMpOgorICAgICAgICAiIiJQdW5jdHVhdGlvbiBjb2xvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2ltcGxlKHMsICdub3JtYWwnKQorCisgICAgZGVmIGZpZWxkX3ZhbHVlKHNlbGYsIHMpOgorICAgICAgICAiIiJGaWVsZCB2YWx1ZSBjb2xvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2ltcGxlKHMsICdwdXJwbGUnKQorCisgICAgZGVmIGZpZWxkX25hbWUoc2VsZiwgcyk6CisgICAgICAgICIiIkZpZWxkIG5hbWUgY29sb3IuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNpbXBsZShzLCAnYmx1ZScpCisKKyAgICBkZWYgY2xhc3NfbmFtZShzZWxmLCBzKToKKyAgICAgICAgIiIiQ2xhc3MgbmFtZSBjb2xvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0LmdldCgncmVkJywgJycpICsgc2VsZi5zaW1wbGUocywgJ2JvbGQnKQorCitvdXRwdXRfZm9ybWF0ID0gUmF3T3V0cHV0Rm9ybWF0KCkKKworY2xhc3MgQ29sb3JlZE91dHB1dEZvcm1hdChSYXdPdXRwdXRGb3JtYXQpOgorICAgICIiIgorICAgIEZvcm1hdCBjb2xvcmVkIHN0cmluZyByZXByZXNlbnRhdGlvbnMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBmID0geydub3JtYWwnOiAnXDAzM1swbScsCisgICAgICAgICAgICAgJ2JsYWNrJzogJ1wwMzNbMzBtJywKKyAgICAgICAgICAgICAncmVkJzogJ1wwMzNbMzFtJywKKyAgICAgICAgICAgICAnZ3JlZW4nOiAnXDAzM1szMm0nLAorICAgICAgICAgICAgICd5ZWxsb3cnOiAnXDAzM1szM20nLAorICAgICAgICAgICAgICdibHVlJzogJ1wwMzNbMzRtJywKKyAgICAgICAgICAgICAncHVycGxlJzogJ1wwMzNbMzVtJywKKyAgICAgICAgICAgICAnY3lhbic6ICdcMDMzWzM2bScsCisgICAgICAgICAgICAgJ2JvbGQnOiAnXDAzM1sxbScsCisgICAgICAgICAgICAgJ3VsaW5lJzogJ1wwMzNbNG0nLAorICAgICAgICAgICAgICdibGluayc6ICdcMDMzWzVtJywKKyAgICAgICAgICAgICAnaW52ZXJ0JzogJ1wwMzNbN20nfQorICAgICAgICBSYXdPdXRwdXRGb3JtYXQuX19pbml0X18oc2VsZiwgZikKKworCitkZWYgY29tcGF0aWJpbGl0eV9tb2RlKCk6CisgICAgIiIiCisgICAgVXNlIHRoaXMgZnVuY3Rpb24gdG8gdHVybiBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLiBUaGUgY29tcGF0aWJpbGl0eQorICAgIG1vZGUgaXMgdXNlZCB0byBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBQeWlub3RpZnkgMC43LjEgKG9yIG9sZGVyKQorICAgIHByb2dyYW1zLiBUaGUgY29tcGF0aWJpbGl0eSBtb2RlIHByb3ZpZGVzIGFkZGl0aW9uYWwgdmFyaWFibGVzICdpc19kaXInLAorICAgICdldmVudF9uYW1lJywgJ0V2ZW50c0NvZGVzLklOXyonIGFuZCAnRXZlbnRzQ29kZXMuQUxMX0VWRU5UUycgYXMKKyAgICBQeWlub3RpZnkgMC43LjEgcHJvdmlkZWQuIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBuZXcgcHJvZ3JhbXMhIQorICAgIEVzcGVjaWFsbHkgaWYgdGhlcmUgYXJlIGRldmVsb3BwZWQgZm9yIFB5aW5vdGlmeSA+PSAwLjgueC4KKyAgICAiIiIKKyAgICBzZXRhdHRyKEV2ZW50c0NvZGVzLCAnQUxMX0VWRU5UUycsIEFMTF9FVkVOVFMpCisgICAgZm9yIGV2bmFtZSBpbiBnbG9iYWxzKCk6CisgICAgICAgIGlmIGV2bmFtZS5zdGFydHN3aXRoKCdJTl8nKToKKyAgICAgICAgICAgIHNldGF0dHIoRXZlbnRzQ29kZXMsIGV2bmFtZSwgZ2xvYmFscygpW2V2bmFtZV0pCisgICAgZ2xvYmFsIENPTVBBVElCSUxJVFlfTU9ERQorICAgIENPTVBBVElCSUxJVFlfTU9ERSA9IFRydWUKKworCitkZWYgY29tbWFuZF9saW5lKCk6CisgICAgIiIiCisgICAgQnkgZGVmYXVsdCB0aGUgd2F0Y2hlZCBwYXRoIGlzICcvdG1wJyBhbmQgYWxsIHR5cGVzIG9mIGV2ZW50cyBhcmUKKyAgICBtb25pdG9yZWQuIEV2ZW50cyBtb25pdG9yaW5nIHNlcnZlcyBmb3JldmVyLCB0eXBlIGNeYyB0byBzdG9wIGl0LgorICAgICIiIgorICAgIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCisgICAgdXNhZ2UgPSAidXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbcGF0aDFdIFtwYXRoMl0gW3BhdGhuXSIKKworICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT11c2FnZSkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgaGVscD0iVmVyYm9zZSBtb2RlIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXIiLCAiLS1yZWN1cnNpdmUiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InJlY3Vyc2l2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQWRkIHdhdGNoZXMgcmVjdXJzaXZlbHkgb24gcGF0aHMiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYSIsICItLWF1dG9fYWRkIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJhdXRvX2FkZCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQXV0b21hdGljYWxseSBhZGQgd2F0Y2hlcyBvbiBuZXcgZGlyZWN0b3JpZXMiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZyIsICItLWdsb2IiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9Imdsb2IiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRyZWF0IHBhdGhzIGFzIGdsb2JzIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLWUiLCAiLS1ldmVudHMtbGlzdCIsIG1ldGF2YXI9IkVWRU5UWywuLi5dIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJldmVudHNfbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0oIkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXZlbnRzIHRvIHdhdGNoIGZvciAtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIG9wdGlvbnMgKGRlZmF1bHRzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0byBldmVyeXRoaW5nKSIpKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItcyIsICItLXN0YXRzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJzdGF0cyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRGlzcGxheSBkdW1teSBzdGF0aXN0aWNzIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLVYiLCAiLS12ZXJzaW9uIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJzaW9uIiwgIGhlbHA9IlB5aW5vdGlmeSB2ZXJzaW9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1yYXctZm9ybWF0IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJyYXdfZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEaXNhYmxlIGVuaGFuY2VkIG91dHB1dCBmb3JtYXQuIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLWMiLCAiLS1jb21tYW5kIiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU2hlbGwgY29tbWFuZCB0byBydW4gdXBvbiBldmVudCIpCisKKyAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBvcHRpb25zLnZlcmJvc2U6CisgICAgICAgIGxvZy5zZXRMZXZlbCgxMCkKKworICAgIGlmIG9wdGlvbnMudmVyc2lvbjoKKyAgICAgICAgcHJpbnQoX192ZXJzaW9uX18pCisKKyAgICBpZiBub3Qgb3B0aW9ucy5yYXdfZm9ybWF0OgorICAgICAgICBnbG9iYWwgb3V0cHV0X2Zvcm1hdAorICAgICAgICBvdXRwdXRfZm9ybWF0ID0gQ29sb3JlZE91dHB1dEZvcm1hdCgpCisKKyAgICBpZiBsZW4oYXJncykgPCAxOgorICAgICAgICBwYXRoID0gJy90bXAnICAjIGRlZmF1bHQgd2F0Y2hlZCBwYXRoCisgICAgZWxzZToKKyAgICAgICAgcGF0aCA9IGFyZ3MKKworICAgICMgd2F0Y2ggbWFuYWdlciBpbnN0YW5jZQorICAgIHdtID0gV2F0Y2hNYW5hZ2VyKCkKKyAgICAjIG5vdGlmaWVyIGluc3RhbmNlIGFuZCBpbml0CisgICAgaWYgb3B0aW9ucy5zdGF0czoKKyAgICAgICAgbm90aWZpZXIgPSBOb3RpZmllcih3bSwgZGVmYXVsdF9wcm9jX2Z1bj1TdGF0cygpLCByZWFkX2ZyZXE9NSkKKyAgICBlbHNlOgorICAgICAgICBub3RpZmllciA9IE5vdGlmaWVyKHdtLCBkZWZhdWx0X3Byb2NfZnVuPVByaW50QWxsRXZlbnRzKCkpCisKKyAgICAjIFdoYXQgbWFzayB0byBhcHBseQorICAgIG1hc2sgPSAwCisgICAgaWYgb3B0aW9ucy5ldmVudHNfbGlzdDoKKyAgICAgICAgZXZlbnRzX2xpc3QgPSBvcHRpb25zLmV2ZW50c19saXN0LnNwbGl0KCcsJykKKyAgICAgICAgZm9yIGV2IGluIGV2ZW50c19saXN0OgorICAgICAgICAgICAgZXZjb2RlID0gRXZlbnRzQ29kZXMuQUxMX0ZMQUdTLmdldChldiwgMCkKKyAgICAgICAgICAgIGlmIGV2Y29kZToKKyAgICAgICAgICAgICAgICBtYXNrIHw9IGV2Y29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJzZXIuZXJyb3IoIlRoZSBldmVudCAnJXMnIHNwZWNpZmllZCB3aXRoIG9wdGlvbiAtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgdmFsaWQiICUgZXYpCisgICAgZWxzZToKKyAgICAgICAgbWFzayA9IEFMTF9FVkVOVFMKKworICAgICMgc3RhdHMKKyAgICBjYl9mdW4gPSBOb25lCisgICAgaWYgb3B0aW9ucy5zdGF0czoKKyAgICAgICAgZGVmIGNiKHMpOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShyZXByKHMucHJvY19mdW4oKSkpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN0cihzLnByb2NfZnVuKCkpKQorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIGNiX2Z1biA9IGNiCisKKyAgICAjIEV4dGVybmFsIGNvbW1hbmQKKyAgICBpZiBvcHRpb25zLmNvbW1hbmQ6CisgICAgICAgIGRlZiBjYihzKToKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4ob3B0aW9ucy5jb21tYW5kLCBzaGVsbD1UcnVlKQorICAgICAgICBjYl9mdW4gPSBjYgorCisgICAgbG9nLmRlYnVnKCdTdGFydCBtb25pdG9yaW5nICVzLCAocHJlc3MgY15jIHRvIGhhbHQgcHlpbm90aWZ5KScgJSBwYXRoKQorCisgICAgd20uYWRkX3dhdGNoKHBhdGgsIG1hc2ssIHJlYz1vcHRpb25zLnJlY3Vyc2l2ZSwgYXV0b19hZGQ9b3B0aW9ucy5hdXRvX2FkZCwgZG9fZ2xvYj1vcHRpb25zLmdsb2IpCisgICAgIyBMb29wIGZvcmV2ZXIgKHVudGlsIHNpZ2ludCBzaWduYWwgZ2V0IGNhdWdodCkKKyAgICBub3RpZmllci5sb29wKGNhbGxiYWNrPWNiX2Z1bikKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGNvbW1hbmRfbGluZSgpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3IvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3IvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL2FkbWluLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3IvYWRtaW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmODVkNwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL2FkbWluLnB5CkBAIC0wLDAgKzEsMzMgQEAKK2Zyb20gZGphbmdvLmNvbnRyaWIgaW1wb3J0IGFkbWluCitmcm9tIGRqYW5nby5jb250cmliLmFkbWluLmZpbHRlcnMgaW1wb3J0IFJlbGF0ZWRGaWVsZExpc3RGaWx0ZXIKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgQml0YmFrZVZlcnNpb24sIFJlbGVhc2UsIExheWVyU291cmNlLCBUb2FzdGVyU2V0dGluZworZnJvbSBkamFuZ28uZm9ybXMud2lkZ2V0cyBpbXBvcnQgVGV4dGFyZWEKK2Zyb20gZGphbmdvIGltcG9ydCBmb3JtcworaW1wb3J0IGRqYW5nby5kYi5tb2RlbHMgYXMgbW9kZWxzCisKK2Zyb20gZGphbmdvLmNvbnRyaWIuYWRtaW4gaW1wb3J0IHdpZGdldHMsIGhlbHBlcnMKKworY2xhc3MgTGF5ZXJTb3VyY2VBZG1pbihhZG1pbi5Nb2RlbEFkbWluKToKKyAgICBwYXNzCisKK2NsYXNzIEJpdGJha2VWZXJzaW9uQWRtaW4oYWRtaW4uTW9kZWxBZG1pbik6CisKKyAgICAjIHdlIG92ZXJyaWRlIHRoZSBmb3JtZmllbGQgZm9yIGRiIFVSTEZpZWxkIGJlY2F1c2Ugb2YgYnJva2VuIFVSTCB2YWxpZGF0aW9uCisKKyAgICBkZWYgZm9ybWZpZWxkX2Zvcl9kYmZpZWxkKHNlbGYsIGRiX2ZpZWxkLCAqKmt3YXJncyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGJfZmllbGQsIG1vZGVscy5maWVsZHMuVVJMRmllbGQpOgorICAgICAgICAgICAgcmV0dXJuIGZvcm1zLmZpZWxkcy5DaGFyRmllbGQoKQorICAgICAgICByZXR1cm4gc3VwZXIoQml0YmFrZVZlcnNpb25BZG1pbiwgc2VsZikuZm9ybWZpZWxkX2Zvcl9kYmZpZWxkKGRiX2ZpZWxkLCAqKmt3YXJncykKKworCisKK2NsYXNzIFJlbGVhc2VBZG1pbihhZG1pbi5Nb2RlbEFkbWluKToKKyAgICBwYXNzCisKK2NsYXNzIFRvYXN0ZXJTZXR0aW5nQWRtaW4oYWRtaW4uTW9kZWxBZG1pbik6CisgICAgcGFzcworCithZG1pbi5zaXRlLnJlZ2lzdGVyKExheWVyU291cmNlLCBMYXllclNvdXJjZUFkbWluKQorYWRtaW4uc2l0ZS5yZWdpc3RlcihCaXRiYWtlVmVyc2lvbiwgQml0YmFrZVZlcnNpb25BZG1pbikKK2FkbWluLnNpdGUucmVnaXN0ZXIoUmVsZWFzZSwgUmVsZWFzZUFkbWluKQorYWRtaW4uc2l0ZS5yZWdpc3RlcihUb2FzdGVyU2V0dGluZywgVG9hc3RlclNldHRpbmdBZG1pbikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL3VybHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci91cmxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDM4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbGxlY3Rvci91cmxzLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworZnJvbSBkamFuZ28uY29uZi51cmxzIGltcG9ydCBwYXR0ZXJucywgaW5jbHVkZSwgdXJsCitmcm9tIGRqYW5nby52aWV3cy5nZW5lcmljIGltcG9ydCBSZWRpcmVjdFZpZXcKKwordXJscGF0dGVybnMgPSBwYXR0ZXJucygnYmxkY29sbGVjdG9yLnZpZXdzJywKKyAgICAgICAgIyBsYW5kaW5nIHBvaW50IGZvciBwdXNoaW5nIGEgYml0YmFrZV9ldmVudGxvZy5qc29uIGZpbGUgdG8gdGhpcyB0b2FzdGVyIGluc3RhY2UKKyAgICAgICAgdXJsKHInXmV2ZW50ZmlsZSQnLCAnZXZlbnRmaWxlJywgbmFtZT0nZXZlbnRmaWxlJyksCisgICAgICAgICkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL3ZpZXdzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb2xsZWN0b3Ivdmlld3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyZmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29sbGVjdG9yL3ZpZXdzLnB5CkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK2Zyb20gZGphbmdvLnZpZXdzLmRlY29yYXRvcnMuY2FjaGUgaW1wb3J0IGNhY2hlX2NvbnRyb2wKK2Zyb20gZGphbmdvLmNvcmUudXJscmVzb2x2ZXJzIGltcG9ydCByZXZlcnNlCitmcm9tIGRqYW5nby5jb3JlLnBhZ2luYXRvciBpbXBvcnQgUGFnaW5hdG9yLCBFbXB0eVBhZ2UsIFBhZ2VOb3RBbkludGVnZXIKK2Zyb20gZGphbmdvLmh0dHAgaW1wb3J0IEh0dHBSZXNwb25zZUJhZFJlcXVlc3QsIEh0dHBSZXNwb25zZQorZnJvbSBkamFuZ28udXRpbHMgaW1wb3J0IHRpbWV6b25lCitmcm9tIGRqYW5nby51dGlscy5odG1sIGltcG9ydCBlc2NhcGUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQorZnJvbSBkamFuZ28udXRpbHMgaW1wb3J0IGZvcm1hdHMKK2Zyb20gdG9hc3Rlcmd1aS50ZW1wbGF0ZXRhZ3MucHJvamVjdHRhZ3MgaW1wb3J0IGpzb24gYXMganNvbmZpbHRlcgoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRvYXN0ZXJtYWluCitmcm9tIGRqYW5nby52aWV3cy5kZWNvcmF0b3JzLmNzcmYgaW1wb3J0IGNzcmZfZXhlbXB0CisKKworQGNzcmZfZXhlbXB0CitkZWYgZXZlbnRmaWxlKHJlcXVlc3QpOgorICAgICIiIiBSZWNlaXZlcyBhIGZpbGUgYnkgUE9TVCwgYW5kIHJ1bnMgdG9hc3Rlci1ldmVudHJlcGx5IG9uIHRoaXMgZmlsZSAiIiIKKyAgICBpZiByZXF1ZXN0Lm1ldGhvZCAhPSAiUE9TVCI6CisgICAgICAgIHJldHVybiBIdHRwUmVzcG9uc2VCYWRSZXF1ZXN0KCJUaGlzIEFQSSBvbmx5IGFjY2VwdHMgUE9TVCByZXF1ZXN0cy4gUG9zdCBhIGZpbGUgd2l0aDpcblxuY3VybCAtRiBldmVudGxvZz1AYml0YmFrZV9ldmVudGxvZy5qc29uICVzXG4iICUgcmVxdWVzdC5idWlsZF9hYnNvbHV0ZV91cmkocmV2ZXJzZSgnZXZlbnRmaWxlJykpLCBjb250ZW50X3R5cGU9InRleHQvcGxhaW47dXRmOCIpCisKKyAgICAjIHdyaXRlIHRlbXBvcmFyeSBmaWxlCisgICAgKGhhbmRsZSwgYWJzdGVtcHBhdGgpID0gdGVtcGZpbGUubWtzdGVtcChkaXI9Ii90bXAvIikKKyAgICB3aXRoIG9zLmZkb3BlbihoYW5kbGUsICJ3IikgYXMgdG1wZmlsZToKKyAgICAgICAgZm9yIGNodW5rIGluIHJlcXVlc3QuRklMRVNbJ2V2ZW50bG9nJ10uY2h1bmtzKCk6CisgICAgICAgICAgICB0bXBmaWxlLndyaXRlKGNodW5rKQorICAgIHRtcGZpbGUuY2xvc2UoKQorCisgICAgIyBjb21wdXRlIHRoZSBwYXRoIHRvICJiaXRiYWtlL2Jpbi90b2FzdGVyLWV2ZW50cmVwbGF5IgorICAgIGZyb20gb3MucGF0aCBpbXBvcnQgZGlybmFtZSBhcyBETgorICAgIGltcG9ydF9zY3JpcHQgPSBvcy5wYXRoLmpvaW4oRE4oRE4oRE4oRE4ob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpKSksICJiaW4vdG9hc3Rlci1ldmVudHJlcGxheSIpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGltcG9ydF9zY3JpcHQpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oInNjcmlwdCBtaXNzaW5nICVzIiAlIGltcG9ydF9zY3JpcHQpCisgICAgc2NyaXB0ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICBzY3JpcHRlbnZbIkRBVEFCQVNFX1VSTCJdID0gdG9hc3Rlcm1haW4uc2V0dGluZ3MuZ2V0REFUQUJBU0VfVVJMKCkKKworICAgICMgcnVuIHRoZSBkYXRhIGxvYWRpbmcgcHJvY2VzcyBhbmQgcmV0dXJuIHRoZSByZXN1bHRzCisgICAgaW1wb3J0ZXIgPSBzdWJwcm9jZXNzLlBvcGVuKFtpbXBvcnRfc2NyaXB0LCBhYnN0ZW1wcGF0aF0sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIGVudj1zY3JpcHRlbnYpCisgICAgKG91dCwgZXJyKSA9IGltcG9ydGVyLmNvbW11bmljYXRlKCkKKyAgICBpZiBpbXBvcnRlci5yZXR1cm5jb2RlID09IDA6CisgICAgICAgIG9zLnJlbW92ZShhYnN0ZW1wcGF0aCkKKyAgICByZXR1cm4gSHR0cFJlc3BvbnNlKCI9PSBSZXR2YWwgJWRcbj09IFNURE9VVFxuJXNcblxuPT0gU1RERVJSXG4lcyIgJSAoaW1wb3J0ZXIucmV0dXJuY29kZSwgb3V0LCBlcnIpLCBjb250ZW50X3R5cGU9InRleHQvcGxhaW47dXRmOCIpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvX19pbml0X18ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL2FkbWluLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL2FkbWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYmU1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvYWRtaW4ucHkKQEAgLTAsMCArMSw4IEBACitmcm9tIGRqYW5nby5jb250cmliIGltcG9ydCBhZG1pbgorZnJvbSBkamFuZ28uY29udHJpYi5hZG1pbi5maWx0ZXJzIGltcG9ydCBSZWxhdGVkRmllbGRMaXN0RmlsdGVyCitmcm9tIC5tb2RlbHMgaW1wb3J0IEJ1aWxkRW52aXJvbm1lbnQKKworY2xhc3MgQnVpbGRFbnZpcm9ubWVudEFkbWluKGFkbWluLk1vZGVsQWRtaW4pOgorICAgIHBhc3MKKworYWRtaW4uc2l0ZS5yZWdpc3RlcihCdWlsZEVudmlyb25tZW50LCBCdWlsZEVudmlyb25tZW50QWRtaW4pCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvYmJjb250cm9sbGVyLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL2JiY29udHJvbGxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDcwYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL2JiY29udHJvbGxlci5weQpAQCAtMCwwICsxLDIwMiBAQAorIworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2Zyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbgorZnJvbSBkamFuZ28uZGIubW9kZWxzIGltcG9ydCBRCitmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZEVudmlyb25tZW50LCBCUkxheWVyLCBCUlZhcmlhYmxlLCBCUlRhcmdldCwgQlJCaXRiYWtlCisKKyMgbG9hZCBCaXRiYWtlIGNvbXBvbmVudHMKK3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpKSkKK3N5cy5wYXRoLmluc2VydCgwLCBwYXRoKQoraW1wb3J0IGJiLnNlcnZlci54bWxycGMKKworY2xhc3MgQml0YmFrZUNvbnRyb2xsZXIob2JqZWN0KToKKyAgICAiIiIgVGhpcyBpcyB0aGUgYmFzaWMgY2xhc3MgdGhhdCBjb250cm9sbHMgYSBiaXRiYWtlIHNlcnZlci4KKyAgICAgICAgSXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjbGFzcyBvbiBob3cgdGhlIHNlcnZlciBpcyBzdGFydGVkIGFuZCBhcXVpcmVkCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubmVjdGlvbik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24KKworICAgIGRlZiBfcnVuQ29tbWFuZChzZWxmLCBjb21tYW5kKToKKyAgICAgICAgcmVzdWx0LCBlcnJvciA9IHNlbGYuY29ubmVjdGlvbi5jb25uZWN0aW9uLnJ1bkNvbW1hbmQoY29tbWFuZCkKKyAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyb3IpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBkaXNjb25uZWN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLnJlbW92ZUNsaWVudCgpCisKKyAgICBkZWYgc2V0VmFyaWFibGUoc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcnVuQ29tbWFuZChbInNldFZhcmlhYmxlIiwgbmFtZSwgdmFsdWVdKQorCisgICAgZGVmIGJ1aWxkKHNlbGYsIHRhcmdldHMsIHRhc2sgPSBOb25lKToKKyAgICAgICAgaWYgdGFzayBpcyBOb25lOgorICAgICAgICAgICAgdGFzayA9ICJidWlsZCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3J1bkNvbW1hbmQoWyJidWlsZFRhcmdldHMiLCB0YXJnZXRzLCB0YXNrXSkKKworCisKK2RlZiBnZXRCdWlsZEVudmlyb25tZW50Q29udHJvbGxlcigqKmt3YXJncyk6CisgICAgIiIiIEdldHMgeW91IGEgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIgdGhhdCBlbmNhcHN1bGF0ZXMgYSBidWlsZCBlbnZpcm9ubWVudCwKKyAgICAgICAgYmFzZWQgb24gdGhlIHF1ZXJ5IGRpY3Rpb25hcnkgc2VudCBpbi4KKworICAgICAgICBUaGlzIGlzIHVzZWQgdG8gcmV0cmlldmUsIGZvciBleGFtcGxlLCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgQkUgZnJvbSBpbnNpZGUKKyAgICAgICAgdGhlIHRvYXN0ZXIgVUksIG9yIGZpbmQgYSBuZXcgQkUgdG8gc3RhcnQgYSBuZXcgYnVpbGQgaW4gaXQuCisKKyAgICAgICAgVGhlIHJldHVybiBvYmplY3QgTVVTVCBhbHdheXMgYmUgYSBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlci4KKyAgICAiIiIKKworICAgIGZyb20gbG9jYWxob3N0YmVjb250cm9sbGVyIGltcG9ydCBMb2NhbGhvc3RCRUNvbnRyb2xsZXIKKyAgICBmcm9tIHNzaGJlY29udHJvbGxlciAgICBpbXBvcnQgU1NIQkVDb250cm9sbGVyCisKKyAgICBiZSA9IEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5maWx0ZXIoUSgqKmt3YXJncykpWzBdCisgICAgaWYgYmUuYmV0eXBlID09IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgcmV0dXJuIExvY2FsaG9zdEJFQ29udHJvbGxlcihiZSkKKyAgICBlbGlmIGJlLmJldHlwZSA9PSBCdWlsZEVudmlyb25tZW50LlRZUEVfU1NIOgorICAgICAgICByZXR1cm4gU1NIQkVDb250cm9sbGVyKGJlKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IEltcGxlbWVudCBCRUMgZm9yIHR5cGUgJXMiICUgc3RyKGJlLmJldHlwZSkpCisKKworY2xhc3MgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIob2JqZWN0KToKKyAgICAiIiIgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIgKEJFQykgaXMgdGhlIGFic3RyYWN0IGNsYXNzIHRoYXQgZGVmaW5lcyB0aGUgb3BlcmF0aW9ucyB0aGF0IE1VU1QKKyAgICAgICAgb3IgU0hPVUxEIGJlIHN1cHBvcnRlZCBieSBhIEJ1aWxkIEVudmlyb25tZW50LiBJdCBpcyB1c2VkIHRvIGVzdGFibGlzaCB0aGUgZnJhbWV3b3JrLCBhbmQgbXVzdAorICAgICAgICBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyLgorCisgICAgICAgIFVzZSB0aGUgImdldEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKCkiIGZ1bmN0aW9uIHRvIGdldCBhIHdvcmtpbmcgQkVDIGZvciB5b3VyIHJlbW90ZS4KKworICAgICAgICBIb3cgdGhlIEJ1aWxkRW52aXJvbm1lbnRzIGFyZSBkaXNjb3ZlcmVkIGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY2xhc3MuCisKKyAgICAgICAgWW91IG11c3QgZGVyaXZlIHRoaXMgY2xhc3MgdG8gdGVhY2ggVG9hc3RlciBob3cgdG8gb3BlcmF0ZSBpbiB5b3VyIG93biBpbmZyYXN0cnVjdHVyZS4KKyAgICAgICAgV2UgcHJvdmlkZSBzb21lIHNwZWNpZmljIEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCBlaXRoZXIgdG8KKyAgICAgICAgZGlyZWN0bHkgc2V0LXVwIFRvYXN0ZXIgaW5mcmFzdHJ1Y3R1cmUsIG9yIGFzIGEgbW9kZWwgZm9yIHlvdXIgb3duIGluZnJhc3RydWN0dXJlIHNldDoKKworICAgICAgICAgICAgKiBMb2NhbGhvc3QgY29udHJvbGxlciB3aWxsIHJ1biB0aGUgVG9hc3RlciBCRSBvbiB0aGUgc2FtZSBhY2NvdW50IGFzIHRoZSB3ZWIgc2VydmVyCisgICAgICAgIChjdXJyZW50IHVzZXIgaWYgeW91IGFyZSB1c2luZyB0aGUgdGhlIERqYW5nbyBkZXZlbG9wbWVudCB3ZWIgc2VydmVyKQorICAgICAgICBvbiB0aGUgbG9jYWwgbWFjaGluZSwgd2l0aCB0aGUgImJ1aWxkLyIgZGlyZWN0b3J5IHVuZGVyIHRoZSAicG9reS8iIHNvdXJjZSBjaGVja291dCBkaXJlY3RvcnkuCisgICAgICAgIEJhc2ggaXMgZXhwZWN0ZWQgdG8gYmUgYXZhaWxhYmxlLgorCisgICAgICAgICAgICAqIFNTSCBjb250cm9sbGVyIHdpbGwgcnVuIHRoZSBUb2FzdGVyIEJFIG9uIGEgcmVtb3RlIG1hY2hpbmUsIHdoZXJlIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgY2FuIGNvbm5lY3Qgd2l0aG91dCByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBpbXBsZW1lbnQiKXdvcmQgKHNldCB1cCB3aXRoIGVpdGhlciBzc2gtYWdlbnQgb3IgcmFpc2UgRXhjZXB0aW9uKCJGSVhNRTogaW1wbGVtZW50IilwaHJhc2UtbGVzcyBrZXkgYXV0aGVudGljYXRpb24pCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYmUpOgorICAgICAgICAiIiIgVGFrZXMgYSBCdWlsZEVudmlyb25tZW50IG9iamVjdCBhcyBwYXJhbWV0ZXIgdGhhdCBwb2ludHMgdG8gdGhlIHNldHRpbmdzIG9mIHRoZSBCRS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYmUgPSBiZQorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBOb25lCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF91cGRhdGVCQkxheWVycyhiYmxheWVyY29uZiwgbGF5ZXJsaXN0KToKKyAgICAgICAgY29uZmxpbmVzID0gb3BlbihiYmxheWVyY29uZiwgInIiKS5yZWFkbGluZXMoKQorCisgICAgICAgIGJibGF5ZXJjb25mZmlsZSA9IG9wZW4oYmJsYXllcmNvbmYsICJ3IikKKyAgICAgICAgc2tpcCA9IDAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb25mbGluZXMpKToKKyAgICAgICAgICAgIGlmIHNraXAgPiAwOgorICAgICAgICAgICAgICAgIHNraXAgPS0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjb25mbGluZXNbaV0uc3RhcnRzd2l0aCgiIyBsaW5lIGFkZGVkIGJ5IHRvYXN0ZXIiKToKKyAgICAgICAgICAgICAgICBza2lwID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiYmxheWVyY29uZmZpbGUud3JpdGUoY29uZmxpbmVzW2ldKQorCisgICAgICAgIGJibGF5ZXJjb25mZmlsZS53cml0ZSgiIyBsaW5lIGFkZGVkIGJ5IHRvYXN0ZXIgYnVpbGQgY29udHJvbFxuQkJMQVlFUlMgPSBcIiIgKyAiICIuam9pbihsYXllcmxpc3QpICsgIlwiIikKKyAgICAgICAgYmJsYXllcmNvbmZmaWxlLmNsb3NlKCkKKworCisgICAgZGVmIHdyaXRlQ29uZkZpbGUoc2VsZiwgdmFyaWFibGVfbGlzdCA9IE5vbmUsIHJhdyA9IE5vbmUpOgorICAgICAgICAiIiIgV3JpdGVzIGEgY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuIE92ZXJyaWRlIHdpdGggYnVpbGRlbnYtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uICIiIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBNdXN0IG92ZXJyaWRlIHRvIGFjdHVhbGx5IHdyaXRlIGEgY29uZmlndXJhdGlvbiBmaWxlIikKKworCisgICAgZGVmIHN0YXJ0QkJTZXJ2ZXIoc2VsZik6CisgICAgICAgICIiIiBTdGFydHMgYSAgQkIgc2VydmVyIHdpdGggVG9hc3RlciB0b2FzdGVydWkgc2V0IHVwIHRvIHJlY29yZCB0aGUgYnVpbGRzLCBhbiBubyBjb250cm9sbGluZyBVSS4KKyAgICAgICAgICAgIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBzZWxmLmJlIGJiYWRkcmVzcy9iYnBvcnQgTVVTVCBwb2ludCB0byBhIHJ1bm5pbmcgYW5kIGZyZWUgc2VydmVyLAorICAgICAgICAgICAgYW5kIHRoZSBiYnN0YXRlIE1VU1QgYmUgIHVwZGF0ZWQgdG8gInN0YXJ0ZWQiLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJGSVhNRTogTXVzdCBvdmVycmlkZSBpbiBvcmRlciB0byBhY3R1YWxseSBzdGFydCB0aGUgQkIgc2VydmVyIikKKworICAgIGRlZiBzdG9wQkJTZXJ2ZXIoc2VsZik6CisgICAgICAgICIiIiBTdG9wcyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgQkIgc2VydmVyLgorICAgICAgICAgICAgVGhlIGJic3RhdGUgTVVTVCBiZSB1cGRhdGVkIHRvICJzdG9wcGVkIi4KKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbiBtdXN0IGJlIG5vbmUuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBNdXN0IG92ZXJyaWRlIHN0b0JCU2VydmVyIikKKworICAgIGRlZiBzZXRMYXllcnMoc2VsZiwgYmJzLCBscyk6CisgICAgICAgICIiIiBDaGVja3Mtb3V0IGJpdGJha2UgZXhlY3V0b3IgYW5kIGxheWVycyBmcm9tIGdpdCByZXBvc2l0b3JpZXMuCisgICAgICAgICAgICBTZXRzIHRoZSBsYXllciB2YXJpYWJsZXMgaW4gdGhlIGNvbmZpZyBmaWxlLCBhZnRlciB2YWxpZGF0aW5nIGxvY2FsIGxheWVyIHBhdGhzLgorICAgICAgICAgICAgVGhlIGJpdGJha2VzIG11c3QgYmUgYSAxLWxlbmd0aCBsaXN0IG9mIEJSQml0YmFrZQorICAgICAgICAgICAgVGhlIGxheWVyIHBhdGhzIG11c3QgYmUgaW4gYSBsaXN0IG9mIEJSTGF5ZXIgb2JqZWN0CisKKyAgICAgICAgICAgIGEgd29yZCBvZiBhdHRlbnRpb246IGJ5IGNvbnZlbnRpb24sIHRoZSBmaXJzdCBsYXllciBmb3IgYW55IGJ1aWxkIHdpbGwgYmUgcG9reSEKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IE11c3Qgb3ZlcnJpZGUgc2V0TGF5ZXJzIikKKworCisgICAgZGVmIGdldEJCQ29udHJvbGxlcihzZWxmKToKKyAgICAgICAgIiIiIHJldHVybnMgYSBCaXRiYWtlQ29udHJvbGxlciB0byBhbiBhbHJlYWR5IHN0YXJ0ZWQgc2VydmVyOyB0aGlzIGlzIHRoZSBwb2ludCB3aGVyZSB0aGUgc2VydmVyCisgICAgICAgICAgICBzdGFydHMgaWYgbmVlZGVkOyBvciByZWNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIgaWYgd2UgY2FuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5jb25uZWN0aW9uOgorICAgICAgICAgICAgc2VsZi5zdGFydEJCU2VydmVyKCkKKyAgICAgICAgICAgIHNlbGYuYmUubG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19SVU5OSU5HCisgICAgICAgICAgICBzZWxmLmJlLnNhdmUoKQorCisgICAgICAgIHNlcnZlciA9IGJiLnNlcnZlci54bWxycGMuQml0QmFrZVhNTFJQQ0NsaWVudCgpCisgICAgICAgIHNlcnZlci5pbml0U2VydmVyKCkKKyAgICAgICAgc2VydmVyLnNhdmVDb25uZWN0aW9uRGV0YWlscygiJXM6JXMiICUgKHNlbGYuYmUuYmJhZGRyZXNzLCBzZWxmLmJlLmJicG9ydCkpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IHNlcnZlci5lc3RhYmxpc2hDb25uZWN0aW9uKFtdKQorCisgICAgICAgIHNlbGYuYmUuYmJ0b2tlbiA9IHNlbGYuY29ubmVjdGlvbi50cmFuc3BvcnQuY29ubmVjdGlvbl90b2tlbgorICAgICAgICBzZWxmLmJlLnNhdmUoKQorCisgICAgICAgIHJldHVybiBCaXRiYWtlQ29udHJvbGxlcihzZWxmLmNvbm5lY3Rpb24pCisKKyAgICBkZWYgZ2V0QXJ0aWZhY3Qoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIiBUaGlzIGNhbGwgcmV0dXJucyBhbiBhcnRpZmFjdCBpZGVudGlmaWVkIGJ5IHRoZSAncGF0aCcuIEhvdyAncGF0aCcgaXMgaW50ZXJwcmV0ZWQgYXMKKyAgICAgICAgICAgIHVwIHRvIHRoZSBpbXBsZW1lbnRpbmcgQkVDLiBUaGUgcmV0dXJuIE1VU1QgYmUgYSBSRVNUIFVSTCB3aGVyZSBhIEdFVCB3aWxsIGFjdHVhbGx5IHJldHVybgorICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIGFydGlmYWN0LCBlLmcuIGZvciB1c2UgYXMgYSAiZG93bmxvYWQgbGluayIgaW4gYSB3ZWIgVUkuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIk11c3QgcmV0dXJuIHRoZSBSRVNUIFVSTCBvZiB0aGUgYXJ0aWZhY3QiKQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgICIiIiBUaGlzIHN0b3BzIHRoZSBzZXJ2ZXIgYW5kIHJlbGVhc2VzIGFueSByZXNvdXJjZXMuIEFmdGVyIHRoaXMgcG9pbnQsIGFsbCByZXNvdXJjZXMKKyAgICAgICAgICAgIGFyZSB1bi1hdmFpbGFibGUgZm9yIGZ1cnRoZXIgcmVmZXJlbmNlCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIk11c3Qgb3ZlcnJpZGUgQkUgcmVsZWFzZSIpCisKKyAgICBkZWYgdHJpZ2dlckJ1aWxkKHNlbGYsIGJpdGJha2UsIGxheWVycywgdmFyaWFibGVzLCB0YXJnZXRzKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJNdXN0IG92ZXJyaWRlIEJFIHJlbGVhc2UiKQorCitjbGFzcyBTaGVsbENtZEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBCdWlsZFNldHVwRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbG9jYWxob3N0YmVjb250cm9sbGVyLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL2xvY2FsaG9zdGJlY29udHJvbGxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTkwOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL2xvY2FsaG9zdGJlY29udHJvbGxlci5weQpAQCAtMCwwICsxLDMzNiBAQAorIworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2Zyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbgorZnJvbSBkamFuZ28uZGIubW9kZWxzIGltcG9ydCBRCitmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZEVudmlyb25tZW50LCBCUkxheWVyLCBCUlZhcmlhYmxlLCBCUlRhcmdldCwgQlJCaXRiYWtlCitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIHRvYXN0ZXJtYWluIGltcG9ydCBzZXR0aW5ncworCitmcm9tIGJiY29udHJvbGxlciBpbXBvcnQgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIsIFNoZWxsQ21kRXhjZXB0aW9uLCBCdWlsZFNldHVwRXhjZXB0aW9uCisKK2ltcG9ydCBsb2dnaW5nCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidG9hc3RlciIpCisKK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQsIHBmb3JtYXQKKworY2xhc3MgTG9jYWxob3N0QkVDb250cm9sbGVyKEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKToKKyAgICAiIiIgSW1wbGVtZW50YXRpb24gb2YgdGhlIEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyIGZvciB0aGUgbG9jYWxob3N0OworICAgICAgICB0aGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgZGVmYXVsdCBidWlsZCBkaXJlY3RvcnksCisgICAgICAgIHRoZSBzZXJ2ZXIgc2V0dXAgYW5kIHN5c3RlbSBzdGFydCBhbmQgc3RvcCBmb3IgdGhlIGxvY2FsaG9zdC10eXBlIGJ1aWxkIGVudmlyb25tZW50CisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiZSk6CisgICAgICAgIHN1cGVyKExvY2FsaG9zdEJFQ29udHJvbGxlciwgc2VsZikuX19pbml0X18oYmUpCisgICAgICAgIHNlbGYuZGJ1cmwgPSBzZXR0aW5ncy5nZXREQVRBQkFTRV9VUkwoKQorICAgICAgICBzZWxmLnBva3lkaXJuYW1lID0gTm9uZQorICAgICAgICBzZWxmLmlzbGF5ZXJzZXQgPSBGYWxzZQorCisgICAgZGVmIF9zaGVsbGNtZChzZWxmLCBjb21tYW5kLCBjd2QgPSBOb25lKToKKyAgICAgICAgaWYgY3dkIGlzIE5vbmU6CisgICAgICAgICAgICBjd2QgPSBzZWxmLmJlLnNvdXJjZWRpcgorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygibGJjX3NoZWxsY21tZDogKCVzKSAlcyIgJSAoY3dkLCBjb21tYW5kKSkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY29tbWFuZCwgY3dkID0gY3dkLCBzaGVsbD1UcnVlLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAob3V0LGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgaWYgcC5yZXR1cm5jb2RlOgorICAgICAgICAgICAgaWYgbGVuKGVycikgPT0gMDoKKyAgICAgICAgICAgICAgICBlcnIgPSAiY29tbWFuZDogJXMgXG4lcyIgJSAoY29tbWFuZCwgb3V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcnIgPSAiY29tbWFuZDogJXMgXG4lcyIgJSAoY29tbWFuZCwgZXJyKQorICAgICAgICAgICAgbG9nZ2VyLndhcm4oImxvY2FsaG9zdGJlY29udHJvbGxlcjogc2hlbGxjbWQgZXJyb3IgJXMiICUgZXJyKQorICAgICAgICAgICAgcmFpc2UgU2hlbGxDbWRFeGNlcHRpb24oZXJyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IHNoZWxsY21kIHN1Y2Nlc3MiKQorICAgICAgICAgICAgcmV0dXJuIG91dAorCisgICAgZGVmIF9zZXR1cEJFKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBhbmQgb3MucGF0aC5leGlzdHMoc2VsZi5wb2t5ZGlybmFtZSkKKyAgICAgICAgcGF0aCA9IHNlbGYuYmUuYnVpbGRkaXIKKyAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkludmFsaWQgcGF0aCBjcmVhdGlvbiBzcGVjaWZpZWQuIikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgb3MubWFrZWRpcnMocGF0aCwgMDc1NSkKKyAgICAgICAgc2VsZi5fc2hlbGxjbWQoImJhc2ggLWMgXCJzb3VyY2UgJXMvb2UtaW5pdC1idWlsZC1lbnYgJXNcIiIgJSAoc2VsZi5wb2t5ZGlybmFtZSwgcGF0aCkpCisgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wbGF0ZWNvbmYuY2ZnOyBpdCBtYXkgY29tZSBmcm9tIGFuIHVuc3VwcG9ydGVkIGxheWVyIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihwYXRoLCAiY29uZi90ZW1wbGF0ZWNvbmYuY2ZnIikpCisKKworICAgIGRlZiB3cml0ZUNvbmZGaWxlKHNlbGYsIGZpbGVfbmFtZSwgdmFyaWFibGVfbGlzdCA9IE5vbmUsIHJhdyA9IE5vbmUpOgorICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmJlLmJ1aWxkZGlyLCBmaWxlX25hbWUpCisgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgInciKSBhcyBjb25mZmlsZToKKyAgICAgICAgICAgIGlmIHZhcmlhYmxlX2xpc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gdmFyaWFibGVfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgY29uZmZpbGUud3JpdGUoIiVzPVwiJXNcIlxuIiAlIChpLm5hbWUsIGkudmFsdWUpKQorICAgICAgICAgICAgaWYgcmF3IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNvbmZmaWxlLndyaXRlKHJhdykKKworCisgICAgZGVmIHN0YXJ0QkJTZXJ2ZXIoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnBva3lkaXJuYW1lIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBva3lkaXJuYW1lKQorICAgICAgICBhc3NlcnQgc2VsZi5pc2xheWVyc2V0CisKKyAgICAgICAgIyBmaW5kIG91ciBvd24gdG9hc3RlcnVpIGxpc3RlbmVyL2JpdGJha2UKKyAgICAgICAgZnJvbSB0b2FzdGVyLmJsZGNvbnRyb2wubWFuYWdlbWVudC5jb21tYW5kcy5sb2FkY29uZiBpbXBvcnQgX3JlZHVjZV9jYW5vbl9wYXRoCisKKyAgICAgICAgb3duX2JpdGJha2UgPSBfcmVkdWNlX2Nhbm9uX3BhdGgob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgIi4uLy4uLy4uL2Jpbi9iaXRiYWtlIikpCisKKyAgICAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKG93bl9iaXRiYWtlKSBhbmQgb3MucGF0aC5pc2ZpbGUob3duX2JpdGJha2UpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IHJ1bm5pbmcgdGhlIGxpc3RlbmVyIGF0ICVzIiAlIG93bl9iaXRiYWtlKQorCisgICAgICAgIHRvYXN0ZXJfdWlfbG9nX2ZpbGVwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYmUuYnVpbGRkaXIsICJ0b2FzdGVyX3VpLmxvZyIpCisgICAgICAgICMgZ2V0IHRoZSBmaWxlIGxlbmd0aDsgd2UgbmVlZCB0byBkZXRlY3QgdGhlIF9sYXN0XyBzdGFydCBvZiB0aGUgdG9hc3RlciBVSSwgbm90IHRoZSBmaXJzdAorICAgICAgICB0b2FzdGVyX3VpX2xvZ19maWxlbGVuZ3RoID0gMAorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0b2FzdGVyX3VpX2xvZ19maWxlcGF0aCk6CisgICAgICAgICAgICB3aXRoIG9wZW4odG9hc3Rlcl91aV9sb2dfZmlsZXBhdGgsICJ3IikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMikgICAgIyBqdW1wIHRvIHRoZSBlbmQKKyAgICAgICAgICAgICAgICB0b2FzdGVyX3VpX2xvZ19maWxlbGVuZ3RoID0gZi50ZWxsKCkKKworICAgICAgICBjbWQgPSAiYmFzaCAtYyBcInNvdXJjZSAlcy9vZS1pbml0LWJ1aWxkLWVudiAlcyAyPiYxID50b2FzdGVyX3NlcnZlci5sb2cgJiYgYml0YmFrZSAtLXJlYWQgJXMvY29uZi90b2FzdGVyLXByZS5jb25mIC0tcG9zdHJlYWQgJXMvY29uZi90b2FzdGVyLmNvbmYgLS1zZXJ2ZXItb25seSAtdCB4bWxycGMgLUIgMC4wLjAuMDowIDI+JjEgPj50b2FzdGVyX3NlcnZlci5sb2cgXCIiICUgKHNlbGYucG9reWRpcm5hbWUsIHNlbGYuYmUuYnVpbGRkaXIsIHNlbGYuYmUuYnVpbGRkaXIsIHNlbGYuYmUuYnVpbGRkaXIpCisKKyAgICAgICAgcG9ydCA9ICItMSIKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IHN0YXJ0aW5nIGJ1aWxkZXIgXG4lc1xuIiAlIGNtZCkKKworICAgICAgICBjbWRvdXRwdXQgPSBzZWxmLl9zaGVsbGNtZChjbWQpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmJlLmJ1aWxkZGlyICsgIi90b2FzdGVyX3NlcnZlci5sb2ciLCAiciIpIGFzIGY6CisgICAgICAgICAgICBmb3IgaSBpbiBmLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgIGlmIGkuc3RhcnRzd2l0aCgiQml0YmFrZSBzZXJ2ZXIgYWRkcmVzcyIpOgorICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaS5zcGxpdCgiICIpWy0xXQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogRm91bmQgYml0YmFrZSBzZXJ2ZXIgcG9ydCAlcyIgJSBwb3J0KQorCisgICAgICAgIGNtZCA9ICJiYXNoIC1jIFwic291cmNlICVzL29lLWluaXQtYnVpbGQtZW52LW1lbXJlcyAtMSAlcyAmJiBEQVRBQkFTRV9VUkw9JXMgJXMgLS1vYnNlcnZlLW9ubHkgLXUgdG9hc3RlcnVpIC0tcmVtb3RlLXNlcnZlcj0wLjAuMC4wOi0xIC10IHhtbHJwY1wiIiAlIChzZWxmLnBva3lkaXJuYW1lLCBzZWxmLmJlLmJ1aWxkZGlyLCBzZWxmLmRidXJsLCBvd25fYml0YmFrZSkKKyAgICAgICAgd2l0aCBvcGVuKHRvYXN0ZXJfdWlfbG9nX2ZpbGVwYXRoLCAiYSsiKSBhcyBmOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBjd2QgPSBzZWxmLmJlLmJ1aWxkZGlyLCBzaGVsbD1UcnVlLCBzdGRvdXQ9Ziwgc3RkZXJyPWYpCisKKyAgICAgICAgZGVmIF90b2FzdGVyX3VpX3N0YXJ0ZWQoZmlsZXBhdGgsIGZpbGVwb3MgPSAwKToKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlcGF0aCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLnNlZWsoZmlsZXBvcykKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIk5PVEU6IFRvYXN0ZXJVSSB3YWl0aW5nIGZvciBldmVudHMiKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICByZXRyaWVzID0gMAorICAgICAgICBzdGFydGVkID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IHN0YXJ0ZWQgYW5kIHJldHJpZXMgPCA1MDoKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSBfdG9hc3Rlcl91aV9zdGFydGVkKHRvYXN0ZXJfdWlfbG9nX2ZpbGVwYXRoLCB0b2FzdGVyX3VpX2xvZ19maWxlbGVuZ3RoKQorICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBXYWl0aW5nIGJpdGJha2Ugc2VydmVyIHRvIHN0YXJ0IikKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICAgICAgcmV0cmllcyArPSAxCisKKyAgICAgICAgaWYgbm90IHN0YXJ0ZWQ6CisgICAgICAgICAgICB0b2FzdGVyX3VpX2xvZyA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuYmUuYnVpbGRkaXIsICJ0b2FzdGVyX3VpLmxvZyIpLCAiciIpLnJlYWQoKQorICAgICAgICAgICAgdG9hc3Rlcl9zZXJ2ZXJfbG9nID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5iZS5idWlsZGRpciwgInRvYXN0ZXJfc2VydmVyLmxvZyIpLCAiciIpLnJlYWQoKQorICAgICAgICAgICAgcmFpc2UgQnVpbGRTZXR1cEV4Y2VwdGlvbigibG9jYWxob3N0YmVjb250cm9sbGVyOiBCaXRiYWtlIHNlcnZlciBkaWQgbm90IHN0YXJ0IGluIDI1IHNlY29uZHMsIGFib3J0aW5nIChFcnJvcjogJyVzJyAnJXMnKSIgJSAodG9hc3Rlcl91aV9sb2csIHRvYXN0ZXJfc2VydmVyX2xvZykpCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IFN0YXJ0ZWQgYml0YmFrZSBzZXJ2ZXIiKQorCisgICAgICAgIHdoaWxlIHBvcnQgPT0gIi0xIjoKKyAgICAgICAgICAgICMgdGhlIHBvcnQgc3BlY2lmaWNhdGlvbiBpcyAiYXV0b2RldGVjdCI7IHJlYWQgdGhlIGJpdGJha2UubG9jayBmaWxlCisgICAgICAgICAgICB3aXRoIG9wZW4oIiVzL2JpdGJha2UubG9jayIgJSBzZWxmLmJlLmJ1aWxkZGlyLCAiciIpIGFzIGY6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZi5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgIjoiIGluIGxpbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gbGluZS5zcGxpdCgiOiIpWzFdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBBdXRvZGV0ZWN0ZWQgYml0YmFrZSBwb3J0ICVzIiwgcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgYXNzZXJ0IHNlbGYuYmUuc291cmNlZGlyIGFuZCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJlLmJ1aWxkZGlyKQorICAgICAgICBzZWxmLmJlLmJiYWRkcmVzcyA9ICJsb2NhbGhvc3QiCisgICAgICAgIHNlbGYuYmUuYmJwb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmJlLmJic3RhdGUgPSBCdWlsZEVudmlyb25tZW50LlNFUlZFUl9TVEFSVEVECisgICAgICAgIHNlbGYuYmUuc2F2ZSgpCisKKyAgICBkZWYgc3RvcEJCU2VydmVyKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBhbmQgb3MucGF0aC5leGlzdHMoc2VsZi5wb2t5ZGlybmFtZSkKKyAgICAgICAgYXNzZXJ0IHNlbGYuaXNsYXllcnNldAorICAgICAgICBzZWxmLl9zaGVsbGNtZCgiYmFzaCAtYyBcInNvdXJjZSAlcy9vZS1pbml0LWJ1aWxkLWVudiAlcyAmJiAlcyBzb3VyY2UgdG9hc3RlciBzdG9wXCIiICUKKyAgICAgICAgICAgIChzZWxmLnBva3lkaXJuYW1lLCBzZWxmLmJlLmJ1aWxkZGlyLCAobGFtYmRhOiAiIiBpZiBzZWxmLmJlLmJidG9rZW4gaXMgTm9uZSBlbHNlICJCQlRPS0VOPSVzIiAlIHNlbGYuYmUuYmJ0b2tlbikoKSkpCisgICAgICAgIHNlbGYuYmUuYmJzdGF0ZSA9IEJ1aWxkRW52aXJvbm1lbnQuU0VSVkVSX1NUT1BQRUQKKyAgICAgICAgc2VsZi5iZS5zYXZlKCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IFN0b3BwZWQgYml0YmFrZSBzZXJ2ZXIiKQorCisgICAgZGVmIGdldEdpdENsb25lRGlyZWN0b3J5KHNlbGYsIHVybCwgYnJhbmNoKToKKyAgICAgICAgIiIiIFV0aWxpdHkgdGhhdCByZXR1cm5zIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBhIGdpdCBwYXRoIGFzIGRpcmVjdG9yeQorICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIGNvbXBvbmVudHMgPSByZS5zcGxpdChyJ1s6XC5cL10nLCB1cmwpCisgICAgICAgIGJhc2UgPSBjb21wb25lbnRzWy0yXSBpZiBjb21wb25lbnRzWy0xXSA9PSAiZ2l0IiBlbHNlIGNvbXBvbmVudHNbLTFdCisKKyAgICAgICAgaWYgYnJhbmNoICE9ICJIRUFEIjoKKyAgICAgICAgICAgIHJldHVybiAiXyVzXyVzLnRvYXN0ZXJfY2xvbmVkIiAlIChiYXNlLCBicmFuY2gpCisKKworICAgICAgICAjIHdvcmQgb2YgYXR0ZW50aW9uOyB0aGlzIGlzIGEgbG9jYWxob3N0LXNwZWNpZmljIGlzc3VlOyBvbmx5IG9uIHRoZSBsb2NhbGhvc3Qgd2UgZXhwZWN0IHRvIGhhdmUgIkhFQUQiIHJlbGVhc2VzCisgICAgICAgICMgd2hpY2ggX0FMV0FZU18gbWVhbnMgdGhlIGN1cnJlbnQgcG9reSBjaGVja291dAorICAgICAgICBmcm9tIG9zLnBhdGggaW1wb3J0IGRpcm5hbWUgYXMgRE4KKyAgICAgICAgbG9jYWxfY2hlY2tvdXRfcGF0aCA9IEROKEROKEROKEROKEROKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKSkpKQorICAgICAgICAjbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IHVzaW5nIEhFQUQgY2hlY2tvdXQgaW4gJXMiICUgbG9jYWxfY2hlY2tvdXRfcGF0aCkKKyAgICAgICAgcmV0dXJuIGxvY2FsX2NoZWNrb3V0X3BhdGgKKworCisgICAgZGVmIHNldExheWVycyhzZWxmLCBiaXRiYWtlcywgbGF5ZXJzKToKKyAgICAgICAgIiIiIGEgd29yZCBvZiBhdHRlbnRpb246IGJ5IGNvbnZlbnRpb24sIHRoZSBmaXJzdCBsYXllciBmb3IgYW55IGJ1aWxkIHdpbGwgYmUgcG9reSEgIiIiCisKKyAgICAgICAgYXNzZXJ0IHNlbGYuYmUuc291cmNlZGlyIGlzIG5vdCBOb25lCisgICAgICAgIGFzc2VydCBsZW4oYml0YmFrZXMpID09IDEKKyAgICAgICAgIyBzZXQgbGF5ZXJzIGluIHRoZSBsYXllcnNvdXJjZQorCisgICAgICAgICMgMS4gZ2V0IGEgbGlzdCBvZiByZXBvcyB3aXRoIGJyYW5jaGVzLCBhbmQgbWFwIGRpcnBhdGhzIGZvciBlYWNoIGxheWVyCisgICAgICAgIGdpdHJlcG9zID0ge30KKworICAgICAgICBnaXRyZXBvc1soYml0YmFrZXNbMF0uZ2l0dXJsLCBiaXRiYWtlc1swXS5jb21taXQpXSA9IFtdCisgICAgICAgIGdpdHJlcG9zWyhiaXRiYWtlc1swXS5naXR1cmwsIGJpdGJha2VzWzBdLmNvbW1pdCldLmFwcGVuZCggKCJiaXRiYWtlIiwgYml0YmFrZXNbMF0uZGlycGF0aCkgKQorCisgICAgICAgIGZvciBsYXllciBpbiBsYXllcnM6CisgICAgICAgICAgICAjIHdlIGRvbid0IHByb2Nlc3MgbG9jYWwgVVJMcworICAgICAgICAgICAgaWYgbGF5ZXIuZ2l0dXJsLnN0YXJ0c3dpdGgoImZpbGU6Ly8iKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IChsYXllci5naXR1cmwsIGxheWVyLmNvbW1pdCkgaW4gZ2l0cmVwb3M6CisgICAgICAgICAgICAgICAgZ2l0cmVwb3NbKGxheWVyLmdpdHVybCwgbGF5ZXIuY29tbWl0KV0gPSBbXQorICAgICAgICAgICAgZ2l0cmVwb3NbKGxheWVyLmdpdHVybCwgbGF5ZXIuY29tbWl0KV0uYXBwZW5kKCAobGF5ZXIubmFtZSwgbGF5ZXIuZGlycGF0aCkgKQorCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXIsIG91ciBnaXQgcmVwb3MgYXJlICVzIiAlIHBmb3JtYXQoZ2l0cmVwb3MpKQorCisKKyAgICAgICAgIyAyLiBmaW5kIGNoZWNrZWQtb3V0IGdpdCByZXBvcyBpbiB0aGUgc291cmNlZGlyIGRpcmVjdG9yeSB0aGF0IG1heSBoZWxwIGZhc3RlciBjbG9uaW5nCisKKyAgICAgICAgY2FjaGVkX2xheWVycyA9IHt9CisgICAgICAgIGZvciBsZGlyIGluIG9zLmxpc3RkaXIoc2VsZi5iZS5zb3VyY2VkaXIpOgorICAgICAgICAgICAgZmxkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZS5zb3VyY2VkaXIsIGxkaXIpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZsZGlyKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX3NoZWxsY21kKCJnaXQgcmVtb3RlIC12IiwgZmxkaXIpLnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZSA9IGxpbmUuc3BsaXQoIlx0IilbMV0uc3BsaXQoIiAiKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlbW90ZSBub3QgaW4gY2FjaGVkX2xheWVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkX2xheWVyc1tyZW1vdGVdID0gZmxkaXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBleGNlcHQgU2hlbGxDbWRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGFueSBlcnJvcnMgaW4gY29sbGVjdGluZyBnaXQgcmVtb3RlcworICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbGF5ZXJsaXN0ID0gW10KKworCisgICAgICAgICMgMy4gY2hlY2tvdXQgdGhlIHJlcG9zaXRvcmllcworICAgICAgICBmb3IgZ2l0dXJsLCBjb21taXQgaW4gZ2l0cmVwb3Mua2V5cygpOgorICAgICAgICAgICAgbG9jYWxkaXJuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYmUuc291cmNlZGlyLCBzZWxmLmdldEdpdENsb25lRGlyZWN0b3J5KGdpdHVybCwgY29tbWl0KSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBnaXR1cmwgJXM6JXMgY2hlY2tpbmcgb3V0IGluIGN1cnJlbnQgZGlyZWN0b3J5ICVzIiAlIChnaXR1cmwsIGNvbW1pdCwgbG9jYWxkaXJuYW1lKSkKKworICAgICAgICAgICAgIyBtYWtlIHN1cmUgb3VyIGRpcmVjdG9yeSBpcyBhIGdpdCByZXBvc2l0b3J5CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NhbGRpcm5hbWUpOgorICAgICAgICAgICAgICAgIGxvY2FscmVtb3RlcyA9IHNlbGYuX3NoZWxsY21kKCJnaXQgcmVtb3RlIC12IiwgbG9jYWxkaXJuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBnaXR1cmwgaW4gbG9jYWxyZW1vdGVzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBCdWlsZFNldHVwRXhjZXB0aW9uKCJFeGlzdGluZyBnaXQgcmVwb3NpdG9yeSBhdCAlcywgYnV0IHdpdGggZGlmZmVyZW50IHJlbW90ZXMgKCclcycsIGV4cGVjdGVkICclcycpLiBUb2FzdGVyIHdpbGwgbm90IGNvbnRpbnVlIG91dCBvZiBmZWFyIG9mIGRhbWFnaW5nIHNvbWV0aGluZy4iICUgKGxvY2FsZGlybmFtZSwgIiwgIi5qb2luKGxvY2FscmVtb3Rlcy5zcGxpdCgiXG4iKSksIGdpdHVybCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGdpdHVybCBpbiBjYWNoZWRfbGF5ZXJzOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlciBnaXQtY29weWluZyAlcyB0byAlcyIgJSAoY2FjaGVkX2xheWVyc1tnaXR1cmxdLCBsb2NhbGRpcm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zaGVsbGNtZCgiZ2l0IGNsb25lIFwiJXNcIiBcIiVzXCIiICUgKGNhY2hlZF9sYXllcnNbZ2l0dXJsXSwgbG9jYWxkaXJuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2hlbGxjbWQoImdpdCByZW1vdGUgcmVtb3ZlIG9yaWdpbiIsIGxvY2FsZGlybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2hlbGxjbWQoImdpdCByZW1vdGUgYWRkIG9yaWdpbiBcIiVzXCIiICUgZ2l0dXJsLCBsb2NhbGRpcm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IGNsb25pbmcgJXM6JXMgaW4gJXMiICUgKGdpdHVybCwgY29tbWl0LCBsb2NhbGRpcm5hbWUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zaGVsbGNtZCgiZ2l0IGNsb25lIFwiJXNcIiAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggXCIlc1wiIFwiJXNcIiIgJSAoZ2l0dXJsLCBjb21taXQsIGxvY2FsZGlybmFtZSkpCisKKyAgICAgICAgICAgICMgYnJhbmNoIG1hZ2ljIG5hbWUgIkhFQUQiIHdpbGwgaW5oaWJpdCBjaGVja291dAorICAgICAgICAgICAgaWYgY29tbWl0ICE9ICJIRUFEIjoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogY2hlY2tpbmcgb3V0IGNvbW1pdCAlcyB0byAlcyAiICUgKGNvbW1pdCwgbG9jYWxkaXJuYW1lKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zaGVsbGNtZCgiZ2l0IGZldGNoIC0tYWxsICYmIGdpdCBjaGVja291dCBcIiVzXCIgJiYgZ2l0IHJlYmFzZSBcIm9yaWdpbi8lc1wiIiAlIChjb21taXQsIGNvbW1pdCkgLCBsb2NhbGRpcm5hbWUpCisKKyAgICAgICAgICAgICMgdGFrZSB0aGUgbG9jYWxkaXJuYW1lIGFzIHBva3kgZGlyIGlmIHdlIGNhbiBmaW5kIHRoZSBvZS1pbml0LWJ1aWxkLWVudgorICAgICAgICAgICAgaWYgc2VsZi5wb2t5ZGlybmFtZSBpcyBOb25lIGFuZCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4obG9jYWxkaXJuYW1lLCAib2UtaW5pdC1idWlsZC1lbnYiKSk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IHNlbGVjdGVkIHBva3kgZGlyIG5hbWUgJXMiICUgbG9jYWxkaXJuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYucG9reWRpcm5hbWUgPSBsb2NhbGRpcm5hbWUKKworICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIHdlIGhhdmUgYSB3b3JraW5nIGJpdGJha2UKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYucG9reWRpcm5hbWUsICdiaXRiYWtlJykpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogY2hlY2tpbmcgYml0YmFrZSBpbnRvIHRoZSBwb2t5IGRpcm5hbWUgJXMgIiAlIHNlbGYucG9reWRpcm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NoZWxsY21kKCJnaXQgY2xvbmUgLWIgXCIlc1wiIFwiJXNcIiBcIiVzXCIgIiAlIChiaXRiYWtlc1swXS5jb21taXQsIGJpdGJha2VzWzBdLmdpdHVybCwgb3MucGF0aC5qb2luKHNlbGYucG9reWRpcm5hbWUsICdiaXRiYWtlJykpKQorCisgICAgICAgICAgICAjIHZlcmlmeSBvdXIgcmVwb3NpdG9yaWVzCisgICAgICAgICAgICBmb3IgbmFtZSwgZGlycGF0aCBpbiBnaXRyZXBvc1soZ2l0dXJsLCBjb21taXQpXToKKyAgICAgICAgICAgICAgICBsb2NhbGRpcnBhdGggPSBvcy5wYXRoLmpvaW4obG9jYWxkaXJuYW1lLCBkaXJwYXRoKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBsb2NhbGRpcnBhdGggZXhwZWN0ZWQgJyVzJyIgJSBsb2NhbGRpcnBhdGgpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGxvY2FsZGlycGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJ1aWxkU2V0dXBFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGxheWVyIGdpdCBwYXRoICclcycgaW4gY2hlY2tlZCBvdXQgcmVwb3NpdG9yeSAnJXM6JXMnLiBBYm9ydGluZy4iICUgKGxvY2FsZGlycGF0aCwgZ2l0dXJsLCBjb21taXQpKQorCisgICAgICAgICAgICAgICAgaWYgbmFtZSAhPSAiYml0YmFrZSI6CisgICAgICAgICAgICAgICAgICAgIGxheWVybGlzdC5hcHBlbmQobG9jYWxkaXJwYXRoLnJzdHJpcCgiLyIpKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBjdXJyZW50IGxheWVyIGxpc3QgJXMgIiAlIHBmb3JtYXQobGF5ZXJsaXN0KSkKKworICAgICAgICAjIDQuIGNvbmZpZ3VyZSB0aGUgYnVpbGQgZW52aXJvbm1lbnQsIHNvIHdlIGhhdmUgYSBjb25mL2JibGF5ZXJzLmNvbmYKKyAgICAgICAgYXNzZXJ0IHNlbGYucG9reWRpcm5hbWUgaXMgbm90IE5vbmUKKyAgICAgICAgc2VsZi5fc2V0dXBCRSgpCisKKyAgICAgICAgIyA1LiB1cGRhdGUgdGhlIGJibGF5ZXJzLmNvbmYKKyAgICAgICAgYmJsYXllcmNvbmYgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZS5idWlsZGRpciwgImNvbmYvYmJsYXllcnMuY29uZiIpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhiYmxheWVyY29uZik6CisgICAgICAgICAgICByYWlzZSBCdWlsZFNldHVwRXhjZXB0aW9uKCJCRSBpcyBub3QgY29uc2lzdGVudDogYmJsYXllcnMuY29uZiBmaWxlIG1pc3NpbmcgYXQgJXMiICUgYmJsYXllcmNvbmYpCisKKyAgICAgICAgQnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIuX3VwZGF0ZUJCTGF5ZXJzKGJibGF5ZXJjb25mLCBsYXllcmxpc3QpCisKKyAgICAgICAgc2VsZi5pc2xheWVyc2V0ID0gVHJ1ZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlYWRTZXJ2ZXJMb2dGaWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5iZS5idWlsZGRpciwgInRvYXN0ZXJfc2VydmVyLmxvZyIpLCAiciIpLnJlYWQoKQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLmJlLnNvdXJjZWRpciBhbmQgb3MucGF0aC5leGlzdHMoc2VsZi5iZS5idWlsZGRpcikKKyAgICAgICAgaW1wb3J0IHNodXRpbAorICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguam9pbihzZWxmLmJlLnNvdXJjZWRpciwgImJ1aWxkIikpCisgICAgICAgIGFzc2VydCBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5iZS5idWlsZGRpcikKKworCisgICAgZGVmIHRyaWdnZXJCdWlsZChzZWxmLCBiaXRiYWtlLCBsYXllcnMsIHZhcmlhYmxlcywgdGFyZ2V0cyk6CisgICAgICAgICMgc2V0IHVwIHRoZSBidWlkIGVudmlyb25tZW50IHdpdGggdGhlIG5lZWRlZCBsYXllcnMKKyAgICAgICAgc2VsZi5zZXRMYXllcnMoYml0YmFrZSwgbGF5ZXJzKQorICAgICAgICBzZWxmLndyaXRlQ29uZkZpbGUoImNvbmYvdG9hc3Rlci1wcmUuY29uZiIsIHZhcmlhYmxlcykKKyAgICAgICAgc2VsZi53cml0ZUNvbmZGaWxlKCJjb25mL3RvYXN0ZXIuY29uZiIsIHJhdyA9ICJJTkhFUklUKz1cInRvYXN0ZXIgYnVpbGRoaXN0b3J5XCIiKQorCisgICAgICAgICMgZ2V0IHRoZSBiYiBzZXJ2ZXIgcnVubmluZyB3aXRoIHRoZSBidWlsZCByZXEgaWQgYW5kIGJ1aWxkIGVudiBpZAorICAgICAgICBiYmN0cmwgPSBzZWxmLmdldEJCQ29udHJvbGxlcigpCisKKyAgICAgICAgIyB0cmlnZ2VyIHRoZSBidWlsZCBjb21tYW5kCisgICAgICAgIHRhc2sgPSByZWR1Y2UobGFtYmRhIHgsIHk6IHggaWYgbGVuKHkpPT0gMCBlbHNlIHksIG1hcChsYW1iZGEgeTogeS50YXNrLCB0YXJnZXRzKSkKKyAgICAgICAgaWYgbGVuKHRhc2spID09IDA6CisgICAgICAgICAgICB0YXNrID0gTm9uZQorCisgICAgICAgIGJiY3RybC5idWlsZChsaXN0KG1hcChsYW1iZGEgeDp4LnRhcmdldCwgdGFyZ2V0cykpLCB0YXNrKQorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygibG9jYWxob3N0YmVjb250cm9sbGVyOiBCdWlsZCBsYXVuY2hlZCwgZXhpdGluZy4gRm9sbG93IGJ1aWxkIGxvZ3MgYXQgJXMvdG9hc3Rlcl91aS5sb2ciICUgc2VsZi5iZS5idWlsZGRpcikKKworICAgICAgICAjIGRpc2Nvbm5lY3QgZnJvbSB0aGUgc2VydmVyCisgICAgICAgIGJiY3RybC5kaXNjb25uZWN0KCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvY2hlY2tzZXR0aW5ncy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL2NoZWNrc2V0dGluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjYzdjNgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL2NoZWNrc2V0dGluZ3MucHkKQEAgLTAsMCArMSwyNDcgQEAKK2Zyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudC5iYXNlIGltcG9ydCBOb0FyZ3NDb21tYW5kLCBDb21tYW5kRXJyb3IKK2Zyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbgorZnJvbSBibGRjb250cm9sLmJiY29udHJvbGxlciBpbXBvcnQgZ2V0QnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIsIFNoZWxsQ21kRXhjZXB0aW9uCitmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZFJlcXVlc3QsIEJ1aWxkRW52aXJvbm1lbnQsIEJSRXJyb3IKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgVG9hc3RlclNldHRpbmcsIEJ1aWxkCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMsIHRyYWNlYmFjaworCitkZWYgRE4ocGF0aCk6CisgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICByZXR1cm4gIiIKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKHBhdGgpCisKKworY2xhc3MgQ29tbWFuZChOb0FyZ3NDb21tYW5kKToKKyAgICBhcmdzID0gIiIKKyAgICBoZWxwID0gIlZlcmlmaWVzIHRoYXQgdGhlIGNvbmZpZ3VyZWQgc2V0dGluZ3MgYXJlIHZhbGlkIGFuZCB1c2FibGUsIG9yIHByb21wdHMgdGhlIHVzZXIgdG8gZml4IHRoZSBzZXR0aW5ncy4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmd1ZXNzcGF0aCA9IEROKEROKEROKEROKEROKEROKEROKF9fZmlsZV9fKSkpKSkpKQorCisgICAgZGVmIF9maW5kX2ZpcnN0X3BhdGhfZm9yX2ZpbGUoc2VsZiwgc3RhcnRkaXJlY3RvcnksIGZpbGVuYW1lLCBsZXZlbCA9IDApOgorICAgICAgICBpZiBsZXZlbCA8IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBkaXJzID0gW10KKyAgICAgICAgZm9yIGkgaW4gb3MubGlzdGRpcihzdGFydGRpcmVjdG9yeSk6CisgICAgICAgICAgICBqID0gb3MucGF0aC5qb2luKHN0YXJ0ZGlyZWN0b3J5LCBpKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaik6CisgICAgICAgICAgICAgICAgaWYgaSA9PSBmaWxlbmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ZGlyZWN0b3J5CisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoaik6CisgICAgICAgICAgICAgICAgZGlycy5hcHBlbmQoaikKKyAgICAgICAgZm9yIGogaW4gZGlyczoKKyAgICAgICAgICAgIHJldCA9IHNlbGYuX2ZpbmRfZmlyc3RfcGF0aF9mb3JfZmlsZShqLCBmaWxlbmFtZSwgbGV2ZWwgLSAxKQorICAgICAgICAgICAgaWYgcmV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfcmVjdXJzaXZlX2xpc3RfZGlyZWN0b3JpZXMoc2VsZiwgc3RhcnRkaXJlY3RvcnksIGxldmVsID0gMCk6CisgICAgICAgIGlmIGxldmVsIDwgMDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBkaXJzID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4gb3MubGlzdGRpcihzdGFydGRpcmVjdG9yeSk6CisgICAgICAgICAgICAgICAgaiA9IG9zLnBhdGguam9pbihzdGFydGRpcmVjdG9yeSwgaSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGopOgorICAgICAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChqKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGogaW4gZGlyczoKKyAgICAgICAgICAgICAgICBkaXJzID0gZGlycyArIHNlbGYuX3JlY3Vyc2l2ZV9saXN0X2RpcmVjdG9yaWVzKGosIGxldmVsIC0gMSkKKyAgICAgICAgcmV0dXJuIGRpcnMKKworCisgICAgZGVmIF9nZXRfc3VnZ2VzdGVkX3NvdXJjZWRpcihzZWxmLCBiZSk6CisgICAgICAgIGlmIGJlLmJldHlwZSAhPSBCdWlsZEVudmlyb25tZW50LlRZUEVfTE9DQUw6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgcmV0dXJuIEROKEROKEROKHNlbGYuX2ZpbmRfZmlyc3RfcGF0aF9mb3JfZmlsZShzZWxmLmd1ZXNzcGF0aCwgInRvYXN0ZXJjb25mLmpzb24iLCA0KSkpKQorCisgICAgZGVmIF9nZXRfc3VnZ2VzdGVkX2J1aWxkZGlyKHNlbGYsIGJlKToKKyAgICAgICAgaWYgYmUuYmV0eXBlICE9IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICByZXR1cm4gRE4oc2VsZi5fZmluZF9maXJzdF9wYXRoX2Zvcl9maWxlKEROKHNlbGYuZ3Vlc3NwYXRoKSwgImJibGF5ZXJzLmNvbmYiLCA0KSkKKworCisgICAgZGVmIF92ZXJpZnlfYXJ0aWZhY3Rfc3RvcmFnZV9kaXIoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHRoYXQgd2UgaGF2ZSBhIHNldHRpbmdzIGZvciBkb3dubG9hZGluZyBhcnRpZmFjdHMKKyAgICAgICAgd2hpbGUgVG9hc3RlclNldHRpbmcub2JqZWN0cy5maWx0ZXIobmFtZT0iQVJUSUZBQ1RTX1NUT1JBR0VfRElSIikuY291bnQoKSA9PSAwOgorICAgICAgICAgICAgZ3Vlc3NlZHBhdGggPSBvcy5nZXRjd2QoKSArICIvdG9hc3Rlcl9idWlsZF9hcnRpZmFjdHMvIgorICAgICAgICAgICAgcHJpbnQoIlxuVG9hc3RlciBuZWVkcyB0byBrbm93IGluIHdoaWNoIGRpcmVjdG9yeSBpdCBjYW4gZG93bmxvYWQgYnVpbGQgbG9nIGZpbGVzIGFuZCBvdGhlciBhcnRpZmFjdHMuXG5Ub2FzdGVyIHN1Z2dlc3RzIFwiJXNcIi4iICUgZ3Vlc3NlZHBhdGgpCisgICAgICAgICAgICBhcnRpZmFjdHNfc3RvcmFnZV9kaXIgPSByYXdfaW5wdXQoIlByZXNzIEVudGVyIHRvIHNlbGVjdCBcIiVzXCIgb3IgdHlwZSB0aGUgZnVsbCBwYXRoIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeTogIiAlIGd1ZXNzZWRwYXRoKQorICAgICAgICAgICAgaWYgbGVuKGFydGlmYWN0c19zdG9yYWdlX2RpcikgPT0gMDoKKyAgICAgICAgICAgICAgICBhcnRpZmFjdHNfc3RvcmFnZV9kaXIgPSBndWVzc2VkcGF0aAorICAgICAgICAgICAgaWYgbGVuKGFydGlmYWN0c19zdG9yYWdlX2RpcikgPiAwIGFuZCBhcnRpZmFjdHNfc3RvcmFnZV9kaXIuc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoYXJ0aWZhY3RzX3N0b3JhZ2VfZGlyKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIG9zZToKKyAgICAgICAgICAgICAgICAgICAgaWYgIkZpbGUgZXhpc3RzIiBpbiBzdHIob3NlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIG9zZQorICAgICAgICAgICAgICAgIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuY3JlYXRlKG5hbWU9IkFSVElGQUNUU19TVE9SQUdFX0RJUiIsIHZhbHVlPWFydGlmYWN0c19zdG9yYWdlX2RpcikKKyAgICAgICAgcmV0dXJuIDAKKworCisgICAgZGVmIF92ZXJpZnlfYnVpbGRfZW52aXJvbm1lbnQoc2VsZik6CisgICAgICAgICMgcmVmdXNlIHRvIHN0YXJ0IGlmIHdlIGhhdmUgbm8gYnVpbGQgZW52aXJvbm1lbnRzCisgICAgICAgIHdoaWxlIEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5jb3VudCgpID09IDA6CisgICAgICAgICAgICBwcmludCgiICEhIE5vIGJ1aWxkIGVudmlyb25tZW50cyBmb3VuZC4gVG9hc3RlciBuZWVkcyBhdCBsZWFzdCBvbmUgYnVpbGQgZW52aXJvbm1lbnQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBydW4gYnVpbGRzLlxuIiArCisgICAgICAgICAgICAgICAgIllvdSBjYW4gbWFudWFsbHkgZGVmaW5lIGJ1aWxkIGVudmlyb25tZW50cyBpbiB0aGUgZGF0YWJhc2UgdGFibGUgYmxkY29udHJvbF9idWlsZGVudmlyb25tZW50LlxuIiArCisgICAgICAgICAgICAgICAgIk9yIFRvYXN0ZXIgY2FuIGRlZmluZSBhIHNpbXBsZSBsb2NhbGhvc3QtYmFzZWQgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHlvdS4iKQorCisgICAgICAgICAgICBpID0gcmF3X2lucHV0KCIgLS0gIERvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGJhc2ljIGxvY2FsaG9zdCBidWlsZCBlbnZpcm9ubWVudCA/IChZL24pICIpOworICAgICAgICAgICAgaWYgbm90IGxlbihpKSBvciBpLnN0YXJ0c3dpdGgoInkiKSBvciBpLnN0YXJ0c3dpdGgoIlkiKToKKyAgICAgICAgICAgICAgICBCdWlsZEVudmlyb25tZW50Lm9iamVjdHMuY3JlYXRlKHBrID0gMSwgYmV0eXBlID0gMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUb2FzdGVyIGNhbm5vdCBzdGFydCB3aXRob3V0IGJ1aWxkIGVudmlyb25tZW50cy4gQWJvcnRpbmcuIikKKworCisgICAgICAgICMgd2UgbWFrZSBzdXJlIHdlIGhhdmUgYnVpbGRkaXIgYW5kIHNvdXJjZWRpciBmb3IgYWxsIGRlZmluZWQgYnVpbGQgZW52aW9ubWVudHMKKyAgICAgICAgZm9yIGJlIGluIEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5hbGwoKToKKyAgICAgICAgICAgIGJlLm5lZWRzX2ltcG9ydCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX3ZlcmlmeV9iZSgpOgorICAgICAgICAgICAgICAgIGlzX2NoYW5nZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIHByaW50KCJcblZlcmlmeWluZyB0aGUgYnVpbGQgZW52aXJvbm1lbnQuIElmIHRoZSBsb2NhbCBidWlsZCBlbnZpcm9ubWVudCBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCwgeW91IHdpbGwgYmUgYXNrZWQgdG8gY29uZmlndXJlIGl0LiIpCisKKyAgICAgICAgICAgICAgICBkZWYgX3VwZGF0ZV9zb3VyY2VkaXIoKToKKyAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkZGlyID0gc2VsZi5fZ2V0X3N1Z2dlc3RlZF9zb3VyY2VkaXIoYmUpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihzdWdnZXN0ZWRkaXIpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlLnNvdXJjZWRpciA9IHJhd19pbnB1dCgiVGhpcyBpcyB0aGUgZGlyZWN0b3J5IFRvYXN0ZXIgdXNlcyB0byBjaGVjayBvdXQgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBsYXllcnMgeW91IHdpbGwgYnVpbGQuIFRvYXN0ZXIgd2lsbCBjcmVhdGUgbmV3IGNsb25lcyBvZiB0aGUgbGF5ZXJzLCBzbyBleGlzdGluZyBjb250ZW50IGluIHRoZSBjaG9zZW4gZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNoYW5nZWQuXG5Ub2FzdGVyIHN1Z2dlc3RzIHlvdSB1c2UgXCIlc1wiIGFzIHlvdXIgbGF5ZXJzIGNoZWNrb3V0IGRpcmVjdG9yeS4gSWYgeW91IHNlbGVjdCB0aGlzIGRpcmVjdG9yeSwgYSBsYXllciBsaWtlIFwibWV0YS1pbnRlbFwiIHdpbGwgZW5kIHVwIGluIFwiJXMvbWV0YS1pbnRlbFwiLlxuUHJlc3MgRW50ZXIgdG8gc2VsZWN0IFwiJXNcIiBvciB0eXBlIHRoZSBmdWxsIHBhdGggdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LiBJZiB5b3UgcHJvdmlkZSB5b3VyIG93biBkaXJlY3RvcnksIGl0IG11c3QgYmUgYSBwYXJlbnQgb2YgdGhlIGNsb25lZCBkaXJlY3RvcnkgZm9yIHRoZSBzb3VyY2VzIHlvdSBhcmUgdXNpbmcgdG8gcnVuIFRvYXN0ZXI6ICIgJSAoc3VnZ2VzdGVkZGlyLCBzdWdnZXN0ZWRkaXIsIHN1Z2dlc3RlZGRpcikpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBiZS5zb3VyY2VkaXIgPSByYXdfaW5wdXQoIlRvYXN0ZXIgbmVlZHMgdG8ga25vdyBpbiB3aGljaCBkaXJlY3RvcnkgaXQgc2hvdWxkIGNoZWNrIG91dCB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGxheWVycyB5b3Ugd2lsbCBidWlsZC4gVGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgYSBwYXJlbnQgb2YgdGhlIGNsb25lZCBkaXJlY3RvcnkgZm9yIHRoZSBzb3VyY2VzIHlvdSBhcmUgdXNpbmcgdG8gcnVuIFRvYXN0ZXIuIFRvYXN0ZXIgd2lsbCBjcmVhdGUgbmV3IGNsb25lcyBvZiB0aGUgbGF5ZXJzLCBzbyBleGlzdGluZyBjb250ZW50IGluIHRoZSBjaG9zZW4gZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNoYW5nZWQuXG5UeXBlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeSAoZm9yIGV4YW1wbGU6IFwiJXNcIjogIiAlIG9zLmVudmlyb24uZ2V0KCdIT01FJywgJy90bXAvJykpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihiZS5zb3VyY2VkaXIpID09IDAgYW5kIGxlbihzdWdnZXN0ZWRkaXIpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlLnNvdXJjZWRpciA9IHN1Z2dlc3RlZGRpcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICAgICAgaWYgbGVuKGJlLnNvdXJjZWRpcikgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlxuIC0tIFZhbGlkYXRpb246IFRoZSBsYXllcnMgY2hlY2tvdXQgZGlyZWN0b3J5IG11c3QgYmUgc2V0LiIKKyAgICAgICAgICAgICAgICAgICAgaXNfY2hhbmdlZCA9IF91cGRhdGVfc291cmNlZGlyKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBiZS5zb3VyY2VkaXIuc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4gLS0gVmFsaWRhdGlvbjogVGhlIGxheWVycyBjaGVja291dCBkaXJlY3RvcnkgbXVzdCBiZSBzZXQgdG8gYW4gYWJzb2x1dGUgcGF0aC4iCisgICAgICAgICAgICAgICAgICAgIGlzX2NoYW5nZWQgPSBfdXBkYXRlX3NvdXJjZWRpcigpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgYmUuc291cmNlZGlyIGluIEROKF9fZmlsZV9fKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlxuIC0tIFZhbGlkYXRpb246IFRoZSBsYXllcnMgY2hlY2tvdXQgZGlyZWN0b3J5IG11c3QgYmUgYSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgY2hlY2tvdXQuIgorICAgICAgICAgICAgICAgICAgICBpc19jaGFuZ2VkID0gX3VwZGF0ZV9zb3VyY2VkaXIoKQorCisgICAgICAgICAgICAgICAgaWYgaXNfY2hhbmdlZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgYmUuYmV0eXBlID09IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlLm5lZWRzX2ltcG9ydCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgICAgIGRlZiBfdXBkYXRlX2J1aWxkZGlyKCk6CisgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZGRpciA9IHNlbGYuX2dldF9zdWdnZXN0ZWRfYnVpbGRkaXIoYmUpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihzdWdnZXN0ZWRkaXIpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlLmJ1aWxkZGlyID0gcmF3X2lucHV0KCJUb2FzdGVyIG5lZWRzIHRvIGtub3cgd2hlcmUgeW91ciBidWlsZCBkaXJlY3RvcnkgaXMgbG9jYXRlZC5cblRoZSBidWlsZCBkaXJlY3RvcnkgaXMgd2hlcmUgYWxsIHRoZSBhcnRpZmFjdHMgY3JlYXRlZCBieSB5b3VyIGJ1aWxkcyB3aWxsIGJlIHN0b3JlZC4gVG9hc3RlciBzdWdnZXN0cyBcIiVzXCIuXG5QcmVzcyBFbnRlciB0byBzZWxlY3QgXCIlc1wiIG9yIHR5cGUgdGhlIGZ1bGwgcGF0aCB0byBhIGRpZmZlcmVudCBkaXJlY3Rvcnk6ICIgJSAoc3VnZ2VzdGVkZGlyLCBzdWdnZXN0ZWRkaXIpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYmUuYnVpbGRkaXIgPSByYXdfaW5wdXQoIlRvYXN0ZXIgbmVlZHMgdG8ga25vdyB3aGVyZSBpcyB5b3VyIGJ1aWxkIGRpcmVjdG9yeS5cblRoZSBidWlsZCBkaXJlY3RvcnkgaXMgd2hlcmUgYWxsIHRoZSBhcnRpZmFjdHMgY3JlYXRlZCBieSB5b3VyIGJ1aWxkcyB3aWxsIGJlIHN0b3JlZC4gVHlwZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgKGZvciBleGFtcGxlOiBcIiAlcy9idWlsZFwiKSIgJSBvcy5lbnZpcm9uLmdldCgnSE9NRScsJy90bXAvJykpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihiZS5idWlsZGRpcikgPT0gMCBhbmQgbGVuKHN1Z2dlc3RlZGRpcikgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYmUuYnVpbGRkaXIgPSBzdWdnZXN0ZWRkaXIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgICAgIGlmIGxlbihiZS5idWlsZGRpcikgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlxuIC0tIFZhbGlkYXRpb246IFRoZSBidWlsZCBkaXJlY3RvcnkgbXVzdCBiZSBzZXQuIgorICAgICAgICAgICAgICAgICAgICBpc19jaGFuZ2VkID0gX3VwZGF0ZV9idWlsZGRpcigpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgYmUuYnVpbGRkaXIuc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG4gLS0gVmFsaWRhdGlvbjogVGhlIGJ1aWxkIGRpcmVjdG9yeSBtdXN0IHRvIGJlIHNldCB0byBhbiBhYnNvbHV0ZSBwYXRoLiIKKyAgICAgICAgICAgICAgICAgICAgaXNfY2hhbmdlZCA9IF91cGRhdGVfYnVpbGRkaXIoKQorCisKKyAgICAgICAgICAgICAgICBpZiBpc19jaGFuZ2VkOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG5CdWlsZCBjb25maWd1cmF0aW9uIHNhdmVkIgorICAgICAgICAgICAgICAgICAgICBiZS5zYXZlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworCisgICAgICAgICAgICAgICAgaWYgYmUubmVlZHNfaW1wb3J0OgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXG5Ub2FzdGVyIGNhbiB1c2UgYSBTSU5HTEUgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9uIGZpbGUgdG8gc2V0IHVwIGRlZmF1bHQgcHJvamVjdCBzZXR0aW5ncyBhbmQgbGF5ZXIgaW5mb3JtYXRpb24gc291cmNlcy5cbiIKKworICAgICAgICAgICAgICAgICAgICAjIGZpbmQgY29uZmlndXJhdGlvbiBmaWxlcworICAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZXMgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgZGlybmFtZSBpbiBzZWxmLl9yZWN1cnNpdmVfbGlzdF9kaXJlY3RvcmllcyhiZS5zb3VyY2VkaXIsMik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZGlybmFtZSwgIi50ZW1wbGF0ZWNvbmYiKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbignYmFzaCAtYyAiLiAnK29zLnBhdGguam9pbihkaXJuYW1lLCAiLnRlbXBsYXRlY29uZiIpKyc7IGVjaG8gXCJcJFRFTVBMQVRFQ09ORlwiIicsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmZpbGVwYXRoLCBzdGRlcnJvcm91dHB1dCA9IHByb2MuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Mud2FpdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJvYy5yZXR1cm5jb2RlICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIHNvdXJjZSBURU1QTEFURUNPTkY6ICVzIiAlIHN0ZGVycm9yb3V0cHV0KQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKGNvbmZmaWxlcGF0aC5zdHJpcCgpLCAidG9hc3RlcmNvbmYuanNvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgY29uZmZpbGVwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJ0b2FzdGVyX2Nsb25lZCIgaW4gY2FuZGlkYXRlZmlsZXBhdGg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY2FuZGlkYXRlZmlsZXBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZXMuYXBwZW5kKGNhbmRpZGF0ZWZpbGVwYXRoKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihjb25maWdfZmlsZXMpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJUb2FzdGVyIHdpbGwgbGlzdCBub3cgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCBpdCBmb3VuZC4gU2VsZWN0IHRoZSBudW1iZXIgdG8gdXNlIHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gZmlsZS4iCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2YgaW4gY29uZmlnX2ZpbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIgIFslZF0gLSAlcyIgJSAoY29uZmlnX2ZpbGVzLmluZGV4KGNmKSArIDEsIGNmKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlxuICBbMF0gLSBFeGl0IHdpdGhvdXQgaW1wb3J0aW5nIGFueSBmaWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmF3X2lucHV0KCJcbkVudGVyIHlvdXIgb3B0aW9uOiAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oaSkgYW5kIChpbnQoaSkgLSAxID49IDAgYW5kIGludChpKSAtIDEgPCBsZW4oY29uZmlnX2ZpbGVzKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiXG5JbXBvcnRpbmcgZmlsZTogJXMiICUgY29uZmlnX2ZpbGVzW2ludChpKS0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBsb2FkY29uZiBpbXBvcnQgQ29tbWFuZCBhcyBMb2FkQ29uZmlnQ29tbWFuZAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQ29uZmlnQ29tbWFuZCgpLl9pbXBvcnRfbGF5ZXJfY29uZmlnKGNvbmZpZ19maWxlc1tpbnQoaSktMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlIHJ1biBsc3VwZGF0ZXMgYWZ0ZXIgY29uZmlnIHVwZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlxuTGF5ZXIgY29uZmlndXJhdGlvbiBpbXBvcnRlZC4gVXBkYXRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5ZXIgc291cmNlcywgcGxlYXNlIHdhaXQuXG5Zb3UgY2FuIHJlLXVwZGF0ZSBhbnkgdGltZSBsYXRlciBieSBydW5uaW5nIGJpdGJha2UvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IGxzdXBkYXRlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudCBpbXBvcnQgY2FsbF9jb21tYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX2NvbW1hbmQoImxzdXBkYXRlcyIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgZG9uJ3QgbG9vayBmb3IgYW55IG90aGVyIGNvbmZpZyBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzX2NoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiRmFpbHVyZSB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IHRoZSB0b2FzdGVyIGNvbmZpZyBmaWxlOiAlcyIgJSBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhlKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlxuVG9hc3RlciBjb3VsZCBub3QgZmluZCBhIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IG5lZWQgdG8gY29uZmlndXJlIFRvYXN0ZXIgbWFudWFsbHkgdXNpbmcgdGhlIHdlYiBpbnRlcmZhY2UsIG9yIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdXNlXG4gIGJpdGJha2UvbGliL3RvYXN0ZXIvbWFuYWdlcHkucHkgbG9hZGNvbmYgW2ZpbGVuYW1lXVxuIGNvbW1hbmQgdG8gbG9hZCBpdC4gWW91IGNhbiB1c2UgaHR0cHM6Ly93aWtpLnlvY3RvcHJvamVjdC5vcmcvd2lraS9GaWxlOlRvYXN0ZXJjb25mLmpzb24udHh0LnBhdGNoIGFzIGEgc3RhcnRpbmcgcG9pbnQuIgorCisKKworCisgICAgICAgICAgICAgICAgcmV0dXJuIGlzX2NoYW5nZWQKKworICAgICAgICAgICAgd2hpbGUgKF92ZXJpZnlfYmUoKSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF92ZXJpZnlfZGVmYXVsdF9zZXR0aW5ncyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCBkZWZhdWx0IHNldHRpbmdzIGFyZSB0aGVyZQorICAgICAgICBpZiBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmZpbHRlcihuYW1lID0gJ0RFRkFVTFRfUkVMRUFTRScpLmNvdW50KCkgIT0gMToKKyAgICAgICAgICAgIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuZmlsdGVyKG5hbWUgPSAnREVGQVVMVF9SRUxFQVNFJykuZGVsZXRlKCkKKyAgICAgICAgICAgIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShuYW1lID0gJ0RFRkFVTFRfUkVMRUFTRScsIHZhbHVlID0gJycpCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX3ZlcmlmeV9idWlsZHNfaW5fcHJvZ3Jlc3Moc2VsZik6CisgICAgICAgICMgd2UgYXJlIGp1c3Qgc3RhcnRpbmcgdXAuIHdlIG11c3Qgbm90IGhhdmUgYW55IGJ1aWxkcyBpbiBwcm9ncmVzcywgb3IgYnVpbGQgZW52aXJvbm1lbnRzIHRha2VuCisgICAgICAgIGZvciBiIGluIEJ1aWxkUmVxdWVzdC5vYmplY3RzLmZpbHRlcihzdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfSU5QUk9HUkVTUyk6CisgICAgICAgICAgICBCUkVycm9yLm9iamVjdHMuY3JlYXRlKHJlcSA9IGIsIGVycnR5cGUgPSAidG9hc3RlciIsIGVycm1zZyA9ICJUb2FzdGVyIGZvdW5kIHRoaXMgYnVpbGQgSU4gUFJPR1JFU1Mgd2hpbGUgVG9hc3RlciBzdGFydGVkIHVwLiBUaGlzIGlzIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgYW5kIHRoZSBidWlsZCB3YXMgbWFya2VkIGFzIGZhaWxlZCIpCisKKyAgICAgICAgQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9JTlBST0dSRVNTKS51cGRhdGUoc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0ZBSUxFRCkKKworICAgICAgICBCdWlsZEVudmlyb25tZW50Lm9iamVjdHMudXBkYXRlKGxvY2sgPSBCdWlsZEVudmlyb25tZW50LkxPQ0tfRlJFRSkKKworICAgICAgICAjIGFsc28gbWFyayAiSW4gUHJvZ3Jlc3MgYnVpbGRzIGFzIGZhaWx1cmVzIgorICAgICAgICBmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKKyAgICAgICAgQnVpbGQub2JqZWN0cy5maWx0ZXIob3V0Y29tZSA9IEJ1aWxkLklOX1BST0dSRVNTKS51cGRhdGUob3V0Y29tZSA9IEJ1aWxkLkZBSUxFRCwgY29tcGxldGVkX29uID0gdGltZXpvbmUubm93KCkpCisKKyAgICAgICAgcmV0dXJuIDAKKworCisKKyAgICBkZWYgaGFuZGxlX25vYXJncyhzZWxmLCAqKm9wdGlvbnMpOgorICAgICAgICByZXR2YWwgPSAwCisgICAgICAgIHJldHZhbCArPSBzZWxmLl92ZXJpZnlfYXJ0aWZhY3Rfc3RvcmFnZV9kaXIoKQorICAgICAgICByZXR2YWwgKz0gc2VsZi5fdmVyaWZ5X2J1aWxkX2Vudmlyb25tZW50KCkKKyAgICAgICAgcmV0dmFsICs9IHNlbGYuX3ZlcmlmeV9kZWZhdWx0X3NldHRpbmdzKCkKKyAgICAgICAgcmV0dmFsICs9IHNlbGYuX3ZlcmlmeV9idWlsZHNfaW5fcHJvZ3Jlc3MoKQorCisgICAgICAgIHJldHVybiByZXR2YWwKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL2xvYWRjb25mLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvbG9hZGNvbmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyMmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9tYW5hZ2VtZW50L2NvbW1hbmRzL2xvYWRjb25mLnB5CkBAIC0wLDAgKzEsMTgzIEBACitmcm9tIGRqYW5nby5jb3JlLm1hbmFnZW1lbnQuYmFzZSBpbXBvcnQgQmFzZUNvbW1hbmQsIENvbW1hbmRFcnJvcgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBMYXllclNvdXJjZSwgVG9hc3RlclNldHRpbmcsIEJyYW5jaCwgTGF5ZXIsIExheWVyX1ZlcnNpb24KK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgQml0YmFrZVZlcnNpb24sIFJlbGVhc2UsIFJlbGVhc2VEZWZhdWx0TGF5ZXIsIFJlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5Citmcm9tIGRqYW5nby5kYiBpbXBvcnQgSW50ZWdyaXR5RXJyb3IKK2ltcG9ydCBvcworCitmcm9tIGNoZWNrc2V0dGluZ3MgaW1wb3J0IEROCisKK2ltcG9ydCBsb2dnaW5nCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidG9hc3RlciIpCisKK2RlZiBfcmVkdWNlX2Nhbm9uX3BhdGgocGF0aCk6CisgICAgY29tcG9uZW50cyA9IFtdCisgICAgZm9yIGMgaW4gcGF0aC5zcGxpdCgiLyIpOgorICAgICAgICBpZiBjID09ICIuLiI6CisgICAgICAgICAgICBkZWwgY29tcG9uZW50c1stMV0KKyAgICAgICAgZWxpZiBjID09ICIuIjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYXBwZW5kKGMpCisgICAgaWYgbGVuKGNvbXBvbmVudHMpIDwgMjoKKyAgICAgICAgY29tcG9uZW50cy5hcHBlbmQoJycpCisgICAgcmV0dXJuICIvIi5qb2luKGNvbXBvbmVudHMpCisKK2RlZiBfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlKHMpOgorICAgIGZvciBpIGluIExheWVyU291cmNlLlNPVVJDRV9UWVBFOgorICAgICAgICBpZiBzID09IGlbMV06CisgICAgICAgICAgICByZXR1cm4gaVswXQorICAgIHJhaXNlIEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgZGVmaW5pdGlvbiBmb3Igc291cmNldHlwZSAnJXMnLiBWYWxpZCBzb3VyY2UgdHlwZXMgYXJlICVzIiAlIChzdHIocyksICcsICcuam9pbihtYXAobGFtYmRhIHg6ICInJXMnIiAlIHhbMV0sIExheWVyU291cmNlLlNPVVJDRV9UWVBFICkpKSkKKworY2xhc3MgQ29tbWFuZChCYXNlQ29tbWFuZCk6CisgICAgaGVscCA9ICJMb2FkcyBhIHRvYXN0ZXJjb25mLmpzb24gZmlsZSBpbiB0aGUgZGF0YWJhc2UiCisgICAgYXJncyA9ICJmaWxlcGF0aCIKKworCisKKyAgICBkZWYgX2ltcG9ydF9sYXllcl9jb25maWcoc2VsZiwgZmlsZXBhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZXBhdGgpIG9yIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlcGF0aCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZhaWxlZCB0byBmaW5kIHRvYXN0ZXIgY29uZmlnIGZpbGUgJXMgLiIgJSBmaWxlcGF0aCkKKworICAgICAgICBpbXBvcnQganNvbgorICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhvcGVuKGZpbGVwYXRoLCAiciIpLnJlYWQoKSkKKworICAgICAgICAjIHZlcmlmeSBjb25maWcgZmlsZSB2YWxpZGl0eSBiZWZvcmUgdXBkYXRpbmcgc2V0dGluZ3MKKyAgICAgICAgZm9yIGkgaW4gWydiaXRiYWtlJywgJ3JlbGVhc2VzJywgJ2RlZmF1bHRyZWxlYXNlJywgJ2NvbmZpZycsICdsYXllcnNvdXJjZXMnXToKKyAgICAgICAgICAgIGFzc2VydCBpIGluIGRhdGEKKworICAgICAgICBkZWYgX3JlYWRfZ2l0X3VybF9mcm9tX2xvY2FsX3JlcG9zaXRvcnkoYWRkcmVzcyk6CisgICAgICAgICAgICB1cmwgPSBOb25lCisgICAgICAgICAgICAjIHdlIGRldGVjdCB0aGUgcmVtb3RlIG5hbWUgYXQgcnVudGltZQorICAgICAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgICAgIChyZW1vdGUsIHJlbW90ZV9uYW1lKSA9IGFkZHJlc3Muc3BsaXQoIjoiLCAxKQorICAgICAgICAgICAgY21kID0gc3VicHJvY2Vzcy5Qb3BlbigiZ2l0IHJlbW90ZSAtdiIsIHNoZWxsPVRydWUsIGN3ZCA9IG9zLnBhdGguZGlybmFtZShmaWxlcGF0aCksIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVyciA9IHN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgIChvdXQsZXJyKSA9IGNtZC5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBpZiBjbWQucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiRXJyb3Igd2hpbGUgaW1wb3J0aW5nIGxheWVyIHZjc191cmw6IGdpdCBlcnJvcjogJXMiICUgZXJyKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gb3V0LnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgKG5hbWUsIHBhdGgpID0gbGluZS5zcGxpdCgiXHQiLCAxKQorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lID09IHJlbW90ZV9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gcGF0aC5zcGxpdCgiICIpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBpZiB1cmwgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIkVycm9yIHdoaWxlIGxvb2tpbmcgZm9yIHJlbW90ZSBcIiVzXCIgaW4gXCIlc1wiIiAlIChyZW1vdGVfbmFtZSwgb3V0KSkKKyAgICAgICAgICAgIHJldHVybiB1cmwKKworCisgICAgICAgICMgaW1wb3J0IGJpdGJha2UgZGF0YQorICAgICAgICBmb3IgYnZpIGluIGRhdGFbJ2JpdGJha2UnXToKKyAgICAgICAgICAgIGJ2bywgY3JlYXRlZCA9IEJpdGJha2VWZXJzaW9uLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShuYW1lPWJ2aVsnbmFtZSddKQorICAgICAgICAgICAgaWYgYnZpWydnaXR1cmwnXS5zdGFydHN3aXRoKCJyZW1vdGU6Iik6CisgICAgICAgICAgICAgICAgYnZvLmdpdHVybCA9IF9yZWFkX2dpdF91cmxfZnJvbV9sb2NhbF9yZXBvc2l0b3J5KGJ2aVsnZ2l0dXJsJ10pCisgICAgICAgICAgICAgICAgaWYgYnZvLmdpdHVybCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlRoZSB0b2FzdGVyIGNvbmZpZyBmaWxlIHJlZmVyZW5jZXMgdGhlIGxvY2FsIGdpdCByZXBvLCBidXQgVG9hc3RlciBjYW5ub3QgZGV0ZWN0IGl0LlxuWW91ciBsb2NhbCBjb25maWd1cmF0aW9uIGZvciBiaXRiYWtlIHZlcnNpb24gJXMgaXMgaW52YWxpZC4gTWFrZSBzdXJlIHRoYXQgdGhlIHRvYXN0ZXJjb25mLmpzb24gZmlsZSBpcyBjb3JyZWN0LiIgJSBidmlbJ25hbWUnXSkKKworICAgICAgICAgICAgaWYgYnZvLmdpdHVybCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJ2by5naXR1cmwgPSBidmlbJ2dpdHVybCddCisgICAgICAgICAgICBidm8uYnJhbmNoID0gYnZpWydicmFuY2gnXQorICAgICAgICAgICAgYnZvLmRpcnBhdGggPSBidmlbJ2RpcnBhdGgnXQorICAgICAgICAgICAgYnZvLnNhdmUoKQorCisgICAgICAgICMgc2V0IHRoZSBsYXllciBzb3VyY2VzCisgICAgICAgIGZvciBsc2kgaW4gZGF0YVsnbGF5ZXJzb3VyY2VzJ106CisgICAgICAgICAgICBhc3NlcnQgJ3NvdXJjZXR5cGUnIGluIGxzaQorICAgICAgICAgICAgYXNzZXJ0ICdhcGl1cmwnIGluIGxzaQorICAgICAgICAgICAgYXNzZXJ0ICduYW1lJyBpbiBsc2kKKyAgICAgICAgICAgIGFzc2VydCAnYnJhbmNoZXMnIGluIGxzaQorCisKKyAgICAgICAgICAgIGlmIF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUobHNpWydzb3VyY2V0eXBlJ10pID09IExheWVyU291cmNlLlRZUEVfTEFZRVJJTkRFWCBvciBsc2lbJ2FwaXVybCddLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgICAgICAgICBhcGl1cmwgPSBsc2lbJ2FwaXVybCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFwaXVybCA9IF9yZWR1Y2VfY2Fub25fcGF0aChvcy5wYXRoLmpvaW4oRE4ob3MucGF0aC5hYnNwYXRoKGZpbGVwYXRoKSksIGxzaVsnYXBpdXJsJ10pKQorCisgICAgICAgICAgICBhc3NlcnQgKChfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlKGxzaVsnc291cmNldHlwZSddKSA9PSBMYXllclNvdXJjZS5UWVBFX0xBWUVSSU5ERVgpIG9yIGFwaXVybC5zdGFydHN3aXRoKCIvIikpLCAobHNpWydzb3VyY2V0eXBlJ10sYXBpdXJsKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbHMsIGNyZWF0ZWQgPSBMYXllclNvdXJjZS5vYmplY3RzLmdldF9vcl9jcmVhdGUoc291cmNldHlwZSA9IF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUobHNpWydzb3VyY2V0eXBlJ10pLCBhcGl1cmwgPSBhcGl1cmwpCisgICAgICAgICAgICAgICAgbHMubmFtZSA9IGxzaVsnbmFtZSddCisgICAgICAgICAgICAgICAgbHMuc2F2ZSgpCisgICAgICAgICAgICBleGNlcHQgSW50ZWdyaXR5RXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiSW50ZWdyaXR5RXJyb3IgJXMgXG5XaGlsZSBzZXR0aW5nIG5hbWUgJXMgZm9yIGxheWVyIHNvdXJjZSAlcyAiICUgKGUsIGxzaVsnbmFtZSddLCBscykpCisKKworICAgICAgICAgICAgbGF5ZXJicmFuY2hlcyA9IFtdCisgICAgICAgICAgICBmb3IgYnJhbmNobmFtZSBpbiBsc2lbJ2JyYW5jaGVzJ106CisgICAgICAgICAgICAgICAgYm8sIGNyZWF0ZWQgPSBCcmFuY2gub2JqZWN0cy5nZXRfb3JfY3JlYXRlKGxheWVyX3NvdXJjZSA9IGxzLCBuYW1lID0gYnJhbmNobmFtZSkKKyAgICAgICAgICAgICAgICBsYXllcmJyYW5jaGVzLmFwcGVuZChibykKKworICAgICAgICAgICAgaWYgJ2xheWVycycgaW4gbHNpOgorICAgICAgICAgICAgICAgIGZvciBsYXllcmluZm8gaW4gbHNpWydsYXllcnMnXToKKyAgICAgICAgICAgICAgICAgICAgbG8sIGNyZWF0ZWQgPSBMYXllci5vYmplY3RzLmdldF9vcl9jcmVhdGUobGF5ZXJfc291cmNlID0gbHMsIG5hbWUgPSBsYXllcmluZm9bJ25hbWUnXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGF5ZXJpbmZvWydsb2NhbF9wYXRoJ10uc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgbG8ubG9jYWxfcGF0aCA9IGxheWVyaW5mb1snbG9jYWxfcGF0aCddCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsby5sb2NhbF9wYXRoID0gX3JlZHVjZV9jYW5vbl9wYXRoKG9zLnBhdGguam9pbihscy5hcGl1cmwsIGxheWVyaW5mb1snbG9jYWxfcGF0aCddKSkKKworICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobG8ubG9jYWxfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkxvY2FsIGxheWVyIHBhdGggJXMgbXVzdCBleGlzdHMuIEFyZSB5b3UgdHJ5aW5nIHRvIGltcG9ydCBhIGxheWVyIHRoYXQgZG9lcyBub3QgZXhpc3QgPyBDaGVjayB5b3VyIGxvY2FsIHRvYXN0ZXJjb25mLmpzb24iICUgbG8ubG9jYWxfcGF0aCkKKworICAgICAgICAgICAgICAgICAgICBpZiBsYXllcmluZm9bJ3Zjc191cmwnXS5zdGFydHN3aXRoKCJyZW1vdGU6Iik6CisgICAgICAgICAgICAgICAgICAgICAgICBsby52Y3NfdXJsID0gX3JlYWRfZ2l0X3VybF9mcm9tX2xvY2FsX3JlcG9zaXRvcnkobGF5ZXJpbmZvWyd2Y3NfdXJsJ10pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsby52Y3NfdXJsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJUaGUgdG9hc3RlciBjb25maWcgZmlsZSByZWZlcmVuY2VzIHRoZSBsb2NhbCBnaXQgcmVwbywgYnV0IFRvYXN0ZXIgY2Fubm90IGRldGVjdCBpdC5cbllvdXIgbG9jYWwgY29uZmlndXJhdGlvbiBmb3IgbGF5ZXIgJXMgaXMgaW52YWxpZC4gTWFrZSBzdXJlIHRoYXQgdGhlIHRvYXN0ZXJjb25mLmpzb24gZmlsZSBpcyBjb3JyZWN0LiIgJSBsYXllcmluZm9bJ25hbWUnXSkKKworICAgICAgICAgICAgICAgICAgICBpZiBsby52Y3NfdXJsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsby52Y3NfdXJsID0gbGF5ZXJpbmZvWyd2Y3NfdXJsJ10KKworICAgICAgICAgICAgICAgICAgICBpZiAnbGF5ZXJfaW5kZXhfdXJsJyBpbiBsYXllcmluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBsby5sYXllcl9pbmRleF91cmwgPSBsYXllcmluZm9bJ2xheWVyX2luZGV4X3VybCddCisgICAgICAgICAgICAgICAgICAgIGxvLnNhdmUoKQorCisgICAgICAgICAgICAgICAgICAgIGZvciBicmFuY2ggaW4gbGF5ZXJicmFuY2hlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGx2bywgY3JlYXRlZCA9IExheWVyX1ZlcnNpb24ub2JqZWN0cy5nZXRfb3JfY3JlYXRlKGxheWVyX3NvdXJjZSA9IGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cF9icmFuY2ggPSBicmFuY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCA9IGJyYW5jaC5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9IGxvKQorICAgICAgICAgICAgICAgICAgICAgICAgbHZvLmRpcnBhdGggPSBsYXllcmluZm9bJ2RpcnBhdGgnXQorICAgICAgICAgICAgICAgICAgICAgICAgbHZvLnNhdmUoKQorICAgICAgICAjIHNldCByZWxlYXNlcworICAgICAgICBmb3IgcmkgaW4gZGF0YVsncmVsZWFzZXMnXToKKyAgICAgICAgICAgIGJ2byA9IEJpdGJha2VWZXJzaW9uLm9iamVjdHMuZ2V0KG5hbWUgPSByaVsnYml0YmFrZSddKQorICAgICAgICAgICAgYXNzZXJ0IGJ2byBpcyBub3QgTm9uZQorCisgICAgICAgICAgICBybywgY3JlYXRlZCA9IFJlbGVhc2Uub2JqZWN0cy5nZXRfb3JfY3JlYXRlKG5hbWUgPSByaVsnbmFtZSddLCBiaXRiYWtlX3ZlcnNpb24gPSBidm8sIGJyYW5jaF9uYW1lID0gcmlbJ2JyYW5jaCddKQorICAgICAgICAgICAgcm8uZGVzY3JpcHRpb24gPSByaVsnZGVzY3JpcHRpb24nXQorICAgICAgICAgICAgcm8uaGVscHRleHQgPSByaVsnaGVscHRleHQnXQorICAgICAgICAgICAgcm8uc2F2ZSgpCisKKyAgICAgICAgICAgICMgc2F2ZSBsYXllciBzb3VyY2UgcHJpb3JpdHkgZm9yIHJlbGVhc2UKKyAgICAgICAgICAgIGZvciBsc19uYW1lIGluIHJpWydsYXllcnNvdXJjZXByaW9yaXR5J10ua2V5cygpOgorICAgICAgICAgICAgICAgIHJsc3BvLCBjcmVhdGVkID0gUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHkub2JqZWN0cy5nZXRfb3JfY3JlYXRlKHJlbGVhc2UgPSBybywgbGF5ZXJfc291cmNlID0gTGF5ZXJTb3VyY2Uub2JqZWN0cy5nZXQobmFtZT1sc19uYW1lKSkKKyAgICAgICAgICAgICAgICBybHNwby5wcmlvcml0eSA9IHJpWydsYXllcnNvdXJjZXByaW9yaXR5J11bbHNfbmFtZV0KKyAgICAgICAgICAgICAgICBybHNwby5zYXZlKCkKKworICAgICAgICAgICAgZm9yIGRsaSBpbiByaVsnZGVmYXVsdGxheWVycyddOgorICAgICAgICAgICAgICAgICMgZmluZCBsYXllcnMgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICAgICAgICAgICAgUmVsZWFzZURlZmF1bHRMYXllci5vYmplY3RzLmdldF9vcl9jcmVhdGUoIHJlbGVhc2UgPSBybywgbGF5ZXJfbmFtZSA9IGRsaSkKKworICAgICAgICAjIHNldCBkZWZhdWx0IHJlbGVhc2UKKyAgICAgICAgaWYgVG9hc3RlclNldHRpbmcub2JqZWN0cy5maWx0ZXIobmFtZSA9ICJERUZBVUxUX1JFTEVBU0UiKS5jb3VudCgpID4gMDoKKyAgICAgICAgICAgIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuZmlsdGVyKG5hbWUgPSAiREVGQVVMVF9SRUxFQVNFIikudXBkYXRlKHZhbHVlID0gZGF0YVsnZGVmYXVsdHJlbGVhc2UnXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuY3JlYXRlKG5hbWUgPSAiREVGQVVMVF9SRUxFQVNFIiwgdmFsdWUgPSBkYXRhWydkZWZhdWx0cmVsZWFzZSddKQorCisgICAgICAgICMgc2V0IGRlZmF1bHQgY29uZmlnIHZhcmlhYmxlcworICAgICAgICBmb3IgY29uZmlnbmFtZSBpbiBkYXRhWydjb25maWcnXToKKyAgICAgICAgICAgIGlmIFRvYXN0ZXJTZXR0aW5nLm9iamVjdHMuZmlsdGVyKG5hbWUgPSAiREVGQ09ORl8iICsgY29uZmlnbmFtZSkuY291bnQoKSA+IDA6CisgICAgICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5maWx0ZXIobmFtZSA9ICJERUZDT05GXyIgKyBjb25maWduYW1lKS51cGRhdGUodmFsdWUgPSBkYXRhWydjb25maWcnXVtjb25maWduYW1lXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgVG9hc3RlclNldHRpbmcub2JqZWN0cy5jcmVhdGUobmFtZSA9ICJERUZDT05GXyIgKyBjb25maWduYW1lLCB2YWx1ZSA9IGRhdGFbJ2NvbmZpZyddW2NvbmZpZ25hbWVdKQorCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsICphcmdzLCAqKm9wdGlvbnMpOgorICAgICAgICBpZiBsZW4oYXJncykgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigiTmVlZCBhIHBhdGggdG8gdGhlIHRvYXN0ZXJjb25mLmpzb24gZmlsZSIpCisgICAgICAgIGZpbGVwYXRoID0gYXJnc1swXQorICAgICAgICBzZWxmLl9pbXBvcnRfbGF5ZXJfY29uZmlnKGZpbGVwYXRoKQorCisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvcnVuYnVpbGRzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21hbmFnZW1lbnQvY29tbWFuZHMvcnVuYnVpbGRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTliNzQKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWFuYWdlbWVudC9jb21tYW5kcy9ydW5idWlsZHMucHkKQEAgLTAsMCArMSwxNTMgQEAKK2Zyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudC5iYXNlIGltcG9ydCBOb0FyZ3NDb21tYW5kLCBDb21tYW5kRXJyb3IKK2Zyb20gZGphbmdvLmRiIGltcG9ydCB0cmFuc2FjdGlvbgorZnJvbSBvcm0ubW9kZWxzIGltcG9ydCBCdWlsZCwgVG9hc3RlclNldHRpbmcsIExvZ01lc3NhZ2UsIFRhcmdldAorZnJvbSBibGRjb250cm9sLmJiY29udHJvbGxlciBpbXBvcnQgZ2V0QnVpbGRFbnZpcm9ubWVudENvbnRyb2xsZXIsIFNoZWxsQ21kRXhjZXB0aW9uLCBCdWlsZFNldHVwRXhjZXB0aW9uCitmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZFJlcXVlc3QsIEJ1aWxkRW52aXJvbm1lbnQsIEJSRXJyb3IsIEJSVmFyaWFibGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKKworbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIlRvYXN0ZXJTY2hlZHVsZXIiKQorCitjbGFzcyBDb21tYW5kKE5vQXJnc0NvbW1hbmQpOgorICAgIGFyZ3MgICAgPSAiIgorICAgIGhlbHAgICAgPSAiU2NoZWR1bGVzIGFuZCBleGVjdXRlcyBidWlsZCByZXF1ZXN0cyBhcyBwb3NzaWJsZS4gRG9lcyBub3QgcmV0dXJuIChpbnRlcnJ1cHQgd2l0aCBDdHJsLUMpIgorCisKKyAgICBAdHJhbnNhY3Rpb24uY29tbWl0X29uX3N1Y2Nlc3MKKyAgICBkZWYgX3NlbGVjdEJ1aWxkRW52aXJvbm1lbnQoc2VsZik6CisgICAgICAgIGJlYyA9IGdldEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyKGxvY2sgPSBCdWlsZEVudmlyb25tZW50LkxPQ0tfRlJFRSkKKyAgICAgICAgYmVjLmJlLmxvY2sgPSBCdWlsZEVudmlyb25tZW50LkxPQ0tfTE9DSworICAgICAgICBiZWMuYmUuc2F2ZSgpCisgICAgICAgIHJldHVybiBiZWMKKworICAgIEB0cmFuc2FjdGlvbi5jb21taXRfb25fc3VjY2VzcworICAgIGRlZiBfc2VsZWN0QnVpbGRSZXF1ZXN0KHNlbGYpOgorICAgICAgICBiciA9IEJ1aWxkUmVxdWVzdC5vYmplY3RzLmZpbHRlcihzdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfUVVFVUVEKS5vcmRlcl9ieSgncGsnKVswXQorICAgICAgICBici5zdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfSU5QUk9HUkVTUworICAgICAgICBici5zYXZlKCkKKyAgICAgICAgcmV0dXJuIGJyCisKKyAgICBkZWYgc2NoZWR1bGUoc2VsZik6CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnIgPSBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBzZWxlY3QgdGhlIGJ1aWxkIGVudmlyb25tZW50IGFuZCB0aGUgcmVxdWVzdCB0byBidWlsZAorICAgICAgICAgICAgICAgIGJyID0gc2VsZi5fc2VsZWN0QnVpbGRSZXF1ZXN0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgI2xvZ2dlci5kZWJ1ZygicnVuYnVpbGRzOiBObyBidWlsZCByZXF1ZXN0IikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiZWMgPSBzZWxmLl9zZWxlY3RCdWlsZEVudmlyb25tZW50KCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgIyB3ZSBjb3VsZCBub3QgZmluZCBhIEJFQzsgcG9zdHBvbmUgdGhlIEJSCisgICAgICAgICAgICAgICAgYnIuc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX1FVRVVFRAorICAgICAgICAgICAgICAgIGJyLnNhdmUoKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygicnVuYnVpbGRzOiBObyBidWlsZCBlbnYiKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoInJ1bmJ1aWxkczogc3RhcnRpbmcgYnVpbGQgJXMsIGVudmlyb25tZW50ICVzIiAlIChiciwgYmVjLmJlKSkKKworICAgICAgICAgICAgIyB3cml0ZSB0aGUgYnVpbGQgaWRlbnRpZmljYXRpb24gdmFyaWFibGUKKyAgICAgICAgICAgIEJSVmFyaWFibGUub2JqZWN0cy5jcmVhdGUocmVxID0gYnIsIG5hbWU9IlRPQVNURVJfQlJCRSIsIHZhbHVlPSIlZDolZCIgJSAoYnIucGssIGJlYy5iZS5waykpCisKKyAgICAgICAgICAgICMgbGV0IHRoZSBidWlsZCByZXF1ZXN0IGtub3cgd2hlcmUgaXQgaXMgYmVpbmcgZXhlY3V0ZWQKKyAgICAgICAgICAgIGJyLmVudmlyb25tZW50ID0gYmVjLmJlCisgICAgICAgICAgICBici5zYXZlKCkKKworICAgICAgICAgICAgIyB0aGlzIHRyaWdnZXJzIGFuIGFzeW5jIGJ1aWxkCisgICAgICAgICAgICBiZWMudHJpZ2dlckJ1aWxkKGJyLmJyYml0YmFrZV9zZXQuYWxsKCksIGJyLmJybGF5ZXJfc2V0LmFsbCgpLCBici5icnZhcmlhYmxlX3NldC5hbGwoKSwgYnIuYnJ0YXJnZXRfc2V0LmFsbCgpKQorCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigicnVuYnVpbGRzOiBFcnJvciBsYXVuY2hpbmcgYnVpbGQgJXMiICUgZSkKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoZSkKKyAgICAgICAgICAgIGlmICJbRXJybm8gMTExXSBDb25uZWN0aW9uIHJlZnVzZWQiIGluIHN0cihlKToKKyAgICAgICAgICAgICAgICAjIENvbm5lY3Rpb24gcmVmdXNlZCwgcmVhZCB0b2FzdGVyX3NlcnZlci5vdXQKKyAgICAgICAgICAgICAgICBlcnJtc2cgPSBiZWMucmVhZFNlcnZlckxvZ0ZpbGUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcnJtc2cgPSBzdHIoZSkKKworICAgICAgICAgICAgQlJFcnJvci5vYmplY3RzLmNyZWF0ZShyZXEgPSBiciwKKyAgICAgICAgICAgICAgICAgICAgZXJydHlwZSA9IHN0cih0eXBlKGUpKSwKKyAgICAgICAgICAgICAgICAgICAgZXJybXNnID0gZXJybXNnLAorICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2suZm9ybWF0X2V4YyhlKSkKKyAgICAgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9GQUlMRUQKKyAgICAgICAgICAgIGJyLnNhdmUoKQorICAgICAgICAgICAgYmVjLmJlLmxvY2sgPSBCdWlsZEVudmlyb25tZW50LkxPQ0tfRlJFRQorICAgICAgICAgICAgYmVjLmJlLnNhdmUoKQorCisgICAgZGVmIGFyY2hpdmUoc2VsZik6CisgICAgICAgICcnJyBhcmNoaXZlcyBkYXRhIGZyb20gdGhlIGJ1aWxkcyAnJycKKyAgICAgICAgYXJ0aWZhY3Rfc3RvcmFnZV9kaXIgPSBUb2FzdGVyU2V0dGluZy5vYmplY3RzLmdldChuYW1lPSJBUlRJRkFDVFNfU1RPUkFHRV9ESVIiKS52YWx1ZQorICAgICAgICBmb3IgYnIgaW4gQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9BUkNISVZFKToKKyAgICAgICAgICAgICMgc2F2ZSBjb29rZXIgbG9nCisgICAgICAgICAgICBpZiBici5idWlsZCA9PSBOb25lOgorICAgICAgICAgICAgICAgIGJyLnN0YXRlID0gQnVpbGRSZXF1ZXN0LlJFUV9GQUlMRUQKKyAgICAgICAgICAgICAgICBici5zYXZlKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYnVpbGRfYXJ0aWZhY3Rfc3RvcmFnZV9kaXIgPSBvcy5wYXRoLmpvaW4oYXJ0aWZhY3Rfc3RvcmFnZV9kaXIsICIlZCIgJSBici5idWlsZC5waykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhidWlsZF9hcnRpZmFjdF9zdG9yYWdlX2RpcikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIG9zZToKKyAgICAgICAgICAgICAgICBpZiAiRmlsZSBleGlzdHMiIGluIHN0cihvc2UpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2Ugb3NlCisKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IG9zLnBhdGguam9pbihidWlsZF9hcnRpZmFjdF9zdG9yYWdlX2RpciwgImNvb2tlcl9sb2cudHh0IikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9uYW1lLCAidyIpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoYnIuZW52aXJvbm1lbnQuZ2V0X2FydGlmYWN0KGJyLmJ1aWxkLmNvb2tlcl9sb2dfcGF0aCkucmVhZCgpKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVfbmFtZSkKKworICAgICAgICAgICAgYnIuc3RhdGUgPSBCdWlsZFJlcXVlc3QuUkVRX0NPTVBMRVRFRAorICAgICAgICAgICAgYnIuc2F2ZSgpCisKKyAgICBkZWYgY2xlYW51cChzZWxmKToKKyAgICAgICAgZnJvbSBkamFuZ28udXRpbHMgaW1wb3J0IHRpbWV6b25lCisgICAgICAgIGZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQorICAgICAgICAjIGVudmlyb25tZW50cyBsb2NrZWQgZm9yIG1vcmUgdGhhbiAzMCBzZWNvbmRzIC0gdGhleSBzaG91bGQgYmUgdW5sb2NrZWQKKyAgICAgICAgQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmZpbHRlcihidWlsZHJlcXVlc3RfX3N0YXRlX19pbj1bQnVpbGRSZXF1ZXN0LlJFUV9GQUlMRUQsIEJ1aWxkUmVxdWVzdC5SRVFfQ09NUExFVEVEXSkuZmlsdGVyKGxvY2s9QnVpbGRFbnZpcm9ubWVudC5MT0NLX0xPQ0spLmZpbHRlcih1cGRhdGVkX19sdCA9IHRpbWV6b25lLm5vdygpIC0gdGltZWRlbHRhKHNlY29uZHMgPSAzMCkpLnVwZGF0ZShsb2NrID0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX0ZSRUUpCisKKworICAgICAgICAjIHVwZGF0ZSBhbGwgQnVpbGRzIHRoYXQgZmFpbGVkIHRvIHN0YXJ0CisKKyAgICAgICAgZm9yIGJyIGluIEJ1aWxkUmVxdWVzdC5vYmplY3RzLmZpbHRlcihzdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfRkFJTEVELCBidWlsZF9fb3V0Y29tZSA9IEJ1aWxkLklOX1BST0dSRVNTKToKKyAgICAgICAgICAgICMgdHJhbnNwb3NlIHRoZSBsYXVuY2ggZXJyb3JzIGluIFRvYXN0ZXJFeGNlcHRpb25zCisgICAgICAgICAgICBici5idWlsZC5vdXRjb21lID0gQnVpbGQuRkFJTEVECisgICAgICAgICAgICBmb3IgYnJlcnJvciBpbiBici5icmVycm9yX3NldC5hbGwoKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlNhdmluZyBlcnJvciAlcyIgJSBicmVycm9yKQorICAgICAgICAgICAgICAgIExvZ01lc3NhZ2Uub2JqZWN0cy5jcmVhdGUoYnVpbGQgPSBici5idWlsZCwgbGV2ZWwgPSBMb2dNZXNzYWdlLkVYQ0VQVElPTiwgbWVzc2FnZSA9IGJyZXJyb3IuZXJybXNnKQorICAgICAgICAgICAgYnIuYnVpbGQuc2F2ZSgpCisKKyAgICAgICAgICAgICMgd2UgZG9uJ3QgaGF2ZSBhIHRydWUgYnVpbGQgb2JqZWN0IGhlcmU7IGhlbmNlLCB0b2FzdGVydWkgZGlkbid0IGhhdmUgYSBjaGFuZ2UgdG8gcmVsZWFzZSB0aGUgQkUgbG9jaworICAgICAgICAgICAgYnIuZW52aXJvbm1lbnQubG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFCisgICAgICAgICAgICBici5lbnZpcm9ubWVudC5zYXZlKCkKKworCisKKyAgICAgICAgIyB1cGRhdGUgYWxsIEJ1aWxkUmVxdWVzdHMgd2l0aG91dCBhIGJ1aWxkIGNyZWF0ZWQKKyAgICAgICAgZm9yIGJyIGluIEJ1aWxkUmVxdWVzdC5vYmplY3RzLmZpbHRlcihidWlsZCA9IE5vbmUpOgorICAgICAgICAgICAgYnIuYnVpbGQgPSBCdWlsZC5vYmplY3RzLmNyZWF0ZShwcm9qZWN0ID0gYnIucHJvamVjdCwgY29tcGxldGVkX29uID0gYnIudXBkYXRlZCwgc3RhcnRlZF9vbiA9IGJyLmNyZWF0ZWQpCisgICAgICAgICAgICBici5idWlsZC5vdXRjb21lID0gQnVpbGQuRkFJTEVECisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYnIuYnVpbGQubWFjaGluZSA9IGJyLmJydmFyaWFibGVfc2V0LmdldChuYW1lPSdNQUNISU5FJykudmFsdWUKKyAgICAgICAgICAgIGV4Y2VwdCBCUlZhcmlhYmxlLkRvZXNOb3RFeGlzdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBici5zYXZlKCkKKyAgICAgICAgICAgICMgdHJhbnNwb3NlIHRhcmdldCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgZm9yIGJydGFyZ2V0IGluIGJyLmJydGFyZ2V0X3NldC5hbGwoKToKKyAgICAgICAgICAgICAgICBUYXJnZXQub2JqZWN0cy5jcmVhdGUoYnVpbGQgPSBici5idWlsZCwgdGFyZ2V0PSBicnRhcmdldC50YXJnZXQpCisgICAgICAgICAgICAjIHRyYW5zcG9zZSB0aGUgbGF1bmNoIGVycm9ycyBpbiBUb2FzdGVyRXhjZXB0aW9ucworICAgICAgICAgICAgZm9yIGJyZXJyb3IgaW4gYnIuYnJlcnJvcl9zZXQuYWxsKCk6CisgICAgICAgICAgICAgICAgTG9nTWVzc2FnZS5vYmplY3RzLmNyZWF0ZShidWlsZCA9IGJyLmJ1aWxkLCBsZXZlbCA9IExvZ01lc3NhZ2UuRVhDRVBUSU9OLCBtZXNzYWdlID0gYnJlcnJvci5lcnJtc2cpCisKKyAgICAgICAgICAgIGJyLmJ1aWxkLnNhdmUoKQorICAgICAgICBwYXNzCisKKworICAgIGRlZiBoYW5kbGVfbm9hcmdzKHNlbGYsICoqb3B0aW9ucyk6CisgICAgICAgIHNlbGYuY2xlYW51cCgpCisgICAgICAgIHNlbGYuYXJjaGl2ZSgpCisgICAgICAgIHNlbGYuc2NoZWR1bGUoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwMV9pbml0aWFsLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwMV9pbml0aWFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTYzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAxX2luaXRpYWwucHkKQEAgLTAsMCArMSwxNTQgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCdWlsZEVudmlyb25tZW50JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdibGRjb250cm9sX2J1aWxkZW52aXJvbm1lbnQnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnYWRkcmVzcycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICAgICAoJ2JldHlwZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdiYmFkZHJlc3MnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI1NCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdiYnBvcnQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PS0xKSksCisgICAgICAgICAgICAoJ2JidG9rZW4nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEyNiwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdiYnN0YXRlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ2xvY2snLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgICAgICgnY3JlYXRlZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKShhdXRvX25vd19hZGQ9VHJ1ZSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cGRhdGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGF1dG9fbm93PVRydWUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnYmxkY29udHJvbCcsIFsnQnVpbGRFbnZpcm9ubWVudCddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdCdWlsZFJlcXVlc3QnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnVpbGRyZXF1ZXN0JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3Byb2plY3QnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5Qcm9qZWN0J10pKSwKKyAgICAgICAgICAgICgnYnVpbGQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CdWlsZCddLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgnc3RhdGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgICAgICgnY3JlYXRlZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKShhdXRvX25vd19hZGQ9VHJ1ZSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cGRhdGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGF1dG9fbm93PVRydWUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnYmxkY29udHJvbCcsIFsnQnVpbGRSZXF1ZXN0J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0JSTGF5ZXInCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJsYXllcicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZXEnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10pKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2dpdHVybCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICAgICAoJ2NvbW1pdCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J2JsZGNvbnRyb2wnLCBbJ0JSTGF5ZXInXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnQlJWYXJpYWJsZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnYmxkY29udHJvbF9icnZhcmlhYmxlJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3JlcScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgndmFsdWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShibGFuaz1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J2JsZGNvbnRyb2wnLCBbJ0JSVmFyaWFibGUnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnQlJUYXJnZXQnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJ0YXJnZXQnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncmVxJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddKSksCisgICAgICAgICAgICAoJ3RhcmdldCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ3Rhc2snLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgbnVsbD1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J2JsZGNvbnRyb2wnLCBbJ0JSVGFyZ2V0J10pCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnQnVpbGRFbnZpcm9ubWVudCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnYmxkY29udHJvbF9idWlsZGVudmlyb25tZW50JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCdWlsZFJlcXVlc3QnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnVpbGRyZXF1ZXN0JykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCUkxheWVyJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdibGRjb250cm9sX2JybGF5ZXInKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0JSVmFyaWFibGUnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJ2YXJpYWJsZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnQlJUYXJnZXQnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJ0YXJnZXQnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnYmxkY29udHJvbC5icmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSTGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZGVudmlyb25tZW50JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkRW52aXJvbm1lbnQnfSwKKyAgICAgICAgICAgICdhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdiYmFkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmJwb3J0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ2Jic3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdiYnRva2VuJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyNicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkcmVxdWVzdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZFJlcXVlc3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydibGRjb250cm9sJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDJfYXV0b19fYWRkX2ZpZWxkX2J1aWxkZW52aXJvbm1lbnRfc291cmNlZGlyX19hZGRfZmllbGRfYnVpbGRlbnZpcm9ubWVudC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDJfYXV0b19fYWRkX2ZpZWxkX2J1aWxkZW52aXJvbm1lbnRfc291cmNlZGlyX19hZGRfZmllbGRfYnVpbGRlbnZpcm9ubWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTIyYTUwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwMl9hdXRvX19hZGRfZmllbGRfYnVpbGRlbnZpcm9ubWVudF9zb3VyY2VkaXJfX2FkZF9maWVsZF9idWlsZGVudmlyb25tZW50LnB5CkBAIC0wLDAgKzEsMTA2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnQnVpbGRFbnZpcm9ubWVudC5zb3VyY2VkaXInCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdibGRjb250cm9sX2J1aWxkZW52aXJvbm1lbnQnLCAnc291cmNlZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTUxMiwgYmxhbms9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdCdWlsZEVudmlyb25tZW50LmJ1aWxkZGlyJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZGVudmlyb25tZW50JywgJ2J1aWxkZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTUxMiwgYmxhbms9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0J1aWxkRW52aXJvbm1lbnQuc291cmNlZGlyJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZGVudmlyb25tZW50JywgJ3NvdXJjZWRpcicpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnVpbGRFbnZpcm9ubWVudC5idWlsZGRpcicKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J2JsZGNvbnRyb2xfYnVpbGRlbnZpcm9ubWVudCcsICdidWlsZGRpcicpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdibGRjb250cm9sLmJybGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkZW52aXJvbm1lbnQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRFbnZpcm9ubWVudCd9LAorICAgICAgICAgICAgJ2FkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2JiYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiYnBvcnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAnYmJzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2JidG9rZW4nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI2JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkcmVxdWVzdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZFJlcXVlc3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnYmxkY29udHJvbCddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwM19hdXRvX19hZGRfZmllbGRfYnJsYXllcl9kaXJwYXRoLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwM19hdXRvX19hZGRfZmllbGRfYnJsYXllcl9kaXJwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmE4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDAzX2F1dG9fX2FkZF9maWVsZF9icmxheWVyX2RpcnBhdGgucHkKQEAgLTAsMCArMSw5OSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0JSTGF5ZXIuZGlycGF0aCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J2JsZGNvbnRyb2xfYnJsYXllcicsICdkaXJwYXRoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTI1NCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0JSTGF5ZXIuZGlycGF0aCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J2JsZGNvbnRyb2xfYnJsYXllcicsICdkaXJwYXRoJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkxheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRlbnZpcm9ubWVudCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEVudmlyb25tZW50J30sCisgICAgICAgICAgICAnYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnYmJhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JicG9ydCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdiYnN0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnYmJ0b2tlbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjYnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGRkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRyZXF1ZXN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkUmVxdWVzdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydibGRjb250cm9sJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA0X2xvYWRpbml0aWFsZGF0YS5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDRfbG9hZGluaXRpYWxkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MDg1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA0X2xvYWRpbml0aWFsZGF0YS5weQpAQCAtMCwwICsxLDEwNCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgRGF0YU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCitjbGFzcyBNaWdyYXRpb24oRGF0YU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIldyaXRlIHlvdXIgZm9yd2FyZHMgbWV0aG9kcyBoZXJlLiIKKyAgICAgICAgIyBOb3RlOiBEb24ndCB1c2UgImZyb20gYXBwbmFtZS5tb2RlbHMgaW1wb3J0IE1vZGVsTmFtZSIuCisgICAgICAgICMgVXNlIG9ybS5Nb2RlbE5hbWUgdG8gcmVmZXIgdG8gbW9kZWxzIGluIHRoaXMgYXBwbGljYXRpb24sCisgICAgICAgICMgYW5kIG9ybVsnYXBwbmFtZS5Nb2RlbE5hbWUnXSBmb3IgbW9kZWxzIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3JtLkJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5nZXQocGsgPSAxKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgdGltZXpvbmUKKyAgICAgICAgICAgIG9ybS5CdWlsZEVudmlyb25tZW50Lm9iamVjdHMuY3JlYXRlKHBrID0gMSwKKyAgICAgICAgICAgICAgICBjcmVhdGVkID0gdGltZXpvbmUubm93KCksCisgICAgICAgICAgICAgICAgdXBkYXRlZCA9IHRpbWV6b25lLm5vdygpLAorICAgICAgICAgICAgICAgIGJldHlwZSA9IDApCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICJXcml0ZSB5b3VyIGJhY2t3YXJkcyBtZXRob2RzIGhlcmUuIgorCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkxheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRlbnZpcm9ubWVudCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEVudmlyb25tZW50J30sCisgICAgICAgICAgICAnYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnYmJhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JicG9ydCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdiYnN0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnYmJ0b2tlbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjYnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGRkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VkaXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTEyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnVpbGRyZXF1ZXN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkUmVxdWVzdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydibGRjb250cm9sJ10KKyAgICBzeW1tZXRyaWNhbCA9IFRydWUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDVfYXV0b19fYWRkX2JyZXJyb3IucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA1X2F1dG9fX2FkZF9icmVycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YWViNDEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA1X2F1dG9fX2FkZF9icmVycm9yLnB5CkBAIC0wLDAgKzEsMTEyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBtb2RlbCAnQlJFcnJvcicKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnYmxkY29udHJvbF9icmVycm9yJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3JlcScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSkpLAorICAgICAgICAgICAgKCdlcnJ0eXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnZXJybXNnJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSksCisgICAgICAgICAgICAoJ3RyYWNlYmFjaycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdibGRjb250cm9sJywgWydCUkVycm9yJ10pCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnQlJFcnJvcicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnYmxkY29udHJvbF9icmVycm9yJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJlcnJvcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkVycm9yJ30sCisgICAgICAgICAgICAnZXJybXNnJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2VycnR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndHJhY2ViYWNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSTGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZGVudmlyb25tZW50JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkRW52aXJvbm1lbnQnfSwKKyAgICAgICAgICAgICdhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdiYmFkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmJwb3J0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ2Jic3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdiYnRva2VuJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyNicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZGRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZWRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZHJlcXVlc3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRSZXF1ZXN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICdzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDZfYXV0b19fYWRkX2JyYml0YmFrZS5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDZfYXV0b19fYWRkX2JyYml0YmFrZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDM4OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwNl9hdXRvX19hZGRfYnJiaXRiYWtlLnB5CkBAIC0wLDAgKzEsMTI4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBtb2RlbCAnQlJCaXRiYWtlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdibGRjb250cm9sX2JyYml0YmFrZScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZXEnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10sIHVuaXF1ZT1UcnVlKSksCisgICAgICAgICAgICAoJ2dpdHVybCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICAgICAoJ2NvbW1pdCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSksCisgICAgICAgICAgICAoJ2RpcnBhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI1NCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdibGRjb250cm9sJywgWydCUkJpdGJha2UnXSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCUkJpdGJha2UnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J2JsZGNvbnRyb2xfYnJiaXRiYWtlJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJiaXRiYWtlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSQml0YmFrZSd9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIiwgJ3VuaXF1ZSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icmVycm9yJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSRXJyb3InfSwKKyAgICAgICAgICAgICdlcnJtc2cnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZXJydHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0cmFjZWJhY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJybGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkZW52aXJvbm1lbnQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRFbnZpcm9ubWVudCd9LAorICAgICAgICAgICAgJ2FkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2JiYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiYnBvcnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAnYmJzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2JidG9rZW4nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI2JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkcmVxdWVzdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZFJlcXVlc3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydibGRjb250cm9sJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA3X2F1dG9fX2FkZF9maWVsZF9idWlsZHJlcXVlc3RfZW52aXJvbm1lbnRfX2NoZ19maWVsZF9idWlsZHJlcXVlc3RfYnVpbGQucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbWlncmF0aW9ucy8wMDA3X2F1dG9fX2FkZF9maWVsZF9idWlsZHJlcXVlc3RfZW52aXJvbm1lbnRfX2NoZ19maWVsZF9idWlsZHJlcXVlc3RfYnVpbGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NzdhMgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDdfYXV0b19fYWRkX2ZpZWxkX2J1aWxkcmVxdWVzdF9lbnZpcm9ubWVudF9fY2hnX2ZpZWxkX2J1aWxkcmVxdWVzdF9idWlsZC5weQpAQCAtMCwwICsxLDE0NSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0J1aWxkUmVxdWVzdC5lbnZpcm9ubWVudCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J2JsZGNvbnRyb2xfYnVpbGRyZXF1ZXN0JywgJ2Vudmlyb25tZW50JywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ2JsZGNvbnRyb2wuQnVpbGRFbnZpcm9ubWVudCddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0J1aWxkUmVxdWVzdC5idWlsZCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCAnYnVpbGRfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLk9uZVRvT25lRmllbGQnKSh0bz1vcm1bJ29ybS5CdWlsZCddLCB1bmlxdWU9VHJ1ZSwgbnVsbD1UcnVlKSkKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0J1aWxkUmVxdWVzdCcsIGZpZWxkcyBbJ2J1aWxkJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J2JsZGNvbnRyb2xfYnVpbGRyZXF1ZXN0JywgWydidWlsZF9pZCddKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0J1aWxkUmVxdWVzdCcsIGZpZWxkcyBbJ2J1aWxkJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J2JsZGNvbnRyb2xfYnVpbGRyZXF1ZXN0JywgWydidWlsZF9pZCddKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0J1aWxkUmVxdWVzdC5lbnZpcm9ubWVudCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J2JsZGNvbnRyb2xfYnVpbGRyZXF1ZXN0JywgJ2Vudmlyb25tZW50X2lkJykKKworCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0J1aWxkUmVxdWVzdC5idWlsZCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnYmxkY29udHJvbF9idWlsZHJlcXVlc3QnLCAnYnVpbGRfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CdWlsZCddLCBudWxsPVRydWUpKQorCisgICAgbW9kZWxzID0geworICAgICAgICB1J2JsZGNvbnRyb2wuYnJiaXRiYWtlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSQml0YmFrZSd9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIiwgJ3VuaXF1ZSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icmVycm9yJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSRXJyb3InfSwKKyAgICAgICAgICAgICdlcnJtc2cnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZXJydHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KSwKKyAgICAgICAgICAgICd0cmFjZWJhY2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJybGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUlRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJydmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkZW52aXJvbm1lbnQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRFbnZpcm9ubWVudCd9LAorICAgICAgICAgICAgJ2FkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2JiYWRkcmVzcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdiYnBvcnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAnYmJzdGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2JidG9rZW4nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI2JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlZGlyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUxMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdibGRjb250cm9sLmJ1aWxkcmVxdWVzdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZFJlcXVlc3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5PbmVUb09uZUZpZWxkJywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10iLCAndW5pcXVlJzogJ1RydWUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Vudmlyb25tZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkRW52aXJvbm1lbnQnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ2JsZGNvbnRyb2wnXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDhfYnJhcmNoaXZlLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvMDAwOF9icmFyY2hpdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0Njk2MAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zLzAwMDhfYnJhcmNoaXZlLnB5CkBAIC0wLDAgKzEsMTM4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBEYXRhTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKK2NsYXNzIE1pZ3JhdGlvbihEYXRhTWlncmF0aW9uKToKKyAgICAjIGlkcyB0aGF0IGNhbm5vdCBiZSBpbXBvcnRlZCBmcm9tIEJ1aWxkUmVxdWVzdAorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgIFJFUV9DT01QTEVURUQgPSAzCisgICAgICAgIFJFUV9BUkNISVZFID0gNgorICAgICAgICAiV3JpdGUgeW91ciBmb3J3YXJkcyBtZXRob2RzIGhlcmUuIgorICAgICAgICAjIE5vdGU6IERvbid0IHVzZSAiZnJvbSBhcHBuYW1lLm1vZGVscyBpbXBvcnQgTW9kZWxOYW1lIi4KKyAgICAgICAgIyBVc2Ugb3JtLk1vZGVsTmFtZSB0byByZWZlciB0byBtb2RlbHMgaW4gdGhpcyBhcHBsaWNhdGlvbiwKKyAgICAgICAgIyBhbmQgb3JtWydhcHBuYW1lLk1vZGVsTmFtZSddIGZvciBtb2RlbHMgaW4gb3RoZXIgYXBwbGljYXRpb25zLgorICAgICAgICBvcm0uQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlPVJFUV9DT01QTEVURUQpLnVwZGF0ZShzdGF0ZT1SRVFfQVJDSElWRSkKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgUkVRX0NPTVBMRVRFRCA9IDMKKyAgICAgICAgUkVRX0FSQ0hJVkUgPSA2CisgICAgICAgICJXcml0ZSB5b3VyIGJhY2t3YXJkcyBtZXRob2RzIGhlcmUuIgorICAgICAgICBvcm0uQnVpbGRSZXF1ZXN0Lm9iamVjdHMuZmlsdGVyKHN0YXRlPVJFUV9BUkNISVZFKS51cGRhdGUoc3RhdGU9UkVRX0NPTVBMRVRFRCkKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdibGRjb250cm9sLmJyYml0YmFrZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkJpdGJha2UnfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSIsICd1bmlxdWUnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJlcnJvcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCUkVycm9yJ30sCisgICAgICAgICAgICAnZXJybXNnJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2VycnR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ2JsZGNvbnRyb2wuQnVpbGRSZXF1ZXN0J10ifSksCisgICAgICAgICAgICAndHJhY2ViYWNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSTGF5ZXInfSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlcSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZFJlcXVlc3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J2JsZGNvbnRyb2wuYnJ0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQlJUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5icnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JSVmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVxJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydibGRjb250cm9sLkJ1aWxkUmVxdWVzdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZGVudmlyb25tZW50JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkRW52aXJvbm1lbnQnfSwKKyAgICAgICAgICAgICdhZGRyZXNzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdiYmFkZHJlc3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnYmJwb3J0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ2Jic3RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdiYnRva2VuJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyNicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2JldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZGRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZWRpcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MTInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnYmxkY29udHJvbC5idWlsZHJlcXVlc3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRSZXF1ZXN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuT25lVG9PbmVGaWVsZCcsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIiwgJ3VuaXF1ZSc6ICdUcnVlJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbnZpcm9ubWVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnYmxkY29udHJvbC5CdWlsZEVudmlyb25tZW50J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydibGRjb250cm9sJ10KKyAgICBzeW1tZXRyaWNhbCA9IFRydWUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21pZ3JhdGlvbnMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC9taWdyYXRpb25zL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvbW9kZWxzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21vZGVscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjFkZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL21vZGVscy5weQpAQCAtMCwwICsxLDE2NCBAQAorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworZnJvbSBkamFuZ28uY29yZS52YWxpZGF0b3JzIGltcG9ydCBNYXhWYWx1ZVZhbGlkYXRvciwgTWluVmFsdWVWYWxpZGF0b3IKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgUHJvamVjdCwgUHJvamVjdExheWVyLCBQcm9qZWN0VmFyaWFibGUsIFByb2plY3RUYXJnZXQsIEJ1aWxkCisKKyMgYSBCdWlsZEVudmlyb25tZW50IGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSAiYnVpbGQvIiBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsaG9zdAorY2xhc3MgQnVpbGRFbnZpcm9ubWVudChtb2RlbHMuTW9kZWwpOgorICAgIFNFUlZFUl9TVE9QUEVEID0gMAorICAgIFNFUlZFUl9TVEFSVEVEID0gMQorICAgIFNFUlZFUl9TVEFURSA9ICgKKyAgICAgICAgKFNFUlZFUl9TVE9QUEVELCAic3RvcHBlZCIpLAorICAgICAgICAoU0VSVkVSX1NUQVJURUQsICJzdGFydGVkIiksCisgICAgKQorCisgICAgVFlQRV9MT0NBTCA9IDAKKyAgICBUWVBFX1NTSCAgID0gMQorICAgIFRZUEUgPSAoCisgICAgICAgIChUWVBFX0xPQ0FMLCAibG9jYWwiKSwKKyAgICAgICAgKFRZUEVfU1NILCAic3NoIiksCisgICAgKQorCisgICAgTE9DS19GUkVFID0gMAorICAgIExPQ0tfTE9DSyA9IDEKKyAgICBMT0NLX1JVTk5JTkcgPSAyCisgICAgTE9DS19TVEFURSA9ICgKKyAgICAgICAgKExPQ0tfRlJFRSwgImZyZWUiKSwKKyAgICAgICAgKExPQ0tfTE9DSywgImxvY2siKSwKKyAgICAgICAgKExPQ0tfUlVOTklORywgInJ1bm5pbmciKSwKKyAgICApCisKKyAgICBhZGRyZXNzICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCkKKyAgICBiZXR5cGUgICAgICA9IG1vZGVscy5JbnRlZ2VyRmllbGQoY2hvaWNlcyA9IFRZUEUpCisgICAgYmJhZGRyZXNzICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGggPSAyNTQsIGJsYW5rID0gVHJ1ZSkKKyAgICBiYnBvcnQgICAgICA9IG1vZGVscy5JbnRlZ2VyRmllbGQoZGVmYXVsdCA9IC0xKQorICAgIGJidG9rZW4gICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gMTI2LCBibGFuayA9IFRydWUpCisgICAgYmJzdGF0ZSAgICAgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGNob2ljZXMgPSBTRVJWRVJfU1RBVEUsIGRlZmF1bHQgPSBTRVJWRVJfU1RPUFBFRCkKKyAgICBzb3VyY2VkaXIgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDUxMiwgYmxhbmsgPSBUcnVlKQorICAgIGJ1aWxkZGlyICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoID0gNTEyLCBibGFuayA9IFRydWUpCisgICAgbG9jayAgICAgICAgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGNob2ljZXMgPSBMT0NLX1NUQVRFLCBkZWZhdWx0ID0gTE9DS19GUkVFKQorICAgIGNyZWF0ZWQgICAgID0gbW9kZWxzLkRhdGVUaW1lRmllbGQoYXV0b19ub3dfYWRkID0gVHJ1ZSkKKyAgICB1cGRhdGVkICAgICA9IG1vZGVscy5EYXRlVGltZUZpZWxkKGF1dG9fbm93ID0gVHJ1ZSkKKworCisgICAgZGVmIGdldF9hcnRpZmFjdF90eXBlKHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBzZWxmLmJldHlwZSA9PSBCdWlsZEVudmlyb25tZW50LlRZUEVfTE9DQUw6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IG1hZ2ljCisKKyAgICAgICAgICAgICAgICAjIGZhaXIgd2FybmluZzogdGhpcyBpcyBhIG1lc3M7IHRoZXJlIGFyZSBtdWx0aXBsZSBjb21wZXRlaW5nIGFuZCBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAjIG1hZ2ljIG1vZHVsZXMgZmxvYXRpbmcgYXJvdW5kLCBzbyB3ZSB0cnkgc29tZSBvZiB0aGUgbW9zdCBjb21tb24gY29tYmluYXRpb25zCisKKyAgICAgICAgICAgICAgICB0cnk6ICAgICMgd2UgdHJ5IHVidW50dSdzIHB5dGhvbi1tYWdpYyA1LjQKKyAgICAgICAgICAgICAgICAgICAgbSA9IG1hZ2ljLm9wZW4obWFnaWMuTUFHSUNfTUlNRV9UWVBFKQorICAgICAgICAgICAgICAgICAgICBtLmxvYWQoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5maWxlKHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICB0cnk6ICAgICMgd2UgdHJ5IHB5dGhvbi1tYWdpYyAwLjQuNgorICAgICAgICAgICAgICAgICAgICBtID0gbWFnaWMuTWFnaWMobWFnaWMuTUFHSUNfTUlNRSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uZnJvbV9maWxlKHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICB0cnk6ICAgICMgd2UgdHJ5IHBpcCBmaWxlbWFnaWMgMS42CisgICAgICAgICAgICAgICAgICAgIG0gPSBtYWdpYy5NYWdpYyhmbGFncz1tYWdpYy5NQUdJQ19NSU1FX1RZUEUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmlkX2ZpbGVuYW1lKHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICByZXR1cm4gImJpbmFyeS9vY3RldC1zdHJlYW0iCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuICJiaW5hcnkvb2N0ZXQtc3RyZWFtIgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBhcnRpZmFjdCB0eXBlIG5vdCBpbXBsZW1lbnRlZCBmb3IgYnVpbGQgZW52aXJvbm1lbnQgdHlwZSAlcyIgJSBzZWxmLmdldF9iZXR5cGVfZGlzcGxheSgpKQorCisKKyAgICBkZWYgZ2V0X2FydGlmYWN0KHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBzZWxmLmJldHlwZSA9PSBCdWlsZEVudmlyb25tZW50LlRZUEVfTE9DQUw6CisgICAgICAgICAgICByZXR1cm4gb3BlbihwYXRoLCAiciIpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRklYTUU6IGFydGlmYWN0IGRvd25sb2FkIG5vdCBpbXBsZW1lbnRlZCBmb3IgYnVpbGQgZW52aXJvbm1lbnQgdHlwZSAlcyIgJSBzZWxmLmdldF9iZXR5cGVfZGlzcGxheSgpKQorCisgICAgZGVmIGhhc19hcnRpZmFjdChzZWxmLCBwYXRoKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIHNlbGYuYmV0eXBlID09IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkZJWE1FOiBoYXMgYXJ0aWZhY3Qgbm90IGltcGxlbWVudGVkIGZvciBidWlsZCBlbnZpcm9ubWVudCB0eXBlICVzIiAlIHNlbGYuZ2V0X2JldHlwZV9kaXNwbGF5KCkpCisKKyMgYSBCdWlsZFJlcXVlc3QgaXMgYSByZXF1ZXN0IHRoYXQgdGhlIHNjaGVkdWxlciB3aWxsIGJ1aWxkIHVzaW5nIGEgQnVpbGRFbnZpcm9ubWVudAorIyB0aGUgYnVpbGQgcmVxdWVzdCBxdWV1ZSBpcyB0aGUgdGFibGUgaXRzZWxmLCBvcmRlcmVkIGJ5IHN0YXRlCisKK2NsYXNzIEJ1aWxkUmVxdWVzdChtb2RlbHMuTW9kZWwpOgorICAgIFJFUV9DUkVBVEVEID0gMAorICAgIFJFUV9RVUVVRUQgPSAxCisgICAgUkVRX0lOUFJPR1JFU1MgPSAyCisgICAgUkVRX0NPTVBMRVRFRCA9IDMKKyAgICBSRVFfRkFJTEVEID0gNAorICAgIFJFUV9ERUxFVEVEID0gNQorICAgIFJFUV9BUkNISVZFID0gNgorCisgICAgUkVRVUVTVF9TVEFURSA9ICgKKyAgICAgICAgKFJFUV9DUkVBVEVELCAiY3JlYXRlZCIpLAorICAgICAgICAoUkVRX1FVRVVFRCwgInF1ZXVlZCIpLAorICAgICAgICAoUkVRX0lOUFJPR1JFU1MsICJpbiBwcm9ncmVzcyIpLAorICAgICAgICAoUkVRX0NPTVBMRVRFRCwgImNvbXBsZXRlZCIpLAorICAgICAgICAoUkVRX0ZBSUxFRCwgImZhaWxlZCIpLAorICAgICAgICAoUkVRX0RFTEVURUQsICJkZWxldGVkIiksCisgICAgICAgIChSRVFfQVJDSElWRSwgImFyY2hpdmUiKSwKKyAgICApCisKKyAgICBzZWFyY2hfYWxsb3dlZF9maWVsZHMgPSAoImJydGFyZ2V0X190YXJnZXQiLCAiYnVpbGRfX3Byb2plY3RfX25hbWUiKQorCisgICAgcHJvamVjdCAgICAgPSBtb2RlbHMuRm9yZWlnbktleShQcm9qZWN0KQorICAgIGJ1aWxkICAgICAgID0gbW9kZWxzLk9uZVRvT25lRmllbGQoQnVpbGQsIG51bGwgPSBUcnVlKSAgICAgIyBUT0RPOiB0b2FzdGVydWkgc2hvdWxkIHNldCB0aGlzIHdoZW4gQnVpbGQgaXMgY3JlYXRlZAorICAgIGVudmlyb25tZW50ID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGRFbnZpcm9ubWVudCwgbnVsbCA9IFRydWUpCisgICAgc3RhdGUgICAgICAgPSBtb2RlbHMuSW50ZWdlckZpZWxkKGNob2ljZXMgPSBSRVFVRVNUX1NUQVRFLCBkZWZhdWx0ID0gUkVRX0NSRUFURUQpCisgICAgY3JlYXRlZCAgICAgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChhdXRvX25vd19hZGQgPSBUcnVlKQorICAgIHVwZGF0ZWQgICAgID0gbW9kZWxzLkRhdGVUaW1lRmllbGQoYXV0b19ub3cgPSBUcnVlKQorCisgICAgZGVmIGdldF9kdXJhdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLnVwZGF0ZWQgLSBzZWxmLmNyZWF0ZWQpLnRvdGFsX3NlY29uZHMoKQorCisgICAgZGVmIGdldF9zb3J0ZWRfdGFyZ2V0X2xpc3Qoc2VsZik6CisgICAgICAgIHRndHMgPSBzZWxmLmJydGFyZ2V0X3NldC5vcmRlcl9ieSggJ3RhcmdldCcgKTsKKyAgICAgICAgcmV0dXJuKCB0Z3RzICk7CisKKyAgICBkZWYgZ2V0X21hY2hpbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJydmFyaWFibGVfc2V0LmdldChuYW1lPSJNQUNISU5FIikudmFsdWUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLnByb2plY3QsIHNlbGYuZ2V0X3N0YXRlX2Rpc3BsYXkoKSkKKworIyBUaGVzZSB0YWJsZXMgc3BlY2lmeSB0aGUgc2V0dGluZ3MgZm9yIHJ1bm5pbmcgYW4gYWN0dWFsIGJ1aWxkLgorIyBUaGV5IE1VU1QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHRhYmxlcyBpbiBvcm0ubW9kZWxzLlByb2plY3QqCisKK2NsYXNzIEJSTGF5ZXIobW9kZWxzLk1vZGVsKToKKyAgICByZXEgICAgICAgICA9IG1vZGVscy5Gb3JlaWduS2V5KEJ1aWxkUmVxdWVzdCkKKyAgICBuYW1lICAgICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDEwMCkKKyAgICBnaXR1cmwgICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCkKKyAgICBjb21taXQgICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCkKKyAgICBkaXJwYXRoICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCkKKworY2xhc3MgQlJCaXRiYWtlKG1vZGVscy5Nb2RlbCk6CisgICAgcmVxICAgICAgICAgPSBtb2RlbHMuRm9yZWlnbktleShCdWlsZFJlcXVlc3QsIHVuaXF1ZSA9IFRydWUpICAgICMgb25seSBvbmUgYml0YmFrZSBmb3IgYSByZXF1ZXN0CisgICAgZ2l0dXJsICAgICAgPSBtb2RlbHMuQ2hhckZpZWxkKG1heF9sZW5ndGggPTI1NCkKKyAgICBjb21taXQgICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCkKKyAgICBkaXJwYXRoICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aCA9IDI1NCkKKworY2xhc3MgQlJWYXJpYWJsZShtb2RlbHMuTW9kZWwpOgorICAgIHJlcSAgICAgICAgID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGRSZXF1ZXN0KQorICAgIG5hbWUgICAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICB2YWx1ZSAgICAgICA9IG1vZGVscy5UZXh0RmllbGQoYmxhbmsgPSBUcnVlKQorCitjbGFzcyBCUlRhcmdldChtb2RlbHMuTW9kZWwpOgorICAgIHJlcSAgICAgICAgID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGRSZXF1ZXN0KQorICAgIHRhcmdldCAgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICB0YXNrICAgICAgICA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDAsIG51bGw9VHJ1ZSkKKworY2xhc3MgQlJFcnJvcihtb2RlbHMuTW9kZWwpOgorICAgIHJlcSAgICAgICAgID0gbW9kZWxzLkZvcmVpZ25LZXkoQnVpbGRSZXF1ZXN0KQorICAgIGVycnR5cGUgICAgID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICBlcnJtc2cgICAgICA9IG1vZGVscy5UZXh0RmllbGQoKQorICAgIHRyYWNlYmFjayAgID0gbW9kZWxzLlRleHRGaWVsZCgpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzZWxmLmVycm1zZywgc2VsZi5yZXEpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvc3NoYmVjb250cm9sbGVyLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL3NzaGJlY29udHJvbGxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWY0MzRiCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL3NzaGJlY29udHJvbGxlci5weQpAQCAtMCwwICsxLDE3OSBAQAorIworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQml0QmFrZSBUb2FzdGVyIEltcGxlbWVudGF0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAxNCAgICAgICAgSW50ZWwgQ29ycG9yYXRpb24KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworaW1wb3J0IHN5cworaW1wb3J0IHJlCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgdHJhbnNhY3Rpb24KK2Zyb20gZGphbmdvLmRiLm1vZGVscyBpbXBvcnQgUQorZnJvbSBibGRjb250cm9sLm1vZGVscyBpbXBvcnQgQnVpbGRFbnZpcm9ubWVudCwgQlJMYXllciwgQlJWYXJpYWJsZSwgQlJUYXJnZXQsIEJSQml0YmFrZQoraW1wb3J0IHN1YnByb2Nlc3MKKworZnJvbSB0b2FzdGVybWFpbiBpbXBvcnQgc2V0dGluZ3MKKworZnJvbSBiYmNvbnRyb2xsZXIgaW1wb3J0IEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyLCBTaGVsbENtZEV4Y2VwdGlvbiwgQnVpbGRTZXR1cEV4Y2VwdGlvbgorCitjbGFzcyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIEROKHBhdGgpOgorICAgIHJldHVybiAiLyIuam9pbihwYXRoLnNwbGl0KCIvIilbMDotMV0pCisKK2NsYXNzIFNTSEJFQ29udHJvbGxlcihCdWlsZEVudmlyb25tZW50Q29udHJvbGxlcik6CisgICAgIiIiIEltcGxlbWVudGF0aW9uIG9mIHRoZSBCdWlsZEVudmlyb25tZW50Q29udHJvbGxlciBmb3IgdGhlIGxvY2FsaG9zdDsKKyAgICAgICAgdGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIGRlZmF1bHQgYnVpbGQgZGlyZWN0b3J5LAorICAgICAgICB0aGUgc2VydmVyIHNldHVwIGFuZCBzeXN0ZW0gc3RhcnQgYW5kIHN0b3AgZm9yIHRoZSBsb2NhbGhvc3QtdHlwZSBidWlsZCBlbnZpcm9ubWVudAorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYmUpOgorICAgICAgICBzdXBlcihTU0hCRUNvbnRyb2xsZXIsIHNlbGYpLl9faW5pdF9fKGJlKQorICAgICAgICBzZWxmLmRidXJsID0gc2V0dGluZ3MuZ2V0REFUQUJBU0VfVVJMKCkKKyAgICAgICAgc2VsZi5wb2t5ZGlybmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5pc2xheWVyc2V0ID0gRmFsc2UKKworICAgIGRlZiBfc2hlbGxjbWQoc2VsZiwgY29tbWFuZCwgY3dkID0gTm9uZSk6CisgICAgICAgIGlmIGN3ZCBpcyBOb25lOgorICAgICAgICAgICAgY3dkID0gc2VsZi5iZS5zb3VyY2VkaXIKKworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbigic3NoICVzICdjZCAlcyAmJiAlcyciICUgKHNlbGYuYmUuYWRkcmVzcywgY3dkLCBjb21tYW5kKSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgc2hlbGw9VHJ1ZSkKKyAgICAgICAgKG91dCxlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIGlmIHAucmV0dXJuY29kZToKKyAgICAgICAgICAgIGlmIGxlbihlcnIpID09IDA6CisgICAgICAgICAgICAgICAgZXJyID0gImNvbW1hbmQ6ICVzIFxuJXMiICUgKGNvbW1hbmQsIG91dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyID0gImNvbW1hbmQ6ICVzIFxuJXMiICUgKGNvbW1hbmQsIGVycikKKyAgICAgICAgICAgIHJhaXNlIFNoZWxsQ21kRXhjZXB0aW9uKGVycikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvdXQuc3RyaXAoKQorCisgICAgZGVmIF9wYXRoZXhpc3RzKHNlbGYsIHBhdGgpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9zaGVsbGNtZCgidGVzdCAtZSBcIiVzXCIiICUgcGF0aCkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX3BhdGhjcmVhdGUoc2VsZiwgcGF0aCk6CisgICAgICAgIHNlbGYuX3NoZWxsY21kKCJta2RpciAtcCBcIiVzXCIiICUgcGF0aCkKKworICAgIGRlZiBfc2V0dXBCRShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYucG9reWRpcm5hbWUgYW5kIHNlbGYuX3BhdGhleGlzdHMoc2VsZi5wb2t5ZGlybmFtZSkKKyAgICAgICAgc2VsZi5fcGF0aGNyZWF0ZShzZWxmLmJlLmJ1aWxkZGlyKQorICAgICAgICBzZWxmLl9zaGVsbGNtZCgiYmFzaCAtYyBcInNvdXJjZSAlcy9vZS1pbml0LWJ1aWxkLWVudiAlc1wiIiAlIChzZWxmLnBva3lkaXJuYW1lLCBzZWxmLmJlLmJ1aWxkZGlyKSkKKworICAgIGRlZiBzdGFydEJCU2VydmVyKHNlbGYsIGJyYmUpOgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBhbmQgc2VsZi5fcGF0aGV4aXN0cyhzZWxmLnBva3lkaXJuYW1lKQorICAgICAgICBhc3NlcnQgc2VsZi5pc2xheWVyc2V0CisgICAgICAgIGNtZCA9IHNlbGYuX3NoZWxsY21kKCJiYXNoIC1jIFwic291cmNlICVzL29lLWluaXQtYnVpbGQtZW52ICVzICYmIERBVEFCQVNFX1VSTD0lcyBzb3VyY2UgdG9hc3RlciBzdGFydCBub3dlYiBicmJlPSVzXCIiICUgKHNlbGYucG9reWRpcm5hbWUsIHNlbGYuYmUuYnVpbGRkaXIsIHNlbGYuZGJ1cmwsIGJyYmUpKQorCisgICAgICAgIHBvcnQgPSAiLTEiCisgICAgICAgIGZvciBpIGluIGNtZC5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgIGlmIGkuc3RhcnRzd2l0aCgiQml0YmFrZSBzZXJ2ZXIgYWRkcmVzcyIpOgorICAgICAgICAgICAgICAgIHBvcnQgPSBpLnNwbGl0KCIgIilbLTFdCisgICAgICAgICAgICAgICAgcHJpbnQgIkZvdW5kIGJpdGJha2Ugc2VydmVyIHBvcnQgIiwgcG9ydAorCisKKyAgICAgICAgYXNzZXJ0IHNlbGYuYmUuc291cmNlZGlyIGFuZCBzZWxmLl9wYXRoZXhpc3RzKHNlbGYuYmUuYnVpbGRkaXIpCisgICAgICAgIHNlbGYuYmUuYmJhZGRyZXNzID0gc2VsZi5iZS5hZGRyZXNzLnNwbGl0KCJAIilbLTFdCisgICAgICAgIHNlbGYuYmUuYmJwb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmJlLmJic3RhdGUgPSBCdWlsZEVudmlyb25tZW50LlNFUlZFUl9TVEFSVEVECisgICAgICAgIHNlbGYuYmUuc2F2ZSgpCisKKyAgICBkZWYgc3RvcEJCU2VydmVyKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBhbmQgc2VsZi5fcGF0aGV4aXN0cyhzZWxmLnBva3lkaXJuYW1lKQorICAgICAgICBhc3NlcnQgc2VsZi5pc2xheWVyc2V0CisgICAgICAgIHByaW50IHNlbGYuX3NoZWxsY21kKCJiYXNoIC1jIFwic291cmNlICVzL29lLWluaXQtYnVpbGQtZW52ICVzICYmICVzIHNvdXJjZSB0b2FzdGVyIHN0b3BcIiIgJQorICAgICAgICAgICAgKHNlbGYucG9reWRpcm5hbWUsIHNlbGYuYmUuYnVpbGRkaXIsIChsYW1iZGE6ICIiIGlmIHNlbGYuYmUuYmJ0b2tlbiBpcyBOb25lIGVsc2UgIkJCVE9LRU49JXMiICUgc2VsZi5iZS5iYnRva2VuKSgpKSkKKyAgICAgICAgc2VsZi5iZS5iYnN0YXRlID0gQnVpbGRFbnZpcm9ubWVudC5TRVJWRVJfU1RPUFBFRAorICAgICAgICBzZWxmLmJlLnNhdmUoKQorICAgICAgICBwcmludCAiU3RvcHBlZCBzZXJ2ZXIiCisKKworICAgIGRlZiBfY29weUZpbGUoc2VsZiwgZmlsZXBhdGgxLCBmaWxlcGF0aDIpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbigic2NwICclcycgJyVzJyIgJSAoZmlsZXBhdGgxLCBmaWxlcGF0aDIpLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnIgPSBzdWJwcm9jZXNzLlBJUEUsIHNoZWxsPVRydWUpCisgICAgICAgIChvdXQsIGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgaWYgcC5yZXR1cm5jb2RlOgorICAgICAgICAgICAgcmFpc2UgU2hlbGxDbWRFeGNlcHRpb24oZXJyKQorCisgICAgZGVmIHB1bGxGaWxlKHNlbGYsIGxvY2FsX2ZpbGVuYW1lLCByZW1vdGVfZmlsZW5hbWUpOgorICAgICAgICBfY29weUZpbGUobG9jYWxfZmlsZW5hbWUsICIlczolcyIgJSAoc2VsZi5iZS5hZGRyZXNzLCByZW1vdGVfZmlsZW5hbWUpKQorCisgICAgZGVmIHB1c2hGaWxlKHNlbGYsIGxvY2FsX2ZpbGVuYW1lLCByZW1vdGVfZmlsZW5hbWUpOgorICAgICAgICBfY29weUZpbGUoIiVzOiVzIiAlIChzZWxmLmJlLmFkZHJlc3MsIHJlbW90ZV9maWxlbmFtZSksIGxvY2FsX2ZpbGVuYW1lKQorCisgICAgZGVmIHNldExheWVycyhzZWxmLCBiaXRiYWtlcywgbGF5ZXJzKToKKyAgICAgICAgIiIiIGEgd29yZCBvZiBhdHRlbnRpb246IGJ5IGNvbnZlbnRpb24sIHRoZSBmaXJzdCBsYXllciBmb3IgYW55IGJ1aWxkIHdpbGwgYmUgcG9reSEgIiIiCisKKyAgICAgICAgYXNzZXJ0IHNlbGYuYmUuc291cmNlZGlyIGlzIG5vdCBOb25lCisgICAgICAgIGFzc2VydCBsZW4oYml0YmFrZXMpID09IDEKKyAgICAgICAgIyBzZXQgbGF5ZXJzIGluIHRoZSBsYXllcnNvdXJjZQorCisKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZDogU1NIIHNldExheWVycyIpCisgICAgICAgICMgMy4gY29uZmlndXJlIHRoZSBidWlsZCBlbnZpcm9ubWVudCwgc28gd2UgaGF2ZSBhIGNvbmYvYmJsYXllcnMuY29uZgorICAgICAgICBhc3NlcnQgc2VsZi5wb2t5ZGlybmFtZSBpcyBub3QgTm9uZQorICAgICAgICBzZWxmLl9zZXR1cEJFKCkKKworICAgICAgICAjIDQuIHVwZGF0ZSB0aGUgYmJsYXllcnMuY29uZgorICAgICAgICBiYmxheWVyY29uZiA9IG9zLnBhdGguam9pbihzZWxmLmJlLmJ1aWxkZGlyLCAiY29uZi9iYmxheWVycy5jb25mIikKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhdGhleGlzdHMoYmJsYXllcmNvbmYpOgorICAgICAgICAgICAgcmFpc2UgQnVpbGRTZXR1cEV4Y2VwdGlvbigiQkUgaXMgbm90IGNvbnNpc3RlbnQ6IGJibGF5ZXJzLmNvbmYgZmlsZSBtaXNzaW5nIGF0ICVzIiAlIGJibGF5ZXJjb25mKQorCisgICAgICAgIGltcG9ydCB1dWlkCisgICAgICAgIGxvY2FsX2JibGF5ZXJjb25mID0gIi90bXAvIiArIHV1aWQudXVpZDQoKSArICItYmJsYXllci5jb25mIgorCisgICAgICAgIHNlbGYucHVsbEZpbGUoYmJsYXllcmNvbmYsIGxvY2FsX2JibGF5ZXJjb25mKQorCisgICAgICAgIEJ1aWxkRW52aXJvbm1lbnRDb250cm9sbGVyLl91cGRhdGVCQkxheWVycyhsb2NhbF9iYmxheWVyY29uZiwgbGF5ZXJsaXN0KQorICAgICAgICBzZWxmLnB1c2hGaWxlKGxvY2FsX2JibGF5ZXJjb25mLCBiYmxheWVyY29uZikKKworICAgICAgICBvcy51bmxpbmsobG9jYWxfYmJsYXllcmNvbmYpCisKKyAgICAgICAgc2VsZi5pc2xheWVyc2V0ID0gVHJ1ZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLmJlLnNvdXJjZWRpciBhbmQgc2VsZi5fcGF0aGV4aXN0cyhzZWxmLmJlLmJ1aWxkZGlyKQorICAgICAgICBpbXBvcnQgc2h1dGlsCisgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5qb2luKHNlbGYuYmUuc291cmNlZGlyLCAiYnVpbGQiKSkKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9wYXRoZXhpc3RzKHNlbGYuYmUuYnVpbGRkaXIpCisKKyAgICBkZWYgdHJpZ2dlckJ1aWxkKHNlbGYsIGJpdGJha2UsIGxheWVycywgdmFyaWFibGVzLCB0YXJnZXRzKToKKyAgICAgICAgIyBzZXQgdXAgdGhlIGJ1aWQgZW52aXJvbm1lbnQgd2l0aCB0aGUgbmVlZGVkIGxheWVycworICAgICAgICBzZWxmLnNldExheWVycyhiaXRiYWtlLCBsYXllcnMpCisgICAgICAgIHNlbGYud3JpdGVDb25mRmlsZSgiY29uZi90b2FzdGVyLXByZS5jb25mIiwgKQorICAgICAgICBzZWxmLndyaXRlQ29uZkZpbGUoImNvbmYvdG9hc3Rlci5jb25mIiwgcmF3ID0gIklOSEVSSVQrPVwidG9hc3RlciBidWlsZGhpc3RvcnlcIiIpCisKKyAgICAgICAgIyBnZXQgdGhlIGJiIHNlcnZlciBydW5uaW5nIHdpdGggdGhlIGJ1aWxkIHJlcSBpZCBhbmQgYnVpbGQgZW52IGlkCisgICAgICAgIGJiY3RybCA9IHNlbGYuZ2V0QkJDb250cm9sbGVyKCkKKworICAgICAgICAjIHRyaWdnZXIgdGhlIGJ1aWxkIGNvbW1hbmQKKyAgICAgICAgdGFzayA9IHJlZHVjZShsYW1iZGEgeCwgeTogeCBpZiBsZW4oeSk9PSAwIGVsc2UgeSwgbWFwKGxhbWJkYSB5OiB5LnRhc2ssIHRhcmdldHMpKQorICAgICAgICBpZiBsZW4odGFzaykgPT0gMDoKKyAgICAgICAgICAgIHRhc2sgPSBOb25lCisKKyAgICAgICAgYmJjdHJsLmJ1aWxkKGxpc3QobWFwKGxhbWJkYSB4OngudGFyZ2V0LCB0YXJnZXRzKSksIHRhc2spCisKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJsb2NhbGhvc3RiZWNvbnRyb2xsZXI6IEJ1aWxkIGxhdW5jaGVkLCBleGl0aW5nLiBGb2xsb3cgYnVpbGQgbG9ncyBhdCAlcy90b2FzdGVyX3VpLmxvZyIgJSBzZWxmLmJlLmJ1aWxkZGlyKQorCisgICAgICAgICMgZGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAgICAgYmJjdHJsLmRpc2Nvbm5lY3QoKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL3Rlc3RzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9ibGRjb250cm9sL3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmM3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvdGVzdHMucHkKQEAgLTAsMCArMSwxOTAgQEAKKyIiIgorVGhpcyBmaWxlIGRlbW9uc3RyYXRlcyB3cml0aW5nIHRlc3RzIHVzaW5nIHRoZSB1bml0dGVzdCBtb2R1bGUuIFRoZXNlIHdpbGwgcGFzcword2hlbiB5b3UgcnVuICJtYW5hZ2UucHkgdGVzdCIuCisKK1JlcGxhY2UgdGhpcyB3aXRoIG1vcmUgYXBwcm9wcmlhdGUgdGVzdHMgZm9yIHlvdXIgYXBwbGljYXRpb24uCisiIiIKKworZnJvbSBkamFuZ28udGVzdCBpbXBvcnQgVGVzdENhc2UKKworZnJvbSBibGRjb250cm9sLmJiY29udHJvbGxlciBpbXBvcnQgQml0YmFrZUNvbnRyb2xsZXIsIEJ1aWxkU2V0dXBFeGNlcHRpb24KK2Zyb20gYmxkY29udHJvbC5sb2NhbGhvc3RiZWNvbnRyb2xsZXIgaW1wb3J0IExvY2FsaG9zdEJFQ29udHJvbGxlcgorZnJvbSBibGRjb250cm9sLnNzaGJlY29udHJvbGxlciBpbXBvcnQgU1NIQkVDb250cm9sbGVyCitmcm9tIGJsZGNvbnRyb2wubW9kZWxzIGltcG9ydCBCdWlsZEVudmlyb25tZW50LCBCdWlsZFJlcXVlc3QKK2Zyb20gYmxkY29udHJvbC5tYW5hZ2VtZW50LmNvbW1hbmRzLnJ1bmJ1aWxkcyBpbXBvcnQgQ29tbWFuZAorCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IG9zCisKKyMgc3RhbmRhcmQgcG9reSBkYXRhIGhhcmRjb2RlZCBmb3IgdGVzdGluZworQklUQkFLRV9MQVlFUlMgPSBbdHlwZSgnYml0YmFrZV9pbmZvJywgKG9iamVjdCwpLCB7ICJnaXR1cmwiOiAiZ2l0Oi8vZ2l0LnlvY3RvcHJvamVjdC5vcmcvcG9reS5naXQiLCAiZGlycGF0aCI6ICIiLCAiY29tbWl0IjogIkhFQUQifSldCitQT0tZX0xBWUVSUyA9IFsKKyAgICB0eXBlKCdwb2t5X2luZm8nLCAob2JqZWN0LCksIHsgIm5hbWUiOiAibWV0YSIsICJnaXR1cmwiOiAiZ2l0Oi8vZ2l0LnlvY3RvcHJvamVjdC5vcmcvcG9reS5naXQiLCAiZGlycGF0aCI6ICJtZXRhIiwgImNvbW1pdCI6ICJIRUFEIn0pLAorICAgIHR5cGUoJ3Bva3lfaW5mbycsIChvYmplY3QsKSwgeyAibmFtZSI6ICJtZXRhLXlvY3RvIiwgImdpdHVybCI6ICJnaXQ6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9wb2t5LmdpdCIsICJkaXJwYXRoIjogIm1ldGEteW9jdG8iLCAiY29tbWl0IjogIkhFQUQifSksCisgICAgdHlwZSgncG9reV9pbmZvJywgKG9iamVjdCwpLCB7ICJuYW1lIjogIm1ldGEteW9jdG8tYnNwIiwgImdpdHVybCI6ICJnaXQ6Ly9naXQueW9jdG9wcm9qZWN0Lm9yZy9wb2t5LmdpdCIsICJkaXJwYXRoIjogIm1ldGEteW9jdG8tYnNwIiwgImNvbW1pdCI6ICJIRUFEIn0pLAorICAgIF0KKworCisKKyMgd2UgaGF2ZSBhbiBhYnN0cmFjdCB0ZXN0IGNsYXNzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250cm9sbGVycyB1c2UgYSBzaW5nbGUgaW50ZXJmYWNlCisjIHNwZWNpZmljIGNvbnRyb2xsZXIgdGVzdHMgb25seSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBfZ2V0QnVpbGRFbnZpcm9ubWVudCgpIG1ldGhvZAorCit0ZXN0X3NvdXJjZWRpciA9IG9zLmdldGVudigiVFRTX1NPVVJDRV9ESVIiKQordGVzdF9idWlsZGRpciA9IG9zLmdldGVudigiVFRTX0JVSUxEX0RJUiIpCit0ZXN0X2FkZHJlc3MgPSBvcy5nZXRlbnYoIlRUU19URVNUX0FERFJFU1MiLCAibG9jYWxob3N0IikKKworaWYgdGVzdF9zb3VyY2VkaXIgPT0gTm9uZSBvciB0ZXN0X2J1aWxkZGlyID09IE5vbmUgb3IgdGVzdF9hZGRyZXNzID09IE5vbmU6CisgICAgcmFpc2UgRXhjZXB0aW9uKCJQbGVhc2Ugc2V0IFRUVFNfU09VUkNFX0RJUiwgVFRTX0JVSUxEX0RJUiBhbmQgVFRTX1RFU1RfQUREUkVTUyIpCisKKyMgVGhlIGJiIHNlcnZlciB3aWxsIGV4cGVjdCBhIHRvYXN0ZXItcHJlLmNvbmYgZmlsZSB0byBleGlzdC4gSWYgaXQgZG9lc24ndCBleGl0IHRoZW4gd2UgbWFrZQorIyBhbiBlbXB0eSBvbmUgaGVyZS4KK29wZW4odGVzdF9idWlsZGRpciArICdjb25mL3RvYXN0ZXItcHJlLmNvbmYnLCAnYScpLmNsb3NlKCkKKworY2xhc3MgQkVDb250cm9sbGVyVGVzdHMob2JqZWN0KToKKworICAgIGRlZiBfc2VydmVyRm9yY2VTdG9wKHNlbGYsIGJjKToKKyAgICAgICAgZXJyID0gYmMuX3NoZWxsY21kKCJuZXRzdGF0ICAtdGFwbiAyPi9kZXYvbnVsbCB8IGdyZXAgODIwMCB8IGF3ayAne3ByaW50ICQ3fScgfCBzb3J0IC1mdSB8IGN1dCAtZCBcIi9cIiAtZiAxIHwgZ3JlcCAtdiAtLSAtIHwgdGVlIC9kZXYvZmQvMiB8IHhhcmdzIC1yIGtpbGwiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyID09ICcnLCAiYml0YmFrZSBzZXJ2ZXIgcGlkICVzIG5vdCBzdG9wcGVkIiAlIGVycikKKworICAgIGRlZiB0ZXN0X3NlcnZlclN0YXJ0QW5kU3RvcChzZWxmKToKKyAgICAgICAgZnJvbSBibGRjb250cm9sLnNzaGJlY29udHJvbGxlciBpbXBvcnQgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24KKyAgICAgICAgb2JlID0gIHNlbGYuX2dldEJ1aWxkRW52aXJvbm1lbnQoKQorICAgICAgICBiYyA9IHNlbGYuX2dldEJFQ29udHJvbGxlcihvYmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgc2V0dGluZyBsYXllcnMsIHNraXAgYW55IGxheWVyIGluZm8KKyAgICAgICAgICAgIGJjLnNldExheWVycyhCSVRCQUtFX0xBWUVSUywgUE9LWV9MQVlFUlMpCisgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiwgIGU6CisgICAgICAgICAgICBwcmludCAiVGVzdCBza2lwcGVkIGR1ZSB0byBjb21tYW5kIG5vdCBpbXBsZW1lbnRlZCB5ZXQiCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIFdlIGFyZSBvayB3aXRoIHRoZSBleGNlcHRpb24gYXMgd2UncmUgaGFuZGxpbmcgdGhlIGdpdCBhbHJlYWR5IGV4aXN0cworICAgICAgICBleGNlcHQgQnVpbGRTZXR1cEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBiYy5wb2t5ZGlybmFtZSA9IHRlc3Rfc291cmNlZGlyCisgICAgICAgIGJjLmlzbGF5ZXJzZXQgPSBUcnVlCisKKyAgICAgICAgaG9zdG5hbWUgPSB0ZXN0X2FkZHJlc3Muc3BsaXQoIkAiKVstMV0KKworICAgICAgICAjIHRlc3Qgc3RhcnQgc2VydmVyIGFuZCBzdG9wCisgICAgICAgIGJjLnN0YXJ0QkJTZXJ2ZXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKS5jb25uZWN0X2V4KChob3N0bmFtZSwgaW50KGJjLmJlLmJicG9ydCkpKSwgIlNlcnZlciBub3QgYW5zd2VyaW5nIikKKworICAgICAgICBiYy5zdG9wQkJTZXJ2ZXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKS5jb25uZWN0X2V4KChob3N0bmFtZSwgaW50KGJjLmJlLmJicG9ydCkpKSwgIlNlcnZlciBub3Qgc3RvcHBlZCIpCisKKyAgICAgICAgc2VsZi5fc2VydmVyRm9yY2VTdG9wKGJjKQorCisgICAgZGVmIHRlc3RfZ2V0QkJDb250cm9sbGVyKHNlbGYpOgorICAgICAgICBmcm9tIGJsZGNvbnRyb2wuc3NoYmVjb250cm9sbGVyIGltcG9ydCBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbgorICAgICAgICBvYmUgPSBzZWxmLl9nZXRCdWlsZEVudmlyb25tZW50KCkKKyAgICAgICAgYmMgPSBzZWxmLl9nZXRCRUNvbnRyb2xsZXIob2JlKQorICAgICAgICBsYXllclNldCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgc2V0dGluZyBsYXllcnMsIHNraXAgYW55IGxheWVyIGluZm8KKyAgICAgICAgICAgIGxheWVyU2V0ID0gYmMuc2V0TGF5ZXJzKEJJVEJBS0VfTEFZRVJTLCBQT0tZX0xBWUVSUykKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOgorICAgICAgICAgICAgcHJpbnQgIlRlc3Qgc2tpcHBlZCBkdWUgdG8gY29tbWFuZCBub3QgaW1wbGVtZW50ZWQgeWV0IgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBXZSBhcmUgb2sgd2l0aCB0aGUgZXhjZXB0aW9uIGFzIHdlJ3JlIGhhbmRsaW5nIHRoZSBnaXQgYWxyZWFkeSBleGlzdHMKKyAgICAgICAgZXhjZXB0IEJ1aWxkU2V0dXBFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYmMucG9reWRpcm5hbWUgPSB0ZXN0X3NvdXJjZWRpcgorICAgICAgICBiYy5pc2xheWVyc2V0ID0gVHJ1ZQorCisgICAgICAgIGJiYyA9IGJjLmdldEJCQ29udHJvbGxlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJiYywgQml0YmFrZUNvbnRyb2xsZXIpKQorICAgICAgICBiYy5zdG9wQkJTZXJ2ZXIoKQorCisgICAgICAgIHNlbGYuX3NlcnZlckZvcmNlU3RvcChiYykKKworY2xhc3MgTG9jYWxob3N0QkVDb250cm9sbGVyVGVzdHMoVGVzdENhc2UsIEJFQ29udHJvbGxlclRlc3RzKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzdXBlcihMb2NhbGhvc3RCRUNvbnRyb2xsZXJUZXN0cywgc2VsZikuX19pbml0X18oKmFyZ3MpCisKKworICAgIGRlZiBfZ2V0QnVpbGRFbnZpcm9ubWVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5jcmVhdGUoCisgICAgICAgICAgICAgICAgbG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFLAorICAgICAgICAgICAgICAgIGJldHlwZSA9IEJ1aWxkRW52aXJvbm1lbnQuVFlQRV9MT0NBTCwKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gdGVzdF9hZGRyZXNzLAorICAgICAgICAgICAgICAgIHNvdXJjZWRpciA9IHRlc3Rfc291cmNlZGlyLAorICAgICAgICAgICAgICAgIGJ1aWxkZGlyID0gdGVzdF9idWlsZGRpciApCisKKyAgICBkZWYgX2dldEJFQ29udHJvbGxlcihzZWxmLCBvYmUpOgorICAgICAgICByZXR1cm4gTG9jYWxob3N0QkVDb250cm9sbGVyKG9iZSkKKworY2xhc3MgU1NIQkVDb250cm9sbGVyVGVzdHMoVGVzdENhc2UsIEJFQ29udHJvbGxlclRlc3RzKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzdXBlcihTU0hCRUNvbnRyb2xsZXJUZXN0cywgc2VsZikuX19pbml0X18oKmFyZ3MpCisKKyAgICBkZWYgX2dldEJ1aWxkRW52aXJvbm1lbnQoc2VsZik6CisgICAgICAgIHJldHVybiBCdWlsZEVudmlyb25tZW50Lm9iamVjdHMuY3JlYXRlKAorICAgICAgICAgICAgICAgIGxvY2sgPSBCdWlsZEVudmlyb25tZW50LkxPQ0tfRlJFRSwKKyAgICAgICAgICAgICAgICBiZXR5cGUgPSBCdWlsZEVudmlyb25tZW50LlRZUEVfU1NILAorICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB0ZXN0X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgc291cmNlZGlyID0gdGVzdF9zb3VyY2VkaXIsCisgICAgICAgICAgICAgICAgYnVpbGRkaXIgPSB0ZXN0X2J1aWxkZGlyICkKKworICAgIGRlZiBfZ2V0QkVDb250cm9sbGVyKHNlbGYsIG9iZSk6CisgICAgICAgIHJldHVybiBTU0hCRUNvbnRyb2xsZXIob2JlKQorCisgICAgZGVmIHRlc3RfcGF0aEV4aXN0cyhzZWxmKToKKyAgICAgICAgb2JlID0gQnVpbGRFbnZpcm9ubWVudC5vYmplY3RzLmNyZWF0ZShiZXR5cGUgPSBCdWlsZEVudmlyb25tZW50LlRZUEVfU1NILCBhZGRyZXNzPSB0ZXN0X2FkZHJlc3MpCisgICAgICAgIHNiYyA9IFNTSEJFQ29udHJvbGxlcihvYmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzYmMuX3BhdGhleGlzdHMoIi8iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzYmMuX3BhdGhleGlzdHMoIi8uZGVhZGJlZWYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNiYy5fcGF0aGV4aXN0cyhzYmMuX3NoZWxsY21kKCJwd2QiKSkpCisKKworY2xhc3MgUnVuQnVpbGRzQ29tbWFuZFRlc3RzKFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iZWNfc2VsZWN0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdHMgdGhhdCB3ZSBjYW4gZmluZCBhbmQgbG9jayBhIGJ1aWxkIGVudmlyb25tZW50CisgICAgICAgICIiIgorCisgICAgICAgIG9iZSA9IEJ1aWxkRW52aXJvbm1lbnQub2JqZWN0cy5jcmVhdGUobG9jayA9IEJ1aWxkRW52aXJvbm1lbnQuTE9DS19GUkVFLCBiZXR5cGUgPSBCdWlsZEVudmlyb25tZW50LlRZUEVfTE9DQUwpCisgICAgICAgIGNvbW1hbmQgPSBDb21tYW5kKCkKKyAgICAgICAgYmVjID0gY29tbWFuZC5fc2VsZWN0QnVpbGRFbnZpcm9ubWVudCgpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgd2Ugc2VsZWN0IHRoZSBvYmplY3Qgd2UndmUganVzdCBidWlsdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmVjLmJlLmlkID09IG9iZS5pZCwgIkVudmlyb25tZW50IGlzIG5vdCBwcm9wZXJseSBzZWxlY3RlZCIpCisgICAgICAgICMgd2UgaGF2ZSBhIGxvY2tlZCBlbnZpcm9ubWVudAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmVjLmJlLmxvY2sgPT0gQnVpbGRFbnZpcm9ubWVudC5MT0NLX0xPQ0ssICJFbnZpcm9ubWVudCBpcyBub3QgbG9ja2VkIikKKyAgICAgICAgIyBubyBtb3JlIHNlbGVjdGlvbnMgcG9zc2libGUgaGVyZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBjb21tYW5kLl9zZWxlY3RCdWlsZEVudmlyb25tZW50KQorCisgICAgZGVmIHRlc3RfYnJfc2VsZWN0KHNlbGYpOgorICAgICAgICBmcm9tIG9ybS5tb2RlbHMgaW1wb3J0IFByb2plY3QsIFJlbGVhc2UsIEJpdGJha2VWZXJzaW9uLCBCcmFuY2gKKyAgICAgICAgcCA9IFByb2plY3Qub2JqZWN0cy5jcmVhdGVfcHJvamVjdCgidGVzdCIsIFJlbGVhc2Uub2JqZWN0cy5nZXRfb3JfY3JlYXRlKG5hbWUgPSAiSEVBRCIsIGJpdGJha2VfdmVyc2lvbiA9IEJpdGJha2VWZXJzaW9uLm9iamVjdHMuZ2V0X29yX2NyZWF0ZShuYW1lPSJIRUFEIiwgYnJhbmNoPUJyYW5jaC5vYmplY3RzLmdldF9vcl9jcmVhdGUobmFtZT0iSEVBRCIpKVswXSlbMF0pCisgICAgICAgIG9iciA9IEJ1aWxkUmVxdWVzdC5vYmplY3RzLmNyZWF0ZShzdGF0ZSA9IEJ1aWxkUmVxdWVzdC5SRVFfUVVFVUVELCBwcm9qZWN0ID0gcCkKKyAgICAgICAgY29tbWFuZCA9IENvbW1hbmQoKQorICAgICAgICBiciA9IGNvbW1hbmQuX3NlbGVjdEJ1aWxkUmVxdWVzdCgpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgd2Ugc2VsZWN0IHRoZSBvYmplY3Qgd2UndmUganVzdCBidWlsdAorICAgICAgICBzZWxmLmFzc2VydFRydWUob2JyLmlkID09IGJyLmlkLCAiUmVxdWVzdCBpcyBub3QgcHJvcGVybHkgc2VsZWN0ZWQiKQorICAgICAgICAjIHdlIGhhdmUgYSBsb2NrZWQgZW52aXJvbm1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJyLnN0YXRlID09IEJ1aWxkUmVxdWVzdC5SRVFfSU5QUk9HUkVTUywgIlJlcXVlc3QgaXMgbm90IHVwZGF0ZWQiKQorICAgICAgICAjIG5vIG1vcmUgc2VsZWN0aW9ucyBwb3NzaWJsZSBoZXJlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGNvbW1hbmQuX3NlbGVjdEJ1aWxkUmVxdWVzdCkKKworCitjbGFzcyBVdGlsaXR5VGVzdHMoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JlZHVjZV9wYXRoKHNlbGYpOgorICAgICAgICBmcm9tIGJsZGNvbnRyb2wubWFuYWdlbWVudC5jb21tYW5kcy5sb2FkY29uZiBpbXBvcnQgX3JlZHVjZV9jYW5vbl9wYXRoLCBfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfcmVkdWNlX2Nhbm9uX3BhdGgoIi8iKSA9PSAiLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSggX3JlZHVjZV9jYW5vbl9wYXRoKCIvaG9tZS8uLiIpID09ICIvIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfcmVkdWNlX2Nhbm9uX3BhdGgoIi9ob21lLy4uL2FuYSIpID09ICIvYW5hIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfcmVkdWNlX2Nhbm9uX3BhdGgoIi9ob21lLy4uL2FuYS8uLiIpID09ICIvIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCBfcmVkdWNlX2Nhbm9uX3BhdGgoIi9ob21lL2FuYS9taWhhaS8uLi9tYXJpYSIpID09ICIvaG9tZS9hbmEvbWFyaWEiKQorCisgICAgZGVmIHRlc3RfZ2V0X2lkX2Zvcl9zb3J1Y2V0eXBlKHNlbGYpOgorICAgICAgICBmcm9tIGJsZGNvbnRyb2wubWFuYWdlbWVudC5jb21tYW5kcy5sb2FkY29uZiBpbXBvcnQgX3JlZHVjZV9jYW5vbl9wYXRoLCBfZ2V0X2lkX2Zvcl9zb3VyY2V0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSggX2dldF9pZF9mb3Jfc291cmNldHlwZSgibGF5ZXJpbmRleCIpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSggX2dldF9pZF9mb3Jfc291cmNldHlwZSgibG9jYWwiKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIF9nZXRfaWRfZm9yX3NvdXJjZXR5cGUoImltcG9ydGVkIikgPT0gMikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgX2dldF9pZF9mb3Jfc291cmNldHlwZSgidW5rbm93biIpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvdmlld3MucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2JsZGNvbnRyb2wvdmlld3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmMDBlZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvYmxkY29udHJvbC92aWV3cy5weQpAQCAtMCwwICsxIEBACisjIENyZWF0ZSB5b3VyIHZpZXdzIGhlcmUuCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvUkVBRE1FIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQwZmYwCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL1JFQURNRQpAQCAtMCwwICsxLDYgQEAKK2NvbnRyaWIgZGlyZWN0b3J5IGZvciB0b2FzdGVyCisKK1RoaXMgZGlyZWN0b3J5IGhvbGRzIGNvZGUgdGhhdCB3b3JrcyB3aXRoIFRvYXN0ZXIsIHdpdGhvdXQgYmVpbmcgYW4gaW50ZWdyYWwgcGFydCBvZiB0aGUgVG9hc3RlciBwcm9qZWN0LgorSXQgaXMgaW50ZW5kZWQgZm9yIHRlc3RpbmcgY29kZSwgdGVzdGluZyBmaXh0dXJlcywgdG9vbHMgZm9yIFRvYXN0ZXIsIGV0Yy4KKworTk9URTogVGhpcyBkaXJlY3RvcnkgaXMgTk9UIGEgUHl0aG9uIG1vZHVsZS4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci8uZ2l0aWdub3JlIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1NjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTAgQEAKKyoucHljCisqLnN3cAorKi5zd28KKyoua3BmCisqLmVnZy1pbmZvLworLmlkZWEKKy50b3gKK3RtcC8KK2Rpc3QvCisuRFNfU3RvcmUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci8udHJhdmlzLnltbCBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTIwZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyLy50cmF2aXMueW1sCkBAIC0wLDAgKzEsNTAgQEAKK2xhbmd1YWdlOiBweXRob24KK3B5dGhvbjoKKyAgLSAiMi43IgorICAtICIzLjQiCitzZXJ2aWNlczoKKyAgLSBteXNxbAorICAtIHBvc3RncmVzcWwKK2VudjoKKyAgLSBESkFOR089MS40IERCPXNxbGl0ZQorICAtIERKQU5HTz0xLjQgREI9bXlzcWwKKyAgLSBESkFOR089MS40IERCPXBvc3RncmVzCisgIC0gREpBTkdPPTEuNSBEQj1zcWxpdGUKKyAgLSBESkFOR089MS41IERCPW15c3FsCisgIC0gREpBTkdPPTEuNSBEQj1wb3N0Z3JlcworICAtIERKQU5HTz0xLjYgREI9c3FsaXRlCisgIC0gREpBTkdPPTEuNiBEQj1teXNxbAorICAtIERKQU5HTz0xLjYgREI9cG9zdGdyZXMKKyAgLSBESkFOR089MS43IERCPXNxbGl0ZQorICAtIERKQU5HTz0xLjcgREI9bXlzcWwKKyAgLSBESkFOR089MS43IERCPXBvc3RncmVzCisKK21hdHJpeDoKKyAgZXhjbHVkZToKKyAgICAtIHB5dGhvbjogIjMuNCIKKyAgICAgIGVudjogREpBTkdPPTEuNCBEQj1zcWxpdGUKKyAgICAtIHB5dGhvbjogIjMuNCIKKyAgICAgIGVudjogREpBTkdPPTEuNCBEQj1teXNxbAorICAgIC0gcHl0aG9uOiAiMy40IgorICAgICAgZW52OiBESkFOR089MS40IERCPXBvc3RncmVzCisgICAgLSBweXRob246ICIzLjQiCisgICAgICBlbnY6IERKQU5HTz0xLjUgREI9c3FsaXRlCisgICAgLSBweXRob246ICIzLjQiCisgICAgICBlbnY6IERKQU5HTz0xLjUgREI9bXlzcWwKKyAgICAtIHB5dGhvbjogIjMuNCIKKyAgICAgIGVudjogREpBTkdPPTEuNSBEQj1wb3N0Z3JlcworICAgIC0gcHl0aG9uOiAiMy40IgorICAgICAgZW52OiBESkFOR089MS42IERCPW15c3FsCisgICAgLSBweXRob246ICIzLjQiCisgICAgICBlbnY6IERKQU5HTz0xLjcgREI9bXlzcWwKKworYmVmb3JlX3NjcmlwdDoKKyAgLSBteXNxbCAtZSAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKyAgLSBwc3FsIC1jICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JyAtVSBwb3N0Z3JlcworaW5zdGFsbDoKKyAgLSBwaXAgaW5zdGFsbCBzaXgKKyAgLSBpZiBbICIkREIiID09ICJteXNxbCIgXTsgdGhlbiBwaXAgaW5zdGFsbCBteXNxbC1weXRob247IGZpCisgIC0gaWYgWyAiJERCIiA9PSAicG9zdGdyZXMiIF07IHRoZW4gcGlwIGluc3RhbGwgcHN5Y29wZzI7IGZpCisgIC0gcGlwIGluc3RhbGwgLXEgRGphbmdvPT0kREpBTkdPIC0tdXNlLW1pcnJvcnMKK3NjcmlwdDoKKyAgLSAuL3J1bnRlc3RzLnB5IC0tc2V0dGluZ3M9dGVzdHMudGVzdF8kREIKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9MSUNFTlNFIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3YzNiMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9MSUNFTlNFCkBAIC0wLDAgKzEsMjEgQEAKK1RoZSBNSVQgTGljZW5zZQorCitDb3B5cmlnaHQgKGMpIDIwMTIgSGVucmlxdWUgQmFzdG9zCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL1JFQURNRS5yc3QgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvUkVBRE1FLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzlkNGRhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL1JFQURNRS5yc3QKQEAgLTAsMCArMSwxNTYgQEAKK0RqYW5nbyBBZ2dyZWdhdGUgSWY6IENvbmRpdGlvbiBhZ2dyZWdhdGVzIGZvciBEamFuZ28KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gaW1hZ2U6OiBodHRwczovL3RyYXZpcy1jaS5vcmcvaGVucmlxdWViYXN0b3MvZGphbmdvLWFnZ3JlZ2F0ZS1pZi5wbmc/YnJhbmNoPW1hc3RlcgorICAgIDp0YXJnZXQ6IGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9oZW5yaXF1ZWJhc3Rvcy9kamFuZ28tYWdncmVnYXRlLWlmCisgICAgOmFsdDogVGVzdCBTdGF0dXMKKworLi4gaW1hZ2U6OiBodHRwczovL2xhbmRzY2FwZS5pby9naXRodWIvaGVucmlxdWViYXN0b3MvZGphbmdvLWFnZ3JlZ2F0ZS1pZi9tYXN0ZXIvbGFuZHNjYXBlLnBuZworICAgIDp0YXJnZXQ6IGh0dHBzOi8vbGFuZHNjYXBlLmlvL2dpdGh1Yi9oZW5yaXF1ZWJhc3Rvcy9kamFuZ28tYWdncmVnYXRlLWlmL21hc3RlcgorICAgIDphbHQ6IENvZGUgSGVsdGgKKworLi4gaW1hZ2U6OiBodHRwczovL3B5cGlwLmluL3YvZGphbmdvLWFnZ3JlZ2F0ZS1pZi9iYWRnZS5wbmcKKyAgICA6dGFyZ2V0OiBodHRwczovL2NyYXRlLmlvL3BhY2thZ2VzL2RqYW5nby1hZ2dyZWdhdGUtaWYvCisgICAgOmFsdDogTGF0ZXN0IFB5UEkgdmVyc2lvbgorCisuLiBpbWFnZTo6IGh0dHBzOi8vcHlwaXAuaW4vZC9kamFuZ28tYWdncmVnYXRlLWlmL2JhZGdlLnBuZworICAgIDp0YXJnZXQ6IGh0dHBzOi8vY3JhdGUuaW8vcGFja2FnZXMvZGphbmdvLWFnZ3JlZ2F0ZS1pZi8KKyAgICA6YWx0OiBOdW1iZXIgb2YgUHlQSSBkb3dubG9hZHMKKworKkFnZ3JlZ2F0ZS1pZiogYWRkcyBjb25kaXRpb25hbCBhZ2dyZWdhdGVzIHRvIERqYW5nby4KKworQ29uZGl0aW9uYWwgYWdncmVnYXRlcyBjYW4gaGVscCB5b3UgcmVkdWNlIHRoZSBhbW1vdW50IG9mIHF1ZXJpZXMgdG8gb2J0YWluCithZ2dyZWdhdGVkIGluZm9ybWF0aW9uLCBsaWtlIHN0YXRpc3RpY3MgZm9yIGV4YW1wbGUuCisKK0ltYWdpbmUgeW91IGhhdmUgYSBtb2RlbCBgYE9mZmVyYGAgbGlrZSB0aGlzIG9uZToKKworLi4gY29kZS1ibG9jazo6IHB5dGhvbgorCisgICAgY2xhc3MgT2ZmZXIobW9kZWxzLk1vZGVsKToKKyAgICAgICAgc3BvbnNvciA9IG1vZGVscy5Gb3JlaWduS2V5KFVzZXIpCisgICAgICAgIHByaWNlID0gbW9kZWxzLkRlY2ltYWxGaWVsZChtYXhfZGlnaXRzPTksIGRlY2ltYWxfcGxhY2VzPTIpCisgICAgICAgIHN0YXR1cyA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0zMCkKKyAgICAgICAgZXhwaXJlX2F0ID0gbW9kZWxzLkRhdGVGaWVsZChudWxsPVRydWUsIGJsYW5rPVRydWUpCisgICAgICAgIGNyZWF0ZWRfYXQgPSBtb2RlbHMuRGF0ZVRpbWVGaWVsZChhdXRvX25vd19hZGQ9VHJ1ZSkKKyAgICAgICAgdXBkYXRlZF9hdCA9IG1vZGVscy5EYXRlVGltZUZpZWxkKGF1dG9fbm93PVRydWUpCisKKyAgICAgICAgT1BFTiA9ICJPUEVOIgorICAgICAgICBSRVZPS0VEID0gIlJFVk9LRUQiCisgICAgICAgIFBBSUQgPSAiUEFJRCIKKworTGV0J3Mgc2F5IHlvdSB3YW50IHRvIGtub3c6CisKKyMuIEhvdyBtYW55IG9mZmVycyBleGlzdHMgaW4gdG90YWw7CisjLiBIb3cgbWFueSBvZiB0aGVtIGFyZSBPUEVOLCBSRVZPS0VEIG9yIFBBSUQ7CisjLiBIb3cgbXVjaCBtb25leSB3YXMgb2ZmZXJlZCBpbiB0b3RhbDsKKyMuIEhvdyBtdWNoIG1vbmV5IGlzIGluIE9QRU4sIFJFVk9LRUQgYW5kIFBBSUQgb2ZmZXJzOworCitUbyBnZXQgdGhlc2UgaW5mb3JtYXRpb25zLCB5b3UgY291bGQgcXVlcnk6CisKKy4uIGNvZGUtYmxvY2s6OiBweXRob24KKworICAgIGZyb20gZGphbmdvLmRiLm1vZGVscyBpbXBvcnQgQ291bnQsIFN1bQorCisgICAgT2ZmZXIub2JqZWN0cy5jb3VudCgpCisgICAgT2ZmZXIub2JqZWN0cy5maWx0ZXIoc3RhdHVzPU9mZmVyLk9QRU4pLmFnZ3JlZ2F0ZShDb3VudCgncGsnKSkKKyAgICBPZmZlci5vYmplY3RzLmZpbHRlcihzdGF0dXM9T2ZmZXIuUkVWT0tFRCkuYWdncmVnYXRlKENvdW50KCdwaycpKQorICAgIE9mZmVyLm9iamVjdHMuZmlsdGVyKHN0YXR1cz1PZmZlci5QQUlEKS5hZ2dyZWdhdGUoQ291bnQoJ3BrJykpCisgICAgT2ZmZXIub2JqZWN0cy5hZ2dyZWdhdGUoU3VtKCdwcmljZScpKQorICAgIE9mZmVyLm9iamVjdHMuZmlsdGVyKHN0YXR1cz1PZmZlci5PUEVOKS5hZ2dyZWdhdGUoU3VtKCdwcmljZScpKQorICAgIE9mZmVyLm9iamVjdHMuZmlsdGVyKHN0YXR1cz1PZmZlci5SRVZPS0VEKS5hZ2dyZWdhdGUoU3VtKCdwcmljZScpKQorICAgIE9mZmVyLm9iamVjdHMuZmlsdGVyKHN0YXR1cz1PZmZlci5QQUlEKS5hZ2dyZWdhdGUoU3VtKCdwcmljZScpKQorCitJbiB0aGlzIGNhc2UsICoqOCBxdWVyaWVzKiogd2VyZSBuZWVkZWQgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgaW5mb3JtYXRpb24uCisKK1dpdGggY29uZGl0aW9uYWwgYWdncmVnYXRlcyB5b3UgY2FuIGdldCBpdCBhbGwgd2l0aCBvbmx5ICoqMSBxdWVyeSoqOgorCisuLiBjb2RlLWJsb2NrOjogcHl0aG9uCisKKyAgICBmcm9tIGRqYW5nby5kYi5tb2RlbHMgaW1wb3J0IFEKKyAgICBmcm9tIGFnZ3JlZ2F0ZV9pZiBpbXBvcnQgQ291bnQsIFN1bQorCisgICAgT2ZmZXIub2JqZWN0cy5hZ2dyZWdhdGUoCisgICAgICAgIHBrX19jb3VudD1Db3VudCgncGsnKSwKKyAgICAgICAgcGtfX29wZW5fX2NvdW50PUNvdW50KCdwaycsIG9ubHk9UShzdGF0dXM9T2ZmZXIuT1BFTikpLAorICAgICAgICBwa19fcmV2b2tlZF9fY291bnQ9Q291bnQoJ3BrJywgb25seT1RKHN0YXR1cz1PZmZlci5SRVZPS0VEKSksCisgICAgICAgIHBrX19wYWlkX19jb3VudD1Db3VudCgncGsnLCBvbmx5PVEoc3RhdHVzPU9mZmVyLlBBSUQpKSwKKyAgICAgICAgcGtfX3N1bT1TdW0oJ3ByaWNlJyksCisgICAgICAgIHBrX19vcGVuX19zdW09U3VtKCdwcmljZScsIG9ubHk9UShzdGF0dXM9T2ZmZXIuT1BFTikpLAorICAgICAgICBwa19fcmV2b2tlZF9fc3VtPVN1bSgncHJpY2UnKSwgb25seT1RKHN0YXR1cz1PZmZlci5SRVZPS0VEKSksCisgICAgICAgIHBrX19wYWlkX19zdW09U3VtKCdwcmljZScpLCBvbmx5PVEoc3RhdHVzPU9mZmVyLlBBSUQpKQorICAgICkKKworSW5zdGFsbGF0aW9uCistLS0tLS0tLS0tLS0KKworKkFnZ3JlZ2F0ZS1pZiogd29ya3Mgd2l0aCBEamFuZ28gMS40LCAxLjUsIDEuNiBhbmQgMS43LgorCitUbyBpbnN0YWxsIGl0LCBzaW1wbHk6CisKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgICAkIHBpcCBpbnN0YWxsIGRqYW5nby1hZ2dyZWdhdGUtaWYKKworSW5zcGlyYXRpb24KKy0tLS0tLS0tLS0tCisKK1RoZXJlIGlzIGEgNSB5ZWFycyBvbGQgYHRpY2tldCAxMTMwNWBfIHRoYXQgd2lsbCAoKmhvcGVmdWxseSopIGltcGxlbWVudCB0aGlzIGZlYXR1cmUgaW50bworRGphbmdvIDEuOC4KKworVXNpbmcgRGphbmdvIDEuNiwgSSBzdGlsbCB3YW50ZWQgdG8gYXZvaWQgY3JlYXRpbmcgY3VzdG9tIHF1ZXJpZXMgZm9yIHZlcnkgc2ltcGxlCitjb25kaXRpb25hbCBhZ2dyZWdhdGlvbnMuIFNvIEkndmUgY2hlcnJ5IHBpY2tlZCB0aG9zZSBpZGVhcyBhbmQgb3RoZXJzIGZyb20gdGhlCitpbnRlcm5ldCBhbmQgYnVpbHQgdGhpcyBsaWJyYXJ5LgorCitUaGlzIGxpYnJhcnkgdXNlcyB0aGUgc2FtZSBBUEkgYW5kIHRlc3RzIHByb3Bvc2VkIG9uIGB0aWNrZXQgMTEzMDVgXywgc28gd2hlbiB0aGUKK25ldyBmZWF0dXJlIGlzIGF2YWlsYWJsZSB5b3UgY2FuIGVhc2lseSByZXBsYWNlIGBgZGphbmdvLWFnZ3JlZ2F0ZS1pZmBgLgorCitMaW1pdGF0aW9ucworLS0tLS0tLS0tLS0KKworQ29uZGl0aW9ucyBpbnZvbHZpbmcgam9pbnMgd2l0aCBhbGlhc2VzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4gSWYgeW91IHdhbnQgdG8KK2hlbHAgYWRkaW5nIHRoaXMgZmVhdHVyZSwgeW91J3JlIHdlbGNvbWUgdG8gY2hlY2sgdGhlIGBmaXJzdCBpc3N1ZWBfLgorCitDb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLQorCisqIGBIZW5yaXF1ZSBCYXN0b3MgPGh0dHA6Ly9naXRodWIuY29tL2hlbnJpcXVlYmFzdG9zPmBfCisqIGBJdXJpIGRlIFNpbHZpbyA8aHR0cHM6Ly9naXRodWIuY29tL2l1cmlzaWx2aW8+YF8KKyogYEhhbXB1cyBTdGplcm5oYXYgPGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFtcD5gXworKiBgQnJhZGxleSBNYXJ0c2JlcmdlciA8aHR0cHM6Ly9naXRodWIuY29tL21hcnRzYmVyZ2VyPmBfCisqIGBNYXJrdXMgQmVydGhlYXUgPGh0dHBzOi8vZ2l0aHViLmNvbS9tYmVydGhlYXU+YF8KKyogYGVuZDAgPGh0dHBzOi8vZ2l0aHViLmNvbS9lbmQwPmBfCisqIGBTY290dCBTZXh0b24gPGh0dHBzOi8vZ2l0aHViLmNvbS9zY290dHNleHRvbj5gXworKiBgTWF1bGVyIDxodHRwczovL2dpdGh1Yi5jb20vbWF1bGVyPmBfCisqIGB0cmJzIDxodHRwczovL2dpdGh1Yi5jb20vdHJicz5gXworCitDaGFuZ2Vsb2cKKy0tLS0tLS0tLQorCiswLjUKKyAgICAtIFN1cHBvcnQgZm9yIERqYW5nbyAxLjcKKworMC40CisgICAgLSBVc2UgdG94IHRvIHJ1biB0ZXN0cy4KKyAgICAtIEFkZCBzdXBwb3J0IGZvciBEamFuZ28gMS42LgorICAgIC0gQWRkIHN1cHBvcnQgZm9yIFB5dGhvbjMuCisgICAgLSBUaGUgYGBvbmx5YGAgcGFyYW1ldGVyIG5vdyBmcmVlbHkgc3VwcG9ydHMgam9pbnMgaW5kZXBlbmRlbnQgb2YgdGhlIG1haW4gcXVlcnkuCisgICAgLSBBZGRzIHN1cHBvcnQgZm9yIGFsaWFzIHJlbGFiZWxpbmcgcGVybWl0dGluZyBleGNsdWRlcyBhbmQgdXBkYXRlcyB3aXRoIGFnZ3JlZ2F0ZXMgZmlsdGVyZWQgb24gcmVtb3RlIGZvcmVpZ24ga2V5IHJlbGF0aW9ucy4KKworMC4zLjEKKyAgICAtIEZpeCBxdW90YXRpb24gZXNjYXBpbmcuCisgICAgLSBGaXggYm9vbGVhbiBjYXN0cyBvbiBQb3N0Z3Jlcy4KKworMC4yCisgICAgLSBGaXggcG9zdGdyZXMgaXNzdWUgd2l0aCBMSUtFIGNvbmRpdGlvbnMuCisKKzAuMQorICAgIC0gSW5pdGlhbCByZWxlYXNlLgorCisKK0xpY2Vuc2UKKz09PT09PT0KKworVGhlIE1JVCBMaWNlbnNlLgorCisuLiBfdGlja2V0IDExMzA1OiBodHRwczovL2NvZGUuZGphbmdvcHJvamVjdC5jb20vdGlja2V0LzExMzA1CisuLiBfZmlyc3QgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9oZW5yaXF1ZWJhc3Rvcy9kamFuZ28tYWdncmVnYXRlLWlmL2lzc3Vlcy8xCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvZGphbmdvLWFnZ3JlZ2F0ZS1pZi1tYXN0ZXIvYWdncmVnYXRlX2lmLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL2FnZ3JlZ2F0ZV9pZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYzNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL2FnZ3JlZ2F0ZV9pZi5weQpAQCAtMCwwICsxLDE2NCBAQAorIyBjb2Rpbmc6IHV0Zi04CisnJycKK0ltcGxlbWVudHMgY29uZGl0aW9uYWwgYWdncmVnYXRlcy4KKworVGhpcyBjb2RlIHdhcyBiYXNlZCBvbiB0aGUgd29yayBvZiBvdGhlcnMgZm91bmQgb24gdGhlIGludGVybmV0OgorCisxLiBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMTExNTE3MDgwNC9odHRwOi8vd3d3LnZvdGVydW5pdmVyc2UuY29tL01lbWJlcnMvamxhbnR6L2Jsb2cvY29uZGl0aW9uYWwtYWdncmVnYXRlcy1pbi1kamFuZ28KKzIuIGh0dHBzOi8vY29kZS5kamFuZ29wcm9qZWN0LmNvbS90aWNrZXQvMTEzMDUKKzMuIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vP2Zyb21ncm91cHM9IyF0b3BpYy9kamFuZ28tdXNlcnMvY2p6bG9UVXdtUzAKKzQuIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vP2Zyb21ncm91cHM9IyF0b3BpYy9kamFuZ28tdXNlcnMvdlZwck1wc0FuUG8KKycnJworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCitmcm9tIGRqYW5nby51dGlscyBpbXBvcnQgc2l4CitpbXBvcnQgZGphbmdvCitmcm9tIGRqYW5nby5kYi5tb2RlbHMuYWdncmVnYXRlcyBpbXBvcnQgQWdncmVnYXRlIGFzIERqYW5nb0FnZ3JlZ2F0ZQorZnJvbSBkamFuZ28uZGIubW9kZWxzLnNxbC5hZ2dyZWdhdGVzIGltcG9ydCBBZ2dyZWdhdGUgYXMgRGphbmdvU3FsQWdncmVnYXRlCisKKworVkVSU0lPTiA9IGRqYW5nby5WRVJTSU9OWzoyXQorCisKK2NsYXNzIFNxbEFnZ3JlZ2F0ZShEamFuZ29TcWxBZ2dyZWdhdGUpOgorICAgIGNvbmRpdGlvbmFsX3RlbXBsYXRlID0gJyUoZnVuY3Rpb24pcyhDQVNFIFdIRU4gJShjb25kaXRpb24pcyBUSEVOICUoZmllbGQpcyBFTFNFIG51bGwgRU5EKScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2wsIHNvdXJjZT1Ob25lLCBpc19zdW1tYXJ5PUZhbHNlLCBjb25kaXRpb249Tm9uZSwgKipleHRyYSk6CisgICAgICAgIHN1cGVyKFNxbEFnZ3JlZ2F0ZSwgc2VsZikuX19pbml0X18oY29sLCBzb3VyY2UsIGlzX3N1bW1hcnksICoqZXh0cmEpCisgICAgICAgIHNlbGYuY29uZGl0aW9uID0gY29uZGl0aW9uCisKKyAgICBkZWYgcmVsYWJlbF9hbGlhc2VzKHNlbGYsIGNoYW5nZV9tYXApOgorICAgICAgICBpZiBWRVJTSU9OIDwgKDEsIDcpOgorICAgICAgICAgICAgc3VwZXIoU3FsQWdncmVnYXRlLCBzZWxmKS5yZWxhYmVsX2FsaWFzZXMoY2hhbmdlX21hcCkKKyAgICAgICAgaWYgc2VsZi5oYXNfY29uZGl0aW9uOgorICAgICAgICAgICAgY29uZGl0aW9uX2NoYW5nZV9tYXAgPSBkaWN0KChrLCB2KSBmb3IgaywgdiBpbiBcCisgICAgICAgICAgICAgICAgY2hhbmdlX21hcC5pdGVtcygpIGlmIGsgaW4gc2VsZi5jb25kaXRpb24ucXVlcnkuYWxpYXNfbWFwCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmNvbmRpdGlvbi5xdWVyeS5jaGFuZ2VfYWxpYXNlcyhjb25kaXRpb25fY2hhbmdlX21hcCkKKworICAgIGRlZiByZWxhYmVsZWRfY2xvbmUoc2VsZiwgY2hhbmdlX21hcCk6CisgICAgICAgIHNlbGYucmVsYWJlbF9hbGlhc2VzKGNoYW5nZV9tYXApCisgICAgICAgIHJldHVybiBzdXBlcihTcWxBZ2dyZWdhdGUsIHNlbGYpLnJlbGFiZWxlZF9jbG9uZShjaGFuZ2VfbWFwKQorCisgICAgZGVmIGFzX3NxbChzZWxmLCBxbiwgY29ubmVjdGlvbik6CisgICAgICAgIGlmIHNlbGYuaGFzX2NvbmRpdGlvbjoKKyAgICAgICAgICAgIHNlbGYuc3FsX3RlbXBsYXRlID0gc2VsZi5jb25kaXRpb25hbF90ZW1wbGF0ZQorICAgICAgICAgICAgc2VsZi5leHRyYVsnY29uZGl0aW9uJ10gPSBzZWxmLl9jb25kaXRpb25fYXNfc3FsKHFuLCBjb25uZWN0aW9uKQorCisgICAgICAgIHJldHVybiBzdXBlcihTcWxBZ2dyZWdhdGUsIHNlbGYpLmFzX3NxbChxbiwgY29ubmVjdGlvbikKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBoYXNfY29uZGl0aW9uKHNlbGYpOgorICAgICAgICAjIFdhcm5pbmc6IGJvb2woUXVlcnlTZXQpIHdpbGwgaGl0IHRoZSBkYXRhYmFzZQorICAgICAgICByZXR1cm4gc2VsZi5jb25kaXRpb24gaXMgbm90IE5vbmUKKworICAgIGRlZiBfY29uZGl0aW9uX2FzX3NxbChzZWxmLCBxbiwgY29ubmVjdGlvbik6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gc3FsIGZvciBjb25kaXRpb24uCisgICAgICAgICcnJworICAgICAgICBkZWYgZXNjYXBlKHZhbHVlKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc3RyKGludCh2YWx1ZSkpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKToKKyAgICAgICAgICAgICAgICAjIEVzY2FwZSBwYXJhbXMgdXNlZCB3aXRoIExJS0UKKyAgICAgICAgICAgICAgICBpZiAnJScgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnJScsICclJScpCisgICAgICAgICAgICAgICAgIyBFc2NhcGUgc2luZ2xlIHF1b3RlcworICAgICAgICAgICAgICAgIGlmICInIiBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCInIiwgIicnIikKKyAgICAgICAgICAgICAgICAjIEFkZCBzaW5nbGUgcXVvdGUgdG8gdGV4dCB2YWx1ZXMKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICInIiArIHZhbHVlICsgIiciCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBzcWwsIHBhcmFtID0gc2VsZi5jb25kaXRpb24ucXVlcnkud2hlcmUuYXNfc3FsKHFuLCBjb25uZWN0aW9uKQorICAgICAgICBwYXJhbSA9IG1hcChlc2NhcGUsIHBhcmFtKQorCisgICAgICAgIHJldHVybiBzcWwgJSB0dXBsZShwYXJhbSkKKworCitjbGFzcyBTcWxTdW0oU3FsQWdncmVnYXRlKToKKyAgICBzcWxfZnVuY3Rpb24gPSAnU1VNJworCisKK2NsYXNzIFNxbENvdW50KFNxbEFnZ3JlZ2F0ZSk6CisgICAgaXNfb3JkaW5hbCA9IFRydWUKKyAgICBzcWxfZnVuY3Rpb24gPSAnQ09VTlQnCisgICAgc3FsX3RlbXBsYXRlID0gJyUoZnVuY3Rpb24pcyglKGRpc3RpbmN0KXMlKGZpZWxkKXMpJworICAgIGNvbmRpdGlvbmFsX3RlbXBsYXRlID0gJyUoZnVuY3Rpb24pcyglKGRpc3RpbmN0KXNDQVNFIFdIRU4gJShjb25kaXRpb24pcyBUSEVOICUoZmllbGQpcyBFTFNFIG51bGwgRU5EKScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2wsIGRpc3RpbmN0PUZhbHNlLCAqKmV4dHJhKToKKyAgICAgICAgc3VwZXIoU3FsQ291bnQsIHNlbGYpLl9faW5pdF9fKGNvbCwgZGlzdGluY3Q9ZGlzdGluY3QgYW5kICdESVNUSU5DVCAnIG9yICcnLCAqKmV4dHJhKQorCisKK2NsYXNzIFNxbEF2ZyhTcWxBZ2dyZWdhdGUpOgorICAgIGlzX2NvbXB1dGVkID0gVHJ1ZQorICAgIHNxbF9mdW5jdGlvbiA9ICdBVkcnCisKKworY2xhc3MgU3FsTWF4KFNxbEFnZ3JlZ2F0ZSk6CisgICAgc3FsX2Z1bmN0aW9uID0gJ01BWCcKKworCitjbGFzcyBTcWxNaW4oU3FsQWdncmVnYXRlKToKKyAgICBzcWxfZnVuY3Rpb24gPSAnTUlOJworCisKK2NsYXNzIEFnZ3JlZ2F0ZShEamFuZ29BZ2dyZWdhdGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb29rdXAsIG9ubHk9Tm9uZSwgKipleHRyYSk6CisgICAgICAgIHN1cGVyKEFnZ3JlZ2F0ZSwgc2VsZikuX19pbml0X18obG9va3VwLCAqKmV4dHJhKQorICAgICAgICBzZWxmLm9ubHkgPSBvbmx5CisgICAgICAgIHNlbGYuY29uZGl0aW9uID0gTm9uZQorCisgICAgZGVmIF9nZXRfZmllbGRzX2Zyb21fUShzZWxmLCBxKToKKyAgICAgICAgZmllbGRzID0gW10KKyAgICAgICAgZm9yIGNoaWxkIGluIHEuY2hpbGRyZW46CisgICAgICAgICAgICBpZiBoYXNhdHRyKGNoaWxkLCAnY2hpbGRyZW4nKToKKyAgICAgICAgICAgICAgICBmaWVsZHMuZXh0ZW5kKHNlbGYuX2dldF9maWVsZHNfZnJvbV9RKGNoaWxkKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmllbGRzLmFwcGVuZChjaGlsZCkKKyAgICAgICAgcmV0dXJuIGZpZWxkcworCisgICAgZGVmIGFkZF90b19xdWVyeShzZWxmLCBxdWVyeSwgYWxpYXMsIGNvbCwgc291cmNlLCBpc19zdW1tYXJ5KToKKyAgICAgICAgaWYgc2VsZi5vbmx5OgorICAgICAgICAgICAgc2VsZi5jb25kaXRpb24gPSBxdWVyeS5tb2RlbC5fZGVmYXVsdF9tYW5hZ2VyLmZpbHRlcihzZWxmLm9ubHkpCisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fZ2V0X2ZpZWxkc19mcm9tX1Eoc2VsZi5vbmx5KToKKyAgICAgICAgICAgICAgICBmaWVsZF9saXN0ID0gY2hpbGRbMF0uc3BsaXQoJ19fJykKKyAgICAgICAgICAgICAgICAjIFBvcCBvZmYgdGhlIGxhc3QgZmllbGQgaWYgaXQncyBhIHF1ZXJ5IHRlcm0gKCdndGUnLCAnY29udGFpbnMnLCAnaXNudWxsJywgZXRjLikKKyAgICAgICAgICAgICAgICBpZiBmaWVsZF9saXN0Wy0xXSBpbiBxdWVyeS5xdWVyeV90ZXJtczoKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wb3AoKQorICAgICAgICAgICAgICAgICMgc2V0dXBfam9pbnMgaGF2ZSBkaWZmZXJlbnQgcmV0dXJucyBpbiBEamFuZ28gMS41IGFuZCAxLjYsIGJ1dCB0aGUgb3JkZXIgb2Ygd2hhdCB3ZSBuZWVkIHJlbWFpbnMuCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcXVlcnkuc2V0dXBfam9pbnMoZmllbGRfbGlzdCwgcXVlcnkubW9kZWwuX21ldGEsIHF1ZXJ5LmdldF9pbml0aWFsX2FsaWFzKCksIE5vbmUpCisgICAgICAgICAgICAgICAgam9pbl9saXN0ID0gcmVzdWx0WzNdCisKKyAgICAgICAgICAgICAgICBmbmFtZSA9ICdwcm9tb3RlX2FsaWFzX2NoYWluJyBpZiBWRVJTSU9OIDwgKDEsIDUpIGVsc2UgJ3Byb21vdGVfam9pbnMnCisgICAgICAgICAgICAgICAgYXJncyA9IChqb2luX2xpc3QsIFRydWUpIGlmIFZFUlNJT04gPCAoMSwgNykgZWxzZSAoam9pbl9saXN0LCkKKworICAgICAgICAgICAgICAgIHByb21vdGUgPSBnZXRhdHRyKHF1ZXJ5LCBmbmFtZSkKKyAgICAgICAgICAgICAgICBwcm9tb3RlKCphcmdzKQorCisgICAgICAgIGFnZ3JlZ2F0ZSA9IHNlbGYuc3FsX2tsYXNzKGNvbCwgc291cmNlPXNvdXJjZSwgaXNfc3VtbWFyeT1pc19zdW1tYXJ5LCBjb25kaXRpb249c2VsZi5jb25kaXRpb24sICoqc2VsZi5leHRyYSkKKyAgICAgICAgcXVlcnkuYWdncmVnYXRlc1thbGlhc10gPSBhZ2dyZWdhdGUKKworCitjbGFzcyBTdW0oQWdncmVnYXRlKToKKyAgICBuYW1lID0gJ1N1bScKKyAgICBzcWxfa2xhc3MgPSBTcWxTdW0KKworCitjbGFzcyBDb3VudChBZ2dyZWdhdGUpOgorICAgIG5hbWUgPSAnQ291bnQnCisgICAgc3FsX2tsYXNzID0gU3FsQ291bnQKKworCitjbGFzcyBBdmcoQWdncmVnYXRlKToKKyAgICBuYW1lID0gJ0F2ZycKKyAgICBzcWxfa2xhc3MgPSBTcWxBdmcKKworCitjbGFzcyBNYXgoQWdncmVnYXRlKToKKyAgICBuYW1lID0gJ01heCcKKyAgICBzcWxfa2xhc3MgPSBTcWxNYXgKKworCitjbGFzcyBNaW4oQWdncmVnYXRlKToKKyAgICBuYW1lID0gJ01pbicKKyAgICBzcWxfa2xhc3MgPSBTcWxNaW4KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9ydW50ZXN0cy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9ydW50ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZTU1ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3J1bnRlc3RzLnB5CkBAIC0wLDAgKzEsNDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCisKK2RlZiBwYXJzZV9hcmdzKCk6CisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXMnLCAnLS1zZXR0aW5ncycsIGhlbHA9J0RlZmluZSBzZXR0aW5ncy4nKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdCcsICctLXVuaXR0ZXN0JywgaGVscD0nRGVmaW5lIHdoaWNoIHRlc3QgdG8gcnVuLiBEZWZhdWx0IGFsbC4nKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBub3Qgb3B0aW9ucy5zZXR0aW5nczoKKyAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgaWYgbm90IG9wdGlvbnMudW5pdHRlc3Q6CisgICAgICAgIG9wdGlvbnMudW5pdHRlc3QgPSBbJ2FnZ3JlZ2F0aW9uJ10KKworICAgIHJldHVybiBvcHRpb25zCisKKworZGVmIGdldF9ydW5uZXIoc2V0dGluZ3NfbW9kdWxlKToKKyAgICAnJycKKyAgICBBc2tzIERqYW5nbyBmb3IgdGhlIFRlc3RSdW5uZXIgZGVmaW5lZCBpbiBzZXR0aW5ncyBvciB0aGUgZGVmYXVsdCBvbmUuCisgICAgJycnCisgICAgb3MuZW52aXJvblsnREpBTkdPX1NFVFRJTkdTX01PRFVMRSddID0gc2V0dGluZ3NfbW9kdWxlCisKKyAgICBpbXBvcnQgZGphbmdvCisgICAgZnJvbSBkamFuZ28udGVzdC51dGlscyBpbXBvcnQgZ2V0X3J1bm5lcgorICAgIGZyb20gZGphbmdvLmNvbmYgaW1wb3J0IHNldHRpbmdzCisKKyAgICBpZiBoYXNhdHRyKGRqYW5nbywgJ3NldHVwJyk6CisgICAgICAgIGRqYW5nby5zZXR1cCgpCisKKyAgICByZXR1cm4gZ2V0X3J1bm5lcihzZXR0aW5ncykKKworCitkZWYgcnVudGVzdHMoKToKKyAgICBvcHRpb25zID0gcGFyc2VfYXJncygpCisgICAgVGVzdFJ1bm5lciA9IGdldF9ydW5uZXIob3B0aW9ucy5zZXR0aW5ncykKKyAgICBydW5uZXIgPSBUZXN0UnVubmVyKHZlcmJvc2l0eT0xLCBpbnRlcmFjdGl2ZT1UcnVlLCBmYWlsZmFzdD1GYWxzZSkKKyAgICBzeXMuZXhpdChydW5uZXIucnVuX3Rlc3RzKFtdKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bnRlc3RzKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9zZXR1cC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQzZGIxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3NldHVwLnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMgY29kaW5nOiB1dGYtOAorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoraW1wb3J0IG9zCisKKworc2V0dXAobmFtZT0nZGphbmdvLWFnZ3JlZ2F0ZS1pZicsCisgICAgICB2ZXJzaW9uPScwLjUnLAorICAgICAgZGVzY3JpcHRpb249J0NvbmRpdGlvbmFsIGFnZ3JlZ2F0ZXMgZm9yIERqYW5nbywganVzdCBsaWtlIHRoZSBmYW1vdXMgU3VtSWYgaW4gRXhjZWwuJywKKyAgICAgIGxvbmdfZGVzY3JpcHRpb249b3Blbihvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgIlJFQURNRS5yc3QiKSkucmVhZCgpLAorICAgICAgYXV0aG9yPSJIZW5yaXF1ZSBCYXN0b3MiLCBhdXRob3JfZW1haWw9ImhlbnJpcXVlQGJhc3Rvcy5uZXQiLAorICAgICAgbGljZW5zZT0iTUlUIiwKKyAgICAgIHB5X21vZHVsZXM9WydhZ2dyZWdhdGVfaWYnXSwKKyAgICAgIGluc3RhbGxfcmVxdWlyZXM9WworICAgICAgICAgICdzaXg+PTEuNi4xJywKKyAgICAgIF0sCisgICAgICB6aXBfc2FmZT1GYWxzZSwKKyAgICAgIHBsYXRmb3Jtcz0nYW55JywKKyAgICAgIGluY2x1ZGVfcGFja2FnZV9kYXRhPVRydWUsCisgICAgICBjbGFzc2lmaWVycz1bCisgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAorICAgICAgICAgICdGcmFtZXdvcmsgOjogRGphbmdvJywKKyAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCisgICAgICAgICAgJ0xpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlJywKKyAgICAgICAgICAnTmF0dXJhbCBMYW5ndWFnZSA6OiBFbmdsaXNoJywKKyAgICAgICAgICAnT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudCcsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcnLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycsCisgICAgICAgICAgJ1RvcGljIDo6IERhdGFiYXNlJywKKyAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKKyAgICAgIF0sCisgICAgICB1cmw9J2h0dHA6Ly9naXRodWIuY29tL2hlbnJpcXVlYmFzdG9zL2RqYW5nby1hZ2dyZWdhdGUtaWYvJywKKykKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci90b3guaW5pIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL2RqYW5nby1hZ2dyZWdhdGUtaWYtbWFzdGVyL3RveC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiZWIxNAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi9kamFuZ28tYWdncmVnYXRlLWlmLW1hc3Rlci90b3guaW5pCkBAIC0wLDAgKzEsMTk4IEBACitbdG94XQorZW52bGlzdCA9CisgICAgcHkyNy1kamFuZ28xLjQtc3FsaXRlLAorICAgIHB5MjctZGphbmdvMS40LXBvc3RncmVzLAorICAgIHB5MjctZGphbmdvMS40LW15c3FsLAorCisgICAgcHkyNy1kamFuZ28xLjUtc3FsaXRlLAorICAgIHB5MjctZGphbmdvMS41LXBvc3RncmVzLAorICAgIHB5MjctZGphbmdvMS41LW15c3FsLAorCisgICAgcHkyNy1kamFuZ28xLjYtc3FsaXRlLAorICAgIHB5MjctZGphbmdvMS42LXBvc3RncmVzLAorICAgIHB5MjctZGphbmdvMS42LW15c3FsLAorCisgICAgcHkyNy1kamFuZ28xLjctc3FsaXRlLAorICAgIHB5MjctZGphbmdvMS43LXBvc3RncmVzLAorICAgIHB5MjctZGphbmdvMS43LW15c3FsLAorCisgICAgcHkzNC1kamFuZ28xLjYtc3FsaXRlLAorICAgIHB5MzQtZGphbmdvMS42LXBvc3RncmVzLAorICAgICNweTM0LWRqYW5nbzEuNi1teXNxbAorCisgICAgcHkzNC1kamFuZ28xLjctc3FsaXRlLAorICAgIHB5MzQtZGphbmdvMS43LXBvc3RncmVzLAorICAgICNweTM0LWRqYW5nbzEuNy1teXNxbAorCitbdGVzdGVudl0KK3doaXRlbGlzdF9leHRlcm5hbHM9CisgICAgbXlzcWwKKyAgICBwc3FsCisKKyMgUHl0aG9uIDIuNworIyBEamFuZ28gMS40CitbdGVzdGVudjpweTI3LWRqYW5nbzEuNC1zcWxpdGVdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNAorY29tbWFuZHMgPSBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3NxbGl0ZQorCitbdGVzdGVudjpweTI3LWRqYW5nbzEuNC1wb3N0Z3Jlc10KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS40CisgICAgcHN5Y29wZzIKK2NvbW1hbmRzID0KKyAgICBwc3FsIC1jICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworICAgIHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3RfcG9zdGdyZXMKKyAgICBwc3FsIC1jICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKworW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjQtbXlzcWxdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNAorICAgIG15c3FsLXB5dGhvbgorY29tbWFuZHMgPQorICAgIG15c3FsIC1lICdjcmVhdGUgZGF0YWJhc2UgYWdncmVnYXRpb247JworICAgIHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3RfbXlzcWwKKyAgICBteXNxbCAtZSAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisKKyMgRGphbmdvIDEuNQorW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjUtc3FsaXRlXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjUKK2NvbW1hbmRzID0gcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9zcWxpdGUKKworW3Rlc3RlbnY6cHkyNy1kamFuZ28xLjUtcG9zdGdyZXNdCitiYXNlcHl0aG9uID0gcHl0aG9uMi43CitkZXBzID0KKyAgICBkamFuZ289PTEuNQorICAgIHBzeWNvcGcyCitjb21tYW5kcyA9CisgICAgcHNxbCAtYyAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3Bvc3RncmVzCisgICAgcHNxbCAtYyAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS41LW15c3FsXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjUKKyAgICBteXNxbC1weXRob24KK2NvbW1hbmRzID0KKyAgICBteXNxbCAtZSAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X215c3FsCisgICAgbXlzcWwgLWUgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JworCisjIERqYW5nbyAxLjYKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS42LXNxbGl0ZV0KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS42Citjb21tYW5kcyA9IHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3Rfc3FsaXRlCisKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS42LXBvc3RncmVzXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjYKKyAgICBwc3ljb3BnMgorY29tbWFuZHMgPQorICAgIHBzcWwgLWMgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9wb3N0Z3JlcworICAgIHBzcWwgLWMgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworCitbdGVzdGVudjpweTI3LWRqYW5nbzEuNi1teXNxbF0KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS42CisgICAgbXlzcWwtcHl0aG9uCitjb21tYW5kcyA9CisgICAgbXlzcWwgLWUgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9teXNxbAorICAgIG15c3FsIC1lICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKworCisjIFB5dGhvbiAyLjcgYW5kIERqYW5nbyAxLjcKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS43LXNxbGl0ZV0KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS43Citjb21tYW5kcyA9IHB5dGhvbiBydW50ZXN0cy5weSAtLXNldHRpbmdzIHRlc3RzLnRlc3Rfc3FsaXRlCisKK1t0ZXN0ZW52OnB5MjctZGphbmdvMS43LXBvc3RncmVzXQorYmFzZXB5dGhvbiA9IHB5dGhvbjIuNworZGVwcyA9CisgICAgZGphbmdvPT0xLjcKKyAgICBwc3ljb3BnMgorY29tbWFuZHMgPQorICAgIHBzcWwgLWMgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9wb3N0Z3JlcworICAgIHBzcWwgLWMgJ2Ryb3AgZGF0YWJhc2UgYWdncmVnYXRpb247JyBwb3N0Z3JlcworCitbdGVzdGVudjpweTI3LWRqYW5nbzEuNy1teXNxbF0KK2Jhc2VweXRob24gPSBweXRob24yLjcKK2RlcHMgPQorICAgIGRqYW5nbz09MS43CisgICAgbXlzcWwtcHl0aG9uCitjb21tYW5kcyA9CisgICAgbXlzcWwgLWUgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9teXNxbAorICAgIG15c3FsIC1lICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKworCisjIFB5dGhvbiAzLjQKKyMgRGphbmdvIDEuNgorW3Rlc3RlbnY6cHkzNC1kamFuZ28xLjYtc3FsaXRlXQorYmFzZXB5dGhvbiA9IHB5dGhvbjMuNAorZGVwcyA9CisgICAgZGphbmdvPT0xLjYKK2NvbW1hbmRzID0gcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9zcWxpdGUKKworW3Rlc3RlbnY6cHkzNC1kamFuZ28xLjYtcG9zdGdyZXNdCitiYXNlcHl0aG9uID0gcHl0aG9uMy40CitkZXBzID0KKyAgICBkamFuZ289PTEuNgorICAgIHBzeWNvcGcyCitjb21tYW5kcyA9CisgICAgcHNxbCAtYyAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3Bvc3RncmVzCisgICAgcHNxbCAtYyAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisKK1t0ZXN0ZW52OnB5MzQtZGphbmdvMS42LW15c3FsXQorYmFzZXB5dGhvbiA9IHB5dGhvbjMuNAorZGVwcyA9CisgICAgZGphbmdvPT0xLjYKKyAgICBteXNxbC1weXRob24zCitjb21tYW5kcyA9CisgICAgbXlzcWwgLWUgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9teXNxbAorICAgIG15c3FsIC1lICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKKworCisjIFB5dGhvbiAzLjQKKyMgRGphbmdvIDEuNworW3Rlc3RlbnY6cHkzNC1kamFuZ28xLjctc3FsaXRlXQorYmFzZXB5dGhvbiA9IHB5dGhvbjMuNAorZGVwcyA9CisgICAgZGphbmdvPT0xLjcKK2NvbW1hbmRzID0gcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9zcWxpdGUKKworW3Rlc3RlbnY6cHkzNC1kamFuZ28xLjctcG9zdGdyZXNdCitiYXNlcHl0aG9uID0gcHl0aG9uMy40CitkZXBzID0KKyAgICBkamFuZ289PTEuNworICAgIHBzeWNvcGcyCitjb21tYW5kcyA9CisgICAgcHNxbCAtYyAnY3JlYXRlIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycgcG9zdGdyZXMKKyAgICBweXRob24gcnVudGVzdHMucHkgLS1zZXR0aW5ncyB0ZXN0cy50ZXN0X3Bvc3RncmVzCisgICAgcHNxbCAtYyAnZHJvcCBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnIHBvc3RncmVzCisKK1t0ZXN0ZW52OnB5MzQtZGphbmdvMS43LW15c3FsXQorYmFzZXB5dGhvbiA9IHB5dGhvbjMuNAorZGVwcyA9CisgICAgZGphbmdvPT0xLjcKKyAgICBteXNxbC1weXRob24zCitjb21tYW5kcyA9CisgICAgbXlzcWwgLWUgJ2NyZWF0ZSBkYXRhYmFzZSBhZ2dyZWdhdGlvbjsnCisgICAgcHl0aG9uIHJ1bnRlc3RzLnB5IC0tc2V0dGluZ3MgdGVzdHMudGVzdF9teXNxbAorICAgIG15c3FsIC1lICdkcm9wIGRhdGFiYXNlIGFnZ3JlZ2F0aW9uOycKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvUkVBRE1FIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmYTU2NwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvUkVBRE1FCkBAIC0wLDAgKzEsNDEgQEAKKworVG9hc3RlciBUZXN0aW5nIEZyYW1ld29yaworWW9jdG8gUHJvamVjdAorCisKK1JhdGlvbmFsZQorLS0tLS0tLS0tLS0tCitBcyBUb2FzdGVyIGNvbnRyaWJ1dGlvbnMgZ3JvdyB3aXRoIHRoZSBudW1iZXIgb2YgcGVvcGxlIHRoYXQgY29udHJpYnV0ZSBjb2RlLCB2ZXJpZnlpbmcgZWFjaCBwYXRjaCBwcmlvciB0byBzdWJtaXR0aW5nIHVwc3RyZWFtIGJlY29tZXMgYSBoYXJkLXRvLXNjYWxlIHByb2JsZW0gZm9yIGh1bWFucy4gV2UgZGV2aXNlZCB0aGlzIHN5c3RlbSBpbiBvcmRlciB0byBydW4gcGF0Y2gtbGV2ZWwgdmFsaWRhdGlvbiwgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBjb21tb24gcHJvYmxlbXMgZnJvbSBzdWJtaXR0ZWQgcGF0Y2hlcywgaW4gYW4gYXV0b21hdGVkIGZhc2hpb24uCisKK1RoZSBUb2FzdGVyIFRlc3RpbmcgRnJhbWV3b3JrIGlzIGEgc2V0IG9mIFB5dGhvbiBzY3JpcHRzIHRoYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaWJsZSB3YXkgdG8gd3JpdGUgc21va2UgYW5kIHJlZ3Jlc3Npb24gdGVzdHMgdGhhdCB3aWxsIGJlIHJ1biBvbiBlYWNoIHBhdGNoIHNldCBzZW50IGZvciByZXZpZXcgb24gdGhlIHRvYXN0ZXIgbWFpbGluZyBsaXN0LgorCisKK1VzYWdlCistLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB0aHJlZSBtYWluIGV4ZWN1dGFibGUgc2NyaXB0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAgICAqICAgIHJ1bm5lci5weSAgaXMgZGVzaWduZWQgdG8gYmUgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gSXQgcmVxdWlyZXMsIGFzIG1hbmRhdG9yeSBwYXJhbWV0ZXIsIGEgYnJhbmNoIG5hbWUgb24gcG9reS1jb250cmliLCBicmFuY2ggd2hpY2ggY29udGFpbnMgdGhlIHBhdGNoZXMgdG8gYmUgdGVzdGVkLiBUaGUgcHJvZ3JhbSB3aWxsIGF1dG8tZGlzY292ZXIgdGhlIGF2YWlsYWJsZSB0ZXN0cyByZXNpZGluZyBpbiB0aGlzIGRpcmVjdG9yeSBieSBsb29raW5nIGZvciB1bml0dGVzdCBjbGFzc2VzLCBhbmQgd2lsbCBydW4gdGhlIHRlc3RzIG9uIHRoZSBicmFuY2ggZHVtcGluZyB0aGUgb3V0cHV0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuIE9wdGlvbmFsbHksIGl0IGNhbiB0YWtlIHBhcmFtZXRlcnMgaW5oaWJpdGluZyB0aGUgYnJhbmNoIGNoZWNrb3V0LCBvciBzcGVjaWZ5aW5nIGEgc2luZ2xlIHRlc3QgdG8gYmUgcnVuLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICAgICogICAgbGF1bmNoZXIucHkgIGlzIGEgZGVzaWduZWQgdG8gYmUgcnVuIGZyb20gYSBjcm9udGFiIG9yIHNpbWlsYXIgc2NoZWR1bGluZyBtZWNoYW5pc20uIEl0IGxvb2tzIHVwIGEgYmFja2xvZyBmaWxlIGNvbnRhaW5pbmcgYnJhbmNoZXMtdG8tdGVzdCAobmFtZWQgdGFza3MgaW4gdGhlIHNvdXJjZSBjb2RlKSwgc2VsZWN0IHRoZSBmaXJzdCBvbmUgaW4gRklGTyBtYW5uZXIsIGFuZCBsYXVuY2ggcnVubmVyLnB5IG9uIGl0LiBJdCB3aWxsIGF3YWl0IGZvciBjb21wbGV0aW9uLCBhbmQgZW1haWwgdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3IgZHVtcHMgZnJvbSB0aGUgcnVubmVyLnB5IGV4ZWN1dGlvbgorICAgICogICAgcmVjdi5weSAgaXMgYW4gZW1haWwgcmVjZWl2ZXIsIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBhcyBhIHBpcGUgZnJvbSBhIC5mb3J3YXJkIGZpbGUuIEl0IGlzIHVzZWQgdG8gbW9uaXRvciBhIG1haWxpbmcgbGlzdCwgZm9yIGV4YW1wbGUsIGFuZCBhZGQgdGFza3MgdG8gdGhlIGJhY2tsb2cgYmFzZWQgb24gcmV2aWV3IHJlcXVlc3RzIGNvbWluZyBvbiB0aGUgbWFpbGluZyBsaXN0LgorCisKK0luc3RhbGxhdGlvbgorLS0tLS0tLS0tLS0tCitBcyBwcmVyZXF1aXNpdGUsIHdlIGV4cGVjdCBhIGZ1bmN0aW9uaW5nIGVtYWlsIHN5c3RlbSBvbiBhIG1hY2hpbmUgd2l0aCBQeXRob24yLgorCitUaGUgYnJvYWQgc3RlcHMgdG8gaW5zdGFsbGF0aW9uCisqIHNldCB1cCB0aGUgLmZvcndhcmQgb24gdGhlIHJlY2VpdmluZyBlbWFpbCBhY2NvdW50IHRvIHBpcGUgdG8gdGhlIHJlY3YucHkgZmlsZQorKiBlZGl0IGNvbmZpZy5weSBhbmQgc2V0dGluZ3MuanNvbiB0byBhbHRlciBmb3IgbG9jYWwgaW5zdGFsbGF0aW9uIHNldHRpbmdzCisqIG9uIGVtYWlsIHJlY2VpdmUsIHZlcmlmeSBiYWNrbG9nLnR4dCB0byBzZWUgdGhhdCB0aGUgdGFza3MgYXJlIHJlY2VpdmVkIGFuZCBtYXJrZWQgZm9yIHByb2Nlc3NpbmcKKyogZXhlY3V0ZSBsYXVuY2hlci5weSBpbiBjb21tYW5kIGxpbmUgdG8gdmVyaWZ5IHRoYXQgYSB0ZXN0IG9jY3VycyB3aXRoIG5vIHByb2JsZW1zLCBhbmQgdGhhdCB0aGUgb3V0Z29pbmcgZW1haWwgaXMgZGVsaXZlcmVkCisqIGFkZCBsYXVuY2hlci5weQorCisKKworQ29udHJpYnV0ZQorLS0tLS0tLS0tLS0tCitXaGF0IHdlIG5lZWQgYXJlIHRlc3RzLiBBZGQgeW91ciBvd24gdGVzdHMgdG8gZWl0aGVyIHRlc3RzLnB5IGZpbGUsIG9yIHRvIGEgbmV3IGZpbGUuCitVc2UgImNvbmZpZy5sb2dnZXIiIHRvIHdyaXRlIGxvZ3MgdGhhdCB3aWxsIG1ha2UgaXQgdG8gZW1haWwuCisKK0NvbW1vbmx5IHVzZWQgY29kZSBzaG91bGQgYmUgZ29pbmcgdG8gc2hlbGx1dGlscywgYW5kIGNvbmZpZ3VyYXRpb24gdG8gY29uZmlnLnB5LgorCitDb250cmlidXRlIGNvZGUgYnkgZW1haWxpbmcgcGF0Y2hlcyB0byB0aGUgbGlzdDogdG9hc3RlckB5b2N0b3Byb2plY3Qub3JnIChtZW1iZXJzaGlwIHJlcXVpcmVkKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9UT0RPIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL1RPRE8KQEAgLTAsMCArMSw5IEBACitXZSBuZWVkIHRvIGltcGxlbWVudCB0ZXN0czoKKworYXV0b21hdGVkIGxpbmsgY2hlY2tlcjsgY3VycmVudGx5CiskIGxpbmtjaGVja2VyIC10IDEwMDAgLUYgY3N2IGh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC8KKworaW50ZWdyYXRlIHRoZSB3M2MtdmFsaWRhdGlvbiBzZXJ2aWNlOyBjdXJyZW50bHkKKyQgcHl0aG9uIHVybGNoZWNrLnB5CisKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9jb25maWcucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ0NWYzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9jb25maWcucHkKQEAgLTAsMCArMSw5OCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFsZXhhbmRydSBEYW1pYW4gZm9yIEludGVsIENvcnAuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisjIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24vc2luZ2xlIG1vZHVsZSBmb3IgdHRzCisjIGV2ZXJ5dGhpbmcgdGhhdCB3b3VsZCBiZSBhIGdsb2JhbCB2YXJpYWJsZSBnb2VzIGhlcmUKKworaW1wb3J0IG9zLCBzeXMsIGxvZ2dpbmcKK2ltcG9ydCBzb2NrZXQKKworTE9HRElSID0gImxvZyIKK1NFVFRJTkdTX0ZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgInNldHRpbmdzLmpzb24iKQorVEVTVF9ESVJfTkFNRSA9ICJ0dHNfdGVzdGRpciIKKworREVCVUcgPSBUcnVlCisKK09XTl9QSUQgPSBvcy5nZXRwaWQoKQorCitXM0NfVkFMSURBVE9SID0gImh0dHA6Ly9pY2FydXMubG9jYWwvdzNjLXZhbGlkYXRvci9jaGVjaz9kb2N0eXBlPUhUTUw1JnVyaT0iCisKK1RPQVNURVJfUE9SVCA9IDU2Nzg5CisKK1RFU1RESVIgPSBOb25lCisKKyN3ZSBwYXJzZSB0aGUgdzNjIFVSTCB0byBrbm93IHdoZXJlIHRvIGNvbm5lY3QKKworaW1wb3J0IHVybHBhcnNlCisKK2RlZiBnZXRfcHVibGljX2lwKCk6CisgICAgdGVtcF9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKKyAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UoImh0dHA6Ly9pY2FydXMubG9jYWwvdzNjLXZhbGlkYXRvci9jaGVjaz9kb2N0eXBlPUhUTUw1JnVyaT0iKQorICAgIHRlbXBfc29ja2V0LmNvbm5lY3QoKHBhcnNlZF91cmwubmV0bG9jLCA4MCBpZiBwYXJzZWRfdXJsLnBvcnQgaXMgTm9uZSBlbHNlIHBhcnNlZF91cmwucG9ydCkpCisgICAgcHVibGljX2lwID0gdGVtcF9zb2NrZXQuZ2V0c29ja25hbWUoKVswXQorICAgIHRlbXBfc29ja2V0LmNsb3NlKCkKKyAgICByZXR1cm4gcHVibGljX2lwCisKK1RPQVNURVJfQkFTRVVSTCA9ICJodHRwOi8vJXM6JWQvIiAlIChnZXRfcHVibGljX2lwKCksIFRPQVNURVJfUE9SVCkKKworCitPV05fRU1BSUxfQUREUkVTUyA9ICJUb2FzdGVyIFRlc3RpbmcgRnJhbWV3b3JrIDxhbGV4YW5kcnUuZGFtaWFuQGludGVsLmNvbT4iCitSRVBPUlRfRU1BSUxfQUREUkVTUyA9ICJhbGV4YW5kcnUuZGFtaWFuQGludGVsLmNvbSIKKworIyBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgYmFzaWMgbG9nZ2luZyBpbmZyYXN0cnVjdHVyZQorCisjcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorIyB3ZSBkaXNhYmxlIHRoZSBpbnZhbGlkIG5hbWUgYmVjYXVzZSB0aGUgbW9kdWxlLWxldmVsICJsb2dnZXIiIGlzIHVzZWQgdGhyb3Vnb3V0IGJpdGJha2UKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ0b2FzdGVydGVzdCIpCitfX2NvbnNvbGVfXyA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorX19jb25zb2xlX18uc2V0Rm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKCIlKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIpKQorbG9nZ2VyLmFkZEhhbmRsZXIoX19jb25zb2xlX18pCitsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKKworCisjIHNpbmdsZXRvbiBmaWxlIG5hbWVzCitMT0NLRklMRSA9ICIvdG1wL3R0Zi5sb2NrIgorQkFDS0xPR0ZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImJhY2tsb2cudHh0IikKKworIyB0YXNrIHN0YXRlcworZGVmIGVudW0oKnNlcXVlbnRpYWwsICoqbmFtZWQpOgorICAgIGVudW1zID0gZGljdCh6aXAoc2VxdWVudGlhbCwgcmFuZ2UobGVuKHNlcXVlbnRpYWwpKSksICoqbmFtZWQpCisgICAgcmV2ZXJzZSA9IGRpY3QoKHZhbHVlLCBrZXkpIGZvciBrZXksIHZhbHVlIGluIGVudW1zLml0ZXJpdGVtcygpKQorICAgIGVudW1zWydyZXZlcnNlX21hcHBpbmcnXSA9IHJldmVyc2UKKyAgICByZXR1cm4gdHlwZSgnRW51bScsICgpLCBlbnVtcykKKworCitjbGFzcyBUQVNLUyhvYmplY3QpOgorICAgICNweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcworICAgIFBFTkRJTkcgPSAiUEVORElORyIKKyAgICBJTlBST0dSRVNTID0gIklOUFJPR1JFU1MiCisgICAgRE9ORSA9ICJET05FIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBuZXh0X3Rhc2sodGFzayk6CisgICAgICAgIGlmIHRhc2sgPT0gVEFTS1MuUEVORElORzoKKyAgICAgICAgICAgIHJldHVybiBUQVNLUy5JTlBST0dSRVNTCisgICAgICAgIGlmIHRhc2sgPT0gVEFTS1MuSU5QUk9HUkVTUzoKKyAgICAgICAgICAgIHJldHVybiBUQVNLUy5ET05FCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiSW52YWxpZCBuZXh0IHRhc2sgc3RhdGUgZm9yICVzIiAlIHRhc2spCisKKyMgVFRTIHNwZWNpZmljCitDT05UUklCX1JFUE8gPSAiZ2l0QGdpdC55b2N0b3Byb2plY3Qub3JnOnBva3ktY29udHJpYiIKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9sYXVuY2hlci5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvbGF1bmNoZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU3OTRjMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvbGF1bmNoZXIucHkKQEAgLTAsMCArMSwxMDEgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAxNSBBbGV4YW5kcnUgRGFtaWFuIGZvciBJbnRlbCBDb3JwLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworIyBQcm9ncmFtIHRvIHJ1biB0aGUgbmV4dCB0YXNrIGxpc3RlZCBmcm9tIHRoZSBiYWNrbG9nLnR4dDsgZGVzaWduZWQgdG8gYmUKKyMgcnVuIGZyb20gY3JvbnRhYi4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN5cywgb3MsIGNvbmZpZywgc2hlbGx1dGlscworZnJvbSBzaGVsbHV0aWxzIGltcG9ydCBTaGVsbENtZEV4Y2VwdGlvbgorCisjIEltcG9ydCBzbXRwbGliIGZvciB0aGUgYWN0dWFsIHNlbmRpbmcgZnVuY3Rpb24KK2ltcG9ydCBzbXRwbGliCisKKyMgSW1wb3J0IHRoZSBlbWFpbCBtb2R1bGVzIHdlJ2xsIG5lZWQKK2Zyb20gZW1haWwubWltZS50ZXh0IGltcG9ydCBNSU1FVGV4dAorCitkZWYgX3Rha2VfbG9ja2ZpbGUoKToKKyAgICByZXR1cm4gc2hlbGx1dGlscy5sb2NrZmlsZShzaGVsbHV0aWxzLm1rX2xvY2tfZmlsZW5hbWUoKSkKKworCitkZWYgcmVhZF9uZXh0X3Rhc2tfYnlfc3RhdGUodGFza19zdGF0ZSwgdGFza19uYW1lPU5vbmUpOgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgY29uZmlnLkJBQ0tMT0dGSUxFKSk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgb3MucmVuYW1lKGNvbmZpZy5CQUNLTE9HRklMRSwgY29uZmlnLkJBQ0tMT0dGSUxFICsgIi50bXAiKQorICAgIHRhc2sgPSBOb25lCisgICAgd2l0aCBvcGVuKGNvbmZpZy5CQUNLTE9HRklMRSArICIudG1wIiwgInIiKSBhcyBmX2luOgorICAgICAgICB3aXRoIG9wZW4oY29uZmlnLkJBQ0tMT0dGSUxFLCAidyIpIGFzIGZfb3V0OgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZl9pbi5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IGxpbmUuc3RyaXAoKS5zcGxpdCgifCIsIDIpCisgICAgICAgICAgICAgICAgICAgIGlmIGZpZWxkc1sxXSA9PSB0YXNrX3N0YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGFza19uYW1lIGlzIE5vbmUgb3IgdGFza19uYW1lID09IGZpZWxkc1swXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrID0gZmllbGRzWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIlVwZGF0aW5nICVzICVzIHRvICVzIiAlICh0YXNrLCB0YXNrX3N0YXRlLCBjb25maWcuVEFTS1MubmV4dF90YXNrKHRhc2tfc3RhdGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gIiVzfCVzXG4iICUgKHRhc2ssIGNvbmZpZy5UQVNLUy5uZXh0X3Rhc2sodGFza19zdGF0ZSkpCisgICAgICAgICAgICAgICAgZl9vdXQud3JpdGUobGluZSkKKyAgICBvcy5yZW1vdmUoY29uZmlnLkJBQ0tMT0dGSUxFICsgIi50bXAiKQorICAgIHJldHVybiB0YXNrCisKK2RlZiBzZW5kX3JlcG9ydCh0YXNrX25hbWUsIHBsYWludGV4dCwgZXJydGV4dD1Ob25lKToKKyAgICBpZiBlcnJ0ZXh0IGlzIE5vbmU6CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KHBsYWludGV4dCkKKyAgICBlbHNlOgorICAgICAgICBpZiBwbGFpbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIHBsYWludGV4dCA9ICIiCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCItLVNURE9VVCBkdW1wLS1cblxuJXNcblxuLS1TVERFUlIgZHVtcC0tXG5cbiVzIiAlIChwbGFpbnRleHQsIGVycnRleHQpKQorCisgICAgbXNnWydTdWJqZWN0J10gPSAiW3Jldmlldy1yZXF1ZXN0XSAlcyAtIHNtb2tlIHRlc3QgcmVzdWx0cyIgJSB0YXNrX25hbWUKKyAgICBtc2dbJ0Zyb20nXSA9IGNvbmZpZy5PV05fRU1BSUxfQUREUkVTUworICAgIG1zZ1snVG8nXSA9IGNvbmZpZy5SRVBPUlRfRU1BSUxfQUREUkVTUworCisgICAgc210cF9jb25uZWN0aW9uID0gc210cGxpYi5TTVRQKCJsb2NhbGhvc3QiKQorICAgIHNtdHBfY29ubmVjdGlvbi5zZW5kbWFpbChjb25maWcuT1dOX0VNQUlMX0FERFJFU1MsIFtjb25maWcuUkVQT1JUX0VNQUlMX0FERFJFU1NdLCBtc2cuYXNfc3RyaW5nKCkpCisgICAgc210cF9jb25uZWN0aW9uLnF1aXQoKQorCitkZWYgbWFpbigpOgorICAgICMgd2UgZG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgaGF2ZSBhbm90aGVyIGluc3RhbmNlIG9mIHVzIHJ1bm5pbmcKKyAgICBsb2NrX2ZpbGUgPSBfdGFrZV9sb2NrZmlsZSgpCisKKyAgICBpZiBsb2NrX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgaWYgY29uZmlnLkRFQlVHOgorICAgICAgICAgICAgcHJpbnQoIkNvbmN1cnJlbnQgc2NyaXB0IGluIHByb2dyZXNzLCBleGl0aW5nIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIG5leHRfdGFzayA9IHJlYWRfbmV4dF90YXNrX2J5X3N0YXRlKGNvbmZpZy5UQVNLUy5QRU5ESU5HKQorICAgIGlmIG5leHRfdGFzayBpcyBub3QgTm9uZToKKyAgICAgICAgcHJpbnQoIk5leHQgdGFzayBpcyIsIG5leHRfdGFzaykKKyAgICAgICAgZXJydGV4dCA9IE5vbmUKKyAgICAgICAgb3V0ID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXQgPSBzaGVsbHV0aWxzLnJ1bl9zaGVsbF9jbWQoIiVzICVzIiAlIChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgInJ1bm5lci5weSIpLCBuZXh0X3Rhc2spKQorICAgICAgICBleGNlcHQgU2hlbGxDbWRFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgcHJpbnQoIkZhaWxlZCB3aGlsZSBydW5uaW5nIHRoZSB0ZXN0IHJ1bm5lcjogJXMiLCBleGMpCisgICAgICAgICAgICBlcnJ0ZXh0ID0gZXhjLl9fc3RyX18oKQorICAgICAgICBzZW5kX3JlcG9ydChuZXh0X3Rhc2ssIG91dCwgZXJydGV4dCkKKyAgICAgICAgcmVhZF9uZXh0X3Rhc2tfYnlfc3RhdGUoY29uZmlnLlRBU0tTLklOUFJPR1JFU1MsIG5leHRfdGFzaykKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiTm8gdGFzayIpCisKKyAgICBzaGVsbHV0aWxzLnVubG9ja2ZpbGUobG9ja19maWxlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL2xvZy8uY3JlYXRlIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9sb2cvLmNyZWF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9sb2cvLmNyZWF0ZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9yZWN2LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9yZWN2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3ZWZkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3JlY3YucHkKQEAgLTAsMCArMSw1NiBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFsZXhhbmRydSBEYW1pYW4gZm9yIEludGVsIENvcnAuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisjIFByb2dyYW0gdG8gcmVjZWl2ZSByZXZpZXcgcmVxdWVzdHMgYnkgZW1haWwgYW5kIGxvZyB0YXNrcyB0byBiYWNrbG9nLnR4dAorIyBEZXNpZ25lZCB0byBiZSBydW4gYnkgdGhlIGVtYWlsIHN5c3RlbSBmcm9tIGEgLmZvcndhcmQgZmlsZToKKyMKKyMgY2F0IC5mb3J3YXJkCisjIHxbZnVsbC9wYXRoXS9yZWN2LnB5CisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBzeXMsIGNvbmZpZywgc2hlbGx1dGlscworCitmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCisKK2RlZiByZWN2X21haWwoZGF0YXN0cmluZyk6CisgICAgaGVhZGVycyA9IFBhcnNlcigpLnBhcnNlc3RyKGRhdGFzdHJpbmcpCisgICAgcmV0dXJuIGhlYWRlcnNbJ3N1YmplY3QnXQorCitkZWYgbWFpbigpOgorICAgIGxvY2tfZmlsZSA9IHNoZWxsdXRpbHMubG9ja2ZpbGUoc2hlbGx1dGlscy5ta19sb2NrX2ZpbGVuYW1lKCksIHJldHJ5PVRydWUpCisKKyAgICBpZiBsb2NrX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgaWYgY29uZmlnLkRFQlVHOgorICAgICAgICAgICAgcHJpbnQoIkNvbmN1cnJlbnQgc2NyaXB0IGluIHByb2dyZXNzLCBleGl0aW5nIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHN1YmplY3QgPSByZWN2X21haWwoc3lzLnN0ZGluLnJlYWQoKSkKKworICAgIHN1YmplY3RfcGFydHMgPSBzdWJqZWN0LnNwbGl0KCkKKyAgICBpZiAiW3Jldmlldy1yZXF1ZXN0XSIgaW4gc3ViamVjdF9wYXJ0czoKKyAgICAgICAgdGFza19uYW1lID0gc3ViamVjdF9wYXJ0c1tzdWJqZWN0X3BhcnRzLmluZGV4KCJbcmV2aWV3LXJlcXVlc3RdIikgKyAxXQorICAgICAgICB3aXRoIG9wZW4oY29uZmlnLkJBQ0tMT0dGSUxFLCAiYSIpIGFzIGZvdXQ6CisgICAgICAgICAgICBsaW5lID0gIiVzfCVzXG4iICUgKHRhc2tfbmFtZSwgY29uZmlnLlRBU0tTLlBFTkRJTkcpCisgICAgICAgICAgICBmb3V0LndyaXRlKGxpbmUpCisKKyAgICBzaGVsbHV0aWxzLnVubG9ja2ZpbGUobG9ja19maWxlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9ydW5uZXIucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3J1bm5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZWQ2NjUxCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy9ydW5uZXIucHkKQEAgLTAsMCArMSwyMjIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgZXg6dHM9NDpzdz00OnN0cz00OmV0CisjIC0qLSB0YWItd2lkdGg6IDQ7IGMtYmFzaWMtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotCisjCisjIENvcHlyaWdodCAoQykgMjAxNSBBbGV4YW5kcnUgRGFtaWFuIGZvciBJbnRlbCBDb3JwLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyMgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKworCisjIFRoaXMgaXMgdGhlIG1haW4gdGVzdCBleGVjdXRpb24gY29udHJvbGxlci4gSXQgaXMgZGVzaWduZWQgdG8gYmUgcnVuCisjIG1hbnVhbGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgb3IgdG8gYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcHJvZ3JhbQorIyB0aGF0IHNjaGVkdWxlcyB0ZXN0IGV4ZWN1dGlvbi4KKyMKKyMgRXhlY3V0ZSAgIHJ1bm5lci5weSAtaCAgIGZvciBoZWxwLgorCisKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN5cywgb3MKK2ltcG9ydCB1bml0dGVzdCwgaW1wb3J0bGliCitpbXBvcnQgbG9nZ2luZywgcHByaW50LCBqc29uCitpbXBvcnQgcmUKK2Zyb20gc2hlbGx1dGlscyBpbXBvcnQgU2hlbGxDbWRFeGNlcHRpb24sIG1rZGlyaGllciwgcnVuX3NoZWxsX2NtZAorCitpbXBvcnQgY29uZmlnCisKKyMgd2UgYWxzbyBsb2cgdG8gYSBmaWxlLCBpbiBhZGRpdGlvbiB0byBjb25zb2xlLCBiZWNhdXNlIG91ciBvdXRwdXQgaXMgaW1wb3J0YW50CitfX2xvZ19maWxlX25hbWVfXyA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAibG9nL3R0c18lZC5sb2ciICUgY29uZmlnLk9XTl9QSUQpCitta2RpcmhpZXIob3MucGF0aC5kaXJuYW1lKF9fbG9nX2ZpbGVfbmFtZV9fKSkKK19fbG9nX2ZpbGVfXyA9IG9wZW4oX19sb2dfZmlsZV9uYW1lX18sICJ3IikKK19fZmlsZV9oYW5kbGVyX18gPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoX19sb2dfZmlsZV9fKQorX19maWxlX2hhbmRsZXJfXy5zZXRGb3JtYXR0ZXIobG9nZ2luZy5Gb3JtYXR0ZXIoIiUoYXNjdGltZSlzICUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIikpCisKK2NvbmZpZy5sb2dnZXIuYWRkSGFuZGxlcihfX2ZpbGVfaGFuZGxlcl9fKQorCisjIHNldCB1cCBsb2cgZGlyZWN0b3J5Cit0cnk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvbmZpZy5MT0dESVIpOgorICAgICAgICBvcy5ta2Rpcihjb25maWcuTE9HRElSKQorICAgIGVsc2U6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGNvbmZpZy5MT0dESVIpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBsb2cgZGlyICclcycgaXMgbm90IGFjdHVhbGx5IGEgZGlyZWN0b3J5LiIgJSBjb25maWcuTE9HRElSKQorZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgorICAgIHJhaXNlIGV4YworCisjIGNyZWF0ZXMgdGhlIHVuZGVyLXRlc3QtYnJhbmNoIGFzIGEgc2VwYXJhdGUgZGlyZWN0b3J5CitkZWYgc2V0X3VwX3Rlc3RfYnJhbmNoKHNldHRpbmdzLCBicmFuY2hfbmFtZSk6CisgICAgdGVzdGRpciA9ICIlcy8lcy4lZCIgJSAoc2V0dGluZ3NbJ3dvcmtkaXInXSwgY29uZmlnLlRFU1RfRElSX05BTUUsIGNvbmZpZy5PV05fUElEKQorCisgICAgIyBjcmVhdGVzIHRoZSBob3N0IGRpcgorICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlc3RkaXIpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRlc3QgZGlyICclcydpcyBhbHJlYWR5IHRoZXJlLCBhYm9ydGluZyIgJSB0ZXN0ZGlyKQorCisgICAgIyBtYXkgcmFpc2UgT1NFcnJvciwgaXMgdG8gYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyCisgICAgb3MubWFrZWRpcnModGVzdGRpcikKKworCisgICAgIyBjb3BpZXMgb3ZlciB0aGUgLmdpdCBmcm9tIHRoZSBsb2NhbGNsb25lCisgICAgcnVuX3NoZWxsX2NtZCgiY3AgLWEgJyVzJy8uZ2l0ICclcyciICUgKHNldHRpbmdzWydsb2NhbGNsb25lJ10sIHRlc3RkaXIpKQorCisgICAgIyBhZGQgdGhlIHJlbW90ZSBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgY3J0X3JlbW90ZXMgPSBydW5fc2hlbGxfY21kKCJnaXQgcmVtb3RlIC12IiwgY3dkPXRlc3RkaXIpCisgICAgcmVtb3RlcyA9IFt3b3JkIGZvciBsaW5lIGluIGNydF9yZW1vdGVzLnNwbGl0KCJcbiIpIGZvciB3b3JkIGluIGxpbmUuc3BsaXQoKV0KKyAgICBpZiBub3QgY29uZmlnLkNPTlRSSUJfUkVQTyBpbiByZW1vdGVzOgorICAgICAgICByZW1vdGVfbmFtZSA9ICJ0dHNfY29udHJpYiIKKyAgICAgICAgcnVuX3NoZWxsX2NtZCgiZ2l0IHJlbW90ZSBhZGQgJXMgJXMiICUgKHJlbW90ZV9uYW1lLCBjb25maWcuQ09OVFJJQl9SRVBPKSwgY3dkPXRlc3RkaXIpCisgICAgZWxzZToKKyAgICAgICAgcmVtb3RlX25hbWUgPSByZW1vdGVzW3JlbW90ZXMuaW5kZXgoY29uZmlnLkNPTlRSSUJfUkVQTykgLSAxXQorCisgICAgIyBkbyB0aGUgZmV0Y2gKKyAgICBydW5fc2hlbGxfY21kKCJnaXQgZmV0Y2ggJXMgLXAiICUgcmVtb3RlX25hbWUsIGN3ZD10ZXN0ZGlyKQorCisgICAgIyBkbyB0aGUgY2hlY2tvdXQKKyAgICBydW5fc2hlbGxfY21kKCJnaXQgY2hlY2tvdXQgb3JpZ2luL21hc3RlciAmJiBnaXQgYnJhbmNoIC1EICVzOyBnaXQgY2hlY2tvdXQgJXMvJXMgLWIgJXMgJiYgZ2l0IHJlc2V0IC0taGFyZCIgJSAoYnJhbmNoX25hbWUsIHJlbW90ZV9uYW1lLCBicmFuY2hfbmFtZSwgYnJhbmNoX25hbWUpLCBjd2Q9dGVzdGRpcikKKworICAgIHJldHVybiB0ZXN0ZGlyCisKKworZGVmIF9fc2VhcmNoX2Zvcl90ZXN0cygpOgorICAgICMgd2UgZmluZCBhbGwgY2xhc3NlcyB0aGF0IGNhbiBydW4sIGFuZCBydW4gdGhlbQorICAgIHRlc3RzID0gW10KKyAgICBmb3IgXywgXywgZmlsZXNfbGlzdCBpbiBvcy53YWxrKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSk6CisgICAgICAgIGZvciBtb2R1bGVfZmlsZSBpbiBbZls6LTNdIGZvciBmIGluIGZpbGVzX2xpc3QgaWYgZi5lbmRzd2l0aCgiLnB5IikgYW5kIG5vdCBmLnN0YXJ0c3dpdGgoIl9faW5pdF9fIildOgorICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygiSW5zcGVjdGluZyBtb2R1bGUgJXMiLCBtb2R1bGVfZmlsZSkKKyAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUobW9kdWxlX2ZpbGUpCisgICAgICAgICAgICBjcnRjbGFzc19uYW1lcyA9IHZhcnMoY3VycmVudF9tb2R1bGUpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBjcnRjbGFzc19uYW1lczoKKyAgICAgICAgICAgICAgICB0ZXN0ZWRfdmFsdWUgPSBjcnRjbGFzc19uYW1lc1tuYW1lXQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdGVkX3ZhbHVlLCB0eXBlKHVuaXR0ZXN0LlRlc3RDYXNlKSkgYW5kIGlzc3ViY2xhc3ModGVzdGVkX3ZhbHVlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgICAgIHRlc3RzLmFwcGVuZCgobW9kdWxlX2ZpbGUsIG5hbWUpKQorICAgICAgICBicmVhaworICAgIHJldHVybiB0ZXN0cworCisKKyMgYm9pbGVycGxhdGUgdG8gc2VsZiBkaXNjb3ZlciB0ZXN0cyBhbmQgcnVuIHRoZW0KK2RlZiBleGVjdXRlX3Rlc3RzKGRpcl91bmRlcl90ZXN0LCB0ZXN0bmFtZSk6CisKKyAgICBpZiB0ZXN0bmFtZSBpcyBub3QgTm9uZSBhbmQgIi4iIGluIHRlc3RuYW1lOgorICAgICAgICB0ZXN0cyA9IFtdCisgICAgICAgIHRlc3RzLmFwcGVuZCh0dXBsZSh0ZXN0bmFtZS5zcGxpdCgiLiIsIDIpKSkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cyA9IF9fc2VhcmNoX2Zvcl90ZXN0cygpCisKKyAgICAjIGxldCdzIG1vdmUgdG8gdGhlIGRpcmVjdG9yeSB1bmRlciB0ZXN0CisgICAgY3J0X2RpciA9IG9zLmdldGN3ZCgpCisgICAgb3MuY2hkaXIoZGlyX3VuZGVyX3Rlc3QpCisKKyAgICAjIGV4ZWN1dGUgZWFjaCBtb2R1bGUKKyAgICAjIHB5bGludDogZGlzYWJsZT1icm9hZC1leGNlcHQKKyAgICAjIHdlIGRpc2FibGUgdGhlIGJyb2FkLWV4Y2VwdCBiZWNhdXNlIHdlIHdhbnQgdG8gYWN0dWFsbHkgY2F0Y2ggYWxsIHBvc3NpYmxlIGV4Y2VwdGlvbnMKKyAgICB0cnk6CisgICAgICAgICMgc29ydGluZyB0aGUgdGVzdHMgYnkgdGhlIG51bWVyaWMgb3JkZXIgaW4gdGhlIGNsYXNzIG5hbWUKKyAgICAgICAgdGVzdHMgPSBzb3J0ZWQodGVzdHMsIGtleT1sYW1iZGEgeDogaW50KHJlLnNlYXJjaChyIlswLTldKyIsIHhbMV0pLmdyb3VwKDApKSkKKyAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygiRGlzY292ZXJlZCB0ZXN0IGNsYXNlczogJXMiLCBwcHJpbnQucGZvcm1hdCh0ZXN0cykpCisgICAgICAgIHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyKCkKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5mYWlsZmFzdCA9IFRydWUKKyAgICAgICAgZm9yIG1vZHVsZV9maWxlLCB0ZXN0X25hbWUgaW4gdGVzdHM6CisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgiJXMuJXMiICUgKG1vZHVsZV9maWxlLCB0ZXN0X25hbWUpKSkKKyAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKCJSdW5uaW5nICVkIHRlc3QocykiLCBzdWl0ZS5jb3VudFRlc3RDYXNlcygpKQorICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KQorCisgICAgICAgIGZvciBlcnJvciBpbiByZXN1bHQuZXJyb3JzOgorICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIG9uIHRlc3Q6ICVzXG4lcyIsIGVycm9yWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iLmpvaW4oWyItLSAlcyIgJSB4IGZvciB4IGluIGVycm9yWzFdLnNwbGl0KCJcbiIpXSkpCisKKyAgICAgICAgZm9yIGZhaWx1cmUgaW4gcmVzdWx0LmZhaWx1cmVzOgorICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcigiRmFpbGVkIHRlc3Q6ICVzOlxuJXNcbiIsIGZhaWx1cmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIuam9pbihbIi0tICAlcyIgJSB4IGZvciB4IGluIGZhaWx1cmVbMV0uc3BsaXQoIlxuIildKSkKKworICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oIlRlc3QgcmVzdWx0czogJWQgcmFuLCAlZCBlcnJvcnMsICVkIGZhaWx1cmVzIiwgcmVzdWx0LnRlc3RzUnVuLCBsZW4ocmVzdWx0LmVycm9ycyksIGxlbihyZXN1bHQuZmFpbHVyZXMpKQorCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcigiRXhjZXB0aW9uIHdoaWxlIHJ1bm5pbmcgdGVzdC4gVHJhY2VkdW1wOiBcbiVzIiwgdHJhY2ViYWNrLmZvcm1hdF9leGMoZXhjKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihjcnRfZGlyKQorICAgIHJldHVybiBsZW4ocmVzdWx0LmZhaWx1cmVzKQorCisjIHZlcmlmeSB0aGF0IHdlIGhhZCBhIGJyYW5jaC11bmRlci10ZXN0IG5hbWUgYXMgcGFyYW1ldGVyCitkZWYgdmFsaWRhdGVfYXJncygpOgorICAgIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT0idXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBicmFuY2hfdW5kZXJfdGVzdCIpCisKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXQiLCAiLS10ZXN0LWRpciIsIGRlc3Q9InRlc3RkaXIiLCBkZWZhdWx0PU5vbmUsIGhlbHA9IlVzZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHRvIHJ1biB0ZXN0cywgaW5oaWJpdHMgdGhlIGNoZWNrb3V0LiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgIi0tc2luZ2xlIiwgZGVzdD0ic2luZ2xldGVzdCIsIGRlZmF1bHQ9Tm9uZSwgaGVscD0iUnVuIG9ubHkgdGhlIHNwZWNpZmllZCB0ZXN0IikKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBpZiBsZW4oYXJncykgPCAxOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IHRoZSBicmFuY2ggdG8gcnVuIG9uLiBVc2Ugb3B0aW9uICctaCcgd2hlbiBpbiBkb3VidC4iKQorICAgIHJldHVybiAob3B0aW9ucywgYXJncykKKworCisKKworIyBsb2FkIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKK2RlZiByZWFkX3NldHRpbmdzKCk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvbmZpZy5TRVRUSU5HU19GSUxFKSBvciBub3Qgb3MucGF0aC5pc2ZpbGUoY29uZmlnLlNFVFRJTkdTX0ZJTEUpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvbmZpZyBmaWxlICclcycgY2Fubm90IGJlIG9wZW5lbmQiICUgY29uZmlnLlNFVFRJTkdTX0ZJTEUpCisgICAgcmV0dXJuIGpzb24ubG9hZHMob3Blbihjb25maWcuU0VUVElOR1NfRklMRSwgInIiKS5yZWFkKCkpCisKKworIyBjbGVhbnVwICEKK2RlZiBjbGVhbl91cCh0ZXN0ZGlyKToKKyAgICBydW5fc2hlbGxfY21kKCJybSAtcmYgLS0gJyVzJyIgJSB0ZXN0ZGlyKQorCitkZWYgZHVtcF9pbmZvKHNldHRpbmdzLCBvcHRpb25zLCBhcmdzKToKKyAgICAiIiIgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBydW4gY29uZmlndXJhdGlvbiwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgICAiIiIKKyAgICBjb25maWcubG9nZ2VyLmRlYnVnKCJTZXR0aW5nczpcbiVzXG5PcHRpb25zOlxuJXNcbkFyZ3VtZW50czpcbiVzXG4iLCBzZXR0aW5ncywgb3B0aW9ucywgYXJncykKKworZGVmIG1haW4oKToKKyAgICAob3B0aW9ucywgYXJncykgPSB2YWxpZGF0ZV9hcmdzKCkKKworICAgIHNldHRpbmdzID0gcmVhZF9zZXR0aW5ncygpCisgICAgbmVlZF9jbGVhbnVwID0gRmFsc2UKKworICAgICMgZHVtcCBkZWJ1ZyBpbmZvCisgICAgZHVtcF9pbmZvKHNldHRpbmdzLCBvcHRpb25zLCBhcmdzKQorCisgICAgdGVzdGRpciA9IE5vbmUKKyAgICBub19mYWlsdXJlcyA9IDEKKyAgICB0cnk6CisgICAgICAgIGlmIG9wdGlvbnMudGVzdGRpciBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5leGlzdHMob3B0aW9ucy50ZXN0ZGlyKToKKyAgICAgICAgICAgIHRlc3RkaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy50ZXN0ZGlyKQorICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKCJObyBjaGVja291dCwgdXNpbmcgJXMiLCB0ZXN0ZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmVlZF9jbGVhbnVwID0gVHJ1ZQorICAgICAgICAgICAgdGVzdGRpciA9IHNldF91cF90ZXN0X2JyYW5jaChzZXR0aW5ncywgYXJnc1swXSkgIyB3ZSBleHBlY3QgYSBicmFuY2ggbmFtZSBhcyBmaXJzdCBhcmd1bWVudAorCisgICAgICAgIGNvbmZpZy5URVNURElSID0gdGVzdGRpciAgICAjIHdlIGxldCB0ZXN0cyBrbm93IHdoZXJlIHRvIHJ1bgorCisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlIHRlc3QgZGlyIG9ubHkgY29udGFpbnMgbm8gKi5weWMgbGVmdG92ZXJzCisgICAgICAgIHJ1bl9zaGVsbF9jbWQoImZpbmQgJyVzJyAtdHlwZSBmIC1uYW1lICoucHljIC1leGVjIHJtIHt9IFxcOyIgJSB0ZXN0ZGlyKQorCisgICAgICAgIG5vX2ZhaWx1cmVzID0gZXhlY3V0ZV90ZXN0cyh0ZXN0ZGlyLCBvcHRpb25zLnNpbmdsZXRlc3QpCisKKyAgICBleGNlcHQgU2hlbGxDbWRFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgIGNvbmZpZy5sb2dnZXIuZXJyb3IoIkVycm9yIHdoaWxlIHNldHRpbmcgdXAgdGVzdGluZy4gVHJhY2ViYWNrOiBcbiVzIiwgdHJhY2ViYWNrLmZvcm1hdF9leGMoZXhjKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBuZWVkX2NsZWFudXAgYW5kIHRlc3RkaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjbGVhbl91cCh0ZXN0ZGlyKQorCisgICAgc3lzLmV4aXQobm9fZmFpbHVyZXMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3NldHRpbmdzLmpzb24gYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3NldHRpbmdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2NzFlYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvc2V0dGluZ3MuanNvbgpAQCAtMCwwICsxLDUgQEAKK3sKKwkicmVwbyI6ICJnaXRAZ2l0LnlvY3RvcHJvamVjdC5vcmc6cG9reS1jb250cmliIiwKKwkibG9jYWxjbG9uZSI6ICIvaG9tZS9kZGFsZXgvc3NkL3lvY3RvL3Bva3kiLAorCSJ3b3JrZGlyIjogIi9ob21lL2RkYWxleC9zc2QveW9jdG8iCit9CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3NoZWxsdXRpbHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3NoZWxsdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwMTJlZAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvc2hlbGx1dGlscy5weQpAQCAtMCwwICsxLDE0MSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBleDp0cz00OnN3PTQ6c3RzPTQ6ZXQKKyMgLSotIHRhYi13aWR0aDogNDsgYy1iYXNpYy1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE1IEFsZXhhbmRydSBEYW1pYW4gZm9yIEludGVsIENvcnAuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorCisjIFV0aWxpdGllcyBzaGFyZWQgYnkgdGVzdHMgYW5kIG90aGVyIGNvbW1vbiBiaXRzIG9mIGNvZGUuCisKK2ltcG9ydCBzeXMsIG9zLCBzdWJwcm9jZXNzLCBmY250bCwgZXJybm8KK2ltcG9ydCBjb25maWcKK2Zyb20gY29uZmlnIGltcG9ydCBsb2dnZXIKKworCisjIExpY2Vuc2Ugd2FybmluZzsgdGhpcyBjb2RlIGlzIGNvcGllZCBmcm9tIHRoZSBCaXRCYWtlIHByb2plY3QsIGZpbGUgYml0YmFrZS9saWIvYmIvdXRpbHMucHkKKyMgVGhlIGNvZGUgaXMgb3JpZ2luYWxseSBsaWNlbnNlZCBHUEwtMi4wLCBhbmQgd2UgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHN0aWxsIEdQTC0yLjAKKworIyBFbmQgb2YgY29weSBpcyBtYXJrZWQgd2l0aCAjRU5ET0ZDT1BZIG1hcmtlcgorCitkZWYgbWtkaXJoaWVyKGRpcmVjdG9yeSk6CisgICAgIiIiQ3JlYXRlIGEgZGlyZWN0b3J5IGxpa2UgJ21rZGlyIC1wJywgYnV0IGRvZXMgbm90IGNvbXBsYWluIGlmCisgICAgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIGxpa2Ugb3MubWFrZWRpcnMKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgICAgb3MubWFrZWRpcnMoZGlyZWN0b3J5KQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgaWYgZXhjLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIHJhaXNlIGV4YworCitkZWYgbG9ja2ZpbGUobmFtZSwgc2hhcmVkPUZhbHNlLCByZXRyeT1UcnVlKToKKyAgICAiIiIKKyAgICBVc2UgdGhlIGZpbGUgZm4gYXMgYSBsb2NrIGZpbGUsIHJldHVybiB3aGVuIHRoZSBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkLgorICAgIFJldHVybnMgYSB2YXJpYWJsZSB0byBwYXNzIHRvIHVubG9ja2ZpbGUoKS4KKyAgICAiIiIKKyAgICBjb25maWcubG9nZ2VyLmRlYnVnKCJ0YWtlIGxvY2tmaWxlICVzIiwgbmFtZSkKKyAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKG5hbWUpCisgICAgbWtkaXJoaWVyKGRpcm5hbWUpCisKKyAgICBpZiBub3Qgb3MuYWNjZXNzKGRpcm5hbWUsIG9zLldfT0spOgorICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byBhY3F1aXJlIGxvY2sgJyVzJywgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgb3BlcmF0aW9uID0gZmNudGwuTE9DS19FWAorICAgIGlmIHNoYXJlZDoKKyAgICAgICAgb3BlcmF0aW9uID0gZmNudGwuTE9DS19TSAorICAgIGlmIG5vdCByZXRyeToKKyAgICAgICAgb3BlcmF0aW9uID0gb3BlcmF0aW9uIHwgZmNudGwuTE9DS19OQgorCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgIyBJZiB3ZSBsZWF2ZSB0aGUgbG9ja2ZpbGVzIGx5aW5nIGFyb3VuZCB0aGVyZSBpcyBubyBwcm9ibGVtCisgICAgICAgICMgYnV0IHdlIHNob3VsZCBjbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuIFRoaXMgZ2l2ZXMgcG90ZW50aWFsCisgICAgICAgICMgZm9yIHJhY2VzIHRob3VnaC4gVG8gd29yayBhcm91bmQgdGhpcywgd2hlbiB3ZSBhY3F1aXJlIHRoZSBsb2NrCisgICAgICAgICMgd2UgY2hlY2sgdGhlIGZpbGUgd2UgbG9ja2VkIHdhcyBzdGlsbCB0aGUgbG9jayBmaWxlIG9uIGRpc2suCisgICAgICAgICMgYnkgY29tcGFyaW5nIGlub2RlIG51bWJlcnMuIElmIHRoZXkgZG9uJ3QgbWF0Y2ggb3IgdGhlIGxvY2tmaWxlCisgICAgICAgICMgbm8gbG9uZ2VyIGV4aXN0cywgd2Ugc3RhcnQgYWdhaW4uCisKKyAgICAgICAgIyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHVuZmFpciBzaW5jZSB0aGUgbGFzdCBwZXJzb24gdG8gcmVxdWVzdCB0aGUKKyAgICAgICAgIyBsb2NrIGlzIHRoZSBtb3N0IGxpa2VseSB0byB3aW4gaXQuCisKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CisgICAgICAgICMgd2UgZGlzYWJsZSB0aGUgYnJvYWQtZXhjZXB0IGJlY2F1c2Ugd2Ugd2FudCB0byBhY3R1YWxseSBjYXRjaCBhbGwgcG9zc2libGUgZXhjZXB0aW9ucworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2NrX2ZpbGUgPSBvcGVuKG5hbWUsICdhKycpCisgICAgICAgICAgICBmaWxlbm8gPSBsb2NrX2ZpbGUuZmlsZW5vKCkKKyAgICAgICAgICAgIGZjbnRsLmZsb2NrKGZpbGVubywgb3BlcmF0aW9uKQorICAgICAgICAgICAgc3RhdGluZm8gPSBvcy5mc3RhdChmaWxlbm8pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsb2NrX2ZpbGUubmFtZSk6CisgICAgICAgICAgICAgICAgc3RhdGluZm8yID0gb3Muc3RhdChsb2NrX2ZpbGUubmFtZSkKKyAgICAgICAgICAgICAgICBpZiBzdGF0aW5mby5zdF9pbm8gPT0gc3RhdGluZm8yLnN0X2lubzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2tfZmlsZQorICAgICAgICAgICAgbG9ja19maWxlLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbG9ja19maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjMjoKKyAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY2xvc2UgdGhlIGxvY2tmaWxlOiAlcyIsIGV4YzIpCisgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gYWNxdWlyZSB0aGUgbG9ja2ZpbGU6ICVzIiwgZXhjKQorICAgICAgICBpZiBub3QgcmV0cnk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgdW5sb2NrZmlsZShsb2NrX2ZpbGUpOgorICAgICIiIgorICAgIFVubG9jayBhIGZpbGUgbG9ja2VkIHVzaW5nIGxvY2tmaWxlKCkKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgICMgSWYgd2UgaGFkIGEgc2hhcmVkIGxvY2ssIHdlIG5lZWQgdG8gcHJvbW90ZSB0byBleGNsdXNpdmUgYmVmb3JlCisgICAgICAgICMgcmVtb3ZpbmcgdGhlIGxvY2tmaWxlLiBBdHRlbXB0IHRoaXMsIGlnbm9yZSBmYWlsdXJlcy4KKyAgICAgICAgZmNudGwuZmxvY2sobG9ja19maWxlLmZpbGVubygpLCBmY250bC5MT0NLX0VYfGZjbnRsLkxPQ0tfTkIpCisgICAgICAgIG9zLnVubGluayhsb2NrX2ZpbGUubmFtZSkKKyAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZmNudGwuZmxvY2sobG9ja19maWxlLmZpbGVubygpLCBmY250bC5MT0NLX1VOKQorICAgIGxvY2tfZmlsZS5jbG9zZSgpCisKKyNFTkRPRkNPUFkKKworCitkZWYgbWtfbG9ja19maWxlbmFtZSgpOgorICAgIG91cl9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXykKKyAgICBvdXJfbmFtZSA9ICIuJXMiICUgIi4iLmpvaW4ocmV2ZXJzZWQob3VyX25hbWUuc3BsaXQoIi4iKSkpCisgICAgcmV0dXJuIGNvbmZpZy5MT0NLRklMRSArIG91cl9uYW1lCisKKworCitjbGFzcyBTaGVsbENtZEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIHJ1bl9zaGVsbF9jbWQoY29tbWFuZCwgY3dkPU5vbmUpOgorICAgIGlmIGN3ZCBpcyBOb25lOgorICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorCisgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygiX3NoZWxsY21kOiAoJXMpICVzIiwgY3dkLCBjb21tYW5kKQorICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIGN3ZD1jd2QsIHNoZWxsPVRydWUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgKG91dCwgZXJyKSA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgIHByb2Nlc3Mud2FpdCgpCisgICAgaWYgcHJvY2Vzcy5yZXR1cm5jb2RlOgorICAgICAgICBpZiBsZW4oZXJyKSA9PSAwOgorICAgICAgICAgICAgZXJyID0gImNvbW1hbmQ6ICVzIFxuJXMiICUgKGNvbW1hbmQsIG91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVyciA9ICJjb21tYW5kOiAlcyBcbiVzIiAlIChjb21tYW5kLCBlcnIpCisgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybigiX3NoZWxsY21kOiBlcnJvciBcbiVzXG4lcyIsIG91dCwgZXJyKQorICAgICAgICByYWlzZSBTaGVsbENtZEV4Y2VwdGlvbihlcnIpCisgICAgZWxzZToKKyAgICAgICAgI2NvbmZpZy5sb2dnZXIuZGVidWcoImxvY2FsaG9zdGJlY29udHJvbGxlcjogc2hlbGxjbWQgc3VjY2Vzc1xuJXMiICUgb3V0KQorICAgICAgICByZXR1cm4gb3V0CisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdGVzdHMucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTBlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3Rlc3RzLnB5CkBAIC0wLDAgKzEsMTE1IEBACisjIS91c3IvYmluL3B5dGhvbgorCisjIGV4OnRzPTQ6c3c9NDpzdHM9NDpldAorIyAtKi0gdGFiLXdpZHRoOiA0OyBjLWJhc2ljLW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsIC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTUgQWxleGFuZHJ1IERhbWlhbiBmb3IgSW50ZWwgQ29ycC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKworIyBUZXN0IGRlZmluaXRpb25zLiBUaGUgcnVubmVyIHdpbGwgbG9vayBmb3IgYW5kIGF1dG8tZGlzY292ZXIgdGhlIHRlc3RzCisjIG5vIG1hdHRlciB3aGF0IHRoZXkgZmlsZSBhcmUgdGhleSBpbiwgYXMgbG9uZyBhcyB0aGV5IGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKKyMgYXMgdGhpcyBmaWxlLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gc2hlbGx1dGlscyBpbXBvcnQgcnVuX3NoZWxsX2NtZCwgU2hlbGxDbWRFeGNlcHRpb24KK2ltcG9ydCBjb25maWcKKworaW1wb3J0IHBleHBlY3QKK2ltcG9ydCBzeXMsIG9zLCBzaWduYWwsIHRpbWUKKworY2xhc3MgVGVzdDAwUHlDb21waWxhYmxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJycgVmVyaWZpZXMgdGhhdCBhbGwgUHl0aG9uIGZpbGVzIGFyZSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgJycnCisgICAgZGVmIHRlc3RfY29tcGlsZV9maWxlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5fc2hlbGxfY21kKCJmaW5kIC4gLW5hbWUgKnB5IC10eXBlIGYgLXByaW50MCB8IHhhcmdzIC0wIC1uMSAtUDIwIHB5dGhvbiAtbSBweV9jb21waWxlIiwgY29uZmlnLlRFU1RESVIpCisgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIGNvbXBpbGluZyBweXRob24gZmlsZXM6ICVzIiAlIChleGMpKQorCisgICAgZGVmIHRlc3RfcHlsaW50X2ZpbGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9zaGVsbF9jbWQociJmaW5kIC4gLWluYW1lIFwiKlwucHlcIiAtdHlwZSBmIC1wcmludDAgfCBQWVRIT05QQVRIPSR7UFlUSE9OUEFUSH06LiB4YXJncyAtciAtMCAtbjEgcHlsaW50IC0tbG9hZC1wbHVnaW5zIHB5bGludF9kamFuZ28gLUUgLS1yZXBvcnRzPW4gMj4mMSIsIGN3ZD1jb25maWcuVEVTVERJUiArICIvYml0YmFrZS9saWIvdG9hc3RlciIpCisgICAgICAgIGV4Y2VwdCBTaGVsbENtZEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlB5bGludCBmYWlsczogJXNcbiIgJSBleGMpCisKK2NsYXNzIFRlc3QwMVB5U3lzdGVtU3RhcnQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJyBBdHRlbXB0cyB0byBzdGFydCBUb2FzdGVyLCB2ZXJpZnkgdGhhdCBpdCBpcyBzdWNjZXNmdWxsLCBhbmQgc3RvcCBpdCAnJycKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHJ1bl9zaGVsbF9jbWQoImJhc2ggLWMgJ3JtIC1mIGJ1aWxkLypsb2cnIikKKworICAgIGRlZiB0ZXN0X3N0YXJ0X2ludGVyYWN0aXZlX21vZGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9zaGVsbF9jbWQoImJhc2ggLWMgJ3NvdXJjZSAlcy9vZS1pbml0LWJ1aWxkLWVudiAmJiBzb3VyY2UgdG9hc3RlciBzdGFydCB3ZWJwb3J0PSVkICYmIHNvdXJjZSB0b2FzdGVyIHN0b3AnIiAlIChjb25maWcuVEVTVERJUiwgY29uZmlnLlRPQVNURVJfUE9SVCksIGNvbmZpZy5URVNURElSKQorICAgICAgICBleGNlcHQgU2hlbGxDbWRFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgc3RhcnRpbmcgaW50ZXJhY3RpdmUgbW9kZTogJXMiICUgKGV4YykpCisKKyAgICBkZWYgdGVzdF9zdGFydF9tYW5hZ2VkX21vZGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9zaGVsbF9jbWQoIiVzL2JpdGJha2UvYmluL3RvYXN0ZXIgd2VicG9ydD0lZCBub2Jyb3dzZXIgJiBzbGVlcCAxMCAmJiBjdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6JWQvICYmIGtpbGwgLTIgJSUxIiAlIChjb25maWcuVEVTVERJUiwgY29uZmlnLlRPQVNURVJfUE9SVCwgY29uZmlnLlRPQVNURVJfUE9SVCksIGNvbmZpZy5URVNURElSKQorICAgICAgICBleGNlcHQgU2hlbGxDbWRFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgc3RhcnRpbmcgbWFuYWdlZCBtb2RlOiAlcyIgJSAoZXhjKSkKKworY2xhc3MgVGVzdDAySFRNTDVDb21wbGlhbmNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub3JpZ2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIHNlbGYuY3J0ZGlyID0gb3MucGF0aC5kaXJuYW1lKGNvbmZpZy5URVNURElSKQorICAgICAgICBzZWxmLmNsZWFudXBfZGF0YWJhc2UgPSBGYWxzZQorICAgICAgICBvcy5jaGRpcihzZWxmLmNydGRpcikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmNydGRpciwgInRvYXN0ZXIuc3FsaXRlIikpOgorICAgICAgICAgICAgc2VsZi5jbGVhbnVwX2RhdGFiYXNlID0gVHJ1ZQorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZCgiJXMvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgc3luY2RiIC0tbm9pbnB1dCIgJSBjb25maWcuVEVTVERJUikKKyAgICAgICAgICAgIHJ1bl9zaGVsbF9jbWQoIiVzL2JpdGJha2UvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IG1pZ3JhdGUgb3JtIiAlIGNvbmZpZy5URVNURElSKQorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZCgiJXMvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbWlncmF0ZSBibGRjb250cm9sIiAlIGNvbmZpZy5URVNURElSKQorICAgICAgICAgICAgcnVuX3NoZWxsX2NtZCgiJXMvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgbG9hZGNvbmYgJXMvbWV0YS15b2N0by9jb25mL3RvYXN0ZXJjb25mLmpzb24iICUgKGNvbmZpZy5URVNURElSLCBjb25maWcuVEVTVERJUikpCisgICAgICAgICAgICBydW5fc2hlbGxfY21kKCIlcy9iaXRiYWtlL2xpYi90b2FzdGVyL21hbmFnZS5weSBsc3VwZGF0ZXMiICUgY29uZmlnLlRFU1RESVIpCisKKyAgICAgICAgICAgIHNldHVwID0gcGV4cGVjdC5zcGF3bigiJXMvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkgY2hlY2tzZXR0aW5ncyIgJSBjb25maWcuVEVTVERJUikKKyAgICAgICAgICAgIHNldHVwLmxvZ2ZpbGUgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzZXR1cC5leHBlY3QociIuKm9yIHR5cGUgdGhlIGZ1bGwgcGF0aCB0byBhIGRpZmZlcmVudCBkaXJlY3Rvcnk6ICIpCisgICAgICAgICAgICBzZXR1cC5zZW5kbGluZSgnJykKKyAgICAgICAgICAgIHNldHVwLnNlbmRsaW5lKCcnKQorICAgICAgICAgICAgc2V0dXAuZXhwZWN0KHIiLipvciB0eXBlIHRoZSBmdWxsIHBhdGggdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5OiAiKQorICAgICAgICAgICAgc2V0dXAuc2VuZGxpbmUoJycpCisgICAgICAgICAgICBzZXR1cC5leHBlY3QociJFbnRlciB5b3VyIG9wdGlvbjogIikKKyAgICAgICAgICAgIHNldHVwLnNlbmRsaW5lKCcwJykKKworICAgICAgICBzZWxmLmNoaWxkID0gcGV4cGVjdC5zcGF3bigiYmFzaCIsIFsiJXMvYml0YmFrZS9iaW4vdG9hc3RlciIgJSBjb25maWcuVEVTVERJUiwgIndlYnBvcnQ9JWQiICUgY29uZmlnLlRPQVNURVJfUE9SVCwgIm5vYnJvd3NlciJdLCBjd2Q9c2VsZi5jcnRkaXIpCisgICAgICAgIHNlbGYuY2hpbGQubG9nZmlsZSA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5jaGlsZC5leHBlY3QoIlRvYXN0ZXIgaXMgbm93IHJ1bm5pbmcuIFlvdSBjYW4gc3RvcCBpdCB3aXRoIEN0cmwtQyIpCisKKyAgICBkZWYgdGVzdF9odG1sNV9jb21wbGlhbmNlKHNlbGYpOgorICAgICAgICBpbXBvcnQgdXJsbGlzdCwgdXJsY2hlY2sKKyAgICAgICAgcmVzdWx0cyA9IHt9CisgICAgICAgIGZvciB1cmwgaW4gdXJsbGlzdC5VUkxTOgorICAgICAgICAgICAgcmVzdWx0c1t1cmxdID0gdXJsY2hlY2sudmFsaWRhdGVfaHRtbDUoY29uZmlnLlRPQVNURVJfQkFTRVVSTCArIHVybCkKKworICAgICAgICBmYWlsZWQgPSBbXQorICAgICAgICBmb3IgdXJsIGluIHJlc3VsdHM6CisgICAgICAgICAgICBpZiByZXN1bHRzW3VybF1bMV0gIT0gMDoKKyAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKCh1cmwsIHJlc3VsdHNbdXJsXSkpCisKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGZhaWxlZCkgPT0gMCwgIk5vdCBhbGwgVVJMcyB2YWxpZGF0ZTogXG4lcyAiICUgIlxuIi5qb2luKFsiIi5qb2luKHN0cih4KSkgZm9yIHggaW4gZmFpbGVkXSkpCisKKyAgICAgICAgIyhjb25maWcuVE9BU1RFUl9CQVNFVVJMICsgdXJsLCBzdGF0dXMsIGVycm9ycywgd2FybmluZ3MpKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLmNoaWxkLmlzYWxpdmUoKToKKyAgICAgICAgICAgIHNlbGYuY2hpbGQua2lsbChzaWduYWwuU0lHSU5UKQorICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICBvcy5jaGRpcihzZWxmLm9yaWdkaXIpCisgICAgICAgIHRvYXN0ZXJfc3FsaXRlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5jcnRkaXIsICJ0b2FzdGVyLnNxbGl0ZSIpCisgICAgICAgIGlmIHNlbGYuY2xlYW51cF9kYXRhYmFzZSBhbmQgb3MucGF0aC5leGlzdHModG9hc3Rlcl9zcWxpdGVfcGF0aCk6CisgICAgICAgICAgICBvcy5yZW1vdmUodG9hc3Rlcl9zcWxpdGVfcGF0aCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdG9hc3RlcnVpdGVzdC9ydW5fdG9hc3RlcnRlc3RzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3J1bl90b2FzdGVydGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODgwNDg3YwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdG9hc3RlcnVpdGVzdC9ydW5fdG9hc3RlcnRlc3RzLnB5CkBAIC0wLDAgKzEsODcgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMgQ29weXJpZ2h0CisKKyMgREVTQ1JJUFRJT04KKyMgVGhpcyBpcyBzY3JpcHQgZm9yIHJ1bm5pbmcgYWxsIHNlbGVjdGVkIHRvYXN0ZXIgY2FzZXMgb24KKyMgc2VsZWN0ZWQgd2ViIGJyb3dzZXJzIG1hbmlmZXN0ZWQgaW4gdG9hc3Rlcl90ZXN0LmNmZy4KKworIyAxLiBIb3cgdG8gc3RhcnQgdG9hc3RlciBpbiB5b2N0bzoKKyMgJCBzb3VyY2UgcG9reS9vZS1pbml0LWJ1aWxkLWVudgorIyAkIHNvdXJjZSB0b2FzdGVyIHN0YXJ0CisjICQgYml0YmFrZSBjb3JlLWltYWdlLW1pbmltYWwKKworIyAyLiBIb3cgdG8gaW5zdGFsbCBzZWxlbml1bSBvbiBVYnVudHU6CisjICQgc3VkbyBhcHQtZ2V0IGluc3RhbGwgc2Nyb3QgcHl0aG9uLXBpcAorIyAkIHN1ZG8gcGlwIGluc3RhbGwgc2VsZW5pdW0KKworIyAzLiBIb3cgdG8gaW5zdGFsbCBzZWxlbml1bSBhZGRvbiBpbiBmaXJlZm94OgorIyBEb3dubG9hZCB0aGUgbGFzdGVzdCBmaXJlZm94IGFkZG9uIGZyb20gaHR0cDovL3JlbGVhc2Uuc2VsZW5pdW1ocS5vcmcvc2VsZW5pdW0taWRlLworIyBUaGVuIGluc3RhbGwgaXQuIFlvdSBjYW4gYWxzbyBpbnN0YWxsIGZpcmVidWcgYW5kIGZpcmVwYXRoIGFkZG9uCisKKyMgNC4gSG93IHRvIHN0YXJ0IHdyaXRpbmcgYSBuZXcgY2FzZToKKyMgQWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24gdGVzdF94eHgoKSBhbmQgIHBpbGUgaXQgb24uCisKKyMgNS4gSG93IHRvIHRlc3Qgd2l0aCBDaHJvbWUgYnJvd3NlcgorIyBEb3dubG9hZC9pbnN0YWxsIGNocm9tZSBvbiBob3N0CisjIERvd25sb2FkIGNocm9tZWRyaXZlciBmcm9tIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21lZHJpdmVyL2Rvd25sb2Fkcy9saXN0ICBhY2NvcmRpbmcgdG8geW91ciBob3N0IHR5cGUKKyMgcHV0IGNocm9tZWRyaXZlciBpbiBQQVRILCAoZS5nLiAvdXNyL2Jpbi8sIGJlYXIgaW4gbWluZCB0byBjaG1vZCkKKyMgRm9yIHdpbmRvd3MgaG9zdCwgeW91IG1heSBwdXQgY2hyb21lZHJpdmVyLmV4ZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgY2hyb21lLmV4ZQorCisKK2ltcG9ydCB1bml0dGVzdCwgdGltZSwgcmUsIHN5cywgZ2V0b3B0LCBvcywgbG9nZ2luZywgcGxhdGZvcm0KK2ltcG9ydCBDb25maWdQYXJzZXIKK2ltcG9ydCBzdWJwcm9jZXNzCisKKworY2xhc3MgdG9hc3Rlcl9ydW5fYWxsKCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIGluIGNhc2UgdGhpcyBzY3JpcHQgaXMgY2FsbGVkIGZyb20gb3RoZXIgZGlyZWN0b3J5CisgICAgICAgIG9zLmNoZGlyKG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkpCisgICAgICAgIHNlbGYuc3RhcnR0aW1lID0gdGltZS5zdHJwdGltZSh0aW1lLmN0aW1lKCkpCisgICAgICAgIHNlbGYucGFyc2VyID0gQ29uZmlnUGFyc2VyLlNhZmVDb25maWdQYXJzZXIoKQorICAgICAgICBmb3VuZCA9IHNlbGYucGFyc2VyLnJlYWQoJ3RvYXN0ZXJfdGVzdC5jZmcnKQorICAgICAgICBzZWxmLmhvc3Rfb3MgPSBwbGF0Zm9ybS5zeXN0ZW0oKS5sb3dlcigpCisgICAgICAgIHNlbGYucnVuX2FsbF9jYXNlcygpCisgICAgICAgIHNlbGYuY29sbGVjdF9sb2coKQorCisgICAgZGVmIGdldF90ZXN0X2Nhc2VzKHNlbGYpOgorICAgICAgICAjIHdlIGhhdmUgY29uZmlnIGdyb3VwcyBmb3IgZGlmZmVyZW50IG9zIHR5cGUgaW4gdG9hc3Rlcl90ZXN0LmNmZworICAgICAgICBjYXNlc190b19ydW4gPSBldmFsKHNlbGYucGFyc2VyLmdldCgndG9hc3Rlcl90ZXN0XycgKyBzZWxmLmhvc3Rfb3MsICd0ZXN0X2Nhc2VzJykpCisgICAgICAgIHJldHVybiBjYXNlc190b19ydW4KKworCisgICAgZGVmIHJ1bl9hbGxfY2FzZXMoc2VsZik6CisgICAgICAgIGNhc2VzX3RlbXAgPSBzZWxmLmdldF90ZXN0X2Nhc2VzKCkKKyAgICAgICAgZm9yIGNhc2UgaW4gY2FzZXNfdGVtcDoKKyAgICAgICAgICAgIHNpbmdsZV9jYXNlX2NtZCA9ICJweXRob24gLW0gdW5pdHRlc3QgdG9hc3Rlcl9hdXRvbWF0aW9uX3Rlc3QudG9hc3Rlcl9jYXNlcy50ZXN0XyIgKyBzdHIoY2FzZSkKKyAgICAgICAgICAgIHByaW50IHNpbmdsZV9jYXNlX2NtZAorICAgICAgICAgICAgc3VicHJvY2Vzcy5jYWxsKHNpbmdsZV9jYXNlX2NtZCwgc2hlbGw9VHJ1ZSkKKworICAgIGRlZiBjb2xsZWN0X2xvZyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHRoZSBsb2cgZmlsZXMgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCBpbiAuL2xvZy90bXAvLi4KKyAgICAgICAgQWZ0ZXIgYWxsIGNhc2VzIGFyZSBkb25lLCB0aGV5IHNob3VsZCBiZSB0cmFuc2ZlcmVkIHRvIC4vbG9nLyRUSU1FU1RBTVAvCisgICAgICAgICIiIgorICAgICAgICBkZWYgY29tcGxlKG51bWJlcik6CisgICAgICAgICAgICBpZiBudW1iZXIgPCAxMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKDApICsgc3RyKG51bWJlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihudW1iZXIpCisgICAgICAgIG5vdyA9IHNlbGYuc3RhcnR0aW1lCisgICAgICAgIG5vd19zdHIgPSBjb21wbGUobm93LnRtX3llYXIpICsgY29tcGxlKG5vdy50bV9tb24pICsgY29tcGxlKG5vdy50bV9tZGF5KSArIFwKKyAgICAgICAgICAgICAgICAgIGNvbXBsZShub3cudG1faG91cikgKyBjb21wbGUobm93LnRtX21pbikgKyBjb21wbGUobm93LnRtX3NlYykKKyAgICAgICAgbG9nX2RpciA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkgKyBvcy5zZXAgKyAnbG9nJyArIG9zLnNlcCArIG5vd19zdHIKKyAgICAgICAgbG9nX3RtcF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICsgb3Muc2VwICsgJ2xvZycgKyBvcy5zZXAgKyAndG1wJworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWVzKGxvZ190bXBfZGlyLCBsb2dfZGlyKQorICAgICAgICBleGNlcHQgT1NFcnJvciA6CisgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCIgQ2Fubm90IGNyZWF0ZSBsb2cgZGlyKHRpbWVzdGFtcCkgIHVuZGVyIGxvZywgcGxlYXNlIGNoZWNrIHlvdXIgcHJpdmlsZWdlIikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRvYXN0ZXJfcnVuX2FsbCgpCisKKworCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdG9hc3RlcnVpdGVzdC90b2FzdGVyX2F1dG9tYXRpb25fdGVzdC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdG9hc3RlcnVpdGVzdC90b2FzdGVyX2F1dG9tYXRpb25fdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTIwNzhmCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3RvYXN0ZXJfYXV0b21hdGlvbl90ZXN0LnB5CkBAIC0wLDAgKzEsMTg4MyBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMgQ29weXJpZ2h0CisKKyMgREVTQ1JJUFRJT04KKyMgVGhpcyBpcyB0b2FzdGVyIGF1dG9tYXRpb24gYmFzZSBjbGFzcyBhbmQgdGVzdCBjYXNlcyBmaWxlCisKKyMgSGlzdG9yeToKKyMgMjAxNS4wMy4wOSAgaW5pdGFsIHZlcnNpb24KKyMgMjAxNS4wMy4yMyAgYWRkaW5nIHRvYXN0ZXJfdGVzdC5jZmcsIHJ1bl90b2FzdGVydGVzdC5weSBzbyB3ZSBjYW4gcnVuIGNhc2UgYnkgY2FzZSBmcm9tIG91dHNpZGUKKworIyBCcmllZnM6CisjIFRoaXMgZmlsZSBpcyBjb21wcmlzZWQgb2YgMyBwYXJ0czoKKyMgSTogICBjb21tb24gdXRpbHMgbGlrZSBzb3J0aW5nLCBnZXR0aW5nIGF0dHJpYnV0ZS4uIGV0YworIyBJSTogIGJhc2UgY2xhc3MgcGFydCwgd2hpY2ggY29tcGxpZXMgd2l0aCB1bml0dGVzdCBmcmFtZSB3b3JrIGFuZAorIyAgICAgIGNvbnRhaW5zIGNsYXNzIHNlbGVuaXVtLWJhc2VkIGZ1bmN0aW9ucworIyBJSUk6IHRlc3QgY2FzZXMKKyMgICAgICB0byBhZGQgbmV3IGNhc2U6IGp1c3QgaW1wbGVtZW50IG5ldyB0ZXN0X3h4eCgpIGZ1bmN0aW9uIGluIGNsYXNzIHRvYXN0ZXJfY2FzZXMKKworIyBOT1RFUyBmb3IgY2FzZXM6CisjIGNhc2UgOTQ2OgorIyBzdGVwIDYgLSA4IG5lZWRzIHRvIGJlIG9ic2VydmVkIHVzaW5nIHNjcmVlbnNob3RzCisjIGNhc2UgOTU2OgorIyBzdGVwIDIgLSAzIG5lZWRzIHRvIGJlIHJ1biBtYW51YWxseQorCitpbXBvcnQgdW5pdHRlc3QsIHRpbWUsIHJlLCBzeXMsIGdldG9wdCwgb3MsIGxvZ2dpbmcsIHN0cmluZywgZXJybm8sIGV4Y2VwdGlvbnMKK2ltcG9ydCBzaHV0aWwsIGFyZ3BhcnNlLCBDb25maWdQYXJzZXIsIHBsYXRmb3JtCitmcm9tIHNlbGVuaXVtIGltcG9ydCB3ZWJkcml2ZXIKK2Zyb20gc2VsZW5pdW0uY29tbW9uLmV4Y2VwdGlvbnMgaW1wb3J0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KK2Zyb20gc2VsZW5pdW0gaW1wb3J0IHNlbGVuaXVtCitmcm9tIHNlbGVuaXVtLndlYmRyaXZlci5jb21tb24uYnkgaW1wb3J0IEJ5Citmcm9tIHNlbGVuaXVtLndlYmRyaXZlci5jb21tb24ua2V5cyBpbXBvcnQgS2V5cworZnJvbSBzZWxlbml1bS53ZWJkcml2ZXIuc3VwcG9ydC51aSBpbXBvcnQgU2VsZWN0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBQQVJUIEk6IHV0aWxzIHN0dWZmICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBMaXN0YXR0cihvYmplY3QpOgorICAgICIiIgorICAgIFNldCBvZiBsaXN0IGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHRoZSBsaXN0IGNvbnRlbnQgaXMuCisgICAgTGF0ZXIgb24gd2UgbWF5IGFkZCBtb3JlIGF0dHJpYnV0ZXMgaGVyZS4KKyAgICAiIiIKKyAgICBOVUxMID0gIm51bGwiCisgICAgTlVNQkVSUyA9ICJudW1iZXJzIgorICAgIFNUUklOR1MgPSAic3RyaW5ncyIKKyAgICBQRVJDRU5UID0gInBlcmNlbnRhZ2UiCisgICAgU0laRSA9ICJzaXplIgorICAgIFVOS05PV04gPSAidW5rbm93biIKKworCitkZWYgZ2V0X2xvZ19yb290X2RpcigpOgorICAgIG1heF9kZXB0aCA9IDUKKyAgICBwYXJlbnRfZGlyID0gJy4uLycKKyAgICBmb3IgbnVtYmVyIGluIHJhbmdlKDAsIG1heF9kZXB0aCk6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc3lzLnBhdGhbMF0gKyBvcy5zZXAgKyAob3MucGFyZGlyICsgb3Muc2VwKSpudW1iZXIgKyAnbG9nJyk6CisgICAgICAgICAgICBsb2dfcm9vdF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0gKyBvcy5zZXAgKyAob3MucGFyZGlyICsgb3Muc2VwKSpudW1iZXIgKyAnbG9nJykKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICBpZiBudW1iZXIgPT0gKG1heF9kZXB0aCAtIDEpOgorICAgICAgICBwcmludCAnTm8gbG9nIGRpciBmb3VuZC4gUGxlYXNlIGNoZWNrJworICAgICAgICByYWlzZSBFeGNlcHRpb24KKworICAgIHJldHVybiBsb2dfcm9vdF9kaXIKKworCitkZWYgbWtkaXJfcChkaXIpOgorICAgIHRyeToKKyAgICAgICAgb3MubWFrZWRpcnMoZGlyKQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVFWElTVCBhbmQgb3MucGF0aC5pc2RpcihkaXIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UKKworCitkZWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCk6CisgICAgIiIiCisgICAgVG8gZGV0ZXJtaW5lIHRoZSBsaXN0IGNvbnRlbnQKKyAgICAiIiIKKyAgICBpZiBub3QgdGVzdGxpc3Q6CisgICAgICAgIHJldHVybiBMaXN0YXR0ci5OVUxMCisgICAgbGlzdHRlc3QgPSB0ZXN0bGlzdFs6XQorICAgIHRyeToKKyAgICAgICAgbGlzdHRlc3QucmVtb3ZlKCcnKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgcGF0dGVybl9wZXJjZW50ID0gcmUuY29tcGlsZShyIl4oWzAtOV0pKyhcLik/KFswLTldKSolJCIpCisgICAgcGF0dGVybl9zaXplID0gcmUuY29tcGlsZShyIl4oWzAtOV0pKyhcLik/KFswLTldKSooICkqKEspKihNKSooRykqQiQiKQorICAgIHBhdHRlcm5fbnVtYmVyID0gcmUuY29tcGlsZShyIl4oWzAtOV0pKyhcLik/KFswLTldKSokIikKKyAgICBkZWYgZ2V0X3BhdHRlcm5lZF9udW1iZXIocGF0dGVybiwgdGxpc3QpOgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIGl0ZW0gaW4gdGxpc3Q6CisgICAgICAgICAgICBpZiByZS5zZWFyY2gocGF0dGVybiwgaXRlbSk6CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICByZXR1cm4gY291bnQKKyAgICBpZiBnZXRfcGF0dGVybmVkX251bWJlcihwYXR0ZXJuX3BlcmNlbnQsIGxpc3R0ZXN0KSA9PSBsZW4obGlzdHRlc3QpOgorICAgICAgICByZXR1cm4gTGlzdGF0dHIuUEVSQ0VOVAorICAgIGVsaWYgZ2V0X3BhdHRlcm5lZF9udW1iZXIocGF0dGVybl9zaXplLCBsaXN0dGVzdCkgPT0gbGVuKGxpc3R0ZXN0KToKKyAgICAgICAgcmV0dXJuIExpc3RhdHRyLlNJWkUKKyAgICBlbGlmIGdldF9wYXR0ZXJuZWRfbnVtYmVyKHBhdHRlcm5fbnVtYmVyLCBsaXN0dGVzdCkgPT0gbGVuKGxpc3R0ZXN0KToKKyAgICAgICAgcmV0dXJuIExpc3RhdHRyLk5VTUJFUlMKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTGlzdGF0dHIuU1RSSU5HUworCisKK2RlZiBpc19saXN0X3NlcXVlbmNlZCh0ZXN0bGlzdCk6CisgICAgIiIiCisgICAgRnVuY3Rpb24gdG8gdGVsbCBpZiBsaXN0IGlzIHNlcXVlbmNlZAorICAgIEN1cnJlbnRseSB3ZSBtYXkgaGF2ZSBsaXN0IG1hZGUgdXAgb2Y6IFN0cmluZ3MgOyBudW1iZXJzIDsgcGVyY2VudGFnZSA7IHRpbWU7IHNpemUKKyAgICBFYWNoIGhhcyByZXNwZWN0aXZlIHdheSB0byBkZXRlcm1pbmUgaWYgaXQncyBzZXF1ZW5jZWQuCisgICAgIiIiCisgICAgdGVzdF9saXN0ID0gdGVzdGxpc3RbOl0KKyAgICB0cnk6CisgICAgICAgIHRlc3RfbGlzdC5yZW1vdmUoJycpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKworICAgIGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLk5VTEwgOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZWxpZiBnZXRfbGlzdF9hdHRyKHRlc3RsaXN0KSA9PSBMaXN0YXR0ci5TVFJJTkdTIDoKKyAgICAgICAgcmV0dXJuIChzb3J0ZWQodGVzdF9saXN0KSA9PSB0ZXN0X2xpc3QpCisKKyAgICBlbGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLk5VTUJFUlMgOgorICAgICAgICBsaXN0X251bWJlciA9IFtdCisgICAgICAgIGZvciBpdGVtIGluIHRlc3RfbGlzdDoKKyAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZChldmFsKGl0ZW0pKQorICAgICAgICByZXR1cm4gKHNvcnRlZChsaXN0X251bWJlcikgPT0gbGlzdF9udW1iZXIpCisKKyAgICBlbGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLlBFUkNFTlQgOgorICAgICAgICBsaXN0X251bWJlciA9IFtdCisgICAgICAgIGZvciBpdGVtIGluIHRlc3RfbGlzdDoKKyAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZChldmFsKGl0ZW0uc3RyaXAoJyUnKSkpCisgICAgICAgIHJldHVybiAoc29ydGVkKGxpc3RfbnVtYmVyKSA9PSBsaXN0X251bWJlcikKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuU0laRSA6CisgICAgICAgIGxpc3RfbnVtYmVyID0gW10KKyAgICAgICAgIyBjdXJyZW50bHkgU0laRSBpcyBzcGxpdHRlZCBieSBzcGFjZQorICAgICAgICBmb3IgaXRlbSBpbiB0ZXN0X2xpc3Q6CisgICAgICAgICAgICBpZiBpdGVtLnNwbGl0KClbMV0udXBwZXIoKSA9PSAiS0IiOgorICAgICAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZCgxMDI0ICogZXZhbChpdGVtLnNwbGl0KClbMF0pKQorICAgICAgICAgICAgZWxpZiBpdGVtLnNwbGl0KClbMV0udXBwZXIoKSA9PSAiTUIiOgorICAgICAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZCgxMDI0ICogMTAyNCAqIGV2YWwoaXRlbS5zcGxpdCgpWzBdKSkKKyAgICAgICAgICAgIGVsaWYgaXRlbS5zcGxpdCgpWzFdLnVwcGVyKCkgPT0gIkdCIjoKKyAgICAgICAgICAgICAgICBsaXN0X251bWJlci5hcHBlbmQoMTAyNCAqIDEwMjQgKiAxMDI0ICogZXZhbChpdGVtLnNwbGl0KClbMF0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaXN0X251bWJlci5hcHBlbmQoZXZhbChpdGVtLnNwbGl0KClbMF0pKQorICAgICAgICByZXR1cm4gKHNvcnRlZChsaXN0X251bWJlcikgPT0gbGlzdF9udW1iZXIpCisKKyAgICBlbHNlOgorICAgICAgICBwcmludCAnVW5yZWNvZ25pemVkIGxpc3QgdHlwZSwgcGxlYXNlIGNoZWNrJworICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgaXNfbGlzdF9pbnZlcnRlZCh0ZXN0bGlzdCk6CisgICAgIiIiCisgICAgRnVuY3Rpb24gdG8gdGVsbCBpZiBsaXN0IGlzIGludmVydGVkCisgICAgQ3VycmVudGx5IHdlIG1heSBoYXZlIGxpc3QgbWFkZSB1cCBvZjogU3RyaW5ncyA7IG51bWJlcnMgOyBwZXJjZW50YWdlIDsgdGltZTsgc2l6ZQorICAgIEVhY2ggaGFzIHJlc3BlY3RpdmUgd2F5IHRvIGRldGVybWluZSBpZiBpdCdzIGludmVydGVkLgorICAgICIiIgorICAgIHRlc3RfbGlzdCA9IHRlc3RsaXN0WzpdCisgICAgdHJ5OgorICAgICAgICB0ZXN0X2xpc3QucmVtb3ZlKCcnKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwYXNzCisKKyAgICBpZiBnZXRfbGlzdF9hdHRyKHRlc3RsaXN0KSA9PSBMaXN0YXR0ci5OVUxMIDoKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuU1RSSU5HUyA6CisgICAgICAgIHJldHVybiAoc29ydGVkKHRlc3RfbGlzdCwgcmV2ZXJzZSA9IFRydWUpID09IHRlc3RfbGlzdCkKKworICAgIGVsaWYgZ2V0X2xpc3RfYXR0cih0ZXN0bGlzdCkgPT0gTGlzdGF0dHIuTlVNQkVSUyA6CisgICAgICAgIGxpc3RfbnVtYmVyID0gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gdGVzdF9saXN0OgorICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKGV2YWwoaXRlbSkpCisgICAgICAgIHJldHVybiAoc29ydGVkKGxpc3RfbnVtYmVyLCByZXZlcnNlID0gVHJ1ZSkgPT0gbGlzdF9udW1iZXIpCisKKyAgICBlbGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLlBFUkNFTlQgOgorICAgICAgICBsaXN0X251bWJlciA9IFtdCisgICAgICAgIGZvciBpdGVtIGluIHRlc3RfbGlzdDoKKyAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZChldmFsKGl0ZW0uc3RyaXAoJyUnKSkpCisgICAgICAgIHJldHVybiAoc29ydGVkKGxpc3RfbnVtYmVyLCByZXZlcnNlID0gVHJ1ZSkgPT0gbGlzdF9udW1iZXIpCisKKyAgICBlbGlmIGdldF9saXN0X2F0dHIodGVzdGxpc3QpID09IExpc3RhdHRyLlNJWkUgOgorICAgICAgICBsaXN0X251bWJlciA9IFtdCisgICAgICAgICMgY3VycmVudGx5IFNJWkUgaXMgc3BsaXR0ZWQgYnkgc3BhY2UuIHN1Y2ggYXMgMCBCOyAxIEtCOyAyIE1CCisgICAgICAgIGZvciBpdGVtIGluIHRlc3RfbGlzdDoKKyAgICAgICAgICAgIGlmIGl0ZW0uc3BsaXQoKVsxXS51cHBlcigpID09ICJLQiI6CisgICAgICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKDEwMjQgKiBldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgICAgICBlbGlmIGl0ZW0uc3BsaXQoKVsxXS51cHBlcigpID09ICJNQiI6CisgICAgICAgICAgICAgICAgbGlzdF9udW1iZXIuYXBwZW5kKDEwMjQgKiAxMDI0ICogZXZhbChpdGVtLnNwbGl0KClbMF0pKQorICAgICAgICAgICAgZWxpZiBpdGVtLnNwbGl0KClbMV0udXBwZXIoKSA9PSAiR0IiOgorICAgICAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZCgxMDI0ICogMTAyNCAqIDEwMjQgKiBldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpc3RfbnVtYmVyLmFwcGVuZChldmFsKGl0ZW0uc3BsaXQoKVswXSkpCisgICAgICAgIHJldHVybiAoc29ydGVkKGxpc3RfbnVtYmVyLCByZXZlcnNlID0gVHJ1ZSkgPT0gbGlzdF9udW1iZXIpCisKKyAgICBlbHNlOgorICAgICAgICBwcmludCAnVW5yZWNvZ25pemVkIGxpc3QgdHlwZSwgcGxlYXNlIGNoZWNrJworICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIHJlcGxhY2VfZmlsZV9jb250ZW50KGZpbGVuYW1lLCBpdGVtLCBvcHRpb24pOgorICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgIGYuY2xvc2UoKQorICAgIG91dHB1dCA9IG9wZW4oZmlsZW5hbWUsICd3JykKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKGl0ZW0pOgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKGl0ZW0gKyAiID0gJyIgKyBvcHRpb24gKyAiJ1xuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShsaW5lKQorICAgIG91dHB1dC5jbG9zZSgpCisKK2RlZiBleHRyYWN0X251bWJlcl9mcm9tX3N0cmluZyhzKToKKyAgICAiIiIKKyAgICBleHRyYWN0IHRoZSBudW1iZXJzIGluIGEgc3RyaW5nLiByZXR1cm4gdHlwZSBpcyAnbGlzdCcKKyAgICAiIiIKKyAgICByZXR1cm4gcmUuZmluZGFsbChyJyhbMC05XSspJywgcykKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgUEFSVCBJSTogYmFzZSBjbGFzcyAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgdG9hc3Rlcl9jYXNlc19iYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zY3JlZW5zaG90X3NlcXVlbmNlID0gMQorICAgICAgICBzZWxmLnZlcmlmaWNhdGlvbkVycm9ycyA9IFtdCisgICAgICAgIHNlbGYuYWNjZXB0X25leHRfYWxlcnQgPSBUcnVlCisgICAgICAgIHNlbGYuaG9zdF9vcyA9IHBsYXRmb3JtLnN5c3RlbSgpLmxvd2VyKCkKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBDb25maWdQYXJzZXIuU2FmZUNvbmZpZ1BhcnNlcigpCisgICAgICAgIGNvbmZpZ3MgPSBzZWxmLnBhcnNlci5yZWFkKCd0b2FzdGVyX3Rlc3QuY2ZnJykKKyAgICAgICAgc2VsZi5iYXNlX3VybCA9IGV2YWwoc2VsZi5wYXJzZXIuZ2V0KCd0b2FzdGVyX3Rlc3RfJyArIHNlbGYuaG9zdF9vcywgJ3RvYXN0ZXJfdXJsJykpCisKKyAgICAgICAgIyBjcmVhdGUgbG9nIGRpciAuIEN1cnJlbnRseSAsIHdlIHB1dCBsb2cgZmlsZXMgaW4gbG9nL3RtcC4gQWZ0ZXIgYWxsCisgICAgICAgICMgdGVzdCBjYXNlcyBhcmUgZG9uZSwgbW92ZSB0aGVtIHRvIGxvZy8kZGF0ZXRpbWUgZGlyCisgICAgICAgIHNlbGYubG9nX3RtcF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pICsgb3Muc2VwICsgJ2xvZycgKyBvcy5zZXAgKyAndG1wJworICAgICAgICB0cnk6CisgICAgICAgICAgICBta2Rpcl9wKHNlbGYubG9nX3RtcF9kaXIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIDoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIiUoYXNjdGltZSlzIENhbm5vdCBjcmVhdGUgdG1wIGRpciB1bmRlciBsb2csIHBsZWFzZSBjaGVjayB5b3VyIHByaXZpbGVnZSIpCisgICAgICAgIHNlbGYubG9nID0gc2VsZi5sb2dnZXJfY3JlYXRlKCkKKyAgICAgICAgIyBkcml2ZXIgc2V0dXAKKyAgICAgICAgc2VsZi5zZXR1cF9icm93c2VyKCkKKworICAgIGRlZiBsb2dnZXJfY3JlYXRlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgd2UgdXNlIHJvb3QgbG9nZ2VyIGZvciBldmVyeSB0ZXN0Y2FzZS4KKyAgICAgICAgVGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3QgdXNlIFRPQVNURVJYWFhfbG9nZ2VyIGlzIHRvIGF2b2lkIHNldHRpbmcgcmVzcGVjdGl2ZSBsZXZlbCBmb3IKKyAgICAgICAgcm9vdCBsb2dnZXIgYW5kIFRPQVNURVJYWFhfbG9nZ2VyCisgICAgICAgIFRvIEJlIERpc2N1c3NlZAorICAgICAgICAiIiIKKyAgICAgICAgbG9nX2xldmVsX2RpY3QgPSB7J0NSSVRJQ0FMJzpsb2dnaW5nLkNSSVRJQ0FMLCAnRVJST1InOmxvZ2dpbmcuRVJST1IsICdXQVJOSU5HJzpsb2dnaW5nLldBUk5JTkcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lORk8nOmxvZ2dpbmcuSU5GTywgJ0RFQlVHJzpsb2dnaW5nLkRFQlVHLCAnTk9UU0VUJzpsb2dnaW5nLk5PVFNFVH0KKyAgICAgICAgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorIyAgICAgICAgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ1RPQVNURVJfJyArIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmxvZ2dpbmdfbGV2ZWwgPSBldmFsKHNlbGYucGFyc2VyLmdldCgndG9hc3Rlcl90ZXN0XycgKyBzZWxmLmhvc3Rfb3MsICdsb2dnaW5nX2xldmVsJykpCisgICAgICAgIGtleSA9IHNlbGYubG9nZ2luZ19sZXZlbC51cHBlcigpCisgICAgICAgIGxvZy5zZXRMZXZlbChsb2dfbGV2ZWxfZGljdFtrZXldKQorICAgICAgICBmaCA9IGxvZ2dpbmcuRmlsZUhhbmRsZXIoZmlsZW5hbWU9c2VsZi5sb2dfdG1wX2RpciArIG9zLnNlcCArICdjYXNlX2FsbCcgKyAnLmxvZycsIG1vZGU9J2EnKQorICAgICAgICBjaCA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgICAgICBmb3JtYXR0ZXIgPSBsb2dnaW5nLkZvcm1hdHRlcignJShwYXRobmFtZSlzIC0gJShsaW5lbm8pZCAtICUoYXNjdGltZSlzIFxuICBcCisgICAgICAgICAgICAgJShuYW1lKXMgLSAlKGxldmVsbmFtZSlzIC0gJShtZXNzYWdlKXMnKQorICAgICAgICBmaC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICAgICAgICBjaC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICAgICAgICBsb2cuYWRkSGFuZGxlcihmaCkKKyAgICAgICAgbG9nLmFkZEhhbmRsZXIoY2gpCisgICAgICAgIHJldHVybiBsb2cKKworCisgICAgZGVmIHNldHVwX2Jyb3dzZXIoc2VsZiwgKmJyb3dzZXJfcGF0aCk6CisgICAgICAgIHNlbGYuYnJvd3NlciA9IGV2YWwoc2VsZi5wYXJzZXIuZ2V0KCd0b2FzdGVyX3Rlc3RfJyArIHNlbGYuaG9zdF9vcywgJ3Rlc3RfYnJvd3NlcicpKQorICAgICAgICBwcmludCBzZWxmLmJyb3dzZXIKKyAgICAgICAgaWYgc2VsZi5icm93c2VyID09ICJmaXJlZm94IjoKKyAgICAgICAgICAgIGRyaXZlciA9IHdlYmRyaXZlci5GaXJlZm94KCkKKyAgICAgICAgZWxpZiBzZWxmLmJyb3dzZXIgPT0gImNocm9tZSI6CisgICAgICAgICAgICBkcml2ZXIgPSB3ZWJkcml2ZXIuQ2hyb21lKCkKKyAgICAgICAgZWxpZiBzZWxmLmJyb3dzZXIgPT0gImllIjoKKyAgICAgICAgICAgIGRyaXZlciA9IHdlYmRyaXZlci5JZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkcml2ZXIgPSBOb25lCisgICAgICAgICAgICBwcmludCAidW5yZWNvZ25pemVkIGJyb3dzZXIgdHlwZSwgcGxlYXNlIGNoZWNrIgorICAgICAgICBzZWxmLmRyaXZlciA9IGRyaXZlcgorICAgICAgICBzZWxmLmRyaXZlci5pbXBsaWNpdGx5X3dhaXQoMzApCisgICAgICAgIHJldHVybiBzZWxmLmRyaXZlcgorCisKKyAgICBkZWYgc2F2ZV9zY3JlZW5zaG90KHNlbGYsICAqKmxvZ19hcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzYXZlIHNjcmVlbiBlaXRoZXIgYnkgb3MgaW50ZXJmYWNlIG9yIHNlbGVuaXVtIGludGVyZmFjZS4KKyAgICAgICAgSG93IHRvIHVzZToKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlID0gJ25hdGl2ZScvJ3NlbGVuaXVtJywgbG9nX3N1Yl9kaXIgPSAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25hbWUgPSAnc3RlcHgnKQorICAgICAgICB3aGVyZSBuYXRpdmUgbWVhbnMgc2NyZWVuc2hvdCBmdW5jIHByb3ZpZGVkIGJ5IE9TLAorICAgICAgICBzZWxlbml1bSBtZWFucyBzY3JlZW5zaG90IGZ1bmMgcHJvdmlkZWQgYnkgc2VsZW5pdW0gd2ViZHJpdmVyCisgICAgICAgICIiIgorICAgICAgICB0eXBlcyA9IFtsb2dfYXJncy5nZXQoJ3NjcmVlbnNob3RfdHlwZScpXQorICAgICAgICAjIHdoZW4gbm8gc2NyZWVuc2hvdF90eXBlIGlzIHNwZWNpZmllZAorICAgICAgICBpZiB0eXBlcyA9PSBbTm9uZV06CisgICAgICAgICAgICB0eXBlcyA9IFsnbmF0aXZlJywgJ3NlbGVuaXVtJ10KKyAgICAgICAgIyBub3JtYWxseSBhcHBlbmRfbmFtZSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3RlcC4uCisgICAgICAgIGFkZF9uYW1lID0gbG9nX2FyZ3MuZ2V0KCdhcHBlbmRfbmFtZScpCisgICAgICAgIGlmIG5vdCBhZGRfbmFtZToKKyAgICAgICAgICAgIGFkZF9uYW1lID0gJy0nCisgICAgICAgICMgbm9ybWFsbHkgdGhlcmUncyBubyBuZWVkIHRvIHNwZWNpZnkgc3ViX2RpcgorICAgICAgICBzdWJfZGlyID0gbG9nX2FyZ3MuZ2V0KCdsb2dfc3ViX2RpcicpCisgICAgICAgIGlmIG5vdCBzdWJfZGlyOgorICAgICAgICAgICAgIyB1c2UgY2FzZXh4eCBhcyBzdWJfZGlyIG5hbWUKKyAgICAgICAgICAgIHN1Yl9kaXIgPSAnY2FzZScgKyBzdHIoc2VsZi5jYXNlX25vKQorICAgICAgICBmb3IgaXRlbSBpbiB0eXBlczoKKyAgICAgICAgICAgIGxvZ19kaXIgPSBzZWxmLmxvZ190bXBfZGlyICsgb3Muc2VwICsgc3ViX2RpcgorICAgICAgICAgICAgbWtkaXJfcChsb2dfZGlyKQorICAgICAgICAgICAgbG9nX3BhdGggPSBsb2dfZGlyICsgb3Muc2VwICsgIHNlbGYuYnJvd3NlciArICctJyArXAorICAgICAgICAgICAgICAgICAgICBpdGVtICsgJy0nICsgYWRkX25hbWUgKyAnLScgKyBzdHIoc2VsZi5zY3JlZW5zaG90X3NlcXVlbmNlKSArICcucG5nJworICAgICAgICAgICAgaWYgaXRlbSA9PSAnbmF0aXZlJzoKKyAgICAgICAgICAgICAgICBvcy5zeXN0ZW0oInNjcm90ICIgKyBsb2dfcGF0aCkKKyAgICAgICAgICAgIGVsaWYgaXRlbSA9PSAnc2VsZW5pdW0nOgorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmdldF9zY3JlZW5zaG90X2FzX2ZpbGUobG9nX3BhdGgpCisgICAgICAgICAgICBzZWxmLnNjcmVlbnNob3Rfc2VxdWVuY2UgKz0gMQorCisgICAgZGVmIGJyb3dzZXJfZGVsYXkoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBjdXJyZW50bHkgdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHNvbWUgY2hyb21lIHRlc3QuCisgICAgICAgIFNvbWV0aW1lcyB3ZSBuZWVkIGEgZGVsYXkgdG8gYWNjb21wbGlzaCBzb21lIG9wZXJhdGlvbi4KKyAgICAgICAgQnV0IGZvciBmaXJlZm94LCBtb3N0bHkgd2UgZG9uJ3QgbmVlZCB0aGlzLgorICAgICAgICBUbyBiZSBkaXNjdXNzZWQKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuYnJvd3NlciA9PSAiY2hyb21lIjoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgcmV0dXJuCisKKworIyB0aGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBjb250YWluZWQgaW4gV2ViRHJpdmVyIGNsYXNzLi4KKyAgICBkZWYgZmluZF9lbGVtZW50X2J5X3RleHQoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW3RleHQoKT0nIiArIHN0cmluZyArICInXSIpCisKKworICAgIGRlZiBmaW5kX2VsZW1lbnRzX2J5X3RleHQoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi8vKlt0ZXh0KCk9JyIgKyBzdHJpbmcgKyAiJ10iKQorCisKKyAgICBkZWYgZmluZF9lbGVtZW50X2J5X3RleHRfaW5fdGFibGUoc2VsZiwgdGFibGVfaWQsIHRleHRfc3RyaW5nKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgaXMgdXNlZCB0byBzZWFyY2ggc29tZSBjZXJ0YWluICd0ZXh0JyBpbiBjZXJ0YWluIHRhYmxlCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJsZV9lbGVtZW50ID0gc2VsZi5nZXRfdGFibGVfZWxlbWVudCh0YWJsZV9pZCkKKyAgICAgICAgICAgIGVsZW1lbnQgPSB0YWJsZV9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW3RleHQoKT0nIiArIHRleHRfc3RyaW5nICsgIiddIikKKyAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAnbm8gZWxlbWVudCBmb3VuZCcKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBlbGVtZW50CisKKworICAgIGRlZiBmaW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYsIHRhYmxlX2lkLCBsaW5rX3RleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgQXNzdW1lIHRoZXJlJ3JlIG11bHRpcGxlIHN1aXRhYmxlICJmaW5kX2VsZW1lbnRfYnlfbGlua190ZXh0Ii4KKyAgICAgICAgSW4gdGhpcyBjaXJjdW1zdGFuY2Ugd2UgbmVlZCB0byBzcGVjaWZ5ICJ0YWJsZSIuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJsZV9lbGVtZW50ID0gc2VsZi5nZXRfdGFibGVfZWxlbWVudCh0YWJsZV9pZCkKKyAgICAgICAgICAgIGVsZW1lbnQgPSB0YWJsZV9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQobGlua190ZXh0KQorICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICdubyBlbGVtZW50IGZvdW5kJworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQKKworCisgICAgZGVmIGZpbmRfZWxlbWVudHNfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYsIHRhYmxlX2lkLCBsaW5rX3RleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VhcmNoIGxpbmstdGV4dCBpbiBjZXJ0YWluIHRhYmxlLiBUaGlzIGhlbHBzIHRvIG5hcnJvdyBkb3duIHNlYXJjaCBhcmVhLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFibGVfZWxlbWVudCA9IHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQodGFibGVfaWQpCisgICAgICAgICAgICBlbGVtZW50X2xpc3QgPSB0YWJsZV9lbGVtZW50LmZpbmRfZWxlbWVudHNfYnlfbGlua190ZXh0KGxpbmtfdGV4dCkKKyAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAnbm8gZWxlbWVudCBmb3VuZCcKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBlbGVtZW50X2xpc3QKKworCisgICAgZGVmIGZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLCB0YWJsZV9pZCwgbGlua190ZXh0KToKKyAgICAgICAgIiIiCisgICAgICAgIFNlYXJjaCBlbGVtZW50IGJ5IHBhcnRpYWwgbGluayB0ZXh0IGluIGNlcnRhaW4gdGFibGUuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJsZV9lbGVtZW50ID0gc2VsZi5nZXRfdGFibGVfZWxlbWVudCh0YWJsZV9pZCkKKyAgICAgICAgICAgIGVsZW1lbnQgPSB0YWJsZV9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dChsaW5rX3RleHQpCisgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICdubyBlbGVtZW50IGZvdW5kJworICAgICAgICAgICAgcmFpc2UKKworCisgICAgZGVmIGZpbmRfZWxlbWVudHNfYnlfcGFydGlhbF9saW5rX3RleHRfaW5fdGFibGUoc2VsZiwgdGFibGVfaWQsIGxpbmtfdGV4dCk6CisgICAgICAgICIiIgorICAgICAgICBBc3N1bWUgdGhlcmUncmUgbXVsdGlwbGUgc3VpdGFibGUgImZpbmRfcGFydGlhbF9lbGVtZW50X2J5X2xpbmtfdGV4dCIuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJsZV9lbGVtZW50ID0gc2VsZi5nZXRfdGFibGVfZWxlbWVudCh0YWJsZV9pZCkKKyAgICAgICAgICAgIGVsZW1lbnRfbGlzdCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50c19ieV9wYXJ0aWFsX2xpbmtfdGV4dChsaW5rX3RleHQpCisgICAgICAgICAgICByZXR1cm4gZWxlbWVudF9saXN0CisgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgJ25vIGVsZW1lbnQgZm91bmQnCisgICAgICAgICAgICByYWlzZQorCisKKyAgICBkZWYgZmluZF9lbGVtZW50X2J5X3hwYXRoX2luX3RhYmxlKHNlbGYsIHRhYmxlX2lkLCB4cGF0aCk6CisgICAgICAgICIiIgorICAgICAgICBUaGlzIGhlbHBzIHRvIG5hcnJvdyBkb3duIHNlYXJjaCBhcmVhLiBFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGRlYWxpbmcgd2l0aCBwb3AtdXAgZm9ybS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYmxlX2VsZW1lbnQgPSBzZWxmLmdldF90YWJsZV9lbGVtZW50KHRhYmxlX2lkKQorICAgICAgICAgICAgZWxlbWVudCA9IHRhYmxlX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoKQorICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICdubyBlbGVtZW50IGZvdW5kJworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQKKworCisgICAgZGVmIGZpbmRfZWxlbWVudHNfYnlfeHBhdGhfaW5fdGFibGUoc2VsZiwgdGFibGVfaWQsIHhwYXRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgaGVscHMgdG8gbmFycm93IGRvd24gc2VhcmNoIGFyZWEuIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIHBvcC11cCBmb3JtLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFibGVfZWxlbWVudCA9IHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQodGFibGVfaWQpCisgICAgICAgICAgICBlbGVtZW50X2xpc3QgPSB0YWJsZV9lbGVtZW50LmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoeHBhdGgpCisgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcHJpbnQgJ25vIGVsZW1lbnRzIGZvdW5kJworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRfbGlzdAorCisKKyAgICBkZWYgc2hvcnRlc3RfeHBhdGgoc2VsZiwgcG5hbWUsIHB2YWx1ZSk6CisgICAgICAgIHJldHVybiAiLy8qW0AiICsgcG5hbWUgKyAiPSciICsgcHZhbHVlICsgIiddIgorCisKKyN1c3VhbGx5IGVsZW1lbnRzIGluIHRoZSBzYW1lIGNvbHVtbiBhcmUgd2l0aCBzYW1lIGNsYXNzIG5hbWUuIGZvciBpbnN0YW5jZTogY2xhc3M9Im91dGNvbWUiIC5UQkQKKyAgICBkZWYgZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KHNlbGYsIGF0dHJfbmFtZSwgYXR0cl92YWx1ZSk6CisgICAgICAgIGNfeHBhdGggPSBzZWxmLnNob3J0ZXN0X3hwYXRoKGF0dHJfbmFtZSwgYXR0cl92YWx1ZSkKKyAgICAgICAgZWxlbWVudHMgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKGNfeHBhdGgpCisgICAgICAgIGNfbGlzdCA9IFtdCisgICAgICAgIGZvciBlbGVtZW50IGluIGVsZW1lbnRzOgorICAgICAgICAgICAgY19saXN0LmFwcGVuZChlbGVtZW50LnRleHQpCisgICAgICAgIHJldHVybiBjX2xpc3QKKworCisgICAgZGVmIGdldF90YWJsZV9jb2x1bW5fdGV4dF9ieV9jb2x1bW5fbnVtYmVyKHNlbGYsIHRhYmxlX2lkLCBjb2x1bW5fbnVtYmVyKToKKyAgICAgICAgY194cGF0aCA9ICIvLypbQGlkPSciICsgdGFibGVfaWQgKyAiJ10vL3RkWyIgKyBzdHIoY29sdW1uX251bWJlcikgKyAiXSIKKyAgICAgICAgZWxlbWVudHMgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKGNfeHBhdGgpCisgICAgICAgIGNfbGlzdCA9IFtdCisgICAgICAgIGZvciBlbGVtZW50IGluIGVsZW1lbnRzOgorICAgICAgICAgICAgY19saXN0LmFwcGVuZChlbGVtZW50LnRleHQpCisgICAgICAgIHJldHVybiBjX2xpc3QKKworCisgICAgZGVmIGdldF90YWJsZV9oZWFkX3RleHQoc2VsZiwgKnRhYmxlX2lkKToKKyNub3cgdGFibGVfaWQgaXMgYSB0dXBsZS4uLgorICAgICAgICBpZiB0YWJsZV9pZDoKKyAgICAgICAgICAgIHRoZWFkX3hwYXRoID0gIi8vKltAaWQ9JyIgKyB0YWJsZV9pZFswXSArICInXS8vdGhlYWQvL3RoW3RleHQoKV0iCisgICAgICAgICAgICBlbGVtZW50cyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgodGhlYWRfeHBhdGgpCisgICAgICAgICAgICBjX2xpc3QgPSBbXQorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gZWxlbWVudHM6CisgICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgorICAgICAgICAgICAgICAgICAgICBjX2xpc3QuYXBwZW5kKGVsZW1lbnQudGV4dCkKKyAgICAgICAgICAgIHJldHVybiBjX2xpc3QKKyNkZWZhdWx0IHRhYmxlIG9uIHBhZ2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKi90YWJsZS90aGVhZCIpLnRleHQKKworCisKKyAgICBkZWYgZ2V0X3RhYmxlX2VsZW1lbnQoc2VsZiwgdGFibGVfaWQsICpjb29yZGluYXRlKToKKyAgICAgICAgaWYgbGVuKGNvb3JkaW5hdGUpID09IDA6CisjcmV0dXJuIHdob2xlLXRhYmxlIGVsZW1lbnQKKyAgICAgICAgICAgIGVsZW1lbnRfeHBhdGggPSAiLy8qW0BpZD0nIiArIHRhYmxlX2lkICsgIiddIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoZWxlbWVudF94cGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZXR1cm4gZWxlbWVudAorICAgICAgICByb3cgPSBjb29yZGluYXRlWzBdCisKKyAgICAgICAgaWYgbGVuKGNvb3JkaW5hdGUpID09IDE6CisjcmV0dXJuIHdob2xlLXJvdyBlbGVtZW50CisgICAgICAgICAgICBlbGVtZW50X3hwYXRoID0gIi8vKltAaWQ9JyIgKyB0YWJsZV9pZCArICInXS90Ym9keS90clsiICsgc3RyKHJvdykgKyAiXSIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKGVsZW1lbnRfeHBhdGgpCisgICAgICAgICAgICBleGNlcHQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50Cisjbm93IHdlIGFyZSBsb29raW5nIGZvciBhbiBlbGVtZW50IHdpdGggc3BlY2lmaWVkIFggYW5kIFkKKyAgICAgICAgY29sdW1uID0gY29vcmRpbmF0ZVsxXQorCisgICAgICAgIGVsZW1lbnRfeHBhdGggPSAiLy8qW0BpZD0nIiArIHRhYmxlX2lkICsgIiddL3Rib2R5L3RyWyIgKyBzdHIocm93KSArICJdL3RkWyIgKyBzdHIoY29sdW1uKSArICJdIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKGVsZW1lbnRfeHBhdGgpCisgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBlbGVtZW50CisKKworICAgIGRlZiBnZXRfdGFibGVfZGF0YShzZWxmLCB0YWJsZV9pZCwgcm93X2NvdW50LCBjb2x1bW5fY291bnQpOgorICAgICAgICByb3cgPSAxCisgICAgICAgIExpc3RzID0gW10KKyAgICAgICAgd2hpbGUgcm93IDw9IHJvd19jb3VudDoKKyAgICAgICAgICAgIGNvbHVtbiA9IDEKKyAgICAgICAgICAgIHJvd19jb250ZW50PVtdCisgICAgICAgICAgICB3aGlsZSBjb2x1bW4gPD0gY29sdW1uX2NvdW50OgorICAgICAgICAgICAgICAgIHM9ICIvLypbQGlkPSciICsgdGFibGVfaWQgKyAiJ10vdGJvZHkvdHJbIiArIHN0cihyb3cpICsiXS90ZFsiICsgc3RyKGNvbHVtbikgKyAiXSIKKyAgICAgICAgICAgICAgICB2ID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHMpLnRleHQKKyAgICAgICAgICAgICAgICByb3dfY29udGVudC5hcHBlbmQodikKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBjb2x1bW4gKyAxCisgICAgICAgICAgICAgICAgcHJpbnQoInJvd19jb250ZW50PSIscm93X2NvbnRlbnQpCisgICAgICAgICAgICBMaXN0cy5leHRlbmQocm93X2NvbnRlbnQpCisgICAgICAgICAgICBwcmludCBMaXN0c1tyb3ctMV1bMF0KKyAgICAgICAgICAgIHJvdyA9IHJvdyArIDEKKyAgICAgICAgcmV0dXJuIExpc3RzCisKKyAgICAjIFRoZSBpc194eHhfcHJlc2VudCBmdW5jdGlvbnMgb25seSByZXR1cm5zIFRydWUvRmFsc2UKKyAgICAjIEFsbCB0aGUgbG9nIHdvcmsgaXMgZG9uZSBpbiB0ZXN0IHByb2NlZHVyZSwgc28gd2UgY2FuIGVhc2lseSB0cmFjZSBiYWNrCisgICAgIyB1c2luZyBsb2dnaW5nCisgICAgZGVmIGlzX3RleHRfcHJlc2VudCAoc2VsZiwgcGF0dGVybnMpOgorICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgIGlmIHN0cihwYXR0ZXJuKSBub3QgaW4gc2VsZi5kcml2ZXIucGFnZV9zb3VyY2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKworICAgIGRlZiBpc19lbGVtZW50X3ByZXNlbnQoc2VsZiwgaG93LCB3aGF0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50KGhvdywgd2hhdCkKKyAgICAgICAgZXhjZXB0IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24sIGU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworCisgICAgZGVmIGlzX2FsZXJ0X3ByZXNlbnQoc2VsZik6CisgICAgICAgIHRyeTogc2VsZi5kcml2ZXIuc3dpdGNoX3RvX2FsZXJ0KCkKKyAgICAgICAgZXhjZXB0IE5vQWxlcnRQcmVzZW50RXhjZXB0aW9uLCBlOiByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworCisgICAgZGVmIGNsb3NlX2FsZXJ0X2FuZF9nZXRfaXRzX3RleHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFsZXJ0ID0gc2VsZi5kcml2ZXIuc3dpdGNoX3RvX2FsZXJ0KCkKKyAgICAgICAgICAgIGFsZXJ0X3RleHQgPSBhbGVydC50ZXh0CisgICAgICAgICAgICBpZiBzZWxmLmFjY2VwdF9uZXh0X2FsZXJ0OgorICAgICAgICAgICAgICAgIGFsZXJ0LmFjY2VwdCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFsZXJ0LmRpc21pc3MoKQorICAgICAgICAgICAgcmV0dXJuIGFsZXJ0X3RleHQKKyAgICAgICAgZmluYWxseTogc2VsZi5hY2NlcHRfbmV4dF9hbGVydCA9IFRydWUKKworCisgICAgZGVmIGdldF9jYXNlX251bWJlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHdoYXQgY2FzZSBhcmUgd2UgcnVubmluZyBub3cKKyAgICAgICAgIiIiCisgICAgICAgIGZ1bmNuYW1lID0gc3lzLl9nZXRmcmFtZSgxKS5mX2NvZGUuY29fbmFtZQorICAgICAgICBjYXNlbm9fc3RyID0gZnVuY25hbWUuc3RyaXAoJ3Rlc3RfJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FzZW5vID0gaW50KGNhc2Vub19zdHIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcHJpbnQgImdldCBjYXNlIG51bWJlciBlcnJvciEgcGxlYXNlIGNoZWNrIGlmIGZ1bmMgbmFtZSBpcyB0ZXN0X3h4eCIKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gY2FzZW5vCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIEVORDogQ0FTRSAlcyBsb2cgXG5cbicgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIucXVpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNlbGYudmVyaWZpY2F0aW9uRXJyb3JzKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgUEFSVCBJSUk6IHRlc3QgY2FzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgcGxlYXNlIHJlZmVyIHRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgaHR0cHM6Ly9idWd6aWxsYS55b2N0b3Byb2plY3Qub3JnL3RyX3Nob3dfY2FzZS5jZ2k/Y2FzZV9pZD14eHggICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBOb3RlOiB0byBjb21wbHkgd2l0aCB0aGUgdW5pdHRlc3QgZnJhbWV3b3JrLCB3ZSBjYWxsIHRoZXNlIHRlc3RfeHh4IGZ1bmN0aW9ucworIyBmcm9tIHJ1bl90b2FzdGVyY2FzZXMucHkgdG8gYXZvaWQgY2FsbGluZyBzZXRVcCgpIGFuZCB0ZWFyRG93bigpIG11bHRpcGxlIHRpbWVzCisKKworY2xhc3MgdG9hc3Rlcl9jYXNlcyh0b2FzdGVyX2Nhc2VzX2Jhc2UpOgorICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkwMSAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkwMShzZWxmKToKKyAgICAgICAgIyB0aGUgcmVhc29uIHdoeSBnZXRfY2FzZV9udW1iZXIgaXMgbm90IGluIHNldFVwIGZ1bmN0aW9uIGlzIHRoYXQKKyAgICAgICAgIyBvdGhlcndpc2UgaXQgcmV0dXJucyAic2V0VXAiIGluc3RlYWQgb2YgInRlc3RfeHh4IgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgIyBvcGVuIGFsbCBjb2x1bW5zCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBhZGRpbmcgZXhwbGljaXRseSB3YWl0IGZvciBjaHJvbWVkcml2ZXIuLi1fLQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInN0YXJ0ZWRfb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgidGltZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIGRpY3Q6IHtsaW50IHRleHQgbmFtZSA6IGFjdHVhbCBjbGFzcyBuYW1lfQorICAgICAgICB0YWJsZV9oZWFkX2RpY3QgPSB7J091dGNvbWUnOidvdXRjb21lJywgJ1JlY2lwZSc6J3RhcmdldCcsICdNYWNoaW5lJzonbWFjaGluZScsICdTdGFydGVkIG9uJzonc3RhcnRlZF9vbicsICdDb21wbGV0ZWQgb24nOidjb21wbGV0ZWRfb24nLCBcCisgICAgICAgICAgICAgICAgJ0Vycm9ycyc6J2Vycm9yc19ubycsICdXYXJuaW5ncyc6J3dhcm5pbmdzX25vJywgJ1RpbWUnOid0aW1lJ30KKyAgICAgICAgZm9yIGtleSBpbiB0YWJsZV9oZWFkX2RpY3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dChrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiVzIGNhbm5vdCBiZSBmb3VuZCBvbiBwYWdlIiAlIGtleSkKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICMgYWZ0ZXIgMXN0IGNsaWNrLCB0aGUgbGlzdCBzaG91bGQgYmUgZWl0aGVyIHNlcXVlbmNlZCBvciBpbnZlcnRlZCwgYnV0IHdlIGRvbid0IGhhdmUgYSAiZGVmYXVsdCBvcmRlciIgaGVyZQorICAgICAgICAgICAgIyB0aGUgcG9pbnQgaXMsIGFmdGVyIGFub3RoZXIgY2xpY2ssIGl0IHNob3VsZCBiZSBhbm90aGVyIG9yZGVyCisgICAgICAgICAgICBpZiBpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KGtleSkuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KGtleSkuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCJjYXNlIHBhc3NlZCIpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkwMiAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkwMihzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgQ291bGQgYWRkIG1vcmUgdGVzdCBwYXR0ZXJucyBoZXJlIGluIHRoZSBmdXR1cmUuIEFsc28sIGNvdWxkIHNlYXJjaCBzb21lIGl0ZW1zIG90aGVyIHRoYW4gdGFyZ2V0IGNvbHVtbiBpbiBmdXR1cmUuLgorICAgICAgICBwYXR0ZXJucyA9IFsibWluaW1hbCIsICJzYXRvIl0KKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICBvcmlfdGFyZ2V0X2NvbHVtbl90ZXh0cyA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsICJ0YXJnZXQiKQorICAgICAgICAgICAgcHJpbnQgb3JpX3RhcmdldF9jb2x1bW5fdGV4dHMKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMocGF0dGVybikKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgICAgIG5ld190YXJnZXRfY29sdW1uX3RleHRzID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgInRhcmdldCIpCisgICAgICAgICAgICAjIGlmIG5vdGhpbmcgZm91bmQsIHdlIHN0aWxsIGNvdW50IGl0IGFzICJwYXNzIgorICAgICAgICAgICAgaWYgbmV3X3RhcmdldF9jb2x1bW5fdGV4dHM6CisgICAgICAgICAgICAgICAgZm9yIHRleHQgaW4gbmV3X3RhcmdldF9jb2x1bW5fdGV4dHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0ZXh0LmZpbmQocGF0dGVybikpCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorICAgICAgICAgICAgdGFyZ2V0X2NvbHVtbl90ZXh0cyA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsICJ0YXJnZXQiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9yaV90YXJnZXRfY29sdW1uX3RleHRzID09IHRhcmdldF9jb2x1bW5fdGV4dHMpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkwMyAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkwMyhzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgd2hlbiBvcGVuaW5nIGEgbmV3IHBhZ2UsICJzdGFydGVkX29uIiBpcyBub3QgZGlzcGxheWVkIGJ5IGRlZmF1bHQKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIGN1cnJlbnRseSBhbGwgdGhlIGRlbGF5IGFyZSBmb3IgY2hyb21lIGRyaXZlciAtXy0KKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzdGFydGVkX29uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgc3RlcCA0CisgICAgICAgIGl0ZW1zID0gWyJPdXRjb21lIiwgIkNvbXBsZXRlZCBvbiIsICJTdGFydGVkIG9uIiwgIkZhaWxlZCB0YXNrcyIsICJFcnJvcnMiLCAiV2FybmluZ3MiXQorICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZW1wX2VsZW1lbnQgPSBzZWxmLmZpbmRfZWxlbWVudF9ieV90ZXh0X2luX3RhYmxlKCdvdGFibGUnLCBpdGVtKQorICAgICAgICAgICAgICAgICMgdGhpcyBpcyBob3cgd2UgZmluZCAiZmlsdGVyIGljb24iIGluIHRoZSBzYW1lIGxldmVsIGFzIHRlbXBfZWxlbWVudCh3aGVyZSAiYSIgbWVhbnMgY2xpY2thYmxlLCAiaSIgbWVhbnMgaWNvbikKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGVtcF9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLi4vLyovYS9pW0BjbGFzcz0naWNvbi1maWx0ZXIgZmlsdGVyZWQnXSIpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIgJXMgY2Fubm90IGJlIGZvdW5kISAlcyIgJSAoaXRlbSwgZSkpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAjIHN0ZXAgNS02CisgICAgICAgIHRlbXBfZWxlbWVudCA9IHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnb3RhYmxlJywgJ091dGNvbWUnKQorICAgICAgICB0ZW1wX2VsZW1lbnQuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIuLi8vKi9hL2lbQGNsYXNzPSdpY29uLWZpbHRlciBmaWx0ZXJlZCddIikuY2xpY2soKQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICAjIHRoZSAybmQgb3B0aW9uLCB3aGF0ZXZlciBpdCBpcworICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIigvL2lucHV0W0BuYW1lPSdmaWx0ZXInXSlbMl0iKS5jbGljaygpCisgICAgICAgICMgY2xpY2sgIkFwcGx5IiBidXR0b24KKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdmaWx0ZXJfb3V0Y29tZSddLy8qW3RleHQoKT0nQXBwbHknXSIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlCisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwNScpCisgICAgICAgIHRlbXBfZWxlbWVudCA9IHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnb3RhYmxlJywgJ0NvbXBsZXRlZCBvbicpCisgICAgICAgIHRlbXBfZWxlbWVudC5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi4uLy8qL2EvaVtAY2xhc3M9J2ljb24tZmlsdGVyIGZpbHRlcmVkJ10iKS5jbGljaygpCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BpZD0nZmlsdGVyX2NvbXBsZXRlZF9vbiddLy8qW3RleHQoKT0nQXBwbHknXSIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlIHRvIGNvbXBhcmUgdG8gcHJldmlvdXMgb25lCisgICAgICAgICMgcGxlYXNlIG5vdGUgdGhhdCBmb3IgY2hyb21lIGRyaXZlciwgbmVlZCBhIGxpdHRsZSBicmVhayBiZWZvcmUgc2F2aW5nCisgICAgICAgICMgc2NyZWVuIGhlcmUgLV8tCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDYnKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMoImNvcmUtaW1hZ2UiKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkwNCAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkwNChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiY29yZS1pbWFnZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiVGFza3MiKS5jbGljaygpCisjICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJBbGwgYnVpbGRzIikuY2xpY2soKQorIyAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgIHNlbGYudGFibGVfbmFtZSA9ICdvdGFibGUnCisgICAgICAgICMgVGhpcyBpcyBob3cgd2UgZmluZCB0aGUgImRlZmF1bHQiIHJvd3MtbnVtYmVyIQorICAgICAgICByb3dzX2Rpc3BsYXllZCA9IGludChTZWxlY3Qoc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3Rvcigic2VsZWN0LnBhZ2VzaXplIikpLmZpcnN0X3NlbGVjdGVkX29wdGlvbi50ZXh0KQorICAgICAgICBwcmludCByb3dzX2Rpc3BsYXllZAorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5nZXRfdGFibGVfZWxlbWVudChzZWxmLnRhYmxlX25hbWUsIHJvd3NfZGlzcGxheWVkKSkKKyAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5nZXRfdGFibGVfZWxlbWVudChzZWxmLnRhYmxlX25hbWUsIHJvd3NfZGlzcGxheWVkICsgMSkpCisgICAgICAgICMgU2VhcmNoIHRleHQgYm94IGJhY2tncm91bmQgdGV4dCBpcyAiU2VhcmNoIHRhc2tzIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdzZWFyY2hmb3JtJ10vKltAcGxhY2Vob2xkZXI9J1NlYXJjaCB0YXNrcyddIikpCisKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKCJidXN5Ym94IikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA1JykKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiaS5pY29uLXJlbW92ZSIpLmNsaWNrKCkKKyAgICAgICAgIyBTYXZlIHNjcmVlbiBoZXJlCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDVfMicpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJjcHVfdXNlZCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJkaXNrX2lvIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInRhc2tfbG9nIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInJlY2lwZV92ZXJzaW9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInRpbWVfdGFrZW4iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgVGhlIG9wZXJhdGlvbiBpcyB0aGUgc2FtZSBhcyBjYXNlOTAxCisgICAgICAgICMgZGljdDoge2xpbnQgdGV4dCBuYW1lIDogYWN0dWFsIGNsYXNzIG5hbWV9CisgICAgICAgIHRhYmxlX2hlYWRfZGljdCA9IHsnT3JkZXInOidvcmRlcicsICdSZWNpcGUnOidyZWNpcGVfbmFtZScsICdUYXNrJzondGFza19uYW1lJywgJ0V4ZWN1dGVkJzonZXhlY3V0ZWQnLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnT3V0Y29tZSc6J291dGNvbWUnLCAnQ2FjaGUgYXR0ZW1wdCc6J2NhY2hlX2F0dGVtcHQnLCAnVGltZSAoc2VjcyknOid0aW1lX3Rha2VuJywgJ0NQVSB1c2FnZSc6J2NwdV91c2VkJywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Rpc2sgSS9PIChtcyknOidkaXNrX2lvJ30KKyAgICAgICAgZm9yIGtleSBpbiB0YWJsZV9oZWFkX2RpY3Q6CisjIFRoaXMgaXMgdHJpY2t5IGhlcmU6IHdlIGFyZSBkb2luZyBzbyBiZWNhdXNlIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gMQorIyBzYW1lLW5hbWUgbGlua190ZXh0IGluIG9uZSBwYWdlLiBTbyB3ZSBvbmx5IGZpbmQgZWxlbWVudCBpbnNpZGUgdGhlIHRhYmxlCisgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisjIGFmdGVyIDFzdCBjbGljaywgdGhlIGxpc3Qgc2hvdWxkIGJlIGVpdGhlciBzZXF1ZW5jZWQgb3IgaW52ZXJ0ZWQsIGJ1dCB3ZSBkb24ndCBoYXZlIGEgImRlZmF1bHQgb3JkZXIiIGhlcmUKKyMgdGhlIHBvaW50IGlzLCBhZnRlciBhbm90aGVyIGNsaWNrLCBpdCBzaG91bGQgYmUgYW5vdGhlciBvcmRlcgorIyB0aGUgZmlzdCBjYXNlIGlzIHNwZWNpYWw6dGhpcyBtZWFucyBldmVyeSBpdGVtIGluIGNvbHVtbl9saXN0IGlzIHRoZSBzYW1lLCBzbworIyBhZnRlciBvbmUgY2xpY2ssIGVpdGhlciBzZXF1ZW5jZWQgb3IgaW52ZXJ0ZWQgd2lsbCBiZSBmaW5lCisgICAgICAgICAgICBpZiAoaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkgYW5kIGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkgXAorICAgICAgICAgICAgICAgIG9yIChub3QgY29sdW1uX2xpc3QpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fbGlzdCkgb3IgaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICBlbGlmIGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCJjbGFzcyIsIHRhYmxlX2hlYWRfZGljdFtrZXldKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KSkKKyMgc3RlcCA4LTEwCisgICAgICAgICMgZmlsdGVyIGRpY3Q6IHtsaW5rIHRleHQgbmFtZSA6IGZpbHRlciB0YWJsZSBuYW1lIGluIHhwYXRofQorICAgICAgICBmaWx0ZXJfZGljdCA9IHsnRXhlY3V0ZWQnOidmaWx0ZXJfZXhlY3V0ZWQnLCAnT3V0Y29tZSc6J2ZpbHRlcl9vdXRjb21lJywgJ0NhY2hlIGF0dGVtcHQnOidmaWx0ZXJfY2FjaGVfYXR0ZW1wdCd9CisgICAgICAgIGZvciBrZXkgaW4gZmlsdGVyX2RpY3Q6CisgICAgICAgICAgICB0ZW1wX2VsZW1lbnQgPSBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpCisgICAgICAgICAgICAjIGZpbmQgdGhlIGZpbHRlciBpY29uIGJlc2lkZXMgaXQuCisgICAgICAgICAgICAjIEFuZCBoZXJlIHdlIG11c3QgaGF2ZSBicmVhayAoMSBzZWMpIHRvIGdldCB0aGUgcG9wdXAgc3R1ZmYKKyAgICAgICAgICAgIHRlbXBfZWxlbWVudC5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi4uLy8qW0BjbGFzcz0naWNvbi1maWx0ZXIgZmlsdGVyZWQnXSIpLmNsaWNrKCkKKyAgICAgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgICAgICBhdmFpbF9vcHRpb25zID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiLy8qW0BpZD0nIiArIGZpbHRlcl9kaWN0W2tleV0gKyAiJ10vLypbQG5hbWU9J2ZpbHRlciddW25vdChAZGlzYWJsZWQpXSIpCisgICAgICAgICAgICBmb3IgbnVtYmVyIGluIHJhbmdlKDAsIGxlbihhdmFpbF9vcHRpb25zKSk6CisgICAgICAgICAgICAgICAgYXZhaWxfb3B0aW9uc1tudW1iZXJdLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICAgICAgICAgICMgY2xpY2sgIkFwcGx5IgorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BpZD0nIiArIGZpbHRlcl9kaWN0W2tleV0gICsgIiddLy8qW0B0eXBlPSdzdWJtaXQnXSIpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICAjIGluc2VydCBzY3JlZW4gY2FwdHVyZSBoZXJlCisgICAgICAgICAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA4JykKKyAgICAgICAgICAgICAgICAjIGFmdGVyIHRoZSBsYXN0IG9wdGlvbiB3YXMgY2xpY2tlZCwgd2UgZG9uJ3QgbmVlZCBvcGVyYXRpb24gYmVsb3cgYW55bW9yZQorICAgICAgICAgICAgICAgIGlmIG51bWJlciA8IGxlbihhdmFpbF9vcHRpb25zKS0xOgorICAgICAgICAgICAgICAgICAgICAgdGVtcF9lbGVtZW50ID0gc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYudGFibGVfbmFtZSwga2V5KQorICAgICAgICAgICAgICAgICAgICAgdGVtcF9lbGVtZW50LmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLi4vLypbQGNsYXNzPSdpY29uLWZpbHRlciBmaWx0ZXJlZCddIikuY2xpY2soKQorICAgICAgICAgICAgICAgICAgICAgYXZhaWxfb3B0aW9ucyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi8vKltAaWQ9JyIgKyBmaWx0ZXJfZGljdFtrZXldICsgIiddLy8qW0BuYW1lPSdmaWx0ZXInXVtub3QoQGRpc2FibGVkKV0iKQorICAgICAgICAgICAgICAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyMgc3RlcCAxMQorICAgICAgICBmb3IgaXRlbSBpbiBbJ29yZGVyJywgJ3Rhc2tfbmFtZScsICdleGVjdXRlZCcsICdvdXRjb21lJywgJ3JlY2lwZV9uYW1lJywgJ3JlY2lwZV92ZXJzaW9uJ106CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfeHBhdGhfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCAiLi90Ym9keS90clsxXS8qW0BjbGFzcz0nIiArIGl0ZW0gKyAiJ10vYSIpLmNsaWNrKCkKKyAgICAgICAgICAgIGV4Y2VwdCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgIyBsZXQgaXQgZ28uLi4KKyAgICAgICAgICAgICAgICBwcmludCAnbm8gaXRlbSBpbiB0aGUgY29sdW0nICsgaXRlbQorICAgICAgICAgICAgIyBpbnNlcnQgc2NyZWVuIHNob3QgaGVyZQorICAgICAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwMTEnKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisjIHN0ZXAgMTItMTQKKyAgICAgICAgIyBhYm91dCB0ZXN0X2RpY3Q6IHBsZWFzZSByZWZlciB0byB0ZXN0Y2FzZSA5MDQgcmVxdWlyZW1lbnQgc3RlcCAxMi0xNAorICAgICAgICB0ZXN0X2RpY3QgPSB7CisgICAgICAgICAgICAnVGltZSc6eworICAgICAgICAgICAgICAgICdjbGFzcyc6J3RpbWVfdGFrZW4nLAorICAgICAgICAgICAgICAgICdjaGVja19oZWFkX2xpc3QnOlsnUmVjaXBlJywgJ1Rhc2snLCAnRXhlY3V0ZWQnLCAnT3V0Y29tZScsICdUaW1lIChzZWNzKSddLAorICAgICAgICAgICAgICAgICdjaGVja19jb2x1bW5fbGlzdCc6WydjcHVfdXNlZCcsICdjYWNoZV9hdHRlbXB0JywgJ2Rpc2tfaW8nLCAnb3JkZXInLCAncmVjaXBlX3ZlcnNpb24nXQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdDUFUgdXNhZ2UnOnsKKyAgICAgICAgICAgICAgICAnY2xhc3MnOidjcHVfdXNlZCcsCisgICAgICAgICAgICAgICAgJ2NoZWNrX2hlYWRfbGlzdCc6WydSZWNpcGUnLCAnVGFzaycsICdFeGVjdXRlZCcsICdPdXRjb21lJywgJ0NQVSB1c2FnZSddLAorICAgICAgICAgICAgICAgICdjaGVja19jb2x1bW5fbGlzdCc6WydjYWNoZV9hdHRlbXB0JywgJ2Rpc2tfaW8nLCAnb3JkZXInLCAncmVjaXBlX3ZlcnNpb24nLCAndGltZV90YWtlbiddCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ0Rpc2sgSS9PJzp7CisgICAgICAgICAgICAgICAgJ2NsYXNzJzonZGlza19pbycsCisgICAgICAgICAgICAgICAgJ2NoZWNrX2hlYWRfbGlzdCc6WydSZWNpcGUnLCAnVGFzaycsICdFeGVjdXRlZCcsICdPdXRjb21lJywgJ0Rpc2sgSS9PIChtcyknXSwKKyAgICAgICAgICAgICAgICAnY2hlY2tfY29sdW1uX2xpc3QnOlsnY3B1X3VzZWQnLCAnY2FjaGVfYXR0ZW1wdCcsICdvcmRlcicsICdyZWNpcGVfdmVyc2lvbicsICd0aW1lX3Rha2VuJ10KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3Iga2V5IGluIHRlc3RfZGljdDoKKyAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnY29yZS1pbWFnZScpLmNsaWNrKCkKKyAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2Jywga2V5KS5jbGljaygpCisgICAgICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgICAgICBmb3IgaXRlbSBpbiB0ZXN0X2RpY3Rba2V5XVsnY2hlY2tfaGVhZF9saXN0J106CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0ZW0gaW4gaGVhZF9saXN0KQorICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgnY2xhc3MnLCB0ZXN0X2RpY3Rba2V5XVsnY2xhc3MnXSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGNvbHVtbl9saXN0KSkKKworICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgZm9yIGl0ZW0yIGluIHRlc3RfZGljdFtrZXldWydjaGVja19jb2x1bW5fbGlzdCddOgorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZChpdGVtMikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgIyBUQkQ6IHNhdmUgc2NyZWVuIGhlcmUKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTA2ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTA2KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsICdQYWNrYWdlcycpLmNsaWNrKCkKKyAgICAgICAgIyBmaW5kICJiYXNoIiBpbiBmaXJzdCBjb2x1bW4gKFBhY2thZ2VzKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAaWQ9J290YWJsZSddLy90ZFsxXS8vKlt0ZXh0KCk9J2Jhc2gnXSIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjZWVuIGhlcmUgdG8gb2JzZXJ2ZS4uLgorIyBzdGVwIDYKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJHZW5lcmF0ZWQgZmlsZXMiKS5jbGljaygpCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydGaWxlJywgJ1NpemUnXToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgY19saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ3BhdGgnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY19saXN0KSkKKyMgc3RlcCA3CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUnVudGltZSBkZXBlbmRlbmNpZXMiKS5jbGljaygpCisgICAgICAgICMgc2F2ZSBzY2VlbiBoZXJlIHRvIG9ic2VydmUuLi4KKyAgICAgICAgIyBub3RlIHRoYXQgaGVyZSB0YWJsZSBuYW1lIGlzIG5vdCAnb3RhYmxlJworICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ2RlcGVuZGVuY2llcycpCisgICAgICAgIGZvciBpdGVtIGluIFsnUGFja2FnZScsICdWZXJzaW9uJywgJ1NpemUnXToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgY19saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHRfYnlfY29sdW1uX251bWJlcignZGVwZW5kZW5jaWVzJywgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNfbGlzdCkpCisgICAgICAgIHRleHRzID0gWydTaXplJywgJ0xpY2Vuc2UnLCAnUmVjaXBlJywgJ1JlY2lwZSB2ZXJzaW9uJywgJ0xheWVyJywgXAorICAgICAgICAgICAgICAgICAgICAgJ0xheWVyIGJyYW5jaCcsICdMYXllciBjb21taXQnLCAnTGF5ZXIgZGlyZWN0b3J5J10KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfdGV4dF9wcmVzZW50KHRleHRzKSkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTEwICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTEwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBpbWFnZV90eXBlPSJjb3JlLWltYWdlLW1pbmltYWwiCisgICAgICAgIHRlc3RfcGFja2FnZTE9ImJ1c3lib3giCisgICAgICAgIHRlc3RfcGFja2FnZTI9ImxpYiIKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoaW1hZ2VfdHlwZSkuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJSZWNpcGVzIikuY2xpY2soKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXAzJykKKworICAgICAgICBzZWxmLnRhYmxlX25hbWUgPSAnb3RhYmxlJworICAgICAgICAjIFRoaXMgaXMgaG93IHdlIGZpbmQgdGhlICJkZWZhdWx0IiByb3dzLW51bWJlciEKKyAgICAgICAgcm93c19kaXNwbGF5ZWQgPSBpbnQoU2VsZWN0KHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoInNlbGVjdC5wYWdlc2l6ZSIpKS5maXJzdF9zZWxlY3RlZF9vcHRpb24udGV4dCkKKyAgICAgICAgcHJpbnQgcm93c19kaXNwbGF5ZWQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQoc2VsZi50YWJsZV9uYW1lLCByb3dzX2Rpc3BsYXllZCkpCisgICAgICAgIHNlbGYuZmFpbElmKHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQoc2VsZi50YWJsZV9uYW1lLCByb3dzX2Rpc3BsYXllZCArIDEpKQorCisgICAgICAgICMgQ2hlY2sgdGhlIGRlZmF1bHQgdGFibGUgaXMgc29ydGVkIGJ5IFJlY2lwZQorICAgICAgICB0YXNrc19jb2x1bW5fY291bnQgPSBsZW4oc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiL2h0bWwvYm9keS9kaXZbMl0vZGl2L2RpdlsyXS9kaXZbMl0vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgcHJpbnQgdGFza3NfY29sdW1uX2NvdW50CisgICAgICAgIGRlZmF1bHRfY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dF9ieV9jb2x1bW5fbnVtYmVyKHNlbGYudGFibGVfbmFtZSwgMSkKKyAgICAgICAgI3ByaW50IGRlZmF1bHRfY29sdW1uX2xpc3QKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoZGVmYXVsdF9jb2x1bW5fbGlzdCkpCisKKyAgICAgICAgIyBTZWFyY2ggdGV4dCBib3ggYmFja2dyb3VuZCB0ZXh0IGlzICJTZWFyY2ggcmVjaXBlcyIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BpZD0nc2VhcmNoZm9ybSddLypbQHBsYWNlaG9sZGVyPSdTZWFyY2ggcmVjaXBlcyddIikpCisKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuc2VuZF9rZXlzKHRlc3RfcGFja2FnZTEpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBTYXZlIHNjcmVlbiBoZXJlCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDQnKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA0XzInKQorCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJkZXBlbmRzX29uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2JyYW5jaCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0IikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImRlcGVuZHNfYnkiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKworICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCAnUmVjaXBlJykuY2xpY2soKQorICAgICAgICAjIENoZWNrIHRoZSBpbnZlcnRlZCB0YWJsZSBieSBSZWNpcGUKKyAgICAgICAgIyBSZWNpcGUgZG9lc24ndCBoYXZlIGNsYXNzIG5hbWUKKyAgICAgICAgI2ludmVydGVkX3Rhc2tzX2NvbHVtbl9jb3VudCA9IGxlbihzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzJdL2RpdlsyXS90YWJsZS90Ym9keS90ci90ZFsxXSIpKQorICAgICAgICAjcHJpbnQgaW52ZXJ0ZWRfdGFza3NfY29sdW1uX2NvdW50CisgICAgICAgICNpbnZlcnRlZF9jb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0X2J5X2NvbHVtbl9udW1iZXIoc2VsZi50YWJsZV9uYW1lLCAxKQorICAgICAgICAjcHJpbnQgaW52ZXJ0ZWRfY29sdW1uX2xpc3QKKworICAgICAgICAjc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJ6bGliIikuY2xpY2soKQorICAgICAgICAjc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgICNzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZChpbnZlcnRlZF9jb2x1bW5fbGlzdCkpCisgICAgICAgICNzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCAnUmVjaXBlJykuY2xpY2soKQorCisgICAgICAgIHRhYmxlX2hlYWRfZGljdCA9IHsnUmVjaXBlJzoncmVjaXBlX19uYW1lJywgJ1JlY2lwZSBmaWxlJzoncmVjaXBlX2ZpbGUnLCAnU2VjdGlvbic6J3JlY2lwZV9zZWN0aW9uJywgXAorICAgICAgICAgICAgICAgICdMaWNlbnNlJzoncmVjaXBlX2xpY2Vuc2UnLCAnTGF5ZXInOidsYXllcl92ZXJzaW9uX19sYXllcl9fbmFtZScsIFwKKyAgICAgICAgICAgICAgICAnTGF5ZXIgYnJhbmNoJzonbGF5ZXJfdmVyc2lvbl9fYnJhbmNoJ30KKyAgICAgICAgZm9yIGtleSBpbiB0YWJsZV9oZWFkX2RpY3Q6CisgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICBpZiAoaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkgYW5kIGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkgXAorICAgICAgICAgICAgICAgICAgICBvciAobm90IGNvbHVtbl9saXN0KSA6CisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYudGFibGVfbmFtZSwga2V5KS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpIG9yIGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiYWNsIikuY2xpY2soKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fbGlzdCkgb3IgaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgIyBTZWFyY2ggdGV4dCBib3ggYmFja2dyb3VuZCB0ZXh0IGlzICJTZWFyY2ggcmVjaXBlcyIKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdzZWFyY2hmb3JtJ10vKltAcGxhY2Vob2xkZXI9J1NlYXJjaCByZWNpcGVzJ10iKSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cyh0ZXN0X3BhY2thZ2UyKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fc2VhcmNoX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX3NlYXJjaF9saXN0KSBvciBpc19saXN0X2ludmVydGVkKGNvbHVtbl9zZWFyY2hfbGlzdCkpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiaS5pY29uLXJlbW92ZSIpLmNsaWNrKCkKKyAgICAgICAgICAgIGVsaWYgaXNfbGlzdF9pbnZlcnRlZChjb2x1bW5fbGlzdCk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKHNlbGYudGFibGVfbmFtZSwga2V5KS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiYWNsIikuY2xpY2soKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChjb2x1bW5fbGlzdCkpCisgICAgICAgICAgICAgICAgIyBTZWFyY2ggdGV4dCBib3ggYmFja2dyb3VuZCB0ZXh0IGlzICJTZWFyY2ggcmVjaXBlcyIKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGlkPSdzZWFyY2hmb3JtJ10vKltAcGxhY2Vob2xkZXI9J1NlYXJjaCByZWNpcGVzJ10iKSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cyh0ZXN0X3BhY2thZ2UyKQorICAgICAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgICAgICAgICBjb2x1bW5fc2VhcmNoX2xpc3QgPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dCgiY2xhc3MiLCB0YWJsZV9oZWFkX2RpY3Rba2V5XSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX3NlYXJjaF9saXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZShzZWxmLnRhYmxlX25hbWUsIGtleSkuY2xpY2soKQorICAgICAgICAgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJhY2wiKS5jbGljaygpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoInpsaWIiKS5jbGljaygpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQoY29sdW1uX2xpc3QpKQorICAgICAgICAgICAgICAgICMgU2VhcmNoIHRleHQgYm94IGJhY2tncm91bmQgdGV4dCBpcyAiU2VhcmNoIHJlY2lwZXMiCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiLy8qW0BpZD0nc2VhcmNoZm9ybSddLypbQHBsYWNlaG9sZGVyPSdTZWFyY2ggcmVjaXBlcyddIikpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5jbGVhcigpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXModGVzdF9wYWNrYWdlMikKKyAgICAgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgICAgICAgICAgY29sdW1uX3NlYXJjaF9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoImNsYXNzIiwgdGFibGVfaGVhZF9kaWN0W2tleV0pCisgICAgICAgICAgICAgICAgI3ByaW50IGNvbHVtbl9zZWFyY2hfbGlzdAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGNvbHVtbl9zZWFyY2hfbGlzdCkpCisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiaS5pY29uLXJlbW92ZSIpLmNsaWNrKCkKKworICAgICAgICAjIEJ1ZyA1OTE5CisgICAgICAgIGZvciBrZXkgaW4gdGFibGVfaGVhZF9kaWN0OgorICAgICAgICAgICAgcHJpbnQga2V5CisgICAgICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoc2VsZi50YWJsZV9uYW1lLCBrZXkpLmNsaWNrKCkKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCh0YWJsZV9oZWFkX2RpY3Rba2V5XSkuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgICAgICMgQWZ0ZXIgaGlkZSB0aGUgY29sdW1uLCB0aGUgZGVmYXVsdCB0YWJsZSBzaG91bGQgYmUgc29ydGVkIGJ5IFJlY2lwZQorICAgICAgICAgICAgdGFza3NfY29sdW1uX2NvdW50ID0gbGVuKHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfcGFydGlhbF9saW5rX3RleHQoImFjbCIpKQorICAgICAgICAgICAgI3ByaW50IHRhc2tzX2NvbHVtbl9jb3VudAorICAgICAgICAgICAgZGVmYXVsdF9jb2x1bW5fbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0X2J5X2NvbHVtbl9udW1iZXIoc2VsZi50YWJsZV9uYW1lLCAxKQorICAgICAgICAgICAgI3ByaW50IGRlZmF1bHRfY29sdW1uX2xpc3QKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X3NlcXVlbmNlZChkZWZhdWx0X2NvbHVtbl9saXN0KSkKKworICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX2ZpbGUiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX3NlY3Rpb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgicmVjaXBlX2xpY2Vuc2UiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX25hbWUiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTExICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTExKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsICdSZWNpcGVzJykuY2xpY2soKQorIyBzdGVwIDMtNQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMoImxpYiIpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjcmVlbiBoZXJlIGZvciBvYnNlcnZhdGlvbgorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA1JykKKyMgc3RlcCA2CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImkuaWNvbi1yZW1vdmUiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICAjIHdlIGRlbGliZXJhdGVseSB3YW50ICJubyByZXN1bHQiIGhlcmUKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMoIm5vIHN1Y2ggaW5wdXQiKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X3RleHQoIlNob3cgYWxsIHJlY2lwZXMiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLnF1aXQoKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTIgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTIoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyID0gc2VsZi5zZXR1cF9icm93c2VyKHNlbGYpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ1JlY2lwZXMnKS5jbGljaygpCisgICAgICAgICMgc3RlcCAzCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydSZWNpcGUnLCAnUmVjaXBlIHZlcnNpb24nLCAnUmVjaXBlIGZpbGUnLCAnU2VjdGlvbicsICdMaWNlbnNlJywgJ0xheWVyJ106CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXRlbSBpbiBoZWFkX2xpc3QpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImJ1dHRvbi5idG4uZHJvcGRvd24tdG9nZ2xlIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImRlcGVuZHNfb24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfdmVyc2lvbl9fYnJhbmNoIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2xheWVyX19jb21taXQiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZGVwZW5kc19ieSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiYnV0dG9uLmJ0bi5kcm9wZG93bi10b2dnbGUiKS5jbGljaygpCisgICAgICAgICMgY2hlY2sgaWYgY29sdW1ucyBzZWxlY3RlZCBhYm92ZSBpcyBzaG93bgorICAgICAgICBjaGVja19saXN0ID0gWydEZXBlbmRlbmNpZXMnLCAnTGF5ZXIgYnJhbmNoJywgJ0xheWVyIGNvbW1pdCcsICdMYXllciBkaXJlY3RvcnknLCAnUmV2ZXJzZSBkZXBlbmRlbmNpZXMnXQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgIHRpbWUuc2xlZXAoMikKKyAgICAgICAgcHJpbnQgaGVhZF9saXN0CisgICAgICAgIGZvciBpdGVtIGluIGNoZWNrX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXRlbSBpbiBoZWFkX2xpc3QpCisgICAgICAgICMgdW4tY2hlY2sgJ2VtIGFsbAorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJidXR0b24uYnRuLmRyb3Bkb3duLXRvZ2dsZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJkZXBlbmRzX29uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2JyYW5jaCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0IikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImRlcGVuZHNfYnkiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoImJ1dHRvbi5idG4uZHJvcGRvd24tdG9nZ2xlIikuY2xpY2soKQorICAgICAgICAjIGRvbid0IGV4aXN0IGFueSBtb3JlCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gY2hlY2tfbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGl0ZW0gaW4gaGVhZF9saXN0KQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTMgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTMoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ1JlY2lwZXMnKS5jbGljaygpCisgICAgICAgICMgc3RlcCAzCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydSZWNpcGUnLCAnUmVjaXBlIHZlcnNpb24nLCAnUmVjaXBlIGZpbGUnLCAnU2VjdGlvbicsICdMaWNlbnNlJywgJ0xheWVyJ106CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXRlbSBpbiBoZWFkX2xpc3QpCisgICAgICAgICMgc3RlcCA0CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBzYXZlIHNjcmVlbgorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA0JykKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTQgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTQoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIGltYWdlX3R5cGU9ImNvcmUtaW1hZ2UtbWluaW1hbCIKKyAgICAgICAgdGVzdF9wYWNrYWdlMT0iYnVzeWJveCIKKyAgICAgICAgdGVzdF9wYWNrYWdlMj0iZ2RibSIKKyAgICAgICAgdGVzdF9wYWNrYWdlMz0iZ2V0dGV4dC1uYXRpdmUiCisgICAgICAgIGRyaXZlciA9IHNlbGYuZHJpdmVyCisgICAgICAgIGRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBkcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KGltYWdlX3R5cGUpLmNsaWNrKCkKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlJlY2lwZXMiKS5jbGljaygpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KHRlc3RfcGFja2FnZTEpLmNsaWNrKCkKKworICAgICAgICBzZWxmLnRhYmxlX25hbWUgPSAnaW5mb3JtYXRpb24nCisKKyAgICAgICAgdGFza3Nfcm93X2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbMV0vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgdGFza3NfY29sdW1uX2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbMV0vdGFibGUvdGJvZHkvdHJbMV0vdGQiKSkKKyAgICAgICAgcHJpbnQgdGFza3Nfcm93X2NvdW50CisgICAgICAgIHByaW50IHRhc2tzX2NvbHVtbl9jb3VudAorCisgICAgICAgIFRhc2tzX2NvbHVtbiA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0X2J5X2NvbHVtbl9udW1iZXIoc2VsZi50YWJsZV9uYW1lLCAyKQorICAgICAgICBwcmludCAoIlRhc2tzX2NvbHVtbj0iLCBUYXNrc19jb2x1bW4pCisKKyAgICAgICAga2V5X3Rhc2tzPVsiZG9fZmV0Y2giLCAiZG9fdW5wYWNrIiwgICJkb19wYXRjaCIsICJkb19jb25maWd1cmUiLCAiZG9fY29tcGlsZSIsICJkb19pbnN0YWxsIiwgImRvX3BhY2thZ2UiLCAiZG9fYnVpbGQiXQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBpIDwgbGVuKGtleV90YXNrcyk6CisgICAgICAgICAgICBpZiBrZXlfdGFza3NbaV0gbm90IGluIFRhc2tzX2NvbHVtbjoKKyAgICAgICAgICAgICAgICBwcmludCAoIkVycm9yISBNaXNzaW5nIGtleSB0YXNrOiAlcyIgJSBrZXlfdGFza3NbaV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICgiJXMgaXMgaW4gdGFza3MiICUga2V5X3Rhc2tzW2ldKQorICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICAgICAgaWYgVGFza3NfY29sdW1uLmluZGV4KGtleV90YXNrc1swXSkgIT0gMDoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3IhICVzIGlzIG5vdCBpbiB0aGUgcmlnaHQgcG9zaXRpb24iICUga2V5X3Rhc2tzWzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCIlcyBpcyBpbiByaWdodCBwb3NpdGlvbiIgJSBrZXlfdGFza3NbMF0pCisKKyAgICAgICAgaWYgVGFza3NfY29sdW1uWy0xXSAhPSBrZXlfdGFza3NbLTFdOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgJXMgaXMgbm90IGluIHRoZSByaWdodCBwb3NpdGlvbiIgJSBrZXlfdGFza3NbLTFdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCIlcyBpcyBpbiByaWdodCBwb3NpdGlvbiIgJSBrZXlfdGFza3NbLTFdKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlBhY2thZ2VzICgiKS5jbGljaygpCisgICAgICAgIHBhY2thZ2VzX25hbWUgPSBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJQYWNrYWdlcyAoIikudGV4dAorICAgICAgICBwcmludCBwYWNrYWdlc19uYW1lCisgICAgICAgIHBhY2thZ2VzX251bSA9IHN0cmluZy5hdG9pKGZpbHRlcihzdHIuaXNkaWdpdCwgcmVwcihwYWNrYWdlc19uYW1lKSkpCisgICAgICAgIHByaW50IHBhY2thZ2VzX251bQorCisgICAgICAgIHBhY2thZ2VzX3Jvd19jb3VudCA9IGxlbihkcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiL2h0bWwvYm9keS9kaXZbMl0vZGl2L2RpdlszXS9kaXYvZGl2WzJdL3RhYmxlL3Rib2R5L3RyL3RkWzFdIikpCisgICAgICAgIHByaW50IHBhY2thZ2VzX3Jvd19jb3VudAorCisgICAgICAgIGlmIHBhY2thZ2VzX251bSAhPSBwYWNrYWdlc19yb3dfY291bnQ6CisgICAgICAgICAgICBwcmludCAoIkVycm9yISBUaGUgcGFja2FnZXMgbnVtYmVyIGlzIG5vdCBjb3JyZWN0IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICgiVGhlIHBha2NhZ2VzIG51bWJlciBpcyBjb3JyZWN0IikKKworICAgICAgICBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJCdWlsZCBkZXBlbmRlbmNpZXMgKCIpLmNsaWNrKCkKKyAgICAgICAgZGVwZW5kc19uYW1lID0gZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiQnVpbGQgZGVwZW5kZW5jaWVzICgiKS50ZXh0CisgICAgICAgIHByaW50IGRlcGVuZHNfbmFtZQorICAgICAgICBkZXBlbmRzX251bSA9IHN0cmluZy5hdG9pKGZpbHRlcihzdHIuaXNkaWdpdCwgcmVwcihkZXBlbmRzX25hbWUpKSkKKyAgICAgICAgcHJpbnQgZGVwZW5kc19udW0KKworICAgICAgICBpZiBkZXBlbmRzX251bSA9PSAwOgorICAgICAgICAgICAgZGVwZW5kc19tZXNzYWdlID0gcmVwcihkcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiZGl2LmFsZXJ0LmFsZXJ0LWluZm8iKS50ZXh0KQorICAgICAgICAgICAgcHJpbnQgZGVwZW5kc19tZXNzYWdlCisgICAgICAgICAgICBpZiBkZXBlbmRzX21lc3NhZ2UuZmluZCgiaGFzIG5vIGJ1aWxkIGRlcGVuZGVuY2llcy4iKSA8IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgVGhlIG1lc3NhZ2UgaXNuJ3QgZXhwZWN0ZWQuIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJUaGUgbWVzc2FnZSBpcyBleHBlY3RlZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXBlbmRzX3Jvd19jb3VudCA9IGxlbihkcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiL2h0bWwvYm9keS9kaXZbMl0vZGl2L2RpdlszXS9kaXYvZGl2WzNdL3RhYmxlL3Rib2R5L3RyL3RkWzFdIikpCisgICAgICAgICAgICBwcmludCBkZXBlbmRzX3Jvd19jb3VudAorICAgICAgICAgICAgaWYgZGVwZW5kc19udW0gIT0gZGVwZW5kc19yb3dfY291bnQ6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgVGhlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgbm90IGNvcnJlY3QiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAoIlRoZSBkZXBlbmRlbnQgcGFja2FnZXMgbnVtYmVyIGlzIGNvcnJlY3QiKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlJldmVyc2UgYnVpbGQgZGVwZW5kZW5jaWVzICgiKS5jbGljaygpCisgICAgICAgIHJkZXBlbmRzX25hbWUgPSBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJSZXZlcnNlIGJ1aWxkIGRlcGVuZGVuY2llcyAoIikudGV4dAorICAgICAgICBwcmludCByZGVwZW5kc19uYW1lCisgICAgICAgIHJkZXBlbmRzX251bSA9IHN0cmluZy5hdG9pKGZpbHRlcihzdHIuaXNkaWdpdCwgcmVwcihyZGVwZW5kc19uYW1lKSkpCisgICAgICAgIHByaW50IHJkZXBlbmRzX251bQorCisgICAgICAgIGlmIHJkZXBlbmRzX251bSA9PSAwOgorICAgICAgICAgICAgcmRlcGVuZHNfbWVzc2FnZSA9IHJlcHIoZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jc3Nfc2VsZWN0b3IoIiNicm91Z2h0LWluLWJ5ID4gZGl2LmFsZXJ0LmFsZXJ0LWluZm8iKS50ZXh0KQorICAgICAgICAgICAgcHJpbnQgcmRlcGVuZHNfbWVzc2FnZQorICAgICAgICAgICAgaWYgcmRlcGVuZHNfbWVzc2FnZS5maW5kKCJoYXMgbm8gcmV2ZXJzZSBidWlsZCBkZXBlbmRlbmNpZXMuIikgPCAwOgorICAgICAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIFRoZSBtZXNzYWdlIGlzbid0IGV4cGVjdGVkLiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICgiVGhlIG1lc3NhZ2UgaXMgZXhwZWN0ZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCJUaGUgcmV2ZXJzZSBkZXBlbmRlbnQgcGFja2FnZXMgbnVtYmVyIGlzIGNvcnJlY3QiKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJSZWNpcGVzIikuY2xpY2soKQorICAgICAgICBkcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCh0ZXN0X3BhY2thZ2UyKS5jbGljaygpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlBhY2thZ2VzICgiKS5jbGljaygpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIkJ1aWxkIGRlcGVuZGVuY2llcyAoIikuY2xpY2soKQorICAgICAgICBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJSZXZlcnNlIGJ1aWxkIGRlcGVuZGVuY2llcyAoIikuY2xpY2soKQorCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIlJlY2lwZXMiKS5jbGljaygpCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KHRlc3RfcGFja2FnZTMpLmNsaWNrKCkKKworICAgICAgICBuYXRpdmVfdGFza3Nfcm93X2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbMV0vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgbmF0aXZlX3Rhc2tzX2NvbHVtbl9jb3VudCA9IGxlbihkcml2ZXIuZmluZF9lbGVtZW50c19ieV94cGF0aCgiL2h0bWwvYm9keS9kaXZbMl0vZGl2L2RpdlszXS9kaXYvZGl2WzFdL3RhYmxlL3Rib2R5L3RyWzFdL3RkIikpCisgICAgICAgIHByaW50IG5hdGl2ZV90YXNrc19yb3dfY291bnQKKyAgICAgICAgcHJpbnQgbmF0aXZlX3Rhc2tzX2NvbHVtbl9jb3VudAorCisgICAgICAgIE5hdGl2ZV9UYXNrc19jb2x1bW4gPSBzZWxmLmdldF90YWJsZV9jb2x1bW5fdGV4dF9ieV9jb2x1bW5fbnVtYmVyKHNlbGYudGFibGVfbmFtZSwgMikKKyAgICAgICAgcHJpbnQgKCJOYXRpdmVfVGFza3NfY29sdW1uPSIsIE5hdGl2ZV9UYXNrc19jb2x1bW4pCisKKyAgICAgICAgbmF0aXZlX2tleV90YXNrcz1bImRvX2ZldGNoIiwgImRvX3VucGFjayIsICAiZG9fcGF0Y2giLCAiZG9fY29uZmlndXJlIiwgImRvX2NvbXBpbGUiLCAiZG9faW5zdGFsbCIsICJkb19idWlsZCJdCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIGkgPCBsZW4obmF0aXZlX2tleV90YXNrcyk6CisgICAgICAgICAgICBpZiBuYXRpdmVfa2V5X3Rhc2tzW2ldIG5vdCBpbiBOYXRpdmVfVGFza3NfY29sdW1uOgorICAgICAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIE1pc3Npbmcga2V5IHRhc2s6ICVzIiAlIG5hdGl2ZV9rZXlfdGFza3NbaV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICgiJXMgaXMgaW4gdGFza3MiICUgbmF0aXZlX2tleV90YXNrc1tpXSkKKyAgICAgICAgICAgIGkgPSBpICsgMQorCisgICAgICAgIGlmIE5hdGl2ZV9UYXNrc19jb2x1bW4uaW5kZXgobmF0aXZlX2tleV90YXNrc1swXSkgIT0gMDoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3IhICVzIGlzIG5vdCBpbiB0aGUgcmlnaHQgcG9zaXRpb24iICUgbmF0aXZlX2tleV90YXNrc1swXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICgiJXMgaXMgaW4gcmlnaHQgcG9zaXRpb24iICUgbmF0aXZlX2tleV90YXNrc1swXSkKKworICAgICAgICBpZiBOYXRpdmVfVGFza3NfY29sdW1uWy0xXSAhPSBuYXRpdmVfa2V5X3Rhc2tzWy0xXToKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3IhICVzIGlzIG5vdCBpbiB0aGUgcmlnaHQgcG9zaXRpb24iICUgbmF0aXZlX2tleV90YXNrc1stMV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAoIiVzIGlzIGluIHJpZ2h0IHBvc2l0aW9uIiAlIG5hdGl2ZV9rZXlfdGFza3NbLTFdKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIlBhY2thZ2VzICgiKS5jbGljaygpCisgICAgICAgIG5hdGl2ZV9wYWNrYWdlc19uYW1lID0gZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUGFja2FnZXMgKCIpLnRleHQKKyAgICAgICAgcHJpbnQgbmF0aXZlX3BhY2thZ2VzX25hbWUKKyAgICAgICAgbmF0aXZlX3BhY2thZ2VzX251bSA9IHN0cmluZy5hdG9pKGZpbHRlcihzdHIuaXNkaWdpdCwgcmVwcihuYXRpdmVfcGFja2FnZXNfbmFtZSkpKQorICAgICAgICBwcmludCBuYXRpdmVfcGFja2FnZXNfbnVtCisKKyAgICAgICAgaWYgbmF0aXZlX3BhY2thZ2VzX251bSAhPSAwOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvciEgTmF0aXZlIHRhc2sgc2hvdWxkbid0IGhhdmUgYW55IHBhY2thZ2VzLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYXRpdmVfcGFja2FnZV9tZXNzYWdlID0gcmVwcihkcml2ZXIuZmluZF9lbGVtZW50X2J5X2Nzc19zZWxlY3RvcigiZGl2LmFsZXJ0LmFsZXJ0LWluZm8iKS50ZXh0KQorICAgICAgICAgICAgcHJpbnQgbmF0aXZlX3BhY2thZ2VfbWVzc2FnZQorICAgICAgICAgICAgaWYgbmF0aXZlX3BhY2thZ2VfbWVzc2FnZS5maW5kKCJkb2VzIG5vdCBidWlsZCBhbnkgcGFja2FnZXMuIikgPCAwOgorICAgICAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIFRoZSBtZXNzYWdlIGZvciBuYXRpdmUgdGFzayBpc24ndCBleHBlY3RlZC4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAoIlRoZSBtZXNzYWdlIGZvciBuYXRpdmUgdGFzayBpcyBleHBlY3RlZC4iKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoIkJ1aWxkIGRlcGVuZGVuY2llcyAoIikuY2xpY2soKQorICAgICAgICBuYXRpdmVfZGVwZW5kc19uYW1lID0gZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiQnVpbGQgZGVwZW5kZW5jaWVzICgiKS50ZXh0CisgICAgICAgIHByaW50IG5hdGl2ZV9kZXBlbmRzX25hbWUKKyAgICAgICAgbmF0aXZlX2RlcGVuZHNfbnVtID0gc3RyaW5nLmF0b2koZmlsdGVyKHN0ci5pc2RpZ2l0LCByZXByKG5hdGl2ZV9kZXBlbmRzX25hbWUpKSkKKyAgICAgICAgcHJpbnQgbmF0aXZlX2RlcGVuZHNfbnVtCisKKyAgICAgICAgbmF0aXZlX2RlcGVuZHNfcm93X2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbM10vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgcHJpbnQgbmF0aXZlX2RlcGVuZHNfcm93X2NvdW50CisKKyAgICAgICAgaWYgbmF0aXZlX2RlcGVuZHNfbnVtICE9IG5hdGl2ZV9kZXBlbmRzX3Jvd19jb3VudDoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIFRoZSBkZXBlbmRlbnQgcGFja2FnZXMgbnVtYmVyIGlzIG5vdCBjb3JyZWN0IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICgiVGhlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgY29ycmVjdCIpCisKKyAgICAgICAgZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUmV2ZXJzZSBidWlsZCBkZXBlbmRlbmNpZXMgKCIpLmNsaWNrKCkKKyAgICAgICAgbmF0aXZlX3JkZXBlbmRzX25hbWUgPSBkcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJSZXZlcnNlIGJ1aWxkIGRlcGVuZGVuY2llcyAoIikudGV4dAorICAgICAgICBwcmludCBuYXRpdmVfcmRlcGVuZHNfbmFtZQorICAgICAgICBuYXRpdmVfcmRlcGVuZHNfbnVtID0gc3RyaW5nLmF0b2koZmlsdGVyKHN0ci5pc2RpZ2l0LCByZXByKG5hdGl2ZV9yZGVwZW5kc19uYW1lKSkpCisgICAgICAgIHByaW50IG5hdGl2ZV9yZGVwZW5kc19udW0KKworICAgICAgICBuYXRpdmVfcmRlcGVuZHNfcm93X2NvdW50ID0gbGVuKGRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzNdL2Rpdi9kaXZbNF0vdGFibGUvdGJvZHkvdHIvdGRbMV0iKSkKKyAgICAgICAgcHJpbnQgbmF0aXZlX3JkZXBlbmRzX3Jvd19jb3VudAorCisgICAgICAgIGlmIG5hdGl2ZV9yZGVwZW5kc19udW0gIT0gbmF0aXZlX3JkZXBlbmRzX3Jvd19jb3VudDoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3IhIFRoZSByZXZlcnNlIGRlcGVuZGVudCBwYWNrYWdlcyBudW1iZXIgaXMgbm90IGNvcnJlY3QiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgKCJUaGUgcmV2ZXJzZSBkZXBlbmRlbnQgcGFja2FnZXMgbnVtYmVyIGlzIGNvcnJlY3QiKQorCisgICAgICAgIGRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJSZWNpcGVzIikuY2xpY2soKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTUgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTUoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisjIHN0ZXAgMworICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsICdDb25maWd1cmF0aW9uJykuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJCaXRCYWtlIHZhcmlhYmxlcyIpLmNsaWNrKCkKKyMgc3RlcCA0CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygibGliIikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuIHRvIHNlZSByZXN1bHQKKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5zYXZlX3NjcmVlbnNob3Qoc2NyZWVuc2hvdF90eXBlPSdzZWxlbml1bScsIGFwcGVuZF9uYW1lPSdzdGVwNCcpCisjIHN0ZXAgNQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tcmVtb3ZlIikuY2xpY2soKQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgIHByaW50IGhlYWRfbGlzdAorICAgICAgICBwcmludCBsZW4oaGVhZF9saXN0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGVhZF9saXN0ID09IFsnVmFyaWFibGUnLCAnVmFsdWUnLCAnU2V0IGluIGZpbGUnLCAnRGVzY3JpcHRpb24nXSkKKyMgc3RlcCA4CisgICAgICAgICMgc2VhcmNoIG90aGVyIHN0cmluZy4gYW5kIGNsaWNrICJWYXJpYWJsZSIgdG8gcmUtc29ydCwgY2hlY2sgaWYgdGFibGUKKyAgICAgICAgIyBoZWFkIGlzIHN0aWxsIHRoZSBzYW1lCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygicG9reSIpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnVmFyaWFibGUnKS5jbGljaygpCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhlYWRfbGlzdCA9PSBbJ1ZhcmlhYmxlJywgJ1ZhbHVlJywgJ1NldCBpbiBmaWxlJywgJ0Rlc2NyaXB0aW9uJ10pCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnb3RhYmxlJywgJ1ZhcmlhYmxlJykuY2xpY2soKQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoZWFkX2xpc3QgPT0gWydWYXJpYWJsZScsICdWYWx1ZScsICdTZXQgaW4gZmlsZScsICdEZXNjcmlwdGlvbiddKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MTYgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MTYoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisjIHN0ZXAgMi0zCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ0NvbmZpZ3VyYXRpb24nKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIkJpdEJha2UgdmFyaWFibGVzIikuY2xpY2soKQorICAgICAgICB2YXJpYWJsZV9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ3ZhcmlhYmxlX25hbWUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQodmFyaWFibGVfbGlzdCkpCisjIHN0ZXAgNAorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ290YWJsZScsICdWYXJpYWJsZScpLmNsaWNrKCkKKyAgICAgICAgdmFyaWFibGVfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCdjbGFzcycsICd2YXJpYWJsZV9uYW1lJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3RfaW52ZXJ0ZWQodmFyaWFibGVfbGlzdCkpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnb3RhYmxlJywgJ1ZhcmlhYmxlJykuY2xpY2soKQorIyBzdGVwIDUKKyAgICAgICAgIyBzZWFyY2hpbmcgd29uJ3QgY2hhbmdlIHRoZSBzZXF1ZW50aWFsaXR5CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgic2VhcmNoIikuY2xlYXIoKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLnNlbmRfa2V5cygibGliIikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICB2YXJpYWJsZV9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ3ZhcmlhYmxlX25hbWUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9zZXF1ZW5jZWQodmFyaWFibGVfbGlzdCkpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDkyMyAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0XzkyMyhzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgU3RlcCAyCisgICAgICAgICMgZGVmYXVsdCBzZXF1ZW5jZSBpbiAiQ29tcGxldGVkIG9uIiBjb2x1bW4gaXMgaW52ZXJ0ZWQKKyAgICAgICAgY19saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHQoJ2NsYXNzJywgJ2NvbXBsZXRlZF9vbicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc19saXN0X2ludmVydGVkKGNfbGlzdCkpCisgICAgICAgICMgc3RlcCAzCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzdGFydGVkX29uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxvZyIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJ0aW1lIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydPdXRjb21lJywgJ1RhcmdldCcsICdNYWNoaW5lJywgJ1N0YXJ0ZWQgb24nLCAnQ29tcGxldGVkIG9uJywgJ0ZhaWxlZCB0YXNrcycsICdFcnJvcnMnLCAnV2FybmluZ3MnLCAnV2FybmluZ3MnLCAnVGltZSddOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0ZW0gaW4gaGVhZF9saXN0KQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5MjQgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85MjQoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICAjIFBsZWFzZSByZWZlciB0byBjYXNlIDkyNCByZXF1aXJlbWVudAorICAgICAgICAjIGRlZmF1bHQgc2VxdWVuY2UgaW4gIkNvbXBsZXRlZCBvbiIgY29sdW1uIGlzIGludmVydGVkCisgICAgICAgIGNfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCdjbGFzcycsICdjb21wbGV0ZWRfb24nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZChjX2xpc3QpKQorICAgICAgICAjIFN0ZXAgNAorICAgICAgICAjIGNsaWNrIEVycm9ycyAsIG9yZGVyIGluICJDb21wbGV0ZWQgb24iIHNob3VsZCBiZSBkaXN0dXJiZWQuIFRoZW4gaGlkZQorICAgICAgICAjIGVycm9yIGNvbHVtbiB0byBjaGVjayBpZiBvcmRlciBpbiAiQ29tcGxldGVkIG9uIiBjYW4gYmUgcmVzdG9yZWQKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnRXJyb3JzJykuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZXJyb3JzX25vIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgTm90ZTogd2l0aG91dCB0aW1lLnNsZWVwIGhlcmUsIHRoZXJlJ2xsIGJlIHVucHJlZGljdGFibGUgZXJyb3IuLlRCRAorICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIGNfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2NvbHVtbl90ZXh0KCdjbGFzcycsICdjb21wbGV0ZWRfb24nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNfbGlzdF9pbnZlcnRlZChjX2xpc3QpKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDAgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisjIFN0ZXAgMi0zCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ1BhY2thZ2VzJykuY2xpY2soKQorICAgICAgICBjaGVja19oZWFkX2xpc3QgPSBbJ1BhY2thZ2UnLCAnUGFja2FnZSB2ZXJzaW9uJywgJ1NpemUnLCAnUmVjaXBlJ10KKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGVhZF9saXN0ID09IGNoZWNrX2hlYWRfbGlzdCkKKyMgU3RlcCA0CisgICAgICAgICMgcHVsbGRvd24gbWVudQorICAgICAgICBvcHRpb25faWRzID0gWydyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lJywgJ3JlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fYnJhbmNoJywgXAorICAgICAgICAgICAgICAgICAgICAgICdyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19jb21taXQnLCAnbGljZW5zZScsICdyZWNpcGVfX3ZlcnNpb24nXQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIGZvciBpdGVtIGluIG9wdGlvbl9pZHM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKGl0ZW0pLmlzX3NlbGVjdGVkKCk6CisgICAgICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKGl0ZW0pLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuIGhlcmUgdG8gb2JzZXJ2ZSB0aGF0ICdQYWNrYWdlJyBhbmQgJ1BhY2thZ2UgdmVyc2lvbicgaXMKKyAgICAgICAgIyBub3Qgc2VsZWN0YWJsZQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA0JykKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQxICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQxKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICAjIFN0ZXAgMi0zCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ1BhY2thZ2VzJykuY2xpY2soKQorICAgICAgICAjIGNvbHVtbiAtLSBQYWNrYWdlCisgICAgICAgIGNvbHVtbl9saXN0ID0gc2VsZi5nZXRfdGFibGVfY29sdW1uX3RleHRfYnlfY29sdW1uX251bWJlcignb3RhYmxlJywgMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzX2xpc3Rfc2VxdWVuY2VkKGNvbHVtbl9saXN0KSkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCdvdGFibGUnLCAnU2l6ZScpLmNsaWNrKCkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQyICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQyKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJQYWNrYWdlcyIpLmNsaWNrKCkKKyAgICAgICAgI2dldCBpbml0aWFsIHRhYmxlIGhlYWRlcgorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgICNyZW1vdmUgdGhlIFJlY2lwZSBjb2x1bW4gZnJvbSB0YWJsZSBoZWFkZXIKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInJlY2lwZV9fbmFtZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjZ2V0IG1vZGlmaWVkIHRhYmxlIGhlYWRlcgorICAgICAgICBuZXdfaGVhZCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhlYWRfbGlzdCA+IG5ld19oZWFkKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQzICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQzKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJQYWNrYWdlcyIpLmNsaWNrKCkKKyAgICAgICAgI3NlYXJjaCBmb3IgdGhlICJiYXNoIiBwYWNrYWdlIC0+IHRoaXMgc2hvdWxkIGRlZmluaXRlbHkgYmUgcHJlc2VudAorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMoImJhc2giKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaC1idXR0b24iKS5jbGljaygpCisgICAgICAgICNjaGVjayBmb3IgdGhlIHNlYXJjaCByZXN1bHQgbWVzc2FnZSAiWFggcGFja2FnZXMgZm91bmQiCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmlzX3RleHRfcHJlc2VudCgicGFja2FnZXMgZm91bmQiKSkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQ0ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQ0KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICAjIHN0ZXAgMTogdGVzdCBSZWNpcGVzIHBhZ2Ugc3R1ZmYKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiUmVjaXBlcyIpLmNsaWNrKCkKKyAgICAgICAgIyBmb3IgdGhlc2UgMyBpdGVtcywgZGVmYXVsdCBzdGF0dXMgaXMgbm90LWNoZWNrZWQKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImxheWVyX3ZlcnNpb25fX2JyYW5jaCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl92ZXJzaW9uX19sYXllcl9fY29tbWl0IikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgb3RhYmxlIGlzIHRoZSByZWNpcGVzIHRhYmxlIGhlcmUKKyAgICAgICAgb3RhYmxlX2hlYWRfdGV4dCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWyJMYXllciIsICJMYXllciBicmFuY2giLCAiTGF5ZXIgY29tbWl0IiwgIkxheWVyIGRpcmVjdG9yeSJdOgorICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXRlbSBub3QgaW4gb3RhYmxlX2hlYWRfdGV4dCkKKyAgICAgICAgIyBjbGljayB0aGUgZmlzdCByZWNpcGUsIHdoYXRldmVyIGl0IGlzCisgICAgICAgIHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQoIm90YWJsZSIsIDEsIDEpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfdGV4dF9wcmVzZW50KFsiTGF5ZXIiLCAiTGF5ZXIgYnJhbmNoIiwgIkxheWVyIGNvbW1pdCIsICJSZWNpcGUgZmlsZSJdKSkKKworICAgICAgICAjIHN0ZXAgMjogdGVzdCBQYWNrYWdlcyBwYWdlIHN0dWZmLiBhbG1vc3Qgc2FtZSBhcyBhYm92ZQorICAgICAgICBzZWxmLmRyaXZlci5iYWNrKCkKKyAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiUGFja2FnZXMiKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJyZWNpcGVfX2xheWVyX3ZlcnNpb25fX2xheWVyX19uYW1lIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInJlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fYnJhbmNoIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInJlY2lwZV9fbGF5ZXJfdmVyc2lvbl9fbGF5ZXJfX2NvbW1pdCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICBvdGFibGVfaGVhZF90ZXh0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCJvdGFibGUiKQorICAgICAgICBmb3IgaXRlbSBpbiBbIkxheWVyIiwgIkxheWVyIGJyYW5jaCIsICJMYXllciBjb21taXQiXToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKGl0ZW0gbm90IGluIG90YWJsZV9oZWFkX3RleHQpCisgICAgICAgICMgY2xpY2sgdGhlIGZpc3QgcmVjaXBlLCB3aGF0ZXZlciBpdCBpcworICAgICAgICBzZWxmLmdldF90YWJsZV9lbGVtZW50KCJvdGFibGUiLCAxLCAxKS5jbGljaygpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmlzX3RleHRfcHJlc2VudChbIkxheWVyIiwgIkxheWVyIGJyYW5jaCIsICJMYXllciBjb21taXQiXSkpCisKKyAgICAgICAgIyBzdGVwIDM6IHRlc3QgUGFja2FnZXMgY29yZS1pbWFnZS1taW5pbWFsKGltYWdlcykgc3R1ZmYuIGFsbW9zdCBzYW1lIGFzIGFib3ZlLiBOb3RlIHdoZW4gZnV0dXJlIGVsZW1lbnQtaWQgY2hhbmdlcy4uLgorICAgICAgICBzZWxmLmRyaXZlci5iYWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfbmFtZSIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJsYXllcl9icmFuY2giKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgibGF5ZXJfY29tbWl0IikuY2xpY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIG90YWJsZV9oZWFkX3RleHQgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoIm90YWJsZSIpCisgICAgICAgIGZvciBpdGVtIGluIFsiTGF5ZXIiLCAiTGF5ZXIgYnJhbmNoIiwgIkxheWVyIGNvbW1pdCJdOgorICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXRlbSBub3QgaW4gb3RhYmxlX2hlYWRfdGV4dCkKKyAgICAgICAgIyBjbGljayB0aGUgZmlzdCByZWNpcGUsIHdoYXRldmVyIGl0IGlzCisgICAgICAgIHNlbGYuZ2V0X3RhYmxlX2VsZW1lbnQoIm90YWJsZSIsIDEsIDEpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfdGV4dF9wcmVzZW50KFsiTGF5ZXIiLCAiTGF5ZXIgYnJhbmNoIiwgIkxheWVyIGNvbW1pdCJdKSkKKworICAgICAgICAjIHN0ZXAgNDogY2hlY2sgQ29uZmlndXJhdGlvbiBwYWdlCisgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJDb25maWd1cmF0aW9uIikuY2xpY2soKQorICAgICAgICBvdGFibGVfaGVhZF90ZXh0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gWyJMYXllciIsICJMYXllciBicmFuY2giLCAiTGF5ZXIgY29tbWl0Il06CisgICAgICAgICAgICBzZWxmLmZhaWxJZihpdGVtIG5vdCBpbiBvdGFibGVfaGVhZF90ZXh0KQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDUgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDUoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIGZvciBpdGVtcyBpbiBbIlBhY2thZ2VzIiwgIlJlY2lwZXMiLCAiVGFza3MiXToKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dChpdGVtcykuY2xpY2soKQorCisgICAgICAgICAgICAjIHRoaXMgbWF5IGJlIHBhZ2Ugc3BlY2lmaWMuIElmIGZ1dHVyZSBwYWdlIGNvbnRlbnQgY2hhbmdlcywgdHJ5IHRvIHJlcGxhY2UgaXQgd2l0aCBuZXcgeHBhdGgKKyAgICAgICAgICAgIHhwYXRoX3Nob3dyb3dzID0gIi9odG1sL2JvZHkvZGl2WzJdL2Rpdi9kaXZbMl0vZGl2WzJdL2RpdlsyXS9kaXYvZGl2L2RpdlsyXS9zZWxlY3QiCisgICAgICAgICAgICB4cGF0aF90YWJsZSA9ICIvaHRtbC9ib2R5L2RpdlsyXS9kaXYvZGl2WzJdL2RpdlsyXS90YWJsZS90Ym9keSIKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCh4cGF0aF9zaG93cm93cykuY2xpY2soKQorICAgICAgICAgICAgcm93c19kaXNwbGF5ZWQgPSBpbnQoc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoX3Nob3dyb3dzICsgIi9vcHRpb25bMl0iKS50ZXh0KQorCisgICAgICAgICAgICAjIG5vdCBzdXJlIGlmIHRoaXMgaXMgYSBTZWxlbml1bSBTZWxlY3QgYnVnOiBJZiBwYWdlIGlzIG5vdCByZWZyZXNoZWQgaGVyZSwgInNlbGVjdChieSB2aXNpYmxlIHRleHQpIiBvcGVyYXRpb24gd2lsbCBnbyBiYWNrIHRvIDEwMC1yb3cgcGFnZQorICAgICAgICAgICAgIyBTdXJlIHdlIGNhbiB1c2UgZHJpdmVyLmdldCh1cmwpIHRvIHJlZnJlc2ggcGFnZSwgYnV0IHNpbmNlIHBhZ2Ugd2lsbCB2YXJ5LCB3ZSB1c2UgY2xpY2sgbGluayB0ZXh0IGhlcmUKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoaXRlbXMpLmNsaWNrKCkKKyAgICAgICAgICAgIFNlbGVjdChzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJzZWxlY3QucGFnZXNpemUiKSkuc2VsZWN0X2J5X3Zpc2libGVfdGV4dChzdHIocm93c19kaXNwbGF5ZWQpKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfZWxlbWVudF9wcmVzZW50KEJ5LlhQQVRILCB4cGF0aF90YWJsZSArICIvdHJbIiArIHN0cihyb3dzX2Rpc3BsYXllZCkgKyJdIikpCisgICAgICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmlzX2VsZW1lbnRfcHJlc2VudChCeS5YUEFUSCwgeHBhdGhfdGFibGUgKyAiL3RyWyIgKyBzdHIocm93c19kaXNwbGF5ZWQrMSkgKyJdIikpCisKKyAgICAgICAgICAgICMgY2xpY2sgMXN0IHBhY2thZ2UsIHRoZW4gZ28gYmFjayB0byBjaGVjayBpZiBpdCdzIHN0aWxsIHRob3NlIHJvd3Mgc2hvd24uCisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoeHBhdGhfdGFibGUgKyAiL3RyWzFdL3RkWzFdIikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dChpdGVtcykuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuaXNfZWxlbWVudF9wcmVzZW50KEJ5LlhQQVRILCB4cGF0aF90YWJsZSArICIvdHJbIiArIHN0cihyb3dzX2Rpc3BsYXllZCkgKyJdIikpCisgICAgICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmlzX2VsZW1lbnRfcHJlc2VudChCeS5YUEFUSCwgeHBhdGhfdGFibGUgKyAiL3RyWyIgKyBzdHIocm93c19kaXNwbGF5ZWQrMSkgKyJdIikpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk0NiAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk0NihzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiQ29uZmlndXJhdGlvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDMtNAorICAgICAgICBjaGVja19saXN0ID0gWyJTdW1tYXJ5IiwgIkJpdEJha2UgdmFyaWFibGVzIl0KKyAgICAgICAgZm9yIGl0ZW0gaW4gY2hlY2tfbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2VsZW1lbnRfcHJlc2VudChob3c9QnkuTElOS19URVhULCB3aGF0PWl0ZW0pOgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlcyBub3QgZm91bmQiICVpdGVtKQorICAgICAgICBpZiBub3Qgc2VsZi5pc190ZXh0X3ByZXNlbnQoWydMYXllcnMnLCAnTGF5ZXInLCAnTGF5ZXIgYnJhbmNoJywgJ0xheWVyIGNvbW1pdCddKToKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJ0ZXh0IG5vdCBmb3VuZCIpCisgICAgICAgICMgc3RlcCA1CisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIkJpdEJha2UgdmFyaWFibGVzIikuY2xpY2soKQorICAgICAgICBpZiBub3Qgc2VsZi5pc190ZXh0X3ByZXNlbnQoWydWYXJpYWJsZScsICdWYWx1ZScsICdTZXQgaW4gZmlsZScsICdEZXNjcmlwdGlvbiddKToKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJ0ZXh0IG5vdCBmb3VuZCIpCisgICAgICAgICMgVGhpcyBtYXkgYmUgdW5zdGFibGUgYmVjYXVzZSBpdCdzIHBhZ2Utc3BlY2lmaWMKKyAgICAgICAgIyBzdGVwIDY6IHRoaXMgaXMgaG93IHdlIGZpbmQgZmlsdGVyIGJlc2lkZSAiU2V0IGluIGZpbGUiCisgICAgICAgIHRlbXBfZWxlbWVudCA9IHNlbGYuZmluZF9lbGVtZW50X2J5X3RleHRfaW5fdGFibGUoJ290YWJsZScsICJTZXQgaW4gZmlsZSIpCisgICAgICAgIHRlbXBfZWxlbWVudC5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi4uLy8qL2EvaVtAY2xhc3M9J2ljb24tZmlsdGVyIGZpbHRlcmVkJ10iKS5jbGljaygpCisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCgiKC8vaW5wdXRbQG5hbWU9J2ZpbHRlciddKVszXSIpLmNsaWNrKCkKKyAgICAgICAgYnRucyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfY3NzX3NlbGVjdG9yKCJidXR0b24uYnRuLmJ0bi1wcmltYXJ5IikKKyAgICAgICAgZm9yIGJ0biBpbiBidG5zOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJ0bi5jbGljaygpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZQorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA2JykKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJlZGl0LWNvbHVtbnMtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjIHNhdmUgc2NyZWVuIGhlcmUKKyAgICAgICAgIyBzdGVwIDcKKyAgICAgICAgIyB3ZSBzaG91bGQgbWFudWFsbHkgY2hlY2sgdGhlIHN0ZXAgNi04IHJlc3VsdCB1c2luZyBzY3JlZW5zaG90CisgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDcnKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgICMgc3RlcCA5CisgICAgICAgICMgY2xpY2sgdGhlIDFzdCBpdGVtLCBubyBtYXR0ZXIgd2hhdCBpdCBpcworICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAaWQ9J290YWJsZSddL3Rib2R5L3RyWzFdL3RkWzFdL2EiKS5jbGljaygpCisgICAgICAgICMgZ2l2ZSBpdCAxIHNlYyBzbyB0aGUgcG9wLXVwIGJlY29tZXMgdGhlICJhY3RpdmVfZWxlbWVudCIKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICBlbGVtZW50ID0gc2VsZi5kcml2ZXIuc3dpdGNoX3RvLmFjdGl2ZV9lbGVtZW50CisgICAgICAgIGNoZWNrX2xpc3QgPSBbJ09yZGVyJywgJ0NvbmZpZ3VyYXRpb24gZmlsZScsICdPcGVyYXRpb24nLCAnTGluZSBudW1iZXInXQorICAgICAgICBmb3IgaXRlbSBpbiBjaGVja19saXN0OgorICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gZWxlbWVudC50ZXh0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIlcyBub3QgZm91bmQiICVpdGVtKQorICAgICAgICAjIGFueSBiZXR0ZXIgd2F5IHRvIGNsb3NlIHRoaXMgcG9wLXVwPyAuLi4gVEJECisgICAgICAgIGVsZW1lbnQuZmluZF9lbGVtZW50X2J5X2NsYXNzX25hbWUoImNsb3NlIikuY2xpY2soKQorICAgICAgICAjIHN0ZXAgMTAgOiBuZWVkIHRvIG1hbnVhbGx5IGNoZWNrICJZb2N0byBNYW51YWwiIGluIHNhdmVkIHNjcmVlbgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfY3NzX3NlbGVjdG9yKCJpLmljb24tc2hhcmUuZ2V0LWluZm8iKS5jbGljaygpCisgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZQorICAgICAgICB0aW1lLnNsZWVwKDUpCisgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nbmF0aXZlJywgYXBwZW5kX25hbWU9J3N0ZXAxMCcpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk0NyAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk0NyhzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoImNvcmUtaW1hZ2UtbWluaW1hbCIpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCAnQ29uZmlndXJhdGlvbicpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDIKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiQml0QmFrZSB2YXJpYWJsZXMiKS5jbGljaygpCisgICAgICAgICMgc3RlcCAzCisgICAgICAgIGRlZiB4cGF0aF9vcHRpb24oY29sdW1uX25hbWUpOgorICAgICAgICAgICAgIyByZXR1cm4geHBhdGggb2Ygb3B0aW9ucyB1bmRlciAiRWRpdCBjb2x1bW5zIiBidXR0b24KKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNob3J0ZXN0X3hwYXRoKCdpZCcsICduYXZUYWInKSArIHNlbGYuc2hvcnRlc3RfeHBhdGgoJ2lkJywgJ2VkaXRjb2wnKSBcCisgICAgICAgICAgICAgICAgKyBzZWxmLnNob3J0ZXN0X3hwYXRoKCdpZCcsIGNvbHVtbl9uYW1lKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoJ2VkaXQtY29sdW1ucy1idXR0b24nKS5jbGljaygpCisgICAgICAgICMgYnkgZGVmYXVsdCwgb3B0aW9uICJEZXNjcmlwdGlvbiIgYW5kICJTZXQgaW4gZmlsZSIgd2VyZSBjaGVja2VkCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCh4cGF0aF9vcHRpb24oJ2Rlc2NyaXB0aW9uJykpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoX29wdGlvbignZmlsZScpKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgnZWRpdC1jb2x1bW5zLWJ1dHRvbicpLmNsaWNrKCkKKyAgICAgICAgY2hlY2tfbGlzdCA9IFsnRGVzY3JpcHRpb24nLCAnU2V0IGluIGZpbGUnXQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ290YWJsZScpCisgICAgICAgIGZvciBpdGVtIGluIGNoZWNrX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmZhaWxJZihpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgIyBjaGVjayB0aGVzZSAyIG9wdGlvbnMgYW5kIHZlcmlmeSBhZ2FpbgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoJ2VkaXQtY29sdW1ucy1idXR0b24nKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV94cGF0aCh4cGF0aF9vcHRpb24oJ2Rlc2NyaXB0aW9uJykpLmNsaWNrKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKHhwYXRoX29wdGlvbignZmlsZScpKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgnZWRpdC1jb2x1bW5zLWJ1dHRvbicpLmNsaWNrKCkKKyAgICAgICAgaGVhZF9saXN0ID0gc2VsZi5nZXRfdGFibGVfaGVhZF90ZXh0KCdvdGFibGUnKQorICAgICAgICBmb3IgaXRlbSBpbiBjaGVja19saXN0OgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0ZW0gaW4gaGVhZF9saXN0KQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NDggICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NDgoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgJ0NvbmZpZ3VyYXRpb24nKS5jbGljaygpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHQoIkJpdEJha2UgdmFyaWFibGVzIikuY2xpY2soKQorICAgICAgICAjZ2V0IG51bWJlciBvZiB2YXJpYWJsZXMgdmlzaWJsZSBieSBkZWZhdWx0CisgICAgICAgIG51bWJlcl9iZWZvcmVfc2VhcmNoID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2NsYXNzX25hbWUoJ3BhZ2UtaGVhZGVyJykudGV4dAorICAgICAgICAjIHNlYXJjaCBmb3IgYSB3aGlsZS4uLgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoInNlYXJjaCIpLmNsZWFyKCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2giKS5zZW5kX2tleXMoIkJCIikKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2lkKCJzZWFyY2gtYnV0dG9uIikuY2xpY2soKQorICAgICAgICAjZ2V0IG51bWJlciBvZiB2YXJpYWJsZXMgdmlzaWJsZSBhZnRlciBzZWFyY2gKKyAgICAgICAgbnVtYmVyX2FmdGVyX3NlYXJjaCA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9jbGFzc19uYW1lKCdwYWdlLWhlYWRlcicpLnRleHQKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG51bWJlcl9iZWZvcmVfc2VhcmNoID4gbnVtYmVyX2FmdGVyX3NlYXJjaCkKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTQ5ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTQ5KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dCgiY29yZS1pbWFnZS1taW5pbWFsIikuY2xpY2soKQorICAgICAgICBzZWxmLmZpbmRfZWxlbWVudF9ieV9saW5rX3RleHRfaW5fdGFibGUoJ25hdicsICdjb3JlLWltYWdlLW1pbmltYWwnKS5jbGljaygpCisgICAgICAgICMgc3RlcCAzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiUGFja2FnZXMgaW5jbHVkZWQiKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJEaXJlY3Rvcnkgc3RydWN0dXJlIikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKFRydWUpCisgICAgICAgICMgc3RlcCA0CisgICAgICAgIGhlYWRfbGlzdCA9IHNlbGYuZ2V0X3RhYmxlX2hlYWRfdGV4dCgnb3RhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydQYWNrYWdlJywgJ1BhY2thZ2UgdmVyc2lvbicsICdTaXplJywgJ0RlcGVuZGVuY2llcycsICdSZXZlcnNlIGRlcGVuZGVuY2llcycsICdSZWNpcGUnXToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdGVtIGluIGhlYWRfbGlzdCkKKyAgICAgICAgIyBzdGVwIDUtNgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfaWQoImVkaXQtY29sdW1ucy1idXR0b24iKS5jbGljaygpCisgICAgICAgIHNlbGVjdGFibGVfY2xhc3MgPSAnY2hlY2tib3gnCisgICAgICAgICMgbWluaW11bS10YWJsZSA6IG1lYW5zIHVuc2VsZWN0YWJsZSBpdGVtcworICAgICAgICB1bnNlbGVjdGFibGVfY2xhc3MgPSAnY2hlY2tib3ggbXV0ZWQnCisgICAgICAgIHNlbGVjdGFibGVfY2hlY2tfbGlzdCA9IFsnRGVwZW5kZW5jaWVzJywgJ0xheWVyJywgJ0xheWVyIGJyYW5jaCcsICdMYXllciBjb21taXQnLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGljZW5zZScsICdSZWNpcGUnLCAnUmVjaXBlIHZlcnNpb24nLCAnUmV2ZXJzZSBkZXBlbmRlbmNpZXMnLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2l6ZScsICdTaXplIG92ZXIgdG90YWwgKCUpJ10KKyAgICAgICAgdW5zZWxlY3RhYmxlX2NoZWNrX2xpc3QgPSBbJ1BhY2thZ2UnLCAnUGFja2FnZSB2ZXJzaW9uJ10KKyAgICAgICAgc2VsZWN0YWJsZV9saXN0ID0gbGlzdCgpCisgICAgICAgIHVuc2VsZWN0YWJsZV9saXN0ID0gbGlzdCgpCisgICAgICAgIHNlbGVjdGFibGVfZWxlbWVudHMgPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRzX2J5X3hwYXRoKCIvLypbQGlkPSdlZGl0Y29sJ10vLypbQGNsYXNzPSciICsgc2VsZWN0YWJsZV9jbGFzcyArICInXSIpCisgICAgICAgIHVuc2VsZWN0YWJsZV9lbGVtZW50cyA9IHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudHNfYnlfeHBhdGgoIi8vKltAaWQ9J2VkaXRjb2wnXS8vKltAY2xhc3M9JyIgKyB1bnNlbGVjdGFibGVfY2xhc3MgKyAiJ10iKQorICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxlY3RhYmxlX2VsZW1lbnRzOgorICAgICAgICAgICAgc2VsZWN0YWJsZV9saXN0LmFwcGVuZChlbGVtZW50LnRleHQpCisgICAgICAgIGZvciBlbGVtZW50IGluIHVuc2VsZWN0YWJsZV9lbGVtZW50czoKKyAgICAgICAgICAgIHVuc2VsZWN0YWJsZV9saXN0LmFwcGVuZChlbGVtZW50LnRleHQpCisgICAgICAgICMgY2hlY2sgdGhlbQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxlY3RhYmxlX2NoZWNrX2xpc3Q6CisgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWxlY3RhYmxlX2xpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiAlcyBub3QgZm91bmQgaW4gZHJvcGRvd24gbWVudSBcbiIgJSBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKFRydWUpCisgICAgICAgIGZvciBpdGVtIGluIHVuc2VsZWN0YWJsZV9jaGVja19saXN0OgorICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gdW5zZWxlY3RhYmxlX2xpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cuZXJyb3IoIiAlcyBub3QgZm91bmQgaW4gZHJvcGRvd24gbWVudSBcbiIgJSBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKFRydWUpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9pZCgiZWRpdC1jb2x1bW5zLWJ1dHRvbiIpLmNsaWNrKCkKKyAgICAgICAgIyBzdGVwIDcKKyAgICAgICAgc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3BhcnRpYWxfbGlua190ZXh0KCJEaXJlY3Rvcnkgc3RydWN0dXJlIikuY2xpY2soKQorICAgICAgICBoZWFkX2xpc3QgPSBzZWxmLmdldF90YWJsZV9oZWFkX3RleHQoJ2RpcnRhYmxlJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gWydEaXJlY3RvcnkgLyBGaWxlJywgJ1N5bWJvbGljIGxpbmsgdG8nLCAnU291cmNlIHBhY2thZ2UnLCAnU2l6ZScsICdQZXJtaXNzaW9ucycsICdPd25lcicsICdHcm91cCddOgorICAgICAgICAgICAgaWYgaXRlbSBub3QgaW4gaGVhZF9saXN0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCIgJXMgbm90IGZvdW5kIGluIERpcmVjdG9yeSBzdHJ1Y3R1cmUgdGFibGUgaGVhZCBcbiIgJSBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKFRydWUpCisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk1MCAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk1MChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgc3RlcDMmNDogc28gZmFyIHdlJ3JlIG5vdCBzdXJlIGlmIHRoZXJlJ3MgInN1Y2Nlc3NmdWwgYnVpbGQiIG9yICJmYWlsZWQKKyAgICAgICAgIyBidWlsZCIuSWYgZWl0aGVyIG9mIHRoZW0gZG9lc24ndCBleGlzdCwgd2UgY2FuIHN0aWxsIGdvIG9uIG90aGVyIHN0ZXBzCisgICAgICAgIGNoZWNrX2xpc3QgPSBbJ0NvbmZpZ3VyYXRpb24nLCAnVGFza3MnLCAnUmVjaXBlcycsICdQYWNrYWdlcycsICdUaW1lJywgJ0NQVSB1c2FnZScsICdEaXNrIEkvTyddCisgICAgICAgIGhhc19zdWNjZXNzZnVsX2J1aWxkID0gMQorICAgICAgICBoYXNfZmFpbGVkX2J1aWxkID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXNzX2ljb24gPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAY2xhc3M9J2ljb24tb2stc2lnbiBzdWNjZXNzJ10iKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5sb2cuaW5mbygibm8gc3VjY2Vzc2Z1bCBidWlsZCBleGlzdHMiKQorICAgICAgICAgICAgaGFzX3N1Y2Nlc3NmdWxfYnVpbGQgPSAwCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIGhhc19zdWNjZXNzZnVsX2J1aWxkOgorICAgICAgICAgICAgcGFzc19pY29uLmNsaWNrKCkKKyAgICAgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZSB0byBjaGVjayBpZiBpdCBtYXRjaGVzIHJlcXVpcmVtZW50LgorICAgICAgICAgICAgc2VsZi5icm93c2VyX2RlbGF5KCkKKyAgICAgICAgICAgIHNlbGYuc2F2ZV9zY3JlZW5zaG90KHNjcmVlbnNob3RfdHlwZT0nc2VsZW5pdW0nLCBhcHBlbmRfbmFtZT0nc3RlcDNfMScpCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBjaGVja19saXN0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0X2luX3RhYmxlKCduYXYnLCBpdGVtKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJsaW5rICAlcyBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHBhZ2UiICUgaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKyAgICAgICAgICAgICMgc3RlcCA2CisgICAgICAgICAgICBjaGVja19saXN0XzIgPSBbJ1BhY2thZ2VzIGluY2x1ZGVkJywgJ1RvdGFsIHBhY2thZ2Ugc2l6ZScsIFwKKyAgICAgICAgICAgICAgICAgICAgICAnTGljZW5zZSBtYW5pZmVzdCcsICdJbWFnZSBmaWxlcyddCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc190ZXh0X3ByZXNlbnQoY2hlY2tfbGlzdF8yKSkKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWlsX2ljb24gPSBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfeHBhdGgoIi8vKltAY2xhc3M9J2ljb24tbWludXMtc2lnbiBlcnJvciddIikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGhhc19mYWlsZWRfYnVpbGQgPSAwCisgICAgICAgICAgICBzZWxmLmxvZy5pbmZvKCJubyBmYWlsZWQgYnVpbGQgZXhpc3RzIikKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgaGFzX2ZhaWxlZF9idWlsZDoKKyAgICAgICAgICAgIGZhaWxfaWNvbi5jbGljaygpCisgICAgICAgICAgICAjIHNhdmUgc2NyZWVuIGhlcmUgdG8gY2hlY2sgaWYgaXQgbWF0Y2hlcyByZXF1aXJlbWVudC4KKyAgICAgICAgICAgIHNlbGYuYnJvd3Nlcl9kZWxheSgpCisgICAgICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXAzXzInKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gY2hlY2tfbGlzdDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluZF9lbGVtZW50X2J5X2xpbmtfdGV4dF9pbl90YWJsZSgnbmF2JywgaXRlbSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZy5lcnJvcigibGluayAgJXMgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBwYWdlIiAlIGl0ZW0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKFRydWUpCisgICAgICAgICAgICAjIHN0ZXAgNyBpbnZvbHZlZAorICAgICAgICAgICAgY2hlY2tfbGlzdF8zID0gWydNYWNoaW5lJywgJ0Rpc3RybycsICdMYXllcnMnLCAnVG90YWwgbnVtYmVyIG9mIHRhc2tzJywgJ1Rhc2tzIGV4ZWN1dGVkJywgXAorICAgICAgICAgICAgICAgICAgICAgICdUYXNrcyBub3QgZXhlY3V0ZWQnLCAnUmV1c2UnLCAnUmVjaXBlcyBidWlsdCcsICdQYWNrYWdlcyBidWlsdCddCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5pc190ZXh0X3ByZXNlbnQoY2hlY2tfbGlzdF8zKSkKKyAgICAgICAgICAgIHNlbGYuZHJpdmVyLmJhY2soKQorCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyAgQ0FTRSA5NTEgICMKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF85NTEoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZV9ubyA9IHNlbGYuZ2V0X2Nhc2VfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnIENBU0UgJXMgbG9nOiAnICUgc3RyKHNlbGYuY2FzZV9ubykpCisgICAgICAgIHNlbGYuZHJpdmVyLm1heGltaXplX3dpbmRvdygpCisgICAgICAgIHNlbGYuZHJpdmVyLmdldChzZWxmLmJhc2VfdXJsKQorICAgICAgICAjIGN1cnJlbnRseSB0ZXN0IGNhc2UgaXRzZWxmIGlzbid0IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyAiMSBzdWNjZXNzZnVsIGFuZAorICAgICAgICAjIDEgZmFpbGVkIGJ1aWxkIgorICAgICAgICBoYXNfc3VjY2Vzc2Z1bF9idWlsZCA9IDEKKyAgICAgICAgaGFzX2ZhaWxlZF9idWlsZCA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFpbF9pY29uID0gc2VsZi5kcml2ZXIuZmluZF9lbGVtZW50X2J5X3hwYXRoKCIvLypbQGNsYXNzPSdpY29uLW1pbnVzLXNpZ24gZXJyb3InXSIpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBoYXNfZmFpbGVkX2J1aWxkID0gMAorICAgICAgICAgICAgc2VsZi5sb2cuaW5mbygibm8gZmFpbGVkIGJ1aWxkIGV4aXN0cyIpCisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgaWYgdGhlcmUncyBmYWlsZWQgYnVpbGQsIHdlIGNhbiBwcm9jZWVkCisgICAgICAgIGlmIGhhc19mYWlsZWRfYnVpbGQ6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfcGFydGlhbF9saW5rX3RleHQoImVycm9yIikuY2xpY2soKQorICAgICAgICAgICAgc2VsZi5kcml2ZXIuYmFjaygpCisgICAgICAgICMgbm90IHN1cmUgaWYgdGhlcmUgIm11c3QgYmUiIHNvbWUgd2FybmluZ3MsIHNvIGhlcmUgc2F2ZSBhIHNjcmVlbgorICAgICAgICBzZWxmLmJyb3dzZXJfZGVsYXkoKQorICAgICAgICBzZWxmLnNhdmVfc2NyZWVuc2hvdChzY3JlZW5zaG90X3R5cGU9J3NlbGVuaXVtJywgYXBwZW5kX25hbWU9J3N0ZXA0JykKKworCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgIENBU0UgOTU1ICAjCisgICAgICAgICMjIyMjIyMjIyMjIyMjCisgICAgZGVmIHRlc3RfOTU1KHNlbGYpOgorICAgICAgICBzZWxmLmNhc2Vfbm8gPSBzZWxmLmdldF9jYXNlX251bWJlcigpCisgICAgICAgIHNlbGYubG9nLmluZm8oJyBDQVNFICVzIGxvZzogJyAlIHN0cihzZWxmLmNhc2Vfbm8pKQorICAgICAgICBzZWxmLmRyaXZlci5tYXhpbWl6ZV93aW5kb3coKQorICAgICAgICBzZWxmLmRyaXZlci5nZXQoc2VsZi5iYXNlX3VybCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygiIFlvdSBzaG91bGQgbWFudWFsbHkgY3JlYXRlIGFsbCBpbWFnZXMgYmVmb3JlIHRlc3Qgc3RhcnRzISIpCisgICAgICAgICMgU28gZmFyIHRoZSBjYXNlIGl0c2VsZiBpcyBub3QgcmVzcG9uc2FibGUgZm9yIGNyZWF0aW5nIGFsbCBzb3J0cyBvZiBpbWFnZXMuCisgICAgICAgICMgU28gYXNzdW1pbmcgdGhleSBhcmUgYWxyZWFkeSB0aGVyZQorICAgICAgICAjIHN0ZXAgMgorICAgICAgICBzZWxmLmRyaXZlci5maW5kX2VsZW1lbnRfYnlfbGlua190ZXh0KCJjb3JlLWltYWdlLW1pbmltYWwiKS5jbGljaygpCisgICAgICAgICMgc2F2ZSBzY3JlZW4gaGVyZSB0byBzZWUgdGhlIHBhZ2UgY29tcG9uZW50CisKKworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgICAgICAjICBDQVNFIDk1NiAgIworICAgICAgICAjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0Xzk1NihzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlX25vID0gc2VsZi5nZXRfY2FzZV9udW1iZXIoKQorICAgICAgICBzZWxmLmxvZy5pbmZvKCcgQ0FTRSAlcyBsb2c6ICcgJSBzdHIoc2VsZi5jYXNlX25vKSkKKyAgICAgICAgc2VsZi5kcml2ZXIubWF4aW1pemVfd2luZG93KCkKKyAgICAgICAgc2VsZi5kcml2ZXIuZ2V0KHNlbGYuYmFzZV91cmwpCisgICAgICAgICMgc3RlcCAyLTMgbmVlZCB0byBydW4gbWFudWFsbHkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygic3RlcCAyLTM6IGNoZWNraW5nIHRoZSBoZWxwIG1lc3NhZ2Ugd2hlbiB5b3UgaG92ZXIgb24gaGVscCBpY29uIG9mIHRhcmdldCxcCisgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzLCByZWNpcGVzLCBwYWNrYWdlcyBuZWVkIHRvIHJ1biBtYW51YWxseSIpCisgICAgICAgIHNlbGYuZHJpdmVyLmZpbmRfZWxlbWVudF9ieV9wYXJ0aWFsX2xpbmtfdGV4dCgiVG9hc3RlciBtYW51YWwiKS5jbGljaygpCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3RleHRfcHJlc2VudCgiVG9hc3RlciBNYW51YWwiKToKKyAgICAgICAgICAgIHNlbGYubG9nLmVycm9yKCJwbGVhc2UgY2hlY2sgW1RvYXN0ZXIgbWFudWFsXSBsaW5rIG9uIHBhZ2UiKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYoVHJ1ZSkKKwpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3RvYXN0ZXJfdGVzdC5jZmcgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3RvYXN0ZXJ1aXRlc3QvdG9hc3Rlcl90ZXN0LmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA1ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9jb250cmliL3R0cy90b2FzdGVydWl0ZXN0L3RvYXN0ZXJfdGVzdC5jZmcKQEAgLTAsMCArMSwyMSBAQAorIyBDb25maWd1cmF0aW9uIGZpbGUgZm9yIHRvYXN0ZXJfdGVzdAorIyBTb3J0ZWQgYnkgZGlmZmVyZW50IGhvc3QgdHlwZQorCisjIHRlc3QgYnJvd3NlciBjb3VsZCBiZTogZmlyZWZveDsgY2hyb21lOyBpZShzdGlsbCB1bmRlciBkZXZlbG9wbWVudCkKKyMgbG9nZ2luZ19sZXZlbCBjb3VsZCBiZTogQ1JJVElDQUw7IEVSUk9SOyBXQVJOSU5HOyBJTkZPOyBERUJVRzsgTk9UU0VUCisKKworW3RvYXN0ZXJfdGVzdF9saW51eF0KK3RvYXN0ZXJfdXJsID0gJ2h0dHA6Ly8xMjcuMC4wLjE6ODAwMCcKK3Rlc3RfYnJvd3NlciA9ICdmaXJlZm94JwordGVzdF9jYXNlcyA9IFs5NDZdCitsb2dnaW5nX2xldmVsID0gJ0lORk8nCisKKworW3RvYXN0ZXJfdGVzdF93aW5kb3dzXQordG9hc3Rlcl91cmwgPSAnaHR0cDovLzEyNy4wLjAuMTo4MDAwJwordGVzdF9icm93c2VyID0gWydpZScsICdmaXJlZm94JywgJ2Nocm9tZSddCit0ZXN0X2Nhc2VzID0gWzkwMSwgOTAyLCA5MDNdCitsb2dnaW5nX2xldmVsID0gJ0RFQlVHJworCisKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdXJsY2hlY2sucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3VybGNoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MjBmODIKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3VybGNoZWNrLnB5CkBAIC0wLDAgKzEsNTMgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBzeXMKKworaW1wb3J0IGh0dHBsaWIyCitpbXBvcnQgY29uZmlnCitpbXBvcnQgdXJsbGlzdAorCisKK2NvbmZpZy5sb2dnZXIuaW5mbygiVGVzdGluZyAlcyB3aXRoICVzIiwgY29uZmlnLlRPQVNURVJfQkFTRVVSTCwgY29uZmlnLlczQ19WQUxJREFUT1IpCisKK2RlZiB2YWxpZGF0ZV9odG1sNSh1cmwpOgorICAgIGh0dHBfY2xpZW50ID0gaHR0cGxpYjIuSHR0cChOb25lKQorICAgIHN0YXR1cyA9ICJGYWlsZWQiCisgICAgZXJyb3JzID0gLTEKKyAgICB3YXJuaW5ncyA9IC0xCisKKyAgICB1cmxyZXF1ZXN0ID0gY29uZmlnLlczQ19WQUxJREFUT1IrdXJsCisKKyAgICAjIHB5bGludDogZGlzYWJsZT1icm9hZC1leGNlcHQKKyAgICAjIHdlIGRpc2FibGUgdGhlIGJyb2FkLWV4Y2VwdCBiZWNhdXNlIHdlIHdhbnQgdG8gYWN0dWFsbHkgY2F0Y2ggYWxsIHBvc3NpYmxlIGV4Y2VwdGlvbnMKKyAgICB0cnk6CisgICAgICAgIHJlc3AsIF8gPSBodHRwX2NsaWVudC5yZXF1ZXN0KHVybHJlcXVlc3QsICJIRUFEIikKKyAgICAgICAgaWYgcmVzcFsneC13M2MtdmFsaWRhdG9yLXN0YXR1cyddICE9ICJBYm9ydCI6CisgICAgICAgICAgICBzdGF0dXMgPSByZXNwWyd4LXczYy12YWxpZGF0b3Itc3RhdHVzJ10KKyAgICAgICAgICAgIGVycm9ycyA9IGludChyZXNwWyd4LXczYy12YWxpZGF0b3ItZXJyb3JzJ10pCisgICAgICAgICAgICB3YXJuaW5ncyA9IGludChyZXNwWyd4LXczYy12YWxpZGF0b3Itd2FybmluZ3MnXSkKKworICAgICAgICAgICAgaWYgc3RhdHVzID09ICdJbnZhbGlkJzoKKyAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLndhcm4oIkZhaWxlZCAlcyBpcyAlc1x0ZXJyb3JzICVzIHdhcm5pbmdzICVzIChjaGVjayBhdCAlcykiLCB1cmwsIHN0YXR1cywgZXJyb3JzLCB3YXJuaW5ncywgdXJscmVxdWVzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5kZWJ1ZygiT0shICVzIiwgdXJsKQorCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybigiRmFpbGVkIHZhbGlkYXRpb24gY2FsbDogJXMiLCBleGMpCisgICAgcmV0dXJuIChzdGF0dXMsIGVycm9ycywgd2FybmluZ3MpCisKKworZGVmIHByaW50X3ZhbGlkYXRpb24odXJsKToKKyAgICBzdGF0dXMsIGVycm9ycywgd2FybmluZ3MgPSB2YWxpZGF0ZV9odG1sNSh1cmwpCisgICAgY29uZmlnLmxvZ2dlci5lcnJvcigidXJsICVzIGlzICVzXHRlcnJvcnMgJXMgd2FybmluZ3MgJXMgKGNoZWNrIGF0ICVzKSIsIHVybCwgc3RhdHVzLCBlcnJvcnMsIHdhcm5pbmdzLCBjb25maWcuVzNDX1ZBTElEQVRPUit1cmwpCisKKworZGVmIG1haW4oKToKKyAgICBwcmludCgiVGVzdGluZyAlcyB3aXRoICVzIiAlIChjb25maWcuVE9BU1RFUl9CQVNFVVJMLCBjb25maWcuVzNDX1ZBTElEQVRPUikpCisKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgcHJpbnRfdmFsaWRhdGlvbihzeXMuYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgICBmb3IgdXJsIGluIHVybGxpc3QuVVJMUzoKKyAgICAgICAgICAgIHByaW50X3ZhbGlkYXRpb24oY29uZmlnLlRPQVNURVJfQkFTRVVSTCt1cmwpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3VybGxpc3QucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL2NvbnRyaWIvdHRzL3VybGxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiOWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvY29udHJpYi90dHMvdXJsbGlzdC5weQpAQCAtMCwwICsxLDM5IEBACitVUkxTID0gWworICAgICd0b2FzdGVyZ3VpL2xhbmRpbmcvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZHMvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3Rhc2tzLycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS90YXNrcy8xLycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS90YXNrLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcmVjaXBlcy8nLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcmVjaXBlLzEvYWN0aXZlX3RhYi8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3JlY2lwZS8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3JlY2lwZV9wYWNrYWdlcy8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3BhY2thZ2VzLycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9wYWNrYWdlLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcGFja2FnZV9idWlsdF9kZXBlbmRlbmNpZXMvMScsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9wYWNrYWdlX2luY2x1ZGVkX2RldGFpbC8xLzEnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvcGFja2FnZV9pbmNsdWRlZF9kZXBlbmRlbmNpZXMvMS8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3BhY2thZ2VfaW5jbHVkZWRfcmV2ZXJzZV9kZXBlbmRlbmNpZXMvMS8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3RhcmdldC8xJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3RhcmdldC8xL3RhcmdldHBrZycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS90YXJnZXQvMS9kaXJpbmZvJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL3RhcmdldC8xL2RpcmluZm9fZmlsZXBhdGgvXy9iaW4vYmFzaCcsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS9jb25maWd1cmF0aW9uJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL2NvbmZpZ3ZhcnMnLAorICAgICd0b2FzdGVyZ3VpL2J1aWxkLzEvYnVpbGR0aW1lJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL2NwdXVzYWdlJywKKyAgICAndG9hc3Rlcmd1aS9idWlsZC8xL2Rpc2tpbycsCisgICAgJ3RvYXN0ZXJndWkvYnVpbGQvMS90YXJnZXQvMS9wYWNrYWdlZmlsZS8xJywKKyAgICAndG9hc3Rlcmd1aS9uZXdwcm9qZWN0LycsCisgICAgJ3RvYXN0ZXJndWkvcHJvamVjdHMvJywKKyAgICAndG9hc3Rlcmd1aS9wcm9qZWN0LzEnLAorICAgICd0b2FzdGVyZ3VpL3Byb2plY3QvMS9jb25maWd1cmF0aW9uJywKKyAgICAndG9hc3Rlcmd1aS9wcm9qZWN0LzEvYnVpbGRzLycsCisgICAgJ3RvYXN0ZXJndWkvcHJvamVjdC8xL2xheWVycy8nLAorICAgICd0b2FzdGVyZ3VpL3Byb2plY3QvMS9sYXllci8xJywKKyAgICAndG9hc3Rlcmd1aS9wcm9qZWN0LzEvaW1wb3J0bGF5ZXInLAorICAgICd0b2FzdGVyZ3VpL3Byb2plY3QvMS90YXJnZXRzLycsCisgICAgJ3RvYXN0ZXJndWkvcHJvamVjdC8xL21hY2hpbmVzLycsCisgICAgJ3RvYXN0ZXJndWkvJywKK10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvbWFuYWdlLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9tYW5hZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2VhYTExYgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvbWFuYWdlLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgb3MuZW52aXJvbi5zZXRkZWZhdWx0KCJESkFOR09fU0VUVElOR1NfTU9EVUxFIiwgInRvYXN0ZXJtYWluLnNldHRpbmdzIikKKworICAgIGZyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudCBpbXBvcnQgZXhlY3V0ZV9mcm9tX2NvbW1hbmRfbGluZQorCisgICAgZXhlY3V0ZV9mcm9tX2NvbW1hbmRfbGluZShzeXMuYXJndikKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9tYW5hZ2VtZW50L19faW5pdF9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9jb21tYW5kcy9fX2luaXRfXy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21hbmFnZW1lbnQvY29tbWFuZHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21hbmFnZW1lbnQvY29tbWFuZHMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21hbmFnZW1lbnQvY29tbWFuZHMvbHN1cGRhdGVzLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWFuYWdlbWVudC9jb21tYW5kcy9sc3VwZGF0ZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlOTUxMwotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21hbmFnZW1lbnQvY29tbWFuZHMvbHN1cGRhdGVzLnB5CkBAIC0wLDAgKzEsMTIgQEAKK2Zyb20gZGphbmdvLmNvcmUubWFuYWdlbWVudC5iYXNlIGltcG9ydCBOb0FyZ3NDb21tYW5kLCBDb21tYW5kRXJyb3IKK2Zyb20gb3JtLm1vZGVscyBpbXBvcnQgTGF5ZXJTb3VyY2UKK2ltcG9ydCBvcworCitjbGFzcyBDb21tYW5kKE5vQXJnc0NvbW1hbmQpOgorICAgIGFyZ3MgICAgPSAiIgorICAgIGhlbHAgICAgPSAiVXBkYXRlcyBsb2NhbGx5IGNhY2hlZCBpbmZvcm1hdGlvbiBmcm9tIGFsbCBMYXllclNvdXJjZXMiCisKKworICAgIGRlZiBoYW5kbGVfbm9hcmdzKHNlbGYsICoqb3B0aW9ucyk6CisgICAgICAgIGZvciBscyBpbiBMYXllclNvdXJjZS5vYmplY3RzLmFsbCgpOgorICAgICAgICAgICAgbHMudXBkYXRlKCkKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwMV9pbml0aWFsLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAxX2luaXRpYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkZWVmOAotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwMV9pbml0aWFsLnB5CkBAIC0wLDAgKzEsNDAwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBtb2RlbCAnQnVpbGQnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9idWlsZCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdtYWNoaW5lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnaW1hZ2VfZnN0eXBlcycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2Rpc3RybycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2Rpc3Ryb192ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnc3RhcnRlZF9vbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKSgpKSwKKyAgICAgICAgICAgICgnY29tcGxldGVkX29uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdvdXRjb21lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0yKSksCisgICAgICAgICAgICAoJ2Vycm9yc19ubycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCd3YXJuaW5nc19ubycsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdjb29rZXJfbG9nX3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTUwMCkpLAorICAgICAgICAgICAgKCdidWlsZF9uYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnYml0YmFrZV92ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0J1aWxkJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1RhcmdldCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3RhcmdldCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJ1aWxkJ10pKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnaXNfaW1hZ2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnKShkZWZhdWx0PUZhbHNlKSksCisgICAgICAgICAgICAoJ2ZpbGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ2ZpbGVfc2l6ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1RhcmdldCddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdUYXNrJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdGFzaycsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0ndGFza19idWlsZCcsIHRvPW9ybVsnb3JtLkJ1aWxkJ10pKSwKKyAgICAgICAgICAgICgnb3JkZXInLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgndGFza19leGVjdXRlZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcpKGRlZmF1bHQ9RmFsc2UpKSwKKyAgICAgICAgICAgICgnb3V0Y29tZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9NSkpLAorICAgICAgICAgICAgKCdzc3RhdGVfY2hlY2tzdW0nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdwYXRoX3RvX3NzdGF0ZV9vYmonLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD01MDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgncmVjaXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdidWlsZF9yZWNpcGUnLCB0bz1vcm1bJ29ybS5SZWNpcGUnXSkpLAorICAgICAgICAgICAgKCd0YXNrX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdzb3VyY2VfdXJsJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1LCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3dvcmtfZGlyZWN0b3J5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1LCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3NjcmlwdF90eXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ2xpbmVfbnVtYmVyJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSksCisgICAgICAgICAgICAoJ2Rpc2tfaW8nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgnY3B1X3VzYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJykobnVsbD1UcnVlLCBtYXhfZGlnaXRzPTYsIGRlY2ltYWxfcGxhY2VzPTIpKSwKKyAgICAgICAgICAgICgnZWxhcHNlZF90aW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0wLCBtYXhfbGVuZ3RoPTUwKSksCisgICAgICAgICAgICAoJ3NzdGF0ZV9yZXN1bHQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgICAgICgnbWVzc2FnZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjQwKSksCisgICAgICAgICAgICAoJ2xvZ2ZpbGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydUYXNrJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1Rhc2tfRGVwZW5kZW5jeScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3Rhc2tfZGVwZW5kZW5jeScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCd0YXNrJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSd0YXNrX2RlcGVuZGVuY2llc190YXNrJywgdG89b3JtWydvcm0uVGFzayddKSksCisgICAgICAgICAgICAoJ2RlcGVuZHNfb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnLCB0bz1vcm1bJ29ybS5UYXNrJ10pKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydUYXNrX0RlcGVuZGVuY3knXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnUGFja2FnZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3BhY2thZ2UnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnYnVpbGQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CdWlsZCddKSksCisgICAgICAgICAgICAoJ3JlY2lwZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlJlY2lwZSddLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICAgICAoJ3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZXZpc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MzIsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnc2l6ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdpbnN0YWxsZWRfc2l6ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdzZWN0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD04MCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsaWNlbnNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD04MCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1BhY2thZ2UnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnUGFja2FnZV9EZXBlbmRlbmN5JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcGFja2FnZV9kZXBlbmRlbmN5JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3BhY2thZ2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZScsIHRvPW9ybVsnb3JtLlBhY2thZ2UnXSkpLAorICAgICAgICAgICAgKCdkZXBlbmRzX29uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnLCB0bz1vcm1bJ29ybS5QYWNrYWdlJ10pKSwKKyAgICAgICAgICAgICgnZGVwX3R5cGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFyZ2V0J10sIG51bGw9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1BhY2thZ2VfRGVwZW5kZW5jeSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV90YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgndGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFyZ2V0J10pKSwKKyAgICAgICAgICAgICgncGFja2FnZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlBhY2thZ2UnXSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdQYWNrYWdlX0ZpbGUnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9wYWNrYWdlX2ZpbGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncGFja2FnZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0nYnVpbGRmaWxlbGlzdF9wYWNrYWdlJywgdG89b3JtWydvcm0uUGFja2FnZSddKSksCisgICAgICAgICAgICAoJ3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnc2l6ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1BhY2thZ2VfRmlsZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdSZWNpcGUnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9yZWNpcGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl92ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdyZWNpcGVfbGF5ZXJfdmVyc2lvbicsIHRvPW9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSkpLAorICAgICAgICAgICAgKCdzdW1tYXJ5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnZGVzY3JpcHRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdzZWN0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnbGljZW5zZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjAwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2xpY2Vuc2luZ19pbmZvJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCdob21lcGFnZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykobWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnYnVndHJhY2tlcicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykobWF4X2xlbmd0aD0yMDAsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnZmlsZV9wYXRoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUmVjaXBlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1JlY2lwZV9EZXBlbmRlbmN5JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcmVjaXBlX2RlcGVuZGVuY3knLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncmVjaXBlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdyX2RlcGVuZGVuY2llc19yZWNpcGUnLCB0bz1vcm1bJ29ybS5SZWNpcGUnXSkpLAorICAgICAgICAgICAgKCdkZXBlbmRzX29uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdyX2RlcGVuZGVuY2llc19kZXBlbmRzJywgdG89b3JtWydvcm0uUmVjaXBlJ10pKSwKKyAgICAgICAgICAgICgnZGVwX3R5cGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydSZWNpcGVfRGVwZW5kZW5jeSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdMYXllcicKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2xheWVyJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdsb2NhbF9wYXRoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICAgICAoJ2xheWVyX2luZGV4X3VybCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykobWF4X2xlbmd0aD0yMDApKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydMYXllciddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdMYXllcl9WZXJzaW9uJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fbGF5ZXJfdmVyc2lvbicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0nbGF5ZXJfdmVyc2lvbl9idWlsZCcsIHRvPW9ybVsnb3JtLkJ1aWxkJ10pKSwKKyAgICAgICAgICAgICgnbGF5ZXInLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J2xheWVyX3ZlcnNpb25fbGF5ZXInLCB0bz1vcm1bJ29ybS5MYXllciddKSksCisgICAgICAgICAgICAoJ2JyYW5jaCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTApKSwKKyAgICAgICAgICAgICgnY29tbWl0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgncHJpb3JpdHknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydMYXllcl9WZXJzaW9uJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1ZhcmlhYmxlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdmFyaWFibGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnYnVpbGQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShyZWxhdGVkX25hbWU9J3ZhcmlhYmxlX2J1aWxkJywgdG89b3JtWydvcm0uQnVpbGQnXSkpLAorICAgICAgICAgICAgKCd2YXJpYWJsZV9uYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgndmFyaWFibGVfdmFsdWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ2NoYW5nZWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnKShkZWZhdWx0PUZhbHNlKSksCisgICAgICAgICAgICAoJ2h1bWFuX3JlYWRhYmxlX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTIwMCkpLAorICAgICAgICAgICAgKCdkZXNjcmlwdGlvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydWYXJpYWJsZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdWYXJpYWJsZUhpc3RvcnknCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV92YXJpYWJsZWhpc3RvcnknLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgndmFyaWFibGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5WYXJpYWJsZSddKSksCisgICAgICAgICAgICAoJ2ZpbGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTI1NSkpLAorICAgICAgICAgICAgKCdsaW5lX251bWJlcicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCdvcGVyYXRpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTE2KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnVmFyaWFibGVIaXN0b3J5J10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0xvZ01lc3NhZ2UnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9sb2dtZXNzYWdlJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2J1aWxkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQnVpbGQnXSkpLAorICAgICAgICAgICAgKCdsZXZlbCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCkpLAorICAgICAgICAgICAgKCdtZXNzYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNDApKSwKKyAgICAgICAgICAgICgncGF0aG5hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgICAgICgnbGluZW5vJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykobnVsbD1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnTG9nTWVzc2FnZSddKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0J1aWxkJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fYnVpbGQnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1RhcmdldCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3RhcmdldCcpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVGFzaycKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3Rhc2snKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1Rhc2tfRGVwZW5kZW5jeScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3Rhc2tfZGVwZW5kZW5jeScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUGFja2FnZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3BhY2thZ2UnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1BhY2thZ2VfRGVwZW5kZW5jeScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3BhY2thZ2VfZGVwZW5kZW5jeScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdQYWNrYWdlX0ZpbGUnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9wYWNrYWdlX2ZpbGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1JlY2lwZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3JlY2lwZScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUmVjaXBlX0RlcGVuZGVuY3knCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9yZWNpcGVfZGVwZW5kZW5jeScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnTGF5ZXInCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9sYXllcicpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnTGF5ZXJfVmVyc2lvbicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2xheWVyX3ZlcnNpb24nKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1ZhcmlhYmxlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdmFyaWFibGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1ZhcmlhYmxlSGlzdG9yeScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3ZhcmlhYmxlaGlzdG9yeScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnTG9nTWVzc2FnZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2xvZ21lc3NhZ2UnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2VfZnN0eXBlcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNpbmdfaW5mbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCcsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICc1J30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwMl9hdXRvX19hZGRfZmllbGRfYnVpbGRfdGltZXNwZW50LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDAyX2F1dG9fX2FkZF9maWVsZF9idWlsZF90aW1lc3BlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0MjFjYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwMl9hdXRvX19hZGRfZmllbGRfYnVpbGRfdGltZXNwZW50LnB5CkBAIC0wLDAgKzEsMTgwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnQnVpbGQudGltZXNwZW50JworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2J1aWxkJywgJ3RpbWVzcGVudCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD0wKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnQnVpbGQudGltZXNwZW50JworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2J1aWxkJywgJ3RpbWVzcGVudCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9mc3R5cGVzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNpbmdfaW5mbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCcsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICc1J30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwM190aW1lc3BlbnQucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDNfdGltZXNwZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDBmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDNfdGltZXNwZW50LnB5CkBAIC0wLDAgKzEsMTgyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBEYXRhTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKK2NsYXNzIE1pZ3JhdGlvbihEYXRhTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAiV3JpdGUgeW91ciBmb3J3YXJkcyBtZXRob2RzIGhlcmUuIgorICAgICAgICAjIE5vdGU6IERvbid0IHVzZSAiZnJvbSBhcHBuYW1lLm1vZGVscyBpbXBvcnQgTW9kZWxOYW1lIi4KKyAgICAgICAgIyBVc2Ugb3JtLk1vZGVsTmFtZSB0byByZWZlciB0byBtb2RlbHMgaW4gdGhpcyBhcHBsaWNhdGlvbiwKKyAgICAgICAgIyBhbmQgb3JtWydhcHBuYW1lLk1vZGVsTmFtZSddIGZvciBtb2RlbHMgaW4gb3RoZXIgYXBwbGljYXRpb25zLgorCisgICAgICAgIGZvciBidWlsZCBpbiBvcm0uQnVpbGQub2JqZWN0cy5hbGwoKToKKyAgICAgICAgICAgIGJ1aWxkLnRpbWVzcGVudCA9IGludCgoYnVpbGQuY29tcGxldGVkX29uIC0gYnVpbGQuc3RhcnRlZF9vbikudG90YWxfc2Vjb25kcygpKQorICAgICAgICAgICAgYnVpbGQuc2F2ZSgpCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICJXcml0ZSB5b3VyIGJhY2t3YXJkcyBtZXRob2RzIGhlcmUuIgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiIpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2VfZnN0eXBlcyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNpbmdfaW5mbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCcsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICc1J30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KKyAgICBzeW1tZXRyaWNhbCA9IFRydWUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwNF9hdXRvX19hZGRfZmllbGRfcGFja2FnZV9pbnN0YWxsZWRfbmFtZS5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwNF9hdXRvX19hZGRfZmllbGRfcGFja2FnZV9pbnN0YWxsZWRfbmFtZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ0NDViCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA0X2F1dG9fX2FkZF9maWVsZF9wYWNrYWdlX2luc3RhbGxlZF9uYW1lLnB5CkBAIC0wLDAgKzEsMTgxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnUGFja2FnZS5pbnN0YWxsZWRfbmFtZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wYWNrYWdlJywgJ2luc3RhbGxlZF9uYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTEwMCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1BhY2thZ2UuaW5zdGFsbGVkX25hbWUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcGFja2FnZScsICdpbnN0YWxsZWRfbmFtZScpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9mc3R5cGVzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2luZ19pbmZvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJywgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzUnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA1X2F1dG9fX2FkZF90YXJnZXRfaW1hZ2VfZmlsZV9fYWRkX3RhcmdldF9maWxlX19hZGRfZmllbGRfdmFyaWFibGVoaXN0b3IucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDVfYXV0b19fYWRkX3RhcmdldF9pbWFnZV9maWxlX19hZGRfdGFyZ2V0X2ZpbGVfX2FkZF9maWVsZF92YXJpYWJsZWhpc3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU3YWMzCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA1X2F1dG9fX2FkZF90YXJnZXRfaW1hZ2VfZmlsZV9fYWRkX3RhcmdldF9maWxlX19hZGRfZmllbGRfdmFyaWFibGVoaXN0b3IucHkKQEAgLTAsMCArMSwyODEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdUYXJnZXRfRmlsZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3RhcmdldF9maWxlJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3RhcmdldCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlRhcmdldCddKSksCisgICAgICAgICAgICAoJ3BhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnc2l6ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdpbm9kZXR5cGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgICAgICgncGVybWlzc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdvd25lcicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTI4KSksCisgICAgICAgICAgICAoJ2dyb3VwJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMjgpKSwKKyAgICAgICAgICAgICgnZGlyZWN0b3J5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdkaXJlY3Rvcnlfc2V0JywgdG89b3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSkpLAorICAgICAgICAgICAgKCdzeW1fdGFyZ2V0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdzeW1saW5rX3NldCcsIGJsYW5rPVRydWUsIHRvPW9ybVsnb3JtLlRhcmdldF9GaWxlJ10pKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydUYXJnZXRfRmlsZSddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdUYXJnZXRfSW1hZ2VfRmlsZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3RhcmdldF9pbWFnZV9maWxlJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ3RhcmdldCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlRhcmdldCddKSksCisgICAgICAgICAgICAoJ2ZpbGVfbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdmaWxlX3NpemUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydUYXJnZXRfSW1hZ2VfRmlsZSddKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdWYXJpYWJsZUhpc3RvcnkudmFsdWUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fdmFyaWFibGVoaXN0b3J5JywgJ3ZhbHVlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShkZWZhdWx0PScnLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUmVjaXBlLmxpY2Vuc2luZ19pbmZvJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3JlY2lwZScsICdsaWNlbnNpbmdfaW5mbycpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnVGFyZ2V0LmZpbGVfbmFtZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV90YXJnZXQnLCAnZmlsZV9uYW1lJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdUYXJnZXQuZmlsZV9zaXplJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3RhcmdldCcsICdmaWxlX3NpemUnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0J1aWxkLmltYWdlX2ZzdHlwZXMnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fYnVpbGQnLCAnaW1hZ2VfZnN0eXBlcycpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xvZ01lc3NhZ2UudGFzaycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sb2dtZXNzYWdlJywgJ3Rhc2snLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlRhc2snXSwgbnVsbD1UcnVlLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXNrLmVsYXBzZWRfdGltZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3Rhc2snLCAnZWxhcHNlZF90aW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJykobnVsbD1UcnVlLCBtYXhfZGlnaXRzPTYsIGRlY2ltYWxfcGxhY2VzPTIpKQorICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnVGFzaycsIGZpZWxkcyBbJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX3Rhc2snLCBbJ2J1aWxkX2lkJywgJ3JlY2lwZV9pZCcsICd0YXNrX25hbWUnXSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdUYXNrJywgZmllbGRzIFsnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZSddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fdGFzaycsIFsnYnVpbGRfaWQnLCAncmVjaXBlX2lkJywgJ3Rhc2tfbmFtZSddKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1RhcmdldF9GaWxlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdGFyZ2V0X2ZpbGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1RhcmdldF9JbWFnZV9GaWxlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdGFyZ2V0X2ltYWdlX2ZpbGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1ZhcmlhYmxlSGlzdG9yeS52YWx1ZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV92YXJpYWJsZWhpc3RvcnknLCAndmFsdWUnKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWNpcGUubGljZW5zaW5nX2luZm8nCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ2xpY2Vuc2luZ19pbmZvJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShkZWZhdWx0PScnLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1RhcmdldC5maWxlX25hbWUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ2ZpbGVfbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nJywgbWF4X2xlbmd0aD0xMDApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnVGFyZ2V0LmZpbGVfc2l6ZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV90YXJnZXQnLCAnZmlsZV9zaXplJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnQnVpbGQuaW1hZ2VfZnN0eXBlcycKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9idWlsZCcsICdpbWFnZV9mc3R5cGVzJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTEwMCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xvZ01lc3NhZ2UudGFzaycKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sb2dtZXNzYWdlJywgJ3Rhc2tfaWQnKQorCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFzay5lbGFwc2VkX3RpbWUnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXNrJywgJ2VsYXBzZWRfdGltZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTApKQorCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ2JsYW5rJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwNl9hdXRvX19hZGRfZmllbGRfdGFyZ2V0X2ltYWdlX3NpemVfX2FkZF9maWVsZF90YXJnZXRfbGljZW5zZV9tYW5pZmVzdF9wLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA2X2F1dG9fX2FkZF9maWVsZF90YXJnZXRfaW1hZ2Vfc2l6ZV9fYWRkX2ZpZWxkX3RhcmdldF9saWNlbnNlX21hbmlmZXN0X3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiZTMwYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwNl9hdXRvX19hZGRfZmllbGRfdGFyZ2V0X2ltYWdlX3NpemVfX2FkZF9maWVsZF90YXJnZXRfbGljZW5zZV9tYW5pZmVzdF9wLnB5CkBAIC0wLDAgKzEsMjM1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnVGFyZ2V0LmltYWdlX3NpemUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ2ltYWdlX3NpemUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9MCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdUYXJnZXQubGljZW5zZV9tYW5pZmVzdF9wYXRoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3RhcmdldCcsICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTAwLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1RhcmdldF9GaWxlLnBlcm1pc3Npb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXJnZXRfZmlsZScsICdwZXJtaXNzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xNikpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFyZ2V0X0ZpbGUuc3ltX3RhcmdldCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3RhcmdldF9maWxlJywgJ3N5bV90YXJnZXRfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShudWxsPVRydWUsIHRvPW9ybVsnb3JtLlRhcmdldF9GaWxlJ10pKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1RhcmdldF9GaWxlLmRpcmVjdG9yeScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3RhcmdldF9maWxlJywgJ2RpcmVjdG9yeV9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKG51bGw9VHJ1ZSwgdG89b3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSkpCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1RhcmdldC5pbWFnZV9zaXplJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3RhcmdldCcsICdpbWFnZV9zaXplJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdUYXJnZXQubGljZW5zZV9tYW5pZmVzdF9wYXRoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3RhcmdldCcsICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnKQorCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFyZ2V0X0ZpbGUucGVybWlzc2lvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3RhcmdldF9maWxlJywgJ3Blcm1pc3Npb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKQorCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1RhcmdldF9GaWxlLnN5bV90YXJnZXQnCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdUYXJnZXRfRmlsZS5zeW1fdGFyZ2V0JyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbgorICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXJnZXRfRmlsZS5zeW1fdGFyZ2V0JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFyZ2V0X2ZpbGUnLCAnc3ltX3RhcmdldF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlRhcmdldF9GaWxlJ10pKQorCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1RhcmdldF9GaWxlLmRpcmVjdG9yeScKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1RhcmdldF9GaWxlLmRpcmVjdG9yeScgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24KKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnVGFyZ2V0X0ZpbGUuZGlyZWN0b3J5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFyZ2V0X2ZpbGUnLCAnZGlyZWN0b3J5X2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSkpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwN19hdXRvX19hZGRfaGVscHRleHQucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDdfYXV0b19fYWRkX2hlbHB0ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNGM1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDdfYXV0b19fYWRkX2hlbHB0ZXh0LnB5CkBAIC0wLDAgKzEsMjE0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBtb2RlbCAnSGVscFRleHQnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9oZWxwdGV4dCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdidWlsZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0naGVscHRleHRfYnVpbGQnLCB0bz1vcm1bJ29ybS5CdWlsZCddKSksCisgICAgICAgICAgICAoJ2FyZWEnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKSgpKSwKKyAgICAgICAgICAgICgna2V5Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgndGV4dCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0hlbHBUZXh0J10pCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnSGVscFRleHQnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9oZWxwdGV4dCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwOF9hdXRvX19jaGdfZmllbGRfdmFyaWFibGVoaXN0b3J5X29wZXJhdGlvbl9fY2hnX2ZpZWxkX3JlY2lwZV9kZXNjcmlwdGlvLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA4X2F1dG9fX2NoZ19maWVsZF92YXJpYWJsZWhpc3Rvcnlfb3BlcmF0aW9uX19jaGdfZmllbGRfcmVjaXBlX2Rlc2NyaXB0aW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNDA4YQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAwOF9hdXRvX19jaGdfZmllbGRfdmFyaWFibGVoaXN0b3J5X29wZXJhdGlvbl9fY2hnX2ZpZWxkX3JlY2lwZV9kZXNjcmlwdGlvLnB5CkBAIC0wLDAgKzEsMjI1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1ZhcmlhYmxlSGlzdG9yeS5vcGVyYXRpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV92YXJpYWJsZWhpc3RvcnknLCAnb3BlcmF0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD02NCkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUmVjaXBlLmRlc2NyaXB0aW9uJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXJnZXRfSW1hZ2VfRmlsZS5maWxlX25hbWUnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXJnZXRfaW1hZ2VfZmlsZScsICdmaWxlX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0yNTQpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1BhY2thZ2UuZGVzY3JpcHRpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9wYWNrYWdlJywgJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoKSkKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdWYXJpYWJsZUhpc3Rvcnkub3BlcmF0aW9uJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdmFyaWFibGVoaXN0b3J5JywgJ29wZXJhdGlvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTYpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1JlY2lwZS5kZXNjcmlwdGlvbicKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3JlY2lwZScsICdkZXNjcmlwdGlvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXJnZXRfSW1hZ2VfRmlsZS5maWxlX25hbWUnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV90YXJnZXRfaW1hZ2VfZmlsZScsICdmaWxlX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0xMDApKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1BhY2thZ2UuZGVzY3JpcHRpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9wYWNrYWdlJywgJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yMDApKQorCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA5X2F1dG9fX2FkZF9wcm9qZWN0dmFyaWFibGVfX2FkZF9wcm9qZWN0bGF5ZXJfX2FkZF9wcm9qZWN0dGFyZ2V0X19hZGRfcHIucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMDlfYXV0b19fYWRkX3Byb2plY3R2YXJpYWJsZV9fYWRkX3Byb2plY3RsYXllcl9fYWRkX3Byb2plY3R0YXJnZXRfX2FkZF9wci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTU4ZGMyCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDA5X2F1dG9fX2FkZF9wcm9qZWN0dmFyaWFibGVfX2FkZF9wcm9qZWN0bGF5ZXJfX2FkZF9wcm9qZWN0dGFyZ2V0X19hZGRfcHIucHkKQEAgLTAsMCArMSwyODYgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIG1vZGVsICdQcm9qZWN0VmFyaWFibGUnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9wcm9qZWN0dmFyaWFibGUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgncHJvamVjdCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlByb2plY3QnXSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgndmFsdWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShibGFuaz1UcnVlKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUHJvamVjdFZhcmlhYmxlJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1Byb2plY3RMYXllcicKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX3Byb2plY3RsYXllcicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdwcm9qZWN0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUHJvamVjdCddKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpLAorICAgICAgICAgICAgKCdnaXR1cmwnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI1NCkpLAorICAgICAgICAgICAgKCdjb21taXQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI1NCkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1Byb2plY3RMYXllciddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdQcm9qZWN0VGFyZ2V0JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcHJvamVjdHRhcmdldCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdwcm9qZWN0Jywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUHJvamVjdCddKSksCisgICAgICAgICAgICAoJ3RhcmdldCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnUHJvamVjdFRhcmdldCddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdQcm9qZWN0JworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcHJvamVjdCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnY3JlYXRlZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKShhdXRvX25vd19hZGQ9VHJ1ZSwgYmxhbms9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cGRhdGVkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGF1dG9fbm93PVRydWUsIGJsYW5rPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydQcm9qZWN0J10pCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0J1aWxkLnByb2plY3QnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fYnVpbGQnLCAncHJvamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUHJvamVjdCddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdQcm9qZWN0VmFyaWFibGUnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9wcm9qZWN0dmFyaWFibGUnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1Byb2plY3RMYXllcicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3Byb2plY3RsYXllcicpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUHJvamVjdFRhcmdldCcKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3Byb2plY3R0YXJnZXQnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1Byb2plY3QnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9wcm9qZWN0JykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdCdWlsZC5wcm9qZWN0JworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2J1aWxkJywgJ3Byb2plY3RfaWQnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMF9hdXRvX19hZGRfZmllbGRfcHJvamVjdF9icmFuY2hfX2FkZF9maWVsZF9wcm9qZWN0X3Nob3J0X2Rlc2NyaXB0aW9uX19hLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDEwX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0X2JyYW5jaF9fYWRkX2ZpZWxkX3Byb2plY3Rfc2hvcnRfZGVzY3JpcHRpb25fX2EucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExY2UxZgotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMF9hdXRvX19hZGRfZmllbGRfcHJvamVjdF9icmFuY2hfX2FkZF9maWVsZF9wcm9qZWN0X3Nob3J0X2Rlc2NyaXB0aW9uX19hLnB5CkBAIC0wLDAgKzEsMjU3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdC5icmFuY2gnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdicmFuY2gnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9J21hc3RlcicsIG1heF9sZW5ndGg9NTApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdC5zaG9ydF9kZXNjcmlwdGlvbicKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ3Nob3J0X2Rlc2NyaXB0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PScnLCBtYXhfbGVuZ3RoPTUwLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3QudXNlcl9pZCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ3VzZXJfaWQnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3QuYnJhbmNoJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAnYnJhbmNoJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0LnNob3J0X2Rlc2NyaXB0aW9uJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAnc2hvcnRfZGVzY3JpcHRpb24nKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3QudXNlcl9pZCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ3VzZXJfaWQnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDExX2F1dG9fX2FkZF9maWVsZF9wcm9qZWN0bGF5ZXJfZGlycGF0aC5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMV9hdXRvX19hZGRfZmllbGRfcHJvamVjdGxheWVyX2RpcnBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NTIyMQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMV9hdXRvX19hZGRfZmllbGRfcHJvamVjdGxheWVyX2RpcnBhdGgucHkKQEAgLTAsMCArMSwyNDIgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuZGlycGF0aCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnZGlycGF0aCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nJywgbWF4X2xlbmd0aD0yNTQpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuZGlycGF0aCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnZGlycGF0aCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTJfYXV0b19fYWRkX2ZpZWxkX3Byb2plY3RsYXllcl9vcHRpb25hbF9fYWRkX2ZpZWxkX3Byb2plY3R0YXJnZXRfdGFzay5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxMl9hdXRvX19hZGRfZmllbGRfcHJvamVjdGxheWVyX29wdGlvbmFsX19hZGRfZmllbGRfcHJvamVjdHRhcmdldF90YXNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDgzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTJfYXV0b19fYWRkX2ZpZWxkX3Byb2plY3RsYXllcl9vcHRpb25hbF9fYWRkX2ZpZWxkX3Byb2plY3R0YXJnZXRfdGFzay5weQpAQCAtMCwwICsxLDI1MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5vcHRpb25hbCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnb3B0aW9uYWwnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcpKGRlZmF1bHQ9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0VGFyZ2V0LnRhc2snCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdHRhcmdldCcsICd0YXNrJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdExheWVyLm9wdGlvbmFsJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdvcHRpb25hbCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdFRhcmdldC50YXNrJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3R0YXJnZXQnLCAndGFzaycpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTNfYXV0b19fYWRkX3JlbGVhc2VfX2FkZF9sYXllcnZlcnNpb25kZXBlbmRlbmN5X19hZGRfdW5pcXVlX2xheWVydmVyc2lvbi5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxM19hdXRvX19hZGRfcmVsZWFzZV9fYWRkX2xheWVydmVyc2lvbmRlcGVuZGVuY3lfX2FkZF91bmlxdWVfbGF5ZXJ2ZXJzaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTU0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTNfYXV0b19fYWRkX3JlbGVhc2VfX2FkZF9sYXllcnZlcnNpb25kZXBlbmRlbmN5X19hZGRfdW5pcXVlX2xheWVydmVyc2lvbi5weQpAQCAtMCwwICsxLDcxMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1JlbGVhc2UnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9yZWxlYXNlJywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKSh1bmlxdWU9VHJ1ZSwgbWF4X2xlbmd0aD0zMikpLAorICAgICAgICAgICAgKCdkZXNjcmlwdGlvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICAgICAoJ2JpdGJha2VfdmVyc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10pKSwKKyAgICAgICAgICAgICgnYnJhbmNoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0zMikpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1JlbGVhc2UnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2xheWVydmVyc2lvbmRlcGVuZGVuY3knLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbGF5ZXJfc291cmNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykoZGVmYXVsdD1Ob25lLCB0bz1vcm1bJ29ybS5MYXllclNvdXJjZSddLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgndXBfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl92ZXJzaW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykocmVsYXRlZF9uYW1lPSdkZXBlbmRlbmNpZXMnLCB0bz1vcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10pKSwKKyAgICAgICAgICAgICgnZGVwZW5kc19vbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHJlbGF0ZWRfbmFtZT0nZGVwZW5kZWVzJywgdG89b3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllclZlcnNpb25EZXBlbmRlbmN5JywgZmllbGRzIFsnbGF5ZXJfc291cmNlJywgJ3VwX2lkJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9sYXllcnZlcnNpb25kZXBlbmRlbmN5JywgWydsYXllcl9zb3VyY2VfaWQnLCAndXBfaWQnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnVG9hc3RlclNldHRpbmcnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV90b2FzdGVyc2V0dGluZycsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD02MykpLAorICAgICAgICAgICAgKCdoZWxwdGV4dCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCd2YWx1ZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnVG9hc3RlclNldHRpbmcnXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnTWFjaGluZScKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX21hY2hpbmUnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbGF5ZXJfc291cmNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykoZGVmYXVsdD1Ob25lLCB0bz1vcm1bJ29ybS5MYXllclNvdXJjZSddLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgndXBfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cF9kYXRlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbnVsbD1UcnVlKSksCisgICAgICAgICAgICAoJ2xheWVyX3ZlcnNpb24nLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10pKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSksCisgICAgICAgICAgICAoJ2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0yNTUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydNYWNoaW5lJ10pCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ01hY2hpbmUnLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX21hY2hpbmUnLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgQWRkaW5nIG1vZGVsICdSZWxlYXNlRGVmYXVsdExheWVyJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fcmVsZWFzZWRlZmF1bHRsYXllcicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZWxlYXNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUmVsZWFzZSddKSksCisgICAgICAgICAgICAoJ2xheWVyJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uTGF5ZXInXSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1JlbGVhc2VEZWZhdWx0TGF5ZXInXSkKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnQml0YmFrZVZlcnNpb24nCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9iaXRiYWtldmVyc2lvbicsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCduYW1lJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykodW5pcXVlPVRydWUsIG1heF9sZW5ndGg9MzIpKSwKKyAgICAgICAgICAgICgnZ2l0dXJsJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnKShtYXhfbGVuZ3RoPTIwMCkpLAorICAgICAgICAgICAgKCdicmFuY2gnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTMyKSksCisgICAgICAgICAgICAoJ2RpcnBhdGgnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTI1NSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0JpdGJha2VWZXJzaW9uJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0JyYW5jaCcKKyAgICAgICAgZGIuY3JlYXRlX3RhYmxlKHUnb3JtX2JyYW5jaCcsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdsYXllcl9zb3VyY2UnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PVRydWUsIHRvPW9ybVsnb3JtLkxheWVyU291cmNlJ10sIG51bGw9VHJ1ZSkpLAorICAgICAgICAgICAgKCd1cF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbnVsbD1UcnVlKSksCisgICAgICAgICAgICAoJ3VwX2RhdGUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTApKSwKKyAgICAgICAgICAgICgnYml0YmFrZV9icmFuY2gnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTUwLCBibGFuaz1UcnVlKSksCisgICAgICAgICAgICAoJ3Nob3J0X2Rlc2NyaXB0aW9uJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD01MCwgYmxhbms9VHJ1ZSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ0JyYW5jaCddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdCcmFuY2gnLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAnbmFtZSddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fYnJhbmNoJywgWydsYXllcl9zb3VyY2VfaWQnLCAnbmFtZSddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdCcmFuY2gnLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX2JyYW5jaCcsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXInLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbGF5ZXJfdmVyc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0xheWVyU291cmNlJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fbGF5ZXJzb3VyY2UnLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbmFtZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NjMpKSwKKyAgICAgICAgICAgICgnc291cmNldHlwZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcpKCkpLAorICAgICAgICAgICAgKCdhcGl1cmwnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShkZWZhdWx0PU5vbmUsIG1heF9sZW5ndGg9MjU1LCBudWxsPVRydWUpKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydMYXllclNvdXJjZSddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllclNvdXJjZScsIGZpZWxkcyBbJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9sYXllcnNvdXJjZScsIFsnc291cmNldHlwZScsICdhcGl1cmwnXSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIubmFtZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnbmFtZScpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdExheWVyLmRpcnBhdGgnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2RpcnBhdGgnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3RMYXllci5jb21taXQnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2NvbW1pdCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdExheWVyLmdpdHVybCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnZ2l0dXJsJykKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdExheWVyLmxheWVyY29tbWl0JworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdsYXllcmNvbW1pdCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5sYXllcl9zb3VyY2UnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdsYXllcl9zb3VyY2UnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKGRlZmF1bHQ9Tm9uZSwgdG89b3JtWydvcm0uTGF5ZXJTb3VyY2UnXSwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24udXBfaWQnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICd1cF9pZCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi51cF9kYXRlJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAndXBfZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24udXBfYnJhbmNoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAndXBfYnJhbmNoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PU5vbmUsIHRvPW9ybVsnb3JtLkJyYW5jaCddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5kaXJwYXRoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAnZGlycGF0aCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD1Ob25lLCBtYXhfbGVuZ3RoPTI1NSwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmJ1aWxkJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdidWlsZF9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKG51bGw9VHJ1ZSwgdG89b3JtWydvcm0uQnVpbGQnXSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5icmFuY2gnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2JyYW5jaCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9ODApKQorICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTGF5ZXJfVmVyc2lvbicsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fbGF5ZXJfdmVyc2lvbicsIFsnbGF5ZXJfc291cmNlX2lkJywgJ3VwX2lkJ10pCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlY2lwZS5sYXllcl9zb3VyY2UnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ2xheWVyX3NvdXJjZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykoZGVmYXVsdD1Ob25lLCB0bz1vcm1bJ29ybS5MYXllclNvdXJjZSddLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVjaXBlLnVwX2lkJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlY2lwZScsICd1cF9pZCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVjaXBlLnVwX2RhdGUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ3VwX2RhdGUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnKShkZWZhdWx0PU5vbmUsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci5sYXllcl9zb3VyY2UnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXInLCAnbGF5ZXJfc291cmNlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PU5vbmUsIHRvPW9ybVsnb3JtLkxheWVyU291cmNlJ10sIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci51cF9pZCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICd1cF9pZCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXIudXBfZGF0ZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICd1cF9kYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXIudmNzX3VybCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3NfdXJsJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbWF4X2xlbmd0aD0yMDAsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci52Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXInLCAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbWF4X2xlbmd0aD0yMDAsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci5zdW1tYXJ5JworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2xheWVyJywgJ3N1bW1hcnknLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9Tm9uZSwgbWF4X2xlbmd0aD0yMDAsIG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllci5kZXNjcmlwdGlvbicKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICdkZXNjcmlwdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJykoZGVmYXVsdD1Ob25lLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0xheWVyLmxvY2FsX3BhdGgnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcicsICdsb2NhbF9wYXRoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1LCBudWxsPVRydWUpKQorICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTGF5ZXInLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX2xheWVyJywgWydsYXllcl9zb3VyY2VfaWQnLCAndXBfaWQnXSkKKworICAgICAgICAjIEFkZGluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnTGF5ZXInLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAnbmFtZSddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fbGF5ZXInLCBbJ2xheWVyX3NvdXJjZV9pZCcsICduYW1lJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdC5icmFuY2gnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdicmFuY2gnKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0LmJpdGJha2VfdmVyc2lvbicKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2JpdGJha2VfdmVyc2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykoZGVmYXVsdD0tMSwgdG89b3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0LnJlbGVhc2UnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdyZWxlYXNlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PS0xLCB0bz1vcm1bJ29ybS5SZWxlYXNlJ10pLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllcicsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICduYW1lJ10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9sYXllcicsIFsnbGF5ZXJfc291cmNlX2lkJywgJ25hbWUnXSkKKworICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllcicsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fbGF5ZXInLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyX1ZlcnNpb24nLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX2xheWVyX3ZlcnNpb24nLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyU291cmNlJywgZmllbGRzIFsnc291cmNldHlwZScsICdhcGl1cmwnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX2xheWVyc291cmNlJywgWydzb3VyY2V0eXBlJywgJ2FwaXVybCddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0JyYW5jaCcsIGZpZWxkcyBbJ2xheWVyX3NvdXJjZScsICd1cF9pZCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fYnJhbmNoJywgWydsYXllcl9zb3VyY2VfaWQnLCAndXBfaWQnXSkKKworICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdCcmFuY2gnLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAnbmFtZSddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fYnJhbmNoJywgWydsYXllcl9zb3VyY2VfaWQnLCAnbmFtZSddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ01hY2hpbmUnLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX21hY2hpbmUnLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgUmVtb3ZpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knLCBmaWVsZHMgWydsYXllcl9zb3VyY2UnLCAndXBfaWQnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX2xheWVydmVyc2lvbmRlcGVuZGVuY3knLCBbJ2xheWVyX3NvdXJjZV9pZCcsICd1cF9pZCddKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1JlbGVhc2UnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9yZWxlYXNlJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdMYXllclZlcnNpb25EZXBlbmRlbmN5JworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fbGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeScpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnVG9hc3RlclNldHRpbmcnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV90b2FzdGVyc2V0dGluZycpCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnTWFjaGluZScKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX21hY2hpbmUnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1JlbGVhc2VEZWZhdWx0TGF5ZXInCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9yZWxlYXNlZGVmYXVsdGxheWVyJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCaXRiYWtlVmVyc2lvbicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX2JpdGJha2V2ZXJzaW9uJykKKworICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdCcmFuY2gnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9icmFuY2gnKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fdG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXInKQorCisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0xheWVyU291cmNlJworICAgICAgICBkYi5kZWxldGVfdGFibGUodSdvcm1fbGF5ZXJzb3VyY2UnKQorCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnUHJvamVjdExheWVyLm5hbWUnCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdQcm9qZWN0TGF5ZXIubmFtZScgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24gICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIubmFtZScKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9wcm9qZWN0bGF5ZXInLCAnbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykobWF4X2xlbmd0aD0xMDApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1Byb2plY3RMYXllci5kaXJwYXRoJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUHJvamVjdExheWVyLmRpcnBhdGgnIGFuZCBpdHMgdmFsdWVzIGNhbm5vdCBiZSByZXN0b3JlZC4iKQorICAgICAgICAKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcHJvdmlkZWQgaGVyZSB0byBhaWQgaW4gd3JpdGluZyBhIGNvcnJlY3QgbWlncmF0aW9uICAgICAgICAjIEFkZGluZyBmaWVsZCAnUHJvamVjdExheWVyLmRpcnBhdGgnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcHJvamVjdGxheWVyJywgJ2RpcnBhdGgnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdQcm9qZWN0TGF5ZXIuY29tbWl0JworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUHJvamVjdExheWVyLmNvbW1pdCcgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24gICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuY29tbWl0JworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdjb21taXQnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdQcm9qZWN0TGF5ZXIuZ2l0dXJsJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUHJvamVjdExheWVyLmdpdHVybCcgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24gICAgICAgICMgQWRkaW5nIGZpZWxkICdQcm9qZWN0TGF5ZXIuZ2l0dXJsJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdnaXR1cmwnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjU0KSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdExheWVyLmxheWVyY29tbWl0JworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3Byb2plY3RsYXllcicsICdsYXllcmNvbW1pdF9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5sYXllcl9zb3VyY2UnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdsYXllcl9zb3VyY2VfaWQnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24udXBfaWQnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICd1cF9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi51cF9kYXRlJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAndXBfZGF0ZScpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi51cF9icmFuY2gnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICd1cF9icmFuY2hfaWQnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24uZGlycGF0aCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2RpcnBhdGgnKQorCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnTGF5ZXJfVmVyc2lvbi5idWlsZCcKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ0xheWVyX1ZlcnNpb24uYnVpbGQnIGFuZCBpdHMgdmFsdWVzIGNhbm5vdCBiZSByZXN0b3JlZC4iKQorICAgICAgICAKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcHJvdmlkZWQgaGVyZSB0byBhaWQgaW4gd3JpdGluZyBhIGNvcnJlY3QgbWlncmF0aW9uCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0xheWVyX1ZlcnNpb24uYnVpbGQnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2J1aWxkX2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQnVpbGQnXSkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5icmFuY2gnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcl92ZXJzaW9uJywgJ2JyYW5jaCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9NTApKQorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdSZWNpcGUubGF5ZXJfc291cmNlJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3JlY2lwZScsICdsYXllcl9zb3VyY2VfaWQnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlY2lwZS51cF9pZCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWNpcGUnLCAndXBfaWQnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlY2lwZS51cF9kYXRlJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX3JlY2lwZScsICd1cF9kYXRlJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllci5sYXllcl9zb3VyY2UnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXInLCAnbGF5ZXJfc291cmNlX2lkJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllci51cF9pZCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICd1cF9pZCcpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXIudXBfZGF0ZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICd1cF9kYXRlJykKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdMYXllci52Y3NfdXJsJworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyJywgJ3Zjc191cmwnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyLnZjc193ZWJfZmlsZV9iYXNlX3VybCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyLnN1bW1hcnknCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXInLCAnc3VtbWFyeScpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXIuZGVzY3JpcHRpb24nCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXInLCAnZGVzY3JpcHRpb24nKQorCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnTGF5ZXIubG9jYWxfcGF0aCcKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ0xheWVyLmxvY2FsX3BhdGgnIGFuZCBpdHMgdmFsdWVzIGNhbm5vdCBiZSByZXN0b3JlZC4iKQorICAgICAgICAKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcHJvdmlkZWQgaGVyZSB0byBhaWQgaW4gd3JpdGluZyBhIGNvcnJlY3QgbWlncmF0aW9uCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ0xheWVyLmxvY2FsX3BhdGgnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9sYXllcicsICdsb2NhbF9wYXRoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcpKG1heF9sZW5ndGg9MjU1KSkKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdQcm9qZWN0LmJyYW5jaCcKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1Byb2plY3QuYnJhbmNoJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbiAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1Byb2plY3QuYnJhbmNoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAnYnJhbmNoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTUwKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUHJvamVjdC5iaXRiYWtlX3ZlcnNpb24nCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdiaXRiYWtlX3ZlcnNpb25faWQnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1Byb2plY3QucmVsZWFzZScKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ3JlbGVhc2VfaWQnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZ0RlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxNF9hdXRvX19jaGdfZmllbGRfcGFja2FnZV9zdW1tYXJ5X19jaGdfZmllbGRfbGF5ZXJfc3VtbWFyeV9fY2hnX2ZpZWxkX3JlLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE0X2F1dG9fX2NoZ19maWVsZF9wYWNrYWdlX3N1bW1hcnlfX2NoZ19maWVsZF9sYXllcl9zdW1tYXJ5X19jaGdfZmllbGRfcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0NWYxNQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxNF9hdXRvX19jaGdfZmllbGRfcGFja2FnZV9zdW1tYXJ5X19jaGdfZmllbGRfbGF5ZXJfc3VtbWFyeV9fY2hnX2ZpZWxkX3JlLnB5CkBAIC0wLDAgKzEsMzM2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1BhY2thZ2Uuc3VtbWFyeScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3BhY2thZ2UnLCAnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKCkpCisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnTGF5ZXIuc3VtbWFyeScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2xheWVyJywgJ3N1bW1hcnknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKShudWxsPVRydWUpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1JlY2lwZS5zdW1tYXJ5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ3N1bW1hcnknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnKSgpKQorCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1BhY2thZ2Uuc3VtbWFyeScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3BhY2thZ2UnLCAnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjAwKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdMYXllci5zdW1tYXJ5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fbGF5ZXInLCAnc3VtbWFyeScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MjAwLCBudWxsPVRydWUpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1JlY2lwZS5zdW1tYXJ5JworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcmVjaXBlJywgJ3N1bW1hcnknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnKShtYXhfbGVuZ3RoPTEwMCkpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZ0RlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxNV9hdXRvX19hZGRfZmllbGRfbGF5ZXJfdmNzX3dlYl91cmxfX2FkZF9maWVsZF9sYXllcl92Y3Nfd2ViX3RyZWVfYmFzZV91LnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE1X2F1dG9fX2FkZF9maWVsZF9sYXllcl92Y3Nfd2ViX3VybF9fYWRkX2ZpZWxkX2xheWVyX3Zjc193ZWJfdHJlZV9iYXNlX3UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2NjRjOQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxNV9hdXRvX19hZGRfZmllbGRfbGF5ZXJfdmNzX3dlYl91cmxfX2FkZF9maWVsZF9sYXllcl92Y3Nfd2ViX3RyZWVfYmFzZV91LnB5CkBAIC0wLDAgKzEsMzM2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnTGF5ZXIudmNzX3dlYl91cmwnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXInLCAndmNzX3dlYl91cmwnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykoZGVmYXVsdD1Ob25lLCBtYXhfbGVuZ3RoPTIwMCwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ0xheWVyLnZjc193ZWJfdHJlZV9iYXNlX3VybCcKKyAgICAgICAgZGIuYWRkX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJykoZGVmYXVsdD1Ob25lLCBtYXhfbGVuZ3RoPTIwMCwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXIudmNzX3dlYl91cmwnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fbGF5ZXInLCAndmNzX3dlYl91cmwnKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0xheWVyLnZjc193ZWJfdHJlZV9iYXNlX3VybCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl90cmVlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE2X2F1dG9fX2FkZF9maWVsZF9yZWxlYXNlX2hlbHB0ZXh0X19jaGdfZmllbGRfcmVsZWFzZV9icmFuY2hfX2FkZF9pbmRleF8ucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTZfYXV0b19fYWRkX2ZpZWxkX3JlbGVhc2VfaGVscHRleHRfX2NoZ19maWVsZF9yZWxlYXNlX2JyYW5jaF9fYWRkX2luZGV4Xy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDVjMGJhCi0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE2X2F1dG9fX2FkZF9maWVsZF9yZWxlYXNlX2hlbHB0ZXh0X19jaGdfZmllbGRfcmVsZWFzZV9icmFuY2hfX2FkZF9pbmRleF8ucHkKQEAgLTAsMCArMSwzNTkgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWxlYXNlLmhlbHB0ZXh0JworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlbGVhc2UnLCAnaGVscHRleHQnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcpKG51bGw9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICAgICAgIyBSZW5hbWluZyBjb2x1bW4gZm9yICdSZWxlYXNlLmJyYW5jaCcgdG8gbWF0Y2ggbmV3IGZpZWxkIHR5cGUuCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdicmFuY2gnKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1JlbGVhc2UuYnJhbmNoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlbGVhc2UnLCAnYnJhbmNoJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQnJhbmNoJ10sIGRlZmF1bHQ9LTEpKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ0JyYW5jaC5iaXRiYWtlX2JyYW5jaCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9icmFuY2gnLCAnYml0YmFrZV9icmFuY2gnKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdSZWNpcGUnLCBmaWVsZHMgWydsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fcmVjaXBlJywgWydsYXllcl92ZXJzaW9uX2lkJywgJ2ZpbGVfcGF0aCddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdQcm9qZWN0TGF5ZXInLCBmaWVsZHMgWydwcm9qZWN0JywgJ2xheWVyY29tbWl0J10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9wcm9qZWN0bGF5ZXInLCBbJ3Byb2plY3RfaWQnLCAnbGF5ZXJjb21taXRfaWQnXSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdQcm9qZWN0TGF5ZXInLCBmaWVsZHMgWydwcm9qZWN0JywgJ2xheWVyY29tbWl0J10KKyAgICAgICAgZGIuZGVsZXRlX3VuaXF1ZSh1J29ybV9wcm9qZWN0bGF5ZXInLCBbJ3Byb2plY3RfaWQnLCAnbGF5ZXJjb21taXRfaWQnXSkKKworICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdSZWNpcGUnLCBmaWVsZHMgWydsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fcmVjaXBlJywgWydsYXllcl92ZXJzaW9uX2lkJywgJ2ZpbGVfcGF0aCddKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlbGVhc2UuaGVscHRleHQnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdoZWxwdGV4dCcpCisKKyAgICAgICAgIyBSZW5hbWluZyBjb2x1bW4gZm9yICdSZWxlYXNlLmJyYW5jaCcgdG8gbWF0Y2ggbmV3IGZpZWxkIHR5cGUuCisgICAgICAgIGRiLnJlbmFtZV9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdicmFuY2hfaWQnLCAnYnJhbmNoJykKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUmVsZWFzZS5icmFuY2gnCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2JyYW5jaCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MzIpKQorICAgICAgICAjIEFkZGluZyBmaWVsZCAnQnJhbmNoLmJpdGJha2VfYnJhbmNoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX2JyYW5jaCcsICdiaXRiYWtlX2JyYW5jaCcsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nJywgbWF4X2xlbmd0aD01MCwgYmxhbms9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmdEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxN19hdXRvX19kZWxfdG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXJfX2FkZF9yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eV9fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE3X2F1dG9fX2RlbF90b2FzdGVyc2V0dGluZ2RlZmF1bHRsYXllcl9fYWRkX3JlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4NWI1NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxN19hdXRvX19kZWxfdG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXJfX2FkZF9yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eV9fLnB5CkBAIC0wLDAgKzEsMzk2IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIG1vZGVsICdUb2FzdGVyU2V0dGluZ0RlZmF1bHRMYXllcicKKyAgICAgICAgZGIuZGVsZXRlX3RhYmxlKHUnb3JtX3RvYXN0ZXJzZXR0aW5nZGVmYXVsdGxheWVyJykKKworICAgICAgICAjIEFkZGluZyBtb2RlbCAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eScsICgKKyAgICAgICAgICAgICh1J2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJykocHJpbWFyeV9rZXk9VHJ1ZSkpLAorICAgICAgICAgICAgKCdyZWxlYXNlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUmVsZWFzZSddKSksCisgICAgICAgICAgICAoJ2xheWVyX3NvdXJjZScsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkxheWVyU291cmNlJ10pKSwKKyAgICAgICAgICAgICgncHJpb3JpdHknLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnKShkZWZhdWx0PTApKSwKKyAgICAgICAgKSkKKyAgICAgICAgZGIuc2VuZF9jcmVhdGVfc2lnbmFsKHUnb3JtJywgWydSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSddKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eScsIGZpZWxkcyBbJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJ10KKyAgICAgICAgZGIuY3JlYXRlX3VuaXF1ZSh1J29ybV9yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eScsIFsncmVsZWFzZV9pZCcsICdsYXllcl9zb3VyY2VfaWQnXSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdSZWxlYXNlLmJyYW5jaCcKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWxlYXNlJywgJ2JyYW5jaF9pZCcpCisKKyAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlbGVhc2UuYnJhbmNoX25hbWUnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdicmFuY2hfbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nJywgbWF4X2xlbmd0aD01MCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllclNvdXJjZScsIGZpZWxkcyBbJ25hbWUnXQorICAgICAgICBkYi5jcmVhdGVfdW5pcXVlKHUnb3JtX2xheWVyc291cmNlJywgWyduYW1lJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnUmVsZWFzZURlZmF1bHRMYXllci5sYXllcicKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9yZWxlYXNlZGVmYXVsdGxheWVyJywgJ2xheWVyX2lkJykKKworICAgICAgICAjIEFkZGluZyBmaWVsZCAnUmVsZWFzZURlZmF1bHRMYXllci5sYXllcl9uYW1lJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlbGVhc2VkZWZhdWx0bGF5ZXInLCAnbGF5ZXJfbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJykoZGVmYXVsdD0nJywgbWF4X2xlbmd0aD0xMDApLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdMYXllclNvdXJjZScsIGZpZWxkcyBbJ25hbWUnXQorICAgICAgICBkYi5kZWxldGVfdW5pcXVlKHUnb3JtX2xheWVyc291cmNlJywgWyduYW1lJ10pCisKKyAgICAgICAgIyBSZW1vdmluZyB1bmlxdWUgY29uc3RyYWludCBvbiAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknLCBmaWVsZHMgWydyZWxlYXNlJywgJ2xheWVyX3NvdXJjZSddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fcmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknLCBbJ3JlbGVhc2VfaWQnLCAnbGF5ZXJfc291cmNlX2lkJ10pCisKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJworICAgICAgICBkYi5jcmVhdGVfdGFibGUodSdvcm1fdG9hc3RlcnNldHRpbmdkZWZhdWx0bGF5ZXInLCAoCisgICAgICAgICAgICAodSdpZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcpKHByaW1hcnlfa2V5PVRydWUpKSwKKyAgICAgICAgICAgICgnbGF5ZXJfdmVyc2lvbicsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSkpLAorICAgICAgICApKQorICAgICAgICBkYi5zZW5kX2NyZWF0ZV9zaWduYWwodSdvcm0nLCBbJ1RvYXN0ZXJTZXR0aW5nRGVmYXVsdExheWVyJ10pCisKKyAgICAgICAgIyBEZWxldGluZyBtb2RlbCAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eScpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdSZWxlYXNlLmJyYW5jaCcKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1JlbGVhc2UuYnJhbmNoJyBhbmQgaXRzIHZhbHVlcyBjYW5ub3QgYmUgcmVzdG9yZWQuIikKKyAgICAgICAgCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIHByb3ZpZGVkIGhlcmUgdG8gYWlkIGluIHdyaXRpbmcgYSBjb3JyZWN0IG1pZ3JhdGlvbiAgICAgICAgIyBBZGRpbmcgZmllbGQgJ1JlbGVhc2UuYnJhbmNoJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlbGVhc2UnLCAnYnJhbmNoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CcmFuY2gnXSksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgRGVsZXRpbmcgZmllbGQgJ1JlbGVhc2UuYnJhbmNoX25hbWUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVsZWFzZScsICdicmFuY2hfbmFtZScpCisKKworICAgICAgICAjIFVzZXIgY2hvc2UgdG8gbm90IGRlYWwgd2l0aCBiYWNrd2FyZHMgTlVMTCBpc3N1ZXMgZm9yICdSZWxlYXNlRGVmYXVsdExheWVyLmxheWVyJworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uLiAnUmVsZWFzZURlZmF1bHRMYXllci5sYXllcicgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24gICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWxlYXNlRGVmYXVsdExheWVyLmxheWVyJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlbGVhc2VkZWZhdWx0bGF5ZXInLCAnbGF5ZXInLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkxheWVyJ10pLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdSZWxlYXNlRGVmYXVsdExheWVyLmxheWVyX25hbWUnCisgICAgICAgIGRiLmRlbGV0ZV9jb2x1bW4odSdvcm1fcmVsZWFzZWRlZmF1bHRsYXllcicsICdsYXllcl9uYW1lJykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2NyZWF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vd19hZGQnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdwcm9qZWN0JywgJ2xheWVyY29tbWl0JyksKSIsICdvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGVfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWNpcGVfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncl9kZXBlbmRlbmNpZXNfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdicmFuY2hfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VkZWZhdWx0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZURlZmF1bHRMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWxheWVyc291cmNlcHJpb3JpdHknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3JlbGVhc2UnLCAnbGF5ZXJfc291cmNlJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWxlYXNlTGF5ZXJTb3VyY2VQcmlvcml0eSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIn0pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbWFnZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnaXNfaW1hZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnbGljZW5zZV9tYW5pZmVzdF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfRmlsZSd9LAorICAgICAgICAgICAgJ2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkaXJlY3Rvcnlfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAnZ3JvdXAnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbm9kZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnb3duZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTI4J30pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwZXJtaXNzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzE2J30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnc3ltX3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidzeW1saW5rX3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbWFnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbWFnZV9GaWxlJ30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTQnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW5zdGFsbGVkX3BhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0luc3RhbGxlZF9QYWNrYWdlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGR0YXJnZXRsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFzayc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvcmRlcmluZyc6ICIoJ29yZGVyJywgJ3JlY2lwZScpIiwgJ3VuaXF1ZV90b2dldGhlcic6ICIoKCdidWlsZCcsICdyZWNpcGUnLCAndGFza19uYW1lJyksKSIsICdvYmplY3RfbmFtZSc6ICdUYXNrJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY3B1X3VzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICAnZGlza19pbyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2VsYXBzZWRfdGltZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xvZ2ZpbGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ29yZGVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICctMSd9KSwKKyAgICAgICAgICAgICdwYXRoX3RvX3NzdGF0ZV9vYmonOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZF9yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE4X2F1dG9fX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX3Byb2plY3QucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMThfYXV0b19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fcHJvamVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg0YmI4Ci0tLSAvZGV2L251bGwKKysrIGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDE4X2F1dG9fX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX3Byb2plY3QucHkKQEAgLTAsMCArMSwzMzEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCitmcm9tIHNvdXRoLnV0aWxzIGltcG9ydCBkYXRldGltZV91dGlscyBhcyBkYXRldGltZQorZnJvbSBzb3V0aC5kYiBpbXBvcnQgZGIKK2Zyb20gc291dGgudjIgaW1wb3J0IFNjaGVtYU1pZ3JhdGlvbgorZnJvbSBkamFuZ28uZGIgaW1wb3J0IG1vZGVscworCisKK2NsYXNzIE1pZ3JhdGlvbihTY2hlbWFNaWdyYXRpb24pOgorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLnByb2plY3QnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdwcm9qZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKShkZWZhdWx0PU5vbmUsIHRvPW9ybVsnb3JtLlByb2plY3QnXSwgbnVsbD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKworICAgIGRlZiBiYWNrd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBEZWxldGluZyBmaWVsZCAnTGF5ZXJfVmVyc2lvbi5wcm9qZWN0JworICAgICAgICBkYi5kZWxldGVfY29sdW1uKHUnb3JtX2xheWVyX3ZlcnNpb24nLCAncHJvamVjdF9pZCcpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl90cmVlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9icmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uQnJhbmNoJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyc291cmNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdzb3VyY2V0eXBlJywgJ2FwaXVybCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJTb3VyY2UnfSwKKyAgICAgICAgICAgICdhcGl1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAnc291cmNldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnZlcnNpb25kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyVmVyc2lvbkRlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVlcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZW5jaWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxvZ21lc3NhZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnTG9nTWVzc2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGV2ZWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaW5lbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdwYXRobmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhc2snXSIsICdudWxsJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5tYWNoaW5lJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ01hY2hpbmUnfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnaW5zdGFsbGVkX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JldmlzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfdGFyZ2V0JyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3NvdXJjZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSIsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZV9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2VfRmlsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkZmlsZWxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJyksKSIsICdvYmplY3RfbmFtZSc6ICdSZWNpcGUnfSwKKyAgICAgICAgICAgICdidWd0cmFja2VyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZmlsZV9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaG9tZXBhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncmVjaXBlX2xheWVyX3ZlcnNpb24nIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncmVsZWFzZScsICdsYXllcl9zb3VyY2UnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc2JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pLAorICAgICAgICAgICAgJ3NjcmlwdF90eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc291cmNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX2NoZWNrc3VtJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9yZXN1bHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd0YXNrX2V4ZWN1dGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ3Rhc2tfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnd29ya19kaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2tfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXNrX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfdGFzayciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50b2FzdGVyc2V0dGluZyc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUb2FzdGVyU2V0dGluZyd9LAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZSd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZhcmlhYmxlX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjaGFuZ2VkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2h1bWFuX3JlYWRhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZV92YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS52YXJpYWJsZWhpc3RvcnknOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGVIaXN0b3J5J30sCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3BlcmF0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzY0J30pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3ZoaXN0b3J5JyIsICd0byc6IHUib3JtWydvcm0uVmFyaWFibGUnXSJ9KQorICAgICAgICB9CisgICAgfQorCisgICAgY29tcGxldGVfYXBwcyA9IFsnb3JtJ10KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTlfYXV0b19fYWRkX2J1aWxkYXJ0aWZhY3QucHkgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMTlfYXV0b19fYWRkX2J1aWxkYXJ0aWZhY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjZTllYQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAxOV9hdXRvX19hZGRfYnVpbGRhcnRpZmFjdC5weQpAQCAtMCwwICsxLDM0MiBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBkZWYgZm9yd2FyZHMoc2VsZiwgb3JtKToKKyAgICAgICAgIyBBZGRpbmcgbW9kZWwgJ0J1aWxkQXJ0aWZhY3QnCisgICAgICAgIGRiLmNyZWF0ZV90YWJsZSh1J29ybV9idWlsZGFydGlmYWN0JywgKAorICAgICAgICAgICAgKHUnaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnKShwcmltYXJ5X2tleT1UcnVlKSksCisgICAgICAgICAgICAoJ2J1aWxkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uQnVpbGQnXSkpLAorICAgICAgICAgICAgKCdmaWxlX25hbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykobWF4X2xlbmd0aD0xMDApKSwKKyAgICAgICAgICAgICgnZmlsZV9zaXplJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJykoKSksCisgICAgICAgICkpCisgICAgICAgIGRiLnNlbmRfY3JlYXRlX3NpZ25hbCh1J29ybScsIFsnQnVpbGRBcnRpZmFjdCddKQorCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisgICAgICAgICMgRGVsZXRpbmcgbW9kZWwgJ0J1aWxkQXJ0aWZhY3QnCisgICAgICAgIGRiLmRlbGV0ZV90YWJsZSh1J29ybV9idWlsZGFydGlmYWN0JykKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkYXJ0aWZhY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRBcnRpZmFjdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfaW5kZXhfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc191cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX2ZpbGVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3RyZWVfYmFzZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3Nfd2ViX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyX3ZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJfVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCd9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9idWlsZCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInbGF5ZXJfdmVyc2lvbl9sYXllciciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyJ10ifSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwZGF0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydhdXRvX25vdyc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXNlcl9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3RsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncHJvamVjdCcsICdsYXllcmNvbW1pdCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnUHJvamVjdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcHRpb25hbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VGFyZ2V0J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdHZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RWYXJpYWJsZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfdmVyc2lvbicsICdmaWxlX3BhdGgnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdyZWxlYXNlJywgJ2xheWVyX3NvdXJjZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnNicsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzYnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRfcmVjaXBlJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMF9hdXRvX19hZGRfZmllbGRfbGF5ZXJfdmVyc2lvbl9sb2NhbF9wYXRoX19hZGRfZmllbGRfcmVjaXBlX3BhdGhmbGFnc19fLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIwX2F1dG9fX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX2xvY2FsX3BhdGhfX2FkZF9maWVsZF9yZWNpcGVfcGF0aGZsYWdzX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjNTc5NQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMF9hdXRvX19hZGRfZmllbGRfbGF5ZXJfdmVyc2lvbl9sb2NhbF9wYXRoX19hZGRfZmllbGRfcmVjaXBlX3BhdGhmbGFnc19fLnB5CkBAIC0wLDAgKzEsMzYxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIFJlbW92aW5nIHVuaXF1ZSBjb25zdHJhaW50IG9uICdSZWNpcGUnLCBmaWVsZHMgWydsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCddCisgICAgICAgIGRiLmRlbGV0ZV91bmlxdWUodSdvcm1fcmVjaXBlJywgWydsYXllcl92ZXJzaW9uX2lkJywgJ2ZpbGVfcGF0aCddKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdMYXllcl9WZXJzaW9uLmxvY2FsX3BhdGgnCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fbGF5ZXJfdmVyc2lvbicsICdsb2NhbF9wYXRoJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJykoZGVmYXVsdD0iLyIsIG1heF9sZW5ndGg9MTAyNCksCisgICAgICAgICAgICAgICAgICAgICAga2VlcF9kZWZhdWx0PUZhbHNlKQorCisgICAgICAgICMgQWRkaW5nIGZpZWxkICdSZWNpcGUucGF0aGZsYWdzJworICAgICAgICBkYi5hZGRfY29sdW1uKHUnb3JtX3JlY2lwZScsICdwYXRoZmxhZ3MnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKGRlZmF1bHQ9JycsIG1heF9sZW5ndGg9MjAwLCBibGFuaz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZWVwX2RlZmF1bHQ9RmFsc2UpCisKKyAgICAgICAgIyBBZGRpbmcgdW5pcXVlIGNvbnN0cmFpbnQgb24gJ1JlY2lwZScsIGZpZWxkcyBbJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJywgJ3BhdGhmbGFncyddCisgICAgICAgIGRiLmNyZWF0ZV91bmlxdWUodSdvcm1fcmVjaXBlJywgWydsYXllcl92ZXJzaW9uX2lkJywgJ2ZpbGVfcGF0aCcsICdwYXRoZmxhZ3MnXSkKKworICAgICAgICAjIE1pZ3JhdGUgZGF0YSBmcm9tIExheWVyLmxvY2FsX3BhdGggdG8gTGF5ZXJfVmVyc2lvbi5sb2NhbF9wYXRoCisgICAgICAgIGlmIG5vdCBkYi5kcnlfcnVuOgorICAgICAgICAgICAgZm9yIGx2IGluIG9ybS5MYXllcl9WZXJzaW9uLm9iamVjdHMuYWxsKCk6CisgICAgICAgICAgICAgICAgaWYgbHYubGF5ZXIubG9jYWxfcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbHYubG9jYWxfcGF0aCA9IGx2LmxheWVyLmxvY2FsX3BhdGgKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsdi5sb2NhbF9wYXRoID0gIi8iCisgICAgICAgICAgICAgICAgbHYuc2F2ZSgpCisKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV9sYXllcicsICdsb2NhbF9wYXRoJykKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCByZXZlcnNlIHRoaXMgbWlncmF0aW9uIikKKworCisgICAgbW9kZWxzID0geworICAgICAgICB1J29ybS5iaXRiYWtldmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCaXRiYWtlVmVyc2lvbid9LAorICAgICAgICAgICAgJ2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMid9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdnaXR1cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnJhbmNoJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpLCAoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpKSIsICdvYmplY3RfbmFtZSc6ICdCcmFuY2gnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZCd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdidWlsZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdjb21wbGV0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2Nvb2tlcl9sb2dfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnfSksCisgICAgICAgICAgICAnZGlzdHJvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm9fdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZXJyb3JzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21hY2hpbmUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMid9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3N0YXJ0ZWRfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3RpbWVzcGVudCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3dhcm5pbmdzX25vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGRhcnRpZmFjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdCdWlsZEFydGlmYWN0J30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uaGVscHRleHQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnSGVscFRleHQnfSwKKyAgICAgICAgICAgICdhcmVhJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2hlbHB0ZXh0X2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAna2V5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwgKCdsYXllcl9zb3VyY2UnLCAnbmFtZScpKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcid9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9pbmRleF91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xvY2FsX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfZmlsZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdHJlZV9iYXNlX3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyMDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Zjc193ZWJfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJfdmVyc2lvbic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllcl9WZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJ30pLAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2J1aWxkJyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY29tbWl0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdkaXJwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidsYXllcl92ZXJzaW9uX2xheWVyJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXInXSJ9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbG9jYWxfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkJyYW5jaCddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcnNvdXJjZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnc291cmNldHlwZScsICdhcGl1cmwnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyU291cmNlJ30sCisgICAgICAgICAgICAnYXBpdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbWF4X2xlbmd0aCc6ICcyNTUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzYzJ30pLAorICAgICAgICAgICAgJ3NvdXJjZXR5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJ2ZXJzaW9uZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclZlcnNpb25EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RlcGVuZGVuY2llcyciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sb2dtZXNzYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0xvZ01lc3NhZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xldmVsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGluZW5vJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAncGF0aG5hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXNrJ10iLCAnbnVsbCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubWFjaGluZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksKSIsICdvYmplY3RfbmFtZSc6ICdNYWNoaW5lJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1BhY2thZ2UnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2luc3RhbGxlZF9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbGljZW5zZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc4MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZXZpc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICczMicsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZGVwZW5kZW5jeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3BhY2thZ2VfZGVwZW5kZW5jaWVzX3RhcmdldCciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc19zb3VyY2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10iLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnBhY2thZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZGZpbGVsaXN0X3BhY2thZ2UnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3QnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdjcmVhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3dfYWRkJzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2hvcnRfZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cGRhdGVkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnYXV0b19ub3cnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VzZXJfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0bGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3Byb2plY3QnLCAnbGF5ZXJjb21taXQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Byb2plY3RMYXllcid9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcmNvbW1pdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnb3B0aW9uYWwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R0YXJnZXQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFRhcmdldCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwcm9qZWN0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUHJvamVjdCddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnByb2plY3R2YXJpYWJsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0VmFyaWFibGUnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWNpcGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3ZlcnNpb24nLCAnZmlsZV9wYXRoJywgJ3BhdGhmbGFncycpLCAoJ2ZpbGVfcGF0aCcsICdwYXRoZmxhZ3MnKSkiLCAnb2JqZWN0X25hbWUnOiAnUmVjaXBlJ30sCisgICAgICAgICAgICAnYnVndHJhY2tlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ZpbGVfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hvbWVwYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JlY2lwZV9sYXllcl92ZXJzaW9uJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYXRoZmxhZ3MnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2VjdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVjaXBlX0RlcGVuZGVuY3knfSwKKyAgICAgICAgICAgICdkZXBfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdkZXBlbmRzX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX2RlcGVuZHMnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3JfZGVwZW5kZW5jaWVzX3JlY2lwZSciLCAndG8nOiB1Im9ybVsnb3JtLlJlY2lwZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUmVsZWFzZSd9LAorICAgICAgICAgICAgJ2JpdGJha2VfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnYnJhbmNoX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlZGVmYXVsdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2VEZWZhdWx0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlbGVhc2VsYXllcnNvdXJjZXByaW9yaXR5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdyZWxlYXNlJywgJ2xheWVyX3NvdXJjZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnUmVsZWFzZUxheWVyU291cmNlUHJpb3JpdHknfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSJ9KSwKKyAgICAgICAgICAgICdwcmlvcml0eSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW1hZ2Vfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2lzX2ltYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ0ZhbHNlJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2VfbWFuaWZlc3RfcGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ZpbGUnfSwKKyAgICAgICAgICAgICdkaXJlY3RvcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGlyZWN0b3J5X3NldCciLCAnbnVsbCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5UYXJnZXRfRmlsZSddIn0pLAorICAgICAgICAgICAgJ2dyb3VwJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnaW5vZGV0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ293bmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEyOCd9KSwKKyAgICAgICAgICAgICdwYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncGVybWlzc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxNid9KSwKKyAgICAgICAgICAgICdzaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgJ3N5bV90YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInc3ltbGlua19zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXJnZXRfaW1hZ2VfZmlsZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW1hZ2VfRmlsZSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU0J30pLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2luc3RhbGxlZF9wYWNrYWdlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9JbnN0YWxsZWRfUGFja2FnZSd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdwYWNrYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2J1aWxkdGFyZ2V0bGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhc2snOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb3JkZXJpbmcnOiAiKCdvcmRlcicsICdyZWNpcGUnKSIsICd1bmlxdWVfdG9nZXRoZXInOiAiKCgnYnVpbGQnLCAncmVjaXBlJywgJ3Rhc2tfbmFtZScpLCkiLCAnb2JqZWN0X25hbWUnOiAnVGFzayd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NwdV91c2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJywgJ21heF9kaWdpdHMnOiAnOCcsICdkZWNpbWFsX3BsYWNlcyc6ICcyJ30pLAorICAgICAgICAgICAgJ2Rpc2tfaW8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdlbGFwc2VkX3RpbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdsb2dmaWxlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI0MCd9KSwKKyAgICAgICAgICAgICdvcmRlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ291dGNvbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnLTEnfSksCisgICAgICAgICAgICAncGF0aF90b19zc3RhdGVfb2JqJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza3MnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KSwKKyAgICAgICAgICAgICdzY3JpcHRfdHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3NvdXJjZV91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NzdGF0ZV9jaGVja3N1bSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfcmVzdWx0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAndGFza19leGVjdXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICd0YXNrX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3dvcmtfZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFza19EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tfZGVwZW5kZW5jaWVzX3Rhc2snIiwgJ3RvJzogdSJvcm1bJ29ybS5UYXNrJ10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udG9hc3RlcnNldHRpbmcnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVG9hc3RlclNldHRpbmcnfSwKKyAgICAgICAgICAgICdoZWxwdGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVmFyaWFibGUnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2YXJpYWJsZV9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnY2hhbmdlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdodW1hbl9yZWFkYWJsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndmFyaWFibGVfdmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udmFyaWFibGVoaXN0b3J5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlSGlzdG9yeSd9LAorICAgICAgICAgICAgJ2ZpbGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsaW5lX251bWJlcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wZXJhdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc2NCd9KSwKKyAgICAgICAgICAgICd2YWx1ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2YXJpYWJsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid2aGlzdG9yeSciLCAndG8nOiB1Im9ybVsnb3JtLlZhcmlhYmxlJ10ifSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbXBsZXRlX2FwcHMgPSBbJ29ybSddCmRpZmYgLS1naXQgYS9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjFfYXV0b19fY2hnX2ZpZWxkX2J1aWxkX3Byb2plY3RfX2NoZ19maWVsZF9wcm9qZWN0X2JpdGJha2VfdmVyc2lvbl9fY2hnXy5weSBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMV9hdXRvX19jaGdfZmllbGRfYnVpbGRfcHJvamVjdF9fY2hnX2ZpZWxkX3Byb2plY3RfYml0YmFrZV92ZXJzaW9uX19jaGdfLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmRkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9iaXRiYWtlL2xpYi90b2FzdGVyL29ybS9taWdyYXRpb25zLzAwMjFfYXV0b19fY2hnX2ZpZWxkX2J1aWxkX3Byb2plY3RfX2NoZ19maWVsZF9wcm9qZWN0X2JpdGJha2VfdmVyc2lvbl9fY2hnXy5weQpAQCAtMCwwICsxLDM3MSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2Zyb20gc291dGgudXRpbHMgaW1wb3J0IGRhdGV0aW1lX3V0aWxzIGFzIGRhdGV0aW1lCitmcm9tIHNvdXRoLmRiIGltcG9ydCBkYgorZnJvbSBzb3V0aC52MiBpbXBvcnQgU2NoZW1hTWlncmF0aW9uCitmcm9tIGRqYW5nby5kYiBpbXBvcnQgbW9kZWxzCisKKworY2xhc3MgTWlncmF0aW9uKFNjaGVtYU1pZ3JhdGlvbik6CisKKyAgICBub19kcnlfcnVuID0gVHJ1ZQorCisgICAgZGVmIGZvcndhcmRzKHNlbGYsIG9ybSk6CisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnQnVpbGQucHJvamVjdCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2J1aWxkJywgJ3Byb2plY3RfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5Qcm9qZWN0J10pKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Byb2plY3QuYml0YmFrZV92ZXJzaW9uJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdiaXRiYWtlX3ZlcnNpb25faWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddLCBudWxsPVRydWUpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Byb2plY3QucmVsZWFzZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3Byb2plY3QnLCAncmVsZWFzZV9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLlJlbGVhc2UnXSwgbnVsbD1UcnVlKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXNrLmNwdV91c2FnZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3Rhc2snLCAnY3B1X3VzYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJykobnVsbD1UcnVlLCBtYXhfZGlnaXRzPTgsIGRlY2ltYWxfcGxhY2VzPTIpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Rhc2suZWxhcHNlZF90aW1lJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFzaycsICdlbGFwc2VkX3RpbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnKShudWxsPVRydWUsIG1heF9kaWdpdHM9OCwgZGVjaW1hbF9wbGFjZXM9MikpCisKKyAgICBkZWYgYmFja3dhcmRzKHNlbGYsIG9ybSk6CisKKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnQnVpbGQucHJvamVjdCcKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX2J1aWxkJywgJ3Byb2plY3RfaWQnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknKSh0bz1vcm1bJ29ybS5Qcm9qZWN0J10sIG51bGw9VHJ1ZSkpCisKKyAgICAgICAgIyBVc2VyIGNob3NlIHRvIG5vdCBkZWFsIHdpdGggYmFja3dhcmRzIE5VTEwgaXNzdWVzIGZvciAnUHJvamVjdC5iaXRiYWtlX3ZlcnNpb24nCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IHJldmVyc2UgdGhpcyBtaWdyYXRpb24uICdQcm9qZWN0LmJpdGJha2VfdmVyc2lvbicgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24KKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUHJvamVjdC5iaXRiYWtlX3ZlcnNpb24nCisgICAgICAgIGRiLmFsdGVyX2NvbHVtbih1J29ybV9wcm9qZWN0JywgJ2JpdGJha2VfdmVyc2lvbl9pZCcsIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScpKHRvPW9ybVsnb3JtLkJpdGJha2VWZXJzaW9uJ10pKQorCisgICAgICAgICMgVXNlciBjaG9zZSB0byBub3QgZGVhbCB3aXRoIGJhY2t3YXJkcyBOVUxMIGlzc3VlcyBmb3IgJ1Byb2plY3QucmVsZWFzZScKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgcmV2ZXJzZSB0aGlzIG1pZ3JhdGlvbi4gJ1Byb2plY3QucmVsZWFzZScgYW5kIGl0cyB2YWx1ZXMgY2Fubm90IGJlIHJlc3RvcmVkLiIpCisgICAgICAgIAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBwcm92aWRlZCBoZXJlIHRvIGFpZCBpbiB3cml0aW5nIGEgY29ycmVjdCBtaWdyYXRpb24KKyAgICAgICAgIyBDaGFuZ2luZyBmaWVsZCAnUHJvamVjdC5yZWxlYXNlJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fcHJvamVjdCcsICdyZWxlYXNlX2lkJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JykodG89b3JtWydvcm0uUmVsZWFzZSddKSkKKworICAgICAgICAjIENoYW5naW5nIGZpZWxkICdUYXNrLmNwdV91c2FnZScKKyAgICAgICAgZGIuYWx0ZXJfY29sdW1uKHUnb3JtX3Rhc2snLCAnY3B1X3VzYWdlJywgc2VsZi5nZignZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGVjaW1hbEZpZWxkJykobnVsbD1UcnVlLCBtYXhfZGlnaXRzPTYsIGRlY2ltYWxfcGxhY2VzPTIpKQorCisgICAgICAgICMgQ2hhbmdpbmcgZmllbGQgJ1Rhc2suZWxhcHNlZF90aW1lJworICAgICAgICBkYi5hbHRlcl9jb2x1bW4odSdvcm1fdGFzaycsICdlbGFwc2VkX3RpbWUnLCBzZWxmLmdmKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnKShudWxsPVRydWUsIG1heF9kaWdpdHM9NiwgZGVjaW1hbF9wbGFjZXM9MikpCisKKyAgICBtb2RlbHMgPSB7CisgICAgICAgIHUnb3JtLmJpdGJha2V2ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0JpdGJha2VWZXJzaW9uJ30sCisgICAgICAgICAgICAnYnJhbmNoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzMyJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2dpdHVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICczMid9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5icmFuY2gnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICduYW1lJyksICgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJykpIiwgJ29iamVjdF9uYW1lJzogJ0JyYW5jaCd9LAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCd9KSwKKyAgICAgICAgICAgICdzaG9ydF9kZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICc1MCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2RhdGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRhdGVUaW1lRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAnbnVsbCc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkJ30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ2J1aWxkX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2NvbXBsZXRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnY29va2VyX2xvZ19wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwMCd9KSwKKyAgICAgICAgICAgICdkaXN0cm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Ryb192ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdlcnJvcnNfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWFjaGluZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnb3V0Y29tZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcyJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAnc3RhcnRlZF9vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAndGltZXNwZW50JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnd2FybmluZ3Nfbm8nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5idWlsZGFydGlmYWN0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0J1aWxkQXJ0aWZhY3QnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICAnZmlsZV9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZmlsZV9zaXplJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5oZWxwdGV4dCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdIZWxwVGV4dCd9LAorICAgICAgICAgICAgJ2FyZWEnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInaGVscHRleHRfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdrZXknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3RleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXInOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCAoJ2xheWVyX3NvdXJjZScsICduYW1lJykpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyJ30sCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX2luZGV4X3VybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2Y3NfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl9maWxlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl90cmVlX2Jhc2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzIwMCcsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmNzX3dlYl91cmwnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcl92ZXJzaW9uJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSwpIiwgJ29iamVjdF9uYW1lJzogJ0xheWVyX1ZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnfSksCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fYnVpbGQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2RpcnBhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdtYXhfbGVuZ3RoJzogJzI1NScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2xheWVyX3ZlcnNpb25fbGF5ZXInIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllciddIn0pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsb2NhbF9wYXRoJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInLyciLCAnbWF4X2xlbmd0aCc6ICcxMDI0J30pLAorICAgICAgICAgICAgJ3ByaW9yaXR5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3VwX2JyYW5jaCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ3RvJzogdSJvcm1bJ29ybS5CcmFuY2gnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubGF5ZXJzb3VyY2UnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ3NvdXJjZXR5cGUnLCAnYXBpdXJsJyksKSIsICdvYmplY3RfbmFtZSc6ICdMYXllclNvdXJjZSd9LAorICAgICAgICAgICAgJ2FwaXVybCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ21heF9sZW5ndGgnOiAnMjU1JywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsndW5pcXVlJzogJ1RydWUnLCAnbWF4X2xlbmd0aCc6ICc2Myd9KSwKKyAgICAgICAgICAgICdzb3VyY2V0eXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwge30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmxheWVydmVyc2lvbmRlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXJWZXJzaW9uRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInZGVwZW5kZWVzJyIsICd0byc6IHUib3JtWydvcm0uTGF5ZXJfVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidkZXBlbmRlbmNpZXMnIiwgJ3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ubG9nbWVzc2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdMb2dNZXNzYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsZXZlbCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpbmVubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ21lc3NhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjQwJ30pLAorICAgICAgICAgICAgJ3BhdGhuYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXNrJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFzayddIiwgJ251bGwnOiAnVHJ1ZScsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLm1hY2hpbmUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2xheWVyX3NvdXJjZScsICd1cF9pZCcpLCkiLCAnb2JqZWN0X25hbWUnOiAnTWFjaGluZSd9LAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfc291cmNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydkZWZhdWx0JzogJ05vbmUnLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10ifSksCisgICAgICAgICAgICAnbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQYWNrYWdlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICInJyIsICdtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdpbnN0YWxsZWRfc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnODAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdyZWNpcGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmV2aXNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzZWN0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzgwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3N1bW1hcnknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2RlcGVuZGVuY3knOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidwYWNrYWdlX2RlcGVuZGVuY2llc190YXJnZXQnIiwgJ3RvJzogdSJvcm1bJ29ybS5QYWNrYWdlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIncGFja2FnZV9kZXBlbmRlbmNpZXNfc291cmNlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIiwgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wYWNrYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUGFja2FnZV9GaWxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3BhY2thZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICInYnVpbGRmaWxlbGlzdF9wYWNrYWdlJyIsICd0byc6IHUib3JtWydvcm0uUGFja2FnZSddIn0pLAorICAgICAgICAgICAgJ3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NScsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdQcm9qZWN0J30sCisgICAgICAgICAgICAnYml0YmFrZV92ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQml0YmFrZVZlcnNpb24nXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnY3JlYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93X2FkZCc6ICdUcnVlJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3JlbGVhc2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5SZWxlYXNlJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBkYXRlZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2F1dG9fbm93JzogJ1RydWUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1c2VyX2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucHJvamVjdGxheWVyJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdwcm9qZWN0JywgJ2xheWVyY29tbWl0JyksKSIsICdvYmplY3RfbmFtZSc6ICdQcm9qZWN0TGF5ZXInfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJjb21taXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5MYXllcl9WZXJzaW9uJ10iLCAnbnVsbCc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ29wdGlvbmFsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5Cb29sZWFuRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dGFyZ2V0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Byb2plY3RUYXJnZXQnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Rhc2snOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ251bGwnOiAnVHJ1ZSd9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5wcm9qZWN0dmFyaWFibGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnUHJvamVjdFZhcmlhYmxlJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Byb2plY3QnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5Qcm9qZWN0J10ifSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVjaXBlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J3VuaXF1ZV90b2dldGhlcic6ICIoKCdsYXllcl92ZXJzaW9uJywgJ2ZpbGVfcGF0aCcsICdwYXRoZmxhZ3MnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlY2lwZSd9LAorICAgICAgICAgICAgJ2J1Z3RyYWNrZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlVSTEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdmaWxlX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgICdob21lcGFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVVJMRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdsYXllcl9zb3VyY2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICd0byc6IHUib3JtWydvcm0uTGF5ZXJTb3VyY2UnXSIsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGF5ZXJfdmVyc2lvbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyZWNpcGVfbGF5ZXJfdmVyc2lvbiciLCAndG8nOiB1Im9ybVsnb3JtLkxheWVyX1ZlcnNpb24nXSJ9KSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncGF0aGZsYWdzJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzIwMCcsICdibGFuayc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3NlY3Rpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3VtbWFyeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHsnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9kYXRlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd1cF9pZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdOb25lJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd2ZXJzaW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCcsICdibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnJlY2lwZV9kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlY2lwZV9EZXBlbmRlbmN5J30sCisgICAgICAgICAgICAnZGVwX3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICAnZGVwZW5kc19vbic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19kZXBlbmRzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3JlY2lwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidyX2RlcGVuZGVuY2llc19yZWNpcGUnIiwgJ3RvJzogdSJvcm1bJ29ybS5SZWNpcGUnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1JlbGVhc2UnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5CaXRiYWtlVmVyc2lvbiddIn0pLAorICAgICAgICAgICAgJ2JyYW5jaF9uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogIicnIiwgJ21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pLAorICAgICAgICAgICAgJ2hlbHB0ZXh0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J3VuaXF1ZSc6ICdUcnVlJywgJ21heF9sZW5ndGgnOiAnMzInfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0ucmVsZWFzZWRlZmF1bHRsYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdSZWxlYXNlRGVmYXVsdExheWVyJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAiJyciLCAnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAncmVsZWFzZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlJlbGVhc2UnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5yZWxlYXNlbGF5ZXJzb3VyY2Vwcmlvcml0eSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgncmVsZWFzZScsICdsYXllcl9zb3VyY2UnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1JlbGVhc2VMYXllclNvdXJjZVByaW9yaXR5J30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkxheWVyU291cmNlJ10ifSksCisgICAgICAgICAgICAncHJpb3JpdHknOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdyZWxlYXNlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uUmVsZWFzZSddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXQnfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2ltYWdlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdpc19pbWFnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQm9vbGVhbkZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICdGYWxzZSd9KSwKKyAgICAgICAgICAgICdsaWNlbnNlX21hbmlmZXN0X3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9maWxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RhcmdldF9GaWxlJ30sCisgICAgICAgICAgICAnZGlyZWN0b3J5JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ2RpcmVjdG9yeV9zZXQnIiwgJ251bGwnOiAnVHJ1ZScsICd0byc6IHUib3JtWydvcm0uVGFyZ2V0X0ZpbGUnXSJ9KSwKKyAgICAgICAgICAgICdncm91cCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2lub2RldHlwZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdvd25lcic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMjgnfSksCisgICAgICAgICAgICAncGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3Blcm1pc3Npb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTYnfSksCisgICAgICAgICAgICAnc2l6ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdzeW1fdGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3N5bWxpbmtfc2V0JyIsICdudWxsJzogJ1RydWUnLCAndG8nOiB1Im9ybVsnb3JtLlRhcmdldF9GaWxlJ10ifSksCisgICAgICAgICAgICAndGFyZ2V0JzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uVGFyZ2V0J10ifSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFyZ2V0X2ltYWdlX2ZpbGUnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnVGFyZ2V0X0ltYWdlX0ZpbGUnfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3RhcmdldCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlRhcmdldCddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRhcmdldF9pbnN0YWxsZWRfcGFja2FnZSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdUYXJnZXRfSW5zdGFsbGVkX1BhY2thZ2UnfSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAncGFja2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIididWlsZHRhcmdldGxpc3RfcGFja2FnZSciLCAndG8nOiB1Im9ybVsnb3JtLlBhY2thZ2UnXSJ9KSwKKyAgICAgICAgICAgICd0YXJnZXQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3RvJzogdSJvcm1bJ29ybS5UYXJnZXQnXSJ9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS50YXNrJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29yZGVyaW5nJzogIignb3JkZXInLCAncmVjaXBlJykiLCAndW5pcXVlX3RvZ2V0aGVyJzogIigoJ2J1aWxkJywgJ3JlY2lwZScsICd0YXNrX25hbWUnKSwpIiwgJ29iamVjdF9uYW1lJzogJ1Rhc2snfSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2J1aWxkJyIsICd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdjcHVfdXNhZ2UnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkRlY2ltYWxGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZScsICdtYXhfZGlnaXRzJzogJzgnLCAnZGVjaW1hbF9wbGFjZXMnOiAnMid9KSwKKyAgICAgICAgICAgICdkaXNrX2lvJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAnZWxhcHNlZF90aW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EZWNpbWFsRmllbGQnLCBbXSwgeydudWxsJzogJ1RydWUnLCAnbWF4X2RpZ2l0cyc6ICc4JywgJ2RlY2ltYWxfcGxhY2VzJzogJzInfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xpbmVfbnVtYmVyJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzAnfSksCisgICAgICAgICAgICAnbG9nZmlsZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnbWVzc2FnZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNDAnfSksCisgICAgICAgICAgICAnb3JkZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJy0xJ30pLAorICAgICAgICAgICAgJ3BhdGhfdG9fc3N0YXRlX29iaic6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAncmVjaXBlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeydyZWxhdGVkX25hbWUnOiAiJ3Rhc2tzJyIsICd0byc6IHUib3JtWydvcm0uUmVjaXBlJ10ifSksCisgICAgICAgICAgICAnc2NyaXB0X3R5cGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICdzb3VyY2VfdXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5GaWxlUGF0aEZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnLCAnYmxhbmsnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdzc3RhdGVfY2hlY2tzdW0nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnc3N0YXRlX3Jlc3VsdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgJ3Rhc2tfZXhlY3V0ZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAndGFza19uYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICd3b3JrX2RpcmVjdG9yeSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRmlsZVBhdGhGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1JywgJ2JsYW5rJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0udGFza19kZXBlbmRlbmN5JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1Rhc2tfRGVwZW5kZW5jeSd9LAorICAgICAgICAgICAgJ2RlcGVuZHNfb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndGFza19kZXBlbmRlbmNpZXNfZGVwZW5kcyciLCAndG8nOiB1Im9ybVsnb3JtLlRhc2snXSJ9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAndGFzayc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIid0YXNrX2RlcGVuZGVuY2llc190YXNrJyIsICd0byc6IHUib3JtWydvcm0uVGFzayddIn0pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnRvYXN0ZXJzZXR0aW5nJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1RvYXN0ZXJTZXR0aW5nJ30sCisgICAgICAgICAgICAnaGVscHRleHQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjMnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjU1J30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlJzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ1ZhcmlhYmxlJ30sCisgICAgICAgICAgICAnYnVpbGQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmFyaWFibGVfYnVpbGQnIiwgJ3RvJzogdSJvcm1bJ29ybS5CdWlsZCddIn0pLAorICAgICAgICAgICAgJ2NoYW5nZWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkJvb2xlYW5GaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnRmFsc2UnfSksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAnaHVtYW5fcmVhZGFibGVfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyMDAnfSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ3ZhcmlhYmxlX3ZhbHVlJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5UZXh0RmllbGQnLCBbXSwgeydibGFuayc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLnZhcmlhYmxlaGlzdG9yeSc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeydvYmplY3RfbmFtZSc6ICdWYXJpYWJsZUhpc3RvcnknfSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzI1NSd9KSwKKyAgICAgICAgICAgIHUnaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkF1dG9GaWVsZCcsIFtdLCB7J3ByaW1hcnlfa2V5JzogJ1RydWUnfSksCisgICAgICAgICAgICAnbGluZV9udW1iZXInOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdvcGVyYXRpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNjQnfSksCisgICAgICAgICAgICAndmFsdWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLlRleHRGaWVsZCcsIFtdLCB7J2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndmFyaWFibGUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLnJlbGF0ZWQuRm9yZWlnbktleScsIFtdLCB7J3JlbGF0ZWRfbmFtZSc6ICIndmhpc3RvcnknIiwgJ3RvJzogdSJvcm1bJ29ybS5WYXJpYWJsZSddIn0pCisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb21wbGV0ZV9hcHBzID0gWydvcm0nXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMl9hdXRvX19hZGRfZmllbGRfdGFyZ2V0X3Rhc2tfX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX2xvY2FsX3BhdGhfX2RlbF9mLnB5IGIvYml0YmFrZS9saWIvdG9hc3Rlci9vcm0vbWlncmF0aW9ucy8wMDIyX2F1dG9fX2FkZF9maWVsZF90YXJnZXRfdGFza19fYWRkX2ZpZWxkX2xheWVyX3ZlcnNpb25fbG9jYWxfcGF0aF9fZGVsX2YucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlYzM5MQotLS0gL2Rldi9udWxsCisrKyBiL2JpdGJha2UvbGliL3RvYXN0ZXIvb3JtL21pZ3JhdGlvbnMvMDAyMl9hdXRvX19hZGRfZmllbGRfdGFyZ2V0X3Rhc2tfX2FkZF9maWVsZF9sYXllcl92ZXJzaW9uX2xvY2FsX3BhdGhfX2RlbF9mLnB5CkBAIC0wLDAgKzEsMzQzIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorZnJvbSBzb3V0aC51dGlscyBpbXBvcnQgZGF0ZXRpbWVfdXRpbHMgYXMgZGF0ZXRpbWUKK2Zyb20gc291dGguZGIgaW1wb3J0IGRiCitmcm9tIHNvdXRoLnYyIGltcG9ydCBTY2hlbWFNaWdyYXRpb24KK2Zyb20gZGphbmdvLmRiIGltcG9ydCBtb2RlbHMKKworCitjbGFzcyBNaWdyYXRpb24oU2NoZW1hTWlncmF0aW9uKToKKworICAgIGRlZiBmb3J3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIEFkZGluZyBmaWVsZCAnVGFyZ2V0LnRhc2snCisgICAgICAgIGRiLmFkZF9jb2x1bW4odSdvcm1fdGFyZ2V0JywgJ3Rhc2snLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2YoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcpKG1heF9sZW5ndGg9MTAwLCBudWxsPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgIGtlZXBfZGVmYXVsdD1GYWxzZSkKKworCisKKworCisgICAgZGVmIGJhY2t3YXJkcyhzZWxmLCBvcm0pOgorICAgICAgICAjIERlbGV0aW5nIGZpZWxkICdUYXJnZXQudGFzaycKKyAgICAgICAgZGIuZGVsZXRlX2NvbHVtbih1J29ybV90YXJnZXQnLCAndGFzaycpCisKKworICAgIG1vZGVscyA9IHsKKyAgICAgICAgdSdvcm0uYml0YmFrZXZlcnNpb24nOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQml0YmFrZVZlcnNpb24nfSwKKyAgICAgICAgICAgICdicmFuY2gnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMzInfSksCisgICAgICAgICAgICAnZGlycGF0aCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcyNTUnfSksCisgICAgICAgICAgICAnZ2l0dXJsJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5VUkxGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMjAwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeyd1bmlxdWUnOiAnVHJ1ZScsICdtYXhfbGVuZ3RoJzogJzMyJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJyYW5jaCc6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSwgKCdsYXllcl9zb3VyY2UnLCAndXBfaWQnKSkiLCAnb2JqZWN0X25hbWUnOiAnQnJhbmNoJ30sCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2xheWVyX3NvdXJjZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsnZGVmYXVsdCc6ICdUcnVlJywgJ3RvJzogdSJvcm1bJ29ybS5MYXllclNvdXJjZSddIiwgJ251bGwnOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICduYW1lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJ30pLAorICAgICAgICAgICAgJ3Nob3J0X2Rlc2NyaXB0aW9uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzUwJywgJ2JsYW5rJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfZGF0ZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuRGF0ZVRpbWVGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSksCisgICAgICAgICAgICAndXBfaWQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnTm9uZScsICdudWxsJzogJ1RydWUnfSkKKyAgICAgICAgfSwKKyAgICAgICAgdSdvcm0uYnVpbGQnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGQnfSwKKyAgICAgICAgICAgICdiaXRiYWtlX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAnfSksCisgICAgICAgICAgICAnYnVpbGRfbmFtZSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnY29tcGxldGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdjb29rZXJfbG9nX3BhdGgnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnNTAwJ30pLAorICAgICAgICAgICAgJ2Rpc3Rybyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAnZGlzdHJvX3ZlcnNpb24nOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkNoYXJGaWVsZCcsIFtdLCB7J21heF9sZW5ndGgnOiAnMTAwJ30pLAorICAgICAgICAgICAgJ2Vycm9yc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pLAorICAgICAgICAgICAgdSdpZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQXV0b0ZpZWxkJywgW10sIHsncHJpbWFyeV9rZXknOiAnVHJ1ZSd9KSwKKyAgICAgICAgICAgICdtYWNoaW5lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5DaGFyRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdvdXRjb21lJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5JbnRlZ2VyRmllbGQnLCBbXSwgeydkZWZhdWx0JzogJzInfSksCisgICAgICAgICAgICAncHJvamVjdCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsndG8nOiB1Im9ybVsnb3JtLlByb2plY3QnXSJ9KSwKKyAgICAgICAgICAgICdzdGFydGVkX29uJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5EYXRlVGltZUZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICd0aW1lc3BlbnQnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7J2RlZmF1bHQnOiAnMCd9KSwKKyAgICAgICAgICAgICd3YXJuaW5nc19ubyc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHsnZGVmYXVsdCc6ICcwJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmJ1aWxkYXJ0aWZhY3QnOiB7CisgICAgICAgICAgICAnTWV0YSc6IHsnb2JqZWN0X25hbWUnOiAnQnVpbGRBcnRpZmFjdCd9LAorICAgICAgICAgICAgJ2J1aWxkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5yZWxhdGVkLkZvcmVpZ25LZXknLCBbXSwgeyd0byc6IHUib3JtWydvcm0uQnVpbGQnXSJ9KSwKKyAgICAgICAgICAgICdmaWxlX25hbWUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkZpbGVQYXRoRmllbGQnLCBbXSwgeydtYXhfbGVuZ3RoJzogJzEwMCd9KSwKKyAgICAgICAgICAgICdmaWxlX3NpemUnOiAoJ2RqYW5nby5kYi5tb2RlbHMuZmllbGRzLkludGVnZXJGaWVsZCcsIFtdLCB7fSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pCisgICAgICAgIH0sCisgICAgICAgIHUnb3JtLmhlbHB0ZXh0JzogeworICAgICAgICAgICAgJ01ldGEnOiB7J29iamVjdF9uYW1lJzogJ0hlbHBUZXh0J30sCisgICAgICAgICAgICAnYXJlYSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuSW50ZWdlckZpZWxkJywgW10sIHt9KSwKKyAgICAgICAgICAgICdidWlsZCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMucmVsYXRlZC5Gb3JlaWduS2V5JywgW10sIHsncmVsYXRlZF9uYW1lJzogIidoZWxwdGV4dF9idWlsZCciLCAndG8nOiB1Im9ybVsnb3JtLkJ1aWxkJ10ifSksCisgICAgICAgICAgICB1J2lkJzogKCdkamFuZ28uZGIubW9kZWxzLmZpZWxkcy5BdXRvRmllbGQnLCBbXSwgeydwcmltYXJ5X2tleSc6ICdUcnVlJ30pLAorICAgICAgICAgICAgJ2tleSc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuQ2hhckZpZWxkJywgW10sIHsnbWF4X2xlbmd0aCc6ICcxMDAnfSksCisgICAgICAgICAgICAndGV4dCc6ICgnZGphbmdvLmRiLm1vZGVscy5maWVsZHMuVGV4dEZpZWxkJywgW10sIHt9KQorICAgICAgICB9LAorICAgICAgICB1J29ybS5sYXllcic6IHsKKyAgICAgICAgICAgICdNZXRhJzogeyd1bmlxdWVfdG9nZXRoZXInOiAiKCgnbGF5ZXJfc291cmNlJywgJ3VwX2lkJyksICgnbGF5ZXJfc291cmNlJywgJ25hbWUnKSkiLCAnb2JqZWN0X25hbWUnOiAnTGF5ZXInfSwKKyAgICAgICAgICAgICdkZXNj