IyEgL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KCiIiIkdlbmVyYXRlIGJpbmFyeSBtZXNzYWdlIGNhdGFsb2cgZnJvbSB0ZXh0dWFsIHRyYW5zbGF0aW9uIGRlc2NyaXB0aW9uLgoKVGhpcyBwcm9ncmFtIGNvbnZlcnRzIGEgdGV4dHVhbCBVbmlmb3J1bS1zdHlsZSBtZXNzYWdlIGNhdGFsb2cgKC5wbyBmaWxlKSBpbnRvCmEgYmluYXJ5IEdOVSBjYXRhbG9nICgubW8gZmlsZSkuICBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZQpHTlUgbXNnZm10IHByb2dyYW0sIGhvd2V2ZXIsIGl0IGlzIGEgc2ltcGxlciBpbXBsZW1lbnRhdGlvbi4KClVzYWdlOiBtc2dmbXQucHkgW09QVElPTlNdIGZpbGVuYW1lLnBvCgpPcHRpb25zOgogICAgLW8gZmlsZQogICAgLS1vdXRwdXQtZmlsZT1maWxlCiAgICAgICAgU3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgdG8gd3JpdGUgdG8uICBJZiBvbWl0dGVkLCBvdXRwdXQgd2lsbCBnbyB0byBhCiAgICAgICAgZmlsZSBuYW1lZCBmaWxlbmFtZS5tbyAoYmFzZWQgb2ZmIHRoZSBpbnB1dCBmaWxlIG5hbWUpLgoKICAgIC1oCiAgICAtLWhlbHAKICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCgogICAgLVYKICAgIC0tdmVyc2lvbgogICAgICAgIERpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdC4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgYXN0CmltcG9ydCBnZXRvcHQKaW1wb3J0IHN0cnVjdAppbXBvcnQgYXJyYXkKCl9fdmVyc2lvbl9fID0gIjEuMSIKCk1FU1NBR0VTID0ge30KCgoMCmRlZiB1c2FnZShjb2RlLCBtc2c9JycpOgogICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXwogICAgaWYgbXNnOgogICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZwogICAgc3lzLmV4aXQoY29kZSkKCgoMCmRlZiBhZGQoaWQsIHN0ciwgZnV6enkpOgogICAgIkFkZCBhIG5vbi1mdXp6eSB0cmFuc2xhdGlvbiB0byB0aGUgZGljdGlvbmFyeS4iCiAgICBnbG9iYWwgTUVTU0FHRVMKICAgIGlmIG5vdCBmdXp6eSBhbmQgc3RyOgogICAgICAgIE1FU1NBR0VTW2lkXSA9IHN0cgoKCgwKZGVmIGdlbmVyYXRlKCk6CiAgICAiUmV0dXJuIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiIKICAgIGdsb2JhbCBNRVNTQUdFUwogICAga2V5cyA9IE1FU1NBR0VTLmtleXMoKQogICAgIyB0aGUga2V5cyBhcmUgc29ydGVkIGluIHRoZSAubW8gZmlsZQogICAga2V5cy5zb3J0KCkKICAgIG9mZnNldHMgPSBbXQogICAgaWRzID0gc3RycyA9ICcnCiAgICBmb3IgaWQgaW4ga2V5czoKICAgICAgICAjIEZvciBlYWNoIHN0cmluZywgd2UgbmVlZCBzaXplIGFuZCBmaWxlIG9mZnNldC4gIEVhY2ggc3RyaW5nIGlzIE5VTAogICAgICAgICMgdGVybWluYXRlZDsgdGhlIE5VTCBkb2VzIG5vdCBjb3VudCBpbnRvIHRoZSBzaXplLgogICAgICAgIG9mZnNldHMuYXBwZW5kKChsZW4oaWRzKSwgbGVuKGlkKSwgbGVuKHN0cnMpLCBsZW4oTUVTU0FHRVNbaWRdKSkpCiAgICAgICAgaWRzICs9IGlkICsgJ1wwJwogICAgICAgIHN0cnMgKz0gTUVTU0FHRVNbaWRdICsgJ1wwJwogICAgb3V0cHV0ID0gJycKICAgICMgVGhlIGhlYWRlciBpcyA3IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2Vycy4gIFdlIGRvbid0IHVzZSBoYXNoIHRhYmxlcywgc28KICAgICMgdGhlIGtleXMgc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIGluZGV4IHRhYmxlcy4KICAgICMgdHJhbnNsYXRlZCBzdHJpbmcuCiAgICBrZXlzdGFydCA9IDcqNCsxNipsZW4oa2V5cykKICAgICMgYW5kIHRoZSB2YWx1ZXMgc3RhcnQgYWZ0ZXIgdGhlIGtleXMKICAgIHZhbHVlc3RhcnQgPSBrZXlzdGFydCArIGxlbihpZHMpCiAgICBrb2Zmc2V0cyA9IFtdCiAgICB2b2Zmc2V0cyA9IFtdCiAgICAjIFRoZSBzdHJpbmcgdGFibGUgZmlyc3QgaGFzIHRoZSBsaXN0IG9mIGtleXMsIHRoZW4gdGhlIGxpc3Qgb2YgdmFsdWVzLgogICAgIyBFYWNoIGVudHJ5IGhhcyBmaXJzdCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLCB0aGVuIHRoZSBmaWxlIG9mZnNldC4KICAgIGZvciBvMSwgbDEsIG8yLCBsMiBpbiBvZmZzZXRzOgogICAgICAgIGtvZmZzZXRzICs9IFtsMSwgbzEra2V5c3RhcnRdCiAgICAgICAgdm9mZnNldHMgKz0gW2wyLCBvMit2YWx1ZXN0YXJ0XQogICAgb2Zmc2V0cyA9IGtvZmZzZXRzICsgdm9mZnNldHMKICAgIG91dHB1dCA9IHN0cnVjdC5wYWNrKCJJaWlpaWlpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTUwNDEyZGVMLCAgICAgICAjIE1hZ2ljCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIyBWZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oa2V5cyksICAgICAgICAgIyAjIG9mIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICAgICAgIDcqNCwgICAgICAgICAgICAgICAjIHN0YXJ0IG9mIGtleSBpbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgNyo0K2xlbihrZXlzKSo4LCAgICMgc3RhcnQgb2YgdmFsdWUgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApICAgICAgICAgICAgICAjIHNpemUgYW5kIG9mZnNldCBvZiBoYXNoIHRhYmxlCiAgICBvdXRwdXQgKz0gYXJyYXkuYXJyYXkoImkiLCBvZmZzZXRzKS50b3N0cmluZygpCiAgICBvdXRwdXQgKz0gaWRzCiAgICBvdXRwdXQgKz0gc3RycwogICAgcmV0dXJuIG91dHB1dAoKCgwKZGVmIG1ha2UoZmlsZW5hbWUsIG91dGZpbGUpOgogICAgSUQgPSAxCiAgICBTVFIgPSAyCgogICAgIyBDb21wdXRlIC5tbyBuYW1lIGZyb20gLnBvIG5hbWUgYW5kIGFyZ3VtZW50cwogICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5wbycpOgogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lCiAgICBlbHNlOgogICAgICAgIGluZmlsZSA9IGZpbGVuYW1lICsgJy5wbycKICAgIGlmIG91dGZpbGUgaXMgTm9uZToKICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5zcGxpdGV4dChpbmZpbGUpWzBdICsgJy5tbycKCiAgICB0cnk6CiAgICAgICAgbGluZXMgPSBvcGVuKGluZmlsZSkucmVhZGxpbmVzKCkKICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBzZWN0aW9uID0gTm9uZQogICAgZnV6enkgPSAwCgogICAgIyBQYXJzZSB0aGUgY2F0YWxvZwogICAgbG5vID0gMAogICAgZm9yIGwgaW4gbGluZXM6CiAgICAgICAgbG5vICs9IDEKICAgICAgICAjIElmIHdlIGdldCBhIGNvbW1lbnQgbGluZSBhZnRlciBhIG1zZ3N0ciwgdGhpcyBpcyBhIG5ldyBlbnRyeQogICAgICAgIGlmIGxbMF0gPT0gJyMnIGFuZCBzZWN0aW9uID09IFNUUjoKICAgICAgICAgICAgYWRkKG1zZ2lkLCBtc2dzdHIsIGZ1enp5KQogICAgICAgICAgICBzZWN0aW9uID0gTm9uZQogICAgICAgICAgICBmdXp6eSA9IDAKICAgICAgICAjIFJlY29yZCBhIGZ1enp5IG1hcmsKICAgICAgICBpZiBsWzoyXSA9PSAnIywnIGFuZCAnZnV6enknIGluIGw6CiAgICAgICAgICAgIGZ1enp5ID0gMQogICAgICAgICMgU2tpcCBjb21tZW50cwogICAgICAgIGlmIGxbMF0gPT0gJyMnOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgICMgTm93IHdlIGFyZSBpbiBhIG1zZ2lkIHNlY3Rpb24sIG91dHB1dCBwcmV2aW91cyBzZWN0aW9uCiAgICAgICAgaWYgbC5zdGFydHN3aXRoKCdtc2dpZCcpIGFuZCBub3QgbC5zdGFydHN3aXRoKCdtc2dpZF9wbHVyYWwnKToKICAgICAgICAgICAgaWYgc2VjdGlvbiA9PSBTVFI6CiAgICAgICAgICAgICAgICBhZGQobXNnaWQsIG1zZ3N0ciwgZnV6enkpCiAgICAgICAgICAgIHNlY3Rpb24gPSBJRAogICAgICAgICAgICBsID0gbFs1Ol0KICAgICAgICAgICAgbXNnaWQgPSBtc2dzdHIgPSAnJwogICAgICAgICAgICBpc19wbHVyYWwgPSBGYWxzZQogICAgICAgICMgVGhpcyBpcyBhIG1lc3NhZ2Ugd2l0aCBwbHVyYWwgZm9ybXMKICAgICAgICBlbGlmIGwuc3RhcnRzd2l0aCgnbXNnaWRfcGx1cmFsJyk6CiAgICAgICAgICAgIGlmIHNlY3Rpb24gIT0gSUQ6CiAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnbXNnaWRfcGx1cmFsIG5vdCBwcmVjZWRlZCBieSBtc2dpZCBvbiAlczolZCcgJVwKICAgICAgICAgICAgICAgICAgICAoaW5maWxlLCBsbm8pCiAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQogICAgICAgICAgICBsID0gbFsxMjpdCiAgICAgICAgICAgIG1zZ2lkICs9ICdcMCcgIyBzZXBhcmF0b3Igb2Ygc2luZ3VsYXIgYW5kIHBsdXJhbAogICAgICAgICAgICBpc19wbHVyYWwgPSBUcnVlCiAgICAgICAgIyBOb3cgd2UgYXJlIGluIGEgbXNnc3RyIHNlY3Rpb24KICAgICAgICBlbGlmIGwuc3RhcnRzd2l0aCgnbXNnc3RyJyk6CiAgICAgICAgICAgIHNlY3Rpb24gPSBTVFIKICAgICAgICAgICAgaWYgbC5zdGFydHN3aXRoKCdtc2dzdHJbJyk6CiAgICAgICAgICAgICAgICBpZiBub3QgaXNfcGx1cmFsOgogICAgICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdwbHVyYWwgd2l0aG91dCBtc2dpZF9wbHVyYWwgb24gJXM6JWQnICVcCiAgICAgICAgICAgICAgICAgICAgICAgIChpbmZpbGUsIGxubykKICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQogICAgICAgICAgICAgICAgbCA9IGwuc3BsaXQoJ10nLCAxKVsxXQogICAgICAgICAgICAgICAgaWYgbXNnc3RyOgogICAgICAgICAgICAgICAgICAgIG1zZ3N0ciArPSAnXDAnICMgU2VwYXJhdG9yIG9mIHRoZSB2YXJpb3VzIHBsdXJhbCBmb3JtcwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgaXNfcGx1cmFsOgogICAgICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdpbmRleGVkIG1zZ3N0ciByZXF1aXJlZCBmb3IgcGx1cmFsIG9uICAlczolZCcgJVwKICAgICAgICAgICAgICAgICAgICAgICAgKGluZmlsZSwgbG5vKQogICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgICAgICAgICBsID0gbFs2Ol0KICAgICAgICAjIFNraXAgZW1wdHkgbGluZXMKICAgICAgICBsID0gbC5zdHJpcCgpCiAgICAgICAgaWYgbm90IGw6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgbCA9IGFzdC5saXRlcmFsX2V2YWwobCkKICAgICAgICBpZiBzZWN0aW9uID09IElEOgogICAgICAgICAgICBtc2dpZCArPSBsCiAgICAgICAgZWxpZiBzZWN0aW9uID09IFNUUjoKICAgICAgICAgICAgbXNnc3RyICs9IGwKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnU3ludGF4IGVycm9yIG9uICVzOiVkJyAlIChpbmZpbGUsIGxubyksIFwKICAgICAgICAgICAgICAgICAgJ2JlZm9yZTonCiAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIGwKICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICMgQWRkIGxhc3QgZW50cnkKICAgIGlmIHNlY3Rpb24gPT0gU1RSOgogICAgICAgIGFkZChtc2dpZCwgbXNnc3RyLCBmdXp6eSkKCiAgICAjIENvbXB1dGUgb3V0cHV0CiAgICBvdXRwdXQgPSBnZW5lcmF0ZSgpCgogICAgdHJ5OgogICAgICAgIG9wZW4ob3V0ZmlsZSwid2IiKS53cml0ZShvdXRwdXQpCiAgICBleGNlcHQgSU9FcnJvcixtc2c6CiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCgoKDApkZWYgbWFpbigpOgogICAgdHJ5OgogICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2hWbzonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnaGVscCcsICd2ZXJzaW9uJywgJ291dHB1dC1maWxlPSddKQogICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgogICAgICAgIHVzYWdlKDEsIG1zZykKCiAgICBvdXRmaWxlID0gTm9uZQogICAgIyBwYXJzZSBvcHRpb25zCiAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKICAgICAgICBpZiBvcHQgaW4gKCctaCcsICctLWhlbHAnKToKICAgICAgICAgICAgdXNhZ2UoMCkKICAgICAgICBlbGlmIG9wdCBpbiAoJy1WJywgJy0tdmVyc2lvbicpOgogICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAibXNnZm10LnB5IiwgX192ZXJzaW9uX18KICAgICAgICAgICAgc3lzLmV4aXQoMCkKICAgICAgICBlbGlmIG9wdCBpbiAoJy1vJywgJy0tb3V0cHV0LWZpbGUnKToKICAgICAgICAgICAgb3V0ZmlsZSA9IGFyZwogICAgIyBkbyBpdAogICAgaWYgbm90IGFyZ3M6CiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ05vIGlucHV0IGZpbGUgZ2l2ZW4nCiAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlRyeSBgbXNnZm10IC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgogICAgICAgIHJldHVybgoKICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgogICAgICAgIG1ha2UoZmlsZW5hbWUsIG91dGZpbGUpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQo=