IiBMYW5ndWFnZTogICAgT0NhbWwKIiBNYWludGFpbmVyOiAgRGF2aWQgQmFlbGRlICAgICAgICA8Zmlyc3RuYW1lLm5hbWVAZW5zLWx5b24ub3JnPgoiICAgICAgICAgICAgICBNaWtlIExlYXJ5ICAgICAgICAgIDxsZWFyeUBud2xpbmsuY29tPgoiICAgICAgICAgICAgICBNYXJrdXMgTW90dGwgICAgICAgIDxtYXJrdXMubW90dGxAZ21haWwuY29tPgoiICAgICAgICAgICAgICBQaWVycmUgVml0dGV0ICAgICAgIDxwaWVycmUtdml0dGV0QHB2aXR0ZXQuY29tPgoiICAgICAgICAgICAgICBTdGVmYW5vIFphY2NoaXJvbGkgIDx6YWNrQGJvbm9uaWEuaXQ+CiIgICAgICAgICAgICAgIFZpbmNlbnQgQXJhdmFudGlub3MgPGZpcnN0bmFtZS5uYW1lQGltYWcuZnI+CiIgVVJMOiAgICAgICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mby92aW0vZnRwbHVnaW4vb2NhbWwudmltCiIgTGFzdCBDaGFuZ2U6CiIgICAgICAgICAgICAgIDIwMTIgSmFuIDE1IC0gQnVnZml4IDpyZWxvYWRpbmcgLmFubm90IGZpbGUgZG9lcyBub3QgY2xvc2UKIiAgICAgICAgICAgICAgc3BsaXR0ZWQgdmlldyAoUGllcnJlIFZpdHRldCkKIiAgICAgICAgICAgICAgMjAxMSBOb3YgMjggLSBCdWdmaXggKyBzdXBwb3J0IG9mIG11bHRpcGxlIG1sIGFubm90YXRpb24gZmlsZQoiICAgICAgICAgICAgICAoUGllcnJlIFZpdHRldCkKIiAgICAgICAgICAgICAgMjAxMCBKdWwgMTAgLSBCdWdmaXgsIHRoYW5rcyB0byBQYXQgUm9uZG9uCiIgICAgICAgICAgICAgIDIwMDggSnVsIDE3IC0gQnVnZml4IHJlbGF0ZWQgdG8gZm5hbWVlc2NhcGUgKFZBKQoKaWYgZXhpc3RzKCJiOmRpZF9mdHBsdWdpbiIpCiAgZmluaXNoCmVuZGlmCmxldCBiOmRpZF9mdHBsdWdpbj0xCgoiIHNvbWUgbWFjcm8KaWYgZXhpc3RzKCcqZm5hbWVlc2NhcGUnKQogIGZ1bmN0aW9uISBzOkZuYW1lZXNjYXBlKHMpCiAgICByZXR1cm4gZm5hbWVlc2NhcGUoYTpzKQogIGVuZGZ1bgplbHNlCiAgZnVuY3Rpb24hIHM6Rm5hbWVlc2NhcGUocykKICAgIHJldHVybiBlc2NhcGUoYTpzLCIgXHRcbio/W3tgJFxcJSMnXCJ8ITwiKQogIGVuZGZ1bgplbmRpZgoKIiBFcnJvciBoYW5kbGluZyAtLSBoZWxwcyBtb3Zpbmcgd2hlcmUgdGhlIGNvbXBpbGVyIHdhbnRzIHlvdSB0byBnbwpsZXQgczpjcG9zZXQ9JmNwb3B0aW9ucwpzZXQgY3BvJnZpbQpzZXRsb2NhbCBlZm09CiAgICAgIFwlRUZpbGVcIFwiJWZcIlxcLFwgbGluZVwgJWxcXCxcIGNoYXJhY3RlcnNcICVjLSUqXFxkOiwKICAgICAgXCVFRmlsZVwgXCIlZlwiXFwsXCBsaW5lXCAlbFxcLFwgY2hhcmFjdGVyXCAlYzolbSwKICAgICAgXCUrRVJlZmVyZW5jZVwgdG9cIHVuYm91bmRcIHJlZ2V4cFwgbmFtZVwgJW0sCiAgICAgIFwlRW9jYW1seWFjYzpcIGVcIC1cIGxpbmVcICVsXCBvZlwgXCIlZlwiXFwsXCAlbSwKICAgICAgXCVXb2NhbWx5YWNjOlwgd1wgLVwgJW0sCiAgICAgIFwlLVptYWtlJS4lIywKICAgICAgXCVDJW0sCiAgICAgIFwlRCUqXFxhWyUqXFxkXTpcIEVudGVyaW5nXCBkaXJlY3RvcnlcIGAlZicsCiAgICAgIFwlWCUqXFxhWyUqXFxkXTpcIExlYXZpbmdcIGRpcmVjdG9yeVwgYCVmJywKICAgICAgXCVEJSpcXGE6XCBFbnRlcmluZ1wgZGlyZWN0b3J5XCBgJWYnLAogICAgICBcJVglKlxcYTpcIExlYXZpbmdcIGRpcmVjdG9yeVwgYCVmJywKICAgICAgXCVETWFraW5nXCAlKlxcYVwgaW5cICVmCgoiIEFkZCBtYXBwaW5ncywgdW5sZXNzIHRoZSB1c2VyIGRpZG4ndCB3YW50IHRoaXMuCmlmICFleGlzdHMoIm5vX3BsdWdpbl9tYXBzIikgJiYgIWV4aXN0cygibm9fb2NhbWxfbWFwcyIpCiAgIiAodW4pY29tbWVudGluZwogIGlmICFoYXNtYXB0bygnPFBsdWc+Q29tbWVudCcpCiAgICBubWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5jIDxQbHVnPkxVbmNvbU9uCiAgICB2bWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5jIDxQbHVnPkJVbmNvbU9uCiAgICBubWFwIDxidWZmZXI+IDxMb2NhbExlYWRlcj5DIDxQbHVnPkxVbmNvbU9mZgogICAgdm1hcCA8YnVmZmVyPiA8TG9jYWxMZWFkZXI+QyA8UGx1Zz5CVW5jb21PZmYKICBlbmRpZgoKICBubm9yZW1hcCA8YnVmZmVyPiA8UGx1Zz5MVW5jb21PbiBtejBpKCogPEVTQz4kQSAqKTxFU0M+YHoKICBubm9yZW1hcCA8YnVmZmVyPiA8UGx1Zz5MVW5jb21PZmYgOnMvXihcKiBcKC4qXCkgXCopL1wxLzxDUj46bm9oPENSPgogIHZub3JlbWFwIDxidWZmZXI+IDxQbHVnPkJVbmNvbU9uIDxFU0M+Oic8LCc+PENSPmA8TzxFU0M+MGkoKjxFU0M+YD5vPEVTQz4waSopPEVTQz5gPAogIHZub3JlbWFwIDxidWZmZXI+IDxQbHVnPkJVbmNvbU9mZiA8RVNDPjonPCwnPjxDUj5gPGRkYD5kZGA8CgogIGlmICFoYXNtYXB0bygnPFBsdWc+QWJicmV2JykKICAgIGlhYmJyZXYgPGJ1ZmZlcj4gQVNTIChhc3NlcnQgKDA9MSkgKCogWFhYICopKQogIGVuZGlmCmVuZGlmCgoiIExldCAlIGp1bXAgYmV0d2VlbiBzdHJ1Y3R1cmUgZWxlbWVudHMgKGR1ZSB0byBJc3NhYyBUcm90dHMpCmxldCBiOm13ID0gJycKbGV0IGI6bXcgPSBiOm13IC4gJyxcPGxldFw+Olw8YW5kXD46XChcPGluXD5cfDs7XCknCmxldCBiOm13ID0gYjptdyAuICcsXDxpZlw+Olw8dGhlblw+Olw8ZWxzZVw+JwpsZXQgYjptdyA9IGI6bXcgLiAnLFw8XChmb3JcfHdoaWxlXClcPjpcPGRvXD46XDxkb25lXD4sJwpsZXQgYjptdyA9IGI6bXcgLiAnLFw8XChvYmplY3RcfHNpZ1x8c3RydWN0XHxiZWdpblwpXD46XDxlbmRcPicKbGV0IGI6bXcgPSBiOm13IC4gJyxcPFwobWF0Y2hcfHRyeVwpXD46XDx3aXRoXD4nCmxldCBiOm1hdGNoX3dvcmRzID0gYjptdwoKbGV0IGI6bWF0Y2hfaWdub3JlY2FzZT0wCgoiIHN3aXRjaGluZyBiZXR3ZWVuIGludGVyZmFjZXMgKC5tbGkpIGFuZCBpbXBsZW1lbnRhdGlvbnMgKC5tbCkKaWYgIWV4aXN0cygiZzpkaWRfb2NhbWxfc3dpdGNoIikKICBsZXQgZzpkaWRfb2NhbWxfc3dpdGNoID0gMQogIG1hcCA8TG9jYWxMZWFkZXI+cyA6Y2FsbCBPQ2FtbF9zd2l0Y2goMCk8Q1I+CiAgbWFwIDxMb2NhbExlYWRlcj5TIDpjYWxsIE9DYW1sX3N3aXRjaCgxKTxDUj4KICBmdW4gT0NhbWxfc3dpdGNoKG5ld3dpbikKICAgIGlmIChtYXRjaChidWZuYW1lKCIiKSwgIlxcLm1saSQiKSA+PSAwKQogICAgICBsZXQgZm5hbWUgPSBzOkZuYW1lZXNjYXBlKHN1YnN0aXR1dGUoYnVmbmFtZSgiIiksICJcXC5tbGkkIiwgIi5tbCIsICIiKSkKICAgICAgaWYgKGE6bmV3d2luID09IDEpCiAgICAgICAgZXhlYyAibmV3ICIgLiBmbmFtZQogICAgICBlbHNlCiAgICAgICAgZXhlYyAiYXJnZSAiIC4gZm5hbWUKICAgICAgZW5kaWYKICAgIGVsc2VpZiAobWF0Y2goYnVmbmFtZSgiIiksICJcXC5tbCQiKSA+PSAwKQogICAgICBsZXQgZm5hbWUgPSBzOkZuYW1lZXNjYXBlKGJ1Zm5hbWUoIiIpKSAuICJpIgogICAgICBpZiAoYTpuZXd3aW4gPT0gMSkKICAgICAgICBleGVjICJuZXcgIiAuIGZuYW1lCiAgICAgIGVsc2UKICAgICAgICBleGVjICJhcmdlICIgLiBmbmFtZQogICAgICBlbmRpZgogICAgZW5kaWYKICBlbmRmdW4KZW5kaWYKCiIgRm9sZGluZyBzdXBwb3J0CgoiIEdldCB0aGUgbW9kZWxpbmUgYmVjYXVzZSBmb2xkaW5nIGRlcGVuZHMgb24gaW5kZW50YXRpb24KbGV0IHM6cyA9IGxpbmUyYnl0ZShsaW5lKCcuJykpK2NvbCgnLicpLTEKaWYgc2VhcmNoKCdeXHMqKFwqOm9cP2NhbWw6JykKICBsZXQgczptb2RlbGluZSA9IGdldGxpbmUoIi4iKQplbHNlCiAgbGV0IHM6bW9kZWxpbmUgPSAiIgplbmRpZgppZiBzOnMgPiAwCiAgZXhlICdnb3RvJyBzOnMKZW5kaWYKCiIgR2V0IHRoZSBpbmRlbnRhdGlvbiBwYXJhbXMKbGV0IHM6bSA9IG1hdGNoc3RyKHM6bW9kZWxpbmUsJ2RlZmF1bHRccyo9XHMqXGRcKycpCmlmIHM6bSAhPSAiIgogIGxldCBzOmlkZWYgPSBtYXRjaHN0cihzOm0sJ1xkXCsnKQplbHNlaWYgZXhpc3RzKCJnOm9tbGV0X2luZGVudCIpCiAgbGV0IHM6aWRlZiA9IGc6b21sZXRfaW5kZW50CmVsc2UKICBsZXQgczppZGVmID0gMgplbmRpZgpsZXQgczptID0gbWF0Y2hzdHIoczptb2RlbGluZSwnc3RydWN0XHMqPVxzKlxkXCsnKQppZiBzOm0gIT0gIiIKICBsZXQgczppID0gbWF0Y2hzdHIoczptLCdcZFwrJykKZWxzZWlmIGV4aXN0cygiZzpvbWxldF9pbmRlbnRfc3RydWN0IikKICBsZXQgczppID0gZzpvbWxldF9pbmRlbnRfc3RydWN0CmVsc2UKICBsZXQgczppID0gczppZGVmCmVuZGlmCgoiIFNldCB0aGUgZm9sZGluZyBtZXRob2QKaWYgZXhpc3RzKCJnOm9jYW1sX2ZvbGRpbmciKQogIHNldGxvY2FsIGZvbGRtZXRob2Q9ZXhwcgogIHNldGxvY2FsIGZvbGRleHByPU9NTGV0Rm9sZExldmVsKHY6bG51bSkKZW5kaWYKCiIgLSBPbmx5IGRlZmluaXRpb25zIGJlbG93LCBleGVjdXRlZCBvbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmIGV4aXN0cygiKk9NTGV0Rm9sZExldmVsIikKICBmaW5pc2gKZW5kaWYKCmZ1bmN0aW9uIHM6dG9waW5kZW50KGxudW0pCiAgbGV0IGwgPSBhOmxudW0KICB3aGlsZSBsID4gMAogICAgaWYgZ2V0bGluZShsKSA9fiAnXHMqXCUoXDxzdHJ1Y3RcPlx8XDxzaWdcPlx8XDxvYmplY3RcPlwpJwogICAgICByZXR1cm4gaW5kZW50KGwpCiAgICBlbmRpZgogICAgbGV0IGwgPSBsLTEKICBlbmR3aGlsZQogIHJldHVybiAtczppCmVuZGZ1bmN0aW9uCgpmdW5jdGlvbiBPTUxldEZvbGRMZXZlbChsKQoKICAiIFRoaXMgaXMgZm9yIG5vdCBtZXJnaW5nIGJsYW5rIGxpbmVzIGFyb3VuZCBmb2xkcyB0byB0aGVtCiAgaWYgZ2V0bGluZShhOmwpICF+ICdcUycKICAgIHJldHVybiAtMQogIGVuZGlmCgogICIgV2Ugc3RhcnQgZm9sZHMgZm9yIG1vZHVsZXMsIGNsYXNzZXMsIGFuZCBldmVyeSB0b3BsZXZlbCBkZWZpbml0aW9uCiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqXCUoXDx2YWxcPlx8XDxtb2R1bGVcPlx8XDxjbGFzc1w+XHxcPHR5cGVcPlx8XDxtZXRob2RcPlx8XDxpbml0aWFsaXplclw+XHxcPGluaGVyaXRcPlx8XDxleGNlcHRpb25cPlx8XDxleHRlcm5hbFw+XCknCiAgICBleGUgJ3JldHVybiAiPicgKGluZGVudChhOmwpL3M6aSkrMSAnIicKICBlbmRpZgoKICAiIFRvcGxldmVsIGxldCBhcmUgZGV0ZWN0ZWQgdGhhbmtzIHRvIHRoZSBpbmRlbnRhdGlvbgogIGlmIGdldGxpbmUoYTpsKSA9fiAnXlxzKmxldFw+JyAmJiBpbmRlbnQoYTpsKSA9PSBzOmkrczp0b3BpbmRlbnQoYTpsKQogICAgZXhlICdyZXR1cm4gIj4nIChpbmRlbnQoYTpsKS9zOmkpKzEgJyInCiAgZW5kaWYKCiAgIiBXZSBjbG9zZSBmb2xkIG9uIGVuZCB3aGljaCBhcmUgYXNzb2NpYXRlZCB0byBzdHJ1Y3QsIHNpZyBvciBvYmplY3QuCiAgIiBXZSB1c2Ugc3ludGF4IGluZm9ybWF0aW9uIHRvIGRvIHRoYXQuCiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqZW5kXD4nICYmIHN5bklEYXR0cihzeW5JRChhOmwsIGluZGVudChhOmwpKzEsIDApLCAibmFtZSIpICE9ICJvY2FtbEtleXdvcmQiCiAgICByZXR1cm4gKGluZGVudChhOmwpL3M6aSkrMQogIGVuZGlmCgogICIgRm9sZHMgZW5kIG9uIDs7CiAgaWYgZ2V0bGluZShhOmwpID1+ICdeXHMqOzsnCiAgICBleGUgJ3JldHVybiAiPCcgKGluZGVudChhOmwpL3M6aSkrMSAnIicKICBlbmRpZgoKICAiIENvbW1lbnRzIGFyb3VuZCBmb2xkcyBhcmVuJ3QgbWVyZ2VkIHRvIHRoZW0uCiAgaWYgc3luSURhdHRyKHN5bklEKGE6bCwgaW5kZW50KGE6bCkrMSwgMCksICJuYW1lIikgPT0gIm9jYW1sQ29tbWVudCIKICAgIHJldHVybiAtMQogIGVuZGlmCgogIHJldHVybiAnPScKZW5kZnVuY3Rpb24KCiIgVmltIHN1cHBvcnQgZm9yIE9DYW1sIC5hbm5vdCBmaWxlcwoiCiIgTGFzdCBDaGFuZ2U6IDIwMDcgSnVsIDE3CiIgTWFpbnRhaW5lcjogIFZpbmNlbnQgQXJhdmFudGlub3MgPHZpbmNlbnQuYXJhdmFudGlub3NAZ21haWwuY29tPgoiIExpY2Vuc2U6ICAgICBwdWJsaWMgZG9tYWluCiIKIiBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5ICdvY2FtbC1kdHlwZXMudmltJyBieSBTdGVmYW5vIFphY2NoaXJvbGkuCiIgVGhlIHNvdXJjZSBjb2RlIGlzIHF1aXRlIHJhZGljYWxseSBkaWZmZXJlbnQgZm9yIHdlIG5vdCB1c2UgcHl0aG9uIGFueW1vcmUuCiIgSG93ZXZlciB0aGlzIHBsdWdpbiBzaG91bGQgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBiZWhhdmlvdXIsIHRoYXQncyB3aHkgdGhlCiIgZm9sbG93aW5nIGxpbmVzIGFyZSB0aGUgcXVpdGUgZXhhY3QgY29weSBvZiBTdGVmYW5vJ3Mgb3JpZ2luYWwgcGx1Z2luIDoKIgoiIDw8CiIgRXhlY3V0aW5nIE9jYW1sX3ByaW50X3R5cGUoPG1vZGU+KSBmdW5jdGlvbiB3aWxsIGRpc3BsYXkgaW4gdGhlIFZpbSBib3R0b20KIiBsaW5lKHMpIHRoZSB0eXBlIG9mIGFuIG9jYW1sIHZhbHVlIGdldHRpbmcgaXQgZnJvbSB0aGUgY29ycmVzcG9uZGluZyAuYW5ub3QKIiBmaWxlIChpZiBhbnkpLiAgSWYgVmltIGlzIGluIHZpc3VhbCBtb2RlLCA8bW9kZT4gc2hvdWxkIGJlICJ2aXN1YWwiIGFuZCB0aGUKIiBzZWxlY3RlZCBvY2FtbCB2YWx1ZSBjb3JyZXNwb25kIHRvIHRoZSBoaWdobGlnaHRlZCB0ZXh0LCBvdGhlcndpc2UgKDxtb2RlPgoiIGNhbiBiZSBhbnl0aGluZyBlbHNlKSBpdCBjb3JyZXNwb25kcyB0byB0aGUgbGl0ZXJhbCBmb3VuZCBhdCB0aGUgY3VycmVudAoiIGN1cnNvciBwb3NpdGlvbi4KIgoiIFR5cGluZyAnPExvY2FsTGVhZGVyPnQnIChMb2NhbExlYWRlciBkZWZhdWx0cyB0byAnXCcsIHNlZSA6aCBMb2NhbExlYWRlcikKIiB3aWxsIGNhdXNlICIgT2NhbWxfcHJpbnRfdHlwZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdpdGggdGhlIHJpZ2h0CiIgYXJndW1lbnQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG1vZGUgKHZpc3VhbCBvciBub3QpLgoiID4+CiIKIiBJZiB5b3UgZmluZCBzb21ldGhpbmcgbm90IG1hdGNoaW5nIHRoaXMgYmVoYXZpb3VyLCBwbGVhc2Ugc2lnbmFsIGl0LgoiCiIgRGlmZmVyZW5jZXMgYXJlOgoiICAgLSBubyBuZWVkIGZvciBweXRob24gc3VwcG9ydAoiICAgICArIHBsdXMgOiBtb3JlIHBvcnRhYmxlCiIgICAgICsgbWludXM6IG5vIG1vcmUgbGF6eSBwYXJzaW5nLCBpdCBsb29rcyB2ZXJ5IGZhc3QgaG93ZXZlcgoiCiIgICAtIG9jYW1sYnVpbGQgc3VwcG9ydCwgaWUuCiIgICAgICsgdGhlIHBsdWdpbiBmaW5kcyB0aGUgX2J1aWxkIGRpcmVjdG9yeSBhbmQgbG9va3MgZm9yIHRoZQoiICAgICAgIGNvcnJlc3BvbmRpbmcgZmlsZSBpbnNpZGU7CiIgICAgICsgaWYgdGhlIHVzZXIgZGVjaWRlcyB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIF9idWlsZCBkaXJlY3RvcnkgdGhhbmtzCiIgICAgICAgdG8gdGhlICctYnVpbGQtZGlyJyBvcHRpb24gb2Ygb2NhbWxidWlsZCwgdGhlIHBsdWdpbiB3aWxsIG1hbmFnZSBpbgoiICAgICAgIG1vc3QgY2FzZXMgdG8gZmluZCBpdCBvdXQgKG1vc3QgY2FzZXMgPSBpZiB0aGUgc291cmNlIGZpbGUgaGFzIGEgdW5pcXVlCiIgICAgICAgbmFtZSBhbW9uZyB5b3VyIHdob2xlIHByb2plY3QpOwoiICAgICArIGlmIG9jYW1sYnVpbGQgaXMgbm90IHVzZWQsIHRoZSB1c3VhbCBiZWhhdmlvdXIgaG9sZHM7IGllLiB0aGUgLmFubm90CiIgICAgICAgZmlsZSBzaG91bGQgYmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UgZmlsZTsKIiAgICAgKyBmb3IgdmltIHBsdWdpbiBwcm9ncmFtbWVyczoKIiAgICAgICB0aGUgdmFyaWFibGUgJ2I6X2J1aWxkX2RpcicgY29udGFpbnMgdGhlIGluZmVycmVkIHBhdGggdG8gdGhlIGJ1aWxkCiIgICAgICAgZGlyZWN0b3J5LCBldmVuIGlmIHRoaXMgb25lIGlzIG5vdCBuYW1lZCAnX2J1aWxkJy4KIgoiIEJvbnVzIDoKIiAgIC0gbGF0aW4xIGFjY2VudHMgYXJlIGhhbmRsZWQKIiAgIC0gbGlzdHMgYXJlIGhhbmRsZWQsIGV2ZW4gb24gbXVsdGlwbGUgbGluZXMsIHlvdSBkb24ndCBuZWVkIHRoZSB2aXN1YWwgbW9kZQoiICAgICAodGhlIGN1cnNvciBtdXN0IGJlIG9uIHRoZSBmaXJzdCBicmFja2V0KQoiICAgLSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zLCBhcnJheXMsIGFuZCBzdHJ1Y3R1cmVzIChpZS4gJyguLi4pJywgJ1t8Li4ufF0nLAoiICAgICBhbmQgJ3suLi59JykgYXJlIGhhbmRsZWQgdGhlIHNhbWUgd2F5CgogICIgQ29waWVkIGZyb20gU3RlZmFubydzIG9yaWdpbmFsIHBsdWdpbiA6CiAgIiA8PAogICIgICAgICAuYW5ub3Qgb2NhbWwgZmlsZSByZXByZXNlbnRhdGlvbgogICIKICAiICAgICAgRmlsZSBmb3JtYXQgKGNvcGllZCB2ZXJiYXRpbSBmcm9tIGNhbWwtdHlwZXMuZWwpCiAgIgogICIgICAgICBmaWxlIDo6PSBibG9jayAqCiAgIiAgICAgIGJsb2NrIDo6PSBwb3NpdGlvbiA8U1A+IHBvc2l0aW9uIDxMRj4gYW5ub3RhdGlvbiAqCiAgIiAgICAgIHBvc2l0aW9uIDo6PSBmaWxlbmFtZSA8U1A+IG51bSA8U1A+IG51bSA8U1A+IG51bQogICIgICAgICBhbm5vdGF0aW9uIDo6PSBrZXl3b3JkIG9wZW4tcGFyZW4gPExGPiA8U1A+IDxTUD4gZGF0YSA8TEY+IGNsb3NlLXBhcmVuCiAgIgogICIgICAgICA8U1A+IGlzIGEgc3BhY2UgY2hhcmFjdGVyIChBU0NJSSAweDIwKQogICIgICAgICA8TEY+IGlzIGEgbGluZS1mZWVkIGNoYXJhY3RlciAoQVNDSUkgMHgwQSkKICAiICAgICAgbnVtIGlzIGEgc2VxdWVuY2Ugb2YgZGVjaW1hbCBkaWdpdHMKICAiICAgICAgZmlsZW5hbWUgaXMgYSBzdHJpbmcgd2l0aCB0aGUgbGV4aWNhbCBjb252ZW50aW9ucyBvZiBPJ0NhbWwKICAiICAgICAgb3Blbi1wYXJlbiBpcyBhbiBvcGVuIHBhcmVudGhlc2lzIChBU0NJSSAweDI4KQogICIgICAgICBjbG9zZS1wYXJlbiBpcyBhIGNsb3NlZCBwYXJlbnRoZXNpcyAoQVNDSUkgMHgyOSkKICAiICAgICAgZGF0YSBpcyBhbnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB3aGVyZSA8TEY+IGlzIGFsd2F5cyBmb2xsb3dlZCBieQogICIgICAgICAgICAgIGF0IGxlYXN0IHR3byBzcGFjZSBjaGFyYWN0ZXJzLgogICIKICAiICAgICAgLSBpbiBlYWNoIGJsb2NrLCB0aGUgdHdvIHBvc2l0aW9ucyBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBzdGFydCBhbmQgdGhlCiAgIiAgICAgICAgZW5kIG9mIHRoZSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIGJsb2NrLgogICIgICAgICAtIGluIGEgcG9zaXRpb24sIHRoZSBmaWxlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgdGhlIGZpcnN0IG51bQogICIgICAgICAgIGlzIHRoZSBsaW5lIG51bWJlciwgdGhlIHNlY29uZCBudW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nCiAgIiAgICAgICAgb2YgdGhlIGxpbmUsIHRoZSB0aGlyZCBudW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgcG9zaXRpb24gaXRzZWxmLgogICIgICAgICAtIHRoZSBjaGFyIG51bWJlciB3aXRoaW4gdGhlIGxpbmUgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdGhpcmQKICAiICAgICAgICBhbmQgc2Vjb25kIG51bXMuCiAgIgogICIgICAgICBGb3IgdGhlIG1vbWVudCwgdGhlIG9ubHkgcG9zc2libGUga2V5d29yZCBpcyBcInR5cGVcIi4iCiAgIiA+PgoKCiIgMS4gRmluZGluZyB0aGUgYW5ub3RhdGlvbiBmaWxlIGV2ZW4gaWYgd2UgdXNlIG9jYW1sYnVpbGQKCiAgICAiIEluOiAgdHdvIHN0cmluZ3MgcmVwcmVzZW50aW5nIHBhdGhzCiAgICAiIE91dDogb25lIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbW1vbiBwcmVmaXggYmV0d2VlbiB0aGUgdHdvIHBhdGhzCiAgZnVuY3Rpb24hIHM6RmluZF9jb21tb25fcGF0aCAocDEscDIpCiAgICBsZXQgdGVtcCA9IGE6cDIKICAgIHdoaWxlIG1hdGNoc3RyKGE6cDEsdGVtcCkgPT0gJycKICAgICAgbGV0IHRlbXAgPSBzdWJzdGl0dXRlKHRlbXAsJy9bXi9dKiQnLCcnLCcnKQogICAgZW5kd2hpbGUKICAgIHJldHVybiB0ZW1wCiAgZW5kZnVuCgogICAgIiBBZnRlciBjYWxsOgogICAgIgogICAgIiAgRm9sbG93aW5nIGluZm9ybWF0aW9uIGhhdmUgYmVlbiBwdXQgaW4gczphbm5vdF9maWxlX2xpc3QsIHVzaW5nCiAgICAiICBhbm5vdF9maWxlX25hbWUgbmFtZSBhcyBrZXk6CiAgICAiIC0gYW5ub3RfZmlsZV9wYXRoIDoKICAgICIgICAgICAgICAgICAgICAgICAgICAgIHBhdGggdG8gdGhlIC5hbm5vdCBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAiICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZSAoZGVhbGluZyB3aXRoIG9jYW1sYnVpbGQgc3R1ZmYpCiAgICAiIC0gX2J1aWxkX3BhdGg6CiAgICAiICAgICAgICAgICAgICAgICAgICAgICBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkgZXZlbiBpZiB0aGlzIG9uZSBpcwogICAgIiAgICAgICAgICAgICAgICAgICAgICAgbm90IG5hbWVkICdfYnVpbGQnCiAgICAiIC0gZGF0ZV9vZl9sYXN0IGFubm90OgogICAgIiAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIDAgdW50aWwgd2UgbG9hZCB0aGUgZmlsZS4gSXQgY29udGFpbnMgdGhlCiAgICAiICAgICAgICAgICAgICAgICAgICAgICBkYXRlIGF0IHdoaWNoIHRoZSBmaWxlIGhhcyBiZWVuIGxvYWRlZC4KICBmdW5jdGlvbiEgczpMb2NhdGVfYW5ub3RhdGlvbigpCiAgICBsZXQgYW5ub3RfZmlsZV9uYW1lID0gczpGbmFtZWVzY2FwZShleHBhbmQoJyU6dDpyJykpLicuYW5ub3QnCiAgICBpZiAhZXhpc3RzICgiczphbm5vdF9maWxlX2xpc3RbYW5ub3RfZmlsZV9uYW1lXSIpCiAgICAgIHNpbGVudCBleGUgJ2NkJyBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJTpwOmgnKSkKICAgICAgIiAxc3QgY2FzZSA6IHRoZSBhbm5vdCBmaWxlIGlzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgYnVmZmVyIChubyBvY2FtbGJ1aWxkKQogICAgICBsZXQgYW5ub3RfZmlsZV9wYXRoID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCcuJykKICAgICAgaWYgYW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCA9IGdldGN3ZCgpLicvJy5hbm5vdF9maWxlX3BhdGgKICAgICAgICBsZXQgX2J1aWxkX3BhdGggPSAnJwogICAgICBlbHNlCiAgICAgICAgIiAybmQgY2FzZSA6IHRoZSBidWZmZXIgYW5kIHRoZSBfYnVpbGQgZGlyZWN0b3J5IGFyZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKICAgICAgICAiICAgICAgLi4KICAgICAgICAiICAgICAvICBcCiAgICAgICAgIiAgICAvICAgIFwKICAgICAgICAiIF9idWlsZCAgLm1sCiAgICAgICAgIgogICAgICAgIGxldCBfYnVpbGRfcGF0aCA9IGZpbmRkaXIoJ19idWlsZCcsJy4nKQogICAgICAgIGlmIF9idWlsZF9wYXRoICE9ICcnCiAgICAgICAgICBsZXQgX2J1aWxkX3BhdGggPSBnZXRjd2QoKS4nLycuX2J1aWxkX3BhdGgKICAgICAgICAgIGxldCBhbm5vdF9maWxlX3BhdGggICAgICAgICAgID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLCdfYnVpbGQnKQogICAgICAgICAgaWYgYW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgICAgIGxldCBhbm5vdF9maWxlX3BhdGggPSBnZXRjd2QoKS4nLycuYW5ub3RfZmlsZV9wYXRoCiAgICAgICAgICBlbmRpZgogICAgICAgIGVsc2UKICAgICAgICAgICIgM3JkIGNhc2UgOiB0aGUgX2J1aWxkIGRpcmVjdG9yeSBpcyBpbiBhIGRpcmVjdG9yeSBoaWdoZXIgaW4gdGhlIGZpbGUgaGllcmFyY2h5CiAgICAgICAgICAiICAgICAgICAgICAgKGl0IGNhbid0IGJlIGRlZXBlciBieSBvY2FtbGJ1aWxkIHJlcXVpcmVtZW50cykKICAgICAgICAgICIgICAgICAuLgogICAgICAgICAgIiAgICAgLyAgXAogICAgICAgICAgIiAgICAvICAgIFwKICAgICAgICAgICIgX2J1aWxkICAuLi4KICAgICAgICAgICIgICAgICAgICAgIFwKICAgICAgICAgICIgICAgICAgICAgICBcCiAgICAgICAgICAiICAgICAgICAgICAubWwKICAgICAgICAgICIKICAgICAgICAgIGxldCBfYnVpbGRfcGF0aCA9IGZpbmRkaXIoJ19idWlsZCcsJzsnKQogICAgICAgICAgaWYgX2J1aWxkX3BhdGggIT0gJycKICAgICAgICAgICAgbGV0IHByb2plY3RfcGF0aCAgICAgICAgICAgICAgICA9IHN1YnN0aXR1dGUoX2J1aWxkX3BhdGgsJy9fYnVpbGQkJywnJywnJykKICAgICAgICAgICAgbGV0IHBhdGhfcmVsYXRpdmVfdG9fcHJvamVjdCAgICA9IHM6Rm5hbWVlc2NhcGUoc3Vic3RpdHV0ZShleHBhbmQoJyU6cDpoJykscHJvamVjdF9wYXRoLicvJywnJywnJykpCiAgICAgICAgICAgIGxldCBhbm5vdF9maWxlX3BhdGggICAgICAgICAgID0gZmluZGZpbGUoYW5ub3RfZmlsZV9uYW1lLHByb2plY3RfcGF0aC4nL19idWlsZC8nLnBhdGhfcmVsYXRpdmVfdG9fcHJvamVjdCkKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCA9IGZpbmRmaWxlKGFubm90X2ZpbGVfbmFtZSwnKionKQogICAgICAgICAgICAiNHRoIGNhc2UgOiB3aGF0IGlmIHRoZSB1c2VyIGRlY2lkZWQgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBfYnVpbGQgZGlyZWN0b3J5ID8KICAgICAgICAgICAgIiAgICAgICAgICAgLT4gd2UgcmVsYXggdGhlIGNvbnN0cmFpbnRzLCBpdCBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzCiAgICAgICAgICAgIGlmIGFubm90X2ZpbGVfcGF0aCAhPSAnJwogICAgICAgICAgICAgICIgNGEuIHdlIHN1cHBvc2UgdGhlIHJlbmFtZWQgX2J1aWxkIGRpcmVjdG9yeSBpcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKICAgICAgICAgICAgICBsZXQgX2J1aWxkX3BhdGggPSBtYXRjaHN0cihhbm5vdF9maWxlX3BhdGgsJ15bXi9dKicpCiAgICAgICAgICAgICAgaWYgYW5ub3RfZmlsZV9wYXRoICE9ICcnCiAgICAgICAgICAgICAgICBsZXQgYW5ub3RfZmlsZV9wYXRoID0gZ2V0Y3dkKCkuJy8nLmFubm90X2ZpbGVfcGF0aAogICAgICAgICAgICAgICAgbGV0IF9idWlsZF9wYXRoICAgICA9IGdldGN3ZCgpLicvJy5fYnVpbGRfcGF0aAogICAgICAgICAgICAgIGVuZGlmCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBsZXQgYW5ub3RfZmlsZV9uYW1lID0gJycKICAgICAgICAgICAgICAiKFBpZXJyZSBWaXR0ZXQ6IEkgaGF2ZSBjb21tZW50ZWQgNGIgYmVjYXVzZSB0aGlzIHdhcyBjaHJhc2hpbmcKICAgICAgICAgICAgICAibXkgdmltIChpdCBwcm9kdWNlZCBpbmZpbml0ZSBsb29wKSkKICAgICAgICAgICAgICAiCiAgICAgICAgICAgICAgIiA0Yi4gYW5hcmNoeSA6IHRoZSByZW5hbWVkIF9idWlsZCBkaXJlY3RvcnkgbWF5IGJlIGhpZ2hlciBpbiB0aGUgaGllcmFyY2h5CiAgICAgICAgICAgICAgIiB0aGlzIHdpbGwgd29yayBpZiB0aGUgZmlsZSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgYW5ub3RhdGlvbnMgaGFzIGEgdW5pcXVlIG5hbWUgaW4gdGhlIHdob2xlIHByb2plY3QKICAgICAgICAgICAgICAiIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBpdCBtYXkgc3RpbGwgd29yaywgYnV0IG5vIHdhcnJhbnR5IGhlcmUKICAgICAgICAgICAgICAibGV0IGFubm90X2ZpbGVfcGF0aCA9IGZpbmRmaWxlKGFubm90X2ZpbGVfbmFtZSwnKio7JykKICAgICAgICAgICAgICAibGV0IHByb2plY3RfcGF0aCAgICAgID0gczpGaW5kX2NvbW1vbl9wYXRoKGFubm90X2ZpbGVfcGF0aCxleHBhbmQoJyU6cDpoJykpCiAgICAgICAgICAgICAgImxldCBfYnVpbGRfcGF0aCAgICAgICA9IG1hdGNoc3RyKGFubm90X2ZpbGVfcGF0aCxwcm9qZWN0X3BhdGguJy9bXi9dKicpCiAgICAgICAgICAgIGVuZGlmCiAgICAgICAgICBlbmRpZgogICAgICAgIGVuZGlmCiAgICAgIGVuZGlmCgogICAgICBpZiBhbm5vdF9maWxlX3BhdGggPT0gJycKICAgICAgICB0aHJvdyAnRTQ4NDogbm8gYW5ub3RhdGlvbiBmaWxlIGZvdW5kJwogICAgICBlbmRpZgoKICAgICAgc2lsZW50IGV4ZSAnY2QnICctJwogICAgICBsZXQgczphbm5vdF9maWxlX2xpc3RbYW5ub3RfZmlsZV9uYW1lXT0gW2Fubm90X2ZpbGVfcGF0aCwgX2J1aWxkX3BhdGgsIDBdCiAgICBlbmRpZgogIGVuZGZ1bgoKICAiIFRoaXMgdmFyaWFibGUgY29udGFpbiBhIGRpY3Rpb25uYXJ5IG9mIGxpc3QuIEVhY2ggZWxlbWVudCBvZiB0aGUgZGljdGlvbm5hcnkKICAiIHJlcHJlc2VudCBhbiBhbm5vdGF0aW9uIHN5c3RlbS4gQW4gYW5ub3RhdGlvbiBzeXN0ZW0gaXMgYSBsaXN0IHdpdGggOgogICIgLSBhbm5vdGF0aW9uIGZpbGUgbmFtZSBhcyBpdCdzIGtleQogICIgLSBhbm5vdGF0aW9uIGZpbGUgcGF0aCBhcyBmaXJzdCBlbGVtZW50IG9mIHRoZSBjb250YWluZWQgbGlzdAogICIgLSBidWlsZCBwYXRoIGFzIHNlY29uZCBlbGVtZW50IG9mIHRoZSBjb250YWluZWQgbGlzdAogICIgLSBhbm5vdF9maWxlX2xhc3RfbW9kIChjb250YWluIHRoZSBkYXRlIG9mIC5hbm5vdCBmaWxlKSBhcyB0aGlyZCBlbGVtZW50CiAgbGV0IHM6YW5ub3RfZmlsZV9saXN0ID0ge30KCiIgMi4gRmluZGluZyB0aGUgdHlwZSBpbmZvcm1hdGlvbiBpbiB0aGUgYW5ub3RhdGlvbiBmaWxlCgogICIgYS4gVGhlIGFubm90YXRpb24gZmlsZSBpcyBvcGVuZWQgaW4gdmltIGFzIGEgYnVmZmVyIHRoYXQKICAiIHNob3VsZCBiZSAoYWxtb3N0KSBpbnZpc2libGUgdG8gdGhlIHVzZXIuCgogICAgICAiIEFmdGVyIGNhbGw6CiAgICAgICIgVGhlIGN1cnJlbnQgYnVmZmVyIGlzIG5vdyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIC5hbm5vdCBmaWxlLgogICAgICAiIFdlIG1hbmFnZSB0byBrZWVwIGFsbCB0aGlzIGhpZGRlbiB0byB0aGUgdXNlcidzIGV5ZS4KICAgIGZ1bmN0aW9uISBzOkVudGVyX2Fubm90YXRpb25fYnVmZmVyKGFubm90X2ZpbGVfcGF0aCkKICAgICAgbGV0IHM6Y3VycmVudF9wb3MgPSBnZXRwb3MoJy4nKQogICAgICBsZXQgczpjdXJyZW50X2hpZGRlbiA9ICZsOmhpZGRlbgogICAgICBzZXQgaGlkZGVuCiAgICAgIGxldCBzOmN1cnJlbnRfYnVmID0gYnVmbmFtZSgnJScpCiAgICAgIGlmIGJ1ZmxvYWRlZChhOmFubm90X2ZpbGVfcGF0aCkKICAgICAgICBzaWxlbnQgZXhlICdrZWVwaiBrZWVwYWx0JyAnYnVmZmVyJyBzOkZuYW1lZXNjYXBlKGE6YW5ub3RfZmlsZV9wYXRoKQogICAgICBlbHNlCiAgICAgICAgc2lsZW50IGV4ZSAna2VlcGoga2VlcGFsdCcgJ3ZpZXcnIHM6Rm5hbWVlc2NhcGUoYTphbm5vdF9maWxlX3BhdGgpCiAgICAgIGVuZGlmCiAgICAgIGNhbGwgc2V0cG9zKCIuIiwgWzAsIDAgLCAwICwgMF0pCiAgICBlbmRmdW4KCiAgICAgICIgQWZ0ZXIgY2FsbDoKICAgICAgIiAgIFRoZSBvcmlnaW5hbCBidWZmZXIgaGFzIGJlZW4gcmVzdG9yZWQgaW4gdGhlIGV4YWN0IHNhbWUgc3RhdGUgYXMgYmVmb3JlLgogICAgZnVuY3Rpb24hIHM6RXhpdF9hbm5vdGF0aW9uX2J1ZmZlcigpCiAgICAgIHNpbGVudCBleGUgJ2tlZXBqIGtlZXBhbHQnICdidWZmZXInIHM6Rm5hbWVlc2NhcGUoczpjdXJyZW50X2J1ZikKICAgICAgbGV0ICZsOmhpZGRlbiA9IHM6Y3VycmVudF9oaWRkZW4KICAgICAgY2FsbCBzZXRwb3MoJy4nLHM6Y3VycmVudF9wb3MpCiAgICBlbmRmdW4KCiAgICAgICIgQWZ0ZXIgY2FsbDoKICAgICAgIiAgIFRoZSBhbm5vdCBmaWxlIGlzIGxvYWRlZCBhbmQgYXNzaWduZWQgdG8gYSBidWZmZXIuCiAgICAgICIgICBUaGlzIGFsc28gaGFuZGxlcyB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIC5hbm5vdCBmaWxlLCBlZy4gYWZ0ZXIgYQogICAgICAiICAgY29tcGlsYXRpb24gKHJldHVybiBhbiB1cGRhdGVkIGFubm90X2ZpbGVfbGlzdCkuCiAgICBmdW5jdGlvbiEgczpMb2FkX2Fubm90YXRpb24oYW5ub3RfZmlsZV9uYW1lKQogICAgICBsZXQgYW5ub3QgPSBzOmFubm90X2ZpbGVfbGlzdFthOmFubm90X2ZpbGVfbmFtZV0KICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCA9IGFubm90WzBdCiAgICAgIGxldCBhbm5vdF9maWxlX2xhc3RfbW9kID0gMAogICAgICBpZiBleGlzdHMoImFubm90WzJdIikKICAgICAgICBsZXQgYW5ub3RfZmlsZV9sYXN0X21vZCA9IGFubm90WzJdCiAgICAgIGVuZGlmCiAgICAgIGlmIGJ1ZmxvYWRlZChhbm5vdF9maWxlX3BhdGgpICYmIGFubm90X2ZpbGVfbGFzdF9tb2QgPCBnZXRmdGltZShhbm5vdF9maWxlX3BhdGgpCiAgICAgICAgIiBpZiB0aGVyZSBpcyBhIG1vcmUgcmVjZW50IGZpbGUKICAgICAgICBsZXQgbnIgPSBidWZucihhbm5vdF9maWxlX3BhdGgpCiAgICAgICAgc2lsZW50IGV4ZSAna2VlcGoga2VlcGFsdCcgJ2J1bmxvYWQnIG5yCiAgICAgIGVuZGlmCiAgICAgIGlmICFidWZsb2FkZWQoYW5ub3RfZmlsZV9wYXRoKQogICAgICAgIGNhbGwgczpFbnRlcl9hbm5vdGF0aW9uX2J1ZmZlcihhbm5vdF9maWxlX3BhdGgpCiAgICAgICAgc2V0bG9jYWwgbm9idWZsaXN0ZWQKICAgICAgICBzZXRsb2NhbCBidWZoaWRkZW49aGlkZQogICAgICAgIHNldGxvY2FsIG5vc3dhcGZpbGUKICAgICAgICBzZXRsb2NhbCBidWZ0eXBlPW5vd3JpdGUKICAgICAgICBjYWxsIHM6RXhpdF9hbm5vdGF0aW9uX2J1ZmZlcigpCiAgICAgICAgbGV0IGFubm90WzJdID0gZ2V0ZnRpbWUoYW5ub3RfZmlsZV9wYXRoKQogICAgICAgICIgTGlzdCB1cGRhdGVkIHdpdGggdGhlIG5ldyBkYXRlCiAgICAgICAgbGV0IHM6YW5ub3RfZmlsZV9saXN0W2E6YW5ub3RfZmlsZV9uYW1lXSA9IGFubm90CiAgICAgIGVuZGlmCiAgICBlbmRmdW4KCiAgImIuICdzZWFyY2gnIGFuZCAnbWF0Y2gnIHdvcmsgdG8gZmluZCB0aGUgdHlwZSBpbmZvcm1hdGlvbgoKICAgICAgIkluOiAgLSBsaW4xLGNvbDE6IHBvc3Rpb24gb2YgZXhwcmVzc2lvbiBmaXJzdCBjaGFyCiAgICAgICIgICAgIC0gbGluMixjb2wyOiBwb3N0aW9uIG9mIGV4cHJlc3Npb24gbGFzdCBjaGFyCiAgICAgICJPdXQ6IC0gdGhlIHBhdHRlcm4gdG8gYmUgbG9va2VkIGZvciB0byBmaW5kIHRoZSBibG9jawogICAgICAiIE11c3QgYmUgY2FsbGVkIGluIHRoZSBzb3VyY2UgYnVmZmVyICh1c2Ugb2YgbGluZTJieXRlKQogICAgZnVuY3Rpb24hIHM6QmxvY2tfcGF0dGVybihsaW4xLGxpbjIsY29sMSxjb2wyKQogICAgICBsZXQgc3RhcnRfbnVtMSA9IGE6bGluMQogICAgICBsZXQgc3RhcnRfbnVtMiA9IGxpbmUyYnl0ZShhOmxpbjEpIC0gMQogICAgICBsZXQgc3RhcnRfbnVtMyA9IHN0YXJ0X251bTIgKyBhOmNvbDEKICAgICAgbGV0IHBhdGggICAgICAgPSAnIlwoXFwiXHxbXiJdXClcKyInCiAgICAgIGxldCBzdGFydF9wb3MgID0gcGF0aC4nICcuc3RhcnRfbnVtMS4nICcuc3RhcnRfbnVtMi4nICcuc3RhcnRfbnVtMwogICAgICBsZXQgZW5kX251bTEgICA9IGE6bGluMgogICAgICBsZXQgZW5kX251bTIgICA9IGxpbmUyYnl0ZShhOmxpbjIpIC0gMQogICAgICBsZXQgZW5kX251bTMgICA9IGVuZF9udW0yICsgYTpjb2wyCiAgICAgIGxldCBlbmRfcG9zICAgID0gcGF0aC4nICcuZW5kX251bTEuJyAnLmVuZF9udW0yLicgJy5lbmRfbnVtMwogICAgICByZXR1cm4gJ14nLnN0YXJ0X3Bvcy4nICcuZW5kX3Bvcy4iJCIKICAgICAgIiBycTogdGhlICdeJyBoZXJlIGlzIG5vdCB0b3RhbGx5IGNvcnJlY3QgcmVnYXJkaW5nIHRoZSBhbm5vdCBmaWxlICJncmFtbWFyIgogICAgICAiIGJ1dCBjdXJyZW50bHkgdGhlIGFubm90YXRpb24gZmlsZSByZXNwZWN0cyB0aGlzLCBhbmQgaXQncyBhIGxpdHRsZSBiaXQgZmFzdGVyIHdpdGggdGhlICdeJzsKICAgICAgIiBjYW4gYmUgcmVtb3ZlZCBzYWZlbHkuCiAgICBlbmRmdW4KCiAgICAgICJJbjogKHRoZSBjdXJzb3IgcG9zaXRpb24gc2hvdWxkIGJlIGF0IHRoZSBzdGFydCBvZiBhbiBhbm5vdGF0aW9uKQogICAgICAiT3V0OiB0aGUgdHlwZSBpbmZvcm1hdGlvbgogICAgICAiIE11c3QgYmUgY2FsbGVkIGluIHRoZSBhbm5vdGF0aW9uIGJ1ZmZlciAodXNlIG9mIHNlYXJjaCkKICAgIGZ1bmN0aW9uISBzOk1hdGNoX2RhdGEoKQogICAgICAiIHJxOiBpZGVtIGFzIHByZXZpb3VzbHksIGluIHRoZSBmb2xsb3dpbmcsIHRoZSAnXicgYXQgc3RhcnQgb2YgcGF0dGVybnMgaXMgbm90IG5lY2Vzc2FyeQogICAgICBrZWVwaiB3aGlsZSBzZWFyY2goJ150eXBlKCQnLCdjZScsbGluZSgiLiIpKSA9PSAwCiAgICAgICAga2VlcGogaWYgc2VhcmNoKCdeLlx7LX0oJCcsJ2UnKSA9PSAwCiAgICAgICAgICB0aHJvdyAibm9fYW5ub3RhdGlvbiIKICAgICAgICBlbmRpZgogICAgICAgIGtlZXBqIGlmIHNlYXJjaHBhaXIoJygnLCcnLCcpJykgPT0gMAogICAgICAgICAgdGhyb3cgIm1hbGZvcm1lZF9hbm5vdF9maWxlIgogICAgICAgIGVuZGlmCiAgICAgIGVuZHdoaWxlCiAgICAgIGxldCBiZWdpbiA9IGxpbmUoIi4iKSArIDEKICAgICAga2VlcGogaWYgc2VhcmNocGFpcignKCcsJycsJyknKSA9PSAwCiAgICAgICAgdGhyb3cgIm1hbGZvcm1lZF9hbm5vdF9maWxlIgogICAgICBlbmRpZgogICAgICBsZXQgZW5kID0gbGluZSgiLiIpIC0gMQogICAgICByZXR1cm4gam9pbihnZXRsaW5lKGJlZ2luLGVuZCksIlxuIikKICAgIGVuZGZ1bgoKICAgICAgIkluOiAgdGhlIHBhdHRlcm4gdG8gbG9vayBmb3IgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGJsb2NrCiAgICAgICJPdXQ6IHRoZSB0eXBlIGluZm9ybWF0aW9uIChjYWxscyBzOk1hdGNoX2RhdGEpCiAgICAgICIgU2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgYW5ub3RhdGlvbiBidWZmZXIKICAgIGZ1bmN0aW9uISBzOkV4dHJhY3RfdHlwZV9kYXRhKGJsb2NrX3BhdHRlcm4sIGFubm90X2ZpbGVfbmFtZSkKICAgICAgbGV0IGFubm90X2ZpbGVfcGF0aCA9IHM6YW5ub3RfZmlsZV9saXN0W2E6YW5ub3RfZmlsZV9uYW1lXVswXQogICAgICBjYWxsIHM6RW50ZXJfYW5ub3RhdGlvbl9idWZmZXIoYW5ub3RfZmlsZV9wYXRoKQogICAgICB0cnkKICAgICAgICBpZiBzZWFyY2goYTpibG9ja19wYXR0ZXJuLCdlJykgPT0gMAogICAgICAgICAgdGhyb3cgIm5vX2Fubm90YXRpb24iCiAgICAgICAgZW5kaWYKICAgICAgICBjYWxsIGN1cnNvcihsaW5lKCIuIikgKyAxLDEpCiAgICAgICAgbGV0IGFubm90YXRpb24gPSBzOk1hdGNoX2RhdGEoKQogICAgICBmaW5hbGx5CiAgICAgICAgY2FsbCBzOkV4aXRfYW5ub3RhdGlvbl9idWZmZXIoKQogICAgICBlbmR0cnkKICAgICAgcmV0dXJuIGFubm90YXRpb24KICAgIGVuZGZ1bgoKICAiYy4gbGluayB0aGlzIHN0dWZmIHdpdGggd2hhdCB0aGUgdXNlciB3YW50cwogICIgaWUuIGdldCB0aGUgZXhwcmVzc2lvbiBzZWxlY3RlZC91bmRlciB0aGUgY3Vyc29yCgogICAgbGV0IHM6b2NhbWxfd29yZF9jaGFyID0gJ1x3fFvALf9dfCcnJwoKICAgICAgIkluOiAgdGhlIGN1cnJlbnQgbW9kZSAoZWcuICJ2aXN1YWwiLCAibm9ybWFsIiwgZXRjLikKICAgICAgIk91dDogdGhlIGJvcmRlcnMgb2YgdGhlIGV4cHJlc3Npb24gd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSB0eXBlCiAgICBmdW5jdGlvbiEgczpNYXRjaF9ib3JkZXJzKG1vZGUpCiAgICAgIGlmIGE6bW9kZSA9PSAidmlzdWFsIgogICAgICAgIGxldCBjdXIgPSBnZXRwb3MoIi4iKQogICAgICAgIG5vcm1hbCBgPAogICAgICAgIGxldCBjb2wxID0gY29sKCIuIikKICAgICAgICBsZXQgbGluMSA9IGxpbmUoIi4iKQogICAgICAgIG5vcm1hbCBgPgogICAgICAgIGxldCBjb2wyID0gY29sKCIuIikKICAgICAgICBsZXQgbGluMiA9IGxpbmUoIi4iKQogICAgICAgIGNhbGwgY3Vyc29yKGN1clsxXSxjdXJbMl0pCiAgICAgICAgcmV0dXJuIFtsaW4xLGxpbjIsY29sMS0xLGNvbDJdCiAgICAgIGVsc2UKICAgICAgICBsZXQgY3Vyc29yX2xpbmUgPSBsaW5lKCIuIikKICAgICAgICBsZXQgY3Vyc29yX2NvbCAgPSBjb2woIi4iKQogICAgICAgIGxldCBsaW5lID0gZ2V0bGluZSgnLicpCiAgICAgICAgaWYgbGluZVtjdXJzb3JfY29sLTE6Y3Vyc29yX2NvbF0gPT0gJ1t8JwogICAgICAgICAgbGV0IFtsaW4yLGNvbDJdID0gc2VhcmNocGFpcnBvcygnXFt8JywnJywnfFxdJywnbicpCiAgICAgICAgICByZXR1cm4gW2N1cnNvcl9saW5lLGxpbjIsY3Vyc29yX2NvbC0xLGNvbDIrMV0KICAgICAgICBlbHNlaWYgICAgIGxpbmVbY3Vyc29yX2NvbC0xXSA9PSAnWycKICAgICAgICAgIGxldCBbbGluMixjb2wyXSA9IHNlYXJjaHBhaXJwb3MoJ1xbJywnJywnXF0nLCduJykKICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMl0KICAgICAgICBlbHNlaWYgbGluZVtjdXJzb3JfY29sLTFdID09ICcoJwogICAgICAgICAgbGV0IFtsaW4yLGNvbDJdID0gc2VhcmNocGFpcnBvcygnKCcsJycsJyknLCduJykKICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMl0KICAgICAgICBlbHNlaWYgbGluZVtjdXJzb3JfY29sLTFdID09ICd7JwogICAgICAgICAgbGV0IFtsaW4yLGNvbDJdID0gc2VhcmNocGFpcnBvcygneycsJycsJ30nLCduJykKICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsbGluMixjdXJzb3JfY29sLTEsY29sMl0KICAgICAgICBlbHNlCiAgICAgICAgICBsZXQgW2xpbjEsY29sMV0gPSBzZWFyY2hwb3MoJ1x2JSgnLnM6b2NhbWxfd29yZF9jaGFyLid8XC4pKicsJ25jYicpCiAgICAgICAgICBsZXQgW2xpbjIsY29sMl0gPSBzZWFyY2hwb3MoJ1x2JSgnLnM6b2NhbWxfd29yZF9jaGFyLid8XC4pKicsJ25jZScpCiAgICAgICAgICBpZiBjb2wxID09IDAgfHwgY29sMiA9PSAwCiAgICAgICAgICAgIHRocm93ICJub19leHByZXNzaW9uIgogICAgICAgICAgZW5kaWYKICAgICAgICAgIHJldHVybiBbY3Vyc29yX2xpbmUsY3Vyc29yX2xpbmUsY29sMS0xLGNvbDJdCiAgICAgICAgZW5kaWYKICAgICAgZW5kaWYKICAgIGVuZGZ1bgoKICAgICAgIkluOiAgdGhlIGN1cnJlbnQgbW9kZSAoZWcuICJ2aXN1YWwiLCAibm9ybWFsIiwgZXRjLikKICAgICAgIk91dDogdGhlIHR5cGUgaW5mb3JtYXRpb24gKGNhbGxzIHM6RXh0cmFjdF90eXBlX2RhdGEpCiAgICBmdW5jdGlvbiEgczpHZXRfdHlwZShtb2RlLCBhbm5vdF9maWxlX25hbWUpCiAgICAgIGxldCBbbGluMSxsaW4yLGNvbDEsY29sMl0gPSBzOk1hdGNoX2JvcmRlcnMoYTptb2RlKQogICAgICByZXR1cm4gczpFeHRyYWN0X3R5cGVfZGF0YShzOkJsb2NrX3BhdHRlcm4obGluMSxsaW4yLGNvbDEsY29sMiksIGE6YW5ub3RfZmlsZV9uYW1lKQogICAgZW5kZnVuCgogICJkLiBtYWluCiAgICAgICJJbjogICAgICAgICB0aGUgY3VycmVudCBtb2RlIChlZy4gInZpc3VhbCIsICJub3JtYWwiLCBldGMuKQogICAgICAiQWZ0ZXIgY2FsbDogdGhlIHR5cGUgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkCiAgICBpZiAhZXhpc3RzKCIqT2NhbWxfZ2V0X3R5cGUiKQogICAgICBmdW5jdGlvbiBPY2FtbF9nZXRfdHlwZShtb2RlKQogICAgICAgIGxldCBhbm5vdF9maWxlX25hbWUgPSBzOkZuYW1lZXNjYXBlKGV4cGFuZCgnJTp0OnInKSkuJy5hbm5vdCcKICAgICAgICBjYWxsIHM6TG9jYXRlX2Fubm90YXRpb24oKQogICAgICAgIGNhbGwgczpMb2FkX2Fubm90YXRpb24oYW5ub3RfZmlsZV9uYW1lKQogICAgICAgIHJldHVybiBzOkdldF90eXBlKGE6bW9kZSwgYW5ub3RfZmlsZV9uYW1lKQogICAgICBlbmRmdW4KICAgIGVuZGlmCgogICAgaWYgIWV4aXN0cygiKk9jYW1sX2dldF90eXBlX29yX25vdCIpCiAgICAgIGZ1bmN0aW9uIE9jYW1sX2dldF90eXBlX29yX25vdChtb2RlKQogICAgICAgIGxldCB0PXJlbHRpbWUoKQogICAgICAgIHRyeQogICAgICAgICAgcmV0dXJuIE9jYW1sX2dldF90eXBlKGE6bW9kZSkKICAgICAgICBjYXRjaAogICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgZW5kdHJ5CiAgICAgIGVuZGZ1bgogICAgZW5kaWYKCiAgICBpZiAhZXhpc3RzKCIqT2NhbWxfcHJpbnRfdHlwZSIpCiAgICAgIGZ1bmN0aW9uIE9jYW1sX3ByaW50X3R5cGUobW9kZSkKICAgICAgICBpZiBleHBhbmQoIiU6ZSIpID09ICJtbGkiCiAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJObyBhbm5vdGF0aW9ucyBmb3IgaW50ZXJmYWNlICgubWxpKSBmaWxlcyIgfCBlY2hvaGwgTm9uZQogICAgICAgICAgcmV0dXJuCiAgICAgICAgZW5kaWYKICAgICAgICB0cnkKICAgICAgICAgIGVjaG8gT2NhbWxfZ2V0X3R5cGUoYTptb2RlKQogICAgICAgIGNhdGNoIC9FNDg0Oi8KICAgICAgICAgIGVjaG9obCBFcnJvck1zZyB8IGVjaG8gIk5vIHR5cGUgYW5ub3RhdGlvbnMgKC5hbm5vdCkgZmlsZSBmb3VuZCIgfCBlY2hvaGwgTm9uZQogICAgICAgIGNhdGNoIC9ub19leHByZXNzaW9uLwogICAgICAgICAgZWNob2hsIEVycm9yTXNnIHwgZWNobyAiTm8gZXhwcmVzc2lvbiBmb3VuZCB1bmRlciB0aGUgY3Vyc29yIiB8IGVjaG9obCBOb25lCiAgICAgICAgY2F0Y2ggL25vX2Fubm90YXRpb24vCiAgICAgICAgICBlY2hvaGwgRXJyb3JNc2cgfCBlY2hvICJObyB0eXBlIGFubm90YXRpb24gZm91bmQgZm9yIHRoZSBnaXZlbiB0ZXh0IiB8IGVjaG9obCBOb25lCiAgICAgICAgY2F0Y2ggL21hbGZvcm1lZF9hbm5vdF9maWxlLwogICAgICAgICAgZWNob2hsIEVycm9yTXNnIHwgZWNobyAiTWFsZm9ybWVkIC5hbm5vdCBmaWxlIiB8IGVjaG9obCBOb25lCiAgICAgICAgZW5kdHJ5CiAgICAgIGVuZGZ1bgogICAgZW5kaWYKCiIgTWFwcwogIG1hcCAgPHNpbGVudD4gPExvY2FsTGVhZGVyPnQgOmNhbGwgT2NhbWxfcHJpbnRfdHlwZSgibm9ybWFsIik8Q1I+CiAgdm1hcCA8c2lsZW50PiA8TG9jYWxMZWFkZXI+dCA6PEMtVT5jYWxsIE9jYW1sX3ByaW50X3R5cGUoInZpc3VhbCIpPENSPmA8CgpsZXQgJmNwb3B0aW9ucz1zOmNwb3NldAp1bmxldCBzOmNwb3NldAoKIiB2aW06c3c9MiBmZG09aW5kZW50Cg==