KmV2YWwudHh0KglGb3IgVmltIHZlcnNpb24gNy40LiAgTGFzdCBjaGFuZ2U6IDIwMTYgRmViIDA3CgoKCQkgIFZJTSBSRUZFUkVOQ0UgTUFOVUFMCSAgYnkgQnJhbSBNb29sZW5hYXIKCgpFeHByZXNzaW9uIGV2YWx1YXRpb24JCQkqZXhwcmVzc2lvbiogKmV4cHIqICpFMTUqICpldmFsKgoKVXNpbmcgZXhwcmVzc2lvbnMgaXMgaW50cm9kdWNlZCBpbiBjaGFwdGVyIDQxIG9mIHRoZSB1c2VyIG1hbnVhbCB8dXNyXzQxLnR4dHwuCgpOb3RlOiBFeHByZXNzaW9uIGV2YWx1YXRpb24gY2FuIGJlIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZS4gIElmIHRoaXMgaGFzIGJlZW4KZG9uZSwgdGhlIGZlYXR1cmVzIGluIHRoaXMgZG9jdW1lbnQgYXJlIG5vdCBhdmFpbGFibGUuCVNlZSB8K2V2YWx8IGFuZAp8bm8tZXZhbC1mZWF0dXJlfC4KCjEuICBWYXJpYWJsZXMJCQl8dmFyaWFibGVzfAogICAgMS4xIFZhcmlhYmxlIHR5cGVzCiAgICAxLjIgRnVuY3Rpb24gcmVmZXJlbmNlcwkJfEZ1bmNyZWZ8CiAgICAxLjMgTGlzdHMJCQkJfExpc3RzfAogICAgMS40IERpY3Rpb25hcmllcwkJCXxEaWN0aW9uYXJpZXN8CiAgICAxLjUgTW9yZSBhYm91dCB2YXJpYWJsZXMJCXxtb3JlLXZhcmlhYmxlc3wKMi4gIEV4cHJlc3Npb24gc3ludGF4CQl8ZXhwcmVzc2lvbi1zeW50YXh8CjMuICBJbnRlcm5hbCB2YXJpYWJsZQkJfGludGVybmFsLXZhcmlhYmxlc3wKNC4gIEJ1aWx0aW4gRnVuY3Rpb25zCQl8ZnVuY3Rpb25zfAo1LiAgRGVmaW5pbmcgZnVuY3Rpb25zCQl8dXNlci1mdW5jdGlvbnN8CjYuICBDdXJseSBicmFjZXMgbmFtZXMJCXxjdXJseS1icmFjZXMtbmFtZXN8CjcuICBDb21tYW5kcwkJCXxleHByZXNzaW9uLWNvbW1hbmRzfAo4LiAgRXhjZXB0aW9uIGhhbmRsaW5nCQl8ZXhjZXB0aW9uLWhhbmRsaW5nfAo5LiAgRXhhbXBsZXMJCQl8ZXZhbC1leGFtcGxlc3wKMTAuIE5vICtldmFsIGZlYXR1cmUJCXxuby1ldmFsLWZlYXR1cmV8CjExLiBUaGUgc2FuZGJveAkJCXxldmFsLXNhbmRib3h8CjEyLiBUZXh0bG9jawkJCXx0ZXh0bG9ja3wKCntWaSBkb2VzIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBjb21tYW5kc30KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBWYXJpYWJsZXMJCQkJCQkqdmFyaWFibGVzKgoKMS4xIFZhcmlhYmxlIHR5cGVzIH4KCQkJCQkJCSpFNzEyKgpUaGVyZSBhcmUgZWlnaHQgdHlwZXMgb2YgdmFyaWFibGVzOgoKTnVtYmVyCQlBIDMyIG9yIDY0IGJpdCBzaWduZWQgbnVtYmVyLiAgfGV4cHItbnVtYmVyfCAqTnVtYmVyKgoJCUV4YW1wbGVzOiAgLTEyMyAgMHgxMCAgMDE3NwoKRmxvYXQJCUEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiB8ZmxvYXRpbmctcG9pbnQtZm9ybWF0fCAqRmxvYXQqCgkJe29ubHkgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoJCUV4YW1wbGVzOiAxMjMuNDU2ICAxLjE1ZS02ICAtMS4xZTMKClN0cmluZwkJQSBOVUwgdGVybWluYXRlZCBzdHJpbmcgb2YgOC1iaXQgdW5zaWduZWQgY2hhcmFjdGVycyAoYnl0ZXMpLgoJCXxleHByLXN0cmluZ3wgRXhhbXBsZXM6ICJhYlx0eHhcIi0tIiAgJ3gteicnYSxjJwoKTGlzdAkJQW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiBpdGVtcyB8TGlzdHwuCgkJRXhhbXBsZTogWzEsIDIsIFsnYScsICdiJ11dCgpEaWN0aW9uYXJ5CUFuIGFzc29jaWF0aXZlLCB1bm9yZGVyZWQgYXJyYXk6IEVhY2ggZW50cnkgaGFzIGEga2V5IGFuZCBhCgkJdmFsdWUuIHxEaWN0aW9uYXJ5fAoJCUV4YW1wbGU6IHsnYmx1ZSc6ICIjMDAwMGZmIiwgJ3JlZCc6ICIjZmYwMDAwIn0KCkZ1bmNyZWYJCUEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gfEZ1bmNyZWZ8LgoJCUV4YW1wbGU6IGZ1bmN0aW9uKCJzdHJsZW4iKQoKU3BlY2lhbAkJdjpmYWxzZSwgdjp0cnVlLCB2Om5vbmUgYW5kIHY6bnVsbAoKSm9iCQlVc2VkIGZvciBqb2IgY29udHJvbCwgc2VlIHxqb2Jfc3RhcnQoKXwuCgpUaGUgTnVtYmVyIGFuZCBTdHJpbmcgdHlwZXMgYXJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5LCBkZXBlbmRpbmcgb24gaG93IHRoZXkKYXJlIHVzZWQuCgpDb252ZXJzaW9uIGZyb20gYSBOdW1iZXIgdG8gYSBTdHJpbmcgaXMgYnkgbWFraW5nIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBvZgp0aGUgTnVtYmVyLiAgRXhhbXBsZXM6CglOdW1iZXIgMTIzCS0tPglTdHJpbmcgIjEyMyIgfgoJTnVtYmVyIDAJLS0+CVN0cmluZyAiMCIgfgoJTnVtYmVyIC0xCS0tPglTdHJpbmcgIi0xIiB+CgkJCQkJCQkqb2N0YWwqCkNvbnZlcnNpb24gZnJvbSBhIFN0cmluZyB0byBhIE51bWJlciBpcyBkb25lIGJ5IGNvbnZlcnRpbmcgdGhlIGZpcnN0IGRpZ2l0cyB0bwphIG51bWJlci4gIEhleGFkZWNpbWFsICIweGY5IiwgT2N0YWwgIjAxNyIsIGFuZCBCaW5hcnkgIjBiMTAiIG51bWJlcnMgYXJlCnJlY29nbml6ZWQuICBJZiB0aGUgU3RyaW5nIGRvZXNuJ3Qgc3RhcnQgd2l0aCBkaWdpdHMsIHRoZSByZXN1bHQgaXMgemVyby4KRXhhbXBsZXM6CglTdHJpbmcgIjQ1NiIJLS0+CU51bWJlciA0NTYgfgoJU3RyaW5nICI2YmFyIgktLT4JTnVtYmVyIDYgfgoJU3RyaW5nICJmb28iCS0tPglOdW1iZXIgMCB+CglTdHJpbmcgIjB4ZjEiCS0tPglOdW1iZXIgMjQxIH4KCVN0cmluZyAiMDEwMCIJLS0+CU51bWJlciA2NCB+CglTdHJpbmcgIjBiMTAxIgktLT4JTnVtYmVyIDUgfgoJU3RyaW5nICItOCIJLS0+CU51bWJlciAtOCB+CglTdHJpbmcgIis4IgktLT4JTnVtYmVyIDAgfgoKVG8gZm9yY2UgY29udmVyc2lvbiBmcm9tIFN0cmluZyB0byBOdW1iZXIsIGFkZCB6ZXJvIHRvIGl0OiA+Cgk6ZWNobyAiMDEwMCIgKyAwCjwJNjQgfgoKVG8gYXZvaWQgYSBsZWFkaW5nIHplcm8gdG8gY2F1c2Ugb2N0YWwgY29udmVyc2lvbiwgb3IgZm9yIHVzaW5nIGEgZGlmZmVyZW50CmJhc2UsIHVzZSB8c3RyMm5yKCl8LgoKRm9yIGJvb2xlYW4gb3BlcmF0b3JzIE51bWJlcnMgYXJlIHVzZWQuICBaZXJvIGlzIEZBTFNFLCBub24temVybyBpcyBUUlVFLgoKTm90ZSB0aGF0IGluIHRoZSBjb21tYW5kID4KCTppZiAiZm9vIgoiZm9vIiBpcyBjb252ZXJ0ZWQgdG8gMCwgd2hpY2ggbWVhbnMgRkFMU0UuICBUbyB0ZXN0IGZvciBhIG5vbi1lbXB0eSBzdHJpbmcsCnVzZSBlbXB0eSgpOiA+Cgk6aWYgIWVtcHR5KCJmb28iKQo8CgkJCSpFNzQ1KiAqRTcyOCogKkU3MDMqICpFNzI5KiAqRTczMCogKkU3MzEqICpFOTA4KiAqRTkxMCoKTGlzdCwgRGljdGlvbmFyeSwgRnVuY3JlZiBhbmQgSm9iIHR5cGVzIGFyZSBub3QgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQuCgoJCQkJCQkJKkU4MDUqICpFODA2KiAqRTgwOCoKV2hlbiBtaXhpbmcgTnVtYmVyIGFuZCBGbG9hdCB0aGUgTnVtYmVyIGlzIGNvbnZlcnRlZCB0byBGbG9hdC4JT3RoZXJ3aXNlCnRoZXJlIGlzIG5vIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIEZsb2F0LiAgWW91IGNhbiB1c2Ugc3RyMmZsb2F0KCkgZm9yIFN0cmluZwp0byBGbG9hdCwgcHJpbnRmKCkgZm9yIEZsb2F0IHRvIFN0cmluZyBhbmQgZmxvYXQybnIoKSBmb3IgRmxvYXQgdG8gTnVtYmVyLgoKCQkJCSpFODkxKiAqRTg5MiogKkU4OTMqICpFODk0KiAqRTkwNyogKkU5MTEqCldoZW4gZXhwZWN0aW5nIGEgRmxvYXQgYSBOdW1iZXIgY2FuIGFsc28gYmUgdXNlZCwgYnV0IG5vdGhpbmcgZWxzZS4KCgkJCQkJCSpFNzA2KiAqc3RpY2t5LXR5cGUtY2hlY2tpbmcqCllvdSB3aWxsIGdldCBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGNoYW5nZSB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlLiAgWW91IG5lZWQKdG8gfDp1bmxldHwgaXQgZmlyc3QgdG8gYXZvaWQgdGhpcyBlcnJvci4gIFN0cmluZyBhbmQgTnVtYmVyIGFyZSBjb25zaWRlcmVkCmVxdWl2YWxlbnQgdGhvdWdoLCBhcyB3ZWxsIGFyZSBGbG9hdCBhbmQgTnVtYmVyLiAgQ29uc2lkZXIgdGhpcyBzZXF1ZW5jZSBvZgpjb21tYW5kczogPgoJOmxldCBsID0gInN0cmluZyIKCTpsZXQgbCA9IDQ0CQkiIGNoYW5nZXMgdHlwZSBmcm9tIFN0cmluZyB0byBOdW1iZXIKCTpsZXQgbCA9IFsxLCAyLCAzXQkiIGVycm9yISAgbCBpcyBzdGlsbCBhIE51bWJlcgoJOmxldCBsID0gNC40CQkiIGNoYW5nZXMgdHlwZSBmcm9tIE51bWJlciB0byBGbG9hdAoJOmxldCBsID0gInN0cmluZyIJIiBlcnJvciEKCgoxLjIgRnVuY3Rpb24gcmVmZXJlbmNlcyB+CgkJCQkJKkZ1bmNyZWYqICpFNjk1KiAqRTcxOCoKQSBGdW5jcmVmIHZhcmlhYmxlIGlzIG9idGFpbmVkIHdpdGggdGhlIHxmdW5jdGlvbigpfCBmdW5jdGlvbi4JSXQgY2FuIGJlIHVzZWQKaW4gYW4gZXhwcmVzc2lvbiBpbiB0aGUgcGxhY2Ugb2YgYSBmdW5jdGlvbiBuYW1lLCBiZWZvcmUgdGhlIHBhcmVudGhlc2lzCmFyb3VuZCB0aGUgYXJndW1lbnRzLCB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIGl0IHJlZmVycyB0by4gIEV4YW1wbGU6ID4KCgk6bGV0IEZuID0gZnVuY3Rpb24oIk15RnVuYyIpCgk6ZWNobyBGbigpCjwJCQkJCQkJKkU3MDQqICpFNzA1KiAqRTcwNyoKQSBGdW5jcmVmIHZhcmlhYmxlIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwsICJzOiIsICJ3OiIsICJ0OiIgb3IgImI6Ii4gIFlvdQpjYW4gdXNlICJnOiIgYnV0IHRoZSBmb2xsb3dpbmcgbmFtZSBtdXN0IHN0aWxsIHN0YXJ0IHdpdGggYSBjYXBpdGFsLiAgWW91CmNhbm5vdCBoYXZlIGJvdGggYSBGdW5jcmVmIHZhcmlhYmxlIGFuZCBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZS4KCkEgc3BlY2lhbCBjYXNlIGlzIGRlZmluaW5nIGEgZnVuY3Rpb24gYW5kIGRpcmVjdGx5IGFzc2lnbmluZyBpdHMgRnVuY3JlZiB0byBhCkRpY3Rpb25hcnkgZW50cnkuICBFeGFtcGxlOiA+Cgk6ZnVuY3Rpb24gZGljdC5pbml0KCkgZGljdAoJOiAgIGxldCBzZWxmLnZhbCA9IDAKCTplbmRmdW5jdGlvbgoKVGhlIGtleSBvZiB0aGUgRGljdGlvbmFyeSBjYW4gc3RhcnQgd2l0aCBhIGxvd2VyIGNhc2UgbGV0dGVyLiAgVGhlIGFjdHVhbApmdW5jdGlvbiBuYW1lIGlzIG5vdCB1c2VkIGhlcmUuICBBbHNvIHNlZSB8bnVtYmVyZWQtZnVuY3Rpb258LgoKQSBGdW5jcmVmIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgfDpjYWxsfCBjb21tYW5kOiA+Cgk6Y2FsbCBGbigpCgk6Y2FsbCBkaWN0LmluaXQoKQoKVGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgZnVuY3Rpb24gY2FuIGJlIG9idGFpbmVkIHdpdGggfHN0cmluZygpfC4gPgoJOmxldCBmdW5jID0gc3RyaW5nKEZuKQoKWW91IGNhbiB1c2UgfGNhbGwoKXwgdG8gaW52b2tlIGEgRnVuY3JlZiBhbmQgdXNlIGEgbGlzdCB2YXJpYWJsZSBmb3IgdGhlCmFyZ3VtZW50czogPgoJOmxldCByID0gY2FsbChGbiwgbXlsaXN0KQoKCjEuMyBMaXN0cyB+CgkJCQkJCSpsaXN0KiAqTGlzdCogKkxpc3RzKiAqRTY4NioKQSBMaXN0IGlzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgaXRlbXMuICBBbiBpdGVtIGNhbiBiZSBvZiBhbnkgdHlwZS4gIEl0ZW1zCmNhbiBiZSBhY2Nlc3NlZCBieSB0aGVpciBpbmRleCBudW1iZXIuCUl0ZW1zIGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBhdCBhbnkKcG9zaXRpb24gaW4gdGhlIHNlcXVlbmNlLgoKCkxpc3QgY3JlYXRpb24gfgoJCQkJCQkJKkU2OTYqICpFNjk3KgpBIExpc3QgaXMgY3JlYXRlZCB3aXRoIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaXRlbXMgaW4gc3F1YXJlIGJyYWNrZXRzLgpFeGFtcGxlczogPgoJOmxldCBteWxpc3QgPSBbMSwgdHdvLCAzLCAiZm91ciJdCgk6bGV0IGVtcHR5bGlzdCA9IFtdCgpBbiBpdGVtIGNhbiBiZSBhbnkgZXhwcmVzc2lvbi4JVXNpbmcgYSBMaXN0IGZvciBhbiBpdGVtIGNyZWF0ZXMgYQpMaXN0IG9mIExpc3RzOiA+Cgk6bGV0IG5lc3RsaXN0ID0gW1sxMSwgMTJdLCBbMjEsIDIyXSwgWzMxLCAzMl1dCgpBbiBleHRyYSBjb21tYSBhZnRlciB0aGUgbGFzdCBpdGVtIGlzIGlnbm9yZWQuCgoKTGlzdCBpbmRleCB+CgkJCQkJCQkqbGlzdC1pbmRleCogKkU2ODQqCkFuIGl0ZW0gaW4gdGhlIExpc3QgY2FuIGJlIGFjY2Vzc2VkIGJ5IHB1dHRpbmcgdGhlIGluZGV4IGluIHNxdWFyZSBicmFja2V0cwphZnRlciB0aGUgTGlzdC4gIEluZGV4ZXMgYXJlIHplcm8tYmFzZWQsIHRodXMgdGhlIGZpcnN0IGl0ZW0gaGFzIGluZGV4IHplcm8uID4KCTpsZXQgaXRlbSA9IG15bGlzdFswXQkJIiBnZXQgdGhlIGZpcnN0IGl0ZW06IDEKCTpsZXQgaXRlbSA9IG15bGlzdFsyXQkJIiBnZXQgdGhlIHRoaXJkIGl0ZW06IDMKCldoZW4gdGhlIHJlc3VsdGluZyBpdGVtIGlzIGEgbGlzdCB0aGlzIGNhbiBiZSByZXBlYXRlZDogPgoJOmxldCBpdGVtID0gbmVzdGxpc3RbMF1bMV0JIiBnZXQgdGhlIGZpcnN0IGxpc3QsIHNlY29uZCBpdGVtOiAxMgo8CkEgbmVnYXRpdmUgaW5kZXggaXMgY291bnRlZCBmcm9tIHRoZSBlbmQuICBJbmRleCAtMSByZWZlcnMgdG8gdGhlIGxhc3QgaXRlbSBpbgp0aGUgTGlzdCwgLTIgdG8gdGhlIGxhc3QgYnV0IG9uZSBpdGVtLCBldGMuID4KCTpsZXQgbGFzdCA9IG15bGlzdFstMV0JCSIgZ2V0IHRoZSBsYXN0IGl0ZW06ICJmb3VyIgoKVG8gYXZvaWQgYW4gZXJyb3IgZm9yIGFuIGludmFsaWQgaW5kZXggdXNlIHRoZSB8Z2V0KCl8IGZ1bmN0aW9uLiAgV2hlbiBhbiBpdGVtCmlzIG5vdCBhdmFpbGFibGUgaXQgcmV0dXJucyB6ZXJvIG9yIHRoZSBkZWZhdWx0IHZhbHVlIHlvdSBzcGVjaWZ5OiA+Cgk6ZWNobyBnZXQobXlsaXN0LCBpZHgpCgk6ZWNobyBnZXQobXlsaXN0LCBpZHgsICJOT05FIikKCgpMaXN0IGNvbmNhdGVuYXRpb24gfgoKVHdvIGxpc3RzIGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCB0aGUgIisiIG9wZXJhdG9yOiA+Cgk6bGV0IGxvbmdsaXN0ID0gbXlsaXN0ICsgWzUsIDZdCgk6bGV0IG15bGlzdCArPSBbNywgOF0KClRvIHByZXBlbmQgb3IgYXBwZW5kIGFuIGl0ZW0gdHVybiB0aGUgaXRlbSBpbnRvIGEgbGlzdCBieSBwdXR0aW5nIFtdIGFyb3VuZAppdC4gIFRvIGNoYW5nZSBhIGxpc3QgaW4tcGxhY2Ugc2VlIHxsaXN0LW1vZGlmaWNhdGlvbnwgYmVsb3cuCgoKU3VibGlzdCB+CgpBIHBhcnQgb2YgdGhlIExpc3QgY2FuIGJlIG9idGFpbmVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IGluZGV4LApzZXBhcmF0ZWQgYnkgYSBjb2xvbiBpbiBzcXVhcmUgYnJhY2tldHM6ID4KCTpsZXQgc2hvcnRsaXN0ID0gbXlsaXN0WzI6LTFdCSIgZ2V0IExpc3QgWzMsICJmb3VyIl0KCk9taXR0aW5nIHRoZSBmaXJzdCBpbmRleCBpcyBzaW1pbGFyIHRvIHplcm8uICBPbWl0dGluZyB0aGUgbGFzdCBpbmRleCBpcwpzaW1pbGFyIHRvIC0xLiA+Cgk6bGV0IGVuZGxpc3QgPSBteWxpc3RbMjpdCSIgZnJvbSBpdGVtIDIgdG8gdGhlIGVuZDogWzMsICJmb3VyIl0KCTpsZXQgc2hvcnRsaXN0ID0gbXlsaXN0WzI6Ml0JIiBMaXN0IHdpdGggb25lIGl0ZW06IFszXQoJOmxldCBvdGhlcmxpc3QgPSBteWxpc3RbOl0JIiBtYWtlIGEgY29weSBvZiB0aGUgTGlzdAoKSWYgdGhlIGZpcnN0IGluZGV4IGlzIGJleW9uZCB0aGUgbGFzdCBpdGVtIG9mIHRoZSBMaXN0IG9yIHRoZSBzZWNvbmQgaXRlbSBpcwpiZWZvcmUgdGhlIGZpcnN0IGl0ZW0sIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkgbGlzdC4gIFRoZXJlIGlzIG5vIGVycm9yCm1lc3NhZ2UuCgpJZiB0aGUgc2Vjb25kIGluZGV4IGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IHRoZQpsZW5ndGggbWludXMgb25lIGlzIHVzZWQ6ID4KCTpsZXQgbXlsaXN0ID0gWzAsIDEsIDIsIDNdCgk6ZWNobyBteWxpc3RbMjo4XQkJIiByZXN1bHQ6IFsyLCAzXQoKTk9URTogbXlsaXN0W3M6ZV0gbWVhbnMgdXNpbmcgdGhlIHZhcmlhYmxlICJzOmUiIGFzIGluZGV4LiAgV2F0Y2ggb3V0IGZvcgp1c2luZyBhIHNpbmdsZSBsZXR0ZXIgdmFyaWFibGUgYmVmb3JlIHRoZSAiOiIuCUluc2VydCBhIHNwYWNlIHdoZW4gbmVlZGVkOgpteWxpc3RbcyA6IGVdLgoKCkxpc3QgaWRlbnRpdHkgfgoJCQkJCQkJKmxpc3QtaWRlbnRpdHkqCldoZW4gdmFyaWFibGUgImFhIiBpcyBhIGxpc3QgYW5kIHlvdSBhc3NpZ24gaXQgdG8gYW5vdGhlciB2YXJpYWJsZSAiYmIiLCBib3RoCnZhcmlhYmxlcyByZWZlciB0byB0aGUgc2FtZSBsaXN0LiAgVGh1cyBjaGFuZ2luZyB0aGUgbGlzdCAiYWEiIHdpbGwgYWxzbwpjaGFuZ2UgImJiIjogPgoJOmxldCBhYSA9IFsxLCAyLCAzXQoJOmxldCBiYiA9IGFhCgk6Y2FsbCBhZGQoYWEsIDQpCgk6ZWNobyBiYgo8CVsxLCAyLCAzLCA0XQoKTWFraW5nIGEgY29weSBvZiBhIGxpc3QgaXMgZG9uZSB3aXRoIHRoZSB8Y29weSgpfCBmdW5jdGlvbi4gIFVzaW5nIFs6XSBhbHNvCndvcmtzLCBhcyBleHBsYWluZWQgYWJvdmUuICBUaGlzIGNyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3Q6IENoYW5naW5nCmEgbGlzdCBpdGVtIGluIHRoZSBsaXN0IHdpbGwgYWxzbyBjaGFuZ2UgdGhlIGl0ZW0gaW4gdGhlIGNvcGllZCBsaXN0OiA+Cgk6bGV0IGFhID0gW1sxLCAnYSddLCAyLCAzXQoJOmxldCBiYiA9IGNvcHkoYWEpCgk6Y2FsbCBhZGQoYWEsIDQpCgk6bGV0IGFhWzBdWzFdID0gJ2FhYScKCTplY2hvIGFhCjwJW1sxLCBhYWFdLCAyLCAzLCA0XSA+Cgk6ZWNobyBiYgo8CVtbMSwgYWFhXSwgMiwgM10KClRvIG1ha2UgYSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IGxpc3QgdXNlIHxkZWVwY29weSgpfC4gIFRoaXMgYWxzbyBtYWtlcyBhCmNvcHkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgbGlzdCwgcmVjdXJzaXZlbHkuICBVcCB0byBhIGh1bmRyZWQgbGV2ZWxzIGRlZXAuCgpUaGUgb3BlcmF0b3IgImlzIiBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28gdmFyaWFibGVzIHJlZmVyIHRvIHRoZSBzYW1lCkxpc3QuICAiaXNub3QiIGRvZXMgdGhlIG9wcG9zaXRlLiAgSW4gY29udHJhc3QgIj09IiBjb21wYXJlcyBpZiB0d28gbGlzdHMgaGF2ZQp0aGUgc2FtZSB2YWx1ZS4gPgoJOmxldCBhbGlzdCA9IFsxLCAyLCAzXQoJOmxldCBibGlzdCA9IFsxLCAyLCAzXQoJOmVjaG8gYWxpc3QgaXMgYmxpc3QKPAkwID4KCTplY2hvIGFsaXN0ID09IGJsaXN0CjwJMQoKTm90ZSBhYm91dCBjb21wYXJpbmcgbGlzdHM6IFR3byBsaXN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlCnNhbWUgbGVuZ3RoIGFuZCBhbGwgaXRlbXMgY29tcGFyZSBlcXVhbCwgYXMgd2l0aCB1c2luZyAiPT0iLiAgVGhlcmUgaXMgb25lCmV4Y2VwdGlvbjogV2hlbiBjb21wYXJpbmcgYSBudW1iZXIgd2l0aCBhIHN0cmluZyB0aGV5IGFyZSBjb25zaWRlcmVkCmRpZmZlcmVudC4gIFRoZXJlIGlzIG5vIGF1dG9tYXRpYyB0eXBlIGNvbnZlcnNpb24sIGFzIHdpdGggdXNpbmcgIj09IiBvbgp2YXJpYWJsZXMuICBFeGFtcGxlOiA+CgllY2hvIDQgPT0gIjQiCjwJMSA+CgllY2hvIFs0XSA9PSBbIjQiXQo8CTAKClRodXMgY29tcGFyaW5nIExpc3RzIGlzIG1vcmUgc3RyaWN0IHRoYW4gY29tcGFyaW5nIG51bWJlcnMgYW5kIHN0cmluZ3MuICBZb3UKY2FuIGNvbXBhcmUgc2ltcGxlIHZhbHVlcyB0aGlzIHdheSB0b28gYnkgcHV0dGluZyB0aGVtIGluIGEgbGlzdDogPgoKCTpsZXQgYSA9IDUKCTpsZXQgYiA9ICI1IgoJOmVjaG8gYSA9PSBiCjwJMSA+Cgk6ZWNobyBbYV0gPT0gW2JdCjwJMAoKCkxpc3QgdW5wYWNrIH4KClRvIHVucGFjayB0aGUgaXRlbXMgaW4gYSBsaXN0IHRvIGluZGl2aWR1YWwgdmFyaWFibGVzLCBwdXQgdGhlIHZhcmlhYmxlcyBpbgpzcXVhcmUgYnJhY2tldHMsIGxpa2UgbGlzdCBpdGVtczogPgoJOmxldCBbdmFyMSwgdmFyMl0gPSBteWxpc3QKCldoZW4gdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdAp0aGlzIHByb2R1Y2VzIGFuIGVycm9yLiAgVG8gaGFuZGxlIGFueSBleHRyYSBpdGVtcyBmcm9tIHRoZSBsaXN0IGFwcGVuZCAiOyIKYW5kIGEgdmFyaWFibGUgbmFtZTogPgoJOmxldCBbdmFyMSwgdmFyMjsgcmVzdF0gPSBteWxpc3QKClRoaXMgd29ya3MgbGlrZTogPgoJOmxldCB2YXIxID0gbXlsaXN0WzBdCgk6bGV0IHZhcjIgPSBteWxpc3RbMV0KCTpsZXQgcmVzdCA9IG15bGlzdFsyOl0KCkV4Y2VwdCB0aGF0IHRoZXJlIGlzIG5vIGVycm9yIGlmIHRoZXJlIGFyZSBvbmx5IHR3byBpdGVtcy4gICJyZXN0IiB3aWxsIGJlIGFuCmVtcHR5IGxpc3QgdGhlbi4KCgpMaXN0IG1vZGlmaWNhdGlvbiB+CgkJCQkJCQkqbGlzdC1tb2RpZmljYXRpb24qClRvIGNoYW5nZSBhIHNwZWNpZmljIGl0ZW0gb2YgYSBsaXN0IHVzZSB8OmxldHwgdGhpcyB3YXk6ID4KCTpsZXQgbGlzdFs0XSA9ICJmb3VyIgoJOmxldCBsaXN0bGlzdFswXVszXSA9IGl0ZW0KClRvIGNoYW5nZSBwYXJ0IG9mIGEgbGlzdCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW0gdG8gYmUKbW9kaWZpZWQuICBUaGUgdmFsdWUgbXVzdCBhdCBsZWFzdCBoYXZlIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHJhbmdlOiA+Cgk6bGV0IGxpc3RbMzo1XSA9IFszLCA0LCA1XQoKQWRkaW5nIGFuZCByZW1vdmluZyBpdGVtcyBmcm9tIGEgbGlzdCBpcyBkb25lIHdpdGggZnVuY3Rpb25zLiAgSGVyZSBhcmUgYSBmZXcKZXhhbXBsZXM6ID4KCTpjYWxsIGluc2VydChsaXN0LCAnYScpCQkiIHByZXBlbmQgaXRlbSAnYScKCTpjYWxsIGluc2VydChsaXN0LCAnYScsIDMpCSIgaW5zZXJ0IGl0ZW0gJ2EnIGJlZm9yZSBsaXN0WzNdCgk6Y2FsbCBhZGQobGlzdCwgIm5ldyIpCQkiIGFwcGVuZCBTdHJpbmcgaXRlbQoJOmNhbGwgYWRkKGxpc3QsIFsxLCAyXSkJCSIgYXBwZW5kIGEgTGlzdCBhcyBvbmUgbmV3IGl0ZW0KCTpjYWxsIGV4dGVuZChsaXN0LCBbMSwgMl0pCSIgZXh0ZW5kIHRoZSBsaXN0IHdpdGggdHdvIG1vcmUgaXRlbXMKCTpsZXQgaSA9IHJlbW92ZShsaXN0LCAzKQkiIHJlbW92ZSBpdGVtIDMKCTp1bmxldCBsaXN0WzNdCQkJIiBpZGVtCgk6bGV0IGwgPSByZW1vdmUobGlzdCwgMywgLTEpCSIgcmVtb3ZlIGl0ZW1zIDMgdG8gbGFzdCBpdGVtCgk6dW5sZXQgbGlzdFszIDogXQkJIiBpZGVtCgk6Y2FsbCBmaWx0ZXIobGlzdCwgJ3Y6dmFsICF+ICJ4IicpICAiIHJlbW92ZSBpdGVtcyB3aXRoIGFuICd4JwoKQ2hhbmdpbmcgdGhlIG9yZGVyIG9mIGl0ZW1zIGluIGEgbGlzdDogPgoJOmNhbGwgc29ydChsaXN0KQkJIiBzb3J0IGEgbGlzdCBhbHBoYWJldGljYWxseQoJOmNhbGwgcmV2ZXJzZShsaXN0KQkJIiByZXZlcnNlIHRoZSBvcmRlciBvZiBpdGVtcwoJOmNhbGwgdW5pcShzb3J0KGxpc3QpKQkJIiBzb3J0IGFuZCByZW1vdmUgZHVwbGljYXRlcwoKCkZvciBsb29wIH4KClRoZSB8OmZvcnwgbG9vcCBleGVjdXRlcyBjb21tYW5kcyBmb3IgZWFjaCBpdGVtIGluIGEgbGlzdC4gIEEgdmFyaWFibGUgaXMgc2V0CnRvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBpbiBzZXF1ZW5jZS4gIEV4YW1wbGU6ID4KCTpmb3IgaXRlbSBpbiBteWxpc3QKCTogICBjYWxsIERvaXQoaXRlbSkKCTplbmRmb3IKClRoaXMgd29ya3MgbGlrZTogPgoJOmxldCBpbmRleCA9IDAKCTp3aGlsZSBpbmRleCA8IGxlbihteWxpc3QpCgk6ICAgbGV0IGl0ZW0gPSBteWxpc3RbaW5kZXhdCgk6ICAgOmNhbGwgRG9pdChpdGVtKQoJOiAgIGxldCBpbmRleCA9IGluZGV4ICsgMQoJOmVuZHdoaWxlCgpOb3RlIHRoYXQgYWxsIGl0ZW1zIGluIHRoZSBsaXN0IHNob3VsZCBiZSBvZiB0aGUgc2FtZSB0eXBlLCBvdGhlcndpc2UgdGhpcwpyZXN1bHRzIGluIGVycm9yIHxFNzA2fC4gIFRvIGF2b2lkIHRoaXMgfDp1bmxldHwgdGhlIHZhcmlhYmxlIGF0IHRoZSBlbmQgb2YKdGhlIGxvb3AuCgpJZiBhbGwgeW91IHdhbnQgdG8gZG8gaXMgbW9kaWZ5IGVhY2ggaXRlbSBpbiB0aGUgbGlzdCB0aGVuIHRoZSB8bWFwKCl8CmZ1bmN0aW9uIHdpbGwgYmUgYSBzaW1wbGVyIG1ldGhvZCB0aGFuIGEgZm9yIGxvb3AuCgpKdXN0IGxpa2UgdGhlIHw6bGV0fCBjb21tYW5kLCB8OmZvcnwgYWxzbyBhY2NlcHRzIGEgbGlzdCBvZiB2YXJpYWJsZXMuCVRoaXMKcmVxdWlyZXMgdGhlIGFyZ3VtZW50IHRvIGJlIGEgbGlzdCBvZiBsaXN0cy4gPgoJOmZvciBbbG51bSwgY29sXSBpbiBbWzEsIDNdLCBbMiwgOF0sIFszLCAwXV0KCTogICBjYWxsIERvaXQobG51bSwgY29sKQoJOmVuZGZvcgoKVGhpcyB3b3JrcyBsaWtlIGEgfDpsZXR8IGNvbW1hbmQgaXMgZG9uZSBmb3IgZWFjaCBsaXN0IGl0ZW0uICBBZ2FpbiwgdGhlIHR5cGVzCm11c3QgcmVtYWluIHRoZSBzYW1lIHRvIGF2b2lkIGFuIGVycm9yLgoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwdXQgcmVtYWluaW5nIGl0ZW1zIGluIGEgTGlzdCB2YXJpYWJsZTogPgoJOmZvciBbaSwgajsgcmVzdF0gaW4gbGlzdGxpc3QKCTogICBjYWxsIERvaXQoaSwgaikKCTogICBpZiAhZW1wdHkocmVzdCkKCTogICAgICBlY2hvICJyZW1haW5kZXI6ICIgLiBzdHJpbmcocmVzdCkKCTogICBlbmRpZgoJOmVuZGZvcgoKCkxpc3QgZnVuY3Rpb25zIH4KCQkJCQkJKkU3MTQqCkZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VmdWwgd2l0aCBhIExpc3Q6ID4KCTpsZXQgciA9IGNhbGwoZnVuY25hbWUsIGxpc3QpCSIgY2FsbCBhIGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgbGlzdAoJOmlmIGVtcHR5KGxpc3QpCQkJIiBjaGVjayBpZiBsaXN0IGlzIGVtcHR5Cgk6bGV0IGwgPSBsZW4obGlzdCkJCSIgbnVtYmVyIG9mIGl0ZW1zIGluIGxpc3QKCTpsZXQgYmlnID0gbWF4KGxpc3QpCQkiIG1heGltdW0gdmFsdWUgaW4gbGlzdAoJOmxldCBzbWFsbCA9IG1pbihsaXN0KQkJIiBtaW5pbXVtIHZhbHVlIGluIGxpc3QKCTpsZXQgeHMgPSBjb3VudChsaXN0LCAneCcpCSIgY291bnQgbnIgb2YgdGltZXMgJ3gnIGFwcGVhcnMgaW4gbGlzdAoJOmxldCBpID0gaW5kZXgobGlzdCwgJ3gnKQkiIGluZGV4IG9mIGZpcnN0ICd4JyBpbiBsaXN0Cgk6bGV0IGxpbmVzID0gZ2V0bGluZSgxLCAxMCkJIiBnZXQgdGVuIHRleHQgbGluZXMgZnJvbSBidWZmZXIKCTpjYWxsIGFwcGVuZCgnJCcsIGxpbmVzKQkiIGFwcGVuZCB0ZXh0IGxpbmVzIGluIGJ1ZmZlcgoJOmxldCBsaXN0ID0gc3BsaXQoImEgYiBjIikJIiBjcmVhdGUgbGlzdCBmcm9tIGl0ZW1zIGluIGEgc3RyaW5nCgk6bGV0IHN0cmluZyA9IGpvaW4obGlzdCwgJywgJykJIiBjcmVhdGUgc3RyaW5nIGZyb20gbGlzdCBpdGVtcwoJOmxldCBzID0gc3RyaW5nKGxpc3QpCQkiIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsaXN0Cgk6Y2FsbCBtYXAobGlzdCwgJyI+PiAiIC4gdjp2YWwnKSAgIiBwcmVwZW5kICI+PiAiIHRvIGVhY2ggaXRlbQoKRG9uJ3QgZm9yZ2V0IHRoYXQgYSBjb21iaW5hdGlvbiBvZiBmZWF0dXJlcyBjYW4gbWFrZSB0aGluZ3Mgc2ltcGxlLiAgRm9yCmV4YW1wbGUsIHRvIGFkZCB1cCBhbGwgdGhlIG51bWJlcnMgaW4gYSBsaXN0OiA+Cgk6ZXhlICdsZXQgc3VtID0gJyAuIGpvaW4obnJsaXN0LCAnKycpCgoKMS40IERpY3Rpb25hcmllcyB+CgkJCQkJKmRpY3QqICpEaWN0aW9uYXJpZXMqICpEaWN0aW9uYXJ5KgpBIERpY3Rpb25hcnkgaXMgYW4gYXNzb2NpYXRpdmUgYXJyYXk6IEVhY2ggZW50cnkgaGFzIGEga2V5IGFuZCBhIHZhbHVlLiAgVGhlCmVudHJ5IGNhbiBiZSBsb2NhdGVkIHdpdGggdGhlIGtleS4gIFRoZSBlbnRyaWVzIGFyZSBzdG9yZWQgd2l0aG91dCBhIHNwZWNpZmljCm9yZGVyaW5nLgoKCkRpY3Rpb25hcnkgY3JlYXRpb24gfgoJCQkJCQkqRTcyMCogKkU3MjEqICpFNzIyKiAqRTcyMyoKQSBEaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVudHJpZXMgaW4gY3VybHkKYnJhY2VzLiAgRWFjaCBlbnRyeSBoYXMgYSBrZXkgYW5kIGEgdmFsdWUsIHNlcGFyYXRlZCBieSBhIGNvbG9uLiAgRWFjaCBrZXkgY2FuCm9ubHkgYXBwZWFyIG9uY2UuICBFeGFtcGxlczogPgoJOmxldCBteWRpY3QgPSB7MTogJ29uZScsIDI6ICd0d28nLCAzOiAndGhyZWUnfQoJOmxldCBlbXB0eWRpY3QgPSB7fQo8CQkJCQkJCSpFNzEzKiAqRTcxNiogKkU3MTcqCkEga2V5IGlzIGFsd2F5cyBhIFN0cmluZy4gIFlvdSBjYW4gdXNlIGEgTnVtYmVyLCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhClN0cmluZyBhdXRvbWF0aWNhbGx5LiAgVGh1cyB0aGUgU3RyaW5nICc0JyBhbmQgdGhlIG51bWJlciA0IHdpbGwgZmluZCB0aGUgc2FtZQplbnRyeS4JTm90ZSB0aGF0IHRoZSBTdHJpbmcgJzA0JyBhbmQgdGhlIE51bWJlciAwNCBhcmUgZGlmZmVyZW50LCBzaW5jZSB0aGUKTnVtYmVyIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBTdHJpbmcgJzQnLgoKQSB2YWx1ZSBjYW4gYmUgYW55IGV4cHJlc3Npb24uCVVzaW5nIGEgRGljdGlvbmFyeSBmb3IgYSB2YWx1ZSBjcmVhdGVzIGEKbmVzdGVkIERpY3Rpb25hcnk6ID4KCTpsZXQgbmVzdGRpY3QgPSB7MTogezExOiAnYScsIDEyOiAnYid9LCAyOiB7MjE6ICdjJ319CgpBbiBleHRyYSBjb21tYSBhZnRlciB0aGUgbGFzdCBlbnRyeSBpcyBpZ25vcmVkLgoKCkFjY2Vzc2luZyBlbnRyaWVzIH4KClRoZSBub3JtYWwgd2F5IHRvIGFjY2VzcyBhbiBlbnRyeSBpcyBieSBwdXR0aW5nIHRoZSBrZXkgaW4gc3F1YXJlIGJyYWNrZXRzOiA+Cgk6bGV0IHZhbCA9IG15ZGljdFsib25lIl0KCTpsZXQgbXlkaWN0WyJmb3VyIl0gPSA0CgpZb3UgY2FuIGFkZCBuZXcgZW50cmllcyB0byBhbiBleGlzdGluZyBEaWN0aW9uYXJ5IHRoaXMgd2F5LCB1bmxpa2UgTGlzdHMuCgpGb3Iga2V5cyB0aGF0IGNvbnNpc3QgZW50aXJlbHkgb2YgbGV0dGVycywgZGlnaXRzIGFuZCB1bmRlcnNjb3JlIHRoZSBmb2xsb3dpbmcKZm9ybSBjYW4gYmUgdXNlZCB8ZXhwci1lbnRyeXw6ID4KCTpsZXQgdmFsID0gbXlkaWN0Lm9uZQoJOmxldCBteWRpY3QuZm91ciA9IDQKClNpbmNlIGFuIGVudHJ5IGNhbiBiZSBhbnkgdHlwZSwgYWxzbyBhIExpc3QgYW5kIGEgRGljdGlvbmFyeSwgdGhlIGluZGV4aW5nIGFuZAprZXkgbG9va3VwIGNhbiBiZSByZXBlYXRlZDogPgoJOmVjaG8gZGljdC5rZXlbaWR4XS5rZXkKCgpEaWN0aW9uYXJ5IHRvIExpc3QgY29udmVyc2lvbiB+CgpZb3UgbWF5IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBlbnRyaWVzIGluIGEgZGljdGlvbmFyeS4JRm9yIHRoaXMgeW91IG5lZWQgdG8KdHVybiB0aGUgRGljdGlvbmFyeSBpbnRvIGEgTGlzdCBhbmQgcGFzcyBpdCB0byB8OmZvcnwuCgpNb3N0IG9mdGVuIHlvdSB3YW50IHRvIGxvb3Agb3ZlciB0aGUga2V5cywgdXNpbmcgdGhlIHxrZXlzKCl8IGZ1bmN0aW9uOiA+Cgk6Zm9yIGtleSBpbiBrZXlzKG15ZGljdCkKCTogICBlY2hvIGtleSAuICc6ICcgLiBteWRpY3Rba2V5XQoJOmVuZGZvcgoKVGhlIExpc3Qgb2Yga2V5cyBpcyB1bnNvcnRlZC4gIFlvdSBtYXkgd2FudCB0byBzb3J0IHRoZW0gZmlyc3Q6ID4KCTpmb3Iga2V5IGluIHNvcnQoa2V5cyhteWRpY3QpKQoKVG8gbG9vcCBvdmVyIHRoZSB2YWx1ZXMgdXNlIHRoZSB8dmFsdWVzKCl8IGZ1bmN0aW9uOiAgPgoJOmZvciB2IGluIHZhbHVlcyhteWRpY3QpCgk6ICAgZWNobyAidmFsdWU6ICIgLiB2Cgk6ZW5kZm9yCgpJZiB5b3Ugd2FudCBib3RoIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSB1c2UgdGhlIHxpdGVtcygpfCBmdW5jdGlvbi4gIEl0IHJldHVybnMKYSBMaXN0IGluIHdoaWNoIGVhY2ggaXRlbSBpcyBhCUxpc3Qgd2l0aCB0d28gaXRlbXMsIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZTogPgoJOmZvciBba2V5LCB2YWx1ZV0gaW4gaXRlbXMobXlkaWN0KQoJOiAgIGVjaG8ga2V5IC4gJzogJyAuIHZhbHVlCgk6ZW5kZm9yCgoKRGljdGlvbmFyeSBpZGVudGl0eSB+CgkJCQkJCQkqZGljdC1pZGVudGl0eSoKSnVzdCBsaWtlIExpc3RzIHlvdSBuZWVkIHRvIHVzZSB8Y29weSgpfCBhbmQgfGRlZXBjb3B5KCl8IHRvIG1ha2UgYSBjb3B5IG9mIGEKRGljdGlvbmFyeS4gIE90aGVyd2lzZSwgYXNzaWdubWVudCByZXN1bHRzIGluIHJlZmVycmluZyB0byB0aGUgc2FtZQpEaWN0aW9uYXJ5OiA+Cgk6bGV0IG9uZWRpY3QgPSB7J2EnOiAxLCAnYic6IDJ9Cgk6bGV0IGFkaWN0ID0gb25lZGljdAoJOmxldCBhZGljdFsnYSddID0gMTEKCTplY2hvIG9uZWRpY3RbJ2EnXQoJMTEKClR3byBEaWN0aW9uYXJpZXMgY29tcGFyZSBlcXVhbCBpZiBhbGwgdGhlIGtleS12YWx1ZSBwYWlycyBjb21wYXJlIGVxdWFsLiAgRm9yCm1vcmUgaW5mbyBzZWUgfGxpc3QtaWRlbnRpdHl8LgoKCkRpY3Rpb25hcnkgbW9kaWZpY2F0aW9uIH4KCQkJCQkJCSpkaWN0LW1vZGlmaWNhdGlvbioKVG8gY2hhbmdlIGFuIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgb2YgYSBEaWN0aW9uYXJ5LCBvciB0byBhZGQgYSBuZXcgZW50cnksCnVzZSB8OmxldHwgdGhpcyB3YXk6ID4KCTpsZXQgZGljdFs0XSA9ICJmb3VyIgoJOmxldCBkaWN0WydvbmUnXSA9IGl0ZW0KClJlbW92aW5nIGFuIGVudHJ5IGZyb20gYSBEaWN0aW9uYXJ5IGlzIGRvbmUgd2l0aCB8cmVtb3ZlKCl8IG9yIHw6dW5sZXR8LgpUaHJlZSB3YXlzIHRvIHJlbW92ZSB0aGUgZW50cnkgd2l0aCBrZXkgImFhYSIgZnJvbSBkaWN0OiA+Cgk6bGV0IGkgPSByZW1vdmUoZGljdCwgJ2FhYScpCgk6dW5sZXQgZGljdC5hYWEKCTp1bmxldCBkaWN0WydhYWEnXQoKTWVyZ2luZyBhIERpY3Rpb25hcnkgd2l0aCBhbm90aGVyIGlzIGRvbmUgd2l0aCB8ZXh0ZW5kKCl8OiA+Cgk6Y2FsbCBleHRlbmQoYWRpY3QsIGJkaWN0KQpUaGlzIGV4dGVuZHMgYWRpY3Qgd2l0aCBhbGwgZW50cmllcyBmcm9tIGJkaWN0LiAgRHVwbGljYXRlIGtleXMgY2F1c2UgZW50cmllcwppbiBhZGljdCB0byBiZSBvdmVyd3JpdHRlbi4gIEFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGNhbiBjaGFuZ2UgdGhpcy4KTm90ZSB0aGF0IHRoZSBvcmRlciBvZiBlbnRyaWVzIGluIGEgRGljdGlvbmFyeSBpcyBpcnJlbGV2YW50LCB0aHVzIGRvbid0CmV4cGVjdCAiOmVjaG8gYWRpY3QiIHRvIHNob3cgdGhlIGl0ZW1zIGZyb20gYmRpY3QgYWZ0ZXIgdGhlIG9sZGVyIGVudHJpZXMgaW4KYWRpY3QuCgpXZWVkaW5nIG91dCBlbnRyaWVzIGZyb20gYSBEaWN0aW9uYXJ5IGNhbiBiZSBkb25lIHdpdGggfGZpbHRlcigpfDogPgoJOmNhbGwgZmlsdGVyKGRpY3QsICd2OnZhbCA9fiAieCInKQpUaGlzIHJlbW92ZXMgYWxsIGVudHJpZXMgZnJvbSAiZGljdCIgd2l0aCBhIHZhbHVlIG5vdCBtYXRjaGluZyAneCcuCgoKRGljdGlvbmFyeSBmdW5jdGlvbiB+CgkJCQkqRGljdGlvbmFyeS1mdW5jdGlvbiogKnNlbGYqICpFNzI1KiAqRTg2MioKV2hlbiBhIGZ1bmN0aW9uIGlzIGRlZmluZWQgd2l0aCB0aGUgImRpY3QiIGF0dHJpYnV0ZSBpdCBjYW4gYmUgdXNlZCBpbiBhCnNwZWNpYWwgd2F5IHdpdGggYSBkaWN0aW9uYXJ5LglFeGFtcGxlOiA+Cgk6ZnVuY3Rpb24gTXlsZW4oKSBkaWN0Cgk6ICAgcmV0dXJuIGxlbihzZWxmLmRhdGEpCgk6ZW5kZnVuY3Rpb24KCTpsZXQgbXlkaWN0ID0geydkYXRhJzogWzAsIDEsIDIsIDNdLCAnbGVuJzogZnVuY3Rpb24oIk15bGVuIil9Cgk6ZWNobyBteWRpY3QubGVuKCkKClRoaXMgaXMgbGlrZSBhIG1ldGhvZCBpbiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcuICBUaGUgZW50cnkgaW4gdGhlCkRpY3Rpb25hcnkgaXMgYSB8RnVuY3JlZnwuICBUaGUgbG9jYWwgdmFyaWFibGUgInNlbGYiIHJlZmVycyB0byB0aGUgZGljdGlvbmFyeQp0aGUgZnVuY3Rpb24gd2FzIGludm9rZWQgZnJvbS4KCkl0IGlzIGFsc28gcG9zc2libGUgdG8gYWRkIGEgZnVuY3Rpb24gd2l0aG91dCB0aGUgImRpY3QiIGF0dHJpYnV0ZSBhcyBhCkZ1bmNyZWYgdG8gYSBEaWN0aW9uYXJ5LCBidXQgdGhlICJzZWxmIiB2YXJpYWJsZSBpcyBub3QgYXZhaWxhYmxlIHRoZW4uCgoJCQkJKm51bWJlcmVkLWZ1bmN0aW9uKiAqYW5vbnltb3VzLWZ1bmN0aW9uKgpUbyBhdm9pZCB0aGUgZXh0cmEgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIGl0IGNhbiBiZSBkZWZpbmVkIGFuZCBkaXJlY3RseQphc3NpZ25lZCB0byBhIERpY3Rpb25hcnkgaW4gdGhpcyB3YXk6ID4KCTpsZXQgbXlkaWN0ID0geydkYXRhJzogWzAsIDEsIDIsIDNdfQoJOmZ1bmN0aW9uIG15ZGljdC5sZW4oKQoJOiAgIHJldHVybiBsZW4oc2VsZi5kYXRhKQoJOmVuZGZ1bmN0aW9uCgk6ZWNobyBteWRpY3QubGVuKCkKClRoZSBmdW5jdGlvbiB3aWxsIHRoZW4gZ2V0IGEgbnVtYmVyIGFuZCB0aGUgdmFsdWUgb2YgZGljdC5sZW4gaXMgYSB8RnVuY3JlZnwKdGhhdCByZWZlcmVuY2VzIHRoaXMgZnVuY3Rpb24uCVRoZSBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHRocm91Z2ggYQp8RnVuY3JlZnwuICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGVsZXRlZCB3aGVuIHRoZXJlIGlzIG5vIHxGdW5jcmVmfApyZW1haW5pbmcgdGhhdCByZWZlcnMgdG8gaXQuCgpJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgImRpY3QiIGF0dHJpYnV0ZSBmb3IgYSBudW1iZXJlZCBmdW5jdGlvbi4KCklmIHlvdSBnZXQgYW4gZXJyb3IgZm9yIGEgbnVtYmVyZWQgZnVuY3Rpb24sIHlvdSBjYW4gZmluZCBvdXQgd2hhdCBpdCBpcyB3aXRoCmEgdHJpY2suICBBc3N1bWluZyB0aGUgZnVuY3Rpb24gaXMgNDIsIHRoZSBjb21tYW5kIGlzOiA+Cgk6ZnVuY3Rpb24gezQyfQoKCkZ1bmN0aW9ucyBmb3IgRGljdGlvbmFyaWVzIH4KCQkJCQkJCSpFNzE1KgpGdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGEgRGljdGlvbmFyeTogPgoJOmlmIGhhc19rZXkoZGljdCwgJ2ZvbycpCSIgVFJVRSBpZiBkaWN0IGhhcyBlbnRyeSB3aXRoIGtleSAiZm9vIgoJOmlmIGVtcHR5KGRpY3QpCQkJIiBUUlVFIGlmIGRpY3QgaXMgZW1wdHkKCTpsZXQgbCA9IGxlbihkaWN0KQkJIiBudW1iZXIgb2YgaXRlbXMgaW4gZGljdAoJOmxldCBiaWcgPSBtYXgoZGljdCkJCSIgbWF4aW11bSB2YWx1ZSBpbiBkaWN0Cgk6bGV0IHNtYWxsID0gbWluKGRpY3QpCQkiIG1pbmltdW0gdmFsdWUgaW4gZGljdAoJOmxldCB4cyA9IGNvdW50KGRpY3QsICd4JykJIiBjb3VudCBuciBvZiB0aW1lcyAneCcgYXBwZWFycyBpbiBkaWN0Cgk6bGV0IHMgPSBzdHJpbmcoZGljdCkJCSIgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGRpY3QKCTpjYWxsIG1hcChkaWN0LCAnIj4+ICIgLiB2OnZhbCcpICAiIHByZXBlbmQgIj4+ICIgdG8gZWFjaCBpdGVtCgoKMS41IE1vcmUgYWJvdXQgdmFyaWFibGVzIH4KCQkJCQkJCSptb3JlLXZhcmlhYmxlcyoKSWYgeW91IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiBhIHZhcmlhYmxlIG9yIGV4cHJlc3Npb24sIHVzZSB0aGUgfHR5cGUoKXwKZnVuY3Rpb24uCgpXaGVuIHRoZSAnIScgZmxhZyBpcyBpbmNsdWRlZCBpbiB0aGUgJ3ZpbWluZm8nIG9wdGlvbiwgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CnN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciwgYW5kIGRvbid0IGNvbnRhaW4gYSBsb3dlcmNhc2UgbGV0dGVyLCBhcmUKc3RvcmVkIGluIHRoZSB2aW1pbmZvIGZpbGUgfHZpbWluZm8tZmlsZXwuCgpXaGVuIHRoZSAnc2Vzc2lvbm9wdGlvbnMnIG9wdGlvbiBjb250YWlucyAiZ2xvYmFsIiwgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CnN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciBhbmQgY29udGFpbiBhdCBsZWFzdCBvbmUgbG93ZXJjYXNlIGxldHRlciBhcmUKc3RvcmVkIGluIHRoZSBzZXNzaW9uIGZpbGUgfHNlc3Npb24tZmlsZXwuCgp2YXJpYWJsZSBuYW1lCQljYW4gYmUgc3RvcmVkIHdoZXJlIH4KbXlfdmFyXzYJCW5vdApNeV9WYXJfNgkJc2Vzc2lvbiBmaWxlCk1ZX1ZBUl82CQl2aW1pbmZvIGZpbGUKCgpJdCdzIHBvc3NpYmxlIHRvIGZvcm0gYSB2YXJpYWJsZSBuYW1lIHdpdGggY3VybHkgYnJhY2VzLCBzZWUKfGN1cmx5LWJyYWNlcy1uYW1lc3wuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gRXhwcmVzc2lvbiBzeW50YXgJCQkJCSpleHByZXNzaW9uLXN5bnRheCoKCkV4cHJlc3Npb24gc3ludGF4IHN1bW1hcnksIGZyb20gbGVhc3QgdG8gbW9zdCBzaWduaWZpY2FudDoKCnxleHByMXwgZXhwcjIgPyBleHByMSA6IGV4cHIxCWlmLXRoZW4tZWxzZQoKfGV4cHIyfAlleHByMyB8fCBleHByMyAuLglsb2dpY2FsIE9SCgp8ZXhwcjN8CWV4cHI0ICYmIGV4cHI0IC4uCWxvZ2ljYWwgQU5ECgp8ZXhwcjR8CWV4cHI1ID09IGV4cHI1CQllcXVhbAoJZXhwcjUgIT0gZXhwcjUJCW5vdCBlcXVhbAoJZXhwcjUgPgkgZXhwcjUJCWdyZWF0ZXIgdGhhbgoJZXhwcjUgPj0gZXhwcjUJCWdyZWF0ZXIgdGhhbiBvciBlcXVhbAoJZXhwcjUgPAkgZXhwcjUJCXNtYWxsZXIgdGhhbgoJZXhwcjUgPD0gZXhwcjUJCXNtYWxsZXIgdGhhbiBvciBlcXVhbAoJZXhwcjUgPX4gZXhwcjUJCXJlZ2V4cCBtYXRjaGVzCglleHByNSAhfiBleHByNQkJcmVnZXhwIGRvZXNuJ3QgbWF0Y2gKCglleHByNSA9PT8gZXhwcjUJCWVxdWFsLCBpZ25vcmluZyBjYXNlCglleHByNSA9PSMgZXhwcjUJCWVxdWFsLCBtYXRjaCBjYXNlCglldGMuCQkJQXMgYWJvdmUsIGFwcGVuZCA/IGZvciBpZ25vcmluZyBjYXNlLCAjIGZvcgoJCQkJbWF0Y2hpbmcgY2FzZQoKCWV4cHI1IGlzIGV4cHI1CQlzYW1lIHxMaXN0fCBpbnN0YW5jZQoJZXhwcjUgaXNub3QgZXhwcjUJZGlmZmVyZW50IHxMaXN0fCBpbnN0YW5jZQoKfGV4cHI1fAlleHByNiArCSBleHByNiAuLgludW1iZXIgYWRkaXRpb24gb3IgbGlzdCBjb25jYXRlbmF0aW9uCglleHByNiAtCSBleHByNiAuLgludW1iZXIgc3VidHJhY3Rpb24KCWV4cHI2IC4JIGV4cHI2IC4uCXN0cmluZyBjb25jYXRlbmF0aW9uCgp8ZXhwcjZ8CWV4cHI3ICoJIGV4cHI3IC4uCW51bWJlciBtdWx0aXBsaWNhdGlvbgoJZXhwcjcgLwkgZXhwcjcgLi4JbnVtYmVyIGRpdmlzaW9uCglleHByNyAlCSBleHByNyAuLgludW1iZXIgbW9kdWxvCgp8ZXhwcjd8CSEgZXhwcjcJCQlsb2dpY2FsIE5PVAoJLSBleHByNwkJCXVuYXJ5IG1pbnVzCgkrIGV4cHI3CQkJdW5hcnkgcGx1cwoKfGV4cHI4fAlleHByOFtleHByMV0JCWJ5dGUgb2YgYSBTdHJpbmcgb3IgaXRlbSBvZiBhIHxMaXN0fAoJZXhwcjhbZXhwcjEgOiBleHByMV0Jc3Vic3RyaW5nIG9mIGEgU3RyaW5nIG9yIHN1Ymxpc3Qgb2YgYSB8TGlzdHwKCWV4cHI4Lm5hbWUJCWVudHJ5IGluIGEgfERpY3Rpb25hcnl8CglleHByOChleHByMSwgLi4uKQlmdW5jdGlvbiBjYWxsIHdpdGggfEZ1bmNyZWZ8IHZhcmlhYmxlCgp8ZXhwcjl8IG51bWJlcgkJCW51bWJlciBjb25zdGFudAoJInN0cmluZyIJCXN0cmluZyBjb25zdGFudCwgYmFja3NsYXNoIGlzIHNwZWNpYWwKCSdzdHJpbmcnCQlzdHJpbmcgY29uc3RhbnQsICcgaXMgZG91YmxlZAoJW2V4cHIxLCAuLi5dCQl8TGlzdHwKCXtleHByMTogZXhwcjEsIC4uLn0JfERpY3Rpb25hcnl8Cgkmb3B0aW9uCQkJb3B0aW9uIHZhbHVlCgkoZXhwcjEpCQkJbmVzdGVkIGV4cHJlc3Npb24KCXZhcmlhYmxlCQlpbnRlcm5hbCB2YXJpYWJsZQoJdmF7cmlhfWJsZQkJaW50ZXJuYWwgdmFyaWFibGUgd2l0aCBjdXJseSBicmFjZXMKCSRWQVIJCQllbnZpcm9ubWVudCB2YXJpYWJsZQoJQHIJCQljb250ZW50cyBvZiByZWdpc3RlciAncicKCWZ1bmN0aW9uKGV4cHIxLCAuLi4pCWZ1bmN0aW9uIGNhbGwKCWZ1bmN7dGl9b24oZXhwcjEsIC4uLikJZnVuY3Rpb24gY2FsbCB3aXRoIGN1cmx5IGJyYWNlcwoKCiIuLiIgaW5kaWNhdGVzIHRoYXQgdGhlIG9wZXJhdGlvbnMgaW4gdGhpcyBsZXZlbCBjYW4gYmUgY29uY2F0ZW5hdGVkLgpFeGFtcGxlOiA+CgkmbnUgfHwgJmxpc3QgJiYgJnNoZWxsID09ICJjc2giCgpBbGwgZXhwcmVzc2lvbnMgd2l0aGluIG9uZSBsZXZlbCBhcmUgcGFyc2VkIGZyb20gbGVmdCB0byByaWdodC4KCgpleHByMQkJCQkJCQkqZXhwcjEqICpFMTA5KgotLS0tLQoKZXhwcjIgPyBleHByMSA6IGV4cHIxCgpUaGUgZXhwcmVzc2lvbiBiZWZvcmUgdGhlICc/JyBpcyBldmFsdWF0ZWQgdG8gYSBudW1iZXIuICBJZiBpdCBldmFsdWF0ZXMgdG8Kbm9uLXplcm8sIHRoZSByZXN1bHQgaXMgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGJldHdlZW4gdGhlICc/JyBhbmQgJzonLApvdGhlcndpc2UgdGhlIHJlc3VsdCBpcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gYWZ0ZXIgdGhlICc6Jy4KRXhhbXBsZTogPgoJOmVjaG8gbG51bSA9PSAxID8gInRvcCIgOiBsbnVtCgpTaW5jZSB0aGUgZmlyc3QgZXhwcmVzc2lvbiBpcyBhbiAiZXhwcjIiLCBpdCBjYW5ub3QgY29udGFpbiBhbm90aGVyID86LiAgVGhlCm90aGVyIHR3byBleHByZXNzaW9ucyBjYW4sIHRodXMgYWxsb3cgZm9yIHJlY3Vyc2l2ZSB1c2Ugb2YgPzouCkV4YW1wbGU6ID4KCTplY2hvIGxudW0gPT0gMSA/ICJ0b3AiIDogbG51bSA9PSAxMDAwID8gImxhc3QiIDogbG51bQoKVG8ga2VlcCB0aGlzIHJlYWRhYmxlLCB1c2luZyB8bGluZS1jb250aW51YXRpb258IGlzIHN1Z2dlc3RlZDogPgoJOmVjaG8gbG51bSA9PSAxCgk6XAk/ICJ0b3AiCgk6XAk6IGxudW0gPT0gMTAwMAoJOlwJCT8gImxhc3QiCgk6XAkJOiBsbnVtCgpZb3Ugc2hvdWxkIGFsd2F5cyBwdXQgYSBzcGFjZSBiZWZvcmUgdGhlICc6Jywgb3RoZXJ3aXNlIGl0IGNhbiBiZSBtaXN0YWtlbiBmb3IKdXNlIGluIGEgdmFyaWFibGUgc3VjaCBhcyAiYToxIi4KCgpleHByMiBhbmQgZXhwcjMJCQkJCQkqZXhwcjIqICpleHByMyoKLS0tLS0tLS0tLS0tLS0tCgoJCQkJCSpleHByLWJhcmJhciogKmV4cHItJiYqClRoZSAifHwiIGFuZCAiJiYiIG9wZXJhdG9ycyB0YWtlIG9uZSBhcmd1bWVudCBvbiBlYWNoIHNpZGUuICBUaGUgYXJndW1lbnRzCmFyZSAoY29udmVydGVkIHRvKSBOdW1iZXJzLiAgVGhlIHJlc3VsdCBpczoKCgkgaW5wdXQJCQkJIG91dHB1dCB+Cm4xCQluMgkJbjEgfHwgbjIJbjEgJiYgbjIgfgp6ZXJvCQl6ZXJvCQl6ZXJvCQl6ZXJvCnplcm8JCW5vbi16ZXJvCW5vbi16ZXJvCXplcm8Kbm9uLXplcm8JemVybwkJbm9uLXplcm8JemVybwpub24temVybwlub24temVybwlub24temVybwlub24temVybwoKVGhlIG9wZXJhdG9ycyBjYW4gYmUgY29uY2F0ZW5hdGVkLCBmb3IgZXhhbXBsZTogPgoKCSZudSB8fCAmbGlzdCAmJiAmc2hlbGwgPT0gImNzaCIKCk5vdGUgdGhhdCAiJiYiIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAifHwiLCBzbyB0aGlzIGhhcyB0aGUgbWVhbmluZyBvZjogPgoKCSZudSB8fCAoJmxpc3QgJiYgJnNoZWxsID09ICJjc2giKQoKT25jZSB0aGUgcmVzdWx0IGlzIGtub3duLCB0aGUgZXhwcmVzc2lvbiAic2hvcnQtY2lyY3VpdHMiLCB0aGF0IGlzLCBmdXJ0aGVyCmFyZ3VtZW50cyBhcmUgbm90IGV2YWx1YXRlZC4gIFRoaXMgaXMgbGlrZSB3aGF0IGhhcHBlbnMgaW4gQy4gIEZvciBleGFtcGxlOiA+CgoJbGV0IGEgPSAxCgllY2hvIGEgfHwgYgoKVGhpcyBpcyB2YWxpZCBldmVuIGlmIHRoZXJlIGlzIG5vIHZhcmlhYmxlIGNhbGxlZCAiYiIgYmVjYXVzZSAiYSIgaXMgbm9uLXplcm8sCnNvIHRoZSByZXN1bHQgbXVzdCBiZSBub24temVyby4gIFNpbWlsYXJseSBiZWxvdzogPgoKCWVjaG8gZXhpc3RzKCJiIikgJiYgYiA9PSAieWVzIgoKVGhpcyBpcyB2YWxpZCB3aGV0aGVyICJiIiBoYXMgYmVlbiBkZWZpbmVkIG9yIG5vdC4gIFRoZSBzZWNvbmQgY2xhdXNlIHdpbGwKb25seSBiZSBldmFsdWF0ZWQgaWYgImIiIGhhcyBiZWVuIGRlZmluZWQuCgoKZXhwcjQJCQkJCQkJKmV4cHI0KgotLS0tLQoKZXhwcjUge2NtcH0gZXhwcjUKCkNvbXBhcmUgdHdvIGV4cHI1IGV4cHJlc3Npb25zLCByZXN1bHRpbmcgaW4gYSAwIGlmIGl0IGV2YWx1YXRlcyB0byBmYWxzZSwgb3IgMQppZiBpdCBldmFsdWF0ZXMgdG8gdHJ1ZS4KCgkJCSpleHByLT09KiAgKmV4cHItIT0qICAqZXhwci0+KgkgKmV4cHItPj0qCgkJCSpleHByLTwqICAgKmV4cHItPD0qICAqZXhwci09fiogICpleHByLSF+KgoJCQkqZXhwci09PSMqICpleHByLSE9IyogKmV4cHItPiMqICAqZXhwci0+PSMqCgkJCSpleHByLTwjKiAgKmV4cHItPD0jKiAqZXhwci09fiMqICpleHByLSF+IyoKCQkJKmV4cHItPT0/KiAqZXhwci0hPT8qICpleHByLT4/KiAgKmV4cHItPj0/KgoJCQkqZXhwci08PyogICpleHByLTw9PyogKmV4cHItPX4/KiAqZXhwci0hfj8qCgkJCSpleHByLWlzKiAqZXhwci1pc25vdCogKmV4cHItaXMjKiAqZXhwci1pc25vdCMqCgkJCSpleHByLWlzPyogKmV4cHItaXNub3Q/KgoJCXVzZSAnaWdub3JlY2FzZScgICAgbWF0Y2ggY2FzZQkgICBpZ25vcmUgY2FzZSB+CmVxdWFsCQkJPT0JCT09IwkJPT0/Cm5vdCBlcXVhbAkJIT0JCSE9IwkJIT0/CmdyZWF0ZXIgdGhhbgkJPgkJPiMJCT4/CmdyZWF0ZXIgdGhhbiBvciBlcXVhbAk+PQkJPj0jCQk+PT8Kc21hbGxlciB0aGFuCQk8CQk8IwkJPD8Kc21hbGxlciB0aGFuIG9yIGVxdWFsCTw9CQk8PSMJCTw9PwpyZWdleHAgbWF0Y2hlcwkJPX4JCT1+IwkJPX4/CnJlZ2V4cCBkb2Vzbid0IG1hdGNoCSF+CQkhfiMJCSF+PwpzYW1lIGluc3RhbmNlCQlpcwkJaXMjCQlpcz8KZGlmZmVyZW50IGluc3RhbmNlCWlzbm90CQlpc25vdCMJCWlzbm90PwoKRXhhbXBsZXM6CiJhYmMiID09IyAiQWJjIgkgIGV2YWx1YXRlcyB0byAwCiJhYmMiID09PyAiQWJjIgkgIGV2YWx1YXRlcyB0byAxCiJhYmMiID09ICJBYmMiCSAgZXZhbHVhdGVzIHRvIDEgaWYgJ2lnbm9yZWNhc2UnIGlzIHNldCwgMCBvdGhlcndpc2UKCgkJCQkJCQkqRTY5MSogKkU2OTIqCkEgfExpc3R8IGNhbiBvbmx5IGJlIGNvbXBhcmVkIHdpdGggYSB8TGlzdHwgYW5kIG9ubHkgImVxdWFsIiwgIm5vdCBlcXVhbCIgYW5kCiJpcyIgY2FuIGJlIHVzZWQuICBUaGlzIGNvbXBhcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGxpc3QsIHJlY3Vyc2l2ZWx5LgpJZ25vcmluZyBjYXNlIG1lYW5zIGNhc2UgaXMgaWdub3JlZCB3aGVuIGNvbXBhcmluZyBpdGVtIHZhbHVlcy4KCgkJCQkJCQkqRTczNSogKkU3MzYqCkEgfERpY3Rpb25hcnl8IGNhbiBvbmx5IGJlIGNvbXBhcmVkIHdpdGggYSB8RGljdGlvbmFyeXwgYW5kIG9ubHkgImVxdWFsIiwgIm5vdAplcXVhbCIgYW5kICJpcyIgY2FuIGJlIHVzZWQuICBUaGlzIGNvbXBhcmVzIHRoZSBrZXkvdmFsdWVzIG9mIHRoZSB8RGljdGlvbmFyeXwKcmVjdXJzaXZlbHkuICBJZ25vcmluZyBjYXNlIG1lYW5zIGNhc2UgaXMgaWdub3JlZCB3aGVuIGNvbXBhcmluZyBpdGVtIHZhbHVlcy4KCgkJCQkJCQkqRTY5MyogKkU2OTQqCkEgfEZ1bmNyZWZ8IGNhbiBvbmx5IGJlIGNvbXBhcmVkIHdpdGggYSB8RnVuY3JlZnwgYW5kIG9ubHkgImVxdWFsIiBhbmQgIm5vdAplcXVhbCIgY2FuIGJlIHVzZWQuICBDYXNlIGlzIG5ldmVyIGlnbm9yZWQuCgpXaGVuIHVzaW5nICJpcyIgb3IgImlzbm90IiB3aXRoIGEgfExpc3R8IG9yIGEgfERpY3Rpb25hcnl8IHRoaXMgY2hlY2tzIGlmIHRoZQpleHByZXNzaW9ucyBhcmUgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIHxMaXN0fCBvciB8RGljdGlvbmFyeXwgaW5zdGFuY2UuICBBIGNvcHkKb2YgYSB8TGlzdHwgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHxMaXN0fC4gIFdoZW4gdXNpbmcgImlzIiB3aXRob3V0CmEgfExpc3R8IG9yIGEgfERpY3Rpb25hcnl8IGl0IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgImVxdWFsIiwgdXNpbmcgImlzbm90IgplcXVpdmFsZW50IHRvIHVzaW5nICJub3QgZXF1YWwiLiAgRXhjZXB0IHRoYXQgYSBkaWZmZXJlbnQgdHlwZSBtZWFucyB0aGUKdmFsdWVzIGFyZSBkaWZmZXJlbnQ6ICI0ID09ICc0JyIgaXMgdHJ1ZSwgIjQgaXMgJzQnIiBpcyBmYWxzZSBhbmQgIjAgaXMgW10iIGlzCmZhbHNlIGFuZCBub3QgYW4gZXJyb3IuICJpcyMiLyJpc25vdCMiIGFuZCAiaXM/Ii8iaXNub3Q/IiBjYW4gYmUgdXNlZCB0byBtYXRjaAphbmQgaWdub3JlIGNhc2UuCgpXaGVuIGNvbXBhcmluZyBhIFN0cmluZyB3aXRoIGEgTnVtYmVyLCB0aGUgU3RyaW5nIGlzIGNvbnZlcnRlZCB0byBhIE51bWJlciwKYW5kIHRoZSBjb21wYXJpc29uIGlzIGRvbmUgb24gTnVtYmVycy4JVGhpcyBtZWFucyB0aGF0ICIwID09ICd4JyIgaXMgVFJVRSwKYmVjYXVzZSAneCcgY29udmVydGVkIHRvIGEgTnVtYmVyIGlzIHplcm8uCgpXaGVuIGNvbXBhcmluZyB0d28gU3RyaW5ncywgdGhpcyBpcyBkb25lIHdpdGggc3RyY21wKCkgb3Igc3RyaWNtcCgpLiAgVGhpcwpyZXN1bHRzIGluIHRoZSBtYXRoZW1hdGljYWwgZGlmZmVyZW5jZSAoY29tcGFyaW5nIGJ5dGUgdmFsdWVzKSwgbm90Cm5lY2Vzc2FyaWx5IHRoZSBhbHBoYWJldGljYWwgZGlmZmVyZW5jZSBpbiB0aGUgbG9jYWwgbGFuZ3VhZ2UuCgpXaGVuIHVzaW5nIHRoZSBvcGVyYXRvcnMgd2l0aCBhIHRyYWlsaW5nICcjJywgb3IgdGhlIHNob3J0IHZlcnNpb24gYW5kCidpZ25vcmVjYXNlJyBpcyBvZmYsIHRoZSBjb21wYXJpbmcgaXMgZG9uZSB3aXRoIHN0cmNtcCgpOiBjYXNlIG1hdHRlcnMuCgpXaGVuIHVzaW5nIHRoZSBvcGVyYXRvcnMgd2l0aCBhIHRyYWlsaW5nICc/Jywgb3IgdGhlIHNob3J0IHZlcnNpb24gYW5kCidpZ25vcmVjYXNlJyBpcyBzZXQsIHRoZSBjb21wYXJpbmcgaXMgZG9uZSB3aXRoIHN0cmljbXAoKTogY2FzZSBpcyBpZ25vcmVkLgoKJ3NtYXJ0Y2FzZScgaXMgbm90IHVzZWQuCgpUaGUgIj1+IiBhbmQgIiF+IiBvcGVyYXRvcnMgbWF0Y2ggdGhlIGxlZnRoYW5kIGFyZ3VtZW50IHdpdGggdGhlIHJpZ2h0aGFuZAphcmd1bWVudCwgd2hpY2ggaXMgdXNlZCBhcyBhIHBhdHRlcm4uICBTZWUgfHBhdHRlcm58IGZvciB3aGF0IGEgcGF0dGVybiBpcy4KVGhpcyBtYXRjaGluZyBpcyBhbHdheXMgZG9uZSBsaWtlICdtYWdpYycgd2FzIHNldCBhbmQgJ2Nwb3B0aW9ucycgaXMgZW1wdHksIG5vCm1hdHRlciB3aGF0IHRoZSBhY3R1YWwgdmFsdWUgb2YgJ21hZ2ljJyBvciAnY3BvcHRpb25zJyBpcy4gIFRoaXMgbWFrZXMgc2NyaXB0cwpwb3J0YWJsZS4gIFRvIGF2b2lkIGJhY2tzbGFzaGVzIGluIHRoZSByZWdleHAgcGF0dGVybiB0byBiZSBkb3VibGVkLCB1c2UgYQpzaW5nbGUtcXVvdGUgc3RyaW5nLCBzZWUgfGxpdGVyYWwtc3RyaW5nfC4KU2luY2UgYSBzdHJpbmcgaXMgY29uc2lkZXJlZCB0byBiZSBhIHNpbmdsZSBsaW5lLCBhIG11bHRpLWxpbmUgcGF0dGVybgooY29udGFpbmluZyBcbiwgYmFja3NsYXNoLW4pIHdpbGwgbm90IG1hdGNoLiAgSG93ZXZlciwgYSBsaXRlcmFsIE5MIGNoYXJhY3RlcgpjYW4gYmUgbWF0Y2hlZCBsaWtlIGFuIG9yZGluYXJ5IGNoYXJhY3Rlci4gIEV4YW1wbGVzOgoJImZvb1xuYmFyIiA9fiAiXG4iCWV2YWx1YXRlcyB0byAxCgkiZm9vXG5iYXIiID1+ICJcXG4iCWV2YWx1YXRlcyB0byAwCgoKZXhwcjUgYW5kIGV4cHI2CQkJCQkJKmV4cHI1KiAqZXhwcjYqCi0tLS0tLS0tLS0tLS0tLQpleHByNiArCSBleHByNiAuLglOdW1iZXIgYWRkaXRpb24gb3IgfExpc3R8IGNvbmNhdGVuYXRpb24JKmV4cHItKyoKZXhwcjYgLQkgZXhwcjYgLi4JTnVtYmVyIHN1YnRyYWN0aW9uCQkJKmV4cHItLSoKZXhwcjYgLgkgZXhwcjYgLi4JU3RyaW5nIGNvbmNhdGVuYXRpb24JCQkqZXhwci0uKgoKRm9yIHxMaXN0c3wgb25seSAiKyIgaXMgcG9zc2libGUgYW5kIHRoZW4gYm90aCBleHByNiBtdXN0IGJlIGEgbGlzdC4gIFRoZQpyZXN1bHQgaXMgYSBuZXcgbGlzdCB3aXRoIHRoZSB0d28gbGlzdHMgQ29uY2F0ZW5hdGVkLgoKZXhwcjcgKgkgZXhwcjcgLi4JTnVtYmVyIG11bHRpcGxpY2F0aW9uCQkJKmV4cHItc3RhcioKZXhwcjcgLwkgZXhwcjcgLi4JTnVtYmVyIGRpdmlzaW9uCQkJCSpleHByLS8qCmV4cHI3ICUJIGV4cHI3IC4uCU51bWJlciBtb2R1bG8JCQkJKmV4cHItJSoKCkZvciBhbGwsIGV4Y2VwdCAiLiIsIFN0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byBOdW1iZXJzLgpGb3IgYml0d2lzZSBvcGVyYXRvcnMgc2VlIHxhbmQoKXwsIHxvcigpfCBhbmQgfHhvcigpfC4KCk5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiKyIgYW5kICIuIjoKCSIxMjMiICsgIjQ1NiIgPSA1NzkKCSIxMjMiIC4gIjQ1NiIgPSAiMTIzNDU2IgoKU2luY2UgJy4nIGhhcyB0aGUgc2FtZSBwcmVjZWRlbmNlIGFzICcrJyBhbmQgJy0nLCB5b3UgbmVlZCB0byByZWFkOiA+CgkxIC4gOTAgKyA5MC4wCkFzOiA+CgkoMSAuIDkwKSArIDkwLjAKVGhhdCB3b3Jrcywgc2luY2UgdGhlIFN0cmluZyAiMTkwIiBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byB0aGUgTnVtYmVyCjE5MCwgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHRoZSBGbG9hdCA5MC4wLiAgSG93ZXZlcjogPgoJMSAuIDkwICogOTAuMApTaG91bGQgYmUgcmVhZCBhczogPgoJMSAuICg5MCAqIDkwLjApClNpbmNlICcuJyBoYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuICcqJy4gIFRoaXMgZG9lcyBOT1Qgd29yaywgc2luY2UgdGhpcwphdHRlbXB0cyB0byBjb25jYXRlbmF0ZSBhIEZsb2F0IGFuZCBhIFN0cmluZy4KCldoZW4gZGl2aWRpbmcgYSBOdW1iZXIgYnkgemVybyB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIHZhbHVlOgoJICAwIC8gMCAgPSAtMHg4MDAwMDAwMAkobGlrZSBOYU4gZm9yIEZsb2F0KQoJID4wIC8gMCAgPSAgMHg3ZmZmZmZmZgkobGlrZSBwb3NpdGl2ZSBpbmZpbml0eSkKCSA8MCAvIDAgID0gLTB4N2ZmZmZmZmYJKGxpa2UgbmVnYXRpdmUgaW5maW5pdHkpCgkoYmVmb3JlIFZpbSA3LjIgaXQgd2FzIGFsd2F5cyAweDdmZmZmZmZmKQoKV2hlbiB0aGUgcmlnaHRoYW5kIHNpZGUgb2YgJyUnIGlzIHplcm8sIHRoZSByZXN1bHQgaXMgMC4KCk5vbmUgb2YgdGhlc2Ugd29yayBmb3IgfEZ1bmNyZWZ8cy4KCi4gYW5kICUgZG8gbm90IHdvcmsgZm9yIEZsb2F0LiAqRTgwNCoKCgpleHByNwkJCQkJCQkqZXhwcjcqCi0tLS0tCiEgZXhwcjcJCQlsb2dpY2FsIE5PVAkJKmV4cHItISoKLSBleHByNwkJCXVuYXJ5IG1pbnVzCQkqZXhwci11bmFyeS0tKgorIGV4cHI3CQkJdW5hcnkgcGx1cwkJKmV4cHItdW5hcnktKyoKCkZvciAnIScgbm9uLXplcm8gYmVjb21lcyB6ZXJvLCB6ZXJvIGJlY29tZXMgb25lLgpGb3IgJy0nIHRoZSBzaWduIG9mIHRoZSBudW1iZXIgaXMgY2hhbmdlZC4KRm9yICcrJyB0aGUgbnVtYmVyIGlzIHVuY2hhbmdlZC4KCkEgU3RyaW5nIHdpbGwgYmUgY29udmVydGVkIHRvIGEgTnVtYmVyIGZpcnN0LgoKVGhlc2UgdGhyZWUgY2FuIGJlIHJlcGVhdGVkIGFuZCBtaXhlZC4JRXhhbXBsZXM6CgkhLTEJICAgID09IDAKCSEhOAkgICAgPT0gMQoJLS05CSAgICA9PSA5CgoKZXhwcjgJCQkJCQkJKmV4cHI4KgotLS0tLQpleHByOFtleHByMV0JCWl0ZW0gb2YgU3RyaW5nIG9yIHxMaXN0fAkqZXhwci1bXSogKkUxMTEqCgkJCQkJCQkqRTkwOSoKSWYgZXhwcjggaXMgYSBOdW1iZXIgb3IgU3RyaW5nIHRoaXMgcmVzdWx0cyBpbiBhIFN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZQpleHByMSd0aCBzaW5nbGUgYnl0ZSBmcm9tIGV4cHI4LiAgZXhwcjggaXMgdXNlZCBhcyBhIFN0cmluZywgZXhwcjEgYXMgYQpOdW1iZXIuICBUaGlzIGRvZXNuJ3QgcmVjb2duaXplIG11bHRpLWJ5dGUgZW5jb2RpbmdzLCBzZWUgfGJ5dGVpZHgoKXwgZm9yCmFuIGFsdGVybmF0aXZlLgoKSW5kZXggemVybyBnaXZlcyB0aGUgZmlyc3QgYnl0ZS4gIFRoaXMgaXMgbGlrZSBpdCB3b3JrcyBpbiBDLiAgQ2FyZWZ1bDoKdGV4dCBjb2x1bW4gbnVtYmVycyBzdGFydCB3aXRoIG9uZSEgIEV4YW1wbGUsIHRvIGdldCB0aGUgYnl0ZSB1bmRlciB0aGUKY3Vyc29yOiA+Cgk6bGV0IGMgPSBnZXRsaW5lKCIuIilbY29sKCIuIikgLSAxXQoKSWYgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nIGlzIGxlc3MgdGhhbiB0aGUgaW5kZXgsIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkKU3RyaW5nLiAgQSBuZWdhdGl2ZSBpbmRleCBhbHdheXMgcmVzdWx0cyBpbiBhbiBlbXB0eSBzdHJpbmcgKHJlYXNvbjogYmFja3dhcmQKY29tcGF0aWJpbGl0eSkuICBVc2UgWy0xOl0gdG8gZ2V0IHRoZSBsYXN0IGJ5dGUuCgpJZiBleHByOCBpcyBhIHxMaXN0fCB0aGVuIGl0IHJlc3VsdHMgdGhlIGl0ZW0gYXQgaW5kZXggZXhwcjEuICBTZWUgfGxpc3QtaW5kZXh8CmZvciBwb3NzaWJsZSBpbmRleCB2YWx1ZXMuICBJZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlIHRoaXMgcmVzdWx0cyBpbiBhbgplcnJvci4JRXhhbXBsZTogPgoJOmxldCBpdGVtID0gbXlsaXN0Wy0xXQkJIiBnZXQgbGFzdCBpdGVtCgpHZW5lcmFsbHksIGlmIGEgfExpc3R8IGluZGV4IGlzIGVxdWFsIHRvIG9yIGhpZ2hlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCnxMaXN0fCwgb3IgbW9yZSBuZWdhdGl2ZSB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHxMaXN0fCwgdGhpcyByZXN1bHRzIGluIGFuCmVycm9yLgoKCmV4cHI4W2V4cHIxYSA6IGV4cHIxYl0Jc3Vic3RyaW5nIG9yIHN1Ymxpc3QJCSpleHByLVs6XSoKCklmIGV4cHI4IGlzIGEgTnVtYmVyIG9yIFN0cmluZyB0aGlzIHJlc3VsdHMgaW4gdGhlIHN1YnN0cmluZyB3aXRoIHRoZSBieXRlcwpmcm9tIGV4cHIxYSB0byBhbmQgaW5jbHVkaW5nIGV4cHIxYi4gIGV4cHI4IGlzIHVzZWQgYXMgYSBTdHJpbmcsIGV4cHIxYSBhbmQKZXhwcjFiIGFyZSB1c2VkIGFzIGEgTnVtYmVyLiAgVGhpcyBkb2Vzbid0IHJlY29nbml6ZSBtdWx0aS1ieXRlIGVuY29kaW5ncywgc2VlCnxieXRlaWR4KCl8IGZvciBjb21wdXRpbmcgdGhlIGluZGV4ZXMuCgpJZiBleHByMWEgaXMgb21pdHRlZCB6ZXJvIGlzIHVzZWQuICBJZiBleHByMWIgaXMgb21pdHRlZCB0aGUgbGVuZ3RoIG9mIHRoZQpzdHJpbmcgbWludXMgb25lIGlzIHVzZWQuCgpBIG5lZ2F0aXZlIG51bWJlciBjYW4gYmUgdXNlZCB0byBtZWFzdXJlIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgLTEgaXMKdGhlIGxhc3QgY2hhcmFjdGVyLCAtMiB0aGUgbGFzdCBidXQgb25lLCBldGMuCgpJZiBhbiBpbmRleCBnb2VzIG91dCBvZiByYW5nZSBmb3IgdGhlIHN0cmluZyBjaGFyYWN0ZXJzIGFyZSBvbWl0dGVkLiAgSWYKZXhwcjFiIGlzIHNtYWxsZXIgdGhhbiBleHByMWEgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBzdHJpbmcuCgpFeGFtcGxlczogPgoJOmxldCBjID0gbmFtZVstMTpdCQkiIGxhc3QgYnl0ZSBvZiBhIHN0cmluZwoJOmxldCBjID0gbmFtZVstMjotMl0JCSIgbGFzdCBidXQgb25lIGJ5dGUgb2YgYSBzdHJpbmcKCTpsZXQgcyA9IGxpbmUoIi4iKVs0Ol0JCSIgZnJvbSB0aGUgZmlmdGggYnl0ZSB0byB0aGUgZW5kCgk6bGV0IHMgPSBzWzotM10JCQkiIHJlbW92ZSBsYXN0IHR3byBieXRlcwo8CgkJCQkJCQkqc3VibGlzdCogKnNsaWNlKgpJZiBleHByOCBpcyBhIHxMaXN0fCB0aGlzIHJlc3VsdHMgaW4gYSBuZXcgfExpc3R8IHdpdGggdGhlIGl0ZW1zIGluZGljYXRlZCBieQp0aGUgaW5kZXhlcyBleHByMWEgYW5kIGV4cHIxYi4JVGhpcyB3b3JrcyBsaWtlIHdpdGggYSBTdHJpbmcsIGFzIGV4cGxhaW5lZApqdXN0IGFib3ZlLCBleGNlcHQgdGhhdCBpbmRleGVzIG91dCBvZiByYW5nZSBjYXVzZSBhbiBlcnJvci4gIEV4YW1wbGVzOiA+Cgk6bGV0IGwgPSBteWxpc3RbOjNdCQkiIGZpcnN0IGZvdXIgaXRlbXMKCTpsZXQgbCA9IG15bGlzdFs0OjRdCQkiIExpc3Qgd2l0aCBvbmUgaXRlbQoJOmxldCBsID0gbXlsaXN0WzpdCQkiIHNoYWxsb3cgY29weSBvZiBhIExpc3QKClVzaW5nIGV4cHI4W2V4cHIxXSBvciBleHByOFtleHByMWEgOiBleHByMWJdIG9uIGEgfEZ1bmNyZWZ8IHJlc3VsdHMgaW4gYW4KZXJyb3IuCgpXYXRjaCBvdXQgZm9yIGNvbmZ1c2lvbiBiZXR3ZWVuIGEgbmFtZXNwYWNlIGFuZCBhIHZhcmlhYmxlIGZvbGxvd2VkIGJ5IGEgY29sb24KZm9yIGEgc3VibGlzdDogPgoJbXlsaXN0W246XSAgICAgIiB1c2VzIHZhcmlhYmxlIG4KCW15bGlzdFtzOl0gICAgICIgdXNlcyBuYW1lc3BhY2UgczosIGVycm9yIQoKCmV4cHI4Lm5hbWUJCWVudHJ5IGluIGEgfERpY3Rpb25hcnl8CQkqZXhwci1lbnRyeSoKCklmIGV4cHI4IGlzIGEgfERpY3Rpb25hcnl8IGFuZCBpdCBpcyBmb2xsb3dlZCBieSBhIGRvdCwgdGhlbiB0aGUgZm9sbG93aW5nCm5hbWUgd2lsbCBiZSB1c2VkIGFzIGEga2V5IGluIHRoZSB8RGljdGlvbmFyeXwuICBUaGlzIGlzIGp1c3QgbGlrZToKZXhwcjhbbmFtZV0uCgpUaGUgbmFtZSBtdXN0IGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGp1c3QgbGlrZSBhIHZhcmlhYmxlIG5hbWUsCmJ1dCBpdCBtYXkgc3RhcnQgd2l0aCBhIG51bWJlci4gIEN1cmx5IGJyYWNlcyBjYW5ub3QgYmUgdXNlZC4KClRoZXJlIG11c3Qgbm90IGJlIHdoaXRlIHNwYWNlIGJlZm9yZSBvciBhZnRlciB0aGUgZG90LgoKRXhhbXBsZXM6ID4KCTpsZXQgZGljdCA9IHsib25lIjogMSwgMjogInR3byJ9Cgk6ZWNobyBkaWN0Lm9uZQoJOmVjaG8gZGljdCAuMgoKTm90ZSB0aGF0IHRoZSBkb3QgaXMgYWxzbyB1c2VkIGZvciBTdHJpbmcgY29uY2F0ZW5hdGlvbi4gIFRvIGF2b2lkIGNvbmZ1c2lvbgphbHdheXMgcHV0IHNwYWNlcyBhcm91bmQgdGhlIGRvdCBmb3IgU3RyaW5nIGNvbmNhdGVuYXRpb24uCgoKZXhwcjgoZXhwcjEsIC4uLikJfEZ1bmNyZWZ8IGZ1bmN0aW9uIGNhbGwKCldoZW4gZXhwcjggaXMgYSB8RnVuY3JlZnwgdHlwZSB2YXJpYWJsZSwgaW52b2tlIHRoZSBmdW5jdGlvbiBpdCByZWZlcnMgdG8uCgoKCgkJCQkJCQkqZXhwcjkqCm51bWJlcgotLS0tLS0KbnVtYmVyCQkJbnVtYmVyIGNvbnN0YW50CQkJKmV4cHItbnVtYmVyKiAKCQkJCQkJKmhleC1udW1iZXIqICpvY3RhbC1udW1iZXIqCgpEZWNpbWFsLCBIZXhhZGVjaW1hbCAoc3RhcnRpbmcgd2l0aCAweCBvciAwWCksIG9yIE9jdGFsIChzdGFydGluZyB3aXRoIDApLgoKCQkJCQkJKmZsb2F0aW5nLXBvaW50LWZvcm1hdCoKRmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjYW4gYmUgd3JpdHRlbiBpbiB0d28gZm9ybXM6CgoJWy0rXXtOfS57TX0KCVstK117Tn0ue019W2VFXVstK117ZXhwfQoKe059IGFuZCB7TX0gYXJlIG51bWJlcnMuICBCb3RoIHtOfSBhbmQge019IG11c3QgYmUgcHJlc2VudCBhbmQgY2FuIG9ubHkKY29udGFpbiBkaWdpdHMuClstK10gbWVhbnMgdGhlcmUgaXMgYW4gb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduLgp7ZXhwfSBpcyB0aGUgZXhwb25lbnQsIHBvd2VyIG9mIDEwLgpPbmx5IGEgZGVjaW1hbCBwb2ludCBpcyBhY2NlcHRlZCwgbm90IGEgY29tbWEuCU5vIG1hdHRlciB3aGF0IHRoZSBjdXJyZW50CmxvY2FsZSBpcy4Ke29ubHkgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoKRXhhbXBsZXM6CgkxMjMuNDU2CgkrMC4wMDAxCgk1NS4wCgktMC4xMjMKCTEuMjM0ZTAzCgkxLjBFLTYKCS0zLjE0MTZlKzg4CgpUaGVzZSBhcmUgSU5WQUxJRDoKCTMuCQllbXB0eSB7TX0KCTFlNDAJCW1pc3NpbmcgLntNfQoKCQkJCQkJCSpmbG9hdC1waSogKmZsb2F0LWUqCkEgZmV3IHVzZWZ1bCB2YWx1ZXMgdG8gY29weSZwYXN0ZTogPgoJOmxldCBwaSA9IDMuMTQxNTkyNjUzNTkKCTpsZXQgZSAgPSAyLjcxODI4MTgyODQ2CgpSYXRpb25hbGU6CkJlZm9yZSBmbG9hdGluZyBwb2ludCB3YXMgaW50cm9kdWNlZCwgdGhlIHRleHQgIjEyMy40NTYiIHdhcyBpbnRlcnByZXRlZCBhcwp0aGUgdHdvIG51bWJlcnMgIjEyMyIgYW5kICI0NTYiLCBib3RoIGNvbnZlcnRlZCB0byBhIHN0cmluZyBhbmQgY29uY2F0ZW5hdGVkLApyZXN1bHRpbmcgaW4gdGhlIHN0cmluZyAiMTIzNDU2Ii4gIFNpbmNlIHRoaXMgd2FzIGNvbnNpZGVyZWQgcG9pbnRsZXNzLCBhbmQgd2UKY291bGQgbm90IGZpbmQgaXQgaW50ZW50aW9uYWxseSBiZWluZyB1c2VkIGluIFZpbSBzY3JpcHRzLCB0aGlzIGJhY2t3YXJkcwppbmNvbXBhdGliaWxpdHkgd2FzIGFjY2VwdGVkIGluIGZhdm9yIG9mIGJlaW5nIGFibGUgdG8gdXNlIHRoZSBub3JtYWwgbm90YXRpb24KZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCgoJCQkJCQkqZmxvYXRpbmctcG9pbnQtcHJlY2lzaW9uKgpUaGUgcHJlY2lzaW9uIGFuZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludHMgbnVtYmVycyBkZXBlbmRzIG9uIHdoYXQgImRvdWJsZSIKbWVhbnMgaW4gdGhlIGxpYnJhcnkgVmltIHdhcyBjb21waWxlZCB3aXRoLiAgVGhlcmUgaXMgbm8gd2F5IHRvIGNoYW5nZSB0aGlzIGF0CnJ1bnRpbWUuCgpUaGUgZGVmYXVsdCBmb3IgZGlzcGxheWluZyBhIHxGbG9hdHwgaXMgdG8gdXNlIDYgZGVjaW1hbCBwbGFjZXMsIGxpa2UgdXNpbmcKcHJpbnRmKCIlZyIsIGYpLiAgWW91IGNhbiBzZWxlY3Qgc29tZXRoaW5nIGVsc2Ugd2hlbiB1c2luZyB0aGUgfHByaW50ZigpfApmdW5jdGlvbi4gIEV4YW1wbGU6ID4KCTplY2hvIHByaW50ZignJS4xNWUnLCBhdGFuKDEpKQo8CTcuODUzOTgxNjMzOTc0NDgzZS0wMQoKCgpzdHJpbmcJCQkJCSpzdHJpbmcqICpTdHJpbmcqICpleHByLXN0cmluZyogKkUxMTQqCi0tLS0tLQoic3RyaW5nIgkJc3RyaW5nIGNvbnN0YW50CQkqZXhwci1xdW90ZSoKCk5vdGUgdGhhdCBkb3VibGUgcXVvdGVzIGFyZSB1c2VkLgoKQSBzdHJpbmcgY29uc3RhbnQgYWNjZXB0cyB0aGVzZSBzcGVjaWFsIGNoYXJhY3RlcnM6ClwuLi4JdGhyZWUtZGlnaXQgb2N0YWwgbnVtYmVyIChlLmcuLCAiXDMxNiIpClwuLgl0d28tZGlnaXQgb2N0YWwgbnVtYmVyIChtdXN0IGJlIGZvbGxvd2VkIGJ5IG5vbi1kaWdpdCkKXC4Jb25lLWRpZ2l0IG9jdGFsIG51bWJlciAobXVzdCBiZSBmb2xsb3dlZCBieSBub24tZGlnaXQpClx4Li4JYnl0ZSBzcGVjaWZpZWQgd2l0aCB0d28gaGV4IG51bWJlcnMgKGUuZy4sICJceDFmIikKXHguCWJ5dGUgc3BlY2lmaWVkIHdpdGggb25lIGhleCBudW1iZXIgKG11c3QgYmUgZm9sbG93ZWQgYnkgbm9uLWhleCBjaGFyKQpcWC4uCXNhbWUgYXMgXHguLgpcWC4Jc2FtZSBhcyBceC4KXHUuLi4uCWNoYXJhY3RlciBzcGVjaWZpZWQgd2l0aCB1cCB0byA0IGhleCBudW1iZXJzLCBzdG9yZWQgYWNjb3JkaW5nIHRvIHRoZQoJY3VycmVudCB2YWx1ZSBvZiAnZW5jb2RpbmcnIChlLmcuLCAiXHUwMmE0IikKXFUuLi4uCXNhbWUgYXMgXHUgYnV0IGFsbG93cyB1cCB0byA4IGhleCBudW1iZXJzLgpcYgliYWNrc3BhY2UgPEJTPgpcZQllc2NhcGUgPEVzYz4KXGYJZm9ybWZlZWQgPEZGPgpcbgluZXdsaW5lIDxOTD4KXHIJcmV0dXJuIDxDUj4KXHQJdGFiIDxUYWI+ClxcCWJhY2tzbGFzaApcIglkb3VibGUgcXVvdGUKXDx4eHg+CVNwZWNpYWwga2V5IG5hbWVkICJ4eHgiLiAgZS5nLiAiXDxDLVc+IiBmb3IgQ1RSTC1XLiAgVGhpcyBpcyBmb3IgdXNlCglpbiBtYXBwaW5ncywgdGhlIDB4ODAgYnl0ZSBpcyBlc2NhcGVkLiAgRG9uJ3QgdXNlIDxDaGFyLXh4eHg+IHRvIGdldCBhCgl1dGYtOCBjaGFyYWN0ZXIsIHVzZSBcdXh4eHggYXMgbWVudGlvbmVkIGFib3ZlLgoKTm90ZSB0aGF0ICJceGZmIiBpcyBzdG9yZWQgYXMgdGhlIGJ5dGUgMjU1LCB3aGljaCBtYXkgYmUgaW52YWxpZCBpbiBzb21lCmVuY29kaW5ncy4gIFVzZSAiXHUwMGZmIiB0byBzdG9yZSBjaGFyYWN0ZXIgMjU1IGFjY29yZGluZyB0byB0aGUgY3VycmVudCB2YWx1ZQpvZiAnZW5jb2RpbmcnLgoKTm90ZSB0aGF0ICJcMDAwIiBhbmQgIlx4MDAiIGZvcmNlIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KCgpsaXRlcmFsLXN0cmluZwkJCQkJCSpsaXRlcmFsLXN0cmluZyogKkUxMTUqCi0tLS0tLS0tLS0tLS0tLQonc3RyaW5nJwkJc3RyaW5nIGNvbnN0YW50CQkJKmV4cHItJyoKCk5vdGUgdGhhdCBzaW5nbGUgcXVvdGVzIGFyZSB1c2VkLgoKVGhpcyBzdHJpbmcgaXMgdGFrZW4gYXMgaXQgaXMuCU5vIGJhY2tzbGFzaGVzIGFyZSByZW1vdmVkIG9yIGhhdmUgYSBzcGVjaWFsCm1lYW5pbmcuICBUaGUgb25seSBleGNlcHRpb24gaXMgdGhhdCB0d28gcXVvdGVzIHN0YW5kIGZvciBvbmUgcXVvdGUuCgpTaW5nbGUgcXVvdGVkIHN0cmluZ3MgYXJlIHVzZWZ1bCBmb3IgcGF0dGVybnMsIHNvIHRoYXQgYmFja3NsYXNoZXMgZG8gbm90IG5lZWQKdG8gYmUgZG91YmxlZC4JVGhlc2UgdHdvIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50OiA+CglpZiBhID1+ICJcXHMqIgoJaWYgYSA9fiAnXHMqJwoKCm9wdGlvbgkJCQkJCSpleHByLW9wdGlvbiogKkUxMTIqICpFMTEzKgotLS0tLS0KJm9wdGlvbgkJCW9wdGlvbiB2YWx1ZSwgbG9jYWwgdmFsdWUgaWYgcG9zc2libGUKJmc6b3B0aW9uCQlnbG9iYWwgb3B0aW9uIHZhbHVlCiZsOm9wdGlvbgkJbG9jYWwgb3B0aW9uIHZhbHVlCgpFeGFtcGxlczogPgoJZWNobyAidGFic3RvcCBpcyAiIC4gJnRhYnN0b3AKCWlmICZpbnNlcnRtb2RlCgpBbnkgb3B0aW9uIG5hbWUgY2FuIGJlIHVzZWQgaGVyZS4gIFNlZSB8b3B0aW9uc3wuICBXaGVuIHVzaW5nIHRoZSBsb2NhbCB2YWx1ZQphbmQgdGhlcmUgaXMgbm8gYnVmZmVyLWxvY2FsIG9yIHdpbmRvdy1sb2NhbCB2YWx1ZSwgdGhlIGdsb2JhbCB2YWx1ZSBpcyB1c2VkCmFueXdheS4KCgpyZWdpc3RlcgkJCQkJCSpleHByLXJlZ2lzdGVyKiAqQHIqCi0tLS0tLS0tCkByCQkJY29udGVudHMgb2YgcmVnaXN0ZXIgJ3InCgpUaGUgcmVzdWx0IGlzIHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVnaXN0ZXIsIGFzIGEgc2luZ2xlIHN0cmluZy4KTmV3bGluZXMgYXJlIGluc2VydGVkIHdoZXJlIHJlcXVpcmVkLiAgVG8gZ2V0IHRoZSBjb250ZW50cyBvZiB0aGUgdW5uYW1lZApyZWdpc3RlciB1c2UgQCIgb3IgQEAuCVNlZSB8cmVnaXN0ZXJzfCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGF2YWlsYWJsZQpyZWdpc3RlcnMuCgpXaGVuIHVzaW5nIHRoZSAnPScgcmVnaXN0ZXIgeW91IGdldCB0aGUgZXhwcmVzc2lvbiBpdHNlbGYsIG5vdCB3aGF0IGl0CmV2YWx1YXRlcyB0by4gIFVzZSB8ZXZhbCgpfCB0byBldmFsdWF0ZSBpdC4KCgpuZXN0aW5nCQkJCQkJCSpleHByLW5lc3RpbmcqICpFMTEwKgotLS0tLS0tCihleHByMSkJCQluZXN0ZWQgZXhwcmVzc2lvbgoKCmVudmlyb25tZW50IHZhcmlhYmxlCQkJCQkqZXhwci1lbnYqCi0tLS0tLS0tLS0tLS0tLS0tLS0tCiRWQVIJCQllbnZpcm9ubWVudCB2YXJpYWJsZQoKVGhlIFN0cmluZyB2YWx1ZSBvZiBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGUuICBXaGVuIGl0IGlzIG5vdCBkZWZpbmVkLCB0aGUKcmVzdWx0IGlzIGFuIGVtcHR5IHN0cmluZy4KCQkJCQkJKmV4cHItZW52LWV4cGFuZCoKTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nICRWQVIgZGlyZWN0bHkgYW5kIHVzaW5nCmV4cGFuZCgiJFZBUiIpLiAgVXNpbmcgaXQgZGlyZWN0bHkgd2lsbCBvbmx5IGV4cGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdAphcmUga25vd24gaW5zaWRlIHRoZSBjdXJyZW50IFZpbSBzZXNzaW9uLiAgVXNpbmcgZXhwYW5kKCkgd2lsbCBmaXJzdCB0cnkgdXNpbmcKdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBrbm93biBpbnNpZGUgdGhlIGN1cnJlbnQgVmltIHNlc3Npb24uICBJZiB0aGF0CmZhaWxzLCBhIHNoZWxsIHdpbGwgYmUgdXNlZCB0byBleHBhbmQgdGhlIHZhcmlhYmxlLiAgVGhpcyBjYW4gYmUgc2xvdywgYnV0IGl0CmRvZXMgZXhwYW5kIGFsbCB2YXJpYWJsZXMgdGhhdCB0aGUgc2hlbGwga25vd3MgYWJvdXQuICBFeGFtcGxlOiA+Cgk6ZWNobyAkc2hlbGwKCTplY2hvIGV4cGFuZCgiJHNoZWxsIikKVGhlIGZpcnN0IG9uZSBwcm9iYWJseSBkb2Vzbid0IGVjaG8gYW55dGhpbmcsIHRoZSBzZWNvbmQgZWNob2VzIHRoZSAkc2hlbGwKdmFyaWFibGUgKGlmIHlvdXIgc2hlbGwgc3VwcG9ydHMgaXQpLgoKCmludGVybmFsIHZhcmlhYmxlCQkJCQkqZXhwci12YXJpYWJsZSoKLS0tLS0tLS0tLS0tLS0tLS0KdmFyaWFibGUJCWludGVybmFsIHZhcmlhYmxlClNlZSBiZWxvdyB8aW50ZXJuYWwtdmFyaWFibGVzfC4KCgpmdW5jdGlvbiBjYWxsCQkqZXhwci1mdW5jdGlvbiogKkUxMTYqICpFMTE4KiAqRTExOSogKkUxMjAqCi0tLS0tLS0tLS0tLS0KZnVuY3Rpb24oZXhwcjEsIC4uLikJZnVuY3Rpb24gY2FsbApTZWUgYmVsb3cgfGZ1bmN0aW9uc3wuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIEludGVybmFsIHZhcmlhYmxlCQkJCSppbnRlcm5hbC12YXJpYWJsZXMqICpFNDYxKgoKQW4gaW50ZXJuYWwgdmFyaWFibGUgbmFtZSBjYW4gYmUgbWFkZSB1cCBvZiBsZXR0ZXJzLCBkaWdpdHMgYW5kICdfJy4gIEJ1dCBpdApjYW5ub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LiAgSXQncyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBjdXJseSBicmFjZXMsIHNlZQp8Y3VybHktYnJhY2VzLW5hbWVzfC4KCkFuIGludGVybmFsIHZhcmlhYmxlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgIjpsZXQiIGNvbW1hbmQgfDpsZXR8LgpBbiBpbnRlcm5hbCB2YXJpYWJsZSBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCB3aXRoIHRoZSAiOnVubGV0IiBjb21tYW5kCnw6dW5sZXR8LgpVc2luZyBhIG5hbWUgdGhhdCBpcyBub3QgYW4gaW50ZXJuYWwgdmFyaWFibGUgb3IgcmVmZXJzIHRvIGEgdmFyaWFibGUgdGhhdCBoYXMKYmVlbiBkZXN0cm95ZWQgcmVzdWx0cyBpbiBhbiBlcnJvci4KClRoZXJlIGFyZSBzZXZlcmFsIG5hbWUgc3BhY2VzIGZvciB2YXJpYWJsZXMuICBXaGljaCBvbmUgaXMgdG8gYmUgdXNlZCBpcwpzcGVjaWZpZWQgYnkgd2hhdCBpcyBwcmVwZW5kZWQ6CgoJCShub3RoaW5nKSBJbiBhIGZ1bmN0aW9uOiBsb2NhbCB0byBhIGZ1bmN0aW9uOyBvdGhlcndpc2U6IGdsb2JhbAp8YnVmZmVyLXZhcmlhYmxlfCAgICBiOgkgIExvY2FsIHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KfHdpbmRvdy12YXJpYWJsZXwgICAgdzoJICBMb2NhbCB0byB0aGUgY3VycmVudCB3aW5kb3cuCnx0YWJwYWdlLXZhcmlhYmxlfCAgIHQ6CSAgTG9jYWwgdG8gdGhlIGN1cnJlbnQgdGFiIHBhZ2UuCnxnbG9iYWwtdmFyaWFibGV8ICAgIGc6CSAgR2xvYmFsLgp8bG9jYWwtdmFyaWFibGV8ICAgICBsOgkgIExvY2FsIHRvIGEgZnVuY3Rpb24uCnxzY3JpcHQtdmFyaWFibGV8ICAgIHM6CSAgTG9jYWwgdG8gYSB8OnNvdXJjZXwnZWQgVmltIHNjcmlwdC4KfGZ1bmN0aW9uLWFyZ3VtZW50fCAgYToJICBGdW5jdGlvbiBhcmd1bWVudCAob25seSBpbnNpZGUgYSBmdW5jdGlvbikuCnx2aW0tdmFyaWFibGV8ICAgICAgIHY6CSAgR2xvYmFsLCBwcmVkZWZpbmVkIGJ5IFZpbS4KClRoZSBzY29wZSBuYW1lIGJ5IGl0c2VsZiBjYW4gYmUgdXNlZCBhcyBhIHxEaWN0aW9uYXJ5fC4gIEZvciBleGFtcGxlLCB0bwpkZWxldGUgYWxsIHNjcmlwdC1sb2NhbCB2YXJpYWJsZXM6ID4KCTpmb3IgayBpbiBrZXlzKHM6KQoJOiAgICB1bmxldCBzOltrXQoJOmVuZGZvcgo8CgkJCQkJCSpidWZmZXItdmFyaWFibGUqICpiOnZhciogKmI6KgpBIHZhcmlhYmxlIG5hbWUgdGhhdCBpcyBwcmVjZWRlZCB3aXRoICJiOiIgaXMgbG9jYWwgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLgpUaHVzIHlvdSBjYW4gaGF2ZSBzZXZlcmFsICJiOmZvbyIgdmFyaWFibGVzLCBvbmUgZm9yIGVhY2ggYnVmZmVyLgpUaGlzIGtpbmQgb2YgdmFyaWFibGUgaXMgZGVsZXRlZCB3aGVuIHRoZSBidWZmZXIgaXMgd2lwZWQgb3V0IG9yIGRlbGV0ZWQgd2l0aAp8OmJkZWxldGV8LgoKT25lIGxvY2FsIGJ1ZmZlciB2YXJpYWJsZSBpcyBwcmVkZWZpbmVkOgoJCQkJCSpiOmNoYW5nZWR0aWNrKiAqY2hhbmdldGljayoKYjpjaGFuZ2VkdGljawlUaGUgdG90YWwgbnVtYmVyIG9mIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgYnVmZmVyLiAgSXQgaXMKCQlpbmNyZW1lbnRlZCBmb3IgZWFjaCBjaGFuZ2UuICBBbiB1bmRvIGNvbW1hbmQgaXMgYWxzbyBhIGNoYW5nZQoJCWluIHRoaXMgY2FzZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhbiBhY3Rpb24gb25seSB3aGVuCgkJdGhlIGJ1ZmZlciBoYXMgY2hhbmdlZC4gIEV4YW1wbGU6ID4KCQkgICAgOmlmIG15X2NoYW5nZWR0aWNrICE9IGI6Y2hhbmdlZHRpY2sKCQkgICAgOglsZXQgbXlfY2hhbmdlZHRpY2sgPSBiOmNoYW5nZWR0aWNrCgkJICAgIDoJY2FsbCBNeV9VcGRhdGUoKQoJCSAgICA6ZW5kaWYKPAoJCQkJCQkqd2luZG93LXZhcmlhYmxlKiAqdzp2YXIqICp3OioKQSB2YXJpYWJsZSBuYW1lIHRoYXQgaXMgcHJlY2VkZWQgd2l0aCAidzoiIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IHdpbmRvdy4gIEl0CmlzIGRlbGV0ZWQgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZC4KCgkJCQkJCSp0YWJwYWdlLXZhcmlhYmxlKiAqdDp2YXIqICp0OioKQSB2YXJpYWJsZSBuYW1lIHRoYXQgaXMgcHJlY2VkZWQgd2l0aCAidDoiIGlzIGxvY2FsIHRvIHRoZSBjdXJyZW50IHRhYiBwYWdlLApJdCBpcyBkZWxldGVkIHdoZW4gdGhlIHRhYiBwYWdlIGlzIGNsb3NlZC4ge25vdCBhdmFpbGFibGUgd2hlbiBjb21waWxlZAp3aXRob3V0IHRoZSB8K3dpbmRvd3N8IGZlYXR1cmV9CgoJCQkJCQkqZ2xvYmFsLXZhcmlhYmxlKiAqZzp2YXIqICpnOioKSW5zaWRlIGZ1bmN0aW9ucyBnbG9iYWwgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCB3aXRoICJnOiIuICBPbWl0dGluZyB0aGlzIHdpbGwKYWNjZXNzIGEgdmFyaWFibGUgbG9jYWwgdG8gYSBmdW5jdGlvbi4JQnV0ICJnOiIgY2FuIGFsc28gYmUgdXNlZCBpbiBhbnkgb3RoZXIKcGxhY2UgaWYgeW91IGxpa2UuCgoJCQkJCQkqbG9jYWwtdmFyaWFibGUqICpsOnZhciogKmw6KgpJbnNpZGUgZnVuY3Rpb25zIGxvY2FsIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgd2l0aG91dCBwcmVwZW5kaW5nIGFueXRoaW5nLgpCdXQgeW91IGNhbiBhbHNvIHByZXBlbmQgImw6IiBpZiB5b3UgbGlrZS4gIEhvd2V2ZXIsIHdpdGhvdXQgcHJlcGVuZGluZyAibDoiCnlvdSBtYXkgcnVuIGludG8gcmVzZXJ2ZWQgdmFyaWFibGUgbmFtZXMuICBGb3IgZXhhbXBsZSAiY291bnQiLiAgQnkgaXRzZWxmIGl0CnJlZmVycyB0byAidjpjb3VudCIuICBVc2luZyAibDpjb3VudCIgeW91IGNhbiBoYXZlIGEgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUKc2FtZSBuYW1lLgoKCQkJCQkJKnNjcmlwdC12YXJpYWJsZSogKnM6dmFyKgpJbiBhIFZpbSBzY3JpcHQgdmFyaWFibGVzIHN0YXJ0aW5nIHdpdGggInM6IiBjYW4gYmUgdXNlZC4gIFRoZXkgY2Fubm90IGJlCmFjY2Vzc2VkIGZyb20gb3V0c2lkZSBvZiB0aGUgc2NyaXB0cywgdGh1cyBhcmUgbG9jYWwgdG8gdGhlIHNjcmlwdC4KClRoZXkgY2FuIGJlIHVzZWQgaW46Ci0gY29tbWFuZHMgZXhlY3V0ZWQgd2hpbGUgdGhlIHNjcmlwdCBpcyBzb3VyY2VkCi0gZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNjcmlwdAotIGF1dG9jb21tYW5kcyBkZWZpbmVkIGluIHRoZSBzY3JpcHQKLSBmdW5jdGlvbnMgYW5kIGF1dG9jb21tYW5kcyBkZWZpbmVkIGluIGZ1bmN0aW9ucyBhbmQgYXV0b2NvbW1hbmRzIHdoaWNoIHdlcmUKICBkZWZpbmVkIGluIHRoZSBzY3JpcHQgKHJlY3Vyc2l2ZWx5KQotIHVzZXIgZGVmaW5lZCBjb21tYW5kcyBkZWZpbmVkIGluIHRoZSBzY3JpcHQKVGh1cyBub3QgaW46Ci0gb3RoZXIgc2NyaXB0cyBzb3VyY2VkIGZyb20gdGhpcyBvbmUKLSBtYXBwaW5ncwotIG1lbnVzCi0gZXRjLgoKU2NyaXB0IHZhcmlhYmxlcyBjYW4gYmUgdXNlZCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBnbG9iYWwgdmFyaWFibGUgbmFtZXMuClRha2UgdGhpcyBleGFtcGxlOiA+CgoJbGV0IHM6Y291bnRlciA9IDAKCWZ1bmN0aW9uIE15Q291bnRlcigpCgkgIGxldCBzOmNvdW50ZXIgPSBzOmNvdW50ZXIgKyAxCgkgIGVjaG8gczpjb3VudGVyCgllbmRmdW5jdGlvbgoJY29tbWFuZCBUaWNrIGNhbGwgTXlDb3VudGVyKCkKCllvdSBjYW4gbm93IGludm9rZSAiVGljayIgZnJvbSBhbnkgc2NyaXB0LCBhbmQgdGhlICJzOmNvdW50ZXIiIHZhcmlhYmxlIGluCnRoYXQgc2NyaXB0IHdpbGwgbm90IGJlIGNoYW5nZWQsIG9ubHkgdGhlICJzOmNvdW50ZXIiIGluIHRoZSBzY3JpcHQgd2hlcmUKIlRpY2siIHdhcyBkZWZpbmVkIGlzIHVzZWQuCgpBbm90aGVyIGV4YW1wbGUgdGhhdCBkb2VzIHRoZSBzYW1lOiA+CgoJbGV0IHM6Y291bnRlciA9IDAKCWNvbW1hbmQgVGljayBsZXQgczpjb3VudGVyID0gczpjb3VudGVyICsgMSB8IGVjaG8gczpjb3VudGVyCgpXaGVuIGNhbGxpbmcgYSBmdW5jdGlvbiBhbmQgaW52b2tpbmcgYSB1c2VyLWRlZmluZWQgY29tbWFuZCwgdGhlIGNvbnRleHQgZm9yCnNjcmlwdCB2YXJpYWJsZXMgaXMgc2V0IHRvIHRoZSBzY3JpcHQgd2hlcmUgdGhlIGZ1bmN0aW9uIG9yIGNvbW1hbmQgd2FzCmRlZmluZWQuCgpUaGUgc2NyaXB0IHZhcmlhYmxlcyBhcmUgYWxzbyBhdmFpbGFibGUgd2hlbiBhIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW5zaWRlIGEKZnVuY3Rpb24gdGhhdCBpcyBkZWZpbmVkIGluIGEgc2NyaXB0LiAgRXhhbXBsZTogPgoKCWxldCBzOmNvdW50ZXIgPSAwCglmdW5jdGlvbiBTdGFydENvdW50aW5nKGluY3IpCgkgIGlmIGE6aW5jcgoJICAgIGZ1bmN0aW9uIE15Q291bnRlcigpCgkgICAgICBsZXQgczpjb3VudGVyID0gczpjb3VudGVyICsgMQoJICAgIGVuZGZ1bmN0aW9uCgkgIGVsc2UKCSAgICBmdW5jdGlvbiBNeUNvdW50ZXIoKQoJICAgICAgbGV0IHM6Y291bnRlciA9IHM6Y291bnRlciAtIDEKCSAgICBlbmRmdW5jdGlvbgoJICBlbmRpZgoJZW5kZnVuY3Rpb24KClRoaXMgZGVmaW5lcyB0aGUgTXlDb3VudGVyKCkgZnVuY3Rpb24gZWl0aGVyIGZvciBjb3VudGluZyB1cCBvciBjb3VudGluZyBkb3duCndoZW4gY2FsbGluZyBTdGFydENvdW50aW5nKCkuICBJdCBkb2Vzbid0IG1hdHRlciBmcm9tIHdoZXJlIFN0YXJ0Q291bnRpbmcoKSBpcwpjYWxsZWQsIHRoZSBzOmNvdW50ZXIgdmFyaWFibGUgd2lsbCBiZSBhY2Nlc3NpYmxlIGluIE15Q291bnRlcigpLgoKV2hlbiB0aGUgc2FtZSBzY3JpcHQgaXMgc291cmNlZCBhZ2FpbiBpdCB3aWxsIHVzZSB0aGUgc2FtZSBzY3JpcHQgdmFyaWFibGVzLgpUaGV5IHdpbGwgcmVtYWluIHZhbGlkIGFzIGxvbmcgYXMgVmltIGlzIHJ1bm5pbmcuICBUaGlzIGNhbiBiZSB1c2VkIHRvCm1haW50YWluIGEgY291bnRlcjogPgoKCWlmICFleGlzdHMoInM6Y291bnRlciIpCgkgIGxldCBzOmNvdW50ZXIgPSAxCgkgIGVjaG8gInNjcmlwdCBleGVjdXRlZCBmb3IgdGhlIGZpcnN0IHRpbWUiCgllbHNlCgkgIGxldCBzOmNvdW50ZXIgPSBzOmNvdW50ZXIgKyAxCgkgIGVjaG8gInNjcmlwdCBleGVjdXRlZCAiIC4gczpjb3VudGVyIC4gIiB0aW1lcyBub3ciCgllbmRpZgoKTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdCBmaWxldHlwZSBwbHVnaW5zIGRvbid0IGdldCBhIGRpZmZlcmVudCBzZXQgb2Ygc2NyaXB0CnZhcmlhYmxlcyBmb3IgZWFjaCBidWZmZXIuICBVc2UgbG9jYWwgYnVmZmVyIHZhcmlhYmxlcyBpbnN0ZWFkIHxiOnZhcnwuCgoKUHJlZGVmaW5lZCBWaW0gdmFyaWFibGVzOgkJCSp2aW0tdmFyaWFibGUqICp2OnZhciogKnY6KgoKCQkJCQkqdjpiZXZhbF9jb2wqICpiZXZhbF9jb2wtdmFyaWFibGUqCnY6YmV2YWxfY29sCVRoZSBudW1iZXIgb2YgdGhlIGNvbHVtbiwgb3ZlciB3aGljaCB0aGUgbW91c2UgcG9pbnRlciBpcy4KCQlUaGlzIGlzIHRoZSBieXRlIGluZGV4IGluIHRoZSB8djpiZXZhbF9sbnVtfCBsaW5lLgoJCU9ubHkgdmFsaWQgd2hpbGUgZXZhbHVhdGluZyB0aGUgJ2JhbGxvb25leHByJyBvcHRpb24uCgoJCQkJCSp2OmJldmFsX2J1Zm5yKiAqYmV2YWxfYnVmbnItdmFyaWFibGUqCnY6YmV2YWxfYnVmbnIJVGhlIG51bWJlciBvZiB0aGUgYnVmZmVyLCBvdmVyIHdoaWNoIHRoZSBtb3VzZSBwb2ludGVyIGlzLiBPbmx5CgkJdmFsaWQgd2hpbGUgZXZhbHVhdGluZyB0aGUgJ2JhbGxvb25leHByJyBvcHRpb24uCgoJCQkJCSp2OmJldmFsX2xudW0qICpiZXZhbF9sbnVtLXZhcmlhYmxlKgp2OmJldmFsX2xudW0JVGhlIG51bWJlciBvZiB0aGUgbGluZSwgb3ZlciB3aGljaCB0aGUgbW91c2UgcG9pbnRlciBpcy4gT25seQoJCXZhbGlkIHdoaWxlIGV2YWx1YXRpbmcgdGhlICdiYWxsb29uZXhwcicgb3B0aW9uLgoKCQkJCQkqdjpiZXZhbF90ZXh0KiAqYmV2YWxfdGV4dC12YXJpYWJsZSoKdjpiZXZhbF90ZXh0CVRoZSB0ZXh0IHVuZGVyIG9yIGFmdGVyIHRoZSBtb3VzZSBwb2ludGVyLiAgVXN1YWxseSBhIHdvcmQgYXMKCQlpdCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhIEMgcHJvZ3JhbS4gICdpc2tleXdvcmQnIGFwcGxpZXMsCgkJYnV0IGEgZG90IGFuZCAiLT4iIGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgaW5jbHVkZWQuICBXaGVuIG9uIGEKCQknXScgdGhlIHRleHQgYmVmb3JlIGl0IGlzIHVzZWQsIGluY2x1ZGluZyB0aGUgbWF0Y2hpbmcgJ1snIGFuZAoJCXdvcmQgYmVmb3JlIGl0LiAgV2hlbiBvbiBhIFZpc3VhbCBhcmVhIHdpdGhpbiBvbmUgbGluZSB0aGUKCQloaWdobGlnaHRlZCB0ZXh0IGlzIHVzZWQuCgkJT25seSB2YWxpZCB3aGlsZSBldmFsdWF0aW5nIHRoZSAnYmFsbG9vbmV4cHInIG9wdGlvbi4KCgkJCQkJKnY6YmV2YWxfd2lubnIqICpiZXZhbF93aW5uci12YXJpYWJsZSoKdjpiZXZhbF93aW5ucglUaGUgbnVtYmVyIG9mIHRoZSB3aW5kb3csIG92ZXIgd2hpY2ggdGhlIG1vdXNlIHBvaW50ZXIgaXMuIE9ubHkKCQl2YWxpZCB3aGlsZSBldmFsdWF0aW5nIHRoZSAnYmFsbG9vbmV4cHInIG9wdGlvbi4gIFRoZSBmaXJzdAoJCXdpbmRvdyBoYXMgbnVtYmVyIHplcm8gKHVubGlrZSBtb3N0IG90aGVyIHBsYWNlcyB3aGVyZSBhCgkJd2luZG93IGdldHMgYSBudW1iZXIpLgoKCQkJCQkqdjpjaGFyKiAqY2hhci12YXJpYWJsZSoKdjpjaGFyCQlBcmd1bWVudCBmb3IgZXZhbHVhdGluZyAnZm9ybWF0ZXhwcicgYW5kIHVzZWQgZm9yIHRoZSB0eXBlZAoJCWNoYXJhY3RlciB3aGVuIHVzaW5nIDxleHByPiBpbiBhbiBhYmJyZXZpYXRpb24gfDptYXAtPGV4cHI+fC4KCQlJdCBpcyBhbHNvIHVzZWQgYnkgdGhlIHxJbnNlcnRDaGFyUHJlfCBhbmQgfEluc2VydEVudGVyfCBldmVudHMuCgoJCQkqdjpjaGFyY29udmVydF9mcm9tKiAqY2hhcmNvbnZlcnRfZnJvbS12YXJpYWJsZSoKdjpjaGFyY29udmVydF9mcm9tCgkJVGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiBhIGZpbGUgdG8gYmUgY29udmVydGVkLgoJCU9ubHkgdmFsaWQgd2hpbGUgZXZhbHVhdGluZyB0aGUgJ2NoYXJjb252ZXJ0JyBvcHRpb24uCgoJCQkqdjpjaGFyY29udmVydF90byogKmNoYXJjb252ZXJ0X3RvLXZhcmlhYmxlKgp2OmNoYXJjb252ZXJ0X3RvCgkJVGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiBhIGZpbGUgYWZ0ZXIgY29udmVyc2lvbi4KCQlPbmx5IHZhbGlkIHdoaWxlIGV2YWx1YXRpbmcgdGhlICdjaGFyY29udmVydCcgb3B0aW9uLgoKCQkJCQkqdjpjbWRhcmcqICpjbWRhcmctdmFyaWFibGUqCnY6Y21kYXJnCVRoaXMgdmFyaWFibGUgaXMgdXNlZCBmb3IgdHdvIHB1cnBvc2VzOgoJCTEuIFRoZSBleHRyYSBhcmd1bWVudHMgZ2l2ZW4gdG8gYSBmaWxlIHJlYWQvd3JpdGUgY29tbWFuZC4KCQkgICBDdXJyZW50bHkgdGhlc2UgYXJlICIrK2VuYz0iIGFuZCAiKytmZj0iLiAgVGhpcyB2YXJpYWJsZSBpcwoJCSAgIHNldCBiZWZvcmUgYW4gYXV0b2NvbW1hbmQgZXZlbnQgZm9yIGEgZmlsZSByZWFkL3dyaXRlCgkJICAgY29tbWFuZCBpcyB0cmlnZ2VyZWQuICBUaGVyZSBpcyBhIGxlYWRpbmcgc3BhY2UgdG8gbWFrZSBpdAoJCSAgIHBvc3NpYmxlIHRvIGFwcGVuZCB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5IGFmdGVyIHRoZQoJCSAgIHJlYWQvd3JpdGUgY29tbWFuZC4JTm90ZTogVGhlICIrY21kIiBhcmd1bWVudCBpc24ndAoJCSAgIGluY2x1ZGVkIGhlcmUsIGJlY2F1c2UgaXQgd2lsbCBiZSBleGVjdXRlZCBhbnl3YXkuCgkJMi4gV2hlbiBwcmludGluZyBhIFBvc3RTY3JpcHQgZmlsZSB3aXRoICI6aGFyZGNvcHkiIHRoaXMgaXMKCQkgICB0aGUgYXJndW1lbnQgZm9yIHRoZSAiOmhhcmRjb3B5IiBjb21tYW5kLiAgVGhpcyBjYW4gYmUgdXNlZAoJCSAgIGluICdwcmludGV4cHInLgoKCQkJCQkqdjpjbWRiYW5nKiAqY21kYmFuZy12YXJpYWJsZSoKdjpjbWRiYW5nCVNldCBsaWtlIHY6Y21kYXJnIGZvciBhIGZpbGUgcmVhZC93cml0ZSBjb21tYW5kLiAgV2hlbiBhICIhIgoJCXdhcyB1c2VkIHRoZSB2YWx1ZSBpcyAxLCBvdGhlcndpc2UgaXQgaXMgMC4gIE5vdGUgdGhhdCB0aGlzCgkJY2FuIG9ubHkgYmUgdXNlZCBpbiBhdXRvY29tbWFuZHMuICBGb3IgdXNlciBjb21tYW5kcyB8PGJhbmc+fAoJCWNhbiBiZSB1c2VkLgoKCQkJCSp2OmNvbXBsZXRlZF9pdGVtKiAqY29tcGxldGVkX2l0ZW0tdmFyaWFibGUqCnY6Y29tcGxldGVkX2l0ZW0KCQl8RGljdGlvbmFyeXwgY29udGFpbmluZyB0aGUgfGNvbXBsZXRlLWl0ZW1zfCBmb3IgdGhlIG1vc3QKCQlyZWNlbnRseSBjb21wbGV0ZWQgd29yZCBhZnRlciB8Q29tcGxldGVEb25lfC4gIFRoZQoJCXxEaWN0aW9uYXJ5fCBpcyBlbXB0eSBpZiB0aGUgY29tcGxldGlvbiBmYWlsZWQuCgoJCQkJCSp2OmNvdW50KiAqY291bnQtdmFyaWFibGUqCnY6Y291bnQJCVRoZSBjb3VudCBnaXZlbiBmb3IgdGhlIGxhc3QgTm9ybWFsIG1vZGUgY29tbWFuZC4gIENhbiBiZSB1c2VkCgkJdG8gZ2V0IHRoZSBjb3VudCBiZWZvcmUgYSBtYXBwaW5nLiAgUmVhZC1vbmx5LglFeGFtcGxlOiA+Cgk6bWFwIF94IDo8Qy1VPmVjaG8gInRoZSBjb3VudCBpcyAiIC4gdjpjb3VudDxDUj4KPAkJTm90ZTogVGhlIDxDLVU+IGlzIHJlcXVpcmVkIHRvIHJlbW92ZSB0aGUgbGluZSByYW5nZSB0aGF0IHlvdQoJCWdldCB3aGVuIHR5cGluZyAnOicgYWZ0ZXIgYSBjb3VudC4KCQlXaGVuIHRoZXJlIGFyZSB0d28gY291bnRzLCBhcyBpbiAiM2QydyIsIHRoZXkgYXJlIG11bHRpcGxpZWQsCgkJanVzdCBsaWtlIHdoYXQgaGFwcGVucyBpbiB0aGUgY29tbWFuZCwgImQ2dyIgZm9yIHRoZSBleGFtcGxlLgoJCUFsc28gdXNlZCBmb3IgZXZhbHVhdGluZyB0aGUgJ2Zvcm1hdGV4cHInIG9wdGlvbi4KCQkiY291bnQiIGFsc28gd29ya3MsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCgkJCQkJKnY6Y291bnQxKiAqY291bnQxLXZhcmlhYmxlKgp2OmNvdW50MQlKdXN0IGxpa2UgInY6Y291bnQiLCBidXQgZGVmYXVsdHMgdG8gb25lIHdoZW4gbm8gY291bnQgaXMKCQl1c2VkLgoKCQkJCQkJKnY6Y3R5cGUqICpjdHlwZS12YXJpYWJsZSoKdjpjdHlwZQkJVGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgZm9yIGNoYXJhY3RlcnMgb2YgdGhlIHJ1bnRpbWUKCQllbnZpcm9ubWVudC4gIFRoaXMgYWxsb3dzIFZpbSBzY3JpcHRzIHRvIGJlIGF3YXJlIG9mIHRoZQoJCWN1cnJlbnQgbG9jYWxlIGVuY29kaW5nLiAgVGVjaG5pY2FsOiBpdCdzIHRoZSB2YWx1ZSBvZgoJCUxDX0NUWVBFLiAgV2hlbiBub3QgdXNpbmcgYSBsb2NhbGUgdGhlIHZhbHVlIGlzICJDIi4KCQlUaGlzIHZhcmlhYmxlIGNhbiBub3QgYmUgc2V0IGRpcmVjdGx5LCB1c2UgdGhlIHw6bGFuZ3VhZ2V8CgkJY29tbWFuZC4KCQlTZWUgfG11bHRpLWxhbmd8LgoKCQkJCQkqdjpkeWluZyogKmR5aW5nLXZhcmlhYmxlKgp2OmR5aW5nCQlOb3JtYWxseSB6ZXJvLglXaGVuIGEgZGVhZGx5IHNpZ25hbCBpcyBjYXVnaHQgaXQncyBzZXQgdG8KCQlvbmUuICBXaGVuIG11bHRpcGxlIHNpZ25hbHMgYXJlIGNhdWdodCB0aGUgbnVtYmVyIGluY3JlYXNlcy4KCQlDYW4gYmUgdXNlZCBpbiBhbiBhdXRvY29tbWFuZCB0byBjaGVjayBpZiBWaW0gZGlkbid0CgkJdGVybWluYXRlIG5vcm1hbGx5LiB7b25seSB3b3JrcyBvbiBVbml4fQoJCUV4YW1wbGU6ID4KCTphdSBWaW1MZWF2ZSAqIGlmIHY6ZHlpbmcgfCBlY2hvICJcbkFBQUFhYWFhcnJyZ2dnaGhoaCEhIVxuIiB8IGVuZGlmCjwJCU5vdGU6IGlmIGFub3RoZXIgZGVhZGx5IHNpZ25hbCBpcyBjYXVnaHQgd2hlbiB2OmR5aW5nIGlzIG9uZSwKCQlWaW1MZWF2ZSBhdXRvY29tbWFuZHMgd2lsbCBub3QgYmUgZXhlY3V0ZWQuCgoJCQkJCSp2OmVycm1zZyogKmVycm1zZy12YXJpYWJsZSoKdjplcnJtc2cJTGFzdCBnaXZlbiBlcnJvciBtZXNzYWdlLiAgSXQncyBhbGxvd2VkIHRvIHNldCB0aGlzIHZhcmlhYmxlLgoJCUV4YW1wbGU6ID4KCTpsZXQgdjplcnJtc2cgPSAiIgoJOnNpbGVudCEgbmV4dAoJOmlmIHY6ZXJybXNnICE9ICIiCgk6ICAuLi4gaGFuZGxlIGVycm9yCjwJCSJlcnJtc2ciIGFsc28gd29ya3MsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCgkJCQkJKnY6ZXJyb3JzKiAqZXJyb3JzLXZhcmlhYmxlKgp2OmVycm9ycwlFcnJvcnMgZm91bmQgYnkgYXNzZXJ0IGZ1bmN0aW9ucywgc3VjaCBhcyB8YXNzZXJ0X3RydWUoKXwuCgkJVGhpcyBpcyBhIGxpc3Qgb2Ygc3RyaW5ncy4KCQlUaGUgYXNzZXJ0IGZ1bmN0aW9ucyBhcHBlbmQgYW4gaXRlbSB3aGVuIGFuIGFzc2VydCBmYWlscy4KCQlUbyByZW1vdmUgb2xkIHJlc3VsdHMgbWFrZSBpdCBlbXB0eTogPgoJOmxldCB2OmVycm9ycyA9IFtdCjwJCUlmIHY6ZXJyb3JzIGlzIHNldCB0byBhbnl0aGluZyBidXQgYSBsaXN0IGl0IGlzIG1hZGUgYW4gZW1wdHkKCQlsaXN0IGJ5IHRoZSBhc3NlcnQgZnVuY3Rpb24uCgoJCQkJCSp2OmV4Y2VwdGlvbiogKmV4Y2VwdGlvbi12YXJpYWJsZSoKdjpleGNlcHRpb24JVGhlIHZhbHVlIG9mIHRoZSBleGNlcHRpb24gbW9zdCByZWNlbnRseSBjYXVnaHQgYW5kIG5vdAoJCWZpbmlzaGVkLiAgU2VlIGFsc28gfHY6dGhyb3dwb2ludHwgYW5kIHx0aHJvdy12YXJpYWJsZXN8LgoJCUV4YW1wbGU6ID4KCTp0cnkKCTogIHRocm93ICJvb3BzIgoJOmNhdGNoIC8uKi8KCTogIGVjaG8gImNhdWdodCIgdjpleGNlcHRpb24KCTplbmR0cnkKPAkJT3V0cHV0OiAiY2F1Z2h0IG9vcHMiLgoKCQkJCQkqdjpmYWxzZSogKmZhbHNlLXZhcmlhYmxlKgp2OmZhbHNlCQlBIE51bWJlciB3aXRoIHZhbHVlIHplcm8uIFVzZWQgdG8gcHV0ICJmYWxzZSIgaW4gSlNPTi4gIFNlZQoJCXxqc29uZW5jb2RlKCl8LgoJCVdoZW4gdXNlZCBhcyBhIHN0cmluZyB0aGlzIGV2YWx1YXRlcyB0byAiZmFsc2UiLiA+CgkJCWVjaG8gdjpmYWxzZQo8CQkJZmFsc2UgfgoKCQkJCQkqdjpmY3NfcmVhc29uKiAqZmNzX3JlYXNvbi12YXJpYWJsZSoKdjpmY3NfcmVhc29uCVRoZSByZWFzb24gd2h5IHRoZSB8RmlsZUNoYW5nZWRTaGVsbHwgZXZlbnQgd2FzIHRyaWdnZXJlZC4KCQlDYW4gYmUgdXNlZCBpbiBhbiBhdXRvY29tbWFuZCB0byBkZWNpZGUgd2hhdCB0byBkbyBhbmQvb3Igd2hhdAoJCXRvIHNldCB2OmZjc19jaG9pY2UgdG8uICBQb3NzaWJsZSB2YWx1ZXM6CgkJCWRlbGV0ZWQJCWZpbGUgbm8gbG9uZ2VyIGV4aXN0cwoJCQljb25mbGljdAlmaWxlIGNvbnRlbnRzLCBtb2RlIG9yIHRpbWVzdGFtcCB3YXMKCQkJCQljaGFuZ2VkIGFuZCBidWZmZXIgaXMgbW9kaWZpZWQKCQkJY2hhbmdlZAkJZmlsZSBjb250ZW50cyBoYXMgY2hhbmdlZAoJCQltb2RlCQltb2RlIG9mIGZpbGUgY2hhbmdlZAoJCQl0aW1lCQlvbmx5IGZpbGUgdGltZXN0YW1wIGNoYW5nZWQKCgkJCQkJKnY6ZmNzX2Nob2ljZSogKmZjc19jaG9pY2UtdmFyaWFibGUqCnY6ZmNzX2Nob2ljZQlXaGF0IHNob3VsZCBoYXBwZW4gYWZ0ZXIgYSB8RmlsZUNoYW5nZWRTaGVsbHwgZXZlbnQgd2FzCgkJdHJpZ2dlcmVkLiAgQ2FuIGJlIHVzZWQgaW4gYW4gYXV0b2NvbW1hbmQgdG8gdGVsbCBWaW0gd2hhdCB0bwoJCWRvIHdpdGggdGhlIGFmZmVjdGVkIGJ1ZmZlcjoKCQkJcmVsb2FkCQlSZWxvYWQgdGhlIGJ1ZmZlciAoZG9lcyBub3Qgd29yayBpZgoJCQkJCXRoZSBmaWxlIHdhcyBkZWxldGVkKS4KCQkJYXNrCQlBc2sgdGhlIHVzZXIgd2hhdCB0byBkbywgYXMgaWYgdGhlcmUKCQkJCQl3YXMgbm8gYXV0b2NvbW1hbmQuICBFeGNlcHQgdGhhdCB3aGVuCgkJCQkJb25seSB0aGUgdGltZXN0YW1wIGNoYW5nZWQgbm90aGluZwoJCQkJCXdpbGwgaGFwcGVuLgoJCQk8ZW1wdHk+CQlOb3RoaW5nLCB0aGUgYXV0b2NvbW1hbmQgc2hvdWxkIGRvCgkJCQkJZXZlcnl0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGRvbmUuCgkJVGhlIGRlZmF1bHQgaXMgZW1wdHkuICBJZiBhbm90aGVyIChpbnZhbGlkKSB2YWx1ZSBpcyB1c2VkIHRoZW4KCQlWaW0gYmVoYXZlcyBsaWtlIGl0IGlzIGVtcHR5LCB0aGVyZSBpcyBubyB3YXJuaW5nIG1lc3NhZ2UuCgoJCQkJCSp2OmZuYW1lX2luKiAqZm5hbWVfaW4tdmFyaWFibGUqCnY6Zm5hbWVfaW4JVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuICBWYWxpZCB3aGlsZSBldmFsdWF0aW5nOgoJCQlvcHRpb24JCXVzZWQgZm9yIH4KCQkJJ2NoYXJjb252ZXJ0JwlmaWxlIHRvIGJlIGNvbnZlcnRlZAoJCQknZGlmZmV4cHInCW9yaWdpbmFsIGZpbGUKCQkJJ3BhdGNoZXhwcicJb3JpZ2luYWwgZmlsZQoJCQkncHJpbnRleHByJwlmaWxlIHRvIGJlIHByaW50ZWQKCQlBbmQgc2V0IHRvIHRoZSBzd2FwIGZpbGUgbmFtZSBmb3IgfFN3YXBFeGlzdHN8LgoKCQkJCQkqdjpmbmFtZV9vdXQqICpmbmFtZV9vdXQtdmFyaWFibGUqCnY6Zm5hbWVfb3V0CVRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4gIE9ubHkgdmFsaWQgd2hpbGUKCQlldmFsdWF0aW5nOgoJCQlvcHRpb24JCXVzZWQgZm9yIH4KCQkJJ2NoYXJjb252ZXJ0JwlyZXN1bHRpbmcgY29udmVydGVkIGZpbGUgKCopCgkJCSdkaWZmZXhwcicJb3V0cHV0IG9mIGRpZmYKCQkJJ3BhdGNoZXhwcicJcmVzdWx0aW5nIHBhdGNoZWQgZmlsZQoJCSgqKSBXaGVuIGRvaW5nIGNvbnZlcnNpb24gZm9yIGEgd3JpdGUgY29tbWFuZCAoZS5nLiwgIjp3CgkJZmlsZSIpIGl0IHdpbGwgYmUgZXF1YWwgdG8gdjpmbmFtZV9pbi4JV2hlbiBkb2luZyBjb252ZXJzaW9uCgkJZm9yIGEgcmVhZCBjb21tYW5kIChlLmcuLCAiOmUgZmlsZSIpIGl0IHdpbGwgYmUgYSB0ZW1wb3JhcnkKCQlmaWxlIGFuZCBkaWZmZXJlbnQgZnJvbSB2OmZuYW1lX2luLgoKCQkJCQkqdjpmbmFtZV9uZXcqICpmbmFtZV9uZXctdmFyaWFibGUqCnY6Zm5hbWVfbmV3CVRoZSBuYW1lIG9mIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgZmlsZS4gIE9ubHkgdmFsaWQgd2hpbGUKCQlldmFsdWF0aW5nICdkaWZmZXhwcicuCgoJCQkJCSp2OmZuYW1lX2RpZmYqICpmbmFtZV9kaWZmLXZhcmlhYmxlKgp2OmZuYW1lX2RpZmYJVGhlIG5hbWUgb2YgdGhlIGRpZmYgKHBhdGNoKSBmaWxlLiAgT25seSB2YWxpZCB3aGlsZQoJCWV2YWx1YXRpbmcgJ3BhdGNoZXhwcicuCgoJCQkJCSp2OmZvbGRkYXNoZXMqICpmb2xkZGFzaGVzLXZhcmlhYmxlKgp2OmZvbGRkYXNoZXMJVXNlZCBmb3IgJ2ZvbGR0ZXh0JzogZGFzaGVzIHJlcHJlc2VudGluZyBmb2xkbGV2ZWwgb2YgYSBjbG9zZWQKCQlmb2xkLgoJCVJlYWQtb25seSBpbiB0aGUgfHNhbmRib3h8LiB8Zm9sZC1mb2xkdGV4dHwKCgkJCQkJKnY6Zm9sZGxldmVsKiAqZm9sZGxldmVsLXZhcmlhYmxlKgp2OmZvbGRsZXZlbAlVc2VkIGZvciAnZm9sZHRleHQnOiBmb2xkbGV2ZWwgb2YgY2xvc2VkIGZvbGQuCgkJUmVhZC1vbmx5IGluIHRoZSB8c2FuZGJveHwuIHxmb2xkLWZvbGR0ZXh0fAoKCQkJCQkqdjpmb2xkZW5kKiAqZm9sZGVuZC12YXJpYWJsZSoKdjpmb2xkZW5kCVVzZWQgZm9yICdmb2xkdGV4dCc6IGxhc3QgbGluZSBvZiBjbG9zZWQgZm9sZC4KCQlSZWFkLW9ubHkgaW4gdGhlIHxzYW5kYm94fC4gfGZvbGQtZm9sZHRleHR8CgoJCQkJCSp2OmZvbGRzdGFydCogKmZvbGRzdGFydC12YXJpYWJsZSoKdjpmb2xkc3RhcnQJVXNlZCBmb3IgJ2ZvbGR0ZXh0JzogZmlyc3QgbGluZSBvZiBjbG9zZWQgZm9sZC4KCQlSZWFkLW9ubHkgaW4gdGhlIHxzYW5kYm94fC4gfGZvbGQtZm9sZHRleHR8CgoJCQkJCSp2Omhsc2VhcmNoKiAqaGxzZWFyY2gtdmFyaWFibGUqCnY6aGxzZWFyY2gJVmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBzZWFyY2ggaGlnaGxpZ2h0aW5nIGlzIG9uLiAKCQlTZXR0aW5nIGl0IG1ha2VzIHNlbnNlIG9ubHkgaWYgJ2hsc2VhcmNoJyBpcyBlbmFibGVkIHdoaWNoCgkJcmVxdWlyZXMgfCtleHRyYV9zZWFyY2h8LiBTZXR0aW5nIHRoaXMgdmFyaWFibGUgdG8gemVybyBhY3RzCgkJbGlrZSB0aGUgfDpub2hsc2VhcmNofCBjb21tYW5kLCBzZXR0aW5nIGl0IHRvIG9uZSBhY3RzIGxpa2UgPgoJCQlsZXQgJmhsc2VhcmNoID0gJmhsc2VhcmNoCjwJCU5vdGUgdGhhdCB0aGUgdmFsdWUgaXMgcmVzdG9yZWQgd2hlbiByZXR1cm5pbmcgZnJvbSBhCgkJZnVuY3Rpb24uIHxmdW5jdGlvbi1zZWFyY2gtdW5kb3wuCgoJCQkJCSp2Omluc2VydG1vZGUqICppbnNlcnRtb2RlLXZhcmlhYmxlKgp2Omluc2VydG1vZGUJVXNlZCBmb3IgdGhlIHxJbnNlcnRFbnRlcnwgYW5kIHxJbnNlcnRDaGFuZ2V8IGF1dG9jb21tYW5kCgkJZXZlbnRzLiAgVmFsdWVzOgoJCQlpCUluc2VydCBtb2RlCgkJCXIJUmVwbGFjZSBtb2RlCgkJCXYJVmlydHVhbCBSZXBsYWNlIG1vZGUKCgkJCQkJCSp2OmtleSogKmtleS12YXJpYWJsZSoKdjprZXkJCUtleSBvZiB0aGUgY3VycmVudCBpdGVtIG9mIGEgfERpY3Rpb25hcnl8LiAgT25seSB2YWxpZCB3aGlsZQoJCWV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gdXNlZCB3aXRoIHxtYXAoKXwgYW5kIHxmaWx0ZXIoKXwuCgkJUmVhZC1vbmx5LgoKCQkJCQkJKnY6bGFuZyogKmxhbmctdmFyaWFibGUqCnY6bGFuZwkJVGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgZm9yIG1lc3NhZ2VzIG9mIHRoZSBydW50aW1lCgkJZW52aXJvbm1lbnQuICBUaGlzIGFsbG93cyBWaW0gc2NyaXB0cyB0byBiZSBhd2FyZSBvZiB0aGUKCQljdXJyZW50IGxhbmd1YWdlLiAgVGVjaG5pY2FsOiBpdCdzIHRoZSB2YWx1ZSBvZiBMQ19NRVNTQUdFUy4KCQlUaGUgdmFsdWUgaXMgc3lzdGVtIGRlcGVuZGVudC4KCQlUaGlzIHZhcmlhYmxlIGNhbiBub3QgYmUgc2V0IGRpcmVjdGx5LCB1c2UgdGhlIHw6bGFuZ3VhZ2V8CgkJY29tbWFuZC4KCQlJdCBjYW4gYmUgZGlmZmVyZW50IGZyb20gfHY6Y3R5cGV8IHdoZW4gbWVzc2FnZXMgYXJlIGRlc2lyZWQKCQlpbiBhIGRpZmZlcmVudCBsYW5ndWFnZSB0aGFuIHdoYXQgaXMgdXNlZCBmb3IgY2hhcmFjdGVyCgkJZW5jb2RpbmcuICBTZWUgfG11bHRpLWxhbmd8LgoKCQkJCQkJKnY6bGNfdGltZSogKmxjX3RpbWUtdmFyaWFibGUqCnY6bGNfdGltZQlUaGUgY3VycmVudCBsb2NhbGUgc2V0dGluZyBmb3IgdGltZSBtZXNzYWdlcyBvZiB0aGUgcnVudGltZQoJCWVudmlyb25tZW50LiAgVGhpcyBhbGxvd3MgVmltIHNjcmlwdHMgdG8gYmUgYXdhcmUgb2YgdGhlCgkJY3VycmVudCBsYW5ndWFnZS4gIFRlY2huaWNhbDogaXQncyB0aGUgdmFsdWUgb2YgTENfVElNRS4KCQlUaGlzIHZhcmlhYmxlIGNhbiBub3QgYmUgc2V0IGRpcmVjdGx5LCB1c2UgdGhlIHw6bGFuZ3VhZ2V8CgkJY29tbWFuZC4gIFNlZSB8bXVsdGktbGFuZ3wuCgoJCQkJCQkqdjpsbnVtKiAqbG51bS12YXJpYWJsZSoKdjpsbnVtCQlMaW5lIG51bWJlciBmb3IgdGhlICdmb2xkZXhwcicgfGZvbGQtZXhwcnwsICdmb3JtYXRleHByJyBhbmQKCQknaW5kZW50ZXhwcicgZXhwcmVzc2lvbnMsIHRhYiBwYWdlIG51bWJlciBmb3IgJ2d1aXRhYmxhYmVsJwoJCWFuZCAnZ3VpdGFidG9vbHRpcCcuICBPbmx5IHZhbGlkIHdoaWxlIG9uZSBvZiB0aGVzZQoJCWV4cHJlc3Npb25zIGlzIGJlaW5nIGV2YWx1YXRlZC4gIFJlYWQtb25seSB3aGVuIGluIHRoZQoJCXxzYW5kYm94fC4KCgkJCQkJKnY6bW91c2Vfd2luKiAqbW91c2Vfd2luLXZhcmlhYmxlKgp2Om1vdXNlX3dpbglXaW5kb3cgbnVtYmVyIGZvciBhIG1vdXNlIGNsaWNrIG9idGFpbmVkIHdpdGggfGdldGNoYXIoKXwuCgkJRmlyc3Qgd2luZG93IGhhcyBudW1iZXIgMSwgbGlrZSB3aXRoIHx3aW5ucigpfC4gIFRoZSB2YWx1ZSBpcwoJCXplcm8gd2hlbiB0aGVyZSB3YXMgbm8gbW91c2UgYnV0dG9uIGNsaWNrLgoKCQkJCQkqdjptb3VzZV9sbnVtKiAqbW91c2VfbG51bS12YXJpYWJsZSoKdjptb3VzZV9sbnVtCUxpbmUgbnVtYmVyIGZvciBhIG1vdXNlIGNsaWNrIG9idGFpbmVkIHdpdGggfGdldGNoYXIoKXwuCgkJVGhpcyBpcyB0aGUgdGV4dCBsaW5lIG51bWJlciwgbm90IHRoZSBzY3JlZW4gbGluZSBudW1iZXIuICBUaGUKCQl2YWx1ZSBpcyB6ZXJvIHdoZW4gdGhlcmUgd2FzIG5vIG1vdXNlIGJ1dHRvbiBjbGljay4KCgkJCQkJKnY6bW91c2VfY29sKiAqbW91c2VfY29sLXZhcmlhYmxlKgp2Om1vdXNlX2NvbAlDb2x1bW4gbnVtYmVyIGZvciBhIG1vdXNlIGNsaWNrIG9idGFpbmVkIHdpdGggfGdldGNoYXIoKXwuCgkJVGhpcyBpcyB0aGUgc2NyZWVuIGNvbHVtbiBudW1iZXIsIGxpa2Ugd2l0aCB8dmlydGNvbCgpfC4gIFRoZQoJCXZhbHVlIGlzIHplcm8gd2hlbiB0aGVyZSB3YXMgbm8gbW91c2UgYnV0dG9uIGNsaWNrLgoKCQkJCQkqdjpub25lKiAqbm9uZS12YXJpYWJsZSoKdjpub25lCQlBbiBlbXB0eSBTdHJpbmcuIFVzZWQgdG8gcHV0IGFuIGVtcHR5IGl0ZW0gaW4gSlNPTi4gIFNlZQoJCXxqc29uZW5jb2RlKCl8LgoJCVdoZW4gdXNlZCBhcyBhIG51bWJlciB0aGlzIGV2YWx1YXRlcyB0byB6ZXJvLgoJCVdoZW4gdXNlZCBhcyBhIHN0cmluZyB0aGlzIGV2YWx1YXRlcyB0byAibm9uZSIuID4KCQkJZWNobyB2Om5vbmUKPAkJCW5vbmUgfgoKCQkJCQkqdjpudWxsKiAqbnVsbC12YXJpYWJsZSoKdjpudWxsCQlBbiBlbXB0eSBTdHJpbmcuIFVzZWQgdG8gcHV0ICJudWxsIiBpbiBKU09OLiAgU2VlCgkJfGpzb25lbmNvZGUoKXwuCgkJV2hlbiB1c2VkIGFzIGEgbnVtYmVyIHRoaXMgZXZhbHVhdGVzIHRvIHplcm8uCgkJV2hlbiB1c2VkIGFzIGEgc3RyaW5nIHRoaXMgZXZhbHVhdGVzIHRvICJudWxsIi4gPgoJCQllY2hvIHY6bnVsbAo8CQkJbnVsbCB+CgoJCQkJCSp2Om9sZGZpbGVzKiAqb2xkZmlsZXMtdmFyaWFibGUqCnY6b2xkZmlsZXMJTGlzdCBvZiBmaWxlIG5hbWVzIHRoYXQgaXMgbG9hZGVkIGZyb20gdGhlIHx2aW1pbmZvfCBmaWxlIG9uCgkJc3RhcnR1cC4gIFRoZXNlIGFyZSB0aGUgZmlsZXMgdGhhdCBWaW0gcmVtZW1iZXJzIG1hcmtzIGZvci4KCQlUaGUgbGVuZ3RoIG9mIHRoZSBMaXN0IGlzIGxpbWl0ZWQgYnkgdGhlICcgYXJndW1lbnQgb2YgdGhlCgkJJ3ZpbWluZm8nIG9wdGlvbiAoZGVmYXVsdCBpcyAxMDApLgoJCVdoZW4gdGhlIHx2aW1pbmZvfCBmaWxlIGlzIG5vdCB1c2VkIHRoZSBMaXN0IGlzIGVtcHR5LgoJCUFsc28gc2VlIHw6b2xkZmlsZXN8IGFuZCB8Y18jPHwuCgkJVGhlIExpc3QgY2FuIGJlIG1vZGlmaWVkLCBidXQgdGhpcyBoYXMgbm8gZWZmZWN0IG9uIHdoYXQgaXMKCQlzdG9yZWQgaW4gdGhlIHx2aW1pbmZvfCBmaWxlIGxhdGVyLiAgSWYgeW91IHVzZSB2YWx1ZXMgb3RoZXIKCQl0aGFuIFN0cmluZyB0aGlzIHdpbGwgY2F1c2UgdHJvdWJsZS4KCQl7b25seSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrdmltaW5mb3wgZmVhdHVyZX0KCgkJCQkJCSAgICAqdjpvcHRpb25fbmV3Kgp2Om9wdGlvbl9uZXcgICAgTmV3IHZhbHVlIG9mIHRoZSBvcHRpb24uIFZhbGlkIHdoaWxlIGV4ZWN1dGluZyBhbiB8T3B0aW9uU2V0fAoJCWF1dG9jb21tYW5kLgoJCQkJCQkgICAgKnY6b3B0aW9uX29sZCoKdjpvcHRpb25fb2xkICAgIE9sZCB2YWx1ZSBvZiB0aGUgb3B0aW9uLiBWYWxpZCB3aGlsZSBleGVjdXRpbmcgYW4gfE9wdGlvblNldHwKCQlhdXRvY29tbWFuZC4KCQkJCQkJICAgICp2Om9wdGlvbl90eXBlKgp2Om9wdGlvbl90eXBlICAgU2NvcGUgb2YgdGhlIHNldCBjb21tYW5kLiBWYWxpZCB3aGlsZSBleGVjdXRpbmcgYW4KCQl8T3B0aW9uU2V0fCBhdXRvY29tbWFuZC4gQ2FuIGJlIGVpdGhlciAiZ2xvYmFsIiBvciAibG9jYWwiCgkJCQkJKnY6b3BlcmF0b3IqICpvcGVyYXRvci12YXJpYWJsZSoKdjpvcGVyYXRvcglUaGUgbGFzdCBvcGVyYXRvciBnaXZlbiBpbiBOb3JtYWwgbW9kZS4gIFRoaXMgaXMgYSBzaW5nbGUKCQljaGFyYWN0ZXIgZXhjZXB0IGZvciBjb21tYW5kcyBzdGFydGluZyB3aXRoIDxnPiBvciA8ej4sCgkJaW4gd2hpY2ggY2FzZSBpdCBpcyB0d28gY2hhcmFjdGVycy4gIEJlc3QgdXNlZCBhbG9uZ3NpZGUKCQl8djpwcmV2Y291bnR8IGFuZCB8djpyZWdpc3RlcnwuICBVc2VmdWwgaWYgeW91IHdhbnQgdG8gY2FuY2VsCgkJT3BlcmF0b3ItcGVuZGluZyBtb2RlIGFuZCB0aGVuIHVzZSB0aGUgb3BlcmF0b3IsIGUuZy46ID4KCQkJOm9tYXAgTyA8RXNjPjpjYWxsIE15TW90aW9uKHY6b3BlcmF0b3IpPENSPgo8CQlUaGUgdmFsdWUgcmVtYWlucyBzZXQgdW50aWwgYW5vdGhlciBvcGVyYXRvciBpcyBlbnRlcmVkLCB0aHVzCgkJZG9uJ3QgZXhwZWN0IGl0IHRvIGJlIGVtcHR5LgoJCXY6b3BlcmF0b3IgaXMgbm90IHNldCBmb3IgfDpkZWxldGV8LCB8Onlhbmt8IG9yIG90aGVyIEV4CgkJY29tbWFuZHMuCgkJUmVhZC1vbmx5LgoKCQkJCQkqdjpwcmV2Y291bnQqICpwcmV2Y291bnQtdmFyaWFibGUqCnY6cHJldmNvdW50CVRoZSBjb3VudCBnaXZlbiBmb3IgdGhlIGxhc3QgYnV0IG9uZSBOb3JtYWwgbW9kZSBjb21tYW5kLgoJCVRoaXMgaXMgdGhlIHY6Y291bnQgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNvbW1hbmQuICBVc2VmdWwgaWYKCQl5b3Ugd2FudCB0byBjYW5jZWwgVmlzdWFsIG9yIE9wZXJhdG9yLXBlbmRpbmcgbW9kZSBhbmQgdGhlbgoJCXVzZSB0aGUgY291bnQsIGUuZy46ID4KCQkJOnZtYXAgJSA8RXNjPjpjYWxsIE15RmlsdGVyKHY6cHJldmNvdW50KTxDUj4KPAkJUmVhZC1vbmx5LgoKCQkJCQkqdjpwcm9maWxpbmcqICpwcm9maWxpbmctdmFyaWFibGUqCnY6cHJvZmlsaW5nCU5vcm1hbGx5IHplcm8uCVNldCB0byBvbmUgYWZ0ZXIgdXNpbmcgIjpwcm9maWxlIHN0YXJ0Ii4KCQlTZWUgfHByb2ZpbGluZ3wuCgoJCQkJCSp2OnByb2duYW1lKiAqcHJvZ25hbWUtdmFyaWFibGUqCnY6cHJvZ25hbWUJQ29udGFpbnMgdGhlIG5hbWUgKHdpdGggcGF0aCByZW1vdmVkKSB3aXRoIHdoaWNoIFZpbSB3YXMKCQlpbnZva2VkLiAgQWxsb3dzIHlvdSB0byBkbyBzcGVjaWFsIGluaXRpYWxpc2F0aW9ucyBmb3IgfHZpZXd8LAoJCXxldmltfCBldGMuLCBvciBhbnkgb3RoZXIgbmFtZSB5b3UgbWlnaHQgc3ltbGluayB0byBWaW0uCgkJUmVhZC1vbmx5LgoKCQkJCQkqdjpwcm9ncGF0aCogKnByb2dwYXRoLXZhcmlhYmxlKgp2OnByb2dwYXRoCUNvbnRhaW5zIHRoZSBjb21tYW5kIHdpdGggd2hpY2ggVmltIHdhcyBpbnZva2VkLCBpbmNsdWRpbmcgdGhlCgkJcGF0aC4gIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBtZXNzYWdlIGEgVmltIHNlcnZlciB1c2luZyBhCgkJfC0tcmVtb3RlLWV4cHJ8LgoJCVRvIGdldCB0aGUgZnVsbCBwYXRoIHVzZTogPgoJCQllY2hvIGV4ZXBhdGgodjpwcm9ncGF0aCkKPAkJTk9URTogVGhpcyBkb2VzIG5vdCB3b3JrIHdoZW4gdGhlIGNvbW1hbmQgaXMgYSByZWxhdGl2ZSBwYXRoCgkJYW5kIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4KCQlSZWFkLW9ubHkuCgoJCQkJCSp2OnJlZ2lzdGVyKiAqcmVnaXN0ZXItdmFyaWFibGUqCnY6cmVnaXN0ZXIJVGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyIGluIGVmZmVjdCBmb3IgdGhlIGN1cnJlbnQgbm9ybWFsIG1vZGUKCQljb21tYW5kIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhhdCBjb21tYW5kIGFjdHVhbGx5IHVzZWQgYQoJCXJlZ2lzdGVyKS4gIE9yIGZvciB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBub3JtYWwgbW9kZSBtYXBwaW5nCgkJKHVzZSB0aGlzIGluIGN1c3RvbSBjb21tYW5kcyB0aGF0IHRha2UgYSByZWdpc3RlcikuCgkJSWYgbm9uZSBpcyBzdXBwbGllZCBpdCBpcyB0aGUgZGVmYXVsdCByZWdpc3RlciAnIicsIHVubGVzcwoJCSdjbGlwYm9hcmQnIGNvbnRhaW5zICJ1bm5hbWVkIiBvciAidW5uYW1lZHBsdXMiLCB0aGVuIGl0IGlzCgkJJyonIG9yICcrJy4KCQlBbHNvIHNlZSB8Z2V0cmVnKCl8IGFuZCB8c2V0cmVnKCl8CgoJCQkJCSp2OnNjcm9sbHN0YXJ0KiAqc2Nyb2xsc3RhcnQtdmFyaWFibGUqCnY6c2Nyb2xsc3RhcnQJU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNjcmlwdCBvciBmdW5jdGlvbiB0aGF0IGNhdXNlZCB0aGUKCQlzY3JlZW4gdG8gc2Nyb2xsIHVwLiAgSXQncyBvbmx5IHNldCB3aGVuIGl0IGlzIGVtcHR5LCB0aHVzIHRoZQoJCWZpcnN0IHJlYXNvbiBpcyByZW1lbWJlcmVkLiAgSXQgaXMgc2V0IHRvICJVbmtub3duIiBmb3IgYQoJCXR5cGVkIGNvbW1hbmQuCgkJVGhpcyBjYW4gYmUgdXNlZCB0byBmaW5kIG91dCB3aHkgeW91ciBzY3JpcHQgY2F1c2VzIHRoZQoJCWhpdC1lbnRlciBwcm9tcHQuCgoJCQkJCSp2OnNlcnZlcm5hbWUqICpzZXJ2ZXJuYW1lLXZhcmlhYmxlKgp2OnNlcnZlcm5hbWUJVGhlIHJlc3VsdGluZyByZWdpc3RlcmVkIHx4MTEtY2xpZW50c2VydmVyfCBuYW1lIGlmIGFueS4KCQlSZWFkLW9ubHkuCgoJCQp2OnNlYXJjaGZvcndhcmQJCQkqdjpzZWFyY2hmb3J3YXJkKiAqc2VhcmNoZm9yd2FyZC12YXJpYWJsZSoKCQlTZWFyY2ggZGlyZWN0aW9uOiAgMSBhZnRlciBhIGZvcndhcmQgc2VhcmNoLCAwIGFmdGVyIGEKCQliYWNrd2FyZCBzZWFyY2guICBJdCBpcyByZXNldCB0byBmb3J3YXJkIHdoZW4gZGlyZWN0bHkgc2V0dGluZwoJCXRoZSBsYXN0IHNlYXJjaCBwYXR0ZXJuLCBzZWUgfHF1b3RlL3wuCgkJTm90ZSB0aGF0IHRoZSB2YWx1ZSBpcyByZXN0b3JlZCB3aGVuIHJldHVybmluZyBmcm9tIGEKCQlmdW5jdGlvbi4gfGZ1bmN0aW9uLXNlYXJjaC11bmRvfC4KCQlSZWFkLXdyaXRlLgoKCQkJCQkqdjpzaGVsbF9lcnJvciogKnNoZWxsX2Vycm9yLXZhcmlhYmxlKgp2OnNoZWxsX2Vycm9yCVJlc3VsdCBvZiB0aGUgbGFzdCBzaGVsbCBjb21tYW5kLiAgV2hlbiBub24temVybywgdGhlIGxhc3QKCQlzaGVsbCBjb21tYW5kIGhhZCBhbiBlcnJvci4gIFdoZW4gemVybywgdGhlcmUgd2FzIG5vIHByb2JsZW0uCgkJVGhpcyBvbmx5IHdvcmtzIHdoZW4gdGhlIHNoZWxsIHJldHVybnMgdGhlIGVycm9yIGNvZGUgdG8gVmltLgoJCVRoZSB2YWx1ZSAtMSBpcyBvZnRlbiB1c2VkIHdoZW4gdGhlIGNvbW1hbmQgY291bGQgbm90IGJlCgkJZXhlY3V0ZWQuICBSZWFkLW9ubHkuCgkJRXhhbXBsZTogPgoJOiFtdiBmb28gYmFyCgk6aWYgdjpzaGVsbF9lcnJvcgoJOiAgZWNobyAnY291bGQgbm90IHJlbmFtZSAiZm9vIiB0byAiYmFyIiEnCgk6ZW5kaWYKPAkJInNoZWxsX2Vycm9yIiBhbHNvIHdvcmtzLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgoJCQkJCSp2OnN0YXR1c21zZyogKnN0YXR1c21zZy12YXJpYWJsZSoKdjpzdGF0dXNtc2cJTGFzdCBnaXZlbiBzdGF0dXMgbWVzc2FnZS4gIEl0J3MgYWxsb3dlZCB0byBzZXQgdGhpcyB2YXJpYWJsZS4KCgkJCQkJKnY6c3dhcG5hbWUqICpzd2FwbmFtZS12YXJpYWJsZSoKdjpzd2FwbmFtZQlPbmx5IHZhbGlkIHdoZW4gZXhlY3V0aW5nIHxTd2FwRXhpc3RzfCBhdXRvY29tbWFuZHM6IE5hbWUgb2YKCQl0aGUgc3dhcCBmaWxlIGZvdW5kLiAgUmVhZC1vbmx5LgoKCQkJCQkqdjpzd2FwY2hvaWNlKiAqc3dhcGNob2ljZS12YXJpYWJsZSoKdjpzd2FwY2hvaWNlCXxTd2FwRXhpc3RzfCBhdXRvY29tbWFuZHMgY2FuIHNldCB0aGlzIHRvIHRoZSBzZWxlY3RlZCBjaG9pY2UKCQlmb3IgaGFuZGxpbmcgYW4gZXhpc3Rpbmcgc3dhcCBmaWxlOgoJCQknbycJT3BlbiByZWFkLW9ubHkKCQkJJ2UnCUVkaXQgYW55d2F5CgkJCSdyJwlSZWNvdmVyCgkJCSdkJwlEZWxldGUgc3dhcGZpbGUKCQkJJ3EnCVF1aXQKCQkJJ2EnCUFib3J0CgkJVGhlIHZhbHVlIHNob3VsZCBiZSBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nLglBbiBlbXB0eSB2YWx1ZQoJCXJlc3VsdHMgaW4gdGhlIHVzZXIgYmVpbmcgYXNrZWQsIGFzIHdvdWxkIGhhcHBlbiB3aGVuIHRoZXJlIGlzCgkJbm8gU3dhcEV4aXN0cyBhdXRvY29tbWFuZC4gIFRoZSBkZWZhdWx0IGlzIGVtcHR5LgoKCQkJCQkqdjpzd2FwY29tbWFuZCogKnN3YXBjb21tYW5kLXZhcmlhYmxlKgp2OnN3YXBjb21tYW5kCU5vcm1hbCBtb2RlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgYSBmaWxlIGhhcyBiZWVuCgkJb3BlbmVkLiAgQ2FuIGJlIHVzZWQgZm9yIGEgfFN3YXBFeGlzdHN8IGF1dG9jb21tYW5kIHRvIGhhdmUKCQlhbm90aGVyIFZpbSBvcGVuIHRoZSBmaWxlIGFuZCBqdW1wIHRvIHRoZSByaWdodCBwbGFjZS4JRm9yCgkJZXhhbXBsZSwgd2hlbiBqdW1waW5nIHRvIGEgdGFnIHRoZSB2YWx1ZSBpcyAiOnRhZyB0YWduYW1lXHIiLgoJCUZvciAiOmVkaXQgK2NtZCBmaWxlIiB0aGUgdmFsdWUgaXMgIjpjbWRcciIuCgoJCQkJKnY6dGVybXJlc3BvbnNlKiAqdGVybXJlc3BvbnNlLXZhcmlhYmxlKgp2OnRlcm1yZXNwb25zZQlUaGUgZXNjYXBlIHNlcXVlbmNlIHJldHVybmVkIGJ5IHRoZSB0ZXJtaW5hbCBmb3IgdGhlIHx0X1JWfAoJCXRlcm1jYXAgZW50cnkuCUl0IGlzIHNldCB3aGVuIFZpbSByZWNlaXZlcyBhbiBlc2NhcGUgc2VxdWVuY2UKCQl0aGF0IHN0YXJ0cyB3aXRoIEVTQyBbIG9yIENTSSBhbmQgZW5kcyBpbiBhICdjJywgd2l0aCBvbmx5CgkJZGlnaXRzLCAnOycgYW5kICcuJyBpbiBiZXR3ZWVuLgoJCVdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCB0aGUgVGVybVJlc3BvbnNlIGF1dG9jb21tYW5kIGV2ZW50IGlzCgkJZmlyZWQsIHNvIHRoYXQgeW91IGNhbiByZWFjdCB0byB0aGUgcmVzcG9uc2UgZnJvbSB0aGUKCQl0ZXJtaW5hbC4KCQlUaGUgcmVzcG9uc2UgZnJvbSBhIG5ldyB4dGVybSBpczogIjxFc2M+WyBQcCA7IFB2IDsgUGMgYyIuICBQcAoJCWlzIHRoZSB0ZXJtaW5hbCB0eXBlOiAwIGZvciB2dDEwMCBhbmQgMSBmb3IgdnQyMjAuICBQdiBpcyB0aGUKCQlwYXRjaCBsZXZlbCAoc2luY2UgdGhpcyB3YXMgaW50cm9kdWNlZCBpbiBwYXRjaCA5NSwgaXQncwoJCWFsd2F5cyA5NSBvciBiaWdnZXIpLiAgUGMgaXMgYWx3YXlzIHplcm8uCgkJe29ubHkgd2hlbiBjb21waWxlZCB3aXRoIHwrdGVybXJlc3BvbnNlfCBmZWF0dXJlfQoKCQkJCSp2OnRoaXNfc2Vzc2lvbiogKnRoaXNfc2Vzc2lvbi12YXJpYWJsZSoKdjp0aGlzX3Nlc3Npb24JRnVsbCBmaWxlbmFtZSBvZiB0aGUgbGFzdCBsb2FkZWQgb3Igc2F2ZWQgc2Vzc2lvbiBmaWxlLiAgU2VlCgkJfDpta3Nlc3Npb258LiAgSXQgaXMgYWxsb3dlZCB0byBzZXQgdGhpcyB2YXJpYWJsZS4gIFdoZW4gbm8KCQlzZXNzaW9uIGZpbGUgaGFzIGJlZW4gc2F2ZWQsIHRoaXMgdmFyaWFibGUgaXMgZW1wdHkuCgkJInRoaXNfc2Vzc2lvbiIgYWxzbyB3b3JrcywgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKCQkJCQkqdjp0aHJvd3BvaW50KiAqdGhyb3dwb2ludC12YXJpYWJsZSoKdjp0aHJvd3BvaW50CVRoZSBwb2ludCB3aGVyZSB0aGUgZXhjZXB0aW9uIG1vc3QgcmVjZW50bHkgY2F1Z2h0IGFuZCBub3QKCQlmaW5pc2hlZCB3YXMgdGhyb3duLiAgTm90IHNldCB3aGVuIGNvbW1hbmRzIGFyZSB0eXBlZC4JU2VlCgkJYWxzbyB8djpleGNlcHRpb258IGFuZCB8dGhyb3ctdmFyaWFibGVzfC4KCQlFeGFtcGxlOiA+Cgk6dHJ5Cgk6ICB0aHJvdyAib29wcyIKCTpjYXRjaCAvLiovCgk6ICBlY2hvICJFeGNlcHRpb24gZnJvbSIgdjp0aHJvd3BvaW50Cgk6ZW5kdHJ5CjwJCU91dHB1dDogIkV4Y2VwdGlvbiBmcm9tIHRlc3QudmltLCBsaW5lIDIiCgoJCQkJCQkqdjp0cnVlKiAqdHJ1ZS12YXJpYWJsZSoKdjp0cnVlCQlBIE51bWJlciB3aXRoIHZhbHVlIG9uZS4gVXNlZCB0byBwdXQgInRydWUiIGluIEpTT04uICBTZWUKCQl8anNvbmVuY29kZSgpfC4KCQlXaGVuIHVzZWQgYXMgYSBzdHJpbmcgdGhpcyBldmFsdWF0ZXMgdG8gInRydWUiLiA+CgkJCWVjaG8gdjp0cnVlCjwJCQl0cnVlIH4KCQkJCQkJKnY6dmFsKiAqdmFsLXZhcmlhYmxlKgp2OnZhbAkJVmFsdWUgb2YgdGhlIGN1cnJlbnQgaXRlbSBvZiBhIHxMaXN0fCBvciB8RGljdGlvbmFyeXwuCU9ubHkKCQl2YWxpZCB3aGlsZSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHVzZWQgd2l0aCB8bWFwKCl8IGFuZAoJCXxmaWx0ZXIoKXwuICBSZWFkLW9ubHkuCgoJCQkJCSp2OnZlcnNpb24qICp2ZXJzaW9uLXZhcmlhYmxlKgp2OnZlcnNpb24JVmVyc2lvbiBudW1iZXIgb2YgVmltOiBNYWpvciB2ZXJzaW9uIG51bWJlciB0aW1lcyAxMDAgcGx1cwoJCW1pbm9yIHZlcnNpb24gbnVtYmVyLiAgVmVyc2lvbiA1LjAgaXMgNTAwLiAgVmVyc2lvbiA1LjEgKDUuMDEpCgkJaXMgNTAxLiAgUmVhZC1vbmx5LiAgInZlcnNpb24iIGFsc28gd29ya3MsIGZvciBiYWNrd2FyZHMKCQljb21wYXRpYmlsaXR5LgoJCVVzZSB8aGFzKCl8IHRvIGNoZWNrIGlmIGEgY2VydGFpbiBwYXRjaCB3YXMgaW5jbHVkZWQsIGUuZy46ID4KCQkJaWYgaGFzKCJwYXRjaC03LjQuMTIzIikKPAkJTm90ZSB0aGF0IHBhdGNoIG51bWJlcnMgYXJlIHNwZWNpZmljIHRvIHRoZSB2ZXJzaW9uLCB0aHVzIGJvdGgKCQl2ZXJzaW9uIDUuMCBhbmQgNS4xIG1heSBoYXZlIGEgcGF0Y2ggMTIzLCBidXQgdGhlc2UgYXJlCgkJY29tcGxldGVseSBkaWZmZXJlbnQuCgoJCQkJCSp2Ondhcm5pbmdtc2cqICp3YXJuaW5nbXNnLXZhcmlhYmxlKgp2Ondhcm5pbmdtc2cJTGFzdCBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UuICBJdCdzIGFsbG93ZWQgdG8gc2V0IHRoaXMgdmFyaWFibGUuCgoJCQkJCSp2OndpbmRvd2lkKiAqd2luZG93aWQtdmFyaWFibGUqCnY6d2luZG93aWQJV2hlbiBhbnkgWDExIGJhc2VkIEdVSSBpcyBydW5uaW5nIG9yIHdoZW4gcnVubmluZyBpbiBhCgkJdGVybWluYWwgYW5kIFZpbSBjb25uZWN0cyB0byB0aGUgWCBzZXJ2ZXIgKHwtWHwpIHRoaXMgd2lsbCBiZQoJCXNldCB0byB0aGUgd2luZG93IElELgoJCVdoZW4gYW4gTVMtV2luZG93cyBHVUkgaXMgcnVubmluZyB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZQoJCXdpbmRvdyBoYW5kbGUuCgkJT3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyB6ZXJvLgoJCU5vdGU6IGZvciB3aW5kb3dzIGluc2lkZSBWaW0gdXNlIHx3aW5ucigpfC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBCdWlsdGluIEZ1bmN0aW9ucwkJCQkJKmZ1bmN0aW9ucyoKClNlZSB8ZnVuY3Rpb24tbGlzdHwgZm9yIGEgbGlzdCBncm91cGVkIGJ5IHdoYXQgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yLgoKKFVzZSBDVFJMLV0gb24gdGhlIGZ1bmN0aW9uIG5hbWUgdG8ganVtcCB0byB0aGUgZnVsbCBleHBsYW5hdGlvbi4pCgpVU0FHRQkJCQlSRVNVTFQJREVTQ1JJUFRJT04JfgoKYWJzKCB7ZXhwcn0pCQkJRmxvYXQgb3IgTnVtYmVyICBhYnNvbHV0ZSB2YWx1ZSBvZiB7ZXhwcn0KYWNvcygge2V4cHJ9KQkJCUZsb2F0CWFyYyBjb3NpbmUgb2Yge2V4cHJ9CmFkZCgge2xpc3R9LCB7aXRlbX0pCQlMaXN0CWFwcGVuZCB7aXRlbX0gdG8gfExpc3R8IHtsaXN0fQphbGxvY19mYWlsKCB7aWR9LCB7Y291bnRkb3dufSwge3JlcGVhdH0pCgkJCQlub25lCW1ha2UgbWVtb3J5IGFsbG9jYXRpb24gZmFpbAphbmQoIHtleHByfSwge2V4cHJ9KQkJTnVtYmVyICBiaXR3aXNlIEFORAphcHBlbmQoIHtsbnVtfSwge3N0cmluZ30pCU51bWJlcglhcHBlbmQge3N0cmluZ30gYmVsb3cgbGluZSB7bG51bX0KYXBwZW5kKCB7bG51bX0sIHtsaXN0fSkJCU51bWJlcglhcHBlbmQgbGluZXMge2xpc3R9IGJlbG93IGxpbmUge2xudW19CmFyZ2MoKQkJCQlOdW1iZXIJbnVtYmVyIG9mIGZpbGVzIGluIHRoZSBhcmd1bWVudCBsaXN0CmFyZ2lkeCgpCQkJTnVtYmVyCWN1cnJlbnQgaW5kZXggaW4gdGhlIGFyZ3VtZW50IGxpc3QKYXJnbGlzdGlkKCBbe3dpbm5yfSBbLCB7dGFibnJ9XV0pCgkJCQlOdW1iZXIJYXJndW1lbnQgbGlzdCBpZAphcmd2KCB7bnJ9KQkJCVN0cmluZwl7bnJ9IGVudHJ5IG9mIHRoZSBhcmd1bWVudCBsaXN0CmFyZ3YoICkJCQkJTGlzdAl0aGUgYXJndW1lbnQgbGlzdAphc3NlcnRfZXF1YWwoIHtleHB9LCB7YWN0fSBbLCB7bXNnfV0pIG5vbmUgIGFzc2VydCB7ZXhwfSBlcXVhbHMge2FjdH0KYXNzZXJ0X2V4Y2VwdGlvbih7ZXJyb3J9IFssIHttc2d9XSkgICBub25lICBhc3NlcnQge2Vycm9yfSBpcyBpbiB2OmV4Y2VwdGlvbgphc3NlcnRfZmFpbHMoIHtjbWR9IFssIHtlcnJvcn1dKSAgICAgIG5vbmUgIGFzc2VydCB7Y21kfSBmYWlscwphc3NlcnRfZmFsc2UoIHthY3R1YWx9IFssIHttc2d9XSkgICAgIG5vbmUgIGFzc2VydCB7YWN0dWFsfSBpcyBmYWxzZQphc3NlcnRfdHJ1ZSgge2FjdHVhbH0gWywge21zZ31dKSAgICAgIG5vbmUgIGFzc2VydCB7YWN0dWFsfSBpcyB0cnVlCmFzaW4oIHtleHByfSkJCQlGbG9hdAlhcmMgc2luZSBvZiB7ZXhwcn0KYXRhbigge2V4cHJ9KQkJCUZsb2F0CWFyYyB0YW5nZW50IG9mIHtleHByfQphdGFuMigge2V4cHJ9LCB7ZXhwcn0pCQlGbG9hdCAgIGFyYyB0YW5nZW50IG9mIHtleHByMX0gLyB7ZXhwcjJ9CmJyb3dzZSgge3NhdmV9LCB7dGl0bGV9LCB7aW5pdGRpcn0sIHtkZWZhdWx0fSkKCQkJCVN0cmluZwlwdXQgdXAgYSBmaWxlIHJlcXVlc3Rlcgpicm93c2VkaXIoIHt0aXRsZX0sIHtpbml0ZGlyfSkJU3RyaW5nCXB1dCB1cCBhIGRpcmVjdG9yeSByZXF1ZXN0ZXIKYnVmZXhpc3RzKCB7ZXhwcn0pCQlOdW1iZXIJVFJVRSBpZiBidWZmZXIge2V4cHJ9IGV4aXN0cwpidWZsaXN0ZWQoIHtleHByfSkJCU51bWJlcglUUlVFIGlmIGJ1ZmZlciB7ZXhwcn0gaXMgbGlzdGVkCmJ1ZmxvYWRlZCgge2V4cHJ9KQkJTnVtYmVyCVRSVUUgaWYgYnVmZmVyIHtleHByfSBpcyBsb2FkZWQKYnVmbmFtZSgge2V4cHJ9KQkJU3RyaW5nCU5hbWUgb2YgdGhlIGJ1ZmZlciB7ZXhwcn0KYnVmbnIoIHtleHByfSBbLCB7Y3JlYXRlfV0pCU51bWJlcglOdW1iZXIgb2YgdGhlIGJ1ZmZlciB7ZXhwcn0KYnVmd2lubnIoIHtleHByfSkJCU51bWJlcgl3aW5kb3cgbnVtYmVyIG9mIGJ1ZmZlciB7ZXhwcn0KYnl0ZTJsaW5lKCB7Ynl0ZX0pCQlOdW1iZXIJbGluZSBudW1iZXIgYXQgYnl0ZSBjb3VudCB7Ynl0ZX0KYnl0ZWlkeCgge2V4cHJ9LCB7bnJ9KQkJTnVtYmVyCWJ5dGUgaW5kZXggb2Yge25yfSd0aCBjaGFyIGluIHtleHByfQpieXRlaWR4Y29tcCgge2V4cHJ9LCB7bnJ9KQlOdW1iZXIJYnl0ZSBpbmRleCBvZiB7bnJ9J3RoIGNoYXIgaW4ge2V4cHJ9CmNhbGwoIHtmdW5jfSwge2FyZ2xpc3R9IFssIHtkaWN0fV0pCgkJCQlhbnkJY2FsbCB7ZnVuY30gd2l0aCBhcmd1bWVudHMge2FyZ2xpc3R9CmNlaWwoIHtleHByfSkJCQlGbG9hdAlyb3VuZCB7ZXhwcn0gdXAKY2hfY2xvc2UoIHtoYW5kbGV9KQkJbm9uZQljbG9zZSBhIGNoYW5uZWwKY2hfb3Blbigge2FkZHJlc3N9IFssIHthcmdkaWN0fSldIE51bWJlciBvcGVuIGEgY2hhbm5lbCB0byB7YWRkcmVzc30KY2hfc2VuZGV4cHIoIHtoYW5kbGV9LCB7ZXhwcn0gWywge2NhbGxiYWNrfV0pCgkJCQlhbnkJc2VuZCB7ZXhwcn0gb3ZlciBKU09OIGNoYW5uZWwge2hhbmRsZX0KY2hfc2VuZHJhdygge2hhbmRsZX0sIHtzdHJpbmd9IFssIHtjYWxsYmFja31dKQoJCQkJYW55CXNlbmQge3N0cmluZ30gb3ZlciByYXcgY2hhbm5lbCB7aGFuZGxlfQpjaGFuZ2VucigpCQkJTnVtYmVyCWN1cnJlbnQgY2hhbmdlIG51bWJlcgpjaGFyMm5yKCB7ZXhwcn1bLCB7dXRmOH1dKQlOdW1iZXIJQVNDSUkvVVRGOCB2YWx1ZSBvZiBmaXJzdCBjaGFyIGluIHtleHByfQpjaW5kZW50KCB7bG51bX0pCQlOdW1iZXIJQyBpbmRlbnQgZm9yIGxpbmUge2xudW19CmNsZWFybWF0Y2hlcygpCQkJbm9uZQljbGVhciBhbGwgbWF0Y2hlcwpjb2woIHtleHByfSkJCQlOdW1iZXIJY29sdW1uIG5yIG9mIGN1cnNvciBvciBtYXJrCmNvbXBsZXRlKCB7c3RhcnRjb2x9LCB7bWF0Y2hlc30pIG5vbmUJc2V0IEluc2VydCBtb2RlIGNvbXBsZXRpb24KY29tcGxldGVfYWRkKCB7ZXhwcn0pCQlOdW1iZXIJYWRkIGNvbXBsZXRpb24gbWF0Y2gKY29tcGxldGVfY2hlY2soKQkJTnVtYmVyCWNoZWNrIGZvciBrZXkgdHlwZWQgZHVyaW5nIGNvbXBsZXRpb24KY29uZmlybSgge21zZ30gWywge2Nob2ljZXN9IFssIHtkZWZhdWx0fSBbLCB7dHlwZX1dXV0pCgkJCQlOdW1iZXIJbnVtYmVyIG9mIGNob2ljZSBwaWNrZWQgYnkgdXNlcgpjb3B5KCB7ZXhwcn0pCQkJYW55CW1ha2UgYSBzaGFsbG93IGNvcHkgb2Yge2V4cHJ9CmNvcygge2V4cHJ9KQkJCUZsb2F0CWNvc2luZSBvZiB7ZXhwcn0KY29zaCgge2V4cHJ9KQkJCUZsb2F0CWh5cGVyYm9saWMgY29zaW5lIG9mIHtleHByfQpjb3VudCgge2xpc3R9LCB7ZXhwcn0gWywge2ljfSBbLCB7c3RhcnR9XV0pCgkJCQlOdW1iZXIJIGNvdW50IGhvdyBtYW55IHtleHByfSBhcmUgaW4ge2xpc3R9CmNzY29wZV9jb25uZWN0aW9uKCBbe251bX0gLCB7ZGJwYXRofSBbLCB7cHJlcGVuZH1dXSkKCQkJCU51bWJlcgljaGVja3MgZXhpc3RlbmNlIG9mIGNzY29wZSBjb25uZWN0aW9uCmN1cnNvcigge2xudW19LCB7Y29sfSBbLCB7b2ZmfV0pCgkJCQlOdW1iZXIJbW92ZSBjdXJzb3IgdG8ge2xudW19LCB7Y29sfSwge29mZn0KY3Vyc29yKCB7bGlzdH0pCQkJTnVtYmVyCW1vdmUgY3Vyc29yIHRvIHBvc2l0aW9uIGluIHtsaXN0fQpkZWVwY29weSgge2V4cHJ9IFssIHtub3JlZn1dKQlhbnkJbWFrZSBhIGZ1bGwgY29weSBvZiB7ZXhwcn0KZGVsZXRlKCB7Zm5hbWV9IFssIHtmbGFnc31dKQlOdW1iZXIJZGVsZXRlIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB7Zm5hbWV9CmRpZF9maWxldHlwZSgpCQkJTnVtYmVyCVRSVUUgaWYgRmlsZVR5cGUgYXV0b2NvbW1hbmQgZXZlbnQgdXNlZApkaWZmX2ZpbGxlcigge2xudW19KQkJTnVtYmVyCWRpZmYgZmlsbGVyIGxpbmVzIGFib3V0IHtsbnVtfQpkaWZmX2hsSUQoIHtsbnVtfSwge2NvbH0pCU51bWJlcglkaWZmIGhpZ2hsaWdodGluZyBhdCB7bG51bX0ve2NvbH0KZW1wdHkoIHtleHByfSkJCQlOdW1iZXIJVFJVRSBpZiB7ZXhwcn0gaXMgZW1wdHkKZXNjYXBlKCB7c3RyaW5nfSwge2NoYXJzfSkJU3RyaW5nCWVzY2FwZSB7Y2hhcnN9IGluIHtzdHJpbmd9IHdpdGggJ1wnCmV2YWwoIHtzdHJpbmd9KQkJCWFueQlldmFsdWF0ZSB7c3RyaW5nfSBpbnRvIGl0cyB2YWx1ZQpldmVudGhhbmRsZXIoICkJCQlOdW1iZXIJVFJVRSBpZiBpbnNpZGUgYW4gZXZlbnQgaGFuZGxlcgpleGVjdXRhYmxlKCB7ZXhwcn0pCQlOdW1iZXIJMSBpZiBleGVjdXRhYmxlIHtleHByfSBleGlzdHMKZXhlcGF0aCgge2V4cHJ9KQkJU3RyaW5nICBmdWxsIHBhdGggb2YgdGhlIGNvbW1hbmQge2V4cHJ9CmV4aXN0cygge2V4cHJ9KQkJCU51bWJlcglUUlVFIGlmIHtleHByfSBleGlzdHMKZXh0ZW5kKCB7ZXhwcjF9LCB7ZXhwcjJ9IFssIHtleHByM31dKQoJCQkJTGlzdC9EaWN0IGluc2VydCBpdGVtcyBvZiB7ZXhwcjJ9IGludG8ge2V4cHIxfQpleHAoIHtleHByfSkJCQlGbG9hdAlleHBvbmVudGlhbCBvZiB7ZXhwcn0KZXhwYW5kKCB7ZXhwcn0gWywge25vc3VmfSBbLCB7bGlzdH1dXSkKCQkJCWFueQlleHBhbmQgc3BlY2lhbCBrZXl3b3JkcyBpbiB7ZXhwcn0KZmVlZGtleXMoIHtzdHJpbmd9IFssIHttb2RlfV0pCU51bWJlcglhZGQga2V5IHNlcXVlbmNlIHRvIHR5cGVhaGVhZCBidWZmZXIKZmlsZXJlYWRhYmxlKCB7ZmlsZX0pCQlOdW1iZXIJVFJVRSBpZiB7ZmlsZX0gaXMgYSByZWFkYWJsZSBmaWxlCmZpbGV3cml0YWJsZSgge2ZpbGV9KQkJTnVtYmVyCVRSVUUgaWYge2ZpbGV9IGlzIGEgd3JpdGFibGUgZmlsZQpmaWx0ZXIoIHtleHByfSwge3N0cmluZ30pCUxpc3QvRGljdCAgcmVtb3ZlIGl0ZW1zIGZyb20ge2V4cHJ9IHdoZXJlCgkJCQkJe3N0cmluZ30gaXMgMApmaW5kZGlyKCB7bmFtZX1bLCB7cGF0aH1bLCB7Y291bnR9XV0pCgkJCQlTdHJpbmcJZmluZCBkaXJlY3Rvcnkge25hbWV9IGluIHtwYXRofQpmaW5kZmlsZSgge25hbWV9Wywge3BhdGh9Wywge2NvdW50fV1dKQoJCQkJU3RyaW5nCWZpbmQgZmlsZSB7bmFtZX0gaW4ge3BhdGh9CmZsb2F0Mm5yKCB7ZXhwcn0pCQlOdW1iZXIJY29udmVydCBGbG9hdCB7ZXhwcn0gdG8gYSBOdW1iZXIKZmxvb3IoIHtleHByfSkJCQlGbG9hdAlyb3VuZCB7ZXhwcn0gZG93bgpmbW9kKCB7ZXhwcjF9LCB7ZXhwcjJ9KQkJRmxvYXQJcmVtYWluZGVyIG9mIHtleHByMX0gLyB7ZXhwcjJ9CmZuYW1lZXNjYXBlKCB7Zm5hbWV9KQkJU3RyaW5nCWVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4ge2ZuYW1lfQpmbmFtZW1vZGlmeSgge2ZuYW1lfSwge21vZHN9KQlTdHJpbmcJbW9kaWZ5IGZpbGUgbmFtZQpmb2xkY2xvc2VkKCB7bG51bX0pCQlOdW1iZXIJZmlyc3QgbGluZSBvZiBmb2xkIGF0IHtsbnVtfSBpZiBjbG9zZWQKZm9sZGNsb3NlZGVuZCgge2xudW19KQkJTnVtYmVyCWxhc3QgbGluZSBvZiBmb2xkIGF0IHtsbnVtfSBpZiBjbG9zZWQKZm9sZGxldmVsKCB7bG51bX0pCQlOdW1iZXIJZm9sZCBsZXZlbCBhdCB7bG51bX0KZm9sZHRleHQoICkJCQlTdHJpbmcJbGluZSBkaXNwbGF5ZWQgZm9yIGNsb3NlZCBmb2xkCmZvbGR0ZXh0cmVzdWx0KCB7bG51bX0pCQlTdHJpbmcJdGV4dCBmb3IgY2xvc2VkIGZvbGQgYXQge2xudW19CmZvcmVncm91bmQoICkJCQlOdW1iZXIJYnJpbmcgdGhlIFZpbSB3aW5kb3cgdG8gdGhlIGZvcmVncm91bmQKZnVuY3Rpb24oIHtuYW1lfSkJCUZ1bmNyZWYgcmVmZXJlbmNlIHRvIGZ1bmN0aW9uIHtuYW1lfQpnYXJiYWdlY29sbGVjdCggW3thdGV4aXR9XSkJbm9uZQlmcmVlIG1lbW9yeSwgYnJlYWtpbmcgY3ljbGljIHJlZmVyZW5jZXMKZ2V0KCB7bGlzdH0sIHtpZHh9IFssIHtkZWZ9XSkJYW55CWdldCBpdGVtIHtpZHh9IGZyb20ge2xpc3R9IG9yIHtkZWZ9CmdldCgge2RpY3R9LCB7a2V5fSBbLCB7ZGVmfV0pCWFueQlnZXQgaXRlbSB7a2V5fSBmcm9tIHtkaWN0fSBvciB7ZGVmfQpnZXRidWZsaW5lKCB7ZXhwcn0sIHtsbnVtfSBbLCB7ZW5kfV0pCgkJCQlMaXN0CWxpbmVzIHtsbnVtfSB0byB7ZW5kfSBvZiBidWZmZXIge2V4cHJ9CmdldGJ1ZnZhcigge2V4cHJ9LCB7dmFybmFtZX0gWywge2RlZn1dKQoJCQkJYW55CXZhcmlhYmxlIHt2YXJuYW1lfSBpbiBidWZmZXIge2V4cHJ9CmdldGNoYXIoIFtleHByXSkJCU51bWJlcglnZXQgb25lIGNoYXJhY3RlciBmcm9tIHRoZSB1c2VyCmdldGNoYXJtb2QoICkJCQlOdW1iZXIJbW9kaWZpZXJzIGZvciB0aGUgbGFzdCB0eXBlZCBjaGFyYWN0ZXIKZ2V0Y2hhcnNlYXJjaCgpCQkJRGljdAlsYXN0IGNoYXJhY3RlciBzZWFyY2gKZ2V0Y21kbGluZSgpCQkJU3RyaW5nCXJldHVybiB0aGUgY3VycmVudCBjb21tYW5kLWxpbmUKZ2V0Y21kcG9zKCkJCQlOdW1iZXIJcmV0dXJuIGN1cnNvciBwb3NpdGlvbiBpbiBjb21tYW5kLWxpbmUKZ2V0Y21kdHlwZSgpCQkJU3RyaW5nCXJldHVybiBjdXJyZW50IGNvbW1hbmQtbGluZSB0eXBlCmdldGNtZHdpbnR5cGUoKQkJCVN0cmluZwlyZXR1cm4gY3VycmVudCBjb21tYW5kLWxpbmUgd2luZG93IHR5cGUKZ2V0Y3VycG9zKCkJCQlMaXN0CXBvc2l0aW9uIG9mIHRoZSBjdXJzb3IKZ2V0Y3dkKCBbe3dpbm5yfSBbLCB7dGFibnJ9XV0pCVN0cmluZwlnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKZ2V0Zm9udG5hbWUoIFt7bmFtZX1dKQkJU3RyaW5nCW5hbWUgb2YgZm9udCBiZWluZyB1c2VkCmdldGZwZXJtKCB7Zm5hbWV9KQkJU3RyaW5nCWZpbGUgcGVybWlzc2lvbnMgb2YgZmlsZSB7Zm5hbWV9CmdldGZzaXplKCB7Zm5hbWV9KQkJTnVtYmVyCXNpemUgaW4gYnl0ZXMgb2YgZmlsZSB7Zm5hbWV9CmdldGZ0aW1lKCB7Zm5hbWV9KQkJTnVtYmVyCWxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgZmlsZQpnZXRmdHlwZSgge2ZuYW1lfSkJCVN0cmluZwlkZXNjcmlwdGlvbiBvZiB0eXBlIG9mIGZpbGUge2ZuYW1lfQpnZXRsaW5lKCB7bG51bX0pCQlTdHJpbmcJbGluZSB7bG51bX0gb2YgY3VycmVudCBidWZmZXIKZ2V0bGluZSgge2xudW19LCB7ZW5kfSkJCUxpc3QJbGluZXMge2xudW19IHRvIHtlbmR9IG9mIGN1cnJlbnQgYnVmZmVyCmdldGxvY2xpc3QoIHtucn0pCQlMaXN0CWxpc3Qgb2YgbG9jYXRpb24gbGlzdCBpdGVtcwpnZXRtYXRjaGVzKCkJCQlMaXN0CWxpc3Qgb2YgY3VycmVudCBtYXRjaGVzCmdldHBpZCgpCQkJTnVtYmVyCXByb2Nlc3MgSUQgb2YgVmltCmdldHBvcygge2V4cHJ9KQkJCUxpc3QJcG9zaXRpb24gb2YgY3Vyc29yLCBtYXJrLCBldGMuCmdldHFmbGlzdCgpCQkJTGlzdAlsaXN0IG9mIHF1aWNrZml4IGl0ZW1zCmdldHJlZyggW3tyZWduYW1lfSBbLCAxIFssIHtsaXN0fV1dXSkKCQkJCVN0cmluZyBvciBMaXN0ICAgY29udGVudHMgb2YgcmVnaXN0ZXIKZ2V0cmVndHlwZSggW3tyZWduYW1lfV0pCVN0cmluZwl0eXBlIG9mIHJlZ2lzdGVyCmdldHRhYnZhcigge25yfSwge3Zhcm5hbWV9IFssIHtkZWZ9XSkKCQkJCWFueQl2YXJpYWJsZSB7dmFybmFtZX0gaW4gdGFiIHtucn0gb3Ige2RlZn0KZ2V0dGFid2ludmFyKCB7dGFibnJ9LCB7d2lubnJ9LCB7bmFtZX0gWywge2RlZn1dKQoJCQkJYW55CXtuYW1lfSBpbiB7d2lubnJ9IGluIHRhYiBwYWdlIHt0YWJucn0KZ2V0d2lucG9zeCgpCQkJTnVtYmVyCVggY29vcmQgaW4gcGl4ZWxzIG9mIEdVSSBWaW0gd2luZG93CmdldHdpbnBvc3koKQkJCU51bWJlcglZIGNvb3JkIGluIHBpeGVscyBvZiBHVUkgVmltIHdpbmRvdwpnZXR3aW52YXIoIHtucn0sIHt2YXJuYW1lfSBbLCB7ZGVmfV0pCgkJCQlhbnkJdmFyaWFibGUge3Zhcm5hbWV9IGluIHdpbmRvdyB7bnJ9Cmdsb2IoIHtleHByfSBbLCB7bm9zdWZ9IFssIHtsaXN0fSBbLCB7YWxsbGlua3N9XV1dKQoJCQkJYW55CWV4cGFuZCBmaWxlIHdpbGRjYXJkcyBpbiB7ZXhwcn0KZ2xvYjJyZWdwYXQoIHtleHByfSkJCVN0cmluZyAgY29udmVydCBhIGdsb2IgcGF0IGludG8gYSBzZWFyY2ggcGF0Cmdsb2JwYXRoKCB7cGF0aH0sIHtleHByfSBbLCB7bm9zdWZ9IFssIHtsaXN0fSBbLCB7YWxsbGlua3N9XV1dKQoJCQkJU3RyaW5nCWRvIGdsb2Ioe2V4cHJ9KSBmb3IgYWxsIGRpcnMgaW4ge3BhdGh9Cmhhcygge2ZlYXR1cmV9KQkJCU51bWJlcglUUlVFIGlmIGZlYXR1cmUge2ZlYXR1cmV9IHN1cHBvcnRlZApoYXNfa2V5KCB7ZGljdH0sIHtrZXl9KQkJTnVtYmVyCVRSVUUgaWYge2RpY3R9IGhhcyBlbnRyeSB7a2V5fQpoYXNsb2NhbGRpciggW3t3aW5ucn0gWywge3RhYm5yfV1dKQoJCQkJTnVtYmVyCVRSVUUgaWYgdGhlIHdpbmRvdyBleGVjdXRlZCB8OmxjZHwKaGFzbWFwdG8oIHt3aGF0fSBbLCB7bW9kZX0gWywge2FiYnJ9XV0pCgkJCQlOdW1iZXIJVFJVRSBpZiBtYXBwaW5nIHRvIHt3aGF0fSBleGlzdHMKaGlzdGFkZCgge2hpc3Rvcnl9LHtpdGVtfSkJU3RyaW5nCWFkZCBhbiBpdGVtIHRvIGEgaGlzdG9yeQpoaXN0ZGVsKCB7aGlzdG9yeX0gWywge2l0ZW19XSkJU3RyaW5nCXJlbW92ZSBhbiBpdGVtIGZyb20gYSBoaXN0b3J5Cmhpc3RnZXQoIHtoaXN0b3J5fSBbLCB7aW5kZXh9XSkJU3RyaW5nCWdldCB0aGUgaXRlbSB7aW5kZXh9IGZyb20gYSBoaXN0b3J5Cmhpc3Rucigge2hpc3Rvcnl9KQkJTnVtYmVyCWhpZ2hlc3QgaW5kZXggb2YgYSBoaXN0b3J5CmhsZXhpc3RzKCB7bmFtZX0pCQlOdW1iZXIJVFJVRSBpZiBoaWdobGlnaHQgZ3JvdXAge25hbWV9IGV4aXN0cwpobElEKCB7bmFtZX0pCQkJTnVtYmVyCXN5bnRheCBJRCBvZiBoaWdobGlnaHQgZ3JvdXAge25hbWV9Cmhvc3RuYW1lKCkJCQlTdHJpbmcJbmFtZSBvZiB0aGUgbWFjaGluZSBWaW0gaXMgcnVubmluZyBvbgppY29udigge2V4cHJ9LCB7ZnJvbX0sIHt0b30pCVN0cmluZwljb252ZXJ0IGVuY29kaW5nIG9mIHtleHByfQppbmRlbnQoIHtsbnVtfSkJCQlOdW1iZXIJaW5kZW50IG9mIGxpbmUge2xudW19CmluZGV4KCB7bGlzdH0sIHtleHByfSBbLCB7c3RhcnR9IFssIHtpY31dXSkKCQkJCU51bWJlcglpbmRleCBpbiB7bGlzdH0gd2hlcmUge2V4cHJ9IGFwcGVhcnMKaW5wdXQoIHtwcm9tcHR9IFssIHt0ZXh0fSBbLCB7Y29tcGxldGlvbn1dXSkKCQkJCVN0cmluZwlnZXQgaW5wdXQgZnJvbSB0aGUgdXNlcgppbnB1dGRpYWxvZygge3B9IFssIHt0fSBbLCB7Y31dXSkgU3RyaW5nICBsaWtlIGlucHV0KCkgYnV0IGluIGEgR1VJIGRpYWxvZwppbnB1dGxpc3QoIHt0ZXh0bGlzdH0pCQlOdW1iZXIJbGV0IHRoZSB1c2VyIHBpY2sgZnJvbSBhIGNob2ljZSBsaXN0CmlucHV0cmVzdG9yZSgpCQkJTnVtYmVyCXJlc3RvcmUgdHlwZWFoZWFkCmlucHV0c2F2ZSgpCQkJTnVtYmVyCXNhdmUgYW5kIGNsZWFyIHR5cGVhaGVhZAppbnB1dHNlY3JldCgge3Byb21wdH0gWywge3RleHR9XSkgU3RyaW5nICBsaWtlIGlucHV0KCkgYnV0IGhpZGluZyB0aGUgdGV4dAppbnNlcnQoIHtsaXN0fSwge2l0ZW19IFssIHtpZHh9XSkgTGlzdAlpbnNlcnQge2l0ZW19IGluIHtsaXN0fSBbYmVmb3JlIHtpZHh9XQppbnZlcnQoIHtleHByfSkJCQlOdW1iZXIgIGJpdHdpc2UgaW52ZXJ0CmlzZGlyZWN0b3J5KCB7ZGlyZWN0b3J5fSkJTnVtYmVyCVRSVUUgaWYge2RpcmVjdG9yeX0gaXMgYSBkaXJlY3RvcnkKaXNsb2NrZWQoIHtleHByfSkJCU51bWJlcglUUlVFIGlmIHtleHByfSBpcyBsb2NrZWQKaXRlbXMoIHtkaWN0fSkJCQlMaXN0CWtleS12YWx1ZSBwYWlycyBpbiB7ZGljdH0Kam9iX3N0YXJ0KHtjb21tYW5kfSBbLCB7b3B0aW9uc31dKSBKb2IJc3RhcnQgYSBqb2IJCmpvYl9zdGF0dXMoe2pvYn0pCQlTdHJpbmcJZ2V0IHRoZSBzdGF0dXMgb2YgYSBqb2IKam9iX3N0b3Aoe2pvYn0gWywge2hvd31dKQlOdW1iZXIJc3RvcCBhIGpvYgpqb2luKCB7bGlzdH0gWywge3NlcH1dKQkJU3RyaW5nCWpvaW4ge2xpc3R9IGl0ZW1zIGludG8gb25lIFN0cmluZwpqc29uZGVjb2RlKCB7c3RyaW5nfSkJCWFueQlkZWNvZGUgSlNPTgpqc29uZW5jb2RlKCB7ZXhwcn0pCQlTdHJpbmcJZW5jb2RlIEpTT04Ka2V5cygge2RpY3R9KQkJCUxpc3QJa2V5cyBpbiB7ZGljdH0KbGVuKCB7ZXhwcn0pCQkJTnVtYmVyCXRoZSBsZW5ndGggb2Yge2V4cHJ9CmxpYmNhbGwoIHtsaWJ9LCB7ZnVuY30sIHthcmd9KQlTdHJpbmcJY2FsbCB7ZnVuY30gaW4gbGlicmFyeSB7bGlifSB3aXRoIHthcmd9CmxpYmNhbGxucigge2xpYn0sIHtmdW5jfSwge2FyZ30pICBOdW1iZXIgIGlkZW0sIGJ1dCByZXR1cm4gYSBOdW1iZXIKbGluZSgge2V4cHJ9KQkJCU51bWJlcglsaW5lIG5yIG9mIGN1cnNvciwgbGFzdCBsaW5lIG9yIG1hcmsKbGluZTJieXRlKCB7bG51bX0pCQlOdW1iZXIJYnl0ZSBjb3VudCBvZiBsaW5lIHtsbnVtfQpsaXNwaW5kZW50KCB7bG51bX0pCQlOdW1iZXIJTGlzcCBpbmRlbnQgZm9yIGxpbmUge2xudW19CmxvY2FsdGltZSgpCQkJTnVtYmVyCWN1cnJlbnQgdGltZQpsb2coIHtleHByfSkJCQlGbG9hdAluYXR1cmFsIGxvZ2FyaXRobSAoYmFzZSBlKSBvZiB7ZXhwcn0KbG9nMTAoIHtleHByfSkJCQlGbG9hdAlsb2dhcml0aG0gb2YgRmxvYXQge2V4cHJ9IHRvIGJhc2UgMTAKbHVhZXZhbCgge2V4cHJ9Wywge2V4cHJ9XSkJYW55CWV2YWx1YXRlIHxMdWF8IGV4cHJlc3Npb24KbWFwKCB7ZXhwcn0sIHtzdHJpbmd9KQkJTGlzdC9EaWN0ICBjaGFuZ2UgZWFjaCBpdGVtIGluIHtleHByfSB0byB7ZXhwcn0KbWFwYXJnKCB7bmFtZX1bLCB7bW9kZX0gWywge2FiYnJ9IFssIHtkaWN0fV1dXSkKCQkJCVN0cmluZyBvciBEaWN0CgkJCQkJcmhzIG9mIG1hcHBpbmcge25hbWV9IGluIG1vZGUge21vZGV9Cm1hcGNoZWNrKCB7bmFtZX1bLCB7bW9kZX0gWywge2FiYnJ9XV0pCgkJCQlTdHJpbmcJY2hlY2sgZm9yIG1hcHBpbmdzIG1hdGNoaW5nIHtuYW1lfQptYXRjaCgge2V4cHJ9LCB7cGF0fVssIHtzdGFydH1bLCB7Y291bnR9XV0pCgkJCQlOdW1iZXIJcG9zaXRpb24gd2hlcmUge3BhdH0gbWF0Y2hlcyBpbiB7ZXhwcn0KbWF0Y2hhZGQoIHtncm91cH0sIHtwYXR0ZXJufVssIHtwcmlvcml0eX1bLCB7aWR9XV0pCgkJCQlOdW1iZXIJaGlnaGxpZ2h0IHtwYXR0ZXJufSB3aXRoIHtncm91cH0KbWF0Y2hhZGRwb3MoIHtncm91cH0sIHtsaXN0fVssIHtwcmlvcml0eX1bLCB7aWR9XV0pCgkJCQlOdW1iZXIJaGlnaGxpZ2h0IHBvc2l0aW9ucyB3aXRoIHtncm91cH0KbWF0Y2hhcmcoIHtucn0pCQkJTGlzdAlhcmd1bWVudHMgb2YgfDptYXRjaHwKbWF0Y2hkZWxldGUoIHtpZH0pCQlOdW1iZXIJZGVsZXRlIG1hdGNoIGlkZW50aWZpZWQgYnkge2lkfQptYXRjaGVuZCgge2V4cHJ9LCB7cGF0fVssIHtzdGFydH1bLCB7Y291bnR9XV0pCgkJCQlOdW1iZXIJcG9zaXRpb24gd2hlcmUge3BhdH0gZW5kcyBpbiB7ZXhwcn0KbWF0Y2hsaXN0KCB7ZXhwcn0sIHtwYXR9Wywge3N0YXJ0fVssIHtjb3VudH1dXSkKCQkJCUxpc3QJbWF0Y2ggYW5kIHN1Ym1hdGNoZXMgb2Yge3BhdH0gaW4ge2V4cHJ9Cm1hdGNoc3RyKCB7ZXhwcn0sIHtwYXR9Wywge3N0YXJ0fVssIHtjb3VudH1dXSkKCQkJCVN0cmluZwl7Y291bnR9J3RoIG1hdGNoIG9mIHtwYXR9IGluIHtleHByfQptYXgoIHtsaXN0fSkJCQlOdW1iZXIJbWF4aW11bSB2YWx1ZSBvZiBpdGVtcyBpbiB7bGlzdH0KbWluKCB7bGlzdH0pCQkJTnVtYmVyCW1pbmltdW0gdmFsdWUgb2YgaXRlbXMgaW4ge2xpc3R9Cm1rZGlyKCB7bmFtZX0gWywge3BhdGh9IFssIHtwcm90fV1dKQoJCQkJTnVtYmVyCWNyZWF0ZSBkaXJlY3Rvcnkge25hbWV9Cm1vZGUoIFtleHByXSkJCQlTdHJpbmcJY3VycmVudCBlZGl0aW5nIG1vZGUKbXpldmFsKCB7ZXhwcn0pCQkJYW55CWV2YWx1YXRlIHxNelNjaGVtZXwgZXhwcmVzc2lvbgpuZXh0bm9uYmxhbmsoIHtsbnVtfSkJCU51bWJlcglsaW5lIG5yIG9mIG5vbi1ibGFuayBsaW5lID49IHtsbnVtfQpucjJjaGFyKCB7ZXhwcn1bLCB7dXRmOH1dKQlTdHJpbmcJc2luZ2xlIGNoYXIgd2l0aCBBU0NJSS9VVEY4IHZhbHVlIHtleHByfQpvcigge2V4cHJ9LCB7ZXhwcn0pCQlOdW1iZXIgIGJpdHdpc2UgT1IKcGF0aHNob3J0ZW4oIHtleHByfSkJCVN0cmluZwlzaG9ydGVuIGRpcmVjdG9yeSBuYW1lcyBpbiBhIHBhdGgKcGVybGV2YWwoIHtleHByfSkJCWFueQlldmFsdWF0ZSB8UGVybHwgZXhwcmVzc2lvbgpwb3coIHt4fSwge3l9KQkJCUZsb2F0CXt4fSB0byB0aGUgcG93ZXIgb2Yge3l9CnByZXZub25ibGFuaygge2xudW19KQkJTnVtYmVyCWxpbmUgbnIgb2Ygbm9uLWJsYW5rIGxpbmUgPD0ge2xudW19CnByaW50Zigge2ZtdH0sIHtleHByMX0uLi4pCVN0cmluZwlmb3JtYXQgdGV4dApwdW12aXNpYmxlKCkJCQlOdW1iZXIJd2hldGhlciBwb3B1cCBtZW51IGlzIHZpc2libGUKcHlldmFsKCB7ZXhwcn0pCQkJYW55CWV2YWx1YXRlIHxQeXRob258IGV4cHJlc3Npb24KcHkzZXZhbCgge2V4cHJ9KQkJYW55CWV2YWx1YXRlIHxweXRob24zfCBleHByZXNzaW9uCnJhbmdlKCB7ZXhwcn0gWywge21heH0gWywge3N0cmlkZX1dXSkKCQkJCUxpc3QJaXRlbXMgZnJvbSB7ZXhwcn0gdG8ge21heH0KcmVhZGZpbGUoIHtmbmFtZX0gWywge2JpbmFyeX0gWywge21heH1dXSkKCQkJCUxpc3QJZ2V0IGxpc3Qgb2YgbGluZXMgZnJvbSBmaWxlIHtmbmFtZX0KcmVsdGltZSggW3tzdGFydH0gWywge2VuZH1dXSkJTGlzdAlnZXQgdGltZSB2YWx1ZQpyZWx0aW1lc3RyKCB7dGltZX0pCQlTdHJpbmcJdHVybiB0aW1lIHZhbHVlIGludG8gYSBTdHJpbmcKcmVtb3RlX2V4cHIoIHtzZXJ2ZXJ9LCB7c3RyaW5nfSBbLCB7aWR2YXJ9XSkKCQkJCVN0cmluZwlzZW5kIGV4cHJlc3Npb24KcmVtb3RlX2ZvcmVncm91bmQoIHtzZXJ2ZXJ9KQlOdW1iZXIJYnJpbmcgVmltIHNlcnZlciB0byB0aGUgZm9yZWdyb3VuZApyZW1vdGVfcGVlaygge3NlcnZlcmlkfSBbLCB7cmV0dmFyfV0pCgkJCQlOdW1iZXIJY2hlY2sgZm9yIHJlcGx5IHN0cmluZwpyZW1vdGVfcmVhZCgge3NlcnZlcmlkfSkJU3RyaW5nCXJlYWQgcmVwbHkgc3RyaW5nCnJlbW90ZV9zZW5kKCB7c2VydmVyfSwge3N0cmluZ30gWywge2lkdmFyfV0pCgkJCQlTdHJpbmcJc2VuZCBrZXkgc2VxdWVuY2UKcmVtb3ZlKCB7bGlzdH0sIHtpZHh9IFssIHtlbmR9XSkgIGFueQlyZW1vdmUgaXRlbXMge2lkeH0te2VuZH0gZnJvbSB7bGlzdH0KcmVtb3ZlKCB7ZGljdH0sIHtrZXl9KQkJYW55CXJlbW92ZSBlbnRyeSB7a2V5fSBmcm9tIHtkaWN0fQpyZW5hbWUoIHtmcm9tfSwge3RvfSkJCU51bWJlcglyZW5hbWUgKG1vdmUpIGZpbGUgZnJvbSB7ZnJvbX0gdG8ge3RvfQpyZXBlYXQoIHtleHByfSwge2NvdW50fSkJU3RyaW5nCXJlcGVhdCB7ZXhwcn0ge2NvdW50fSB0aW1lcwpyZXNvbHZlKCB7ZmlsZW5hbWV9KQkJU3RyaW5nCWdldCBmaWxlbmFtZSBhIHNob3J0Y3V0IHBvaW50cyB0bwpyZXZlcnNlKCB7bGlzdH0pCQlMaXN0CXJldmVyc2Uge2xpc3R9IGluLXBsYWNlCnJvdW5kKCB7ZXhwcn0pCQkJRmxvYXQJcm91bmQgb2ZmIHtleHByfQpzY3JlZW5hdHRyKCB7cm93fSwge2NvbH0pCU51bWJlcglhdHRyaWJ1dGUgYXQgc2NyZWVuIHBvc2l0aW9uCnNjcmVlbmNoYXIoIHtyb3d9LCB7Y29sfSkJTnVtYmVyCWNoYXJhY3RlciBhdCBzY3JlZW4gcG9zaXRpb24Kc2NyZWVuY29sKCkJCQlOdW1iZXIJY3VycmVudCBjdXJzb3IgY29sdW1uCnNjcmVlbnJvdygpCQkJTnVtYmVyCWN1cnJlbnQgY3Vyc29yIHJvdwpzZWFyY2goIHtwYXR0ZXJufSBbLCB7ZmxhZ3N9IFssIHtzdG9wbGluZX0gWywge3RpbWVvdXR9XV1dKQoJCQkJTnVtYmVyCXNlYXJjaCBmb3Ige3BhdHRlcm59CnNlYXJjaGRlY2woIHtuYW1lfSBbLCB7Z2xvYmFsfSBbLCB7dGhpc2Jsb2NrfV1dKQoJCQkJTnVtYmVyCXNlYXJjaCBmb3IgdmFyaWFibGUgZGVjbGFyYXRpb24Kc2VhcmNocGFpcigge3N0YXJ0fSwge21pZGRsZX0sIHtlbmR9IFssIHtmbGFnc30gWywge3NraXB9IFsuLi5dXV0pCgkJCQlOdW1iZXIJc2VhcmNoIGZvciBvdGhlciBlbmQgb2Ygc3RhcnQvZW5kIHBhaXIKc2VhcmNocGFpcnBvcygge3N0YXJ0fSwge21pZGRsZX0sIHtlbmR9IFssIHtmbGFnc30gWywge3NraXB9IFsuLi5dXV0pCgkJCQlMaXN0CXNlYXJjaCBmb3Igb3RoZXIgZW5kIG9mIHN0YXJ0L2VuZCBwYWlyCnNlYXJjaHBvcygge3BhdHRlcm59IFssIHtmbGFnc30gWywge3N0b3BsaW5lfSBbLCB7dGltZW91dH1dXV0pCgkJCQlMaXN0CXNlYXJjaCBmb3Ige3BhdHRlcm59CnNlcnZlcjJjbGllbnQoIHtjbGllbnRpZH0sIHtzdHJpbmd9KQoJCQkJTnVtYmVyCXNlbmQgcmVwbHkgc3RyaW5nCnNlcnZlcmxpc3QoKQkJCVN0cmluZwlnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBzZXJ2ZXJzCnNldGJ1ZnZhcigge2V4cHJ9LCB7dmFybmFtZX0sIHt2YWx9KQlzZXQge3Zhcm5hbWV9IGluIGJ1ZmZlciB7ZXhwcn0gdG8ge3ZhbH0Kc2V0Y2hhcnNlYXJjaCgge2RpY3R9KQkJRGljdAlzZXQgY2hhcmFjdGVyIHNlYXJjaCBmcm9tIHtkaWN0fQpzZXRjbWRwb3MoIHtwb3N9KQkJTnVtYmVyCXNldCBjdXJzb3IgcG9zaXRpb24gaW4gY29tbWFuZC1saW5lCnNldGxpbmUoIHtsbnVtfSwge2xpbmV9KQlOdW1iZXIJc2V0IGxpbmUge2xudW19IHRvIHtsaW5lfQpzZXRsb2NsaXN0KCB7bnJ9LCB7bGlzdH1bLCB7YWN0aW9ufV0pCgkJCQlOdW1iZXIJbW9kaWZ5IGxvY2F0aW9uIGxpc3QgdXNpbmcge2xpc3R9CnNldG1hdGNoZXMoIHtsaXN0fSkJCU51bWJlcglyZXN0b3JlIGEgbGlzdCBvZiBtYXRjaGVzCnNldHBvcygge2V4cHJ9LCB7bGlzdH0pCQlOdW1iZXIJc2V0IHRoZSB7ZXhwcn0gcG9zaXRpb24gdG8ge2xpc3R9CnNldHFmbGlzdCgge2xpc3R9Wywge2FjdGlvbn1dKQlOdW1iZXIJbW9kaWZ5IHF1aWNrZml4IGxpc3QgdXNpbmcge2xpc3R9CnNldHJlZygge259LCB7dn1bLCB7b3B0fV0pCU51bWJlcglzZXQgcmVnaXN0ZXIgdG8gdmFsdWUgYW5kIHR5cGUKc2V0dGFidmFyKCB7bnJ9LCB7dmFybmFtZX0sIHt2YWx9KQlzZXQge3Zhcm5hbWV9IGluIHRhYiBwYWdlIHtucn0gdG8ge3ZhbH0Kc2V0dGFid2ludmFyKCB7dGFibnJ9LCB7d2lubnJ9LCB7dmFybmFtZX0sIHt2YWx9KSAgICBzZXQge3Zhcm5hbWV9IGluIHdpbmRvdwoJCQkJCXt3aW5ucn0gaW4gdGFiIHBhZ2Uge3RhYm5yfSB0byB7dmFsfQpzZXR3aW52YXIoIHtucn0sIHt2YXJuYW1lfSwge3ZhbH0pCXNldCB7dmFybmFtZX0gaW4gd2luZG93IHtucn0gdG8ge3ZhbH0Kc2hhMjU2KCB7c3RyaW5nfSkJCVN0cmluZwlTSEEyNTYgY2hlY2tzdW0gb2Yge3N0cmluZ30Kc2hlbGxlc2NhcGUoIHtzdHJpbmd9IFssIHtzcGVjaWFsfV0pCgkJCQlTdHJpbmcJZXNjYXBlIHtzdHJpbmd9IGZvciB1c2UgYXMgc2hlbGwKCQkJCQljb21tYW5kIGFyZ3VtZW50CnNoaWZ0d2lkdGgoKQkJCU51bWJlcgllZmZlY3RpdmUgdmFsdWUgb2YgJ3NoaWZ0d2lkdGgnCnNpbXBsaWZ5KCB7ZmlsZW5hbWV9KQkJU3RyaW5nCXNpbXBsaWZ5IGZpbGVuYW1lIGFzIG11Y2ggYXMgcG9zc2libGUKc2luKCB7ZXhwcn0pCQkJRmxvYXQJc2luZSBvZiB7ZXhwcn0Kc2luaCgge2V4cHJ9KQkJCUZsb2F0CWh5cGVyYm9saWMgc2luZSBvZiB7ZXhwcn0Kc29ydCgge2xpc3R9IFssIHtmdW5jfSBbLCB7ZGljdH1dXSkKCQkJCUxpc3QJc29ydCB7bGlzdH0sIHVzaW5nIHtmdW5jfSB0byBjb21wYXJlCnNvdW5kZm9sZCgge3dvcmR9KQkJU3RyaW5nCXNvdW5kLWZvbGQge3dvcmR9CnNwZWxsYmFkd29yZCgpCQkJU3RyaW5nCWJhZGx5IHNwZWxsZWQgd29yZCBhdCBjdXJzb3IKc3BlbGxzdWdnZXN0KCB7d29yZH0gWywge21heH0gWywge2NhcGl0YWx9XV0pCgkJCQlMaXN0CXNwZWxsaW5nIHN1Z2dlc3Rpb25zCnNwbGl0KCB7ZXhwcn0gWywge3BhdH0gWywge2tlZXBlbXB0eX1dXSkKCQkJCUxpc3QJbWFrZSB8TGlzdHwgZnJvbSB7cGF0fSBzZXBhcmF0ZWQge2V4cHJ9CnNxcnQoIHtleHByfSkJCQlGbG9hdAlzcXVhcmUgcm9vdCBvZiB7ZXhwcn0Kc3RyMmZsb2F0KCB7ZXhwcn0pCQlGbG9hdAljb252ZXJ0IFN0cmluZyB0byBGbG9hdApzdHIybnIoIHtleHByfSBbLCB7YmFzZX1dKQlOdW1iZXIJY29udmVydCBTdHJpbmcgdG8gTnVtYmVyCnN0cmNoYXJzKCB7ZXhwcn0gWywge3NraXBjY31dKQlOdW1iZXIJY2hhcmFjdGVyIGxlbmd0aCBvZiB0aGUgU3RyaW5nIHtleHByfQpzdHJkaXNwbGF5d2lkdGgoIHtleHByfSBbLCB7Y29sfV0pIE51bWJlciBkaXNwbGF5IGxlbmd0aCBvZiB0aGUgU3RyaW5nIHtleHByfQpzdHJmdGltZSgge2Zvcm1hdH1bLCB7dGltZX1dKQlTdHJpbmcJdGltZSBpbiBzcGVjaWZpZWQgZm9ybWF0CnN0cmlkeCgge2hheXN0YWNrfSwge25lZWRsZX1bLCB7c3RhcnR9XSkKCQkJCU51bWJlcglpbmRleCBvZiB7bmVlZGxlfSBpbiB7aGF5c3RhY2t9CnN0cmluZygge2V4cHJ9KQkJCVN0cmluZwlTdHJpbmcgcmVwcmVzZW50YXRpb24gb2Yge2V4cHJ9IHZhbHVlCnN0cmxlbigge2V4cHJ9KQkJCU51bWJlcglsZW5ndGggb2YgdGhlIFN0cmluZyB7ZXhwcn0Kc3RycGFydCgge3NyY30sIHtzdGFydH1bLCB7bGVufV0pCgkJCQlTdHJpbmcJe2xlbn0gY2hhcmFjdGVycyBvZiB7c3JjfSBhdCB7c3RhcnR9CnN0cnJpZHgoIHtoYXlzdGFja30sIHtuZWVkbGV9IFssIHtzdGFydH1dKQoJCQkJTnVtYmVyCWxhc3QgaW5kZXggb2Yge25lZWRsZX0gaW4ge2hheXN0YWNrfQpzdHJ0cmFucygge2V4cHJ9KQkJU3RyaW5nCXRyYW5zbGF0ZSBzdHJpbmcgdG8gbWFrZSBpdCBwcmludGFibGUKc3Ryd2lkdGgoIHtleHByfSkJCU51bWJlcglkaXNwbGF5IGNlbGwgbGVuZ3RoIG9mIHRoZSBTdHJpbmcge2V4cHJ9CnN1Ym1hdGNoKCB7bnJ9Wywge2xpc3R9XSkJU3RyaW5nIG9yIExpc3QKCQkJCQlzcGVjaWZpYyBtYXRjaCBpbiAiOnMiIG9yIHN1YnN0aXR1dGUoKQpzdWJzdGl0dXRlKCB7ZXhwcn0sIHtwYXR9LCB7c3VifSwge2ZsYWdzfSkKCQkJCVN0cmluZwlhbGwge3BhdH0gaW4ge2V4cHJ9IHJlcGxhY2VkIHdpdGgge3N1Yn0Kc3luSUQoIHtsbnVtfSwge2NvbH0sIHt0cmFuc30pCU51bWJlcglzeW50YXggSUQgYXQge2xudW19IGFuZCB7Y29sfQpzeW5JRGF0dHIoIHtzeW5JRH0sIHt3aGF0fSBbLCB7bW9kZX1dKQoJCQkJU3RyaW5nCWF0dHJpYnV0ZSB7d2hhdH0gb2Ygc3ludGF4IElEIHtzeW5JRH0Kc3luSUR0cmFucygge3N5bklEfSkJCU51bWJlcgl0cmFuc2xhdGVkIHN5bnRheCBJRCBvZiB7c3luSUR9CnN5bmNvbmNlYWxlZCgge2xudW19LCB7Y29sfSkJTGlzdCAgICBpbmZvIGFib3V0IGNvbmNlYWxpbmcKc3luc3RhY2soIHtsbnVtfSwge2NvbH0pCUxpc3QJc3RhY2sgb2Ygc3ludGF4IElEcyBhdCB7bG51bX0gYW5kIHtjb2x9CnN5c3RlbSgge2V4cHJ9IFssIHtpbnB1dH1dKQlTdHJpbmcJb3V0cHV0IG9mIHNoZWxsIGNvbW1hbmQvZmlsdGVyIHtleHByfQpzeXN0ZW1saXN0KCB7ZXhwcn0gWywge2lucHV0fV0pCUxpc3QJb3V0cHV0IG9mIHNoZWxsIGNvbW1hbmQvZmlsdGVyIHtleHByfQp0YWJwYWdlYnVmbGlzdCggW3thcmd9XSkJTGlzdAlsaXN0IG9mIGJ1ZmZlciBudW1iZXJzIGluIHRhYiBwYWdlCnRhYnBhZ2VuciggW3thcmd9XSkJCU51bWJlcgludW1iZXIgb2YgY3VycmVudCBvciBsYXN0IHRhYiBwYWdlCnRhYnBhZ2V3aW5ucigge3RhYmFyZ31bLCB7YXJnfV0pCgkJCQlOdW1iZXIJbnVtYmVyIG9mIGN1cnJlbnQgd2luZG93IGluIHRhYiBwYWdlCnRhZ2xpc3QoIHtleHByfSkJCUxpc3QJbGlzdCBvZiB0YWdzIG1hdGNoaW5nIHtleHByfQp0YWdmaWxlcygpCQkJTGlzdAl0YWdzIGZpbGVzIHVzZWQKdGVtcG5hbWUoKQkJCVN0cmluZwluYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlCnRhbigge2V4cHJ9KQkJCUZsb2F0CXRhbmdlbnQgb2Yge2V4cHJ9CnRhbmgoIHtleHByfSkJCQlGbG9hdAloeXBlcmJvbGljIHRhbmdlbnQgb2Yge2V4cHJ9CnRvbG93ZXIoIHtleHByfSkJCVN0cmluZwl0aGUgU3RyaW5nIHtleHByfSBzd2l0Y2hlZCB0byBsb3dlcmNhc2UKdG91cHBlcigge2V4cHJ9KQkJU3RyaW5nCXRoZSBTdHJpbmcge2V4cHJ9IHN3aXRjaGVkIHRvIHVwcGVyY2FzZQp0cigge3NyY30sIHtmcm9tc3RyfSwge3Rvc3RyfSkJU3RyaW5nCXRyYW5zbGF0ZSBjaGFycyBvZiB7c3JjfSBpbiB7ZnJvbXN0cn0KCQkJCQl0byBjaGFycyBpbiB7dG9zdHJ9CnRydW5jKCB7ZXhwcn0pCQkJRmxvYXQJdHJ1bmNhdGUgRmxvYXQge2V4cHJ9CnR5cGUoIHtuYW1lfSkJCQlOdW1iZXIJdHlwZSBvZiB2YXJpYWJsZSB7bmFtZX0KdW5kb2ZpbGUoIHtuYW1lfSkJCVN0cmluZwl1bmRvIGZpbGUgbmFtZSBmb3Ige25hbWV9CnVuZG90cmVlKCkJCQlMaXN0CXVuZG8gZmlsZSB0cmVlCnVuaXEoIHtsaXN0fSBbLCB7ZnVuY30gWywge2RpY3R9XV0pCgkJCQlMaXN0CXJlbW92ZSBhZGphY2VudCBkdXBsaWNhdGVzIGZyb20gYSBsaXN0CnZhbHVlcygge2RpY3R9KQkJCUxpc3QJdmFsdWVzIGluIHtkaWN0fQp2aXJ0Y29sKCB7ZXhwcn0pCQlOdW1iZXIJc2NyZWVuIGNvbHVtbiBvZiBjdXJzb3Igb3IgbWFyawp2aXN1YWxtb2RlKCBbZXhwcl0pCQlTdHJpbmcJbGFzdCB2aXN1YWwgbW9kZSB1c2VkCndpbGRtZW51bW9kZSgpCQkJTnVtYmVyCXdoZXRoZXIgJ3dpbGRtZW51JyBtb2RlIGlzIGFjdGl2ZQp3aW5idWZucigge25yfSkJCQlOdW1iZXIJYnVmZmVyIG51bWJlciBvZiB3aW5kb3cge25yfQp3aW5jb2woKQkJCU51bWJlcgl3aW5kb3cgY29sdW1uIG9mIHRoZSBjdXJzb3IKd2luaGVpZ2h0KCB7bnJ9KQkJTnVtYmVyCWhlaWdodCBvZiB3aW5kb3cge25yfQp3aW5saW5lKCkJCQlOdW1iZXIJd2luZG93IGxpbmUgb2YgdGhlIGN1cnNvcgp3aW5uciggW3tleHByfV0pCQlOdW1iZXIJbnVtYmVyIG9mIGN1cnJlbnQgd2luZG93CndpbnJlc3RjbWQoKQkJCVN0cmluZwlyZXR1cm5zIGNvbW1hbmQgdG8gcmVzdG9yZSB3aW5kb3cgc2l6ZXMKd2lucmVzdHZpZXcoIHtkaWN0fSkJCW5vbmUJcmVzdG9yZSB2aWV3IG9mIGN1cnJlbnQgd2luZG93CndpbnNhdmV2aWV3KCkJCQlEaWN0CXNhdmUgdmlldyBvZiBjdXJyZW50IHdpbmRvdwp3aW53aWR0aCgge25yfSkJCQlOdW1iZXIJd2lkdGggb2Ygd2luZG93IHtucn0Kd29yZGNvdW50KCkJCQlEaWN0CWdldCBieXRlL2NoYXIvd29yZCBzdGF0aXN0aWNzCndyaXRlZmlsZSgge2xpc3R9LCB7Zm5hbWV9IFssIHtmbGFnc31dKQoJCQkJTnVtYmVyCXdyaXRlIGxpc3Qgb2YgbGluZXMgdG8gZmlsZSB7Zm5hbWV9Cnhvcigge2V4cHJ9LCB7ZXhwcn0pCQlOdW1iZXIgIGJpdHdpc2UgWE9SCgphYnMoe2V4cHJ9KQkJCQkJCQkqYWJzKCkqCgkJUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB7ZXhwcn0uICBXaGVuIHtleHByfSBldmFsdWF0ZXMgdG8KCQlhIHxGbG9hdHwgYWJzKCkgcmV0dXJucyBhIHxGbG9hdHwuICBXaGVuIHtleHByfSBjYW4gYmUKCQljb252ZXJ0ZWQgdG8gYSB8TnVtYmVyfCBhYnMoKSByZXR1cm5zIGEgfE51bWJlcnwuICBPdGhlcndpc2UKCQlhYnMoKSBnaXZlcyBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIC0xLgoJCUV4YW1wbGVzOiA+CgkJCWVjaG8gYWJzKDEuNDU2KQo8CQkJMS40NTYgID4KCQkJZWNobyBhYnMoLTUuNDU2KQo8CQkJNS40NTYgID4KCQkJZWNobyBhYnMoLTQpCjwJCQk0CgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgphY29zKHtleHByfSkJCQkJCQkJKmFjb3MoKSoKCQlSZXR1cm4gdGhlIGFyYyBjb3NpbmUgb2Yge2V4cHJ9IG1lYXN1cmVkIGluIHJhZGlhbnMsIGFzIGEKCQl8RmxvYXR8IGluIHRoZSByYW5nZSBvZiBbMCwgcGldLgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8IGluIHRoZSByYW5nZQoJCVstMSwgMV0uCgkJRXhhbXBsZXM6ID4KCQkJOmVjaG8gYWNvcygwKQo8CQkJMS41NzA3OTYgPgoJCQk6ZWNobyBhY29zKC0wLjUpCjwJCQkyLjA5NDM5NQoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmxvYXR8IGZlYXR1cmV9CgoKYWRkKHtsaXN0fSwge2V4cHJ9KQkJCQkJKmFkZCgpKgoJCUFwcGVuZCB0aGUgaXRlbSB7ZXhwcn0gdG8gfExpc3R8IHtsaXN0fS4gIFJldHVybnMgdGhlCgkJcmVzdWx0aW5nIHxMaXN0fC4gIEV4YW1wbGVzOiA+CgkJCTpsZXQgYWxpc3QgPSBhZGQoWzEsIDIsIDNdLCBpdGVtKQoJCQk6Y2FsbCBhZGQobXlsaXN0LCAid29vZHN0b2NrIikKPAkJTm90ZSB0aGF0IHdoZW4ge2V4cHJ9IGlzIGEgfExpc3R8IGl0IGlzIGFwcGVuZGVkIGFzIGEgc2luZ2xlCgkJaXRlbS4gIFVzZSB8ZXh0ZW5kKCl8IHRvIGNvbmNhdGVuYXRlIHxMaXN0c3wuCgkJVXNlIHxpbnNlcnQoKXwgdG8gYWRkIGFuIGl0ZW0gYXQgYW5vdGhlciBwb3NpdGlvbi4KCgphbGxvY19mYWlsKHtpZH0sIHtjb3VudGRvd259LCB7cmVwZWF0fSkJCQkqYWxsb2NfZmFpbCgpKgoJCVRoaXMgaXMgZm9yIHRlc3Rpbmc6IElmIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB3aXRoIHtpZH0gaXMKCQljYWxsZWQsIHRoZW4gZGVjcmVtZW50IHtjb3VudGRvd259LCBhbmQgd2hlbiBpdCByZWFjaGVzIHplcm8KCQlsZXQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbCB7cmVwZWF0fSB0aW1lcy4gIFdoZW4ge3JlcGVhdH0gaXMKCQlzbWFsbGVyIHRoYW4gb25lIGl0IGZhaWxzIG9uZSB0aW1lLgoKCmFuZCh7ZXhwcn0sIHtleHByfSkJCQkJCSphbmQoKSoKCQlCaXR3aXNlIEFORCBvbiB0aGUgdHdvIGFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZAoJCXRvIGEgbnVtYmVyLiAgQSBMaXN0LCBEaWN0IG9yIEZsb2F0IGFyZ3VtZW50IGNhdXNlcyBhbiBlcnJvci4KCQlFeGFtcGxlOiA+CgkJCTpsZXQgZmxhZyA9IGFuZChiaXRzLCAweDgwKQoKCmFwcGVuZCh7bG51bX0sIHtleHByfSkJCQkJCSphcHBlbmQoKSoKCQlXaGVuIHtleHByfSBpcyBhIHxMaXN0fDogQXBwZW5kIGVhY2ggaXRlbSBvZiB0aGUgfExpc3R8IGFzIGEKCQl0ZXh0IGxpbmUgYmVsb3cgbGluZSB7bG51bX0gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgoJCU90aGVyd2lzZSBhcHBlbmQge2V4cHJ9IGFzIG9uZSB0ZXh0IGxpbmUgYmVsb3cgbGluZSB7bG51bX0gaW4KCQl0aGUgY3VycmVudCBidWZmZXIuCgkJe2xudW19IGNhbiBiZSB6ZXJvIHRvIGluc2VydCBhIGxpbmUgYmVmb3JlIHRoZSBmaXJzdCBvbmUuCgkJUmV0dXJucyAxIGZvciBmYWlsdXJlICh7bG51bX0gb3V0IG9mIHJhbmdlIG9yIG91dCBvZiBtZW1vcnkpLAoJCTAgZm9yIHN1Y2Nlc3MuCUV4YW1wbGU6ID4KCQkJOmxldCBmYWlsZWQgPSBhcHBlbmQobGluZSgnJCcpLCAiIyBUSEUgRU5EIikKCQkJOmxldCBmYWlsZWQgPSBhcHBlbmQoMCwgWyJDaGFwdGVyIDEiLCAidGhlIGJlZ2lubmluZyJdKQo8CgkJCQkJCQkqYXJnYygpKgphcmdjKCkJCVRoZSByZXN1bHQgaXMgdGhlIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUKCQljdXJyZW50IHdpbmRvdy4gIFNlZSB8YXJnbGlzdHwuCgoJCQkJCQkJKmFyZ2lkeCgpKgphcmdpZHgoKQlUaGUgcmVzdWx0IGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBhcmd1bWVudCBsaXN0LiAgMCBpcwoJCXRoZSBmaXJzdCBmaWxlLiAgYXJnYygpIC0gMSBpcyB0aGUgbGFzdCBvbmUuICBTZWUgfGFyZ2xpc3R8LgoKCQkJCQkJCSphcmdsaXN0aWQoKSoKYXJnbGlzdGlkKFt7d2lubnJ9LCBbIHt0YWJucn0gXV0pCgkJUmV0dXJuIHRoZSBhcmd1bWVudCBsaXN0IElELiAgVGhpcyBpcyBhIG51bWJlciB3aGljaAoJCWlkZW50aWZpZXMgdGhlIGFyZ3VtZW50IGxpc3QgYmVpbmcgdXNlZC4gIFplcm8gaXMgdXNlZCBmb3IgdGhlCgkJZ2xvYmFsIGFyZ3VtZW50IGxpc3QuICBTZWUgfGFyZ2xpc3R8LgoJCVJldHVybiAtMSBpZiB0aGUgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgoKCQlXaXRob3V0IGFyZ3VtZW50cyB1c2UgdGhlIGN1cnJlbnQgd2luZG93LgoJCVdpdGgge3dpbm5yfSBvbmx5IHVzZSB0aGlzIHdpbmRvdyBpbiB0aGUgY3VycmVudCB0YWIgcGFnZS4KCQlXaXRoIHt3aW5ucn0gYW5kIHt0YWJucn0gdXNlIHRoZSB3aW5kb3cgaW4gdGhlIHNwZWNpZmllZCB0YWIKCQlwYWdlLgoKCQkJCQkJCSphcmd2KCkqCmFyZ3YoW3tucn1dKQlUaGUgcmVzdWx0IGlzIHRoZSB7bnJ9dGggZmlsZSBpbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUKCQljdXJyZW50IHdpbmRvdy4gIFNlZSB8YXJnbGlzdHwuICAiYXJndigwKSIgaXMgdGhlIGZpcnN0IG9uZS4KCQlFeGFtcGxlOiA+Cgk6bGV0IGkgPSAwCgk6d2hpbGUgaSA8IGFyZ2MoKQoJOiAgbGV0IGYgPSBlc2NhcGUoZm5hbWVlc2NhcGUoYXJndihpKSksICcuJykKCTogIGV4ZSAnYW1lbnUgQXJnLicgLiBmIC4gJyA6ZSAnIC4gZiAuICc8Q1I+JwoJOiAgbGV0IGkgPSBpICsgMQoJOmVuZHdoaWxlCjwJCVdpdGhvdXQgdGhlIHtucn0gYXJndW1lbnQgYSB8TGlzdHwgd2l0aCB0aGUgd2hvbGUgfGFyZ2xpc3R8IGlzCgkJcmV0dXJuZWQuCgoJCQkJCQkJKmFzc2VydF9lcXVhbCgpKgphc3NlcnRfZXF1YWwoe2V4cGVjdGVkfSwge2FjdHVhbH0gWywge21zZ31dKQoJCVdoZW4ge2V4cGVjdGVkfSBhbmQge2FjdHVhbH0gYXJlIG5vdCBlcXVhbCBhbiBlcnJvciBtZXNzYWdlIGlzCgkJYWRkZWQgdG8gfHY6ZXJyb3JzfC4KCQlUaGVyZSBpcyBubyBhdXRvbWF0aWMgY29udmVyc2lvbiwgdGhlIFN0cmluZyAiNCIgaXMgZGlmZmVyZW50CgkJZnJvbSB0aGUgTnVtYmVyIDQuICBBbmQgdGhlIG51bWJlciA0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQoJCUZsb2F0IDQuMC4gIFRoZSB2YWx1ZSBvZiAnaWdub3JlY2FzZScgaXMgbm90IHVzZWQgaGVyZSwgY2FzZQoJCWFsd2F5cyBtYXR0ZXJzLgoJCVdoZW4ge21zZ30gaXMgb21pdHRlZCBhbiBlcnJvciBpbiB0aGUgZm9ybSAiRXhwZWN0ZWQKCQl7ZXhwZWN0ZWR9IGJ1dCBnb3Qge2FjdHVhbH0iIGlzIHByb2R1Y2VkLgoJCUV4YW1wbGU6ID4KCWFzc2VydF9lcXVhbCgnZm9vJywgJ2JhcicpCjwJCVdpbGwgcmVzdWx0IGluIGEgc3RyaW5nIHRvIGJlIGFkZGVkIHRvIHx2OmVycm9yc3w6Cgl0ZXN0LnZpbSBsaW5lIDEyOiBFeHBlY3RlZCAnZm9vJyBidXQgZ290ICdiYXInIH4KCmFzc2VydF9leGNlcHRpb24oe2Vycm9yfSBbLCB7bXNnfV0pCQkJKmFzc2VydF9leGNlcHRpb24oKSoKCQlXaGVuIHY6ZXhjZXB0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0cmluZyB7ZXJyb3J9IGFuIGVycm9yCgkJbWVzc2FnZSBpcyBhZGRlZCB0byB8djplcnJvcnN8LgoJCVRoaXMgY2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoYXQgYSBjb21tYW5kIHRocm93cyBhbiBleGNlcHRpb24uCgkJVXNpbmcgdGhlIGVycm9yIG51bWJlciwgZm9sbG93ZWQgYnkgYSBjb2xvbiwgYXZvaWRzIHByb2JsZW1zCgkJd2l0aCB0cmFuc2xhdGlvbnM6ID4KCQkJdHJ5CgkJCSAgY29tbWFuZHRoYXRmYWlscwoJCQkgIGNhbGwgYXNzZXJ0X2ZhbHNlKDEsICdjb21tYW5kIHNob3VsZCBoYXZlIGZhaWxlZCcpCgkJCWNhdGNoCgkJCSAgY2FsbCBhc3NlcnRfZXhjZXB0aW9uKCdFNDkyOicpCgkJCWVuZHRyeQoKYXNzZXJ0X2ZhaWxzKHtjbWR9IFssIHtlcnJvcn1dKQkJCQkJKmFzc2VydF9mYWlscygpKgoJCVJ1biB7Y21kfSBhbmQgYWRkIGFuIGVycm9yIG1lc3NhZ2UgdG8gfHY6ZXJyb3JzfCBpZiBpdCBkb2VzCgkJTk9UIHByb2R1Y2UgYW4gZXJyb3IuCgkJV2hlbiB7ZXJyb3J9IGlzIGdpdmVuIGl0IG11c3QgbWF0Y2ggfHY6ZXJybXNnfC4KCmFzc2VydF9mYWxzZSh7YWN0dWFsfSBbLCB7bXNnfV0pCQkJCSphc3NlcnRfZmFsc2UoKSoKCQlXaGVuIHthY3R1YWx9IGlzIG5vdCBmYWxzZSBhbiBlcnJvciBtZXNzYWdlIGlzIGFkZGVkIHRvCgkJfHY6ZXJyb3JzfCwgbGlrZSB3aXRoIHxhc3NlcnRfZXF1YWwoKXwuCgkJQSB2YWx1ZSBpcyBmYWxzZSB3aGVuIGl0IGlzIHplcm8uIFdoZW4gInthY3R1YWx9IiBpcyBub3QgYQoJCW51bWJlciB0aGUgYXNzZXJ0IGZhaWxzLgoJCVdoZW4ge21zZ30gaXMgb21pdHRlZCBhbiBlcnJvciBpbiB0aGUgZm9ybSAiRXhwZWN0ZWQgRmFsc2UgYnV0CgkJZ290IHthY3R1YWx9IiBpcyBwcm9kdWNlZC4KCmFzc2VydF90cnVlKHthY3R1YWx9IFssIHttc2d9XSkJCQkJCSphc3NlcnRfdHJ1ZSgpKgoJCVdoZW4ge2FjdHVhbH0gaXMgbm90IHRydWUgYW4gZXJyb3IgbWVzc2FnZSBpcyBhZGRlZCB0bwoJCXx2OmVycm9yc3wsIGxpa2Ugd2l0aCB8YXNzZXJ0X2VxdWFsKCl8LgoJCUEgdmFsdWUgaXMgdHJ1ZSB3aGVuIGl0IGlzIGEgbm9uLXplcm8gbnVtYmVyLiAgV2hlbiB7YWN0dWFsfQoJCWlzIG5vdCBhIG51bWJlciB0aGUgYXNzZXJ0IGZhaWxzLgoJCVdoZW4ge21zZ30gaXMgb21pdHRlZCBhbiBlcnJvciBpbiB0aGUgZm9ybSAiRXhwZWN0ZWQgVHJ1ZSBidXQKCQlnb3Qge2FjdHVhbH0iIGlzIHByb2R1Y2VkLgoKYXNpbih7ZXhwcn0pCQkJCQkJKmFzaW4oKSoKCQlSZXR1cm4gdGhlIGFyYyBzaW5lIG9mIHtleHByfSBtZWFzdXJlZCBpbiByYWRpYW5zLCBhcyBhIHxGbG9hdHwKCQlpbiB0aGUgcmFuZ2Ugb2YgWy1waS8yLCBwaS8yXS4KCQl7ZXhwcn0gbXVzdCBldmFsdWF0ZSB0byBhIHxGbG9hdHwgb3IgYSB8TnVtYmVyfCBpbiB0aGUgcmFuZ2UKCQlbLTEsIDFdLgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIGFzaW4oMC44KQo8CQkJMC45MjcyOTUgPgoJCQk6ZWNobyBhc2luKC0wLjUpCjwJCQktMC41MjM1OTkKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoKCmF0YW4oe2V4cHJ9KQkJCQkJCSphdGFuKCkqCgkJUmV0dXJuIHRoZSBwcmluY2lwYWwgdmFsdWUgb2YgdGhlIGFyYyB0YW5nZW50IG9mIHtleHByfSwgaW4KCQl0aGUgcmFuZ2UgWy1waS8yLCArcGkvMl0gcmFkaWFucywgYXMgYSB8RmxvYXR8LgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIGF0YW4oMTAwKQo8CQkJMS41NjA3OTcgPgoJCQk6ZWNobyBhdGFuKC00LjAxKQo8CQkJLTEuMzI2NDA1CgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgphdGFuMih7ZXhwcjF9LCB7ZXhwcjJ9KQkJCQkJKmF0YW4yKCkqCgkJUmV0dXJuIHRoZSBhcmMgdGFuZ2VudCBvZiB7ZXhwcjF9IC8ge2V4cHIyfSwgbWVhc3VyZWQgaW4KCQlyYWRpYW5zLCBhcyBhIHxGbG9hdHwgaW4gdGhlIHJhbmdlIFstcGksIHBpXS4KCQl7ZXhwcjF9IGFuZCB7ZXhwcjJ9IG11c3QgZXZhbHVhdGUgdG8gYSB8RmxvYXR8IG9yIGEgfE51bWJlcnwuCgkJRXhhbXBsZXM6ID4KCQkJOmVjaG8gYXRhbjIoLTEsIDEpCjwJCQktMC43ODUzOTggPgoJCQk6ZWNobyBhdGFuMigxLCAtMSkKPAkJCTIuMzU2MTk0CgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgoJCQkJCQkJKmJyb3dzZSgpKgpicm93c2Uoe3NhdmV9LCB7dGl0bGV9LCB7aW5pdGRpcn0sIHtkZWZhdWx0fSkKCQlQdXQgdXAgYSBmaWxlIHJlcXVlc3Rlci4gIFRoaXMgb25seSB3b3JrcyB3aGVuICJoYXMoImJyb3dzZSIpIgoJCXJldHVybnMgbm9uLXplcm8gKG9ubHkgaW4gc29tZSBHVUkgdmVyc2lvbnMpLgoJCVRoZSBpbnB1dCBmaWVsZHMgYXJlOgoJCSAgICB7c2F2ZX0Jd2hlbiBub24temVybywgc2VsZWN0IGZpbGUgdG8gd3JpdGUKCQkgICAge3RpdGxlfQl0aXRsZSBmb3IgdGhlIHJlcXVlc3RlcgoJCSAgICB7aW5pdGRpcn0JZGlyZWN0b3J5IHRvIHN0YXJ0IGJyb3dzaW5nIGluCgkJICAgIHtkZWZhdWx0fQlkZWZhdWx0IGZpbGUgbmFtZQoJCVdoZW4gdGhlICJDYW5jZWwiIGJ1dHRvbiBpcyBoaXQsIHNvbWV0aGluZyB3ZW50IHdyb25nLCBvcgoJCWJyb3dzaW5nIGlzIG5vdCBwb3NzaWJsZSwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoKCQkJCQkJCSpicm93c2VkaXIoKSoKYnJvd3NlZGlyKHt0aXRsZX0sIHtpbml0ZGlyfSkKCQlQdXQgdXAgYSBkaXJlY3RvcnkgcmVxdWVzdGVyLiAgVGhpcyBvbmx5IHdvcmtzIHdoZW4KCQkiaGFzKCJicm93c2UiKSIgcmV0dXJucyBub24temVybyAob25seSBpbiBzb21lIEdVSSB2ZXJzaW9ucykuCgkJT24gc3lzdGVtcyB3aGVyZSBhIGRpcmVjdG9yeSBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQgYSBmaWxlCgkJYnJvd3NlciBpcyB1c2VkLiAgSW4gdGhhdCBjYXNlOiBzZWxlY3QgYSBmaWxlIGluIHRoZSBkaXJlY3RvcnkKCQl0byBiZSB1c2VkLgoJCVRoZSBpbnB1dCBmaWVsZHMgYXJlOgoJCSAgICB7dGl0bGV9CXRpdGxlIGZvciB0aGUgcmVxdWVzdGVyCgkJICAgIHtpbml0ZGlyfQlkaXJlY3RvcnkgdG8gc3RhcnQgYnJvd3NpbmcgaW4KCQlXaGVuIHRoZSAiQ2FuY2VsIiBidXR0b24gaXMgaGl0LCBzb21ldGhpbmcgd2VudCB3cm9uZywgb3IKCQlicm93c2luZyBpcyBub3QgcG9zc2libGUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KCmJ1ZmV4aXN0cyh7ZXhwcn0pCQkJCQkqYnVmZXhpc3RzKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgbm9uLXplcm8gaWYgYSBidWZmZXIgY2FsbGVkCgkJe2V4cHJ9IGV4aXN0cy4KCQlJZiB0aGUge2V4cHJ9IGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBidWZmZXIgbnVtYmVycyBhcmUgdXNlZC4KCQlJZiB0aGUge2V4cHJ9IGFyZ3VtZW50IGlzIGEgc3RyaW5nIGl0IG11c3QgbWF0Y2ggYSBidWZmZXIgbmFtZQoJCWV4YWN0bHkuICBUaGUgbmFtZSBjYW4gYmU6CgkJLSBSZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgkJLSBBIGZ1bGwgcGF0aC4KCQktIFRoZSBuYW1lIG9mIGEgYnVmZmVyIHdpdGggJ2J1ZnR5cGUnIHNldCB0byAibm9maWxlIi4KCQktIEEgVVJMIG5hbWUuCgkJVW5saXN0ZWQgYnVmZmVycyB3aWxsIGJlIGZvdW5kLgoJCU5vdGUgdGhhdCBoZWxwIGZpbGVzIGFyZSBsaXN0ZWQgYnkgdGhlaXIgc2hvcnQgbmFtZSBpbiB0aGUKCQlvdXRwdXQgb2YgfDpidWZmZXJzfCwgYnV0IGJ1ZmV4aXN0cygpIHJlcXVpcmVzIHVzaW5nIHRoZWlyCgkJbG9uZyBuYW1lIHRvIGJlIGFibGUgdG8gZmluZCB0aGVtLgoJCWJ1ZmV4aXN0cygpIG1heSByZXBvcnQgYSBidWZmZXIgZXhpc3RzLCBidXQgdG8gdXNlIHRoZSBuYW1lCgkJd2l0aCBhIHw6YnVmZmVyfCBjb21tYW5kIHlvdSBtYXkgbmVlZCB0byB1c2UgfGV4cGFuZCgpfC4gIEVzcAoJCWZvciBNUy1XaW5kb3dzIDguMyBuYW1lcyBpbiB0aGUgZm9ybSAiYzpcRE9DVU1FfjEiCgkJVXNlICJidWZleGlzdHMoMCkiIHRvIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gYWx0ZXJuYXRlCgkJZmlsZSBuYW1lLgoJCQkJCQkJKmJ1ZmZlcl9leGlzdHMoKSoKCQlPYnNvbGV0ZSBuYW1lOiBidWZmZXJfZXhpc3RzKCkuCgpidWZsaXN0ZWQoe2V4cHJ9KQkJCQkJKmJ1Zmxpc3RlZCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIG5vbi16ZXJvIGlmIGEgYnVmZmVyIGNhbGxlZAoJCXtleHByfSBleGlzdHMgYW5kIGlzIGxpc3RlZCAoaGFzIHRoZSAnYnVmbGlzdGVkJyBvcHRpb24gc2V0KS4KCQlUaGUge2V4cHJ9IGFyZ3VtZW50IGlzIHVzZWQgbGlrZSB3aXRoIHxidWZleGlzdHMoKXwuCgpidWZsb2FkZWQoe2V4cHJ9KQkJCQkJKmJ1ZmxvYWRlZCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIG5vbi16ZXJvIGlmIGEgYnVmZmVyIGNhbGxlZAoJCXtleHByfSBleGlzdHMgYW5kIGlzIGxvYWRlZCAoc2hvd24gaW4gYSB3aW5kb3cgb3IgaGlkZGVuKS4KCQlUaGUge2V4cHJ9IGFyZ3VtZW50IGlzIHVzZWQgbGlrZSB3aXRoIHxidWZleGlzdHMoKXwuCgpidWZuYW1lKHtleHByfSkJCQkJCQkqYnVmbmFtZSgpKgoJCVRoZSByZXN1bHQgaXMgdGhlIG5hbWUgb2YgYSBidWZmZXIsIGFzIGl0IGlzIGRpc3BsYXllZCBieSB0aGUKCQkiOmxzIiBjb21tYW5kLgoJCUlmIHtleHByfSBpcyBhIE51bWJlciwgdGhhdCBidWZmZXIgbnVtYmVyJ3MgbmFtZSBpcyBnaXZlbi4KCQlOdW1iZXIgemVybyBpcyB0aGUgYWx0ZXJuYXRlIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgd2luZG93LgoJCUlmIHtleHByfSBpcyBhIFN0cmluZywgaXQgaXMgdXNlZCBhcyBhIHxmaWxlLXBhdHRlcm58IHRvIG1hdGNoCgkJd2l0aCB0aGUgYnVmZmVyIG5hbWVzLglUaGlzIGlzIGFsd2F5cyBkb25lIGxpa2UgJ21hZ2ljJyBpcwoJCXNldCBhbmQgJ2Nwb3B0aW9ucycgaXMgZW1wdHkuICBXaGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKCQltYXRjaCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgkJIiIgb3IgIiUiIGNhbiBiZSB1c2VkIGZvciB0aGUgY3VycmVudCBidWZmZXIsICIjIiBmb3IgdGhlCgkJYWx0ZXJuYXRlIGJ1ZmZlci4KCQlBIGZ1bGwgbWF0Y2ggaXMgcHJlZmVycmVkLCBvdGhlcndpc2UgYSBtYXRjaCBhdCB0aGUgc3RhcnQsIGVuZAoJCW9yIG1pZGRsZSBvZiB0aGUgYnVmZmVyIG5hbWUgaXMgYWNjZXB0ZWQuICBJZiB5b3Ugb25seSB3YW50IGEKCQlmdWxsIG1hdGNoIHRoZW4gcHV0ICJeIiBhdCB0aGUgc3RhcnQgYW5kICIkIiBhdCB0aGUgZW5kIG9mIHRoZQoJCXBhdHRlcm4uCgkJTGlzdGVkIGJ1ZmZlcnMgYXJlIGZvdW5kIGZpcnN0LiAgSWYgdGhlcmUgaXMgYSBzaW5nbGUgbWF0Y2gKCQl3aXRoIGEgbGlzdGVkIGJ1ZmZlciwgdGhhdCBvbmUgaXMgcmV0dXJuZWQuICBOZXh0IHVubGlzdGVkCgkJYnVmZmVycyBhcmUgc2VhcmNoZWQgZm9yLgoJCUlmIHRoZSB7ZXhwcn0gaXMgYSBTdHJpbmcsIGJ1dCB5b3Ugd2FudCB0byB1c2UgaXQgYXMgYSBidWZmZXIKCQludW1iZXIsIGZvcmNlIGl0IHRvIGJlIGEgTnVtYmVyIGJ5IGFkZGluZyB6ZXJvIHRvIGl0OiA+CgkJCTplY2hvIGJ1Zm5hbWUoIjMiICsgMCkKPAkJSWYgdGhlIGJ1ZmZlciBkb2Vzbid0IGV4aXN0LCBvciBkb2Vzbid0IGhhdmUgYSBuYW1lLCBhbiBlbXB0eQoJCXN0cmluZyBpcyByZXR1cm5lZC4gPgoJYnVmbmFtZSgiIyIpCQlhbHRlcm5hdGUgYnVmZmVyIG5hbWUKCWJ1Zm5hbWUoMykJCW5hbWUgb2YgYnVmZmVyIDMKCWJ1Zm5hbWUoIiUiKQkJbmFtZSBvZiBjdXJyZW50IGJ1ZmZlcgoJYnVmbmFtZSgiZmlsZTIiKQluYW1lIG9mIGJ1ZmZlciB3aGVyZSAiZmlsZTIiIG1hdGNoZXMuCjwJCQkJCQkJKmJ1ZmZlcl9uYW1lKCkqCgkJT2Jzb2xldGUgbmFtZTogYnVmZmVyX25hbWUoKS4KCgkJCQkJCQkqYnVmbnIoKSoKYnVmbnIoe2V4cHJ9IFssIHtjcmVhdGV9XSkKCQlUaGUgcmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgYSBidWZmZXIsIGFzIGl0IGlzIGRpc3BsYXllZCBieQoJCXRoZSAiOmxzIiBjb21tYW5kLiAgRm9yIHRoZSB1c2Ugb2Yge2V4cHJ9LCBzZWUgfGJ1Zm5hbWUoKXwKCQlhYm92ZS4KCQlJZiB0aGUgYnVmZmVyIGRvZXNuJ3QgZXhpc3QsIC0xIGlzIHJldHVybmVkLiAgT3IsIGlmIHRoZQoJCXtjcmVhdGV9IGFyZ3VtZW50IGlzIHByZXNlbnQgYW5kIG5vdCB6ZXJvLCBhIG5ldywgdW5saXN0ZWQsCgkJYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGl0cyBudW1iZXIgaXMgcmV0dXJuZWQuCgkJYnVmbnIoIiQiKSBpcyB0aGUgbGFzdCBidWZmZXI6ID4KCTpsZXQgbGFzdF9idWZmZXIgPSBidWZucigiJCIpCjwJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBoaWdoZXN0IGJ1ZmZlciBudW1iZXIKCQlvZiBleGlzdGluZyBidWZmZXJzLiAgTm90ZSB0aGF0IG5vdCBhbGwgYnVmZmVycyB3aXRoIGEgc21hbGxlcgoJCW51bWJlciBuZWNlc3NhcmlseSBleGlzdCwgYmVjYXVzZSAiOmJ3aXBlb3V0IiBtYXkgaGF2ZSByZW1vdmVkCgkJdGhlbS4gIFVzZSBidWZleGlzdHMoKSB0byB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgYnVmZmVyLgoJCQkJCQkJKmJ1ZmZlcl9udW1iZXIoKSoKCQlPYnNvbGV0ZSBuYW1lOiBidWZmZXJfbnVtYmVyKCkuCgkJCQkJCQkqbGFzdF9idWZmZXJfbnIoKSoKCQlPYnNvbGV0ZSBuYW1lIGZvciBidWZucigiJCIpOiBsYXN0X2J1ZmZlcl9ucigpLgoKYnVmd2lubnIoe2V4cHJ9KQkJCQkJKmJ1Zndpbm5yKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QKCQl3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciB7ZXhwcn0uICBGb3IgdGhlIHVzZSBvZiB7ZXhwcn0sCgkJc2VlIHxidWZuYW1lKCl8IGFib3ZlLglJZiBidWZmZXIge2V4cHJ9IGRvZXNuJ3QgZXhpc3Qgb3IKCQl0aGVyZSBpcyBubyBzdWNoIHdpbmRvdywgLTEgaXMgcmV0dXJuZWQuICBFeGFtcGxlOiA+CgoJZWNobyAiQSB3aW5kb3cgY29udGFpbmluZyBidWZmZXIgMSBpcyAiIC4gKGJ1Zndpbm5yKDEpKQoKPAkJVGhlIG51bWJlciBjYW4gYmUgdXNlZCB3aXRoIHxDVFJMLVdfd3wgYW5kICI6d2luY21kIHciCgkJfDp3aW5jbWR8LgoJCU9ubHkgZGVhbHMgd2l0aCB0aGUgY3VycmVudCB0YWIgcGFnZS4KCgpieXRlMmxpbmUoe2J5dGV9KQkJCQkJKmJ5dGUybGluZSgpKgoJCVJldHVybiB0aGUgbGluZSBudW1iZXIgdGhhdCBjb250YWlucyB0aGUgY2hhcmFjdGVyIGF0IGJ5dGUKCQljb3VudCB7Ynl0ZX0gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAgVGhpcyBpbmNsdWRlcyB0aGUKCQllbmQtb2YtbGluZSBjaGFyYWN0ZXIsIGRlcGVuZGluZyBvbiB0aGUgJ2ZpbGVmb3JtYXQnIG9wdGlvbgoJCWZvciB0aGUgY3VycmVudCBidWZmZXIuICBUaGUgZmlyc3QgY2hhcmFjdGVyIGhhcyBieXRlIGNvdW50CgkJb25lLgoJCUFsc28gc2VlIHxsaW5lMmJ5dGUoKXwsIHxnb3wgYW5kIHw6Z290b3wuCgkJe25vdCBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRob3V0IHRoZSB8K2J5dGVfb2Zmc2V0fAoJCWZlYXR1cmV9CgpieXRlaWR4KHtleHByfSwge25yfSkJCQkJCSpieXRlaWR4KCkqCgkJUmV0dXJuIGJ5dGUgaW5kZXggb2YgdGhlIHtucn0ndGggY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcKCQl7ZXhwcn0uICBVc2UgemVybyBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciwgaXQgcmV0dXJucyB6ZXJvLgoJCVRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgd2hlbiB0aGVyZSBhcmUgbXVsdGlieXRlCgkJY2hhcmFjdGVycywgb3RoZXJ3aXNlIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBlcXVhbCB0byB7bnJ9LgoJCUNvbXBvc2luZyBjaGFyYWN0ZXJzIGFyZSBub3QgY291bnRlZCBzZXBhcmF0ZWx5LCB0aGVpciBieXRlCgkJbGVuZ3RoIGlzIGFkZGVkIHRvIHRoZSBwcmVjZWRpbmcgYmFzZSBjaGFyYWN0ZXIuICBTZWUKCQl8Ynl0ZWlkeGNvbXAoKXwgYmVsb3cgZm9yIGNvdW50aW5nIGNvbXBvc2luZyBjaGFyYWN0ZXJzCgkJc2VwYXJhdGVseS4KCQlFeGFtcGxlIDogPgoJCQllY2hvIG1hdGNoc3RyKHN0ciwgIi4iLCBieXRlaWR4KHN0ciwgMykpCjwJCXdpbGwgZGlzcGxheSB0aGUgZm91cnRoIGNoYXJhY3Rlci4gIEFub3RoZXIgd2F5IHRvIGRvIHRoZQoJCXNhbWU6ID4KCQkJbGV0IHMgPSBzdHJwYXJ0KHN0ciwgYnl0ZWlkeChzdHIsIDMpKQoJCQllY2hvIHN0cnBhcnQocywgMCwgYnl0ZWlkeChzLCAxKSkKPAkJSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiB7bnJ9IGNoYXJhY3RlcnMgLTEgaXMgcmV0dXJuZWQuCgkJSWYgdGhlcmUgYXJlIGV4YWN0bHkge25yfSBjaGFyYWN0ZXJzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZwoJCWluIGJ5dGVzIGlzIHJldHVybmVkLgoKYnl0ZWlkeGNvbXAoe2V4cHJ9LCB7bnJ9KQkJCQkJKmJ5dGVpZHhjb21wKCkqCgkJTGlrZSBieXRlaWR4KCksIGV4Y2VwdCB0aGF0IGEgY29tcG9zaW5nIGNoYXJhY3RlciBpcyBjb3VudGVkCgkJYXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIuICBFeGFtcGxlOiA+CgkJCWxldCBzID0gJ2UnIC4gbnIyY2hhcigweDMwMSkKCQkJZWNobyBieXRlaWR4KHMsIDEpCgkJCWVjaG8gYnl0ZWlkeGNvbXAocywgMSkKCQkJZWNobyBieXRlaWR4Y29tcChzLCAyKQo8CQlUaGUgZmlyc3QgYW5kIHRoaXJkIGVjaG8gcmVzdWx0IGluIDMgKCdlJyBwbHVzIGNvbXBvc2luZwoJCWNoYXJhY3RlciBpcyAzIGJ5dGVzKSwgdGhlIHNlY29uZCBlY2hvIHJlc3VsdHMgaW4gMSAoJ2UnIGlzCgkJb25lIGJ5dGUpLgoJCU9ubHkgd29ya3MgZGlmZmVyZW50IGZyb20gYnl0ZWlkeCgpIHdoZW4gJ2VuY29kaW5nJyBpcyBzZXQgdG8KCQlhIFVuaWNvZGUgZW5jb2RpbmcuCgpjYWxsKHtmdW5jfSwge2FyZ2xpc3R9IFssIHtkaWN0fV0pCQkJKmNhbGwoKSogKkU2OTkqCgkJQ2FsbCBmdW5jdGlvbiB7ZnVuY30gd2l0aCB0aGUgaXRlbXMgaW4gfExpc3R8IHthcmdsaXN0fSBhcwoJCWFyZ3VtZW50cy4KCQl7ZnVuY30gY2FuIGVpdGhlciBiZSBhIHxGdW5jcmVmfCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uLgoJCWE6Zmlyc3RsaW5lIGFuZCBhOmxhc3RsaW5lIGFyZSBzZXQgdG8gdGhlIGN1cnNvciBsaW5lLgoJCVJldHVybnMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbGVkIGZ1bmN0aW9uLgoJCXtkaWN0fSBpcyBmb3IgZnVuY3Rpb25zIHdpdGggdGhlICJkaWN0IiBhdHRyaWJ1dGUuICBJdCB3aWxsIGJlCgkJdXNlZCB0byBzZXQgdGhlIGxvY2FsIHZhcmlhYmxlICJzZWxmIi4gfERpY3Rpb25hcnktZnVuY3Rpb258CgpjZWlsKHtleHByfSkJCQkJCQkJKmNlaWwoKSoKCQlSZXR1cm4gdGhlIHNtYWxsZXN0IGludGVncmFsIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bwoJCXtleHByfSBhcyBhIHxGbG9hdHwgKHJvdW5kIHVwKS4KCQl7ZXhwcn0gbXVzdCBldmFsdWF0ZSB0byBhIHxGbG9hdHwgb3IgYSB8TnVtYmVyfC4KCQlFeGFtcGxlczogPgoJCQllY2hvIGNlaWwoMS40NTYpCjwJCQkyLjAgID4KCQkJZWNobyBjZWlsKC01LjQ1NikKPAkJCS01LjAgID4KCQkJZWNobyBjZWlsKDQuMCkKPAkJCTQuMAoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmxvYXR8IGZlYXR1cmV9CgpjaGFuZ2VucigpCQkJCQkJKmNoYW5nZW5yKCkqCgkJUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIG1vc3QgcmVjZW50IGNoYW5nZS4gIFRoaXMgaXMgdGhlIHNhbWUKCQludW1iZXIgYXMgd2hhdCBpcyBkaXNwbGF5ZWQgd2l0aCB8OnVuZG9saXN0fCBhbmQgY2FuIGJlIHVzZWQKCQl3aXRoIHRoZSB8OnVuZG98IGNvbW1hbmQuCgkJV2hlbiBhIGNoYW5nZSB3YXMgbWFkZSBpdCBpcyB0aGUgbnVtYmVyIG9mIHRoYXQgY2hhbmdlLiAgQWZ0ZXIKCQlyZWRvIGl0IGlzIHRoZSBudW1iZXIgb2YgdGhlIHJlZG9uZSBjaGFuZ2UuICBBZnRlciB1bmRvIGl0IGlzCgkJb25lIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHRoZSB1bmRvbmUgY2hhbmdlLgoKY2hhcjJucih7ZXhwcn1bLCB7dXRmOH1dKQkJCQkJKmNoYXIybnIoKSoKCQlSZXR1cm4gbnVtYmVyIHZhbHVlIG9mIHRoZSBmaXJzdCBjaGFyIGluIHtleHByfS4gIEV4YW1wbGVzOiA+CgkJCWNoYXIybnIoIiAiKQkJcmV0dXJucyAzMgoJCQljaGFyMm5yKCJBQkMiKQkJcmV0dXJucyA2NQo8CQlXaGVuIHt1dGY4fSBpcyBvbWl0dGVkIG9yIHplcm8sIHRoZSBjdXJyZW50ICdlbmNvZGluZycgaXMgdXNlZC4KCQlFeGFtcGxlIGZvciAidXRmLTgiOiA+CgkJCWNoYXIybnIoIuEiKQkJcmV0dXJucyAyMjUKCQkJY2hhcjJucigi4SJbMF0pCQlyZXR1cm5zIDE5NQo8CQlXaXRoIHt1dGY4fSBzZXQgdG8gMSwgYWx3YXlzIHRyZWF0IGFzIHV0Zi04IGNoYXJhY3RlcnMuCgkJQSBjb21iaW5pbmcgY2hhcmFjdGVyIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyLgoJCXxucjJjaGFyKCl8IGRvZXMgdGhlIG9wcG9zaXRlLgoKY2luZGVudCh7bG51bX0pCQkJCQkJKmNpbmRlbnQoKSoKCQlHZXQgdGhlIGFtb3VudCBvZiBpbmRlbnQgZm9yIGxpbmUge2xudW19IGFjY29yZGluZyB0aGUgQwoJCWluZGVudGluZyBydWxlcywgYXMgd2l0aCAnY2luZGVudCcuCgkJVGhlIGluZGVudCBpcyBjb3VudGVkIGluIHNwYWNlcywgdGhlIHZhbHVlIG9mICd0YWJzdG9wJyBpcwoJCXJlbGV2YW50LiAge2xudW19IGlzIHVzZWQganVzdCBsaWtlIGluIHxnZXRsaW5lKCl8LgoJCVdoZW4ge2xudW19IGlzIGludmFsaWQgb3IgVmltIHdhcyBub3QgY29tcGlsZWQgdGhlIHwrY2luZGVudHwKCQlmZWF0dXJlLCAtMSBpcyByZXR1cm5lZC4KCQlTZWUgfEMtaW5kZW50aW5nfC4KCmNsZWFybWF0Y2hlcygpCQkJCQkJKmNsZWFybWF0Y2hlcygpKgoJCUNsZWFycyBhbGwgbWF0Y2hlcyBwcmV2aW91c2x5IGRlZmluZWQgYnkgfG1hdGNoYWRkKCl8IGFuZCB0aGUKCQl8Om1hdGNofCBjb21tYW5kcy4KCgkJCQkJCQkqY29sKCkqCmNvbCh7ZXhwcn0pCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBieXRlIGluZGV4IG9mIHRoZSBjb2x1bW4KCQlwb3NpdGlvbiBnaXZlbiB3aXRoIHtleHByfS4gIFRoZSBhY2NlcHRlZCBwb3NpdGlvbnMgYXJlOgoJCSAgICAuCSAgICB0aGUgY3Vyc29yIHBvc2l0aW9uCgkJICAgICQJICAgIHRoZSBlbmQgb2YgdGhlIGN1cnNvciBsaW5lICh0aGUgcmVzdWx0IGlzIHRoZQoJCQkgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJzb3IgbGluZSBwbHVzIG9uZSkKCQkgICAgJ3gJICAgIHBvc2l0aW9uIG9mIG1hcmsgeCAoaWYgdGhlIG1hcmsgaXMgbm90IHNldCwgMCBpcwoJCQkgICAgcmV0dXJuZWQpCgkJICAgIHYgICAgICAgSW4gVmlzdWFsIG1vZGU6IHRoZSBzdGFydCBvZiB0aGUgVmlzdWFsIGFyZWEgKHRoZQoJCQkgICAgY3Vyc29yIGlzIHRoZSBlbmQpLiAgV2hlbiBub3QgaW4gVmlzdWFsIG1vZGUKCQkJICAgIHJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbi4gIERpZmZlcnMgZnJvbSB8Jzx8IGluCgkJCSAgICB0aGF0IGl0J3MgdXBkYXRlZCByaWdodCBhd2F5LgoJCUFkZGl0aW9uYWxseSB7ZXhwcn0gY2FuIGJlIFtsbnVtLCBjb2xdOiBhIHxMaXN0fCB3aXRoIHRoZSBsaW5lCgkJYW5kIGNvbHVtbiBudW1iZXIuIE1vc3QgdXNlZnVsIHdoZW4gdGhlIGNvbHVtbiBpcyAiJCIsIHRvIGdldAoJCXRoZSBsYXN0IGNvbHVtbiBvZiBhIHNwZWNpZmljIGxpbmUuICBXaGVuICJsbnVtIiBvciAiY29sIiBpcwoJCW91dCBvZiByYW5nZSB0aGVuIGNvbCgpIHJldHVybnMgemVyby4KCQlUbyBnZXQgdGhlIGxpbmUgbnVtYmVyIHVzZSB8bGluZSgpfC4gIFRvIGdldCBib3RoIHVzZQoJCXxnZXRwb3MoKXwuCgkJRm9yIHRoZSBzY3JlZW4gY29sdW1uIHBvc2l0aW9uIHVzZSB8dmlydGNvbCgpfC4KCQlOb3RlIHRoYXQgb25seSBtYXJrcyBpbiB0aGUgY3VycmVudCBmaWxlIGNhbiBiZSB1c2VkLgoJCUV4YW1wbGVzOiA+CgkJCWNvbCgiLiIpCQljb2x1bW4gb2YgY3Vyc29yCgkJCWNvbCgiJCIpCQlsZW5ndGggb2YgY3Vyc29yIGxpbmUgcGx1cyBvbmUKCQkJY29sKCIndCIpCQljb2x1bW4gb2YgbWFyayB0CgkJCWNvbCgiJyIgLiBtYXJrbmFtZSkJY29sdW1uIG9mIG1hcmsgbWFya25hbWUKPAkJVGhlIGZpcnN0IGNvbHVtbiBpcyAxLgkwIGlzIHJldHVybmVkIGZvciBhbiBlcnJvci4KCQlGb3IgYW4gdXBwZXJjYXNlIG1hcmsgdGhlIGNvbHVtbiBtYXkgYWN0dWFsbHkgYmUgaW4gYW5vdGhlcgoJCWJ1ZmZlci4KCQlGb3IgdGhlIGN1cnNvciBwb3NpdGlvbiwgd2hlbiAndmlydHVhbGVkaXQnIGlzIGFjdGl2ZSwgdGhlCgkJY29sdW1uIGlzIG9uZSBoaWdoZXIgaWYgdGhlIGN1cnNvciBpcyBhZnRlciB0aGUgZW5kIG9mIHRoZQoJCWxpbmUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIG9idGFpbiB0aGUgY29sdW1uIGluIEluc2VydCBtb2RlOiA+CgkJCTppbWFwIDxGMj4gPEMtTz46bGV0IHNhdmVfdmUgPSAmdmU8Q1I+CgkJCQlcPEMtTz46c2V0IHZlPWFsbDxDUj4KCQkJCVw8Qy1PPjplY2hvIGNvbCgiLiIpIC4gIlxuIiA8QmFyPgoJCQkJXGxldCAmdmUgPSBzYXZlX3ZlPENSPgo8Cgpjb21wbGV0ZSh7c3RhcnRjb2x9LCB7bWF0Y2hlc30pCQkJKmNvbXBsZXRlKCkqICpFNzg1KgoJCVNldCB0aGUgbWF0Y2hlcyBmb3IgSW5zZXJ0IG1vZGUgY29tcGxldGlvbi4KCQlDYW4gb25seSBiZSB1c2VkIGluIEluc2VydCBtb2RlLiAgWW91IG5lZWQgdG8gdXNlIGEgbWFwcGluZwoJCXdpdGggQ1RSTC1SID0gfGlfQ1RSTC1SfC4gIEl0IGRvZXMgbm90IHdvcmsgYWZ0ZXIgQ1RSTC1PIG9yCgkJd2l0aCBhbiBleHByZXNzaW9uIG1hcHBpbmcuCgkJe3N0YXJ0Y29sfSBpcyB0aGUgYnl0ZSBvZmZzZXQgaW4gdGhlIGxpbmUgd2hlcmUgdGhlIGNvbXBsZXRlZAoJCXRleHQgc3RhcnQuICBUaGUgdGV4dCB1cCB0byB0aGUgY3Vyc29yIGlzIHRoZSBvcmlnaW5hbCB0ZXh0CgkJdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBtYXRjaGVzLiAgVXNlIGNvbCgnLicpIGZvciBhbgoJCWVtcHR5IHN0cmluZy4gICJjb2woJy4nKSAtIDEiIHdpbGwgcmVwbGFjZSBvbmUgY2hhcmFjdGVyIGJ5IGEKCQltYXRjaC4KCQl7bWF0Y2hlc30gbXVzdCBiZSBhIHxMaXN0fC4gIEVhY2ggfExpc3R8IGl0ZW0gaXMgb25lIG1hdGNoLgoJCVNlZSB8Y29tcGxldGUtaXRlbXN8IGZvciB0aGUga2luZCBvZiBpdGVtcyB0aGF0IGFyZSBwb3NzaWJsZS4KCQlOb3RlIHRoYXQgdGhlIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB5b3UgbmVlZCB0byBhdm9pZAoJCWluc2VydGluZyBhbnl0aGluZyB0aGF0IHdvdWxkIGNhdXNlIGNvbXBsZXRpb24gdG8gc3RvcC4KCQlUaGUgbWF0Y2ggY2FuIGJlIHNlbGVjdGVkIHdpdGggQ1RSTC1OIGFuZCBDVFJMLVAgYXMgdXN1YWwgd2l0aAoJCUluc2VydCBtb2RlIGNvbXBsZXRpb24uICBUaGUgcG9wdXAgbWVudSB3aWxsIGFwcGVhciBpZgoJCXNwZWNpZmllZCwgc2VlIHxpbnMtY29tcGxldGlvbi1tZW51fC4KCQlFeGFtcGxlOiA+Cglpbm9yZW1hcCA8RjU+IDxDLVI+PUxpc3RNb250aHMoKTxDUj4KCglmdW5jISBMaXN0TW9udGhzKCkKCSAgY2FsbCBjb21wbGV0ZShjb2woJy4nKSwgWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywKCQlcICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLAoJCVwgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSkKCSAgcmV0dXJuICcnCgllbmRmdW5jCjwJCVRoaXMgaXNuJ3QgdmVyeSB1c2VmdWwsIGJ1dCBpdCBzaG93cyBob3cgaXQgd29ya3MuICBOb3RlIHRoYXQKCQlhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgdG8gYXZvaWQgYSB6ZXJvIGJlaW5nIGluc2VydGVkLgoKY29tcGxldGVfYWRkKHtleHByfSkJCQkJKmNvbXBsZXRlX2FkZCgpKgoJCUFkZCB7ZXhwcn0gdG8gdGhlIGxpc3Qgb2YgbWF0Y2hlcy4gIE9ubHkgdG8gYmUgdXNlZCBieSB0aGUKCQlmdW5jdGlvbiBzcGVjaWZpZWQgd2l0aCB0aGUgJ2NvbXBsZXRlZnVuYycgb3B0aW9uLgoJCVJldHVybnMgMCBmb3IgZmFpbHVyZSAoZW1wdHkgc3RyaW5nIG9yIG91dCBvZiBtZW1vcnkpLAoJCTEgd2hlbiB0aGUgbWF0Y2ggd2FzIGFkZGVkLCAyIHdoZW4gdGhlIG1hdGNoIHdhcyBhbHJlYWR5IGluCgkJdGhlIGxpc3QuCgkJU2VlIHxjb21wbGV0ZS1mdW5jdGlvbnN8IGZvciBhbiBleHBsYW5hdGlvbiBvZiB7ZXhwcn0uCUl0IGlzCgkJdGhlIHNhbWUgYXMgb25lIGl0ZW0gaW4gdGhlIGxpc3QgdGhhdCAnb21uaWZ1bmMnIHdvdWxkIHJldHVybi4KCmNvbXBsZXRlX2NoZWNrKCkJCQkJKmNvbXBsZXRlX2NoZWNrKCkqCgkJQ2hlY2sgZm9yIGEga2V5IHR5cGVkIHdoaWxlIGxvb2tpbmcgZm9yIGNvbXBsZXRpb24gbWF0Y2hlcy4KCQlUaGlzIGlzIHRvIGJlIHVzZWQgd2hlbiBsb29raW5nIGZvciBtYXRjaGVzIHRha2VzIHNvbWUgdGltZS4KCQlSZXR1cm5zIG5vbi16ZXJvIHdoZW4gc2VhcmNoaW5nIGZvciBtYXRjaGVzIGlzIHRvIGJlIGFib3J0ZWQsCgkJemVybyBvdGhlcndpc2UuCgkJT25seSB0byBiZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQgd2l0aCB0aGUKCQknY29tcGxldGVmdW5jJyBvcHRpb24uCgoJCQkJCQkqY29uZmlybSgpKgpjb25maXJtKHttc2d9IFssIHtjaG9pY2VzfSBbLCB7ZGVmYXVsdH0gWywge3R5cGV9XV1dKQoJCUNvbmZpcm0oKSBvZmZlcnMgdGhlIHVzZXIgYSBkaWFsb2csIGZyb20gd2hpY2ggYSBjaG9pY2UgY2FuIGJlCgkJbWFkZS4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY2hvaWNlLiAgRm9yIHRoZSBmaXJzdAoJCWNob2ljZSB0aGlzIGlzIDEuCgkJTm90ZTogY29uZmlybSgpIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gY29tcGlsZWQgd2l0aCBkaWFsb2cKCQlzdXBwb3J0LCBzZWUgfCtkaWFsb2dfY29ufCBhbmQgfCtkaWFsb2dfZ3VpfC4KCgkJe21zZ30gaXMgZGlzcGxheWVkIGluIGEgfGRpYWxvZ3wgd2l0aCB7Y2hvaWNlc30gYXMgdGhlCgkJYWx0ZXJuYXRpdmVzLiAgV2hlbiB7Y2hvaWNlc30gaXMgbWlzc2luZyBvciBlbXB0eSwgIiZPSyIgaXMKCQl1c2VkIChhbmQgdHJhbnNsYXRlZCkuCgkJe21zZ30gaXMgYSBTdHJpbmcsIHVzZSAnXG4nIHRvIGluY2x1ZGUgYSBuZXdsaW5lLiAgT25seSBvbgoJCXNvbWUgc3lzdGVtcyB0aGUgc3RyaW5nIGlzIHdyYXBwZWQgd2hlbiBpdCBkb2Vzbid0IGZpdC4KCgkJe2Nob2ljZXN9IGlzIGEgU3RyaW5nLCB3aXRoIHRoZSBpbmRpdmlkdWFsIGNob2ljZXMgc2VwYXJhdGVkCgkJYnkgJ1xuJywgZS5nLiA+CgkJCWNvbmZpcm0oIlNhdmUgY2hhbmdlcz8iLCAiJlllc1xuJk5vXG4mQ2FuY2VsIikKPAkJVGhlIGxldHRlciBhZnRlciB0aGUgJyYnIGlzIHRoZSBzaG9ydGN1dCBrZXkgZm9yIHRoYXQgY2hvaWNlLgoJCVRodXMgeW91IGNhbiB0eXBlICdjJyB0byBzZWxlY3QgIkNhbmNlbCIuICBUaGUgc2hvcnRjdXQgZG9lcwoJCW5vdCBuZWVkIHRvIGJlIHRoZSBmaXJzdCBsZXR0ZXI6ID4KCQkJY29uZmlybSgiZmlsZSBoYXMgYmVlbiBtb2RpZmllZCIsICImU2F2ZVxuU2F2ZSAmQWxsIikKPAkJRm9yIHRoZSBjb25zb2xlLCB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggY2hvaWNlIGlzIHVzZWQgYXMKCQl0aGUgZGVmYXVsdCBzaG9ydGN1dCBrZXkuCgoJCVRoZSBvcHRpb25hbCB7ZGVmYXVsdH0gYXJndW1lbnQgaXMgdGhlIG51bWJlciBvZiB0aGUgY2hvaWNlCgkJdGhhdCBpcyBtYWRlIGlmIHRoZSB1c2VyIGhpdHMgPENSPi4gIFVzZSAxIHRvIG1ha2UgdGhlIGZpcnN0CgkJY2hvaWNlIHRoZSBkZWZhdWx0IG9uZS4gIFVzZSAwIHRvIG5vdCBzZXQgYSBkZWZhdWx0LiAgSWYKCQl7ZGVmYXVsdH0gaXMgb21pdHRlZCwgMSBpcyB1c2VkLgoKCQlUaGUgb3B0aW9uYWwge3R5cGV9IGFyZ3VtZW50IGdpdmVzIHRoZSB0eXBlIG9mIGRpYWxvZy4gIFRoaXMKCQlpcyBvbmx5IHVzZWQgZm9yIHRoZSBpY29uIG9mIHRoZSBHVEssIE1hYywgTW90aWYgYW5kIFdpbjMyCgkJR1VJLiAgSXQgY2FuIGJlIG9uZSBvZiB0aGVzZSB2YWx1ZXM6ICJFcnJvciIsICJRdWVzdGlvbiIsCgkJIkluZm8iLCAiV2FybmluZyIgb3IgIkdlbmVyaWMiLiAgT25seSB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzCgkJcmVsZXZhbnQuICBXaGVuIHt0eXBlfSBpcyBvbWl0dGVkLCAiR2VuZXJpYyIgaXMgdXNlZC4KCgkJSWYgdGhlIHVzZXIgYWJvcnRzIHRoZSBkaWFsb2cgYnkgcHJlc3NpbmcgPEVzYz4sIENUUkwtQywKCQlvciBhbm90aGVyIHZhbGlkIGludGVycnVwdCBrZXksIGNvbmZpcm0oKSByZXR1cm5zIDAuCgoJCUFuIGV4YW1wbGU6ID4KICAgOmxldCBjaG9pY2UgPSBjb25maXJtKCJXaGF0IGRvIHlvdSB3YW50PyIsICImQXBwbGVzXG4mT3Jhbmdlc1xuJkJhbmFuYXMiLCAyKQogICA6aWYgY2hvaWNlID09IDAKICAgOgllY2hvICJtYWtlIHVwIHlvdXIgbWluZCEiCiAgIDplbHNlaWYgY2hvaWNlID09IDMKICAgOgllY2hvICJ0YXN0ZWZ1bCIKICAgOmVsc2UKICAgOgllY2hvICJJIHByZWZlciBiYW5hbmFzIG15c2VsZi4iCiAgIDplbmRpZgo8CQlJbiBhIEdVSSBkaWFsb2csIGJ1dHRvbnMgYXJlIHVzZWQuICBUaGUgbGF5b3V0IG9mIHRoZSBidXR0b25zCgkJZGVwZW5kcyBvbiB0aGUgJ3YnIGZsYWcgaW4gJ2d1aW9wdGlvbnMnLiAgSWYgaXQgaXMgaW5jbHVkZWQsCgkJdGhlIGJ1dHRvbnMgYXJlIGFsd2F5cyBwdXQgdmVydGljYWxseS4JT3RoZXJ3aXNlLCAgY29uZmlybSgpCgkJdHJpZXMgdG8gcHV0IHRoZSBidXR0b25zIGluIG9uZSBob3Jpem9udGFsIGxpbmUuICBJZiB0aGV5CgkJZG9uJ3QgZml0LCBhIHZlcnRpY2FsIGxheW91dCBpcyB1c2VkIGFueXdheS4gIEZvciBzb21lIHN5c3RlbXMKCQl0aGUgaG9yaXpvbnRhbCBsYXlvdXQgaXMgYWx3YXlzIHVzZWQuCgpjaF9jbG9zZSh7aGFuZGxlfSkJCQkJCSpjaF9jbG9zZSgpKgoJCUNsb3NlIGNoYW5uZWwge2hhbmRsZX0uICBTZWUgfGNoYW5uZWx8LgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrY2hhbm5lbHwgZmVhdHVyZX0KCmNoX29wZW4oe2FkZHJlc3N9IFssIHthcmdkaWN0fV0pCQkJCSpjaF9vcGVuKCkqCgkJT3BlbiBhIGNoYW5uZWwgdG8ge2FkZHJlc3N9LiAgU2VlIHxjaGFubmVsfC4KCQlSZXR1cm5zIHRoZSBjaGFubmVsIGhhbmRsZSBvbiBzdWNjZXNzLiAgUmV0dXJucyBhIG5lZ2F0aXZlCgkJbnVtYmVyIGZvciBmYWlsdXJlLgoKCQl7YWRkcmVzc30gaGFzIHRoZSBmb3JtICJob3N0bmFtZTpwb3J0IiwgZS5nLiwKCQkibG9jYWxob3N0Ojg3NjUiLgoKCQlJZiB7YXJnZGljdH0gaXMgZ2l2ZW4gaXQgbXVzdCBiZSBhIHxEaWN0aW9uYXJ5fC4gIFRoZSBvcHRpb25hbAoJCWl0ZW1zIGFyZToKCQkJbW9kZSAgICAgICAgInJhdyIgb3IgImpzb24iLgoJCQkJICAgIERlZmF1bHQgImpzb24iLgoJCQljYWxsYmFjayAgICBmdW5jdGlvbiB0byBjYWxsIGZvciByZXF1ZXN0cyB3aXRoIGEgemVybwoJCQkJICAgIHNlcXVlbmNlIG51bWJlci4gIFNlZSB8Y2hhbm5lbC1jYWxsYmFja3wuCgkJCQkgICAgRGVmYXVsdDogbm9uZS4KCQkJd2FpdHRpbWUgICAgU3BlY2lmeSBjb25uZWN0IHRpbWVvdXQgYXMgbWlsbGlzZWNvbmRzLgoJCQkJICAgIE5lZ2F0aXZlIG1lYW5zIGZvcmV2ZXIuCgkJCQkgICAgRGVmYXVsdDogMCAoZG9uJ3Qgd2FpdCkKCQkJdGltZW91dAkgICAgU3BlY2lmeSByZXNwb25zZSByZWFkIHRpbWVvdXQgdmFsdWUgYXMKCQkJCSAgICBtaWxsaXNlY29uZHMuIAoJCQkJICAgIERlZmF1bHQ6IDIwMDAuCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtjaGFubmVsfCBmZWF0dXJlfQoKY2hfc2VuZGV4cHIoe2hhbmRsZX0sIHtleHByfSBbLCB7Y2FsbGJhY2t9XSkJCSpjaF9zZW5kZXhwcigpKgoJCVNlbmQge2V4cHJ9IG92ZXIgSlNPTiBjaGFubmVsIHtoYW5kbGV9LiAgU2VlIHxjaGFubmVsLXVzZXwuCgoJCVdoZW4ge2NhbGxiYWNrfSBpcyBnaXZlbiByZXR1cm5zIGltbWVkaWF0ZWx5LiAgV2l0aG91dAoJCXtjYWxsYmFja30gd2FpdHMgZm9yIGEgSlNPTiByZXNwb25zZSBhbmQgcmV0dXJucyB0aGUgZGVjb2RlZAoJCWV4cHJlc3Npb24uICBXaGVuIHRoZXJlIGlzIGFuIGVycm9yIG9yIHRpbWVvdXQgcmV0dXJucyBhbgoJCWVtcHR5IHN0cmluZy4KCgkJV2hlbiB7Y2FsbGJhY2t9IGlzIHplcm8gbm8gcmVzcG9uc2UgaXMgZXhwZWN0ZWQuCgkJT3RoZXJ3aXNlIHtjYWxsYmFja30gbXVzdCBiZSBhIEZ1bmNyZWYgb3IgdGhlIG5hbWUgb2YgYQoJCWZ1bmN0aW9uLiAgSXQgaXMgY2FsbGVkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiAgU2VlCgkJfGNoYW5uZWwtY2FsbGJhY2t8LgoKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2NoYW5uZWx8IGZlYXR1cmV9CgpjaF9zZW5kcmF3KHtoYW5kbGV9LCB7c3RyaW5nfSBbLCB7Y2FsbGJhY2t9XSkJCSpjaF9zZW5kcmF3KCkqCgkJU2VuZCB7c3RyaW5nfSBvdmVyIHJhdyBjaGFubmVsIHtoYW5kbGV9LiAgU2VlIHxjaGFubmVsLXJhd3wuCgkJV29ya3MgbGlrZSB8Y2hfc2VuZGV4cHIoKXwsIGJ1dCBkb2VzIG5vdCBkZWNvZGUgdGhlIHJlc3BvbnNlLgoKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2NoYW5uZWx8IGZlYXR1cmV9CgoJCQkJCQkJKmNvcHkoKSoKY29weSh7ZXhwcn0pCU1ha2UgYSBjb3B5IG9mIHtleHByfS4JRm9yIE51bWJlcnMgYW5kIFN0cmluZ3MgdGhpcyBpc24ndAoJCWRpZmZlcmVudCBmcm9tIHVzaW5nIHtleHByfSBkaXJlY3RseS4KCQlXaGVuIHtleHByfSBpcyBhIHxMaXN0fCBhIHNoYWxsb3cgY29weSBpcyBjcmVhdGVkLiAgVGhpcyBtZWFucwoJCXRoYXQgdGhlIG9yaWdpbmFsIHxMaXN0fCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGNoYW5naW5nIHRoZQoJCWNvcHksIGFuZCB2aWNlIHZlcnNhLiAgQnV0IHRoZSBpdGVtcyBhcmUgaWRlbnRpY2FsLCB0aHVzCgkJY2hhbmdpbmcgYW4gaXRlbSBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBib3RoIHxMaXN0c3wuCUFsc28KCQlzZWUgfGRlZXBjb3B5KCl8LgoKY29zKHtleHByfSkJCQkJCQkqY29zKCkqCgkJUmV0dXJuIHRoZSBjb3NpbmUgb2Yge2V4cHJ9LCBtZWFzdXJlZCBpbiByYWRpYW5zLCBhcyBhIHxGbG9hdHwuCgkJe2V4cHJ9IG11c3QgZXZhbHVhdGUgdG8gYSB8RmxvYXR8IG9yIGEgfE51bWJlcnwuCgkJRXhhbXBsZXM6ID4KCQkJOmVjaG8gY29zKDEwMCkKPAkJCTAuODYyMzE5ID4KCQkJOmVjaG8gY29zKC00LjAxKQo8CQkJLTAuNjQ2MDQzCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgpjb3NoKHtleHByfSkJCQkJCQkqY29zaCgpKgoJCVJldHVybiB0aGUgaHlwZXJib2xpYyBjb3NpbmUgb2Yge2V4cHJ9IGFzIGEgfEZsb2F0fCBpbiB0aGUgcmFuZ2UKCQlbMSwgaW5mXS4KCQl7ZXhwcn0gbXVzdCBldmFsdWF0ZSB0byBhIHxGbG9hdHwgb3IgYSB8TnVtYmVyfC4KCQlFeGFtcGxlczogPgoJCQk6ZWNobyBjb3NoKDAuNSkKPAkJCTEuMTI3NjI2ID4KCQkJOmVjaG8gY29zaCgtMC41KQo8CQkJLTEuMTI3NjI2CgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgkJCmNvdW50KHtjb21wfSwge2V4cHJ9IFssIHtpY30gWywge3N0YXJ0fV1dKQkJCSpjb3VudCgpKgoJCVJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGl0ZW0gd2l0aCB2YWx1ZSB7ZXhwcn0gYXBwZWFycwoJCWluIHxMaXN0fCBvciB8RGljdGlvbmFyeXwge2NvbXB9LgoJCUlmIHtzdGFydH0gaXMgZ2l2ZW4gdGhlbiBzdGFydCB3aXRoIHRoZSBpdGVtIHdpdGggdGhpcyBpbmRleC4KCQl7c3RhcnR9IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIHxMaXN0fC4KCQlXaGVuIHtpY30gaXMgZ2l2ZW4gYW5kIGl0J3Mgbm9uLXplcm8gdGhlbiBjYXNlIGlzIGlnbm9yZWQuCgoKCQkJCQkJCSpjc2NvcGVfY29ubmVjdGlvbigpKgpjc2NvcGVfY29ubmVjdGlvbihbe251bX0gLCB7ZGJwYXRofSBbLCB7cHJlcGVuZH1dXSkKCQlDaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSB8Y3Njb3BlfCBjb25uZWN0aW9uLiAgSWYgbm8KCQlwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnM6CgkJCTAsIGlmIGNzY29wZSB3YXMgbm90IGF2YWlsYWJsZSAobm90IGNvbXBpbGVkIGluKSwgb3IKCQkJICAgaWYgdGhlcmUgYXJlIG5vIGNzY29wZSBjb25uZWN0aW9uczsKCQkJMSwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNzY29wZSBjb25uZWN0aW9uLgoKCQlJZiBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHZhbHVlIG9mIHtudW19CgkJZGV0ZXJtaW5lcyBob3cgZXhpc3RlbmNlIG9mIGEgY3Njb3BlIGNvbm5lY3Rpb24gaXMgY2hlY2tlZDoKCgkJe251bX0JRGVzY3JpcHRpb24gb2YgZXhpc3RlbmNlIGNoZWNrCgkJLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkJMAlTYW1lIGFzIG5vIHBhcmFtZXRlcnMgKGUuZy4sICJjc2NvcGVfY29ubmVjdGlvbigpIikuCgkJMQlJZ25vcmUge3ByZXBlbmR9LCBhbmQgdXNlIHBhcnRpYWwgc3RyaW5nIG1hdGNoZXMgZm9yCgkJCXtkYnBhdGh9LgoJCTIJSWdub3JlIHtwcmVwZW5kfSwgYW5kIHVzZSBleGFjdCBzdHJpbmcgbWF0Y2hlcyBmb3IKCQkJe2RicGF0aH0uCgkJMwlVc2Uge3ByZXBlbmR9LCB1c2UgcGFydGlhbCBzdHJpbmcgbWF0Y2hlcyBmb3IgYm90aAoJCQl7ZGJwYXRofSBhbmQge3ByZXBlbmR9LgoJCTQJVXNlIHtwcmVwZW5kfSwgdXNlIGV4YWN0IHN0cmluZyBtYXRjaGVzIGZvciBib3RoCgkJCXtkYnBhdGh9IGFuZCB7cHJlcGVuZH0uCgoJCU5vdGU6IEFsbCBzdHJpbmcgY29tcGFyaXNvbnMgYXJlIGNhc2Ugc2Vuc2l0aXZlIQoKCQlFeGFtcGxlcy4gIFN1cHBvc2Ugd2UgaGFkIHRoZSBmb2xsb3dpbmcgKGZyb20gIjpjcyBzaG93Iik6ID4KCiAgIyBwaWQgICAgZGF0YWJhc2UgbmFtZQkJCXByZXBlbmQgcGF0aAogIDAgMjc2NjQgIGNzY29wZS5vdXQJCQkJL3Vzci9sb2NhbAo8CgkJSW52b2NhdGlvbgkJCQkJUmV0dXJuIFZhbCB+CgkJLS0tLS0tLS0tLQkJCQkJLS0tLS0tLS0tLSA+CgkJY3Njb3BlX2Nvbm5lY3Rpb24oKQkJCQkJMQoJCWNzY29wZV9jb25uZWN0aW9uKDEsICJvdXQiKQkJCQkxCgkJY3Njb3BlX2Nvbm5lY3Rpb24oMiwgIm91dCIpCQkJCTAKCQljc2NvcGVfY29ubmVjdGlvbigzLCAib3V0IikJCQkJMAoJCWNzY29wZV9jb25uZWN0aW9uKDMsICJvdXQiLCAibG9jYWwiKQkJCTEKCQljc2NvcGVfY29ubmVjdGlvbig0LCAib3V0IikJCQkJMAoJCWNzY29wZV9jb25uZWN0aW9uKDQsICJvdXQiLCAibG9jYWwiKQkJCTAKCQljc2NvcGVfY29ubmVjdGlvbig0LCAiY3Njb3BlLm91dCIsICIvdXNyL2xvY2FsIikJMQo8CmN1cnNvcih7bG51bX0sIHtjb2x9IFssIHtvZmZ9XSkJCQkJKmN1cnNvcigpKgpjdXJzb3Ioe2xpc3R9KQoJCVBvc2l0aW9ucyB0aGUgY3Vyc29yIGF0IHRoZSBjb2x1bW4gKGJ5dGUgY291bnQpIHtjb2x9IGluIHRoZQoJCWxpbmUge2xudW19LiAgVGhlIGZpcnN0IGNvbHVtbiBpcyBvbmUuCgoJCVdoZW4gdGhlcmUgaXMgb25lIGFyZ3VtZW50IHtsaXN0fSB0aGlzIGlzIHVzZWQgYXMgYSB8TGlzdHwKCQl3aXRoIHR3bywgdGhyZWUgb3IgZm91ciBpdGVtOgoJCQlbe2xudW19LCB7Y29sfSwge29mZn1dCgkJCVt7bG51bX0sIHtjb2x9LCB7b2ZmfSwge2N1cnN3YW50fV0KCQlUaGlzIGlzIGxpa2UgdGhlIHJldHVybiB2YWx1ZSBvZiB8Z2V0cG9zKCl8IG9yIHxnZXRjdXJwb3MoKXwsCgkJYnV0IHdpdGhvdXQgdGhlIGZpcnN0IGl0ZW0uCgoJCURvZXMgbm90IGNoYW5nZSB0aGUganVtcGxpc3QuCgkJSWYge2xudW19IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBidWZmZXIsCgkJdGhlIGN1cnNvciB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIGxhc3QgbGluZSBpbiB0aGUgYnVmZmVyLgoJCUlmIHtsbnVtfSBpcyB6ZXJvLCB0aGUgY3Vyc29yIHdpbGwgc3RheSBpbiB0aGUgY3VycmVudCBsaW5lLgoJCUlmIHtjb2x9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBsaW5lLAoJCXRoZSBjdXJzb3Igd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUKCQlsaW5lLgoJCUlmIHtjb2x9IGlzIHplcm8sIHRoZSBjdXJzb3Igd2lsbCBzdGF5IGluIHRoZSBjdXJyZW50IGNvbHVtbi4KCQlJZiB7Y3Vyc3dhbnR9IGlzIGdpdmVuIGl0IGlzIHVzZWQgdG8gc2V0IHRoZSBwcmVmZXJyZWQgY29sdW1uCgkJZm9yIHZlcnRpY2FsIG1vdmVtZW50LiAgT3RoZXJ3aXNlIHtjb2x9IGlzIHVzZWQuCgoJCVdoZW4gJ3ZpcnR1YWxlZGl0JyBpcyB1c2VkIHtvZmZ9IHNwZWNpZmllcyB0aGUgb2Zmc2V0IGluCgkJc2NyZWVuIGNvbHVtbnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGNoYXJhY3Rlci4gIEUuZy4sIGEKCQlwb3NpdGlvbiB3aXRoaW4gYSA8VGFiPiBvciBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIuCgkJUmV0dXJucyAwIHdoZW4gdGhlIHBvc2l0aW9uIGNvdWxkIGJlIHNldCwgLTEgb3RoZXJ3aXNlLgoKCmRlZXBjb3B5KHtleHByfVssIHtub3JlZn1dKQkJCQkqZGVlcGNvcHkoKSogKkU2OTgqCgkJTWFrZSBhIGNvcHkgb2Yge2V4cHJ9LglGb3IgTnVtYmVycyBhbmQgU3RyaW5ncyB0aGlzIGlzbid0CgkJZGlmZmVyZW50IGZyb20gdXNpbmcge2V4cHJ9IGRpcmVjdGx5LgoJCVdoZW4ge2V4cHJ9IGlzIGEgfExpc3R8IGEgZnVsbCBjb3B5IGlzIGNyZWF0ZWQuICBUaGlzIG1lYW5zCgkJdGhhdCB0aGUgb3JpZ2luYWwgfExpc3R8IGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQgY2hhbmdpbmcgdGhlCgkJY29weSwgYW5kIHZpY2UgdmVyc2EuICBXaGVuIGFuIGl0ZW0gaXMgYSB8TGlzdHwsIGEgY29weSBmb3IgaXQKCQlpcyBtYWRlLCByZWN1cnNpdmVseS4gIFRodXMgY2hhbmdpbmcgYW4gaXRlbSBpbiB0aGUgY29weSBkb2VzCgkJbm90IGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIHxMaXN0fC4KCQlXaGVuIHtub3JlZn0gaXMgb21pdHRlZCBvciB6ZXJvIGEgY29udGFpbmVkIHxMaXN0fCBvcgoJCXxEaWN0aW9uYXJ5fCBpcyBvbmx5IGNvcGllZCBvbmNlLiAgQWxsIHJlZmVyZW5jZXMgcG9pbnQgdG8KCQl0aGlzIHNpbmdsZSBjb3B5LiAgV2l0aCB7bm9yZWZ9IHNldCB0byAxIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgYQoJCXxMaXN0fCBvciB8RGljdGlvbmFyeXwgcmVzdWx0cyBpbiBhIG5ldyBjb3B5LiAgVGhpcyBhbHNvIG1lYW5zCgkJdGhhdCBhIGN5Y2xpYyByZWZlcmVuY2UgY2F1c2VzIGRlZXBjb3B5KCkgdG8gZmFpbC4KCQkJCQkJCQkqRTcyNCoKCQlOZXN0aW5nIGlzIHBvc3NpYmxlIHVwIHRvIDEwMCBsZXZlbHMuICBXaGVuIHRoZXJlIGlzIGFuIGl0ZW0KCQl0aGF0IHJlZmVycyBiYWNrIHRvIGEgaGlnaGVyIGxldmVsIG1ha2luZyBhIGRlZXAgY29weSB3aXRoCgkJe25vcmVmfSBzZXQgdG8gMSB3aWxsIGZhaWwuCgkJQWxzbyBzZWUgfGNvcHkoKXwuCgpkZWxldGUoe2ZuYW1lfSBbLCB7ZmxhZ3N9XSkJCQkJCSpkZWxldGUoKSoKCQlXaXRob3V0IHtmbGFnc30gb3Igd2l0aCB7ZmxhZ3N9IGVtcHR5OiBEZWxldGVzIHRoZSBmaWxlIGJ5IHRoZQoJCW5hbWUge2ZuYW1lfS4gIFRoaXMgYWxzbyB3b3JrcyB3aGVuIHtmbmFtZX0gaXMgYSBzeW1ib2xpYyBsaW5rLgoKCQlXaGVuIHtmbGFnc30gaXMgImQiOiBEZWxldGVzIHRoZSBkaXJlY3RvcnkgYnkgdGhlIG5hbWUKCQl7Zm5hbWV9LiAgVGhpcyBmYWlscyB3aGVuIGRpcmVjdG9yeSB7Zm5hbWV9IGlzIG5vdCBlbXB0eS4KCQkKCQlXaGVuIHtmbGFnc30gaXMgInJmIjogRGVsZXRlcyB0aGUgZGlyZWN0b3J5IGJ5IHRoZSBuYW1lCgkJe2ZuYW1lfSBhbmQgZXZlcnl0aGluZyBpbiBpdCwgcmVjdXJzaXZlbHkuICBCRSBDQVJFRlVMIQoJCUEgc3ltYm9saWMgbGluayBpdHNlbGYgaXMgZGVsZXRlZCwgbm90IHdoYXQgaXQgcG9pbnRzIHRvLgoJCQoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIDAgaWYgdGhlIGRlbGV0ZSBvcGVyYXRpb24gd2FzCgkJc3VjY2Vzc2Z1bCBhbmQgLTEgd2hlbiB0aGUgZGVsZXRpb24gZmFpbGVkIG9yIHBhcnRseSBmYWlsZWQuCgoJCVVzZSB8cmVtb3ZlKCl8IHRvIGRlbGV0ZSBhbiBpdGVtIGZyb20gYSB8TGlzdHwuCgkJVG8gZGVsZXRlIGEgbGluZSBmcm9tIHRoZSBidWZmZXIgdXNlIHw6ZGVsZXRlfC4gIFVzZSB8OmV4ZXwKCQl3aGVuIHRoZSBsaW5lIG51bWJlciBpcyBpbiBhIHZhcmlhYmxlLgoKCQkJCQkJCSpkaWRfZmlsZXR5cGUoKSoKZGlkX2ZpbGV0eXBlKCkJUmV0dXJucyBub24temVybyB3aGVuIGF1dG9jb21tYW5kcyBhcmUgYmVpbmcgZXhlY3V0ZWQgYW5kIHRoZQoJCUZpbGVUeXBlIGV2ZW50IGhhcyBiZWVuIHRyaWdnZXJlZCBhdCBsZWFzdCBvbmNlLiAgQ2FuIGJlIHVzZWQKCQl0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBGaWxlVHlwZSBldmVudCBhZ2FpbiBpbiB0aGUgc2NyaXB0cwoJCXRoYXQgZGV0ZWN0IHRoZSBmaWxlIHR5cGUuIHxGaWxlVHlwZXwKCQlXaGVuIGVkaXRpbmcgYW5vdGhlciBmaWxlLCB0aGUgY291bnRlciBpcyByZXNldCwgdGh1cyB0aGlzCgkJcmVhbGx5IGNoZWNrcyBpZiB0aGUgRmlsZVR5cGUgZXZlbnQgaGFzIGJlZW4gdHJpZ2dlcmVkIGZvciB0aGUKCQljdXJyZW50IGJ1ZmZlci4gIFRoaXMgYWxsb3dzIGFuIGF1dG9jb21tYW5kIHRoYXQgc3RhcnRzCgkJZWRpdGluZyBhbm90aGVyIGJ1ZmZlciB0byBzZXQgJ2ZpbGV0eXBlJyBhbmQgbG9hZCBhIHN5bnRheAoJCWZpbGUuCgpkaWZmX2ZpbGxlcih7bG51bX0pCQkJCQkqZGlmZl9maWxsZXIoKSoKCQlSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsbGVyIGxpbmVzIGFib3ZlIGxpbmUge2xudW19LgoJCVRoZXNlIGFyZSB0aGUgbGluZXMgdGhhdCB3ZXJlIGluc2VydGVkIGF0IHRoaXMgcG9pbnQgaW4KCQlhbm90aGVyIGRpZmYnZWQgd2luZG93LiAgVGhlc2UgZmlsbGVyIGxpbmVzIGFyZSBzaG93biBpbiB0aGUKCQlkaXNwbGF5IGJ1dCBkb24ndCBleGlzdCBpbiB0aGUgYnVmZmVyLgoJCXtsbnVtfSBpcyB1c2VkIGxpa2Ugd2l0aCB8Z2V0bGluZSgpfC4gIFRodXMgIi4iIGlzIHRoZSBjdXJyZW50CgkJbGluZSwgIidtIiBtYXJrIG0sIGV0Yy4KCQlSZXR1cm5zIDAgaWYgdGhlIGN1cnJlbnQgd2luZG93IGlzIG5vdCBpbiBkaWZmIG1vZGUuCgpkaWZmX2hsSUQoe2xudW19LCB7Y29sfSkJCQkJKmRpZmZfaGxJRCgpKgoJCVJldHVybnMgdGhlIGhpZ2hsaWdodCBJRCBmb3IgZGlmZiBtb2RlIGF0IGxpbmUge2xudW19IGNvbHVtbgoJCXtjb2x9IChieXRlIGluZGV4KS4gIFdoZW4gdGhlIGN1cnJlbnQgbGluZSBkb2VzIG5vdCBoYXZlIGEKCQlkaWZmIGNoYW5nZSB6ZXJvIGlzIHJldHVybmVkLgoJCXtsbnVtfSBpcyB1c2VkIGxpa2Ugd2l0aCB8Z2V0bGluZSgpfC4gIFRodXMgIi4iIGlzIHRoZSBjdXJyZW50CgkJbGluZSwgIidtIiBtYXJrIG0sIGV0Yy4KCQl7Y29sfSBpcyAxIGZvciB0aGUgbGVmdG1vc3QgY29sdW1uLCB7bG51bX0gaXMgMSBmb3IgdGhlIGZpcnN0CgkJbGluZS4KCQlUaGUgaGlnaGxpZ2h0IElEIGNhbiBiZSB1c2VkIHdpdGggfHN5bklEYXR0cigpfCB0byBvYnRhaW4KCQlzeW50YXggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhpZ2hsaWdodGluZy4KCmVtcHR5KHtleHByfSkJCQkJCQkqZW1wdHkoKSoKCQlSZXR1cm4gdGhlIE51bWJlciAxIGlmIHtleHByfSBpcyBlbXB0eSwgemVybyBvdGhlcndpc2UuCgkJLSBBIHxMaXN0fCBvciB8RGljdGlvbmFyeXwgaXMgZW1wdHkgd2hlbiBpdCBkb2VzIG5vdCBoYXZlIGFueQoJCSAgaXRlbXMuCgkJLSBBIE51bWJlciBhbmQgRmxvYXQgaXMgZW1wdHkgd2hlbiBpdHMgdmFsdWUgaXMgemVyby4KCQktIHx2OmZhbHNlfCwgfHY6bm9uZXwgYW5kIHx2Om51bGx8IGFyZSBlbXB0eSwgfHY6dHJ1ZXwgaXMgbm90LgoJCS0gQSBKb2IgaXMgZW1wdHkgd2hlbiBpdCBmYWlsZWQgdG8gc3RhcnQuCgoJCUZvciBhIGxvbmcgfExpc3R8IHRoaXMgaXMgbXVjaCBmYXN0ZXIgdGhhbiBjb21wYXJpbmcgdGhlCgkJbGVuZ3RoIHdpdGggemVyby4KCmVzY2FwZSh7c3RyaW5nfSwge2NoYXJzfSkJCQkJKmVzY2FwZSgpKgoJCUVzY2FwZSB0aGUgY2hhcmFjdGVycyBpbiB7Y2hhcnN9IHRoYXQgb2NjdXIgaW4ge3N0cmluZ30gd2l0aCBhCgkJYmFja3NsYXNoLiAgRXhhbXBsZTogPgoJCQk6ZWNobyBlc2NhcGUoJ2M6XHByb2dyYW0gZmlsZXNcdmltJywgJyBcJykKPAkJcmVzdWx0cyBpbjogPgoJCQljOlxccHJvZ3JhbVwgZmlsZXNcXHZpbQo8CQlBbHNvIHNlZSB8c2hlbGxlc2NhcGUoKXwuCgoJCQkJCQkJKmV2YWwoKSoKZXZhbCh7c3RyaW5nfSkJRXZhbHVhdGUge3N0cmluZ30gYW5kIHJldHVybiB0aGUgcmVzdWx0LiAgRXNwZWNpYWxseSB1c2VmdWwgdG8KCQl0dXJuIHRoZSByZXN1bHQgb2YgfHN0cmluZygpfCBiYWNrIGludG8gdGhlIG9yaWdpbmFsIHZhbHVlLgoJCVRoaXMgd29ya3MgZm9yIE51bWJlcnMsIEZsb2F0cywgU3RyaW5ncyBhbmQgY29tcG9zaXRlcyBvZgoJCXRoZW0uICBBbHNvIHdvcmtzIGZvciB8RnVuY3JlZnxzIHRoYXQgcmVmZXIgdG8gZXhpc3RpbmcKCQlmdW5jdGlvbnMuCgpldmVudGhhbmRsZXIoKQkJCQkJCSpldmVudGhhbmRsZXIoKSoKCQlSZXR1cm5zIDEgd2hlbiBpbnNpZGUgYW4gZXZlbnQgaGFuZGxlci4gIFRoYXQgaXMgdGhhdCBWaW0gZ290CgkJaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHVzZXIgdG8gdHlwZSBhIGNoYXJhY3RlciwKCQllLmcuLCB3aGVuIGRyb3BwaW5nIGEgZmlsZSBvbiBWaW0uICBUaGlzIG1lYW5zIGludGVyYWN0aXZlCgkJY29tbWFuZHMgY2Fubm90IGJlIHVzZWQuICBPdGhlcndpc2UgemVybyBpcyByZXR1cm5lZC4KCmV4ZWN1dGFibGUoe2V4cHJ9KQkJCQkJKmV4ZWN1dGFibGUoKSoKCQlUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiBhbiBleGVjdXRhYmxlIHdpdGggdGhlIG5hbWUge2V4cHJ9CgkJZXhpc3RzLiAge2V4cHJ9IG11c3QgYmUgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gd2l0aG91dCBhbnkKCQlhcmd1bWVudHMuCgkJZXhlY3V0YWJsZSgpIHVzZXMgdGhlIHZhbHVlIG9mICRQQVRIIGFuZC9vciB0aGUgbm9ybWFsCgkJc2VhcmNocGF0aCBmb3IgcHJvZ3JhbXMuCQkqUEFUSEVYVCoKCQlPbiBNUy1ET1MgYW5kIE1TLVdpbmRvd3MgdGhlICIuZXhlIiwgIi5iYXQiLCBldGMuIGNhbgoJCW9wdGlvbmFsbHkgYmUgaW5jbHVkZWQuICBUaGVuIHRoZSBleHRlbnNpb25zIGluICRQQVRIRVhUIGFyZQoJCXRyaWVkLglUaHVzIGlmICJmb28uZXhlIiBkb2VzIG5vdCBleGlzdCwgImZvby5leGUuYmF0IiBjYW4gYmUKCQlmb3VuZC4JSWYgJFBBVEhFWFQgaXMgbm90IHNldCB0aGVuICIuZXhlOy5jb207LmJhdDsuY21kIiBpcwoJCXVzZWQuICBBIGRvdCBieSBpdHNlbGYgY2FuIGJlIHVzZWQgaW4gJFBBVEhFWFQgdG8gdHJ5IHVzaW5nCgkJdGhlIG5hbWUgd2l0aG91dCBhbiBleHRlbnNpb24uCVdoZW4gJ3NoZWxsJyBsb29rcyBsaWtlIGEKCQlVbml4IHNoZWxsLCB0aGVuIHRoZSBuYW1lIGlzIGFsc28gdHJpZWQgd2l0aG91dCBhZGRpbmcgYW4KCQlleHRlbnNpb24uCgkJT24gTVMtRE9TIGFuZCBNUy1XaW5kb3dzIGl0IG9ubHkgY2hlY2tzIGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQKCQlpcyBub3QgYSBkaXJlY3RvcnksIG5vdCBpZiBpdCdzIHJlYWxseSBleGVjdXRhYmxlLgoJCU9uIE1TLVdpbmRvd3MgYW4gZXhlY3V0YWJsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgVmltIGlzCgkJYWx3YXlzIGZvdW5kLiAgU2luY2UgdGhpcyBkaXJlY3RvcnkgaXMgYWRkZWQgdG8gJFBBVEggaXQKCQlzaG91bGQgYWxzbyB3b3JrIHRvIGV4ZWN1dGUgaXQgfHdpbjMyLVBBVEh8LgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXI6CgkJCTEJZXhpc3RzCgkJCTAJZG9lcyBub3QgZXhpc3QKCQkJLTEJbm90IGltcGxlbWVudGVkIG9uIHRoaXMgc3lzdGVtCgpleGVwYXRoKHtleHByfSkJCQkJCQkqZXhlcGF0aCgpKgoJCUlmIHtleHByfSBpcyBhbiBleGVjdXRhYmxlIGFuZCBpcyBlaXRoZXIgYW4gYWJzb2x1dGUgcGF0aCwgYQoJCXJlbGF0aXZlIHBhdGggb3IgZm91bmQgaW4gJFBBVEgsIHJldHVybiB0aGUgZnVsbCBwYXRoLgoJCU5vdGUgdGhhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgdXNlZCB3aGVuIHtleHByfSBzdGFydHMKCQl3aXRoICIuLyIsIHdoaWNoIG1heSBiZSBhIHByb2JsZW0gZm9yIFZpbTogPgoJCQllY2hvIGV4ZXBhdGgodjpwcm9ncGF0aCkKPAkJSWYge2V4cHJ9IGNhbm5vdCBiZSBmb3VuZCBpbiAkUEFUSCBvciBpcyBub3QgZXhlY3V0YWJsZSB0aGVuCgkJYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoKCQkJCQkJCSpleGlzdHMoKSoKZXhpc3RzKHtleHByfSkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgbm9uLXplcm8gaWYge2V4cHJ9IGlzCgkJZGVmaW5lZCwgemVybyBvdGhlcndpc2UuICBUaGUge2V4cHJ9IGFyZ3VtZW50IGlzIGEgc3RyaW5nLAoJCXdoaWNoIGNvbnRhaW5zIG9uZSBvZiB0aGVzZToKCQkJJm9wdGlvbi1uYW1lCVZpbSBvcHRpb24gKG9ubHkgY2hlY2tzIGlmIGl0IGV4aXN0cywKCQkJCQlub3QgaWYgaXQgcmVhbGx5IHdvcmtzKQoJCQkrb3B0aW9uLW5hbWUJVmltIG9wdGlvbiB0aGF0IHdvcmtzLgoJCQkkRU5WTkFNRQllbnZpcm9ubWVudCB2YXJpYWJsZSAoY291bGQgYWxzbyBiZQoJCQkJCWRvbmUgYnkgY29tcGFyaW5nIHdpdGggYW4gZW1wdHkKCQkJCQlzdHJpbmcpCgkJCSpmdW5jbmFtZQlidWlsdC1pbiBmdW5jdGlvbiAoc2VlIHxmdW5jdGlvbnN8KQoJCQkJCW9yIHVzZXIgZGVmaW5lZCBmdW5jdGlvbiAoc2VlCgkJCQkJfHVzZXItZnVuY3Rpb25zfCkuIEFsc28gd29ya3MgZm9yIGEKCQkJCQl2YXJpYWJsZSB0aGF0IGlzIGEgRnVuY3JlZi4KCQkJdmFybmFtZQkJaW50ZXJuYWwgdmFyaWFibGUgKHNlZQoJCQkJCXxpbnRlcm5hbC12YXJpYWJsZXN8KS4JQWxzbyB3b3JrcwoJCQkJCWZvciB8Y3VybHktYnJhY2VzLW5hbWVzfCwgfERpY3Rpb25hcnl8CgkJCQkJZW50cmllcywgfExpc3R8IGl0ZW1zLCBldGMuICBCZXdhcmUKCQkJCQl0aGF0IGV2YWx1YXRpbmcgYW4gaW5kZXggbWF5IGNhdXNlIGFuCgkJCQkJZXJyb3IgbWVzc2FnZSBmb3IgYW4gaW52YWxpZAoJCQkJCWV4cHJlc3Npb24uICBFLmcuOiA+CgkJCQkJICAgOmxldCBsID0gWzEsIDIsIDNdCgkJCQkJICAgOmVjaG8gZXhpc3RzKCJsWzVdIikKPAkJCQkJICAgMCA+CgkJCQkJICAgOmVjaG8gZXhpc3RzKCJsW3h4XSIpCjwJCQkJCSAgIEUxMjE6IFVuZGVmaW5lZCB2YXJpYWJsZTogeHgKCQkJCQkgICAwCgkJCTpjbWRuYW1lCUV4IGNvbW1hbmQ6IGJ1aWx0LWluIGNvbW1hbmQsIHVzZXIKCQkJCQljb21tYW5kIG9yIGNvbW1hbmQgbW9kaWZpZXIgfDpjb21tYW5kfC4KCQkJCQlSZXR1cm5zOgoJCQkJCTEgIGZvciBtYXRjaCB3aXRoIHN0YXJ0IG9mIGEgY29tbWFuZAoJCQkJCTIgIGZ1bGwgbWF0Y2ggd2l0aCBhIGNvbW1hbmQKCQkJCQkzICBtYXRjaGVzIHNldmVyYWwgdXNlciBjb21tYW5kcwoJCQkJCVRvIGNoZWNrIGZvciBhIHN1cHBvcnRlZCBjb21tYW5kCgkJCQkJYWx3YXlzIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgMi4KCQkJOjJtYXRjaAkJVGhlIHw6Mm1hdGNofCBjb21tYW5kLgoJCQk6M21hdGNoCQlUaGUgfDozbWF0Y2h8IGNvbW1hbmQuCgkJCSNldmVudAkJYXV0b2NvbW1hbmQgZGVmaW5lZCBmb3IgdGhpcyBldmVudAoJCQkjZXZlbnQjcGF0dGVybglhdXRvY29tbWFuZCBkZWZpbmVkIGZvciB0aGlzIGV2ZW50IGFuZAoJCQkJCXBhdHRlcm4gKHRoZSBwYXR0ZXJuIGlzIHRha2VuCgkJCQkJbGl0ZXJhbGx5IGFuZCBjb21wYXJlZCB0byB0aGUKCQkJCQlhdXRvY29tbWFuZCBwYXR0ZXJucyBjaGFyYWN0ZXIgYnkKCQkJCQljaGFyYWN0ZXIpCgkJCSNncm91cAkJYXV0b2NvbW1hbmQgZ3JvdXAgZXhpc3RzCgkJCSNncm91cCNldmVudAlhdXRvY29tbWFuZCBkZWZpbmVkIGZvciB0aGlzIGdyb3VwIGFuZAoJCQkJCWV2ZW50LgoJCQkjZ3JvdXAjZXZlbnQjcGF0dGVybgoJCQkJCWF1dG9jb21tYW5kIGRlZmluZWQgZm9yIHRoaXMgZ3JvdXAsCgkJCQkJZXZlbnQgYW5kIHBhdHRlcm4uCgkJCSMjZXZlbnQJCWF1dG9jb21tYW5kIGZvciB0aGlzIGV2ZW50IGlzCgkJCQkJc3VwcG9ydGVkLgoJCUZvciBjaGVja2luZyBmb3IgYSBzdXBwb3J0ZWQgZmVhdHVyZSB1c2UgfGhhcygpfC4KCgkJRXhhbXBsZXM6ID4KCQkJZXhpc3RzKCImc2hvcnRuYW1lIikKCQkJZXhpc3RzKCIkSE9TVE5BTUUiKQoJCQlleGlzdHMoIipzdHJmdGltZSIpCgkJCWV4aXN0cygiKnM6TXlGdW5jIikKCQkJZXhpc3RzKCJidWZjb3VudCIpCgkJCWV4aXN0cygiOk1ha2UiKQoJCQlleGlzdHMoIiNDdXJzb3JIb2xkIikKCQkJZXhpc3RzKCIjQnVmUmVhZFByZSMqLmd6IikKCQkJZXhpc3RzKCIjZmlsZXR5cGVpbmRlbnQiKQoJCQlleGlzdHMoIiNmaWxldHlwZWluZGVudCNGaWxlVHlwZSIpCgkJCWV4aXN0cygiI2ZpbGV0eXBlaW5kZW50I0ZpbGVUeXBlIyoiKQoJCQlleGlzdHMoIiMjQ29sb3JTY2hlbWUiKQo8CQlUaGVyZSBtdXN0IGJlIG5vIHNwYWNlIGJldHdlZW4gdGhlIHN5bWJvbCAoJi8kLyovIykgYW5kIHRoZQoJCW5hbWUuCgkJVGhlcmUgbXVzdCBiZSBubyBleHRyYSBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBuYW1lLCBhbHRob3VnaCBpbgoJCWEgZmV3IGNhc2VzIHRoaXMgaXMgaWdub3JlZC4gIFRoYXQgbWF5IGJlY29tZSBtb3JlIHN0cmljdCBpbgoJCXRoZSBmdXR1cmUsIHRodXMgZG9uJ3QgY291bnQgb24gaXQhCgkJV29ya2luZyBleGFtcGxlOiA+CgkJCWV4aXN0cygiOm1ha2UiKQo8CQlOT1Qgd29ya2luZyBleGFtcGxlOiA+CgkJCWV4aXN0cygiOm1ha2UgaW5zdGFsbCIpCgo8CQlOb3RlIHRoYXQgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIG5vdCB0aGUgbmFtZSBvZiB0aGUKCQl2YXJpYWJsZSBpdHNlbGYuICBGb3IgZXhhbXBsZTogPgoJCQlleGlzdHMoYnVmY291bnQpCjwJCVRoaXMgZG9lc24ndCBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIHRoZSAiYnVmY291bnQiIHZhcmlhYmxlLAoJCWJ1dCBnZXRzIHRoZSB2YWx1ZSBvZiAiYnVmY291bnQiLCBhbmQgY2hlY2tzIGlmIHRoYXQgZXhpc3RzLgoKZXhwKHtleHByfSkJCQkJCQkqZXhwKCkqCgkJUmV0dXJuIHRoZSBleHBvbmVudGlhbCBvZiB7ZXhwcn0gYXMgYSB8RmxvYXR8IGluIHRoZSByYW5nZQoJCVswLCBpbmZdLgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIGV4cCgyKQo8CQkJNy4zODkwNTYgPgoJCQk6ZWNobyBleHAoLTEpCjwJCQkwLjM2Nzg3OQoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmxvYXR8IGZlYXR1cmV9CgoKZXhwYW5kKHtleHByfSBbLCB7bm9zdWZ9IFssIHtsaXN0fV1dKQkJCQkqZXhwYW5kKCkqCgkJRXhwYW5kIHdpbGRjYXJkcyBhbmQgdGhlIGZvbGxvd2luZyBzcGVjaWFsIGtleXdvcmRzIGluIHtleHByfS4KCQknd2lsZGlnbm9yZWNhc2UnIGFwcGxpZXMuCgoJCUlmIHtsaXN0fSBpcyBnaXZlbiBhbmQgaXQgaXMgbm9uLXplcm8sIGEgTGlzdCB3aWxsIGJlIHJldHVybmVkLgoJCU90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGEgU3RyaW5nIGFuZCB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsCgkJbWF0Y2hlcywgdGhleSBhcmUgc2VwYXJhdGVkIGJ5IDxOTD4gY2hhcmFjdGVycy4gIFtOb3RlOiBpbgoJCXZlcnNpb24gNS4wIGEgc3BhY2Ugd2FzIHVzZWQsIHdoaWNoIGNhdXNlZCBwcm9ibGVtcyB3aGVuIGEKCQlmaWxlIG5hbWUgY29udGFpbnMgYSBzcGFjZV0KCgkJSWYgdGhlIGV4cGFuc2lvbiBmYWlscywgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBzdHJpbmcuCUEgbmFtZQoJCWZvciBhIG5vbi1leGlzdGluZyBmaWxlIGlzIG5vdCBpbmNsdWRlZCwgdW5sZXNzIHtleHByfSBkb2VzCgkJbm90IHN0YXJ0IHdpdGggJyUnLCAnIycgb3IgJzwnLCBzZWUgYmVsb3cuCgoJCVdoZW4ge2V4cHJ9IHN0YXJ0cyB3aXRoICclJywgJyMnIG9yICc8JywgdGhlIGV4cGFuc2lvbiBpcyBkb25lCgkJbGlrZSBmb3IgdGhlIHxjbWRsaW5lLXNwZWNpYWx8IHZhcmlhYmxlcyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQKCQltb2RpZmllcnMuICBIZXJlIGlzIGEgc2hvcnQgb3ZlcnZpZXc6CgoJCQklCQljdXJyZW50IGZpbGUgbmFtZQoJCQkjCQlhbHRlcm5hdGUgZmlsZSBuYW1lCgkJCSNuCQlhbHRlcm5hdGUgZmlsZSBuYW1lIG4KCQkJPGNmaWxlPgkJZmlsZSBuYW1lIHVuZGVyIHRoZSBjdXJzb3IKCQkJPGFmaWxlPgkJYXV0b2NtZCBmaWxlIG5hbWUKCQkJPGFidWY+CQlhdXRvY21kIGJ1ZmZlciBudW1iZXIgKGFzIGEgU3RyaW5nISkKCQkJPGFtYXRjaD4JYXV0b2NtZCBtYXRjaGVkIG5hbWUKCQkJPHNmaWxlPgkJc291cmNlZCBzY3JpcHQgZmlsZSBvciBmdW5jdGlvbiBuYW1lCgkJCTxzbG51bT4JCXNvdXJjZWQgc2NyaXB0IGZpbGUgbGluZSBudW1iZXIKCQkJPGN3b3JkPgkJd29yZCB1bmRlciB0aGUgY3Vyc29yCgkJCTxjV09SRD4JCVdPUkQgdW5kZXIgdGhlIGN1cnNvcgoJCQk8Y2xpZW50Pgl0aGUge2NsaWVudGlkfSBvZiB0aGUgbGFzdCByZWNlaXZlZAoJCQkJCW1lc3NhZ2UgfHNlcnZlcjJjbGllbnQoKXwKCQlNb2RpZmllcnM6CgkJCTpwCQlleHBhbmQgdG8gZnVsbCBwYXRoCgkJCTpoCQloZWFkIChsYXN0IHBhdGggY29tcG9uZW50IHJlbW92ZWQpCgkJCTp0CQl0YWlsIChsYXN0IHBhdGggY29tcG9uZW50IG9ubHkpCgkJCTpyCQlyb290IChvbmUgZXh0ZW5zaW9uIHJlbW92ZWQpCgkJCTplCQlleHRlbnNpb24gb25seQoKCQlFeGFtcGxlOiA+CgkJCTpsZXQgJnRhZ3MgPSBleHBhbmQoIiU6cDpoIikgLiAiL3RhZ3MiCjwJCU5vdGUgdGhhdCB3aGVuIGV4cGFuZGluZyBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICclJywgJyMnIG9yCgkJJzwnLCBhbnkgZm9sbG93aW5nIHRleHQgaXMgaWdub3JlZC4gIFRoaXMgZG9lcyBOT1Qgd29yazogPgoJCQk6bGV0IGRvZXNudHdvcmsgPSBleHBhbmQoIiU6aC5iYWsiKQo8CQlVc2UgdGhpczogPgoJCQk6bGV0IGRvZXN3b3JrID0gZXhwYW5kKCIlOmgiKSAuICIuYmFrIgo8CQlBbHNvIG5vdGUgdGhhdCBleHBhbmRpbmcgIjxjZmlsZT4iIGFuZCBvdGhlcnMgb25seSByZXR1cm5zIHRoZQoJCXJlZmVyZW5jZWQgZmlsZSBuYW1lIHdpdGhvdXQgZnVydGhlciBleHBhbnNpb24uICBJZiAiPGNmaWxlPiIKCQlpcyAifi8uY3NocmMiLCB5b3UgbmVlZCB0byBkbyBhbm90aGVyIGV4cGFuZCgpIHRvIGhhdmUgdGhlCgkJIn4vIiBleHBhbmRlZCBpbnRvIHRoZSBwYXRoIG9mIHRoZSBob21lIGRpcmVjdG9yeTogPgoJCQk6ZWNobyBleHBhbmQoZXhwYW5kKCI8Y2ZpbGU+IikpCjwKCQlUaGVyZSBjYW5ub3QgYmUgd2hpdGUgc3BhY2UgYmV0d2VlbiB0aGUgdmFyaWFibGVzIGFuZCB0aGUKCQlmb2xsb3dpbmcgbW9kaWZpZXIuICBUaGUgfGZuYW1lbW9kaWZ5KCl8IGZ1bmN0aW9uIGNhbiBiZSB1c2VkCgkJdG8gbW9kaWZ5IG5vcm1hbCBmaWxlIG5hbWVzLgoKCQlXaGVuIHVzaW5nICclJyBvciAnIycsIGFuZCB0aGUgY3VycmVudCBvciBhbHRlcm5hdGUgZmlsZSBuYW1lCgkJaXMgbm90IGRlZmluZWQsIGFuIGVtcHR5IHN0cmluZyBpcyB1c2VkLiAgVXNpbmcgIiU6cCIgaW4gYQoJCWJ1ZmZlciB3aXRoIG5vIG5hbWUsIHJlc3VsdHMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aXRoIGEKCQknLycgYWRkZWQuCgoJCVdoZW4ge2V4cHJ9IGRvZXMgbm90IHN0YXJ0IHdpdGggJyUnLCAnIycgb3IgJzwnLCBpdCBpcwoJCWV4cGFuZGVkIGxpa2UgYSBmaWxlIG5hbWUgaXMgZXhwYW5kZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KCQknc3VmZml4ZXMnIGFuZCAnd2lsZGlnbm9yZScgYXJlIHVzZWQsIHVubGVzcyB0aGUgb3B0aW9uYWwKCQl7bm9zdWZ9IGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBpdCBpcyBub24temVyby4KCQlOYW1lcyBmb3Igbm9uLWV4aXN0aW5nIGZpbGVzIGFyZSBpbmNsdWRlZC4gIFRoZSAiKioiIGl0ZW0gY2FuCgkJYmUgdXNlZCB0byBzZWFyY2ggaW4gYSBkaXJlY3RvcnkgdHJlZS4gIEZvciBleGFtcGxlLCB0byBmaW5kCgkJYWxsICJSRUFETUUiIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYmVsb3c6ID4KCQkJOmVjaG8gZXhwYW5kKCIqKi9SRUFETUUiKQo8CgkJRXhwYW5kKCkgY2FuIGFsc28gYmUgdXNlZCB0byBleHBhbmQgdmFyaWFibGVzIGFuZCBlbnZpcm9ubWVudAoJCXZhcmlhYmxlcyB0aGF0IGFyZSBvbmx5IGtub3duIGluIGEgc2hlbGwuICBCdXQgdGhpcyBjYW4gYmUKCQlzbG93LCBiZWNhdXNlIGEgc2hlbGwgbWF5IGJlIHVzZWQgdG8gZG8gdGhlIGV4cGFuc2lvbi4gIFNlZQoJCXxleHByLWVudi1leHBhbmR8LgoJCVRoZSBleHBhbmRlZCB2YXJpYWJsZSBpcyBzdGlsbCBoYW5kbGVkIGxpa2UgYSBsaXN0IG9mIGZpbGUKCQluYW1lcy4JV2hlbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW5ub3QgYmUgZXhwYW5kZWQsIGl0IGlzCgkJbGVmdCB1bmNoYW5nZWQuICBUaHVzICI6ZWNobyBleHBhbmQoJyRGT09CQVInKSIgcmVzdWx0cyBpbgoJCSIkRk9PQkFSIi4KCgkJU2VlIHxnbG9iKCl8IGZvciBmaW5kaW5nIGV4aXN0aW5nIGZpbGVzLiAgU2VlIHxzeXN0ZW0oKXwgZm9yCgkJZ2V0dGluZyB0aGUgcmF3IG91dHB1dCBvZiBhbiBleHRlcm5hbCBjb21tYW5kLgoKZXh0ZW5kKHtleHByMX0sIHtleHByMn0gWywge2V4cHIzfV0pCQkJKmV4dGVuZCgpKgoJCXtleHByMX0gYW5kIHtleHByMn0gbXVzdCBiZSBib3RoIHxMaXN0c3wgb3IgYm90aAoJCXxEaWN0aW9uYXJpZXN8LgoKCQlJZiB0aGV5IGFyZSB8TGlzdHN8OiBBcHBlbmQge2V4cHIyfSB0byB7ZXhwcjF9LgoJCUlmIHtleHByM30gaXMgZ2l2ZW4gaW5zZXJ0IHRoZSBpdGVtcyBvZiB7ZXhwcjJ9IGJlZm9yZSBpdGVtCgkJe2V4cHIzfSBpbiB7ZXhwcjF9LiAgV2hlbiB7ZXhwcjN9IGlzIHplcm8gaW5zZXJ0IGJlZm9yZSB0aGUKCQlmaXJzdCBpdGVtLiAgV2hlbiB7ZXhwcjN9IGlzIGVxdWFsIHRvIGxlbih7ZXhwcjF9KSB0aGVuCgkJe2V4cHIyfSBpcyBhcHBlbmRlZC4KCQlFeGFtcGxlczogPgoJCQk6ZWNobyBzb3J0KGV4dGVuZChteWxpc3QsIFs3LCA1XSkpCgkJCTpjYWxsIGV4dGVuZChteWxpc3QsIFsyLCAzXSwgMSkKPAkJV2hlbiB7ZXhwcjF9IGlzIHRoZSBzYW1lIExpc3QgYXMge2V4cHIyfSB0aGVuIHRoZSBudW1iZXIgb2YKCQlpdGVtcyBjb3BpZWQgaXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIGxlbmd0aCBvZiB0aGUgTGlzdC4KCQlFLmcuLCB3aGVuIHtleHByM30gaXMgMSB5b3UgZ2V0IE4gbmV3IGNvcGllcyBvZiB0aGUgZmlyc3QgaXRlbQoJCSh3aGVyZSBOIGlzIHRoZSBvcmlnaW5hbCBsZW5ndGggb2YgdGhlIExpc3QpLgoJCVVzZSB8YWRkKCl8IHRvIGNvbmNhdGVuYXRlIG9uZSBpdGVtIHRvIGEgbGlzdC4JVG8gY29uY2F0ZW5hdGUKCQl0d28gbGlzdHMgaW50byBhIG5ldyBsaXN0IHVzZSB0aGUgKyBvcGVyYXRvcjogPgoJCQk6bGV0IG5ld2xpc3QgPSBbMSwgMiwgM10gKyBbNCwgNV0KPAoJCUlmIHRoZXkgYXJlIHxEaWN0aW9uYXJpZXN8OgoJCUFkZCBhbGwgZW50cmllcyBmcm9tIHtleHByMn0gdG8ge2V4cHIxfS4KCQlJZiBhIGtleSBleGlzdHMgaW4gYm90aCB7ZXhwcjF9IGFuZCB7ZXhwcjJ9IHRoZW4ge2V4cHIzfSBpcwoJCXVzZWQgdG8gZGVjaWRlIHdoYXQgdG8gZG86CgkJe2V4cHIzfSA9ICJrZWVwIjoga2VlcCB0aGUgdmFsdWUgb2Yge2V4cHIxfQoJCXtleHByM30gPSAiZm9yY2UiOiB1c2UgdGhlIHZhbHVlIG9mIHtleHByMn0KCQl7ZXhwcjN9ID0gImVycm9yIjogZ2l2ZSBhbiBlcnJvciBtZXNzYWdlCQkqRTczNyoKCQlXaGVuIHtleHByM30gaXMgb21pdHRlZCB0aGVuICJmb3JjZSIgaXMgYXNzdW1lZC4KCgkJe2V4cHIxfSBpcyBjaGFuZ2VkIHdoZW4ge2V4cHIyfSBpcyBub3QgZW1wdHkuICBJZiBuZWNlc3NhcnkKCQltYWtlIGEgY29weSBvZiB7ZXhwcjF9IGZpcnN0LgoJCXtleHByMn0gcmVtYWlucyB1bmNoYW5nZWQuCgkJV2hlbiB7ZXhwcjF9IGlzIGxvY2tlZCBhbmQge2V4cHIyfSBpcyBub3QgZW1wdHkgdGhlIG9wZXJhdGlvbgoJCWZhaWxzLgoJCVJldHVybnMge2V4cHIxfS4KCgpmZWVka2V5cyh7c3RyaW5nfSBbLCB7bW9kZX1dKQkJCQkqZmVlZGtleXMoKSoKCQlDaGFyYWN0ZXJzIGluIHtzdHJpbmd9IGFyZSBxdWV1ZWQgZm9yIHByb2Nlc3NpbmcgYXMgaWYgdGhleQoJCWNvbWUgZnJvbSBhIG1hcHBpbmcgb3Igd2VyZSB0eXBlZCBieSB0aGUgdXNlci4KCQlCeSBkZWZhdWx0IHRoZSBzdHJpbmcgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgdHlwZWFoZWFkCgkJYnVmZmVyLCB0aHVzIGlmIGEgbWFwcGluZyBpcyBzdGlsbCBiZWluZyBleGVjdXRlZCB0aGUKCQljaGFyYWN0ZXJzIGNvbWUgYWZ0ZXIgdGhlbS4gIFVzZSB0aGUgJ2knIGZsYWcgdG8gaW5zZXJ0IGJlZm9yZQoJCW90aGVyIGNoYXJhY3RlcnMsIHRoZXkgd2lsbCBiZSBleGVjdXRlZCBuZXh0LCBiZWZvcmUgYW55CgkJY2hhcmFjdGVycyBmcm9tIGEgbWFwcGluZy4KCQlUaGUgZnVuY3Rpb24gZG9lcyBub3Qgd2FpdCBmb3IgcHJvY2Vzc2luZyBvZiBrZXlzIGNvbnRhaW5lZCBpbgoJCXtzdHJpbmd9LgoJCVRvIGluY2x1ZGUgc3BlY2lhbCBrZXlzIGludG8ge3N0cmluZ30sIHVzZSBkb3VibGUtcXVvdGVzCgkJYW5kICJcLi4uIiBub3RhdGlvbiB8ZXhwci1xdW90ZXwuIEZvciBleGFtcGxlLAoJCWZlZWRrZXlzKCJcPENSPiIpIHNpbXVsYXRlcyBwcmVzc2luZyBvZiB0aGUgPEVudGVyPiBrZXkuIEJ1dAoJCWZlZWRrZXlzKCdcPENSPicpIHB1c2hlcyA1IGNoYXJhY3RlcnMuCgkJSWYge21vZGV9IGlzIGFic2VudCwga2V5cyBhcmUgcmVtYXBwZWQuCgkJe21vZGV9IGlzIGEgU3RyaW5nLCB3aGljaCBjYW4gY29udGFpbiB0aGVzZSBjaGFyYWN0ZXIgZmxhZ3M6CgkJJ20nCVJlbWFwIGtleXMuIFRoaXMgaXMgZGVmYXVsdC4KCQknbicJRG8gbm90IHJlbWFwIGtleXMuCgkJJ3QnCUhhbmRsZSBrZXlzIGFzIGlmIHR5cGVkOyBvdGhlcndpc2UgdGhleSBhcmUgaGFuZGxlZCBhcwoJCQlpZiBjb21pbmcgZnJvbSBhIG1hcHBpbmcuICBUaGlzIG1hdHRlcnMgZm9yIHVuZG8sCgkJCW9wZW5pbmcgZm9sZHMsIGV0Yy4KCQknaScJSW5zZXJ0IHRoZSBzdHJpbmcgaW5zdGVhZCBvZiBhcHBlbmRpbmcgKHNlZSBhYm92ZSkuCgkJJ3gnCUV4ZWN1dGUgY29tbWFuZHMgdW50aWwgdHlwZWFoZWFkIGlzIGVtcHR5LiAgVGhpcyBpcwoJCQlzaW1pbGFyIHRvIHVzaW5nICI6bm9ybWFsISIuICBZb3UgY2FuIGNhbGwgZmVlZGtleXMoKQoJCQlzZXZlcmFsIHRpbWVzIHdpdGhvdXQgJ3gnIGFuZCB0aGVuIG9uZSB0aW1lIHdpdGggJ3gnCgkJCShwb3NzaWJseSB3aXRoIGFuIGVtcHR5IHtzdHJpbmd9KSB0byBleGVjdXRlIGFsbCB0aGUKCQkJdHlwZWFoZWFkLgoJCVJldHVybiB2YWx1ZSBpcyBhbHdheXMgMC4KCmZpbGVyZWFkYWJsZSh7ZmlsZX0pCQkJCQkqZmlsZXJlYWRhYmxlKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgVFJVRSB3aGVuIGEgZmlsZSB3aXRoIHRoZQoJCW5hbWUge2ZpbGV9IGV4aXN0cywgYW5kIGNhbiBiZSByZWFkLiAgSWYge2ZpbGV9IGRvZXNuJ3QgZXhpc3QsCgkJb3IgaXMgYSBkaXJlY3RvcnksIHRoZSByZXN1bHQgaXMgRkFMU0UuICB7ZmlsZX0gaXMgYW55CgkJZXhwcmVzc2lvbiwgd2hpY2ggaXMgdXNlZCBhcyBhIFN0cmluZy4KCQlJZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZmlsZSBiZWluZyByZWFkYWJsZSB5b3UgY2FuIHVzZQoJCXxnbG9iKCl8LgoJCQkJCQkJKmZpbGVfcmVhZGFibGUoKSoKCQlPYnNvbGV0ZSBuYW1lOiBmaWxlX3JlYWRhYmxlKCkuCgoKZmlsZXdyaXRhYmxlKHtmaWxlfSkJCQkJCSpmaWxld3JpdGFibGUoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyAxIHdoZW4gYSBmaWxlIHdpdGggdGhlCgkJbmFtZSB7ZmlsZX0gZXhpc3RzLCBhbmQgY2FuIGJlIHdyaXR0ZW4uICBJZiB7ZmlsZX0gZG9lc24ndAoJCWV4aXN0LCBvciBpcyBub3Qgd3JpdGFibGUsIHRoZSByZXN1bHQgaXMgMC4gIElmIHtmaWxlfSBpcyBhCgkJZGlyZWN0b3J5LCBhbmQgd2UgY2FuIHdyaXRlIHRvIGl0LCB0aGUgcmVzdWx0IGlzIDIuCgoKZmlsdGVyKHtleHByfSwge3N0cmluZ30pCQkJCQkqZmlsdGVyKCkqCgkJe2V4cHJ9IG11c3QgYmUgYSB8TGlzdHwgb3IgYSB8RGljdGlvbmFyeXwuCgkJRm9yIGVhY2ggaXRlbSBpbiB7ZXhwcn0gZXZhbHVhdGUge3N0cmluZ30gYW5kIHdoZW4gdGhlIHJlc3VsdAoJCWlzIHplcm8gcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHxMaXN0fCBvciB8RGljdGlvbmFyeXwuCgkJSW5zaWRlIHtzdHJpbmd9IHx2OnZhbHwgaGFzIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBpdGVtLgoJCUZvciBhIHxEaWN0aW9uYXJ5fCB8djprZXl8IGhhcyB0aGUga2V5IG9mIHRoZSBjdXJyZW50IGl0ZW0uCgkJRXhhbXBsZXM6ID4KCQkJOmNhbGwgZmlsdGVyKG15bGlzdCwgJ3Y6dmFsICF+ICJPTEQiJykKPAkJUmVtb3ZlcyB0aGUgaXRlbXMgd2hlcmUgIk9MRCIgYXBwZWFycy4gPgoJCQk6Y2FsbCBmaWx0ZXIobXlkaWN0LCAndjprZXkgPj0gOCcpCjwJCVJlbW92ZXMgdGhlIGl0ZW1zIHdpdGggYSBrZXkgYmVsb3cgOC4gPgoJCQk6Y2FsbCBmaWx0ZXIodmFyLCAwKQo8CQlSZW1vdmVzIGFsbCB0aGUgaXRlbXMsIHRodXMgY2xlYXJzIHRoZSB8TGlzdHwgb3IgfERpY3Rpb25hcnl8LgoKCQlOb3RlIHRoYXQge3N0cmluZ30gaXMgdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uIGFuZCBpcyB0aGVuCgkJdXNlZCBhcyBhbiBleHByZXNzaW9uIGFnYWluLiAgT2Z0ZW4gaXQgaXMgZ29vZCB0byB1c2UgYQoJCXxsaXRlcmFsLXN0cmluZ3wgdG8gYXZvaWQgaGF2aW5nIHRvIGRvdWJsZSBiYWNrc2xhc2hlcy4KCgkJVGhlIG9wZXJhdGlvbiBpcyBkb25lIGluLXBsYWNlLiAgSWYgeW91IHdhbnQgYSB8TGlzdHwgb3IKCQl8RGljdGlvbmFyeXwgdG8gcmVtYWluIHVubW9kaWZpZWQgbWFrZSBhIGNvcHkgZmlyc3Q6ID4KCQkJOmxldCBsID0gZmlsdGVyKGNvcHkobXlsaXN0KSwgJ3Y6dmFsID1+ICJLRUVQIicpCgo8CQlSZXR1cm5zIHtleHByfSwgdGhlIHxMaXN0fCBvciB8RGljdGlvbmFyeXwgdGhhdCB3YXMgZmlsdGVyZWQuCgkJV2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCB3aGlsZSBldmFsdWF0aW5nIHtzdHJpbmd9IG5vCgkJZnVydGhlciBpdGVtcyBpbiB7ZXhwcn0gYXJlIHByb2Nlc3NlZC4KCgpmaW5kZGlyKHtuYW1lfVssIHtwYXRofVssIHtjb3VudH1dXSkJCQkJKmZpbmRkaXIoKSoKCQlGaW5kIGRpcmVjdG9yeSB7bmFtZX0gaW4ge3BhdGh9LiAgU3VwcG9ydHMgYm90aCBkb3dud2FyZHMgYW5kCgkJdXB3YXJkcyByZWN1cnNpdmUgZGlyZWN0b3J5IHNlYXJjaGVzLiAgU2VlIHxmaWxlLXNlYXJjaGluZ3wKCQlmb3IgdGhlIHN5bnRheCBvZiB7cGF0aH0uCgkJUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZmlyc3QgZm91bmQgbWF0Y2guICBXaGVuIHRoZSBmb3VuZAoJCWRpcmVjdG9yeSBpcyBiZWxvdyB0aGUgY3VycmVudCBkaXJlY3RvcnkgYSByZWxhdGl2ZSBwYXRoIGlzCgkJcmV0dXJuZWQuICBPdGhlcndpc2UgYSBmdWxsIHBhdGggaXMgcmV0dXJuZWQuCgkJSWYge3BhdGh9IGlzIG9taXR0ZWQgb3IgZW1wdHkgdGhlbiAncGF0aCcgaXMgdXNlZC4KCQlJZiB0aGUgb3B0aW9uYWwge2NvdW50fSBpcyBnaXZlbiwgZmluZCB7Y291bnR9J3Mgb2NjdXJyZW5jZSBvZgoJCXtuYW1lfSBpbiB7cGF0aH0gaW5zdGVhZCBvZiB0aGUgZmlyc3Qgb25lLgoJCVdoZW4ge2NvdW50fSBpcyBuZWdhdGl2ZSByZXR1cm4gYWxsIHRoZSBtYXRjaGVzIGluIGEgfExpc3R8LgoJCVRoaXMgaXMgcXVpdGUgc2ltaWxhciB0byB0aGUgZXgtY29tbWFuZCB8OmZpbmR8LgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmlsZV9pbl9wYXRofAoJCWZlYXR1cmV9CgpmaW5kZmlsZSh7bmFtZX1bLCB7cGF0aH1bLCB7Y291bnR9XV0pCQkJCSpmaW5kZmlsZSgpKgoJCUp1c3QgbGlrZSB8ZmluZGRpcigpfCwgYnV0IGZpbmQgYSBmaWxlIGluc3RlYWQgb2YgYSBkaXJlY3RvcnkuCgkJVXNlcyAnc3VmZml4ZXNhZGQnLgoJCUV4YW1wbGU6ID4KCQkJOmVjaG8gZmluZGZpbGUoInRhZ3MudmltIiwgIi47IikKPAkJU2VhcmNoZXMgZnJvbSB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGZpbGUgdXB3YXJkcyB1bnRpbAoJCWl0IGZpbmRzIHRoZSBmaWxlICJ0YWdzLnZpbSIuCgpmbG9hdDJucih7ZXhwcn0pCQkJCQkqZmxvYXQybnIoKSoKCQlDb252ZXJ0IHtleHByfSB0byBhIE51bWJlciBieSBvbWl0dGluZyB0aGUgcGFydCBhZnRlciB0aGUKCQlkZWNpbWFsIHBvaW50LgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIE51bWJlci4KCQlXaGVuIHRoZSB2YWx1ZSBvZiB7ZXhwcn0gaXMgb3V0IG9mIHJhbmdlIGZvciBhIHxOdW1iZXJ8IHRoZQoJCXJlc3VsdCBpcyB0cnVuY2F0ZWQgdG8gMHg3ZmZmZmZmZiBvciAtMHg3ZmZmZmZmZi4gIE5hTiByZXN1bHRzCgkJaW4gLTB4ODAwMDAwMDAuCgkJRXhhbXBsZXM6ID4KCQkJZWNobyBmbG9hdDJucigzLjk1KQo8CQkJMyAgPgoJCQllY2hvIGZsb2F0Mm5yKC0yMy40NSkKPAkJCS0yMyAgPgoJCQllY2hvIGZsb2F0Mm5yKDEuMGUxMDApCjwJCQkyMTQ3NDgzNjQ3ICA+CgkJCWVjaG8gZmxvYXQybnIoLTEuMGUxNTApCjwJCQktMjE0NzQ4MzY0NyAgPgoJCQllY2hvIGZsb2F0Mm5yKDEuMGUtMTAwKQo8CQkJMAoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmxvYXR8IGZlYXR1cmV9CgoKZmxvb3Ioe2V4cHJ9KQkJCQkJCQkqZmxvb3IoKSoKCQlSZXR1cm4gdGhlIGxhcmdlc3QgaW50ZWdyYWwgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCgkJe2V4cHJ9IGFzIGEgfEZsb2F0fCAocm91bmQgZG93bikuCgkJe2V4cHJ9IG11c3QgZXZhbHVhdGUgdG8gYSB8RmxvYXR8IG9yIGEgfE51bWJlcnwuCgkJRXhhbXBsZXM6ID4KCQkJZWNobyBmbG9vcigxLjg1NikKPAkJCTEuMCAgPgoJCQllY2hvIGZsb29yKC01LjQ1NikKPAkJCS02LjAgID4KCQkJZWNobyBmbG9vcig0LjApCjwJCQk0LjAKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoJCQoKZm1vZCh7ZXhwcjF9LCB7ZXhwcjJ9KQkJCQkJKmZtb2QoKSoKCQlSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiB7ZXhwcjF9IC8ge2V4cHIyfSwgZXZlbiBpZiB0aGUKCQlkaXZpc2lvbiBpcyBub3QgcmVwcmVzZW50YWJsZS4gIFJldHVybnMge2V4cHIxfSAtIGkgKiB7ZXhwcjJ9CgkJZm9yIHNvbWUgaW50ZWdlciBpIHN1Y2ggdGhhdCBpZiB7ZXhwcjJ9IGlzIG5vbi16ZXJvLCB0aGUKCQlyZXN1bHQgaGFzIHRoZSBzYW1lIHNpZ24gYXMge2V4cHIxfSBhbmQgbWFnbml0dWRlIGxlc3MgdGhhbgoJCXRoZSBtYWduaXR1ZGUgb2Yge2V4cHIyfS4gIElmIHtleHByMn0gaXMgemVybywgdGhlIHZhbHVlCgkJcmV0dXJuZWQgaXMgemVyby4gIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBhIHxGbG9hdHwuCgkJe2V4cHIxfSBhbmQge2V4cHIyfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIGZtb2QoMTIuMzMsIDEuMjIpCjwJCQkwLjEzID4KCQkJOmVjaG8gZm1vZCgtMTIuMzMsIDEuMjIpCjwJCQktMC4xMwoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggfCtmbG9hdHwgZmVhdHVyZX0KCgpmbmFtZWVzY2FwZSh7c3RyaW5nfSkJCQkJCSpmbmFtZWVzY2FwZSgpKgoJCUVzY2FwZSB7c3RyaW5nfSBmb3IgdXNlIGFzIGZpbGUgbmFtZSBjb21tYW5kIGFyZ3VtZW50LglBbGwKCQljaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZywgc3VjaCBhcyAnJScgYW5kICd8JwoJCWFyZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2guCgkJRm9yIG1vc3Qgc3lzdGVtcyB0aGUgY2hhcmFjdGVycyBlc2NhcGVkIGFyZQoJCSIgXHRcbio/W3tgJFxcJSMnXCJ8ITwiLiAgRm9yIHN5c3RlbXMgd2hlcmUgYSBiYWNrc2xhc2gKCQlhcHBlYXJzIGluIGEgZmlsZW5hbWUsIGl0IGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mICdpc2ZuYW1lJy4KCQlBIGxlYWRpbmcgJysnIGFuZCAnPicgaXMgYWxzbyBlc2NhcGVkIChzcGVjaWFsIGFmdGVyIHw6ZWRpdHwKCQlhbmQgfDp3cml0ZXwpLiAgQW5kIGEgIi0iIGJ5IGl0c2VsZiAoc3BlY2lhbCBhZnRlciB8OmNkfCkuCgkJRXhhbXBsZTogPgoJCQk6bGV0IGZuYW1lID0gJytzb21lIHN0ciVuZ2V8bmFtZScKCQkJOmV4ZSAiZWRpdCAiIC4gZm5hbWVlc2NhcGUoZm5hbWUpCjwJCXJlc3VsdHMgaW4gZXhlY3V0aW5nOiA+CgkJCWVkaXQgXCtzb21lXCBzdHJcJW5nZVx8bmFtZQoKZm5hbWVtb2RpZnkoe2ZuYW1lfSwge21vZHN9KQkJCQkqZm5hbWVtb2RpZnkoKSoKCQlNb2RpZnkgZmlsZSBuYW1lIHtmbmFtZX0gYWNjb3JkaW5nIHRvIHttb2RzfS4gIHttb2RzfSBpcyBhCgkJc3RyaW5nIG9mIGNoYXJhY3RlcnMgbGlrZSBpdCBpcyB1c2VkIGZvciBmaWxlIG5hbWVzIG9uIHRoZQoJCWNvbW1hbmQgbGluZS4gIFNlZSB8ZmlsZW5hbWUtbW9kaWZpZXJzfC4KCQlFeGFtcGxlOiA+CgkJCTplY2hvIGZuYW1lbW9kaWZ5KCJtYWluLmMiLCAiOnA6aCIpCjwJCXJlc3VsdHMgaW46ID4KCQkJL2hvbWUvbW9vbC92aW0vdmltL3NyYwo8CQlOb3RlOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZG9uJ3Qgd29yayBpbiB7Zm5hbWV9LCB1c2UKCQl8ZXhwYW5kKCl8IGZpcnN0IHRoZW4uCgpmb2xkY2xvc2VkKHtsbnVtfSkJCQkJCSpmb2xkY2xvc2VkKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlci4gIElmIHRoZSBsaW5lIHtsbnVtfSBpcyBpbiBhIGNsb3NlZAoJCWZvbGQsIHRoZSByZXN1bHQgaXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBpbiB0aGF0IGZvbGQuCgkJSWYgdGhlIGxpbmUge2xudW19IGlzIG5vdCBpbiBhIGNsb3NlZCBmb2xkLCAtMSBpcyByZXR1cm5lZC4KCmZvbGRjbG9zZWRlbmQoe2xudW19KQkJCQkJKmZvbGRjbG9zZWRlbmQoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLiAgSWYgdGhlIGxpbmUge2xudW19IGlzIGluIGEgY2xvc2VkCgkJZm9sZCwgdGhlIHJlc3VsdCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IGxpbmUgaW4gdGhhdCBmb2xkLgoJCUlmIHRoZSBsaW5lIHtsbnVtfSBpcyBub3QgaW4gYSBjbG9zZWQgZm9sZCwgLTEgaXMgcmV0dXJuZWQuCgpmb2xkbGV2ZWwoe2xudW19KQkJCQkJKmZvbGRsZXZlbCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBmb2xkbGV2ZWwgb2YgbGluZSB7bG51bX0KCQlpbiB0aGUgY3VycmVudCBidWZmZXIuCUZvciBuZXN0ZWQgZm9sZHMgdGhlIGRlZXBlc3QgbGV2ZWwgaXMKCQlyZXR1cm5lZC4gIElmIHRoZXJlIGlzIG5vIGZvbGQgYXQgbGluZSB7bG51bX0sIHplcm8gaXMKCQlyZXR1cm5lZC4gIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBmb2xkcyBhcmUgb3BlbiBvciBjbG9zZWQuCgkJV2hlbiB1c2VkIHdoaWxlIHVwZGF0aW5nIGZvbGRzIChmcm9tICdmb2xkZXhwcicpIC0xIGlzCgkJcmV0dXJuZWQgZm9yIGxpbmVzIHdoZXJlIGZvbGRzIGFyZSBzdGlsbCB0byBiZSB1cGRhdGVkIGFuZCB0aGUKCQlmb2xkbGV2ZWwgaXMgdW5rbm93bi4gIEFzIGEgc3BlY2lhbCBjYXNlIHRoZSBsZXZlbCBvZiB0aGUKCQlwcmV2aW91cyBsaW5lIGlzIHVzdWFsbHkgYXZhaWxhYmxlLgoKCQkJCQkJCSpmb2xkdGV4dCgpKgpmb2xkdGV4dCgpCVJldHVybnMgYSBTdHJpbmcsIHRvIGJlIGRpc3BsYXllZCBmb3IgYSBjbG9zZWQgZm9sZC4gIFRoaXMgaXMKCQl0aGUgZGVmYXVsdCBmdW5jdGlvbiB1c2VkIGZvciB0aGUgJ2ZvbGR0ZXh0JyBvcHRpb24gYW5kIHNob3VsZAoJCW9ubHkgYmUgY2FsbGVkIGZyb20gZXZhbHVhdGluZyAnZm9sZHRleHQnLiAgSXQgdXNlcyB0aGUKCQl8djpmb2xkc3RhcnR8LCB8djpmb2xkZW5kfCBhbmQgfHY6Zm9sZGRhc2hlc3wgdmFyaWFibGVzLgoJCVRoZSByZXR1cm5lZCBzdHJpbmcgbG9va3MgbGlrZSB0aGlzOiA+CgkJCSstLSA0NSBsaW5lczogYWJjZGVmCjwJCVRoZSBudW1iZXIgb2YgZGFzaGVzIGRlcGVuZHMgb24gdGhlIGZvbGRsZXZlbC4JVGhlICI0NSIgaXMKCQl0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmb2xkLiAgImFiY2RlZiIgaXMgdGhlIHRleHQgaW4gdGhlCgkJZmlyc3Qgbm9uLWJsYW5rIGxpbmUgb2YgdGhlIGZvbGQuICBMZWFkaW5nIHdoaXRlIHNwYWNlLCAiLy8iCgkJb3IgIi8qIiBhbmQgdGhlIHRleHQgZnJvbSB0aGUgJ2ZvbGRtYXJrZXInIGFuZCAnY29tbWVudHN0cmluZycKCQlvcHRpb25zIGlzIHJlbW92ZWQuCgkJe25vdCBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRob3V0IHRoZSB8K2ZvbGRpbmd8IGZlYXR1cmV9Cgpmb2xkdGV4dHJlc3VsdCh7bG51bX0pCQkJCQkqZm9sZHRleHRyZXN1bHQoKSoKCQlSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGZvciB0aGUgY2xvc2VkIGZvbGQgYXQgbGluZQoJCXtsbnVtfS4gIEV2YWx1YXRlcyAnZm9sZHRleHQnIGluIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0LgoJCVdoZW4gdGhlcmUgaXMgbm8gY2xvc2VkIGZvbGQgYXQge2xudW19IGFuIGVtcHR5IHN0cmluZyBpcwoJCXJldHVybmVkLgoJCXtsbnVtfSBpcyB1c2VkIGxpa2Ugd2l0aCB8Z2V0bGluZSgpfC4gIFRodXMgIi4iIGlzIHRoZSBjdXJyZW50CgkJbGluZSwgIidtIiBtYXJrIG0sIGV0Yy4KCQlVc2VmdWwgd2hlbiBleHBvcnRpbmcgZm9sZGVkIHRleHQsIGUuZy4sIHRvIEhUTUwuCgkJe25vdCBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRob3V0IHRoZSB8K2ZvbGRpbmd8IGZlYXR1cmV9CgoJCQkJCQkJKmZvcmVncm91bmQoKSoKZm9yZWdyb3VuZCgpCU1vdmUgdGhlIFZpbSB3aW5kb3cgdG8gdGhlIGZvcmVncm91bmQuCVVzZWZ1bCB3aGVuIHNlbnQgZnJvbQoJCWEgY2xpZW50IHRvIGEgVmltIHNlcnZlci4gfHJlbW90ZV9zZW5kKCl8CgkJT24gV2luMzIgc3lzdGVtcyB0aGlzIG1pZ2h0IG5vdCB3b3JrLCB0aGUgT1MgZG9lcyBub3QgYWx3YXlzCgkJYWxsb3cgYSB3aW5kb3cgdG8gYnJpbmcgaXRzZWxmIHRvIHRoZSBmb3JlZ3JvdW5kLiAgVXNlCgkJfHJlbW90ZV9mb3JlZ3JvdW5kKCl8IGluc3RlYWQuCgkJe29ubHkgaW4gdGhlIFdpbjMyLCBBdGhlbmEsIE1vdGlmIGFuZCBHVEsgR1VJIHZlcnNpb25zIGFuZCB0aGUKCQlXaW4zMiBjb25zb2xlIHZlcnNpb259CgoKZnVuY3Rpb24oe25hbWV9KQkJCQkJKmZ1bmN0aW9uKCkqICpFNzAwKgoJCVJldHVybiBhIHxGdW5jcmVmfCB2YXJpYWJsZSB0aGF0IHJlZmVycyB0byBmdW5jdGlvbiB7bmFtZX0uCgkJe25hbWV9IGNhbiBiZSBhIHVzZXIgZGVmaW5lZCBmdW5jdGlvbiBvciBhbiBpbnRlcm5hbCBmdW5jdGlvbi4KCgpnYXJiYWdlY29sbGVjdChbe2F0ZXhpdH1dKQkJCQkqZ2FyYmFnZWNvbGxlY3QoKSoKCQlDbGVhbnVwIHVudXNlZCB8TGlzdHN8IGFuZCB8RGljdGlvbmFyaWVzfCB0aGF0IGhhdmUgY2lyY3VsYXIKCQlyZWZlcmVuY2VzLiAgVGhlcmUgaXMgaGFyZGx5IGV2ZXIgYSBuZWVkIHRvIGludm9rZSB0aGlzCgkJZnVuY3Rpb24sIGFzIGl0IGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aGVuIFZpbSBydW5zIG91dCBvZgoJCW1lbW9yeSBvciBpcyB3YWl0aW5nIGZvciB0aGUgdXNlciB0byBwcmVzcyBhIGtleSBhZnRlcgoJCSd1cGRhdGV0aW1lJy4gIEl0ZW1zIHdpdGhvdXQgY2lyY3VsYXIgcmVmZXJlbmNlcyBhcmUgYWx3YXlzCgkJZnJlZWQgd2hlbiB0aGV5IGJlY29tZSB1bnVzZWQuCgkJVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgZGVsZXRlZCBhIHZlcnkgYmlnIHxMaXN0fCBhbmQvb3IKCQl8RGljdGlvbmFyeXwgd2l0aCBjaXJjdWxhciByZWZlcmVuY2VzIGluIGEgc2NyaXB0IHRoYXQgcnVucwoJCWZvciBhIGxvbmcgdGltZS4KCQlXaGVuIHRoZSBvcHRpb25hbCB7YXRleGl0fSBhcmd1bWVudCBpcyBvbmUsIGdhcmJhZ2UKCQljb2xsZWN0aW9uIHdpbGwgYWxzbyBiZSBkb25lIHdoZW4gZXhpdGluZyBWaW0sIGlmIGl0IHdhc24ndAoJCWRvbmUgYmVmb3JlLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGVja2luZyBmb3IgbWVtb3J5IGxlYWtzLgoKZ2V0KHtsaXN0fSwge2lkeH0gWywge2RlZmF1bHR9XSkJCQkqZ2V0KCkqCgkJR2V0IGl0ZW0ge2lkeH0gZnJvbSB8TGlzdHwge2xpc3R9LiAgV2hlbiB0aGlzIGl0ZW0gaXMgbm90CgkJYXZhaWxhYmxlIHJldHVybiB7ZGVmYXVsdH0uICBSZXR1cm4gemVybyB3aGVuIHtkZWZhdWx0fSBpcwoJCW9taXR0ZWQuCmdldCh7ZGljdH0sIHtrZXl9IFssIHtkZWZhdWx0fV0pCgkJR2V0IGl0ZW0gd2l0aCBrZXkge2tleX0gZnJvbSB8RGljdGlvbmFyeXwge2RpY3R9LiAgV2hlbiB0aGlzCgkJaXRlbSBpcyBub3QgYXZhaWxhYmxlIHJldHVybiB7ZGVmYXVsdH0uICBSZXR1cm4gemVybyB3aGVuCgkJe2RlZmF1bHR9IGlzIG9taXR0ZWQuCgoJCQkJCQkJKmdldGJ1ZmxpbmUoKSoKZ2V0YnVmbGluZSh7ZXhwcn0sIHtsbnVtfSBbLCB7ZW5kfV0pCgkJUmV0dXJuIGEgfExpc3R8IHdpdGggdGhlIGxpbmVzIHN0YXJ0aW5nIGZyb20ge2xudW19IHRvIHtlbmR9CgkJKGluY2x1c2l2ZSkgaW4gdGhlIGJ1ZmZlciB7ZXhwcn0uICBJZiB7ZW5kfSBpcyBvbWl0dGVkLCBhCgkJfExpc3R8IHdpdGggb25seSB0aGUgbGluZSB7bG51bX0gaXMgcmV0dXJuZWQuCgoJCUZvciB0aGUgdXNlIG9mIHtleHByfSwgc2VlIHxidWZuYW1lKCl8IGFib3ZlLgoKCQlGb3Ige2xudW19IGFuZCB7ZW5kfSAiJCIgY2FuIGJlIHVzZWQgZm9yIHRoZSBsYXN0IGxpbmUgb2YgdGhlCgkJYnVmZmVyLiAgT3RoZXJ3aXNlIGEgbnVtYmVyIG11c3QgYmUgdXNlZC4KCgkJV2hlbiB7bG51bX0gaXMgc21hbGxlciB0aGFuIDEgb3IgYmlnZ2VyIHRoYW4gdGhlIG51bWJlciBvZgoJCWxpbmVzIGluIHRoZSBidWZmZXIsIGFuIGVtcHR5IHxMaXN0fCBpcyByZXR1cm5lZC4KCgkJV2hlbiB7ZW5kfSBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgYnVmZmVyLAoJCWl0IGlzIHRyZWF0ZWQgYXMge2VuZH0gaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlCgkJYnVmZmVyLiAgV2hlbiB7ZW5kfSBpcyBiZWZvcmUge2xudW19IGFuIGVtcHR5IHxMaXN0fCBpcwoJCXJldHVybmVkLgoKCQlUaGlzIGZ1bmN0aW9uIHdvcmtzIG9ubHkgZm9yIGxvYWRlZCBidWZmZXJzLiAgRm9yIHVubG9hZGVkIGFuZAoJCW5vbi1leGlzdGluZyBidWZmZXJzLCBhbiBlbXB0eSB8TGlzdHwgaXMgcmV0dXJuZWQuCgoJCUV4YW1wbGU6ID4KCQkJOmxldCBsaW5lcyA9IGdldGJ1ZmxpbmUoYnVmbnIoIm15ZmlsZSIpLCAxLCAiJCIpCgpnZXRidWZ2YXIoe2V4cHJ9LCB7dmFybmFtZX0gWywge2RlZn1dKQkJCQkqZ2V0YnVmdmFyKCkqCgkJVGhlIHJlc3VsdCBpcyB0aGUgdmFsdWUgb2Ygb3B0aW9uIG9yIGxvY2FsIGJ1ZmZlciB2YXJpYWJsZQoJCXt2YXJuYW1lfSBpbiBidWZmZXIge2V4cHJ9LiAgTm90ZSB0aGF0IHRoZSBuYW1lIHdpdGhvdXQgImI6IgoJCW11c3QgYmUgdXNlZC4KCQlXaGVuIHt2YXJuYW1lfSBpcyBlbXB0eSByZXR1cm5zIGEgZGljdGlvbmFyeSB3aXRoIGFsbCB0aGUKCQlidWZmZXItbG9jYWwgdmFyaWFibGVzLgoJCVRoaXMgYWxzbyB3b3JrcyBmb3IgYSBnbG9iYWwgb3IgYnVmZmVyLWxvY2FsIG9wdGlvbiwgYnV0IGl0CgkJZG9lc24ndCB3b3JrIGZvciBhIGdsb2JhbCB2YXJpYWJsZSwgd2luZG93LWxvY2FsIHZhcmlhYmxlIG9yCgkJd2luZG93LWxvY2FsIG9wdGlvbi4KCQlGb3IgdGhlIHVzZSBvZiB7ZXhwcn0sIHNlZSB8YnVmbmFtZSgpfCBhYm92ZS4KCQlXaGVuIHRoZSBidWZmZXIgb3IgdmFyaWFibGUgZG9lc24ndCBleGlzdCB7ZGVmfSBvciBhbiBlbXB0eQoJCXN0cmluZyBpcyByZXR1cm5lZCwgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4KCQlFeGFtcGxlczogPgoJCQk6bGV0IGJ1Zm1vZGlmaWVkID0gZ2V0YnVmdmFyKDEsICImbW9kIikKCQkJOmVjaG8gInRvZG8gbXl2YXIgPSAiIC4gZ2V0YnVmdmFyKCJ0b2RvIiwgIm15dmFyIikKPApnZXRjaGFyKFtleHByXSkJCQkJCQkqZ2V0Y2hhcigpKgoJCUdldCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgdXNlciBvciBpbnB1dCBzdHJlYW0uCgkJSWYgW2V4cHJdIGlzIG9taXR0ZWQsIHdhaXQgdW50aWwgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlLgoJCUlmIFtleHByXSBpcyAwLCBvbmx5IGdldCBhIGNoYXJhY3RlciB3aGVuIG9uZSBpcyBhdmFpbGFibGUuCgkJCVJldHVybiB6ZXJvIG90aGVyd2lzZS4KCQlJZiBbZXhwcl0gaXMgMSwgb25seSBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUsIGl0IGlzCgkJCW5vdCBjb25zdW1lZC4gIFJldHVybiB6ZXJvIGlmIG5vIGNoYXJhY3RlciBhdmFpbGFibGUuCgoJCVdpdGhvdXQgW2V4cHJdIGFuZCB3aGVuIFtleHByXSBpcyAwIGEgd2hvbGUgY2hhcmFjdGVyIG9yCgkJc3BlY2lhbCBrZXkgaXMgcmV0dXJuZWQuICBJZiBpdCBpcyBhbiA4LWJpdCBjaGFyYWN0ZXIsIHRoZQoJCXJlc3VsdCBpcyBhIG51bWJlci4gIFVzZSBucjJjaGFyKCkgdG8gY29udmVydCBpdCB0byBhIFN0cmluZy4KCQlPdGhlcndpc2UgYSBTdHJpbmcgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZW5jb2RlZCBjaGFyYWN0ZXIuCgkJRm9yIGEgc3BlY2lhbCBrZXkgaXQncyBhIHNlcXVlbmNlIG9mIGJ5dGVzIHN0YXJ0aW5nIHdpdGggMHg4MAoJCShkZWNpbWFsOiAxMjgpLiAgVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgc3RyaW5nCgkJIlw8S2V5PiIsIGUuZy4sICJcPExlZnQ+Ii4gIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHNvIGEKCQlTdHJpbmcgd2hlbiBhIG1vZGlmaWVyIChzaGlmdCwgY29udHJvbCwgYWx0KSB3YXMgdXNlZCB0aGF0IGlzCgkJbm90IGluY2x1ZGVkIGluIHRoZSBjaGFyYWN0ZXIuCgoJCVdoZW4gW2V4cHJdIGlzIDAgYW5kIEVzYyBpcyB0eXBlZCwgdGhlcmUgd2lsbCBiZSBhIHNob3J0IGRlbGF5CgkJd2hpbGUgVmltIHdhaXRzIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBzdGFydCBvZiBhbiBlc2NhcGUKCQlzZXF1ZW5jZS4KCgkJV2hlbiBbZXhwcl0gaXMgMSBvbmx5IHRoZSBmaXJzdCBieXRlIGlzIHJldHVybmVkLiAgRm9yIGEKCQlvbmUtYnl0ZSBjaGFyYWN0ZXIgaXQgaXMgdGhlIGNoYXJhY3RlciBpdHNlbGYgYXMgYSBudW1iZXIuCgkJVXNlIG5yMmNoYXIoKSB0byBjb252ZXJ0IGl0IHRvIGEgU3RyaW5nLgoKCQlVc2UgZ2V0Y2hhcm1vZCgpIHRvIG9idGFpbiBhbnkgYWRkaXRpb25hbCBtb2RpZmllcnMuCgoJCVdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgbW91c2UgYnV0dG9uLCB0aGUgbW91c2UgZXZlbnQgd2lsbCBiZQoJCXJldHVybmVkLiAgVGhlIHBvc2l0aW9uIGNhbiB0aGVuIGJlIGZvdW5kIGluIHx2Om1vdXNlX2NvbHwsCgkJfHY6bW91c2VfbG51bXwgYW5kIHx2Om1vdXNlX3dpbnwuICBUaGlzIGV4YW1wbGUgcG9zaXRpb25zIHRoZQoJCW1vdXNlIGFzIGl0IHdvdWxkIG5vcm1hbGx5IGhhcHBlbjogPgoJCQlsZXQgYyA9IGdldGNoYXIoKQoJCQlpZiBjID09ICJcPExlZnRNb3VzZT4iICYmIHY6bW91c2Vfd2luID4gMAoJCQkgIGV4ZSB2Om1vdXNlX3dpbiAuICJ3aW5jbWQgdyIKCQkJICBleGUgdjptb3VzZV9sbnVtCgkJCSAgZXhlICJub3JtYWwgIiAuIHY6bW91c2VfY29sIC4gInwiCgkJCWVuZGlmCjwKCQlUaGVyZSBpcyBubyBwcm9tcHQsIHlvdSB3aWxsIHNvbWVob3cgaGF2ZSB0byBtYWtlIGNsZWFyIHRvIHRoZQoJCXVzZXIgdGhhdCBhIGNoYXJhY3RlciBoYXMgdG8gYmUgdHlwZWQuCgkJVGhlcmUgaXMgbm8gbWFwcGluZyBmb3IgdGhlIGNoYXJhY3Rlci4KCQlLZXkgY29kZXMgYXJlIHJlcGxhY2VkLCB0aHVzIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgPERlbD4KCQlrZXkgeW91IGdldCB0aGUgY29kZSBmb3IgdGhlIDxEZWw+IGtleSwgbm90IHRoZSByYXcgY2hhcmFjdGVyCgkJc2VxdWVuY2UuICBFeGFtcGxlczogPgoJCQlnZXRjaGFyKCkgPT0gIlw8RGVsPiIKCQkJZ2V0Y2hhcigpID09ICJcPFMtTGVmdD4iCjwJCVRoaXMgZXhhbXBsZSByZWRlZmluZXMgImYiIHRvIGlnbm9yZSBjYXNlOiA+CgkJCTpubWFwIGYgOmNhbGwgRmluZENoYXIoKTxDUj4KCQkJOmZ1bmN0aW9uIEZpbmRDaGFyKCkKCQkJOiAgbGV0IGMgPSBucjJjaGFyKGdldGNoYXIoKSkKCQkJOiAgd2hpbGUgY29sKCcuJykgPCBjb2woJyQnKSAtIDEKCQkJOiAgICBub3JtYWwgbAoJCQk6ICAgIGlmIGdldGxpbmUoJy4nKVtjb2woJy4nKSAtIDFdID09PyBjCgkJCTogICAgICBicmVhawoJCQk6ICAgIGVuZGlmCgkJCTogIGVuZHdoaWxlCgkJCTplbmRmdW5jdGlvbgo8CgkJWW91IG1heSBhbHNvIHJlY2VpdmUgc3ludGhldGljIGNoYXJhY3RlcnMsIHN1Y2ggYXMKCQl8PEN1cnNvckhvbGQ+fC4gT2Z0ZW4geW91IHdpbGwgd2FudCB0byBpZ25vcmUgdGhpcyBhbmQgZ2V0CgkJYW5vdGhlciBjaGFyYWN0ZXI6ID4KCQkJOmZ1bmN0aW9uIEdldEtleSgpCgkJCTogIGxldCBjID0gZ2V0Y2hhcigpCgkJCTogIHdoaWxlIGMgPT0gIlw8Q3Vyc29ySG9sZD4iCgkJCTogICAgbGV0IGMgPSBnZXRjaGFyKCkKCQkJOiAgZW5kd2hpbGUKCQkJOiAgcmV0dXJuIGMKCQkJOmVuZGZ1bmN0aW9uCgpnZXRjaGFybW9kKCkJCQkJCQkqZ2V0Y2hhcm1vZCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIgd2hpY2ggaXMgdGhlIHN0YXRlIG9mIHRoZSBtb2RpZmllcnMgZm9yCgkJdGhlIGxhc3Qgb2J0YWluZWQgY2hhcmFjdGVyIHdpdGggZ2V0Y2hhcigpIG9yIGluIGFub3RoZXIgd2F5LgoJCVRoZXNlIHZhbHVlcyBhcmUgYWRkZWQgdG9nZXRoZXI6CgkJCTIJc2hpZnQKCQkJNAljb250cm9sCgkJCTgJYWx0IChtZXRhKQoJCQkxNgltZXRhICh3aGVuIGl0J3MgZGlmZmVyZW50IGZyb20gQUxUKQoJCQkzMgltb3VzZSBkb3VibGUgY2xpY2sKCQkJNjQJbW91c2UgdHJpcGxlIGNsaWNrCgkJCTk2CW1vdXNlIHF1YWRydXBsZSBjbGljayAoPT0gMzIgKyA2NCkKCQkJMTI4CWNvbW1hbmQgKE1hY2ludG9zaCBvbmx5KQoJCU9ubHkgdGhlIG1vZGlmaWVycyB0aGF0IGhhdmUgbm90IGJlZW4gaW5jbHVkZWQgaW4gdGhlCgkJY2hhcmFjdGVyIGl0c2VsZiBhcmUgb2J0YWluZWQuCVRodXMgU2hpZnQtYSByZXN1bHRzIGluICJBIgoJCXdpdGhvdXQgYSBtb2RpZmllci4KCmdldGNoYXJzZWFyY2goKQkJCQkJCSpnZXRjaGFyc2VhcmNoKCkqCgkJUmV0dXJuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBzZWFyY2ggaW5mb3JtYXRpb24gYXMgYSB7ZGljdH0KCQl3aXRoIHRoZSBmb2xsb3dpbmcgZW50cmllczoKCgkJICAgIGNoYXIJY2hhcmFjdGVyIHByZXZpb3VzbHkgdXNlZCBmb3IgYSBjaGFyYWN0ZXIKCQkJCXNlYXJjaCAofHR8LCB8ZnwsIHxUfCwgb3IgfEZ8KTsgZW1wdHkgc3RyaW5nCgkJCQlpZiBubyBjaGFyYWN0ZXIgc2VhcmNoIGhhcyBiZWVuIHBlcmZvcm1lZAoJCSAgICBmb3J3YXJkCWRpcmVjdGlvbiBvZiBjaGFyYWN0ZXIgc2VhcmNoOyAxIGZvciBmb3J3YXJkLAoJCQkJMCBmb3IgYmFja3dhcmQKCQkgICAgdW50aWwJdHlwZSBvZiBjaGFyYWN0ZXIgc2VhcmNoOyAxIGZvciBhIHx0fCBvciB8VHwKCQkJCWNoYXJhY3RlciBzZWFyY2gsIDAgZm9yIGFuIHxmfCBvciB8RnwKCQkJCWNoYXJhY3RlciBzZWFyY2gKCgkJVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGFsd2F5cyBoYXZlIHw7fCBhbmQgfCx8IHNlYXJjaAoJCWZvcndhcmQvYmFja3dhcmQgcmVnYXJkbGVzcyBvZiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBwcmV2aW91cwoJCWNoYXJhY3RlciBzZWFyY2g6ID4KCQkJOm5ub3JlbWFwIDxleHByPiA7IGdldGNoYXJzZWFyY2goKS5mb3J3YXJkID8gJzsnIDogJywnCgkJCTpubm9yZW1hcCA8ZXhwcj4gLCBnZXRjaGFyc2VhcmNoKCkuZm9yd2FyZCA/ICcsJyA6ICc7Jwo8CQlBbHNvIHNlZSB8c2V0Y2hhcnNlYXJjaCgpfC4KCmdldGNtZGxpbmUoKQkJCQkJCSpnZXRjbWRsaW5lKCkqCgkJUmV0dXJuIHRoZSBjdXJyZW50IGNvbW1hbmQtbGluZS4gIE9ubHkgd29ya3Mgd2hlbiB0aGUgY29tbWFuZAoJCWxpbmUgaXMgYmVpbmcgZWRpdGVkLCB0aHVzIHJlcXVpcmVzIHVzZSBvZiB8Y19DVFJMLVxfZXwgb3IKCQl8Y19DVFJMLVJfPXwuCgkJRXhhbXBsZTogPgoJCQk6Y21hcCA8Rjc+IDxDLVw+ZWVzY2FwZShnZXRjbWRsaW5lKCksICcgXCcpPENSPgo8CQlBbHNvIHNlZSB8Z2V0Y21kdHlwZSgpfCwgfGdldGNtZHBvcygpfCBhbmQgfHNldGNtZHBvcygpfC4KCmdldGNtZHBvcygpCQkJCQkJKmdldGNtZHBvcygpKgoJCVJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciBpbiB0aGUgY29tbWFuZCBsaW5lIGFzIGEKCQlieXRlIGNvdW50LiAgVGhlIGZpcnN0IGNvbHVtbiBpcyAxLgoJCU9ubHkgd29ya3Mgd2hlbiBlZGl0aW5nIHRoZSBjb21tYW5kIGxpbmUsIHRodXMgcmVxdWlyZXMgdXNlIG9mCgkJfGNfQ1RSTC1cX2V8IG9yIHxjX0NUUkwtUl89fCBvciBhbiBleHByZXNzaW9uIG1hcHBpbmcuCgkJUmV0dXJucyAwIG90aGVyd2lzZS4KCQlBbHNvIHNlZSB8Z2V0Y21kdHlwZSgpfCwgfHNldGNtZHBvcygpfCBhbmQgfGdldGNtZGxpbmUoKXwuCgpnZXRjbWR0eXBlKCkJCQkJCQkqZ2V0Y21kdHlwZSgpKgoJCVJldHVybiB0aGUgY3VycmVudCBjb21tYW5kLWxpbmUgdHlwZS4gUG9zc2libGUgcmV0dXJuIHZhbHVlcwoJCWFyZToKCQkgICAgOglub3JtYWwgRXggY29tbWFuZAoJCSAgICA+CWRlYnVnIG1vZGUgY29tbWFuZCB8ZGVidWctbW9kZXwKCQkgICAgLwlmb3J3YXJkIHNlYXJjaCBjb21tYW5kCgkJICAgID8JYmFja3dhcmQgc2VhcmNoIGNvbW1hbmQKCQkgICAgQAl8aW5wdXQoKXwgY29tbWFuZAoJCSAgICAtCXw6aW5zZXJ0fCBvciB8OmFwcGVuZHwgY29tbWFuZAoJCSAgICA9CXxpX0NUUkwtUl89fAoJCU9ubHkgd29ya3Mgd2hlbiBlZGl0aW5nIHRoZSBjb21tYW5kIGxpbmUsIHRodXMgcmVxdWlyZXMgdXNlIG9mCgkJfGNfQ1RSTC1cX2V8IG9yIHxjX0NUUkwtUl89fCBvciBhbiBleHByZXNzaW9uIG1hcHBpbmcuCgkJUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlLgoJCUFsc28gc2VlIHxnZXRjbWRwb3MoKXwsIHxzZXRjbWRwb3MoKXwgYW5kIHxnZXRjbWRsaW5lKCl8LgoKZ2V0Y21kd2ludHlwZSgpCQkJCQkJKmdldGNtZHdpbnR5cGUoKSoKCQlSZXR1cm4gdGhlIGN1cnJlbnQgfGNvbW1hbmQtbGluZS13aW5kb3d8IHR5cGUuIFBvc3NpYmxlIHJldHVybgoJCXZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgfGdldGNtZHR5cGUoKXwuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nCgkJd2hlbiBub3QgaW4gdGhlIGNvbW1hbmQtbGluZSB3aW5kb3cuCgoJCQkJCQkJKmdldGN1cnBvcygpKgpnZXRjdXJwb3MoKQlHZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuICBUaGlzIGlzIGxpa2UgZ2V0cG9zKCcuJyksIGJ1dAoJCWluY2x1ZGVzIGFuIGV4dHJhIGl0ZW0gaW4gdGhlIGxpc3Q6CgkJICAgIFtidWZudW0sIGxudW0sIGNvbCwgb2ZmLCBjdXJzd2FudF0gfgoJCVRoZSAiY3Vyc3dhbnQiIG51bWJlciBpcyB0aGUgcHJlZmVycmVkIGNvbHVtbiB3aGVuIG1vdmluZyB0aGUKCQljdXJzb3IgdmVydGljYWxseS4KCQlUaGlzIGNhbiBiZSB1c2VkIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGN1cnNvciBwb3NpdGlvbjogPgoJCQlsZXQgc2F2ZV9jdXJzb3IgPSBnZXRjdXJwb3MoKQoJCQlNb3ZlVGhlQ3Vyc29yQXJvdW5kCgkJCWNhbGwgc2V0cG9zKCcuJywgc2F2ZV9jdXJzb3IpCjwKCQkJCQkJCSpnZXRjd2QoKSoKZ2V0Y3dkKFt7d2lubnJ9IFssIHt0YWJucn1dXSkKCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudAoJCXdvcmtpbmcgZGlyZWN0b3J5LgoJCVdpdGhvdXQgYXJndW1lbnRzLCBmb3IgdGhlIGN1cnJlbnQgd2luZG93LgoKCQlXaXRoIHt3aW5ucn0gcmV0dXJuIHRoZSBsb2NhbCBjdXJyZW50IGRpcmVjdG9yeSBvZiB0aGlzIHdpbmRvdwoJCWluIHRoZSBjdXJyZW50IHRhYiBwYWdlLgoJCVdpdGgge3dpbm5yfSBhbmQge3RhYm5yfSByZXR1cm4gdGhlIGxvY2FsIGN1cnJlbnQgZGlyZWN0b3J5IG9mCgkJdGhlIHdpbmRvdyBpbiB0aGUgc3BlY2lmaWVkIHRhYiBwYWdlLgoJCVJldHVybiBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZC4KCmdldGZzaXplKHtmbmFtZX0pCQkJCQkqZ2V0ZnNpemUoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUKCQlnaXZlbiBmaWxlIHtmbmFtZX0uCgkJSWYge2ZuYW1lfSBpcyBhIGRpcmVjdG9yeSwgMCBpcyByZXR1cm5lZC4KCQlJZiB0aGUgZmlsZSB7Zm5hbWV9IGNhbid0IGJlIGZvdW5kLCAtMSBpcyByZXR1cm5lZC4KCQlJZiB0aGUgc2l6ZSBvZiB7Zm5hbWV9IGlzIHRvbyBiaWcgdG8gZml0IGluIGEgTnVtYmVyIHRoZW4gLTIKCQlpcyByZXR1cm5lZC4KCmdldGZvbnRuYW1lKFt7bmFtZX1dKQkJCQkJKmdldGZvbnRuYW1lKCkqCgkJV2l0aG91dCBhbiBhcmd1bWVudCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub3JtYWwgZm9udCBiZWluZwoJCXVzZWQuICBMaWtlIHdoYXQgaXMgdXNlZCBmb3IgdGhlIE5vcm1hbCBoaWdobGlnaHQgZ3JvdXAKCQl8aGwtTm9ybWFsfC4KCQlXaXRoIGFuIGFyZ3VtZW50IGEgY2hlY2sgaXMgZG9uZSB3aGV0aGVyIHtuYW1lfSBpcyBhIHZhbGlkCgkJZm9udCBuYW1lLiAgSWYgbm90IHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoJCU90aGVyd2lzZSB0aGUgYWN0dWFsIGZvbnQgbmFtZSBpcyByZXR1cm5lZCwgb3Ige25hbWV9IGlmIHRoZQoJCUdVSSBkb2VzIG5vdCBzdXBwb3J0IG9idGFpbmluZyB0aGUgcmVhbCBuYW1lLgoJCU9ubHkgd29ya3Mgd2hlbiB0aGUgR1VJIGlzIHJ1bm5pbmcsIHRodXMgbm90IGluIHlvdXIgdmltcmMgb3IKCQlndmltcmMgZmlsZS4gIFVzZSB0aGUgfEdVSUVudGVyfCBhdXRvY29tbWFuZCB0byB1c2UgdGhpcwoJCWZ1bmN0aW9uIGp1c3QgYWZ0ZXIgdGhlIEdVSSBoYXMgc3RhcnRlZC4KCQlOb3RlIHRoYXQgdGhlIEdUSyAyIEdVSSBhY2NlcHRzIGFueSBmb250IG5hbWUsIHRodXMgY2hlY2tpbmcKCQlmb3IgYSB2YWxpZCBuYW1lIGRvZXMgbm90IHdvcmsuCgpnZXRmcGVybSh7Zm5hbWV9KQkJCQkJKmdldGZwZXJtKCkqCgkJVGhlIHJlc3VsdCBpcyBhIFN0cmluZywgd2hpY2ggaXMgdGhlIHJlYWQsIHdyaXRlLCBhbmQgZXhlY3V0ZQoJCXBlcm1pc3Npb25zIG9mIHRoZSBnaXZlbiBmaWxlIHtmbmFtZX0uCgkJSWYge2ZuYW1lfSBkb2VzIG5vdCBleGlzdCBvciBpdHMgZGlyZWN0b3J5IGNhbm5vdCBiZSByZWFkLCBhbgoJCWVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KCQlUaGUgcmVzdWx0IGlzIG9mIHRoZSBmb3JtICJyd3hyd3hyd3giLCB3aGVyZSBlYWNoIGdyb3VwIG9mCgkJInJ3eCIgZmxhZ3MgcmVwcmVzZW50LCBpbiB0dXJuLCB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIG93bmVyCgkJb2YgdGhlIGZpbGUsIHRoZSBncm91cCB0aGUgZmlsZSBiZWxvbmdzIHRvLCBhbmQgb3RoZXIgdXNlcnMuCgkJSWYgYSB1c2VyIGRvZXMgbm90IGhhdmUgYSBnaXZlbiBwZXJtaXNzaW9uIHRoZSBmbGFnIGZvciB0aGlzCgkJaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nICItIi4gIEV4YW1wbGVzOiA+CgkJCTplY2hvIGdldGZwZXJtKCIvZXRjL3Bhc3N3ZCIpCgkJCTplY2hvIGdldGZwZXJtKGV4cGFuZCgifi8udmltcmMiKSkKPAkJVGhpcyB3aWxsIGhvcGVmdWxseSAoZnJvbSBhIHNlY3VyaXR5IHBvaW50IG9mIHZpZXcpIGRpc3BsYXkKCQl0aGUgc3RyaW5nICJydy1yLS1yLS0iIG9yIGV2ZW4gInJ3LS0tLS0tLSIuCgpnZXRmdGltZSh7Zm5hbWV9KQkJCQkJKmdldGZ0aW1lKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YKCQl0aGUgZ2l2ZW4gZmlsZSB7Zm5hbWV9LiAgVGhlIHZhbHVlIGlzIG1lYXN1cmVkIGFzIHNlY29uZHMKCQlzaW5jZSAxc3QgSmFuIDE5NzAsIGFuZCBtYXkgYmUgcGFzc2VkIHRvIHN0cmZ0aW1lKCkuICBTZWUgYWxzbwoJCXxsb2NhbHRpbWUoKXwgYW5kIHxzdHJmdGltZSgpfC4KCQlJZiB0aGUgZmlsZSB7Zm5hbWV9IGNhbid0IGJlIGZvdW5kIC0xIGlzIHJldHVybmVkLgoKZ2V0ZnR5cGUoe2ZuYW1lfSkJCQkJCSpnZXRmdHlwZSgpKgoJCVRoZSByZXN1bHQgaXMgYSBTdHJpbmcsIHdoaWNoIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGtpbmQgb2YKCQlmaWxlIG9mIHRoZSBnaXZlbiBmaWxlIHtmbmFtZX0uCgkJSWYge2ZuYW1lfSBkb2VzIG5vdCBleGlzdCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgkJSGVyZSBpcyBhIHRhYmxlIG92ZXIgZGlmZmVyZW50IGtpbmRzIG9mIGZpbGVzIGFuZCB0aGVpcgoJCXJlc3VsdHM6CgkJCU5vcm1hbCBmaWxlCQkiZmlsZSIKCQkJRGlyZWN0b3J5CQkiZGlyIgoJCQlTeW1ib2xpYyBsaW5rCQkibGluayIKCQkJQmxvY2sgZGV2aWNlCQkiYmRldiIKCQkJQ2hhcmFjdGVyIGRldmljZQkiY2RldiIKCQkJU29ja2V0CQkJInNvY2tldCIKCQkJRklGTwkJCSJmaWZvIgoJCQlBbGwgb3RoZXIJCSJvdGhlciIKCQlFeGFtcGxlOiA+CgkJCWdldGZ0eXBlKCIvaG9tZSIpCjwJCU5vdGUgdGhhdCBhIHR5cGUgc3VjaCBhcyAibGluayIgd2lsbCBvbmx5IGJlIHJldHVybmVkIG9uCgkJc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQuICBPbiBzb21lIHN5c3RlbXMgb25seSAiZGlyIiBhbmQKCQkiZmlsZSIgYXJlIHJldHVybmVkLiAgT24gTVMtV2luZG93cyBhIHN5bWJvbGljIGxpbmsgdG8gYQoJCWRpcmVjdG9yeSByZXR1cm5zICJkaXIiIGluc3RlYWQgb2YgImxpbmsiLgoKCQkJCQkJCSpnZXRsaW5lKCkqCmdldGxpbmUoe2xudW19IFssIHtlbmR9XSkKCQlXaXRob3V0IHtlbmR9IHRoZSByZXN1bHQgaXMgYSBTdHJpbmcsIHdoaWNoIGlzIGxpbmUge2xudW19CgkJZnJvbSB0aGUgY3VycmVudCBidWZmZXIuICBFeGFtcGxlOiA+CgkJCWdldGxpbmUoMSkKPAkJV2hlbiB7bG51bX0gaXMgYSBTdHJpbmcgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggYQoJCWRpZ2l0LCBsaW5lKCkgaXMgY2FsbGVkIHRvIHRyYW5zbGF0ZSB0aGUgU3RyaW5nIGludG8gYSBOdW1iZXIuCgkJVG8gZ2V0IHRoZSBsaW5lIHVuZGVyIHRoZSBjdXJzb3I6ID4KCQkJZ2V0bGluZSgiLiIpCjwJCVdoZW4ge2xudW19IGlzIHNtYWxsZXIgdGhhbiAxIG9yIGJpZ2dlciB0aGFuIHRoZSBudW1iZXIgb2YKCQlsaW5lcyBpbiB0aGUgYnVmZmVyLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgoJCVdoZW4ge2VuZH0gaXMgZ2l2ZW4gdGhlIHJlc3VsdCBpcyBhIHxMaXN0fCB3aGVyZSBlYWNoIGl0ZW0gaXMKCQlhIGxpbmUgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgaW4gdGhlIHJhbmdlIHtsbnVtfSB0byB7ZW5kfSwKCQlpbmNsdWRpbmcgbGluZSB7ZW5kfS4KCQl7ZW5kfSBpcyB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyB7bG51bX0uCgkJTm9uLWV4aXN0aW5nIGxpbmVzIGFyZSBzaWxlbnRseSBvbWl0dGVkLgoJCVdoZW4ge2VuZH0gaXMgYmVmb3JlIHtsbnVtfSBhbiBlbXB0eSB8TGlzdHwgaXMgcmV0dXJuZWQuCgkJRXhhbXBsZTogPgoJCQk6bGV0IHN0YXJ0ID0gbGluZSgnLicpCgkJCTpsZXQgZW5kID0gc2VhcmNoKCJeJCIpIC0gMQoJCQk6bGV0IGxpbmVzID0gZ2V0bGluZShzdGFydCwgZW5kKQoKPAkJVG8gZ2V0IGxpbmVzIGZyb20gYW5vdGhlciBidWZmZXIgc2VlIHxnZXRidWZsaW5lKCl8CgpnZXRsb2NsaXN0KHtucn0pCQkJCQkqZ2V0bG9jbGlzdCgpKgoJCVJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBsb2NhdGlvbiBsaXN0IGZvcgoJCXdpbmRvdyB7bnJ9LiBXaGVuIHtucn0gaXMgemVybyB0aGUgY3VycmVudCB3aW5kb3cgaXMgdXNlZC4KCQlGb3IgYSBsb2NhdGlvbiBsaXN0IHdpbmRvdywgdGhlIGRpc3BsYXllZCBsb2NhdGlvbiBsaXN0IGlzCgkJcmV0dXJuZWQuICBGb3IgYW4gaW52YWxpZCB3aW5kb3cgbnVtYmVyIHtucn0sIGFuIGVtcHR5IGxpc3QgaXMKCQlyZXR1cm5lZC4gT3RoZXJ3aXNlLCBzYW1lIGFzIHxnZXRxZmxpc3QoKXwuCgpnZXRtYXRjaGVzKCkJCQkJCQkqZ2V0bWF0Y2hlcygpKgoJCVJldHVybnMgYSB8TGlzdHwgd2l0aCBhbGwgbWF0Y2hlcyBwcmV2aW91c2x5IGRlZmluZWQgYnkKCQl8bWF0Y2hhZGQoKXwgYW5kIHRoZSB8Om1hdGNofCBjb21tYW5kcy4gIHxnZXRtYXRjaGVzKCl8IGlzCgkJdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggfHNldG1hdGNoZXMoKXwsIGFzIHxzZXRtYXRjaGVzKCl8CgkJY2FuIHJlc3RvcmUgYSBsaXN0IG9mIG1hdGNoZXMgc2F2ZWQgYnkgfGdldG1hdGNoZXMoKXwuCgkJRXhhbXBsZTogPgoJCQk6ZWNobyBnZXRtYXRjaGVzKCkKPAkJCVt7J2dyb3VwJzogJ015R3JvdXAxJywgJ3BhdHRlcm4nOiAnVE9ETycsCgkJCSdwcmlvcml0eSc6IDEwLCAnaWQnOiAxfSwgeydncm91cCc6ICdNeUdyb3VwMicsCgkJCSdwYXR0ZXJuJzogJ0ZJWE1FJywgJ3ByaW9yaXR5JzogMTAsICdpZCc6IDJ9XSA+CgkJCTpsZXQgbSA9IGdldG1hdGNoZXMoKQoJCQk6Y2FsbCBjbGVhcm1hdGNoZXMoKQoJCQk6ZWNobyBnZXRtYXRjaGVzKCkKPAkJCVtdID4KCQkJOmNhbGwgc2V0bWF0Y2hlcyhtKQoJCQk6ZWNobyBnZXRtYXRjaGVzKCkKPAkJCVt7J2dyb3VwJzogJ015R3JvdXAxJywgJ3BhdHRlcm4nOiAnVE9ETycsCgkJCSdwcmlvcml0eSc6IDEwLCAnaWQnOiAxfSwgeydncm91cCc6ICdNeUdyb3VwMicsCgkJCSdwYXR0ZXJuJzogJ0ZJWE1FJywgJ3ByaW9yaXR5JzogMTAsICdpZCc6IDJ9XSA+CgkJCTp1bmxldCBtCjwKCQkJCQkJCSpnZXRwaWQoKSoKZ2V0cGlkKCkJUmV0dXJuIGEgTnVtYmVyIHdoaWNoIGlzIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBWaW0gcHJvY2Vzcy4KCQlPbiBVbml4IGFuZCBNUy1XaW5kb3dzIHRoaXMgaXMgYSB1bmlxdWUgbnVtYmVyLCB1bnRpbCBWaW0KCQlleGl0cy4JT24gTVMtRE9TIGl0J3MgYWx3YXlzIHplcm8uCgoJCQkJCQkJKmdldHBvcygpKgpnZXRwb3Moe2V4cHJ9KQlHZXQgdGhlIHBvc2l0aW9uIGZvciB7ZXhwcn0uICBGb3IgcG9zc2libGUgdmFsdWVzIG9mIHtleHByfQoJCXNlZSB8bGluZSgpfC4gIEZvciBnZXR0aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24gc2VlCgkJfGdldGN1cnBvcygpfC4KCQlUaGUgcmVzdWx0IGlzIGEgfExpc3R8IHdpdGggZm91ciBudW1iZXJzOgoJCSAgICBbYnVmbnVtLCBsbnVtLCBjb2wsIG9mZl0KCQkiYnVmbnVtIiBpcyB6ZXJvLCB1bmxlc3MgYSBtYXJrIGxpa2UgJzAgb3IgJ0EgaXMgdXNlZCwgdGhlbiBpdAoJCWlzIHRoZSBidWZmZXIgbnVtYmVyIG9mIHRoZSBtYXJrLgoJCSJsbnVtIiBhbmQgImNvbCIgYXJlIHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyLiAgVGhlIGZpcnN0CgkJY29sdW1uIGlzIDEuCgkJVGhlICJvZmYiIG51bWJlciBpcyB6ZXJvLCB1bmxlc3MgJ3ZpcnR1YWxlZGl0JyBpcyB1c2VkLiAgVGhlbgoJCWl0IGlzIHRoZSBvZmZzZXQgaW4gc2NyZWVuIGNvbHVtbnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlCgkJY2hhcmFjdGVyLiAgRS5nLiwgYSBwb3NpdGlvbiB3aXRoaW4gYSA8VGFiPiBvciBhZnRlciB0aGUgbGFzdAoJCWNoYXJhY3Rlci4KCQlOb3RlIHRoYXQgZm9yICc8IGFuZCAnPiBWaXN1YWwgbW9kZSBtYXR0ZXJzOiB3aGVuIGl0IGlzICJWIgoJCSh2aXN1YWwgbGluZSBtb2RlKSB0aGUgY29sdW1uIG9mICc8IGlzIHplcm8gYW5kIHRoZSBjb2x1bW4gb2YKCQknPiBpcyBhIGxhcmdlIG51bWJlci4KCQlUaGlzIGNhbiBiZSB1c2VkIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uIG9mIGEgbWFyazogPgoJCQlsZXQgc2F2ZV9hX21hcmsgPSBnZXRwb3MoIidhIikKCQkJLi4uCgkJCWNhbGwgc2V0cG9zKCInYSIsIHNhdmVfYV9tYXJrKQo8CQlBbHNvIHNlZSB8Z2V0Y3VycG9zKCl8IGFuZCB8c2V0cG9zKCl8LgoKCmdldHFmbGlzdCgpCQkJCQkJKmdldHFmbGlzdCgpKgoJCVJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRoZSBjdXJyZW50IHF1aWNrZml4IGVycm9ycy4gIEVhY2gKCQlsaXN0IGl0ZW0gaXMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgZW50cmllczoKCQkJYnVmbnIJbnVtYmVyIG9mIGJ1ZmZlciB0aGF0IGhhcyB0aGUgZmlsZSBuYW1lLCB1c2UKCQkJCWJ1Zm5hbWUoKSB0byBnZXQgdGhlIG5hbWUKCQkJbG51bQlsaW5lIG51bWJlciBpbiB0aGUgYnVmZmVyIChmaXJzdCBsaW5lIGlzIDEpCgkJCWNvbAljb2x1bW4gbnVtYmVyIChmaXJzdCBjb2x1bW4gaXMgMSkKCQkJdmNvbAlub24temVybzogImNvbCIgaXMgdmlzdWFsIGNvbHVtbgoJCQkJemVybzogImNvbCIgaXMgYnl0ZSBpbmRleAoJCQlucgllcnJvciBudW1iZXIKCQkJcGF0dGVybglzZWFyY2ggcGF0dGVybiB1c2VkIHRvIGxvY2F0ZSB0aGUgZXJyb3IKCQkJdGV4dAlkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IKCQkJdHlwZQl0eXBlIG9mIHRoZSBlcnJvciwgJ0UnLCAnMScsIGV0Yy4KCQkJdmFsaWQJbm9uLXplcm86IHJlY29nbml6ZWQgZXJyb3IgbWVzc2FnZQoKCQlXaGVuIHRoZXJlIGlzIG5vIGVycm9yIGxpc3Qgb3IgaXQncyBlbXB0eSBhbiBlbXB0eSBsaXN0IGlzCgkJcmV0dXJuZWQuIFF1aWNrZml4IGxpc3QgZW50cmllcyB3aXRoIG5vbi1leGlzdGluZyBidWZmZXIKCQludW1iZXIgYXJlIHJldHVybmVkIHdpdGggImJ1Zm5yIiBzZXQgdG8gemVyby4KCgkJVXNlZnVsIGFwcGxpY2F0aW9uOiBGaW5kIHBhdHRlcm4gbWF0Y2hlcyBpbiBtdWx0aXBsZSBmaWxlcyBhbmQKCQlkbyBzb21ldGhpbmcgd2l0aCB0aGVtOiA+CgkJCTp2aW1ncmVwIC90aGV3b3JkL2pnICouYwoJCQk6Zm9yIGQgaW4gZ2V0cWZsaXN0KCkKCQkJOiAgIGVjaG8gYnVmbmFtZShkLmJ1Zm5yKSAnOicgZC5sbnVtICc9JyBkLnRleHQKCQkJOmVuZGZvcgoKCmdldHJlZyhbe3JlZ25hbWV9IFssIDEgWywge2xpc3R9XV1dKQkJCSpnZXRyZWcoKSoKCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyB0aGUgY29udGVudHMgb2YgcmVnaXN0ZXIKCQl7cmVnbmFtZX0uICBFeGFtcGxlOiA+CgkJCTpsZXQgY2xpcHRleHQgPSBnZXRyZWcoJyonKQo8CQlnZXRyZWcoJz0nKSByZXR1cm5zIHRoZSBsYXN0IGV2YWx1YXRlZCB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgoJCXJlZ2lzdGVyLiAgKEZvciB1c2UgaW4gbWFwcy4pCgkJZ2V0cmVnKCc9JywgMSkgcmV0dXJucyB0aGUgZXhwcmVzc2lvbiBpdHNlbGYsIHNvIHRoYXQgaXQgY2FuCgkJYmUgcmVzdG9yZWQgd2l0aCB8c2V0cmVnKCl8LiAgRm9yIG90aGVyIHJlZ2lzdGVycyB0aGUgZXh0cmEKCQlhcmd1bWVudCBpcyBpZ25vcmVkLCB0aHVzIHlvdSBjYW4gYWx3YXlzIGdpdmUgaXQuCgkJSWYge2xpc3R9IGlzIHByZXNlbnQgYW5kIG5vbi16ZXJvIHJlc3VsdCB0eXBlIGlzIGNoYW5nZWQgdG8gCgkJfExpc3R8LiBFYWNoIGxpc3QgaXRlbSBpcyBvbmUgdGV4dCBsaW5lLiBVc2UgaXQgaWYgeW91IGNhcmUKCQlhYm91dCB6ZXJvIGJ5dGVzIHBvc3NpYmx5IHByZXNlbnQgaW5zaWRlIHJlZ2lzdGVyOiB3aXRob3V0CgkJdGhpcmQgYXJndW1lbnQgYm90aCBOTHMgYW5kIHplcm8gYnl0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIE5McwoJCShzZWUgfE5MLXVzZWQtZm9yLU51bHwpLgoJCUlmIHtyZWduYW1lfSBpcyBub3Qgc3BlY2lmaWVkLCB8djpyZWdpc3RlcnwgaXMgdXNlZC4KCgpnZXRyZWd0eXBlKFt7cmVnbmFtZX1dKQkJCQkJKmdldHJlZ3R5cGUoKSoKCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyB0eXBlIG9mIHJlZ2lzdGVyIHtyZWduYW1lfS4KCQlUaGUgdmFsdWUgd2lsbCBiZSBvbmUgb2Y6CgkJICAgICJ2IgkJCWZvciB8Y2hhcmFjdGVyd2lzZXwgdGV4dAoJCSAgICAiViIJCQlmb3IgfGxpbmV3aXNlfCB0ZXh0CgkJICAgICI8Q1RSTC1WPnt3aWR0aH0iCWZvciB8YmxvY2t3aXNlLXZpc3VhbHwgdGV4dAoJCSAgICAiIgkJCWZvciBhbiBlbXB0eSBvciB1bmtub3duIHJlZ2lzdGVyCgkJPENUUkwtVj4gaXMgb25lIGNoYXJhY3RlciB3aXRoIHZhbHVlIDB4MTYuCgkJSWYge3JlZ25hbWV9IGlzIG5vdCBzcGVjaWZpZWQsIHx2OnJlZ2lzdGVyfCBpcyB1c2VkLgoKZ2V0dGFidmFyKHt0YWJucn0sIHt2YXJuYW1lfSBbLCB7ZGVmfV0pCQkJCSpnZXR0YWJ2YXIoKSoKCQlHZXQgdGhlIHZhbHVlIG9mIGEgdGFiLWxvY2FsIHZhcmlhYmxlIHt2YXJuYW1lfSBpbiB0YWIgcGFnZQoJCXt0YWJucn0uIHx0OnZhcnwKCQlUYWJzIGFyZSBudW1iZXJlZCBzdGFydGluZyB3aXRoIG9uZS4KCQlXaGVuIHt2YXJuYW1lfSBpcyBlbXB0eSBhIGRpY3Rpb25hcnkgd2l0aCBhbGwgdGFiLWxvY2FsCgkJdmFyaWFibGVzIGlzIHJldHVybmVkLgoJCU5vdGUgdGhhdCB0aGUgbmFtZSB3aXRob3V0ICJ0OiIgbXVzdCBiZSB1c2VkLgoJCVdoZW4gdGhlIHRhYiBvciB2YXJpYWJsZSBkb2Vzbid0IGV4aXN0IHtkZWZ9IG9yIGFuIGVtcHR5CgkJc3RyaW5nIGlzIHJldHVybmVkLCB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLgoKZ2V0dGFid2ludmFyKHt0YWJucn0sIHt3aW5ucn0sIHt2YXJuYW1lfSBbLCB7ZGVmfV0pCQkqZ2V0dGFid2ludmFyKCkqCgkJR2V0IHRoZSB2YWx1ZSBvZiB3aW5kb3ctbG9jYWwgdmFyaWFibGUge3Zhcm5hbWV9IGluIHdpbmRvdwoJCXt3aW5ucn0gaW4gdGFiIHBhZ2Uge3RhYm5yfS4KCQlXaGVuIHt2YXJuYW1lfSBzdGFydHMgd2l0aCAiJiIgZ2V0IHRoZSB2YWx1ZSBvZiBhIHdpbmRvdy1sb2NhbAoJCW9wdGlvbi4KCQlXaGVuIHt2YXJuYW1lfSBpcyBlbXB0eSBhIGRpY3Rpb25hcnkgd2l0aCBhbGwgd2luZG93LWxvY2FsCgkJdmFyaWFibGVzIGlzIHJldHVybmVkLgoJCU5vdGUgdGhhdCB7dmFybmFtZX0gbXVzdCBiZSB0aGUgbmFtZSB3aXRob3V0ICJ3OiIuCgkJVGFicyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgd2l0aCBvbmUuICBGb3IgdGhlIGN1cnJlbnQgdGFicGFnZQoJCXVzZSB8Z2V0d2ludmFyKCl8LgoJCVdoZW4ge3dpbm5yfSBpcyB6ZXJvIHRoZSBjdXJyZW50IHdpbmRvdyBpcyB1c2VkLgoJCVRoaXMgYWxzbyB3b3JrcyBmb3IgYSBnbG9iYWwgb3B0aW9uLCBidWZmZXItbG9jYWwgb3B0aW9uIGFuZAoJCXdpbmRvdy1sb2NhbCBvcHRpb24sIGJ1dCBpdCBkb2Vzbid0IHdvcmsgZm9yIGEgZ2xvYmFsIHZhcmlhYmxlCgkJb3IgYnVmZmVyLWxvY2FsIHZhcmlhYmxlLgoJCVdoZW4gdGhlIHRhYiwgd2luZG93IG9yIHZhcmlhYmxlIGRvZXNuJ3QgZXhpc3Qge2RlZn0gb3IgYW4KCQllbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQsIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuCgkJRXhhbXBsZXM6ID4KCQkJOmxldCBsaXN0X2lzX29uID0gZ2V0dGFid2ludmFyKDEsIDIsICcmbGlzdCcpCgkJCTplY2hvICJteXZhciA9ICIgLiBnZXR0YWJ3aW52YXIoMywgMSwgJ215dmFyJykKPAoJCQkJCQkJKmdldHdpbnBvc3goKSoKZ2V0d2lucG9zeCgpCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBYIGNvb3JkaW5hdGUgaW4gcGl4ZWxzIG9mCgkJdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBHVUkgVmltIHdpbmRvdy4gIFRoZSByZXN1bHQgd2lsbCBiZQoJCS0xIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLgoKCQkJCQkJCSpnZXR3aW5wb3N5KCkqCmdldHdpbnBvc3koKQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgWSBjb29yZGluYXRlIGluIHBpeGVscyBvZgoJCXRoZSB0b3Agb2YgdGhlIEdVSSBWaW0gd2luZG93LglUaGUgcmVzdWx0IHdpbGwgYmUgLTEgaWYgdGhlCgkJaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4KCmdldHdpbnZhcih7d2lubnJ9LCB7dmFybmFtZX0gWywge2RlZn1dKQkJCQkqZ2V0d2ludmFyKCkqCgkJTGlrZSB8Z2V0dGFid2ludmFyKCl8IGZvciB0aGUgY3VycmVudCB0YWJwYWdlLgoJCUV4YW1wbGVzOiA+CgkJCTpsZXQgbGlzdF9pc19vbiA9IGdldHdpbnZhcigyLCAnJmxpc3QnKQoJCQk6ZWNobyAibXl2YXIgPSAiIC4gZ2V0d2ludmFyKDEsICdteXZhcicpCjwKZ2xvYih7ZXhwcn0gWywge25vc3VmfSBbLCB7bGlzdH0gWywge2FsbGxpbmtzfV1dXSkJCSpnbG9iKCkqCgkJRXhwYW5kIHRoZSBmaWxlIHdpbGRjYXJkcyBpbiB7ZXhwcn0uICBTZWUgfHdpbGRjYXJkc3wgZm9yIHRoZQoJCXVzZSBvZiBzcGVjaWFsIGNoYXJhY3RlcnMuCgoJCVVubGVzcyB0aGUgb3B0aW9uYWwge25vc3VmfSBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXMgbm9uLXplcm8sCgkJdGhlICdzdWZmaXhlcycgYW5kICd3aWxkaWdub3JlJyBvcHRpb25zIGFwcGx5OiBOYW1lcyBtYXRjaGluZwoJCW9uZSBvZiB0aGUgcGF0dGVybnMgaW4gJ3dpbGRpZ25vcmUnIHdpbGwgYmUgc2tpcHBlZCBhbmQKCQknc3VmZml4ZXMnIGFmZmVjdCB0aGUgb3JkZXJpbmcgb2YgbWF0Y2hlcy4KCQknd2lsZGlnbm9yZWNhc2UnIGFsd2F5cyBhcHBsaWVzLgoKCQlXaGVuIHtsaXN0fSBpcyBwcmVzZW50IGFuZCBpdCBpcyBub24temVybyB0aGUgcmVzdWx0IGlzIGEgTGlzdAoJCXdpdGggYWxsIG1hdGNoaW5nIGZpbGVzLiBUaGUgYWR2YW50YWdlIG9mIHVzaW5nIGEgTGlzdCBpcywKCQl5b3UgYWxzbyBnZXQgZmlsZW5hbWVzIGNvbnRhaW5pbmcgbmV3bGluZXMgY29ycmVjdGx5LgoJCU90aGVyd2lzZSB0aGUgcmVzdWx0IGlzIGEgU3RyaW5nIGFuZCB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsCgkJbWF0Y2hlcywgdGhleSBhcmUgc2VwYXJhdGVkIGJ5IDxOTD4gY2hhcmFjdGVycy4KCgkJSWYgdGhlIGV4cGFuc2lvbiBmYWlscywgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBTdHJpbmcgb3IgTGlzdC4KCgkJQSBuYW1lIGZvciBhIG5vbi1leGlzdGluZyBmaWxlIGlzIG5vdCBpbmNsdWRlZC4gIEEgc3ltYm9saWMKCQlsaW5rIGlzIG9ubHkgaW5jbHVkZWQgaWYgaXQgcG9pbnRzIHRvIGFuIGV4aXN0aW5nIGZpbGUuCgkJSG93ZXZlciwgd2hlbiB0aGUge2FsbGxpbmtzfSBhcmd1bWVudCBpcyBwcmVzZW50IGFuZCBpdCBpcwoJCW5vbi16ZXJvIHRoZW4gYWxsIHN5bWJvbGljIGxpbmtzIGFyZSBpbmNsdWRlZC4KCgkJRm9yIG1vc3Qgc3lzdGVtcyBiYWNrdGlja3MgY2FuIGJlIHVzZWQgdG8gZ2V0IGZpbGVzIG5hbWVzIGZyb20KCQlhbnkgZXh0ZXJuYWwgY29tbWFuZC4gIEV4YW1wbGU6ID4KCQkJOmxldCB0YWdmaWxlcyA9IGdsb2IoImBmaW5kIC4gLW5hbWUgdGFncyAtcHJpbnRgIikKCQkJOmxldCAmdGFncyA9IHN1YnN0aXR1dGUodGFnZmlsZXMsICJcbiIsICIsIiwgImciKQo8CQlUaGUgcmVzdWx0IG9mIHRoZSBwcm9ncmFtIGluc2lkZSB0aGUgYmFja3RpY2tzIHNob3VsZCBiZSBvbmUKCQlpdGVtIHBlciBsaW5lLglTcGFjZXMgaW5zaWRlIGFuIGl0ZW0gYXJlIGFsbG93ZWQuCgoJCVNlZSB8ZXhwYW5kKCl8IGZvciBleHBhbmRpbmcgc3BlY2lhbCBWaW0gdmFyaWFibGVzLiAgU2VlCgkJfHN5c3RlbSgpfCBmb3IgZ2V0dGluZyB0aGUgcmF3IG91dHB1dCBvZiBhbiBleHRlcm5hbCBjb21tYW5kLgoKZ2xvYjJyZWdwYXQoe2V4cHJ9KQkJCQkJICpnbG9iMnJlZ3BhdCgpKgoJCUNvbnZlcnQgYSBmaWxlIHBhdHRlcm4sIGFzIHVzZWQgYnkgZ2xvYigpLCBpbnRvIGEgc2VhcmNoCgkJcGF0dGVybi4gIFRoZSByZXN1bHQgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggd2l0aCBhIHN0cmluZyB0aGF0CgkJaXMgYSBmaWxlIG5hbWUuICBFLmcuID4KCQkJaWYgZmlsZW5hbWUgPX4gZ2xvYjJyZWdwYXQoJ01ha2UqLm1haycpCjwJCVRoaXMgaXMgZXF1aXZhbGVudCB0bzogPgoJCQlpZiBmaWxlbmFtZSA9fiAnXk1ha2UuKlwubWFrJCcKPAkJV2hlbiB7ZXhwcn0gaXMgYW4gZW1wdHkgc3RyaW5nIHRoZSByZXN1bHQgaXMgIl4kIiwgbWF0Y2ggYW4KCQllbXB0eSBzdHJpbmcuCgoJCQkJCQkJCSpnbG9icGF0aCgpKgpnbG9icGF0aCh7cGF0aH0sIHtleHByfSBbLCB7bm9zdWZ9IFssIHtsaXN0fSBbLCB7YWxsaW5rc31dXV0pCgkJUGVyZm9ybSBnbG9iKCkgb24gYWxsIGRpcmVjdG9yaWVzIGluIHtwYXRofSBhbmQgY29uY2F0ZW5hdGUKCQl0aGUgcmVzdWx0cy4gIEV4YW1wbGU6ID4KCQkJOmVjaG8gZ2xvYnBhdGgoJnJ0cCwgInN5bnRheC9jLnZpbSIpCjwKCQl7cGF0aH0gaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMuICBFYWNoCgkJZGlyZWN0b3J5IG5hbWUgaXMgcHJlcGVuZGVkIHRvIHtleHByfSBhbmQgZXhwYW5kZWQgbGlrZSB3aXRoCgkJfGdsb2IoKXwuICBBIHBhdGggc2VwYXJhdG9yIGlzIGluc2VydGVkIHdoZW4gbmVlZGVkLgoJCVRvIGFkZCBhIGNvbW1hIGluc2lkZSBhIGRpcmVjdG9yeSBuYW1lIGVzY2FwZSBpdCB3aXRoIGEKCQliYWNrc2xhc2guICBOb3RlIHRoYXQgb24gTVMtV2luZG93cyBhIGRpcmVjdG9yeSBtYXkgaGF2ZSBhCgkJdHJhaWxpbmcgYmFja3NsYXNoLCByZW1vdmUgaXQgaWYgeW91IHB1dCBhIGNvbW1hIGFmdGVyIGl0LgoJCUlmIHRoZSBleHBhbnNpb24gZmFpbHMgZm9yIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMsIHRoZXJlIGlzIG5vCgkJZXJyb3IgbWVzc2FnZS4KCgkJVW5sZXNzIHRoZSBvcHRpb25hbCB7bm9zdWZ9IGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBpcyBub24temVybywKCQl0aGUgJ3N1ZmZpeGVzJyBhbmQgJ3dpbGRpZ25vcmUnIG9wdGlvbnMgYXBwbHk6IE5hbWVzIG1hdGNoaW5nCgkJb25lIG9mIHRoZSBwYXR0ZXJucyBpbiAnd2lsZGlnbm9yZScgd2lsbCBiZSBza2lwcGVkIGFuZAoJCSdzdWZmaXhlcycgYWZmZWN0IHRoZSBvcmRlcmluZyBvZiBtYXRjaGVzLgoKCQlXaGVuIHtsaXN0fSBpcyBwcmVzZW50IGFuZCBpdCBpcyBub24temVybyB0aGUgcmVzdWx0IGlzIGEgTGlzdAoJCXdpdGggYWxsIG1hdGNoaW5nIGZpbGVzLiBUaGUgYWR2YW50YWdlIG9mIHVzaW5nIGEgTGlzdCBpcywgeW91CgkJYWxzbyBnZXQgZmlsZW5hbWVzIGNvbnRhaW5pbmcgbmV3bGluZXMgY29ycmVjdGx5LiBPdGhlcndpc2UKCQl0aGUgcmVzdWx0IGlzIGEgU3RyaW5nIGFuZCB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIG1hdGNoZXMsCgkJdGhleSBhcmUgc2VwYXJhdGVkIGJ5IDxOTD4gY2hhcmFjdGVycy4gIEV4YW1wbGU6ID4KCQkJOmVjaG8gZ2xvYnBhdGgoJnJ0cCwgInN5bnRheC9jLnZpbSIsIDAsIDEpCjwKCQl7YWxsaW5rc30gaXMgdXNlZCBhcyB3aXRoIHxnbG9iKCl8LgoKCQlUaGUgIioqIiBpdGVtIGNhbiBiZSB1c2VkIHRvIHNlYXJjaCBpbiBhIGRpcmVjdG9yeSB0cmVlLgoJCUZvciBleGFtcGxlLCB0byBmaW5kIGFsbCAiUkVBRE1FLnR4dCIgZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzCgkJaW4gJ3J1bnRpbWVwYXRoJyBhbmQgYmVsb3c6ID4KCQkJOmVjaG8gZ2xvYnBhdGgoJnJ0cCwgIioqL1JFQURNRS50eHQiKQo8CQlVcHdhcmRzIHNlYXJjaCBhbmQgbGltaXRpbmcgdGhlIGRlcHRoIG9mICIqKiIgaXMgbm90CgkJc3VwcG9ydGVkLCB0aHVzIHVzaW5nICdwYXRoJyB3aWxsIG5vdCBhbHdheXMgd29yayBwcm9wZXJseS4KCgkJCQkJCQkqaGFzKCkqCmhhcyh7ZmVhdHVyZX0pCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIDEgaWYgdGhlIGZlYXR1cmUge2ZlYXR1cmV9IGlzCgkJc3VwcG9ydGVkLCB6ZXJvIG90aGVyd2lzZS4gIFRoZSB7ZmVhdHVyZX0gYXJndW1lbnQgaXMgYQoJCXN0cmluZy4gIFNlZSB8ZmVhdHVyZS1saXN0fCBiZWxvdy4KCQlBbHNvIHNlZSB8ZXhpc3RzKCl8LgoKCmhhc19rZXkoe2RpY3R9LCB7a2V5fSkJCQkJCSpoYXNfa2V5KCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgMSBpZiB8RGljdGlvbmFyeXwge2RpY3R9IGhhcwoJCWFuIGVudHJ5IHdpdGgga2V5IHtrZXl9LiAgWmVybyBvdGhlcndpc2UuCgpoYXNsb2NhbGRpcihbe3dpbm5yfSBbLCB7dGFibnJ9XV0pCQkJKmhhc2xvY2FsZGlyKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgMSB3aGVuIHRoZSB3aW5kb3cgaGFzIHNldCBhCgkJbG9jYWwgcGF0aCB2aWEgfDpsY2R8LCBhbmQgMCBvdGhlcndpc2UuCgoJCVdpdGhvdXQgYXJndW1lbnRzIHVzZSB0aGUgY3VycmVudCB3aW5kb3cuCgkJV2l0aCB7d2lubnJ9IHVzZSB0aGlzIHdpbmRvdyBpbiB0aGUgY3VycmVudCB0YWIgcGFnZS4KCQlXaXRoIHt3aW5ucn0gYW5kIHt0YWJucn0gdXNlIHRoZSB3aW5kb3cgaW4gdGhlIHNwZWNpZmllZCB0YWIKCQlwYWdlLgoJCVJldHVybiAwIGlmIHRoZSBhcmd1bWVudHMgYXJlIGludmFsaWQuCgpoYXNtYXB0byh7d2hhdH0gWywge21vZGV9IFssIHthYmJyfV1dKQkJCSpoYXNtYXB0bygpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIDEgaWYgdGhlcmUgaXMgYSBtYXBwaW5nIHRoYXQKCQljb250YWlucyB7d2hhdH0gaW4gc29tZXdoZXJlIGluIHRoZSByaHMgKHdoYXQgaXQgaXMgbWFwcGVkIHRvKQoJCWFuZCB0aGlzIG1hcHBpbmcgZXhpc3RzIGluIG9uZSBvZiB0aGUgbW9kZXMgaW5kaWNhdGVkIGJ5CgkJe21vZGV9LgoJCVdoZW4ge2FiYnJ9IGlzIHRoZXJlIGFuZCBpdCBpcyBub24temVybyB1c2UgYWJicmV2aWF0aW9ucwoJCWluc3RlYWQgb2YgbWFwcGluZ3MuICBEb24ndCBmb3JnZXQgdG8gc3BlY2lmeSBJbnNlcnQgYW5kL29yCgkJQ29tbWFuZC1saW5lIG1vZGUuCgkJQm90aCB0aGUgZ2xvYmFsIG1hcHBpbmdzIGFuZCB0aGUgbWFwcGluZ3MgbG9jYWwgdG8gdGhlIGN1cnJlbnQKCQlidWZmZXIgYXJlIGNoZWNrZWQgZm9yIGEgbWF0Y2guCgkJSWYgbm8gbWF0Y2hpbmcgbWFwcGluZyBpcyBmb3VuZCAwIGlzIHJldHVybmVkLgoJCVRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgcmVjb2duaXplZCBpbiB7bW9kZX06CgkJCW4JTm9ybWFsIG1vZGUKCQkJdglWaXN1YWwgbW9kZQoJCQlvCU9wZXJhdG9yLXBlbmRpbmcgbW9kZQoJCQlpCUluc2VydCBtb2RlCgkJCWwJTGFuZ3VhZ2UtQXJndW1lbnQgKCJyIiwgImYiLCAidCIsIGV0Yy4pCgkJCWMJQ29tbWFuZC1saW5lIG1vZGUKCQlXaGVuIHttb2RlfSBpcyBvbWl0dGVkLCAibnZvIiBpcyB1c2VkLgoKCQlUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB0byBjaGVjayBpZiBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMKCQl0byBhIGZ1bmN0aW9uIGluIGEgVmltIHNjcmlwdC4JRXhhbXBsZTogPgoJCQk6aWYgIWhhc21hcHRvKCdcQUJDZG9pdCcpCgkJCTogICBtYXAgPExlYWRlcj5kIFxBQkNkb2l0CgkJCTplbmRpZgo8CQlUaGlzIGluc3RhbGxzIHRoZSBtYXBwaW5nIHRvICJcQUJDZG9pdCIgb25seSBpZiB0aGVyZSBpc24ndAoJCWFscmVhZHkgYSBtYXBwaW5nIHRvICJcQUJDZG9pdCIuCgpoaXN0YWRkKHtoaXN0b3J5fSwge2l0ZW19KQkJCQkqaGlzdGFkZCgpKgoJCUFkZCB0aGUgU3RyaW5nIHtpdGVtfSB0byB0aGUgaGlzdG9yeSB7aGlzdG9yeX0gd2hpY2ggY2FuIGJlCgkJb25lIG9mOgkJCQkJKmhpc3QtbmFtZXMqCgkJCSJjbWQiCSBvciAiOiIJICBjb21tYW5kIGxpbmUgaGlzdG9yeQoJCQkic2VhcmNoIiBvciAiLyIgICBzZWFyY2ggcGF0dGVybiBoaXN0b3J5CgkJCSJleHByIgkgb3IgIj0iICAgdHlwZWQgZXhwcmVzc2lvbiBoaXN0b3J5CgkJCSJpbnB1dCIgIG9yICJAIgkgIGlucHV0IGxpbmUgaGlzdG9yeQoJCQkiZGVidWciICBvciAiPiIgICBkZWJ1ZyBjb21tYW5kIGhpc3RvcnkKCQlUaGUge2hpc3Rvcnl9IHN0cmluZyBkb2VzIG5vdCBuZWVkIHRvIGJlIHRoZSB3aG9sZSBuYW1lLCBvbmUKCQljaGFyYWN0ZXIgaXMgc3VmZmljaWVudC4KCQlJZiB7aXRlbX0gZG9lcyBhbHJlYWR5IGV4aXN0IGluIHRoZSBoaXN0b3J5LCBpdCB3aWxsIGJlCgkJc2hpZnRlZCB0byBiZWNvbWUgdGhlIG5ld2VzdCBlbnRyeS4KCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyOiAxIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsCgkJb3RoZXJ3aXNlIDAgaXMgcmV0dXJuZWQuCgoJCUV4YW1wbGU6ID4KCQkJOmNhbGwgaGlzdGFkZCgiaW5wdXQiLCBzdHJmdGltZSgiJVkgJWIgJWQiKSkKCQkJOmxldCBkYXRlPWlucHV0KCJFbnRlciBkYXRlOiAiKQo8CQlUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHxzYW5kYm94fC4KCmhpc3RkZWwoe2hpc3Rvcnl9IFssIHtpdGVtfV0pCQkJCSpoaXN0ZGVsKCkqCgkJQ2xlYXIge2hpc3Rvcnl9LCBpLmUuIGRlbGV0ZSBhbGwgaXRzIGVudHJpZXMuICBTZWUgfGhpc3QtbmFtZXN8CgkJZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2Yge2hpc3Rvcnl9LgoKCQlJZiB0aGUgcGFyYW1ldGVyIHtpdGVtfSBldmFsdWF0ZXMgdG8gYSBTdHJpbmcsIGl0IGlzIHVzZWQgYXMgYQoJCXJlZ3VsYXIgZXhwcmVzc2lvbi4gIEFsbCBlbnRyaWVzIG1hdGNoaW5nIHRoYXQgZXhwcmVzc2lvbiB3aWxsCgkJYmUgcmVtb3ZlZCBmcm9tIHRoZSBoaXN0b3J5IChpZiB0aGVyZSBhcmUgYW55KS4KCQlVcHBlci9sb3dlcmNhc2UgbXVzdCBtYXRjaCwgdW5sZXNzICJcYyIgaXMgdXNlZCB8L1xjfC4KCQlJZiB7aXRlbX0gZXZhbHVhdGVzIHRvIGEgTnVtYmVyLCBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzCgkJYW4gaW5kZXgsIHNlZSB8Omhpc3RvcnktaW5kZXhpbmd8LiAgVGhlIHJlc3BlY3RpdmUgZW50cnkgd2lsbAoJCWJlIHJlbW92ZWQgaWYgaXQgZXhpc3RzLgoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyOiAxIGZvciBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLAoJCW90aGVyd2lzZSAwIGlzIHJldHVybmVkLgoKCQlFeGFtcGxlczoKCQlDbGVhciBleHByZXNzaW9uIHJlZ2lzdGVyIGhpc3Rvcnk6ID4KCQkJOmNhbGwgaGlzdGRlbCgiZXhwciIpCjwKCQlSZW1vdmUgYWxsIGVudHJpZXMgc3RhcnRpbmcgd2l0aCAiKiIgZnJvbSB0aGUgc2VhcmNoIGhpc3Rvcnk6ID4KCQkJOmNhbGwgaGlzdGRlbCgiLyIsICdeXConKQo8CgkJVGhlIGZvbGxvd2luZyB0aHJlZSBhcmUgZXF1aXZhbGVudDogPgoJCQk6Y2FsbCBoaXN0ZGVsKCJzZWFyY2giLCBoaXN0bnIoInNlYXJjaCIpKQoJCQk6Y2FsbCBoaXN0ZGVsKCJzZWFyY2giLCAtMSkKCQkJOmNhbGwgaGlzdGRlbCgic2VhcmNoIiwgJ14nLmhpc3RnZXQoInNlYXJjaCIsIC0xKS4nJCcpCjwKCQlUbyBkZWxldGUgdGhlIGxhc3Qgc2VhcmNoIHBhdHRlcm4gYW5kIHVzZSB0aGUgbGFzdC1idXQtb25lIGZvcgoJCXRoZSAibiIgY29tbWFuZCBhbmQgJ2hsc2VhcmNoJzogPgoJCQk6Y2FsbCBoaXN0ZGVsKCJzZWFyY2giLCAtMSkKCQkJOmxldCBALyA9IGhpc3RnZXQoInNlYXJjaCIsIC0xKQoKaGlzdGdldCh7aGlzdG9yeX0gWywge2luZGV4fV0pCQkJCSpoaXN0Z2V0KCkqCgkJVGhlIHJlc3VsdCBpcyBhIFN0cmluZywgdGhlIGVudHJ5IHdpdGggTnVtYmVyIHtpbmRleH0gZnJvbQoJCXtoaXN0b3J5fS4gIFNlZSB8aGlzdC1uYW1lc3wgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YKCQl7aGlzdG9yeX0sIGFuZCB8Omhpc3RvcnktaW5kZXhpbmd8IGZvciB7aW5kZXh9LiAgSWYgdGhlcmUgaXMKCQlubyBzdWNoIGVudHJ5LCBhbiBlbXB0eSBTdHJpbmcgaXMgcmV0dXJuZWQuICBXaGVuIHtpbmRleH0gaXMKCQlvbWl0dGVkLCB0aGUgbW9zdCByZWNlbnQgaXRlbSBmcm9tIHRoZSBoaXN0b3J5IGlzIHVzZWQuCgoJCUV4YW1wbGVzOgoJCVJlZG8gdGhlIHNlY29uZCBsYXN0IHNlYXJjaCBmcm9tIGhpc3RvcnkuID4KCQkJOmV4ZWN1dGUgJy8nIC4gaGlzdGdldCgic2VhcmNoIiwgLTIpCgo8CQlEZWZpbmUgYW4gRXggY29tbWFuZCAiOkgge251bX0iIHRoYXQgc3VwcG9ydHMgcmUtZXhlY3V0aW9uIG9mCgkJdGhlIHtudW19dGggZW50cnkgZnJvbSB0aGUgb3V0cHV0IG9mIHw6aGlzdG9yeXwuID4KCQkJOmNvbW1hbmQgLW5hcmdzPTEgSCBleGVjdXRlIGhpc3RnZXQoImNtZCIsIDArPGFyZ3M+KQo8Cmhpc3Rucih7aGlzdG9yeX0pCQkJCQkqaGlzdG5yKCkqCgkJVGhlIHJlc3VsdCBpcyB0aGUgTnVtYmVyIG9mIHRoZSBjdXJyZW50IGVudHJ5IGluIHtoaXN0b3J5fS4KCQlTZWUgfGhpc3QtbmFtZXN8IGZvciB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHtoaXN0b3J5fS4KCQlJZiBhbiBlcnJvciBvY2N1cnJlZCwgLTEgaXMgcmV0dXJuZWQuCgoJCUV4YW1wbGU6ID4KCQkJOmxldCBpbnBfaW5kZXggPSBoaXN0bnIoImV4cHIiKQo8CmhsZXhpc3RzKHtuYW1lfSkJCQkJCSpobGV4aXN0cygpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIG5vbi16ZXJvIGlmIGEgaGlnaGxpZ2h0IGdyb3VwCgkJY2FsbGVkIHtuYW1lfSBleGlzdHMuICBUaGlzIGlzIHdoZW4gdGhlIGdyb3VwIGhhcyBiZWVuCgkJZGVmaW5lZCBpbiBzb21lIHdheS4gIE5vdCBuZWNlc3NhcmlseSB3aGVuIGhpZ2hsaWdodGluZyBoYXMKCQliZWVuIGRlZmluZWQgZm9yIGl0LCBpdCBtYXkgYWxzbyBoYXZlIGJlZW4gdXNlZCBmb3IgYSBzeW50YXgKCQlpdGVtLgoJCQkJCQkJKmhpZ2hsaWdodF9leGlzdHMoKSoKCQlPYnNvbGV0ZSBuYW1lOiBoaWdobGlnaHRfZXhpc3RzKCkuCgoJCQkJCQkJKmhsSUQoKSoKaGxJRCh7bmFtZX0pCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBJRCBvZiB0aGUgaGlnaGxpZ2h0IGdyb3VwCgkJd2l0aCBuYW1lIHtuYW1lfS4gIFdoZW4gdGhlIGhpZ2hsaWdodCBncm91cCBkb2Vzbid0IGV4aXN0LAoJCXplcm8gaXMgcmV0dXJuZWQuCgkJVGhpcyBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGlnaGxpZ2h0CgkJZ3JvdXAuCUZvciBleGFtcGxlLCB0byBnZXQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlCgkJIkNvbW1lbnQiIGdyb3VwOiA+Cgk6ZWNobyBzeW5JRGF0dHIoc3luSUR0cmFucyhobElEKCJDb21tZW50IikpLCAiYmciKQo8CQkJCQkJCSpoaWdobGlnaHRJRCgpKgoJCU9ic29sZXRlIG5hbWU6IGhpZ2hsaWdodElEKCkuCgpob3N0bmFtZSgpCQkJCQkJKmhvc3RuYW1lKCkqCgkJVGhlIHJlc3VsdCBpcyBhIFN0cmluZywgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIG1hY2hpbmUgb24KCQl3aGljaCBWaW0gaXMgY3VycmVudGx5IHJ1bm5pbmcuICBNYWNoaW5lIG5hbWVzIGdyZWF0ZXIgdGhhbgoJCTI1NiBjaGFyYWN0ZXJzIGxvbmcgYXJlIHRydW5jYXRlZC4KCmljb252KHtleHByfSwge2Zyb219LCB7dG99KQkJCQkqaWNvbnYoKSoKCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyB0aGUgdGV4dCB7ZXhwcn0gY29udmVydGVkCgkJZnJvbSBlbmNvZGluZyB7ZnJvbX0gdG8gZW5jb2Rpbmcge3RvfS4KCQlXaGVuIHRoZSBjb252ZXJzaW9uIGNvbXBsZXRlbHkgZmFpbHMgYW4gZW1wdHkgc3RyaW5nIGlzCgkJcmV0dXJuZWQuICBXaGVuIHNvbWUgY2hhcmFjdGVycyBjb3VsZCBub3QgYmUgY29udmVydGVkIHRoZXkKCQlhcmUgcmVwbGFjZWQgd2l0aCAiPyIuCgkJVGhlIGVuY29kaW5nIG5hbWVzIGFyZSB3aGF0ZXZlciB0aGUgaWNvbnYoKSBsaWJyYXJ5IGZ1bmN0aW9uCgkJY2FuIGFjY2VwdCwgc2VlICI6IW1hbiAzIGljb252Ii4KCQlNb3N0IGNvbnZlcnNpb25zIHJlcXVpcmUgVmltIHRvIGJlIGNvbXBpbGVkIHdpdGggdGhlIHwraWNvbnZ8CgkJZmVhdHVyZS4gIE90aGVyd2lzZSBvbmx5IFVURi04IHRvIGxhdGluMSBjb252ZXJzaW9uIGFuZCBiYWNrCgkJY2FuIGJlIGRvbmUuCgkJVGhpcyBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IG1lc3NhZ2VzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzLAoJCW5vIG1hdHRlciB3aGF0ICdlbmNvZGluZycgaXMgc2V0IHRvLiAgV3JpdGUgdGhlIG1lc3NhZ2UgaW4KCQlVVEYtOCBhbmQgdXNlOiA+CgkJCWVjaG8gaWNvbnYodXRmOF9zdHIsICJ1dGYtOCIsICZlbmMpCjwJCU5vdGUgdGhhdCBWaW0gdXNlcyBVVEYtOCBmb3IgYWxsIFVuaWNvZGUgZW5jb2RpbmdzLCBjb252ZXJzaW9uCgkJZnJvbS90byBVQ1MtMiBpcyBhdXRvbWF0aWNhbGx5IGNoYW5nZWQgdG8gdXNlIFVURi04LiAgWW91CgkJY2Fubm90IHVzZSBVQ1MtMiBpbiBhIHN0cmluZyBhbnl3YXksIGJlY2F1c2Ugb2YgdGhlIE5VTCBieXRlcy4KCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K211bHRpX2J5dGV8IGZlYXR1cmV9CgoJCQkJCQkJKmluZGVudCgpKgppbmRlbnQoe2xudW19KQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyBpbmRlbnQgb2YgbGluZSB7bG51bX0gaW4gdGhlCgkJY3VycmVudCBidWZmZXIuICBUaGUgaW5kZW50IGlzIGNvdW50ZWQgaW4gc3BhY2VzLCB0aGUgdmFsdWUKCQlvZiAndGFic3RvcCcgaXMgcmVsZXZhbnQuICB7bG51bX0gaXMgdXNlZCBqdXN0IGxpa2UgaW4KCQl8Z2V0bGluZSgpfC4KCQlXaGVuIHtsbnVtfSBpcyBpbnZhbGlkIC0xIGlzIHJldHVybmVkLgoKCmluZGV4KHtsaXN0fSwge2V4cHJ9IFssIHtzdGFydH0gWywge2ljfV1dKQkJCSppbmRleCgpKgoJCVJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHxMaXN0fCB7bGlzdH0gd2hlcmUgdGhlIGl0ZW0gaGFzIGEKCQl2YWx1ZSBlcXVhbCB0byB7ZXhwcn0uICBUaGVyZSBpcyBubyBhdXRvbWF0aWMgY29udmVyc2lvbiwgc28KCQl0aGUgU3RyaW5nICI0IiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgTnVtYmVyIDQuICBBbmQgdGhlIG51bWJlcgoJCTQgaXMgZGlmZmVyZW50IGZyb20gdGhlIEZsb2F0IDQuMC4gIFRoZSB2YWx1ZSBvZiAnaWdub3JlY2FzZScKCQlpcyBub3QgdXNlZCBoZXJlLCBjYXNlIGFsd2F5cyBtYXR0ZXJzLgoJCUlmIHtzdGFydH0gaXMgZ2l2ZW4gdGhlbiBzdGFydCBsb29raW5nIGF0IHRoZSBpdGVtIHdpdGggaW5kZXgKCQl7c3RhcnR9IChtYXkgYmUgbmVnYXRpdmUgZm9yIGFuIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIGVuZCkuCgkJV2hlbiB7aWN9IGlzIGdpdmVuIGFuZCBpdCBpcyBub24temVybywgaWdub3JlIGNhc2UuICBPdGhlcndpc2UKCQljYXNlIG11c3QgbWF0Y2guCgkJLTEgaXMgcmV0dXJuZWQgd2hlbiB7ZXhwcn0gaXMgbm90IGZvdW5kIGluIHtsaXN0fS4KCQlFeGFtcGxlOiA+CgkJCTpsZXQgaWR4ID0gaW5kZXgod29yZHMsICJ0aGUiKQoJCQk6aWYgaW5kZXgobnVtYmVycywgMTIzKSA+PSAwCgoKaW5wdXQoe3Byb21wdH0gWywge3RleHR9IFssIHtjb21wbGV0aW9ufV1dKQkJKmlucHV0KCkqCgkJVGhlIHJlc3VsdCBpcyBhIFN0cmluZywgd2hpY2ggaXMgd2hhdGV2ZXIgdGhlIHVzZXIgdHlwZWQgb24KCQl0aGUgY29tbWFuZC1saW5lLiAgVGhlIHtwcm9tcHR9IGFyZ3VtZW50IGlzIGVpdGhlciBhIHByb21wdAoJCXN0cmluZywgb3IgYSBibGFuayBzdHJpbmcgKGZvciBubyBwcm9tcHQpLiAgQSAnXG4nIGNhbiBiZSB1c2VkCgkJaW4gdGhlIHByb21wdCB0byBzdGFydCBhIG5ldyBsaW5lLgoJCVRoZSBoaWdobGlnaHRpbmcgc2V0IHdpdGggfDplY2hvaGx8IGlzIHVzZWQgZm9yIHRoZSBwcm9tcHQuCgkJVGhlIGlucHV0IGlzIGVudGVyZWQganVzdCBsaWtlIGEgY29tbWFuZC1saW5lLCB3aXRoIHRoZSBzYW1lCgkJZWRpdGluZyBjb21tYW5kcyBhbmQgbWFwcGluZ3MuCVRoZXJlIGlzIGEgc2VwYXJhdGUgaGlzdG9yeQoJCWZvciBsaW5lcyB0eXBlZCBmb3IgaW5wdXQoKS4KCQlFeGFtcGxlOiA+CgkJCTppZiBpbnB1dCgiQ29mZmVlIG9yIGJlZXI/ICIpID09ICJiZWVyIgoJCQk6ICBlY2hvICJDaGVlcnMhIgoJCQk6ZW5kaWYKPAoJCUlmIHRoZSBvcHRpb25hbCB7dGV4dH0gYXJndW1lbnQgaXMgcHJlc2VudCBhbmQgbm90IGVtcHR5LCB0aGlzCgkJaXMgdXNlZCBmb3IgdGhlIGRlZmF1bHQgcmVwbHksIGFzIGlmIHRoZSB1c2VyIHR5cGVkIHRoaXMuCgkJRXhhbXBsZTogPgoJCQk6bGV0IGNvbG9yID0gaW5wdXQoIkNvbG9yPyAiLCAid2hpdGUiKQoKPAkJVGhlIG9wdGlvbmFsIHtjb21wbGV0aW9ufSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKCQljb21wbGV0aW9uIHN1cHBvcnRlZCBmb3IgdGhlIGlucHV0LiAgV2l0aG91dCBpdCBjb21wbGV0aW9uIGlzCgkJbm90IHBlcmZvcm1lZC4JVGhlIHN1cHBvcnRlZCBjb21wbGV0aW9uIHR5cGVzIGFyZSB0aGUgc2FtZSBhcwoJCXRoYXQgY2FuIGJlIHN1cHBsaWVkIHRvIGEgdXNlci1kZWZpbmVkIGNvbW1hbmQgdXNpbmcgdGhlCgkJIi1jb21wbGV0ZT0iIGFyZ3VtZW50LglSZWZlciB0byB8OmNvbW1hbmQtY29tcGxldGlvbnwgZm9yCgkJbW9yZSBpbmZvcm1hdGlvbi4gIEV4YW1wbGU6ID4KCQkJbGV0IGZuYW1lID0gaW5wdXQoIkZpbGU6ICIsICIiLCAiZmlsZSIpCjwKCQlOT1RFOiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIHVzZWQgaW4gYSBzdGFydHVwIGZpbGUsIGZvcgoJCXRoZSB2ZXJzaW9ucyB0aGF0IG9ubHkgcnVuIGluIEdVSSBtb2RlIChlLmcuLCB0aGUgV2luMzIgR1VJKS4KCQlOb3RlOiBXaGVuIGlucHV0KCkgaXMgY2FsbGVkIGZyb20gd2l0aGluIGEgbWFwcGluZyBpdCB3aWxsCgkJY29uc3VtZSByZW1haW5pbmcgY2hhcmFjdGVycyBmcm9tIHRoYXQgbWFwcGluZywgYmVjYXVzZSBhCgkJbWFwcGluZyBpcyBoYW5kbGVkIGxpa2UgdGhlIGNoYXJhY3RlcnMgd2VyZSB0eXBlZC4KCQlVc2UgfGlucHV0c2F2ZSgpfCBiZWZvcmUgaW5wdXQoKSBhbmQgfGlucHV0cmVzdG9yZSgpfAoJCWFmdGVyIGlucHV0KCkgdG8gYXZvaWQgdGhhdC4gIEFub3RoZXIgc29sdXRpb24gaXMgdG8gYXZvaWQKCQl0aGF0IGZ1cnRoZXIgY2hhcmFjdGVycyBmb2xsb3cgaW4gdGhlIG1hcHBpbmcsIGUuZy4sIGJ5IHVzaW5nCgkJfDpleGVjdXRlfCBvciB8Om5vcm1hbHwuCgoJCUV4YW1wbGUgd2l0aCBhIG1hcHBpbmc6ID4KCQkJOm5tYXAgXHggOmNhbGwgR2V0Rm9vKCk8Q1I+OmV4ZSAiLyIgLiBGb288Q1I+CgkJCTpmdW5jdGlvbiBHZXRGb28oKQoJCQk6ICBjYWxsIGlucHV0c2F2ZSgpCgkJCTogIGxldCBnOkZvbyA9IGlucHV0KCJlbnRlciBzZWFyY2ggcGF0dGVybjogIikKCQkJOiAgY2FsbCBpbnB1dHJlc3RvcmUoKQoJCQk6ZW5kZnVuY3Rpb24KCmlucHV0ZGlhbG9nKHtwcm9tcHR9IFssIHt0ZXh0fSBbLCB7Y2FuY2VscmV0dXJufV1dKQkJKmlucHV0ZGlhbG9nKCkqCgkJTGlrZSB8aW5wdXQoKXwsIGJ1dCB3aGVuIHRoZSBHVUkgaXMgcnVubmluZyBhbmQgdGV4dCBkaWFsb2dzCgkJYXJlIHN1cHBvcnRlZCwgYSBkaWFsb2cgd2luZG93IHBvcHMgdXAgdG8gaW5wdXQgdGhlIHRleHQuCgkJRXhhbXBsZTogPgoJCSAgIDpsZXQgbiA9IGlucHV0ZGlhbG9nKCJ2YWx1ZSBmb3Igc2hpZnR3aWR0aCIsIHNoaWZ0d2lkdGgoKSkKCQkgICA6aWYgbiAhPSAiIgoJCSAgIDogIGxldCAmc3cgPSBuCgkJICAgOmVuZGlmCjwJCVdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxsZWQge2NhbmNlbHJldHVybn0gaXMgcmV0dXJuZWQuICBXaGVuCgkJb21pdHRlZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgkJSGl0dGluZyA8RW50ZXI+IHdvcmtzIGxpa2UgcHJlc3NpbmcgdGhlIE9LIGJ1dHRvbi4gIEhpdHRpbmcKCQk8RXNjPiB3b3JrcyBsaWtlIHByZXNzaW5nIHRoZSBDYW5jZWwgYnV0dG9uLgoJCU5PVEU6IENvbW1hbmQtbGluZSBjb21wbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCgppbnB1dGxpc3Qoe3RleHRsaXN0fSkJCQkJCSppbnB1dGxpc3QoKSoKCQl7dGV4dGxpc3R9IG11c3QgYmUgYSB8TGlzdHwgb2Ygc3RyaW5ncy4gIFRoaXMgfExpc3R8IGlzCgkJZGlzcGxheWVkLCBvbmUgc3RyaW5nIHBlciBsaW5lLiAgVGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0bwoJCWVudGVyIGEgbnVtYmVyLCB3aGljaCBpcyByZXR1cm5lZC4KCQlUaGUgdXNlciBjYW4gYWxzbyBzZWxlY3QgYW4gaXRlbSBieSBjbGlja2luZyBvbiBpdCB3aXRoIHRoZQoJCW1vdXNlLglGb3IgdGhlIGZpcnN0IHN0cmluZyAwIGlzIHJldHVybmVkLiAgV2hlbiBjbGlja2luZwoJCWFib3ZlIHRoZSBmaXJzdCBpdGVtIGEgbmVnYXRpdmUgbnVtYmVyIGlzIHJldHVybmVkLiAgV2hlbgoJCWNsaWNraW5nIG9uIHRoZSBwcm9tcHQgb25lIG1vcmUgdGhhbiB0aGUgbGVuZ3RoIG9mIHt0ZXh0bGlzdH0KCQlpcyByZXR1cm5lZC4KCQlNYWtlIHN1cmUge3RleHRsaXN0fSBoYXMgbGVzcyB0aGFuICdsaW5lcycgZW50cmllcywgb3RoZXJ3aXNlCgkJaXQgd29uJ3Qgd29yay4JSXQncyBhIGdvb2QgaWRlYSB0byBwdXQgdGhlIGVudHJ5IG51bWJlciBhdAoJCXRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLiAgQW5kIHB1dCBhIHByb21wdCBpbiB0aGUgZmlyc3QgaXRlbS4KCQlFeGFtcGxlOiA+CgkJCWxldCBjb2xvciA9IGlucHV0bGlzdChbJ1NlbGVjdCBjb2xvcjonLCAnMS4gcmVkJywKCQkJCVwgJzIuIGdyZWVuJywgJzMuIGJsdWUnXSkKCmlucHV0cmVzdG9yZSgpCQkJCQkJKmlucHV0cmVzdG9yZSgpKgoJCVJlc3RvcmUgdHlwZWFoZWFkIHRoYXQgd2FzIHNhdmVkIHdpdGggYSBwcmV2aW91cyB8aW5wdXRzYXZlKCl8LgoJCVNob3VsZCBiZSBjYWxsZWQgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIGlucHV0c2F2ZSgpIGlzCgkJY2FsbGVkLiAgQ2FsbGluZyBpdCBtb3JlIG9mdGVuIGlzIGhhcm1sZXNzIHRob3VnaC4KCQlSZXR1cm5zIDEgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlc3RvcmUsIDAgb3RoZXJ3aXNlLgoKaW5wdXRzYXZlKCkJCQkJCQkqaW5wdXRzYXZlKCkqCgkJUHJlc2VydmUgdHlwZWFoZWFkIChhbHNvIGZyb20gbWFwcGluZ3MpIGFuZCBjbGVhciBpdCwgc28gdGhhdAoJCWEgZm9sbG93aW5nIHByb21wdCBnZXRzIGlucHV0IGZyb20gdGhlIHVzZXIuICBTaG91bGQgYmUKCQlmb2xsb3dlZCBieSBhIG1hdGNoaW5nIGlucHV0cmVzdG9yZSgpIGFmdGVyIHRoZSBwcm9tcHQuICBDYW4KCQliZSB1c2VkIHNldmVyYWwgdGltZXMsIGluIHdoaWNoIGNhc2UgdGhlcmUgbXVzdCBiZSBqdXN0IGFzCgkJbWFueSBpbnB1dHJlc3RvcmUoKSBjYWxscy4KCQlSZXR1cm5zIDEgd2hlbiBvdXQgb2YgbWVtb3J5LCAwIG90aGVyd2lzZS4KCmlucHV0c2VjcmV0KHtwcm9tcHR9IFssIHt0ZXh0fV0pCQkJKmlucHV0c2VjcmV0KCkqCgkJVGhpcyBmdW5jdGlvbiBhY3RzIG11Y2ggbGlrZSB0aGUgfGlucHV0KCl8IGZ1bmN0aW9uIHdpdGggYnV0CgkJdHdvIGV4Y2VwdGlvbnM6CgkJYSkgdGhlIHVzZXIncyByZXNwb25zZSB3aWxsIGJlIGRpc3BsYXllZCBhcyBhIHNlcXVlbmNlIG9mCgkJYXN0ZXJpc2tzICgiKiIpIHRoZXJlYnkga2VlcGluZyB0aGUgZW50cnkgc2VjcmV0LCBhbmQKCQliKSB0aGUgdXNlcidzIHJlc3BvbnNlIHdpbGwgbm90IGJlIHJlY29yZGVkIG9uIHRoZSBpbnB1dAoJCXxoaXN0b3J5fCBzdGFjay4KCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyB3aGF0ZXZlciB0aGUgdXNlciBhY3R1YWxseQoJCXR5cGVkIG9uIHRoZSBjb21tYW5kLWxpbmUgaW4gcmVzcG9uc2UgdG8gdGhlIGlzc3VlZCBwcm9tcHQuCgkJTk9URTogQ29tbWFuZC1saW5lIGNvbXBsZXRpb24gaXMgbm90IHN1cHBvcnRlZC4KCmluc2VydCh7bGlzdH0sIHtpdGVtfSBbLCB7aWR4fV0pCQkJKmluc2VydCgpKgoJCUluc2VydCB7aXRlbX0gYXQgdGhlIHN0YXJ0IG9mIHxMaXN0fCB7bGlzdH0uCgkJSWYge2lkeH0gaXMgc3BlY2lmaWVkIGluc2VydCB7aXRlbX0gYmVmb3JlIHRoZSBpdGVtIHdpdGggaW5kZXgKCQl7aWR4fS4JSWYge2lkeH0gaXMgemVybyBpdCBnb2VzIGJlZm9yZSB0aGUgZmlyc3QgaXRlbSwganVzdAoJCWxpa2Ugb21pdHRpbmcge2lkeH0uICBBIG5lZ2F0aXZlIHtpZHh9IGlzIGFsc28gcG9zc2libGUsIHNlZQoJCXxsaXN0LWluZGV4fC4gIC0xIGluc2VydHMganVzdCBiZWZvcmUgdGhlIGxhc3QgaXRlbS4KCQlSZXR1cm5zIHRoZSByZXN1bHRpbmcgfExpc3R8LiAgRXhhbXBsZXM6ID4KCQkJOmxldCBteWxpc3QgPSBpbnNlcnQoWzIsIDMsIDVdLCAxKQoJCQk6Y2FsbCBpbnNlcnQobXlsaXN0LCA0LCAtMSkKCQkJOmNhbGwgaW5zZXJ0KG15bGlzdCwgNiwgbGVuKG15bGlzdCkpCjwJCVRoZSBsYXN0IGV4YW1wbGUgY2FuIGJlIGRvbmUgc2ltcGxlciB3aXRoIHxhZGQoKXwuCgkJTm90ZSB0aGF0IHdoZW4ge2l0ZW19IGlzIGEgfExpc3R8IGl0IGlzIGluc2VydGVkIGFzIGEgc2luZ2xlCgkJaXRlbS4gIFVzZSB8ZXh0ZW5kKCl8IHRvIGNvbmNhdGVuYXRlIHxMaXN0c3wuCgppbnZlcnQoe2V4cHJ9KQkJCQkJCSppbnZlcnQoKSoKCQlCaXR3aXNlIGludmVydC4gIFRoZSBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gYSBudW1iZXIuICBBCgkJTGlzdCwgRGljdCBvciBGbG9hdCBhcmd1bWVudCBjYXVzZXMgYW4gZXJyb3IuICBFeGFtcGxlOiA+CgkJCTpsZXQgYml0cyA9IGludmVydChiaXRzKQoKaXNkaXJlY3Rvcnkoe2RpcmVjdG9yeX0pCQkJCSppc2RpcmVjdG9yeSgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIG5vbi16ZXJvIHdoZW4gYSBkaXJlY3RvcnkKCQl3aXRoIHRoZSBuYW1lIHtkaXJlY3Rvcnl9IGV4aXN0cy4gIElmIHtkaXJlY3Rvcnl9IGRvZXNuJ3QKCQlleGlzdCwgb3IgaXNuJ3QgYSBkaXJlY3RvcnksIHRoZSByZXN1bHQgaXMgRkFMU0UuICB7ZGlyZWN0b3J5fQoJCWlzIGFueSBleHByZXNzaW9uLCB3aGljaCBpcyB1c2VkIGFzIGEgU3RyaW5nLgoKaXNsb2NrZWQoe2V4cHJ9KQkJCQkJKmlzbG9ja2VkKCkqICpFNzg2KgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIG5vbi16ZXJvIHdoZW4ge2V4cHJ9IGlzIHRoZQoJCW5hbWUgb2YgYSBsb2NrZWQgdmFyaWFibGUuCgkJe2V4cHJ9IG11c3QgYmUgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSwgfExpc3R8IGl0ZW0gb3IKCQl8RGljdGlvbmFyeXwgZW50cnksIG5vdCB0aGUgdmFyaWFibGUgaXRzZWxmISAgRXhhbXBsZTogPgoJCQk6bGV0IGFsaXN0ID0gWzAsIFsnYScsICdiJ10sIDIsIDNdCgkJCTpsb2NrdmFyIDEgYWxpc3QKCQkJOmVjaG8gaXNsb2NrZWQoJ2FsaXN0JykJCSIgMQoJCQk6ZWNobyBpc2xvY2tlZCgnYWxpc3RbMV0nKQkiIDAKCjwJCVdoZW4ge2V4cHJ9IGlzIGEgdmFyaWFibGUgdGhhdCBkb2VzIG5vdCBleGlzdCB5b3UgZ2V0IGFuIGVycm9yCgkJbWVzc2FnZS4gIFVzZSB8ZXhpc3RzKCl8IHRvIGNoZWNrIGZvciBleGlzdGVuY2UuCgppdGVtcyh7ZGljdH0pCQkJCQkJKml0ZW1zKCkqCgkJUmV0dXJuIGEgfExpc3R8IHdpdGggYWxsIHRoZSBrZXktdmFsdWUgcGFpcnMgb2Yge2RpY3R9LiAgRWFjaAoJCXxMaXN0fCBpdGVtIGlzIGEgbGlzdCB3aXRoIHR3byBpdGVtczogdGhlIGtleSBvZiBhIHtkaWN0fQoJCWVudHJ5IGFuZCB0aGUgdmFsdWUgb2YgdGhpcyBlbnRyeS4gIFRoZSB8TGlzdHwgaXMgaW4gYXJiaXRyYXJ5CgkJb3JkZXIuCgoKam9iX3N0YXJ0KHtjb21tYW5kfSBbLCB7b3B0aW9uc31dKQkJCQkqam9iX3N0YXJ0KCkqCgkJU3RhcnQgYSBqb2IgYW5kIHJldHVybiBhIEpvYiBvYmplY3QuICBVbmxpa2UgfHN5c3RlbSgpfCBhbmQKCQl8OiFjbWR8IHRoaXMgZG9lcyBub3Qgd2FpdCBmb3IgdGhlIGpvYiB0byBmaW5pc2guCgoJCXtjb21tYW5kfSBjYW4gYmUgYSBzdHJpbmcuICBUaGlzIHdvcmtzIGJlc3Qgb24gTVMtV2luZG93cy4gIE9uCgkJVW5peCBpdCBpcyBzcGxpdCB1cCBpbiB3aGl0ZS1zZXBhcmF0ZWQgcGFydHMgdG8gYmUgcGFzc2VkIHRvCgkJZXhlY3ZwKCkuICBBcmd1bWVudHMgaW4gZG91YmxlIHF1b3RlcyBjYW4gY29udGFpbiB3aGl0ZSBzcGFjZS4KCgkJe2NvbW1hbmR9IGNhbiBiZSBhIGxpc3QsIHdoZXJlIHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBleGVjdXRhYmxlCgkJYW5kIGZ1cnRoZXIgaXRlbXMgYXJlIHRoZSBhcmd1bWVudHMuICBBbGwgaXRlbXMgYXJlIGNvbnZlcnRlZAoJCXRvIFN0cmluZy4gIFRoaXMgd29ya3MgYmVzdCBvbiBVbml4LgoKCQlUaGUgY29tbWFuZCBpcyBleGVjdXRlZCBkaXJlY3RseSwgbm90IHRocm91Z2ggYSBzaGVsbCwgdGhlCgkJJ3NoZWxsJyBvcHRpb24gaXMgbm90IHVzZWQuICBUbyB1c2UgdGhlIHNoZWxsOiA+CglsZXQgam9iID0gam9iX3N0YXJ0KFsiL2Jpbi9zaCIsICItYyIsICJlY2hvIGhlbGxvIl0pCjwJCU9yOiA+CglsZXQgam9iID0gam9iX3N0YXJ0KCcvYmluL3NoIC1jICJlY2hvIGhlbGxvIicpCjwJCUhvd2V2ZXIsIHRoZSBzdGF0dXMgb2YgdGhlIGpvYiB3aWxsIG5vdyBiZSB0aGUgc3RhdHVzIG9mIHRoZQoJCXNoZWxsLCBhbmQgc3RvcHBpbmcgdGhlIGpvYiBtZWFucyBzdG9wcGluZyB0aGUgc2hlbGwgYW5kIHRoZQoJCWNvbW1hbmQgbWF5IGNvbnRpbnVlIHRvIHJ1bi4KCgkJT24gVW5peCAkUEFUSCBpcyB1c2VkIHRvIHNlYXJjaCBmb3IgdGhlIGV4ZWN1dGFibGUgb25seSB3aGVuCgkJdGhlIGNvbW1hbmQgZG9lcyBub3QgY29udGFpbiBhIHNsYXNoLgoKCQlUaGUgam9iIHdpbGwgdXNlIHRoZSBzYW1lIHRlcm1pbmFsIGFzIFZpbS4gIElmIGl0IHJlYWRzIGZyb20KCQlzdGRpbiB0aGUgam9iIGFuZCBWaW0gd2lsbCBiZSBmaWdodGluZyBvdmVyIGlucHV0LCB0aGF0CgkJZG9lc24ndCB3b3JrLiAgUmVkaXJlY3Qgc3RkaW4gYW5kIHN0ZG91dCB0byBhdm9pZCBwcm9ibGVtczogPgoJbGV0IGpvYiA9IGpvYl9zdGFydChbJ3NoJywgJy1jJywgIm15c2VydmVyIDwvZGV2L251bGwgPi9kZXYvbnVsbCJdKQo8CgkJVGhlIHJldHVybmVkIEpvYiBvYmplY3QgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBzdGF0dXMgd2l0aAoJCXxqb2Jfc3RhdHVzKCl8IGFuZCBzdG9wIHRoZSBqb2Igd2l0aCB8am9iX3N0b3AoKXwuCgoJCXtvcHRpb25zfSBtdXN0IGJlIGEgRGljdGlvbmFyeS4gIEl0IGNhbiBjb250YWluIHRoZXNlIG9wdGlvbmFsCgkJaXRlbXM6CgkJCWtpbGxvbmV4aXQJV2hlbiBub24temVybyBraWxsIHRoZSBqb2Igd2hlbiBWaW0KCQkJCQlleGl0cy4gKGRlZmF1bHQ6IDAsIGRvbid0IGtpbGwpCgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrY2hhbm5lbHwgZmVhdHVyZX0KCmpvYl9zdGF0dXMoe2pvYn0pCQkJCQkJKmpvYl9zdGF0dXMoKSoKCQlSZXR1cm5zIGEgU3RyaW5nIHdpdGggdGhlIHN0YXR1cyBvZiB7am9ifToKCQkJInJ1biIJam9iIGlzIHJ1bm5pbmcKCQkJImZhaWwiCWpvYiBmYWlsZWQgdG8gc3RhcnQKCQkJImRlYWQiCWpvYiBkaWVkIG9yIHdhcyBzdG9wcGVkIGFmdGVyIHJ1bm5pbmcKCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtjaGFubmVsfCBmZWF0dXJlfQoKam9iX3N0b3Aoe2pvYn0gWywge2hvd31dKQkJCQkJKmpvYl9zdG9wKCkqCgkJU3RvcCB0aGUge2pvYn0uICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSBqb2IuCgoJCVdoZW4ge2hvd30gaXMgb21pdHRlZCBvciBpcyAidGVybSIgdGhlIGpvYiB3aWxsIGJlIHRlcm1pbmF0ZWQKCQlub3JtYWxseS4gIEZvciBVbml4IFNJR1RFUk0gaXMgc2VudC4KCQlPdGhlciB2YWx1ZXM6CgkJCSJodXAiCVVuaXg6IFNJR0hVUAoJCQkicXVpdCIJVW5peDogU0lHUVVJVAoJCQkia2lsbCIJVW5peDogU0lHS0lMTCAoc3Ryb25nZXN0IHdheSB0byBzdG9wKQoJCQludW1iZXIJVW5peDogc2lnbmFsIHdpdGggdGhhdCBudW1iZXIKCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlcjogMSBpZiB0aGUgb3BlcmF0aW9uIGNvdWxkIGJlIGV4ZWN1dGVkLAoJCTAgaWYgImhvdyIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3lzdGVtLgoJCU5vdGUgdGhhdCBldmVuIHdoZW4gdGhlIG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQsIHdoZXRoZXIgdGhlCgkJam9iIHdhcyBhY3R1YWxseSBzdG9wcGVkIG5lZWRzIHRvIGJlIGNoZWNrZWQgd2l0aAoJCWpvYl9zdGF0dXMoKS4KCQlUaGUgb3BlcmF0aW9uIHdpbGwgZXZlbiBiZSBkb25lIHdoZW4gdGhlIGpvYiB3YXNuJ3QgcnVubmluZy4KCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtjaGFubmVsfCBmZWF0dXJlfQoKam9pbih7bGlzdH0gWywge3NlcH1dKQkJCQkJKmpvaW4oKSoKCQlKb2luIHRoZSBpdGVtcyBpbiB7bGlzdH0gdG9nZXRoZXIgaW50byBvbmUgU3RyaW5nLgoJCVdoZW4ge3NlcH0gaXMgc3BlY2lmaWVkIGl0IGlzIHB1dCBpbiBiZXR3ZWVuIHRoZSBpdGVtcy4gIElmCgkJe3NlcH0gaXMgb21pdHRlZCBhIHNpbmdsZSBzcGFjZSBpcyB1c2VkLgoJCU5vdGUgdGhhdCB7c2VwfSBpcyBub3QgYWRkZWQgYXQgdGhlIGVuZC4gIFlvdSBtaWdodCB3YW50IHRvCgkJYWRkIGl0IHRoZXJlIHRvbzogPgoJCQlsZXQgbGluZXMgPSBqb2luKG15bGlzdCwgIlxuIikgLiAiXG4iCjwJCVN0cmluZyBpdGVtcyBhcmUgdXNlZCBhcy1pcy4gIHxMaXN0c3wgYW5kIHxEaWN0aW9uYXJpZXN8IGFyZQoJCWNvbnZlcnRlZCBpbnRvIGEgc3RyaW5nIGxpa2Ugd2l0aCB8c3RyaW5nKCl8LgoJCVRoZSBvcHBvc2l0ZSBmdW5jdGlvbiBpcyB8c3BsaXQoKXwuCgpqc29uZGVjb2RlKHtzdHJpbmd9KQkJCQkJKmpzb25kZWNvZGUoKSoKCQlUaGlzIHBhcnNlcyBhIEpTT04gZm9ybWF0dGVkIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgZXF1aXZhbGVudAoJCWluIFZpbSB2YWx1ZXMuICBTZWUgfGpzb25lbmNvZGUoKXwgZm9yIHRoZSByZWxhdGlvbiBiZXR3ZWVuCgkJSlNPTiBhbmQgVmltIHZhbHVlcy4KCQlUaGUgZGVjb2RpbmcgaXMgcGVybWlzc2l2ZToKCQktIEEgdHJhaWxpbmcgY29tbWEgaW4gYW4gYXJyYXkgYW5kIG9iamVjdCBpcyBpZ25vcmVkLgoJCS0gQW4gZW1wdHkgaXRlbSBpbiBhbiBhcnJheSwgdHdvIGNvbW1hcyB3aXRoIG5vdGhpbmcgb3Igd2hpdGUKCQkgIHNwYWNlIGluIGJldHdlZW4sIHJlc3VsdHMgaW4gdjpub25lLgoJCS0gV2hlbiBhbiBvYmplY3QgbWVtYmVyIG5hbWUgaXMgbm90IGEgc3RyaW5nIGl0IGlzIGNvbnZlcnRlZAoJCSAgdG8gYSBzdHJpbmcuICBFLmcuIHRoZSBudW1iZXIgMTIzIGlzIHVzZWQgYXMgdGhlIHN0cmluZwoJCSAgIjEyMyIuCgkJLSBNb3JlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgYXJlIHJlY29nbml6ZWQsIGUuZy4gIjEuIiBmb3IKCQkgICIxLjAiLgoJCVRoZSByZXN1bHQgbXVzdCBiZSBhIHZhbGlkIFZpbSB0eXBlOgoJCS0gQW4gZW1wdHkgb2JqZWN0IG1lbWJlciBuYW1lIGlzIG5vdCBhbGxvd2VkLgoJCS0gRHVwbGljYXRlIG9iamVjdCBtZW1iZXIgbmFtZXMgYXJlIG5vdCBhbGxvd2VkLgoKanNvbmVuY29kZSh7ZXhwcn0pCQkJCQkqanNvbmVuY29kZSgpKgoJCUVuY29kZSB7ZXhwcn0gYXMgSlNPTiBhbmQgcmV0dXJuIHRoaXMgYXMgYSBzdHJpbmcuCgkJVGhlIGVuY29kaW5nIGlzIHNwZWNpZmllZCBpbjoKCQlodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzE1OS5odG1sCgkJVmltIHZhbHVlcyBhcmUgY29udmVydGVkIGFzIGZvbGxvd3M6CgkJICAgTnVtYmVyCQlkZWNpbWFsIG51bWJlcgoJCSAgIEZsb2F0CQlmbG9hdGluZyBwb2ludCBudW1iZXIKCQkgICBTdHJpbmcJCWluIGRvdWJsZSBxdW90ZXMgKHBvc3NpYmx5IG51bGwpCgkJICAgRnVuY3JlZgkJbm90IHBvc3NpYmxlLCBlcnJvcgoJCSAgIExpc3QJCQlhcyBhbiBhcnJheSAocG9zc2libHkgbnVsbCk7IHdoZW4KCQkgICAJCQl1c2VkIHJlY3Vyc2l2ZWx5OiBbXQoJCSAgIERpY3QJCQlhcyBhbiBvYmplY3QgKHBvc3NpYmx5IG51bGwpOyB3aGVuCgkJICAgCQkJdXNlZCByZWN1cnNpdmVseToge30KCQkgICB2OmZhbHNlCQkiZmFsc2UiCgkJICAgdjp0cnVlCQkidHJ1ZSIKCQkgICB2Om5vbmUJCW5vdGhpbmcKCQkgICB2Om51bGwJCSJudWxsIgoJCU5vdGUgdGhhdCB1c2luZyB2Om5vbmUgaXMgcGVybWl0dGVkLCBhbHRob3VnaCB0aGUgSlNPTgoJCXN0YW5kYXJkIGRvZXMgbm90IGFsbG93IGVtcHR5IGl0ZW1zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvcgoJCW9taXR0aW5nIGl0ZW1zIGluIGFuIGFycmF5OgoJCQlbMCwsLCwsNV0gfgoJCVRoaXMgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuOgoJCQlbMCxudWxsLG51bGwsbnVsbCxudWxsLDVdIH4KCQlCdXQgYSBzdHJpY3QgSlNPTiBwYXJzZXIgd2lsbCBub3QgYWNjZXB0IGl0LgoKa2V5cyh7ZGljdH0pCQkJCQkJKmtleXMoKSoKCQlSZXR1cm4gYSB8TGlzdHwgd2l0aCBhbGwgdGhlIGtleXMgb2Yge2RpY3R9LiAgVGhlIHxMaXN0fCBpcyBpbgoJCWFyYml0cmFyeSBvcmRlci4KCgkJCQkJCQkqbGVuKCkqICpFNzAxKgpsZW4oe2V4cHJ9KQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBhcmd1bWVudC4KCQlXaGVuIHtleHByfSBpcyBhIFN0cmluZyBvciBhIE51bWJlciB0aGUgbGVuZ3RoIGluIGJ5dGVzIGlzCgkJdXNlZCwgYXMgd2l0aCB8c3RybGVuKCl8LgoJCVdoZW4ge2V4cHJ9IGlzIGEgfExpc3R8IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHxMaXN0fCBpcwoJCXJldHVybmVkLgoJCVdoZW4ge2V4cHJ9IGlzIGEgfERpY3Rpb25hcnl8IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUKCQl8RGljdGlvbmFyeXwgaXMgcmV0dXJuZWQuCgkJT3RoZXJ3aXNlIGFuIGVycm9yIGlzIGdpdmVuLgoKCQkJCQkJKmxpYmNhbGwoKSogKkUzNjQqICpFMzY4KgpsaWJjYWxsKHtsaWJuYW1lfSwge2Z1bmNuYW1lfSwge2FyZ3VtZW50fSkKCQlDYWxsIGZ1bmN0aW9uIHtmdW5jbmFtZX0gaW4gdGhlIHJ1bi10aW1lIGxpYnJhcnkge2xpYm5hbWV9CgkJd2l0aCBzaW5nbGUgYXJndW1lbnQge2FyZ3VtZW50fS4KCQlUaGlzIGlzIHVzZWZ1bCB0byBjYWxsIGZ1bmN0aW9ucyBpbiBhIGxpYnJhcnkgdGhhdCB5b3UKCQllc3BlY2lhbGx5IG1hZGUgdG8gYmUgdXNlZCB3aXRoIFZpbS4gIFNpbmNlIG9ubHkgb25lIGFyZ3VtZW50CgkJaXMgcG9zc2libGUsIGNhbGxpbmcgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMgaXMgcmF0aGVyCgkJbGltaXRlZC4KCQlUaGUgcmVzdWx0IGlzIHRoZSBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLiAgSWYgdGhlCgkJZnVuY3Rpb24gcmV0dXJucyBOVUxMLCB0aGlzIHdpbGwgYXBwZWFyIGFzIGFuIGVtcHR5IHN0cmluZyAiIgoJCXRvIFZpbS4KCQlJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciwgdXNlIGxpYmNhbGxucigpIQoJCUlmIHthcmd1bWVudH0gaXMgYSBudW1iZXIsIGl0IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXMgYW4KCQlpbnQ7IGlmIHthcmd1bWVudH0gaXMgYSBzdHJpbmcsIGl0IGlzIHBhc3NlZCBhcyBhCgkJbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KCQlUaGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCBpbiB8cmVzdHJpY3RlZC1tb2RlfC4KCgkJbGliY2FsbCgpIGFsbG93cyB5b3UgdG8gd3JpdGUgeW91ciBvd24gJ3BsdWctaW4nIGV4dGVuc2lvbnMgdG8KCQlWaW0gd2l0aG91dCBoYXZpbmcgdG8gcmVjb21waWxlIHRoZSBwcm9ncmFtLiAgSXQgaXMgTk9UIGEKCQltZWFucyB0byBjYWxsIHN5c3RlbSBmdW5jdGlvbnMhICBJZiB5b3UgdHJ5IHRvIGRvIHNvIFZpbSB3aWxsCgkJdmVyeSBwcm9iYWJseSBjcmFzaC4KCgkJRm9yIFdpbjMyLCB0aGUgZnVuY3Rpb25zIHlvdSB3cml0ZSBtdXN0IGJlIHBsYWNlZCBpbiBhIERMTAoJCWFuZCB1c2UgdGhlIG5vcm1hbCBDIGNhbGxpbmcgY29udmVudGlvbiAoTk9UIFBhc2NhbCB3aGljaCBpcwoJCXVzZWQgaW4gV2luZG93cyBTeXN0ZW0gRExMcykuICBUaGUgZnVuY3Rpb24gbXVzdCB0YWtlIGV4YWN0bHkKCQlvbmUgcGFyYW1ldGVyLCBlaXRoZXIgYSBjaGFyYWN0ZXIgcG9pbnRlciBvciBhIGxvbmcgaW50ZWdlciwKCQlhbmQgbXVzdCByZXR1cm4gYSBjaGFyYWN0ZXIgcG9pbnRlciBvciBOVUxMLiAgVGhlIGNoYXJhY3RlcgoJCXBvaW50ZXIgcmV0dXJuZWQgbXVzdCBwb2ludCB0byBtZW1vcnkgdGhhdCB3aWxsIHJlbWFpbiB2YWxpZAoJCWFmdGVyIHRoZSBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgKGUuZy4gaW4gc3RhdGljIGRhdGEgaW4gdGhlCgkJRExMKS4gIElmIGl0IHBvaW50cyB0byBhbGxvY2F0ZWQgbWVtb3J5LCB0aGF0IG1lbW9yeSB3aWxsCgkJbGVhayBhd2F5LiAgVXNpbmcgYSBzdGF0aWMgYnVmZmVyIGluIHRoZSBmdW5jdGlvbiBzaG91bGQgd29yaywKCQlpdCdzIHRoZW4gZnJlZWQgd2hlbiB0aGUgRExMIGlzIHVubG9hZGVkLgoKCQlXQVJOSU5HOiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi12YWxpZCBwb2ludGVyLCBWaW0gbWF5CgkJY3Jhc2ghCVRoaXMgYWxzbyBoYXBwZW5zIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbnVtYmVyLAoJCWJlY2F1c2UgVmltIHRoaW5rcyBpdCdzIGEgcG9pbnRlci4KCQlGb3IgV2luMzIgc3lzdGVtcywge2xpYm5hbWV9IHNob3VsZCBiZSB0aGUgZmlsZW5hbWUgb2YgdGhlIERMTAoJCXdpdGhvdXQgdGhlICIuRExMIiBzdWZmaXguICBBIGZ1bGwgcGF0aCBpcyBvbmx5IHJlcXVpcmVkIGlmCgkJdGhlIERMTCBpcyBub3QgaW4gdGhlIHVzdWFsIHBsYWNlcy4KCQlGb3IgVW5peDogV2hlbiBjb21waWxpbmcgeW91ciBvd24gcGx1Z2lucywgcmVtZW1iZXIgdGhhdCB0aGUKCQlvYmplY3QgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGFzIHBvc2l0aW9uLWluZGVwZW5kZW50ICgnUElDJykuCgkJe29ubHkgaW4gV2luMzIgYW5kIHNvbWUgVW5peCB2ZXJzaW9ucywgd2hlbiB0aGUgfCtsaWJjYWxsfAoJCWZlYXR1cmUgaXMgcHJlc2VudH0KCQlFeGFtcGxlczogPgoJCQk6ZWNobyBsaWJjYWxsKCJsaWJjLnNvIiwgImdldGVudiIsICJIT01FIikKPAoJCQkJCQkJKmxpYmNhbGxucigpKgpsaWJjYWxsbnIoe2xpYm5hbWV9LCB7ZnVuY25hbWV9LCB7YXJndW1lbnR9KQoJCUp1c3QgbGlrZSB8bGliY2FsbCgpfCwgYnV0IHVzZWQgZm9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuCgkJaW50IGluc3RlYWQgb2YgYSBzdHJpbmcuCgkJe29ubHkgaW4gV2luMzIgb24gc29tZSBVbml4IHZlcnNpb25zLCB3aGVuIHRoZSB8K2xpYmNhbGx8CgkJZmVhdHVyZSBpcyBwcmVzZW50fQoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIGxpYmNhbGxucigiL3Vzci9saWIvbGliYy5zbyIsICJnZXRwaWQiLCAiIikKCQkJOmNhbGwgbGliY2FsbG5yKCJsaWJjLnNvIiwgInByaW50ZiIsICJIZWxsbyBXb3JsZCFcbiIpCgkJCTpjYWxsIGxpYmNhbGxucigibGliYy5zbyIsICJzbGVlcCIsIDEwKQo8CgkJCQkJCQkqbGluZSgpKgpsaW5lKHtleHByfSkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaWxlCgkJcG9zaXRpb24gZ2l2ZW4gd2l0aCB7ZXhwcn0uICBUaGUgYWNjZXB0ZWQgcG9zaXRpb25zIGFyZToKCQkgICAgLgkgICAgdGhlIGN1cnNvciBwb3NpdGlvbgoJCSAgICAkCSAgICB0aGUgbGFzdCBsaW5lIGluIHRoZSBjdXJyZW50IGJ1ZmZlcgoJCSAgICAneAkgICAgcG9zaXRpb24gb2YgbWFyayB4IChpZiB0aGUgbWFyayBpcyBub3Qgc2V0LCAwIGlzCgkJCSAgICByZXR1cm5lZCkKCQkgICAgdzAJICAgIGZpcnN0IGxpbmUgdmlzaWJsZSBpbiBjdXJyZW50IHdpbmRvdwoJCSAgICB3JAkgICAgbGFzdCBsaW5lIHZpc2libGUgaW4gY3VycmVudCB3aW5kb3cKCQkgICAgdgkgICAgSW4gVmlzdWFsIG1vZGU6IHRoZSBzdGFydCBvZiB0aGUgVmlzdWFsIGFyZWEgKHRoZQoJCQkgICAgY3Vyc29yIGlzIHRoZSBlbmQpLiAgV2hlbiBub3QgaW4gVmlzdWFsIG1vZGUKCQkJICAgIHJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbi4gIERpZmZlcnMgZnJvbSB8Jzx8IGluCgkJCSAgICB0aGF0IGl0J3MgdXBkYXRlZCByaWdodCBhd2F5LgoJCU5vdGUgdGhhdCBhIG1hcmsgaW4gYW5vdGhlciBmaWxlIGNhbiBiZSB1c2VkLiAgVGhlIGxpbmUgbnVtYmVyCgkJdGhlbiBhcHBsaWVzIHRvIGFub3RoZXIgYnVmZmVyLgoJCVRvIGdldCB0aGUgY29sdW1uIG51bWJlciB1c2UgfGNvbCgpfC4gIFRvIGdldCBib3RoIHVzZQoJCXxnZXRwb3MoKXwuCgkJRXhhbXBsZXM6ID4KCQkJbGluZSgiLiIpCQlsaW5lIG51bWJlciBvZiB0aGUgY3Vyc29yCgkJCWxpbmUoIid0IikJCWxpbmUgbnVtYmVyIG9mIG1hcmsgdAoJCQlsaW5lKCInIiAuIG1hcmtlcikJbGluZSBudW1iZXIgb2YgbWFyayBtYXJrZXIKPAkJCQkJCQkqbGFzdC1wb3NpdGlvbi1qdW1wKgoJCVRoaXMgYXV0b2NvbW1hbmQganVtcHMgdG8gdGhlIGxhc3Qga25vd24gcG9zaXRpb24gaW4gYSBmaWxlCgkJanVzdCBhZnRlciBvcGVuaW5nIGl0LCBpZiB0aGUgJyIgbWFyayBpcyBzZXQ6ID4KCTphdSBCdWZSZWFkUG9zdCAqIGlmIGxpbmUoIidcIiIpID4gMSAmJiBsaW5lKCInXCIiKSA8PSBsaW5lKCIkIikgfCBleGUgIm5vcm1hbCEgZ2BcIiIgfCBlbmRpZgoKbGluZTJieXRlKHtsbnVtfSkJCQkJCSpsaW5lMmJ5dGUoKSoKCQlSZXR1cm4gdGhlIGJ5dGUgY291bnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciBmb3IgbGluZQoJCXtsbnVtfS4gIFRoaXMgaW5jbHVkZXMgdGhlIGVuZC1vZi1saW5lIGNoYXJhY3RlciwgZGVwZW5kaW5nIG9uCgkJdGhlICdmaWxlZm9ybWF0JyBvcHRpb24gZm9yIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFRoZSBmaXJzdAoJCWxpbmUgcmV0dXJucyAxLiAnZW5jb2RpbmcnIG1hdHRlcnMsICdmaWxlZW5jb2RpbmcnIGlzIGlnbm9yZWQuCgkJVGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGdldCB0aGUgYnl0ZSBjb3VudCBmb3IgdGhlIGxpbmUganVzdAoJCWJlbG93IHRoZSBsYXN0IGxpbmU6ID4KCQkJbGluZTJieXRlKGxpbmUoIiQiKSArIDEpCjwJCVRoaXMgaXMgdGhlIGJ1ZmZlciBzaXplIHBsdXMgb25lLiAgSWYgJ2ZpbGVlbmNvZGluZycgaXMgZW1wdHkKCQlpdCBpcyB0aGUgZmlsZSBzaXplIHBsdXMgb25lLgoJCVdoZW4ge2xudW19IGlzIGludmFsaWQsIG9yIHRoZSB8K2J5dGVfb2Zmc2V0fCBmZWF0dXJlIGhhcyBiZWVuCgkJZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLCAtMSBpcyByZXR1cm5lZC4KCQlBbHNvIHNlZSB8Ynl0ZTJsaW5lKCl8LCB8Z298IGFuZCB8OmdvdG98LgoKbGlzcGluZGVudCh7bG51bX0pCQkJCQkqbGlzcGluZGVudCgpKgoJCUdldCB0aGUgYW1vdW50IG9mIGluZGVudCBmb3IgbGluZSB7bG51bX0gYWNjb3JkaW5nIHRoZSBsaXNwCgkJaW5kZW50aW5nIHJ1bGVzLCBhcyB3aXRoICdsaXNwJy4KCQlUaGUgaW5kZW50IGlzIGNvdW50ZWQgaW4gc3BhY2VzLCB0aGUgdmFsdWUgb2YgJ3RhYnN0b3AnIGlzCgkJcmVsZXZhbnQuICB7bG51bX0gaXMgdXNlZCBqdXN0IGxpa2UgaW4gfGdldGxpbmUoKXwuCgkJV2hlbiB7bG51bX0gaXMgaW52YWxpZCBvciBWaW0gd2FzIG5vdCBjb21waWxlZCB0aGUKCQl8K2xpc3BpbmRlbnR8IGZlYXR1cmUsIC0xIGlzIHJldHVybmVkLgoKbG9jYWx0aW1lKCkJCQkJCQkqbG9jYWx0aW1lKCkqCgkJUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUsIG1lYXN1cmVkIGFzIHNlY29uZHMgc2luY2UgMXN0IEphbgoJCTE5NzAuICBTZWUgYWxzbyB8c3RyZnRpbWUoKXwgYW5kIHxnZXRmdGltZSgpfC4KCgpsb2coe2V4cHJ9KQkJCQkJCSpsb2coKSoKCQlSZXR1cm4gdGhlIG5hdHVyYWwgbG9nYXJpdGhtIChiYXNlIGUpIG9mIHtleHByfSBhcyBhIHxGbG9hdHwuCgkJe2V4cHJ9IG11c3QgZXZhbHVhdGUgdG8gYSB8RmxvYXR8IG9yIGEgfE51bWJlcnwgaW4gdGhlIHJhbmdlCgkJKDAsIGluZl0uCgkJRXhhbXBsZXM6ID4KCQkJOmVjaG8gbG9nKDEwKQo8CQkJMi4zMDI1ODUgPgoJCQk6ZWNobyBsb2coZXhwKDUpKQo8CQkJNS4wCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgpsb2cxMCh7ZXhwcn0pCQkJCQkJKmxvZzEwKCkqCgkJUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgRmxvYXQge2V4cHJ9IHRvIGJhc2UgMTAgYXMgYSB8RmxvYXR8LgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIGxvZzEwKDEwMDApCjwJCQkzLjAgPgoJCQk6ZWNobyBsb2cxMCgwLjAxKQo8CQkJLTIuMAoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmxvYXR8IGZlYXR1cmV9CgkJCmx1YWV2YWwoe2V4cHJ9Wywge2V4cHJ9XSkJCQkJCSpsdWFldmFsKCkqCgkJRXZhbHVhdGUgTHVhIGV4cHJlc3Npb24ge2V4cHJ9IGFuZCByZXR1cm4gaXRzIHJlc3VsdCBjb252ZXJ0ZWQgCgkJdG8gVmltIGRhdGEgc3RydWN0dXJlcy4gU2Vjb25kIHtleHByfSBtYXkgaG9sZCBhZGRpdGlvbmFsIAoJCWFyZ3VtZW50IGFjY2Vzc2libGUgYXMgX0EgaW5zaWRlIGZpcnN0IHtleHByfS4KCQlTdHJpbmdzIGFyZSByZXR1cm5lZCBhcyB0aGV5IGFyZS4KCQlCb29sZWFuIG9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBudW1iZXJzLgoJCU51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byB8RmxvYXR8IHZhbHVlcyBpZiB2aW0gd2FzIGNvbXBpbGVkIAoJCXdpdGggfCtmbG9hdHwgYW5kIHRvIG51bWJlcnMgb3RoZXJ3aXNlLgoJCURpY3Rpb25hcmllcyBhbmQgbGlzdHMgb2J0YWluZWQgYnkgdmltLmV2YWwoKSBhcmUgcmV0dXJuZWQgCgkJYXMtaXMuCgkJT3RoZXIgb2JqZWN0cyBhcmUgcmV0dXJuZWQgYXMgemVybyB3aXRob3V0IGFueSBlcnJvcnMuCgkJU2VlIHxsdWEtbHVhZXZhbHwgZm9yIG1vcmUgZGV0YWlscy4KCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2x1YXwgZmVhdHVyZX0KCm1hcCh7ZXhwcn0sIHtzdHJpbmd9KQkJCQkJKm1hcCgpKgoJCXtleHByfSBtdXN0IGJlIGEgfExpc3R8IG9yIGEgfERpY3Rpb25hcnl8LgoJCVJlcGxhY2UgZWFjaCBpdGVtIGluIHtleHByfSB3aXRoIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZwoJCXtzdHJpbmd9LgoJCUluc2lkZSB7c3RyaW5nfSB8djp2YWx8IGhhcyB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgaXRlbS4KCQlGb3IgYSB8RGljdGlvbmFyeXwgfHY6a2V5fCBoYXMgdGhlIGtleSBvZiB0aGUgY3VycmVudCBpdGVtCgkJYW5kIGZvciBhIHxMaXN0fCB8djprZXl8IGhhcyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgaXRlbS4KCQlFeGFtcGxlOiA+CgkJCTpjYWxsIG1hcChteWxpc3QsICciPiAiIC4gdjp2YWwgLiAiIDwiJykKPAkJVGhpcyBwdXRzICI+ICIgYmVmb3JlIGFuZCAiIDwiIGFmdGVyIGVhY2ggaXRlbSBpbiAibXlsaXN0Ii4KCgkJTm90ZSB0aGF0IHtzdHJpbmd9IGlzIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBhbmQgaXMgdGhlbgoJCXVzZWQgYXMgYW4gZXhwcmVzc2lvbiBhZ2Fpbi4gIE9mdGVuIGl0IGlzIGdvb2QgdG8gdXNlIGEKCQl8bGl0ZXJhbC1zdHJpbmd8IHRvIGF2b2lkIGhhdmluZyB0byBkb3VibGUgYmFja3NsYXNoZXMuICBZb3UKCQlzdGlsbCBoYXZlIHRvIGRvdWJsZSAnIHF1b3RlcwoKCQlUaGUgb3BlcmF0aW9uIGlzIGRvbmUgaW4tcGxhY2UuICBJZiB5b3Ugd2FudCBhIHxMaXN0fCBvcgoJCXxEaWN0aW9uYXJ5fCB0byByZW1haW4gdW5tb2RpZmllZCBtYWtlIGEgY29weSBmaXJzdDogPgoJCQk6bGV0IHRsaXN0ID0gbWFwKGNvcHkobXlsaXN0KSwgJyB2OnZhbCAuICJcdCInKQoKPAkJUmV0dXJucyB7ZXhwcn0sIHRoZSB8TGlzdHwgb3IgfERpY3Rpb25hcnl8IHRoYXQgd2FzIGZpbHRlcmVkLgoJCVdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2hpbGUgZXZhbHVhdGluZyB7c3RyaW5nfSBubwoJCWZ1cnRoZXIgaXRlbXMgaW4ge2V4cHJ9IGFyZSBwcm9jZXNzZWQuCgoKbWFwYXJnKHtuYW1lfVssIHttb2RlfSBbLCB7YWJicn0gWywge2RpY3R9XV1dKQkJCSptYXBhcmcoKSoKCQlXaGVuIHtkaWN0fSBpcyBvbWl0dGVkIG9yIHplcm86IFJldHVybiB0aGUgcmhzIG9mIG1hcHBpbmcKCQl7bmFtZX0gaW4gbW9kZSB7bW9kZX0uICBUaGUgcmV0dXJuZWQgU3RyaW5nIGhhcyBzcGVjaWFsCgkJY2hhcmFjdGVycyB0cmFuc2xhdGVkIGxpa2UgaW4gdGhlIG91dHB1dCBvZiB0aGUgIjptYXAiIGNvbW1hbmQKCQlsaXN0aW5nLgoJCQoJCVdoZW4gdGhlcmUgaXMgbm8gbWFwcGluZyBmb3Ige25hbWV9LCBhbiBlbXB0eSBTdHJpbmcgaXMKCQlyZXR1cm5lZC4KCgkJVGhlIHtuYW1lfSBjYW4gaGF2ZSBzcGVjaWFsIGtleSBuYW1lcywgbGlrZSBpbiB0aGUgIjptYXAiCgkJY29tbWFuZC4KCgkJe21vZGV9IGNhbiBiZSBvbmUgb2YgdGhlc2Ugc3RyaW5nczoKCQkJIm4iCU5vcm1hbAoJCQkidiIJVmlzdWFsIChpbmNsdWRpbmcgU2VsZWN0KQoJCQkibyIJT3BlcmF0b3ItcGVuZGluZwoJCQkiaSIJSW5zZXJ0CgkJCSJjIglDbWQtbGluZQoJCQkicyIJU2VsZWN0CgkJCSJ4IglWaXN1YWwKCQkJImwiCWxhbmdtYXAgfGxhbmd1YWdlLW1hcHBpbmd8CgkJCSIiCU5vcm1hbCwgVmlzdWFsIGFuZCBPcGVyYXRvci1wZW5kaW5nCgkJV2hlbiB7bW9kZX0gaXMgb21pdHRlZCwgdGhlIG1vZGVzIGZvciAiIiBhcmUgdXNlZC4KCgkJV2hlbiB7YWJicn0gaXMgdGhlcmUgYW5kIGl0IGlzIG5vbi16ZXJvIHVzZSBhYmJyZXZpYXRpb25zCgkJaW5zdGVhZCBvZiBtYXBwaW5ncy4KCgkJV2hlbiB7ZGljdH0gaXMgdGhlcmUgYW5kIGl0IGlzIG5vbi16ZXJvIHJldHVybiBhIGRpY3Rpb25hcnkKCQljb250YWluaW5nIGFsbCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIG1hcHBpbmcgd2l0aCB0aGUKCQlmb2xsb3dpbmcgaXRlbXM6CgkJICAibGhzIgkgICAgIFRoZSB7bGhzfSBvZiB0aGUgbWFwcGluZy4KCQkgICJyaHMiCSAgICAgVGhlIHtyaHN9IG9mIHRoZSBtYXBwaW5nIGFzIHR5cGVkLgoJCSAgInNpbGVudCIgICAxIGZvciBhIHw6bWFwLXNpbGVudHwgbWFwcGluZywgZWxzZSAwLgoJCSAgIm5vcmVtYXAiICAxIGlmIHRoZSB7cmhzfSBvZiB0aGUgbWFwcGluZyBpcyBub3QgcmVtYXBwYWJsZS4KCQkgICJleHByIiAgICAgMSBmb3IgYW4gZXhwcmVzc2lvbiBtYXBwaW5nICh8Om1hcC08ZXhwcj58KS4KCQkgICJidWZmZXIiICAgMSBmb3IgYSBidWZmZXIgbG9jYWwgbWFwcGluZyAofDptYXAtbG9jYWx8KS4KCQkgICJtb2RlIiAgICAgTW9kZXMgZm9yIHdoaWNoIHRoZSBtYXBwaW5nIGlzIGRlZmluZWQuIEluCgkJCSAgICAgYWRkaXRpb24gdG8gdGhlIG1vZGVzIG1lbnRpb25lZCBhYm92ZSwgdGhlc2UKCQkJICAgICBjaGFyYWN0ZXJzIHdpbGwgYmUgdXNlZDoKCQkJICAgICAiICIgICAgIE5vcm1hbCwgVmlzdWFsIGFuZCBPcGVyYXRvci1wZW5kaW5nCgkJCSAgICAgIiEiICAgICBJbnNlcnQgYW5kIENvbW1hbmRsaW5lIG1vZGUKCQkJCSAgICAgKHxtYXBtb2RlLWljfCkKCQkgICJzaWQiCSAgICAgVGhlIHNjcmlwdCBsb2NhbCBJRCwgdXNlZCBmb3IgPHNpZD4gbWFwcGluZ3MKCQkJICAgICAofDxTSUQ+fCkuCgkJICAibm93YWl0IiAgIERvIG5vdCB3YWl0IGZvciBvdGhlciwgbG9uZ2VyIG1hcHBpbmdzLgoJCQkgICAgICh8Om1hcC08bm93YWl0PnwpLgoKCQlUaGUgbWFwcGluZ3MgbG9jYWwgdG8gdGhlIGN1cnJlbnQgYnVmZmVyIGFyZSBjaGVja2VkIGZpcnN0LAoJCXRoZW4gdGhlIGdsb2JhbCBtYXBwaW5ncy4KCQlUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIG1hcCBhIGtleSBldmVuIHdoZW4gaXQncyBhbHJlYWR5CgkJbWFwcGVkLCBhbmQgaGF2ZSBpdCBkbyB0aGUgb3JpZ2luYWwgbWFwcGluZyB0b28uICBTa2V0Y2g6ID4KCQkJZXhlICdubm9yZW1hcCA8VGFiPiA9PScgLiBtYXBhcmcoJzxUYWI+JywgJ24nKQoKCm1hcGNoZWNrKHtuYW1lfVssIHttb2RlfSBbLCB7YWJicn1dXSkJCQkqbWFwY2hlY2soKSoKCQlDaGVjayBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgdGhhdCBtYXRjaGVzIHdpdGgge25hbWV9IGluIG1vZGUKCQl7bW9kZX0uICBTZWUgfG1hcGFyZygpfCBmb3Ige21vZGV9IGFuZCBzcGVjaWFsIG5hbWVzIGluCgkJe25hbWV9LgoJCVdoZW4ge2FiYnJ9IGlzIHRoZXJlIGFuZCBpdCBpcyBub24temVybyB1c2UgYWJicmV2aWF0aW9ucwoJCWluc3RlYWQgb2YgbWFwcGluZ3MuCgkJQSBtYXRjaCBoYXBwZW5zIHdpdGggYSBtYXBwaW5nIHRoYXQgc3RhcnRzIHdpdGgge25hbWV9IGFuZAoJCXdpdGggYSBtYXBwaW5nIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzdGFydCBvZiB7bmFtZX0uCgoJCQltYXRjaGVzIG1hcHBpbmcgImEiCSJhYiIJImFiYyIgfgoJCSAgIG1hcGNoZWNrKCJhIikJeWVzCXllcwkgeWVzCgkJICAgbWFwY2hlY2soImFiYyIpCXllcwl5ZXMJIHllcwoJCSAgIG1hcGNoZWNrKCJheCIpCXllcwlubwkgbm8KCQkgICBtYXBjaGVjaygiYiIpCW5vCW5vCSBubwoKCQlUaGUgZGlmZmVyZW5jZSB3aXRoIG1hcGFyZygpIGlzIHRoYXQgbWFwY2hlY2soKSBmaW5kcyBhCgkJbWFwcGluZyB0aGF0IG1hdGNoZXMgd2l0aCB7bmFtZX0sIHdoaWxlIG1hcGFyZygpIG9ubHkgZmluZHMgYQoJCW1hcHBpbmcgZm9yIHtuYW1lfSBleGFjdGx5LgoJCVdoZW4gdGhlcmUgaXMgbm8gbWFwcGluZyB0aGF0IHN0YXJ0cyB3aXRoIHtuYW1lfSwgYW4gZW1wdHkKCQlTdHJpbmcgaXMgcmV0dXJuZWQuICBJZiB0aGVyZSBpcyBvbmUsIHRoZSByaHMgb2YgdGhhdCBtYXBwaW5nCgkJaXMgcmV0dXJuZWQuICBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBtYXBwaW5ncyB0aGF0IHN0YXJ0IHdpdGgKCQl7bmFtZX0sIHRoZSByaHMgb2Ygb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQuCgkJVGhlIG1hcHBpbmdzIGxvY2FsIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciBhcmUgY2hlY2tlZCBmaXJzdCwKCQl0aGVuIHRoZSBnbG9iYWwgbWFwcGluZ3MuCgkJVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBhIG1hcHBpbmcgY2FuIGJlIGFkZGVkCgkJd2l0aG91dCBiZWluZyBhbWJpZ3VvdXMuICBFeGFtcGxlOiA+Cgk6aWYgbWFwY2hlY2soIl92diIpID09ICIiCgk6ICAgbWFwIF92diA6c2V0IGd1aWZvbnQ9N3gxMzxDUj4KCTplbmRpZgo8CQlUaGlzIGF2b2lkcyBhZGRpbmcgdGhlICJfdnYiIG1hcHBpbmcgd2hlbiB0aGVyZSBhbHJlYWR5IGlzIGEKCQltYXBwaW5nIGZvciAiX3YiIG9yIGZvciAiX3Z2diIuCgptYXRjaCh7ZXhwcn0sIHtwYXR9Wywge3N0YXJ0fVssIHtjb3VudH1dXSkJCQkqbWF0Y2goKSoKCQlXaGVuIHtleHByfSBpcyBhIHxMaXN0fCB0aGVuIHRoaXMgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlCgkJZmlyc3QgaXRlbSB3aGVyZSB7cGF0fSBtYXRjaGVzLiAgRWFjaCBpdGVtIGlzIHVzZWQgYXMgYQoJCVN0cmluZywgfExpc3RzfCBhbmQgfERpY3Rpb25hcmllc3wgYXJlIHVzZWQgYXMgZWNob2VkLgoJCU90aGVyd2lzZSwge2V4cHJ9IGlzIHVzZWQgYXMgYSBTdHJpbmcuCVRoZSByZXN1bHQgaXMgYQoJCU51bWJlciwgd2hpY2ggZ2l2ZXMgdGhlIGluZGV4IChieXRlIG9mZnNldCkgaW4ge2V4cHJ9IHdoZXJlCgkJe3BhdH0gbWF0Y2hlcy4KCQlBIG1hdGNoIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb3IgfExpc3R8IGl0ZW0gcmV0dXJucyB6ZXJvLgoJCUlmIHRoZXJlIGlzIG5vIG1hdGNoIC0xIGlzIHJldHVybmVkLgoJCUZvciBnZXR0aW5nIHN1Ym1hdGNoZXMgc2VlIHxtYXRjaGxpc3QoKXwuCgkJRXhhbXBsZTogPgoJCQk6ZWNobyBtYXRjaCgidGVzdGluZyIsICJpbmciKQkiIHJlc3VsdHMgaW4gNAoJCQk6ZWNobyBtYXRjaChbMSwgJ3gnXSwgJ1xhJykJIiByZXN1bHRzIGluIDEKPAkJU2VlIHxzdHJpbmctbWF0Y2h8IGZvciBob3cge3BhdH0gaXMgdXNlZC4KCQkJCQkJCQkqc3RycGJyaygpKgoJCVZpbSBkb2Vzbid0IGhhdmUgYSBzdHJwYnJrKCkgZnVuY3Rpb24uCUJ1dCB5b3UgY2FuIGRvOiA+CgkJCTpsZXQgc2VwaWR4ID0gbWF0Y2gobGluZSwgJ1suLDs6IFx0XScpCjwJCQkJCQkJCSpzdHJjYXNlc3RyKCkqCgkJVmltIGRvZXNuJ3QgaGF2ZSBhIHN0cmNhc2VzdHIoKSBmdW5jdGlvbi4gIEJ1dCB5b3UgY2FuIGFkZAoJCSJcYyIgdG8gdGhlIHBhdHRlcm4gdG8gaWdub3JlIGNhc2U6ID4KCQkJOmxldCBpZHggPSBtYXRjaChoYXlzdGFjaywgJ1xjbmVlZGxlJykKPAoJCUlmIHtzdGFydH0gaXMgZ2l2ZW4sIHRoZSBzZWFyY2ggc3RhcnRzIGZyb20gYnl0ZSBpbmRleAoJCXtzdGFydH0gaW4gYSBTdHJpbmcgb3IgaXRlbSB7c3RhcnR9IGluIGEgfExpc3R8LgoJCVRoZSByZXN1bHQsIGhvd2V2ZXIsIGlzIHN0aWxsIHRoZSBpbmRleCBjb3VudGVkIGZyb20gdGhlCgkJZmlyc3QgY2hhcmFjdGVyL2l0ZW0uICBFeGFtcGxlOiA+CgkJCTplY2hvIG1hdGNoKCJ0ZXN0aW5nIiwgImluZyIsIDIpCjwJCXJlc3VsdCBpcyBhZ2FpbiAiNCIuID4KCQkJOmVjaG8gbWF0Y2goInRlc3RpbmciLCAiaW5nIiwgNCkKPAkJcmVzdWx0IGlzIGFnYWluICI0Ii4gPgoJCQk6ZWNobyBtYXRjaCgidGVzdGluZyIsICJ0IiwgMikKPAkJcmVzdWx0IGlzICIzIi4KCQlGb3IgYSBTdHJpbmcsIGlmIHtzdGFydH0gPiAwIHRoZW4gaXQgaXMgbGlrZSB0aGUgc3RyaW5nIHN0YXJ0cwoJCXtzdGFydH0gYnl0ZXMgbGF0ZXIsIHRodXMgIl4iIHdpbGwgbWF0Y2ggYXQge3N0YXJ0fS4gIEV4Y2VwdAoJCXdoZW4ge2NvdW50fSBpcyBnaXZlbiwgdGhlbiBpdCdzIGxpa2UgbWF0Y2hlcyBiZWZvcmUgdGhlCgkJe3N0YXJ0fSBieXRlIGFyZSBpZ25vcmVkICh0aGlzIGlzIGEgYml0IGNvbXBsaWNhdGVkIHRvIGtlZXAgaXQKCQliYWNrd2FyZHMgY29tcGF0aWJsZSkuCgkJRm9yIGEgU3RyaW5nLCBpZiB7c3RhcnR9IDwgMCwgaXQgd2lsbCBiZSBzZXQgdG8gMC4gIEZvciBhIGxpc3QKCQl0aGUgaW5kZXggaXMgY291bnRlZCBmcm9tIHRoZSBlbmQuCgkJSWYge3N0YXJ0fSBpcyBvdXQgb2YgcmFuZ2UgKHtzdGFydH0gPiBzdHJsZW4oe2V4cHJ9KSBmb3IgYQoJCVN0cmluZyBvciB7c3RhcnR9ID4gbGVuKHtleHByfSkgZm9yIGEgfExpc3R8KSAtMSBpcyByZXR1cm5lZC4KCgkJV2hlbiB7Y291bnR9IGlzIGdpdmVuIHVzZSB0aGUge2NvdW50fSd0aCBtYXRjaC4gIFdoZW4gYSBtYXRjaAoJCWlzIGZvdW5kIGluIGEgU3RyaW5nIHRoZSBzZWFyY2ggZm9yIHRoZSBuZXh0IG9uZSBzdGFydHMgb25lCgkJY2hhcmFjdGVyIGZ1cnRoZXIuICBUaHVzIHRoaXMgZXhhbXBsZSByZXN1bHRzIGluIDE6ID4KCQkJZWNobyBtYXRjaCgidGVzdGluZyIsICIuLiIsIDAsIDIpCjwJCUluIGEgfExpc3R8IHRoZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBuZXh0IGl0ZW0uCgkJTm90ZSB0aGF0IHdoZW4ge2NvdW50fSBpcyBhZGRlZCB0aGUgd2F5IHtzdGFydH0gd29ya3MgY2hhbmdlcywKCQlzZWUgYWJvdmUuCgoJCVNlZSB8cGF0dGVybnwgZm9yIHRoZSBwYXR0ZXJucyB0aGF0IGFyZSBhY2NlcHRlZC4KCQlUaGUgJ2lnbm9yZWNhc2UnIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgaWdub3JlLWNhc2VuZXNzIG9mCgkJdGhlIHBhdHRlcm4uICAnc21hcnRjYXNlJyBpcyBOT1QgdXNlZC4JVGhlIG1hdGNoaW5nIGlzIGFsd2F5cwoJCWRvbmUgbGlrZSAnbWFnaWMnIGlzIHNldCBhbmQgJ2Nwb3B0aW9ucycgaXMgZW1wdHkuCgoJCQkJCSptYXRjaGFkZCgpKiAqRTc5OCogKkU3OTkqICpFODAxKgptYXRjaGFkZCh7Z3JvdXB9LCB7cGF0dGVybn1bLCB7cHJpb3JpdHl9Wywge2lkfSBbLCB7ZGljdH1dXV0pCgkJRGVmaW5lcyBhIHBhdHRlcm4gdG8gYmUgaGlnaGxpZ2h0ZWQgaW4gdGhlIGN1cnJlbnQgd2luZG93IChhCgkJIm1hdGNoIikuICBJdCB3aWxsIGJlIGhpZ2hsaWdodGVkIHdpdGgge2dyb3VwfS4gIFJldHVybnMgYW4KCQlpZGVudGlmaWNhdGlvbiBudW1iZXIgKElEKSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVsZXRlIHRoZQoJCW1hdGNoIHVzaW5nIHxtYXRjaGRlbGV0ZSgpfC4KCQlNYXRjaGluZyBpcyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWFnaWMsIHVubGVzcyBjYXNlIHNlbnNpdGl2aXR5CgkJb3IgbWFnaWNuZXNzIGFyZSBleHBsaWNpdGx5IG92ZXJyaWRkZW4gaW4ge3BhdHRlcm59LiAgVGhlCgkJJ21hZ2ljJywgJ3NtYXJ0Y2FzZScgYW5kICdpZ25vcmVjYXNlJyBvcHRpb25zIGFyZSBub3QgdXNlZC4KCQlUaGUgIkNvbmNlYWwiIHZhbHVlIGlzIHNwZWNpYWwsIGl0IGNhdXNlcyB0aGUgbWF0Y2ggdG8gYmUKCQljb25jZWFsZWQuCgoJCVRoZSBvcHRpb25hbCB7cHJpb3JpdHl9IGFyZ3VtZW50IGFzc2lnbnMgYSBwcmlvcml0eSB0byB0aGUKCQltYXRjaC4JQSBtYXRjaCB3aXRoIGEgaGlnaCBwcmlvcml0eSB3aWxsIGhhdmUgaXRzCgkJaGlnaGxpZ2h0aW5nIG92ZXJydWxlIHRoYXQgb2YgYSBtYXRjaCB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuCgkJQSBwcmlvcml0eSBpcyBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlciAobmVnYXRpdmUgbnVtYmVycyBhcmUgbm8KCQlleGNlcHRpb24pLiAgSWYgdGhlIHtwcmlvcml0eX0gYXJndW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlCgkJZGVmYXVsdCBwcmlvcml0eSBpcyAxMC4gIFRoZSBwcmlvcml0eSBvZiAnaGxzZWFyY2gnIGlzIHplcm8sCgkJaGVuY2UgYWxsIG1hdGNoZXMgd2l0aCBhIHByaW9yaXR5IGdyZWF0ZXIgdGhhbiB6ZXJvIHdpbGwKCQlvdmVycnVsZSBpdC4gIFN5bnRheCBoaWdobGlnaHRpbmcgKHNlZSAnc3ludGF4JykgaXMgYSBzZXBhcmF0ZQoJCW1lY2hhbmlzbSwgYW5kIHJlZ2FyZGxlc3Mgb2YgdGhlIGNob3NlbiBwcmlvcml0eSBhIG1hdGNoIHdpbGwKCQlhbHdheXMgb3ZlcnJ1bGUgc3ludGF4IGhpZ2hsaWdodGluZy4KCgkJVGhlIG9wdGlvbmFsIHtpZH0gYXJndW1lbnQgYWxsb3dzIHRoZSByZXF1ZXN0IGZvciBhIHNwZWNpZmljCgkJbWF0Y2ggSUQuICBJZiBhIHNwZWNpZmllZCBJRCBpcyBhbHJlYWR5IHRha2VuLCBhbiBlcnJvcgoJCW1lc3NhZ2Ugd2lsbCBhcHBlYXIgYW5kIHRoZSBtYXRjaCB3aWxsIG5vdCBiZSBhZGRlZC4gIEFuIElECgkJaXMgc3BlY2lmaWVkIGFzIGEgcG9zaXRpdmUgaW50ZWdlciAoemVybyBleGNsdWRlZCkuICBJRHMgMSwgMgoJCWFuZCAzIGFyZSByZXNlcnZlZCBmb3IgfDptYXRjaHwsIHw6Mm1hdGNofCBhbmQgfDozbWF0Y2h8LAoJCXJlc3BlY3RpdmVseS4gIElmIHRoZSB7aWR9IGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWQgb3IgLTEsCgkJfG1hdGNoYWRkKCl8IGF1dG9tYXRpY2FsbHkgY2hvb3NlcyBhIGZyZWUgSUQuCgoJCVRoZSBvcHRpb25hbCB7ZGljdH0gYXJndW1lbnQgYWxsb3dzIGZvciBmdXJ0aGVyIGN1c3RvbQoJCXZhbHVlcy4gQ3VycmVudGx5IHRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IGEgbWF0Y2ggc3BlY2lmaWMKCQljb25jZWFsIGNoYXJhY3RlciB0aGF0IHdpbGwgYmUgc2hvd24gZm9yIHxobC1Db25jZWFsfAoJCWhpZ2hsaWdodGVkIG1hdGNoZXMuIFRoZSBkaWN0IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKCgkJCWNvbmNlYWwJICAgIFNwZWNpYWwgY2hhcmFjdGVyIHRvIHNob3cgaW5zdGVhZCBvZiB0aGUKCQkJCSAgICBtYXRjaCAob25seSBmb3IgfGhsLUNvbmNlYWx8IGhpZ2hsaWdoZWQKCQkJCSAgICBtYXRjaGVzLCBzZWUgfDpzeW4tY2NoYXJ8KQoKCQlUaGUgbnVtYmVyIG9mIG1hdGNoZXMgaXMgbm90IGxpbWl0ZWQsIGFzIGl0IGlzIHRoZSBjYXNlIHdpdGgKCQl0aGUgfDptYXRjaHwgY29tbWFuZHMuCgoJCUV4YW1wbGU6ID4KCQkJOmhpZ2hsaWdodCBNeUdyb3VwIGN0ZXJtYmc9Z3JlZW4gZ3VpYmc9Z3JlZW4KCQkJOmxldCBtID0gbWF0Y2hhZGQoIk15R3JvdXAiLCAiVE9ETyIpCjwJCURlbGV0aW9uIG9mIHRoZSBwYXR0ZXJuOiA+CgkJCTpjYWxsIG1hdGNoZGVsZXRlKG0pCgo8CQlBIGxpc3Qgb2YgbWF0Y2hlcyBkZWZpbmVkIGJ5IHxtYXRjaGFkZCgpfCBhbmQgfDptYXRjaHwgYXJlCgkJYXZhaWxhYmxlIGZyb20gfGdldG1hdGNoZXMoKXwuCUFsbCBtYXRjaGVzIGNhbiBiZSBkZWxldGVkIGluCgkJb25lIG9wZXJhdGlvbiBieSB8Y2xlYXJtYXRjaGVzKCl8LgoKbWF0Y2hhZGRwb3Moe2dyb3VwfSwge3Bvc31bLCB7cHJpb3JpdHl9Wywge2lkfVssIHtkaWN0fV1dXSkJCSptYXRjaGFkZHBvcygpKgoJCVNhbWUgYXMgfG1hdGNoYWRkKCl8LCBidXQgcmVxdWlyZXMgYSBsaXN0IG9mIHBvc2l0aW9ucyB7cG9zfQoJCWluc3RlYWQgb2YgYSBwYXR0ZXJuLiBUaGlzIGNvbW1hbmQgaXMgZmFzdGVyIHRoYW4gfG1hdGNoYWRkKCl8CgkJYmVjYXVzZSBpdCBkb2VzIG5vdCByZXF1aXJlIHRvIGhhbmRsZSByZWd1bGFyIGV4cHJlc3Npb25zIGFuZAoJCXNldHMgYnVmZmVyIGxpbmUgYm91bmRhcmllcyB0byByZWRyYXcgc2NyZWVuLiBJdCBpcyBzdXBwb3NlZAoJCXRvIGJlIHVzZWQgd2hlbiBmYXN0IG1hdGNoIGFkZGl0aW9ucyBhbmQgZGVsZXRpb25zIGFyZQoJCXJlcXVpcmVkLCBmb3IgZXhhbXBsZSB0byBoaWdobGlnaHQgbWF0Y2hpbmcgcGFyZW50aGVzZXMuCgoJCVRoZSBsaXN0IHtwb3N9IGNhbiBjb250YWluIG9uZSBvZiB0aGVzZSBpdGVtczoKCQktIEEgbnVtYmVyLiAgVGhpcyB3aG9sZSBsaW5lIHdpbGwgYmUgaGlnaGxpZ2h0ZWQuICBUaGUgZmlyc3QKCQkgIGxpbmUgaGFzIG51bWJlciAxLgoJCS0gQSBsaXN0IHdpdGggb25lIG51bWJlciwgZS5nLiwgWzIzXS4gVGhlIHdob2xlIGxpbmUgd2l0aCB0aGlzCgkJICBudW1iZXIgd2lsbCBiZSBoaWdobGlnaHRlZC4KCQktIEEgbGlzdCB3aXRoIHR3byBudW1iZXJzLCBlLmcuLCBbMjMsIDExXS4gVGhlIGZpcnN0IG51bWJlciBpcwoJCSAgdGhlIGxpbmUgbnVtYmVyLCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgY29sdW1uIG51bWJlciAoZmlyc3QKCQkgIGNvbHVtbiBpcyAxLCB0aGUgdmFsdWUgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBieXRlIGluZGV4IGFzCgkJICB8Y29sKCl8IHdvdWxkIHJldHVybikuICBUaGUgY2hhcmFjdGVyIGF0IHRoaXMgcG9zaXRpb24gd2lsbAoJCSAgYmUgaGlnaGxpZ2h0ZWQuCgkJLSBBIGxpc3Qgd2l0aCB0aHJlZSBudW1iZXJzLCBlLmcuLCBbMjMsIDExLCAzXS4gQXMgYWJvdmUsIGJ1dAoJCSAgdGhlIHRoaXJkIG51bWJlciBnaXZlcyB0aGUgbGVuZ3RoIG9mIHRoZSBoaWdobGlnaHQgaW4gYnl0ZXMuCgkJCgkJVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvc2l0aW9ucyBpcyA4LgoKCQlFeGFtcGxlOiA+CgkJCTpoaWdobGlnaHQgTXlHcm91cCBjdGVybWJnPWdyZWVuIGd1aWJnPWdyZWVuCgkJCTpsZXQgbSA9IG1hdGNoYWRkcG9zKCJNeUdyb3VwIiwgW1syMywgMjRdLCAzNF0pCjwJCURlbGV0aW9uIG9mIHRoZSBwYXR0ZXJuOiA+CgkJCTpjYWxsIG1hdGNoZGVsZXRlKG0pCgo8CQlNYXRjaGVzIGFkZGVkIGJ5IHxtYXRjaGFkZHBvcygpfCBhcmUgcmV0dXJuZWQgYnkKCQl8Z2V0bWF0Y2hlcygpfCB3aXRoIGFuIGVudHJ5ICJwb3MxIiwgInBvczIiLCBldGMuLCB3aXRoIHRoZQoJCXZhbHVlIGEgbGlzdCBsaWtlIHRoZSB7cG9zfSBpdGVtLgoJCVRoZXNlIG1hdGNoZXMgY2Fubm90IGJlIHNldCB2aWEgfHNldG1hdGNoZXMoKXwsIGhvd2V2ZXIgdGhleQoJCWNhbiBzdGlsbCBiZSBkZWxldGVkIGJ5IHxjbGVhcm1hdGNoZXMoKXwuCgptYXRjaGFyZyh7bnJ9KQkJCQkJCQkqbWF0Y2hhcmcoKSoKCQlTZWxlY3RzIHRoZSB7bnJ9IG1hdGNoIGl0ZW0sIGFzIHNldCB3aXRoIGEgfDptYXRjaHwsCgkJfDoybWF0Y2h8IG9yIHw6M21hdGNofCBjb21tYW5kLgoJCVJldHVybiBhIHxMaXN0fCB3aXRoIHR3byBlbGVtZW50czoKCQkJVGhlIG5hbWUgb2YgdGhlIGhpZ2hsaWdodCBncm91cCB1c2VkCgkJCVRoZSBwYXR0ZXJuIHVzZWQuCgkJV2hlbiB7bnJ9IGlzIG5vdCAxLCAyIG9yIDMgcmV0dXJucyBhbiBlbXB0eSB8TGlzdHwuCgkJV2hlbiB0aGVyZSBpcyBubyBtYXRjaCBpdGVtIHNldCByZXR1cm5zIFsnJywgJyddLgoJCVRoaXMgaXMgdXNlZnVsIHRvIHNhdmUgYW5kIHJlc3RvcmUgYSB8Om1hdGNofC4KCQlIaWdobGlnaHRpbmcgbWF0Y2hlcyB1c2luZyB0aGUgfDptYXRjaHwgY29tbWFuZHMgYXJlIGxpbWl0ZWQKCQl0byB0aHJlZSBtYXRjaGVzLiB8bWF0Y2hhZGQoKXwgZG9lcyBub3QgaGF2ZSB0aGlzIGxpbWl0YXRpb24uCgptYXRjaGRlbGV0ZSh7aWR9KQkJCSAgICAgICAqbWF0Y2hkZWxldGUoKSogKkU4MDIqICpFODAzKgoJCURlbGV0ZXMgYSBtYXRjaCB3aXRoIElEIHtpZH0gcHJldmlvdXNseSBkZWZpbmVkIGJ5IHxtYXRjaGFkZCgpfAoJCW9yIG9uZSBvZiB0aGUgfDptYXRjaHwgY29tbWFuZHMuICBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwKCQlvdGhlcndpc2UgLTEuICBTZWUgZXhhbXBsZSBmb3IgfG1hdGNoYWRkKCl8LiAgQWxsIG1hdGNoZXMgY2FuCgkJYmUgZGVsZXRlZCBpbiBvbmUgb3BlcmF0aW9uIGJ5IHxjbGVhcm1hdGNoZXMoKXwuCgptYXRjaGVuZCh7ZXhwcn0sIHtwYXR9Wywge3N0YXJ0fVssIHtjb3VudH1dXSkJCQkqbWF0Y2hlbmQoKSoKCQlTYW1lIGFzIHxtYXRjaCgpfCwgYnV0IHJldHVybiB0aGUgaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyCgkJYWZ0ZXIgdGhlIG1hdGNoLiAgRXhhbXBsZTogPgoJCQk6ZWNobyBtYXRjaGVuZCgidGVzdGluZyIsICJpbmciKQo8CQlyZXN1bHRzIGluICI3Ii4KCQkJCQkJCSpzdHJzcG4oKSogKnN0cmNzcG4oKSoKCQlWaW0gZG9lc24ndCBoYXZlIGEgc3Ryc3BuKCkgb3Igc3RyY3NwbigpIGZ1bmN0aW9uLCBidXQgeW91IGNhbgoJCWRvIGl0IHdpdGggbWF0Y2hlbmQoKTogPgoJCQk6bGV0IHNwYW4gPSBtYXRjaGVuZChsaW5lLCAnW2EtekEtWl0nKQoJCQk6bGV0IHNwYW4gPSBtYXRjaGVuZChsaW5lLCAnW15hLXpBLVpdJykKPAkJRXhjZXB0IHRoYXQgLTEgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUgbm8gbWF0Y2hlcy4KCgkJVGhlIHtzdGFydH0sIGlmIGdpdmVuLCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgfG1hdGNoKCl8LiA+CgkJCTplY2hvIG1hdGNoZW5kKCJ0ZXN0aW5nIiwgImluZyIsIDIpCjwJCXJlc3VsdHMgaW4gIjciLiA+CgkJCTplY2hvIG1hdGNoZW5kKCJ0ZXN0aW5nIiwgImluZyIsIDUpCjwJCXJlc3VsdCBpcyAiLTEiLgoJCVdoZW4ge2V4cHJ9IGlzIGEgfExpc3R8IHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gfG1hdGNoKCl8LgoKbWF0Y2hsaXN0KHtleHByfSwge3BhdH1bLCB7c3RhcnR9Wywge2NvdW50fV1dKQkJCSptYXRjaGxpc3QoKSoKCQlTYW1lIGFzIHxtYXRjaCgpfCwgYnV0IHJldHVybiBhIHxMaXN0fC4gIFRoZSBmaXJzdCBpdGVtIGluIHRoZQoJCWxpc3QgaXMgdGhlIG1hdGNoZWQgc3RyaW5nLCBzYW1lIGFzIHdoYXQgbWF0Y2hzdHIoKSB3b3VsZAoJCXJldHVybi4gIEZvbGxvd2luZyBpdGVtcyBhcmUgc3VibWF0Y2hlcywgbGlrZSAiXDEiLCAiXDIiLCBldGMuCgkJaW4gfDpzdWJzdGl0dXRlfC4gIFdoZW4gYW4gb3B0aW9uYWwgc3VibWF0Y2ggZGlkbid0IG1hdGNoIGFuCgkJZW1wdHkgc3RyaW5nIGlzIHVzZWQuICBFeGFtcGxlOiA+CgkJCWVjaG8gbWF0Y2hsaXN0KCdhY2QnLCAnXChhXClcP1woYlwpXD9cKGNcKVw/XCguKlwpJykKPAkJUmVzdWx0cyBpbjogWydhY2QnLCAnYScsICcnLCAnYycsICdkJywgJycsICcnLCAnJywgJycsICcnXQoJCVdoZW4gdGhlcmUgaXMgbm8gbWF0Y2ggYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KCm1hdGNoc3RyKHtleHByfSwge3BhdH1bLCB7c3RhcnR9Wywge2NvdW50fV1dKQkJCSptYXRjaHN0cigpKgoJCVNhbWUgYXMgfG1hdGNoKCl8LCBidXQgcmV0dXJuIHRoZSBtYXRjaGVkIHN0cmluZy4gIEV4YW1wbGU6ID4KCQkJOmVjaG8gbWF0Y2hzdHIoInRlc3RpbmciLCAiaW5nIikKPAkJcmVzdWx0cyBpbiAiaW5nIi4KCQlXaGVuIHRoZXJlIGlzIG5vIG1hdGNoICIiIGlzIHJldHVybmVkLgoJCVRoZSB7c3RhcnR9LCBpZiBnaXZlbiwgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIHxtYXRjaCgpfC4gPgoJCQk6ZWNobyBtYXRjaHN0cigidGVzdGluZyIsICJpbmciLCAyKQo8CQlyZXN1bHRzIGluICJpbmciLiA+CgkJCTplY2hvIG1hdGNoc3RyKCJ0ZXN0aW5nIiwgImluZyIsIDUpCjwJCXJlc3VsdCBpcyAiIi4KCQlXaGVuIHtleHByfSBpcyBhIHxMaXN0fCB0aGVuIHRoZSBtYXRjaGluZyBpdGVtIGlzIHJldHVybmVkLgoJCVRoZSB0eXBlIGlzbid0IGNoYW5nZWQsIGl0J3Mgbm90IG5lY2Vzc2FyaWx5IGEgU3RyaW5nLgoKCQkJCQkJCSptYXgoKSoKbWF4KHtsaXN0fSkJUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGFsbCBpdGVtcyBpbiB7bGlzdH0uCgkJSWYge2xpc3R9IGlzIG5vdCBhIGxpc3Qgb3Igb25lIG9mIHRoZSBpdGVtcyBpbiB7bGlzdH0gY2Fubm90CgkJYmUgdXNlZCBhcyBhIE51bWJlciB0aGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IuCgkJQW4gZW1wdHkgfExpc3R8IHJlc3VsdHMgaW4gemVyby4KCgkJCQkJCQkqbWluKCkqCm1pbih7bGlzdH0pCVJldHVybiB0aGUgbWluaW11bSB2YWx1ZSBvZiBhbGwgaXRlbXMgaW4ge2xpc3R9LgoJCUlmIHtsaXN0fSBpcyBub3QgYSBsaXN0IG9yIG9uZSBvZiB0aGUgaXRlbXMgaW4ge2xpc3R9IGNhbm5vdAoJCWJlIHVzZWQgYXMgYSBOdW1iZXIgdGhpcyByZXN1bHRzIGluIGFuIGVycm9yLgoJCUFuIGVtcHR5IHxMaXN0fCByZXN1bHRzIGluIHplcm8uCgoJCQkJCQkJKm1rZGlyKCkqICpFNzM5Kgpta2Rpcih7bmFtZX0gWywge3BhdGh9IFssIHtwcm90fV1dKQoJCUNyZWF0ZSBkaXJlY3Rvcnkge25hbWV9LgoJCUlmIHtwYXRofSBpcyAicCIgdGhlbiBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgYXMKCQluZWNlc3NhcnkuICBPdGhlcndpc2UgaXQgbXVzdCBiZSAiIi4KCQlJZiB7cHJvdH0gaXMgZ2l2ZW4gaXQgaXMgdXNlZCB0byBzZXQgdGhlIHByb3RlY3Rpb24gYml0cyBvZgoJCXRoZSBuZXcgZGlyZWN0b3J5LiAgVGhlIGRlZmF1bHQgaXMgMDc1NSAocnd4ci14ci14OiByL3cgZm9yCgkJdGhlIHVzZXIgcmVhZGFibGUgZm9yIG90aGVycykuCVVzZSAwNzAwIHRvIG1ha2UgaXQgdW5yZWFkYWJsZQoJCWZvciBvdGhlcnMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdGhlIGxhc3QgcGFydCBvZiB7bmFtZX0uCgkJVGh1cyBpZiB5b3UgY3JlYXRlIC90bXAvZm9vL2JhciB0aGVuIC90bXAvZm9vIHdpbGwgYmUgY3JlYXRlZAoJCXdpdGggMDc1NS4KCQlFeGFtcGxlOiA+CgkJCTpjYWxsIG1rZGlyKCRIT01FIC4gIi90bXAvZm9vL2JhciIsICJwIiwgMDcwMCkKPAkJVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSB8c2FuZGJveHwuCgkJTm90IGF2YWlsYWJsZSBvbiBhbGwgc3lzdGVtcy4gIFRvIGNoZWNrIHVzZTogPgoJCQk6aWYgZXhpc3RzKCIqbWtkaXIiKQo8CgkJCQkJCQkqbW9kZSgpKgptb2RlKFtleHByXSkJUmV0dXJuIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IG1vZGUuCgkJSWYgW2V4cHJdIGlzIHN1cHBsaWVkIGFuZCBpdCBldmFsdWF0ZXMgdG8gYSBub24temVybyBOdW1iZXIgb3IKCQlhIG5vbi1lbXB0eSBTdHJpbmcgKHxub24temVyby1hcmd8KSwgdGhlbiB0aGUgZnVsbCBtb2RlIGlzCgkJcmV0dXJuZWQsIG90aGVyd2lzZSBvbmx5IHRoZSBmaXJzdCBsZXR0ZXIgaXMgcmV0dXJuZWQuICBOb3RlCgkJdGhhdCAiICIgYW5kICIwIiBhcmUgYWxzbyBub24tZW1wdHkgc3RyaW5ncy4KCgkJCW4JTm9ybWFsCgkJCW5vCU9wZXJhdG9yLXBlbmRpbmcKCQkJdglWaXN1YWwgYnkgY2hhcmFjdGVyCgkJCVYJVmlzdWFsIGJ5IGxpbmUKCQkJQ1RSTC1WCVZpc3VhbCBibG9ja3dpc2UKCQkJcwlTZWxlY3QgYnkgY2hhcmFjdGVyCgkJCVMJU2VsZWN0IGJ5IGxpbmUKCQkJQ1RSTC1TCVNlbGVjdCBibG9ja3dpc2UKCQkJaQlJbnNlcnQKCQkJUglSZXBsYWNlIHxSfAoJCQlSdglWaXJ0dWFsIFJlcGxhY2UgfGdSfAoJCQljCUNvbW1hbmQtbGluZQoJCQljdglWaW0gRXggbW9kZSB8Z1F8CgkJCWNlCU5vcm1hbCBFeCBtb2RlIHxRfAoJCQlyCUhpdC1lbnRlciBwcm9tcHQKCQkJcm0JVGhlIC0tIG1vcmUgLS0gcHJvbXB0CgkJCXI/CUEgfDpjb25maXJtfCBxdWVyeSBvZiBzb21lIHNvcnQKCQkJIQlTaGVsbCBvciBleHRlcm5hbCBjb21tYW5kIGlzIGV4ZWN1dGluZwoJCVRoaXMgaXMgdXNlZnVsIGluIHRoZSAnc3RhdHVzbGluZScgb3B0aW9uIG9yIHdoZW4gdXNlZAoJCXdpdGggfHJlbW90ZV9leHByKCl8IEluIG1vc3Qgb3RoZXIgcGxhY2VzIGl0IGFsd2F5cyByZXR1cm5zCgkJImMiIG9yICJuIi4KCQlBbHNvIHNlZSB8dmlzdWFsbW9kZSgpfC4KCm16ZXZhbCh7ZXhwcn0pCQkJCQkJCSptemV2YWwoKSoKCQlFdmFsdWF0ZSBNelNjaGVtZSBleHByZXNzaW9uIHtleHByfSBhbmQgcmV0dXJuIGl0cyByZXN1bHQKCQljb252ZXJ0ZWQgdG8gVmltIGRhdGEgc3RydWN0dXJlcy4KCQlOdW1iZXJzIGFuZCBzdHJpbmdzIGFyZSByZXR1cm5lZCBhcyB0aGV5IGFyZS4KCQlQYWlycyAoaW5jbHVkaW5nIGxpc3RzIGFuZCBpbXByb3BlciBsaXN0cykgYW5kIHZlY3RvcnMgYXJlCgkJcmV0dXJuZWQgYXMgVmltIHxMaXN0c3wuCgkJSGFzaCB0YWJsZXMgYXJlIHJlcHJlc2VudGVkIGFzIFZpbSB8RGljdGlvbmFyeXwgdHlwZSB3aXRoIGtleXMKCQljb252ZXJ0ZWQgdG8gc3RyaW5ncy4KCQlBbGwgb3RoZXIgdHlwZXMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmcgd2l0aCBkaXNwbGF5IGZ1bmN0aW9uLgoJCUV4YW1wbGVzOiA+CgkJICAgIDpteiAoZGVmaW5lIGwgKGxpc3QgMSAyIDMpKQoJCSAgICA6bXogKGRlZmluZSBoIChtYWtlLWhhc2gpKSAoaGFzaC1zZXQhIGggImxpc3QiIGwpCgkJICAgIDplY2hvIG16ZXZhbCgibCIpCgkJICAgIDplY2hvIG16ZXZhbCgiaCIpCjwKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K216c2NoZW1lfCBmZWF0dXJlfQoKbmV4dG5vbmJsYW5rKHtsbnVtfSkJCQkJCSpuZXh0bm9uYmxhbmsoKSoKCQlSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBmaXJzdCBsaW5lIGF0IG9yIGJlbG93IHtsbnVtfQoJCXRoYXQgaXMgbm90IGJsYW5rLiAgRXhhbXBsZTogPgoJCQlpZiBnZXRsaW5lKG5leHRub25ibGFuaygxKSkgPX4gIkphdmEiCjwJCVdoZW4ge2xudW19IGlzIGludmFsaWQgb3IgdGhlcmUgaXMgbm8gbm9uLWJsYW5rIGxpbmUgYXQgb3IKCQliZWxvdyBpdCwgemVybyBpcyByZXR1cm5lZC4KCQlTZWUgYWxzbyB8cHJldm5vbmJsYW5rKCl8LgoKbnIyY2hhcih7ZXhwcn1bLCB7dXRmOH1dKQkJCQkqbnIyY2hhcigpKgoJCVJldHVybiBhIHN0cmluZyB3aXRoIGEgc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggaGFzIHRoZSBudW1iZXIKCQl2YWx1ZSB7ZXhwcn0uICBFeGFtcGxlczogPgoJCQlucjJjaGFyKDY0KQkJcmV0dXJucyAiQCIKCQkJbnIyY2hhcigzMikJCXJldHVybnMgIiAiCjwJCVdoZW4ge3V0Zjh9IGlzIG9taXR0ZWQgb3IgemVybywgdGhlIGN1cnJlbnQgJ2VuY29kaW5nJyBpcyB1c2VkLgoJCUV4YW1wbGUgZm9yICJ1dGYtOCI6ID4KCQkJbnIyY2hhcigzMDApCQlyZXR1cm5zIEkgd2l0aCBib3cgY2hhcmFjdGVyCjwJCVdpdGgge3V0Zjh9IHNldCB0byAxLCBhbHdheXMgcmV0dXJuIHV0Zi04IGNoYXJhY3RlcnMuCgkJTm90ZSB0aGF0IGEgTlVMIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBpcyBzcGVjaWZpZWQgd2l0aAoJCW5yMmNoYXIoMTApLCBiZWNhdXNlIE5VTHMgYXJlIHJlcHJlc2VudGVkIHdpdGggbmV3bGluZQoJCWNoYXJhY3RlcnMuICBucjJjaGFyKDApIGlzIGEgcmVhbCBOVUwgYW5kIHRlcm1pbmF0ZXMgdGhlCgkJc3RyaW5nLCB0aHVzIHJlc3VsdHMgaW4gYW4gZW1wdHkgc3RyaW5nLgoKb3Ioe2V4cHJ9LCB7ZXhwcn0pCQkJCQkqb3IoKSoKCQlCaXR3aXNlIE9SIG9uIHRoZSB0d28gYXJndW1lbnRzLiAgVGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkCgkJdG8gYSBudW1iZXIuICBBIExpc3QsIERpY3Qgb3IgRmxvYXQgYXJndW1lbnQgY2F1c2VzIGFuIGVycm9yLgoJCUV4YW1wbGU6ID4KCQkJOmxldCBiaXRzID0gb3IoYml0cywgMHg4MCkKCgpwYXRoc2hvcnRlbih7ZXhwcn0pCQkJCQkqcGF0aHNob3J0ZW4oKSoKCQlTaG9ydGVuIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgcGF0aCB7ZXhwcn0gYW5kIHJldHVybiB0aGUKCQlyZXN1bHQuICBUaGUgdGFpbCwgdGhlIGZpbGUgbmFtZSwgaXMga2VwdCBhcy1pcy4gIFRoZSBvdGhlcgoJCWNvbXBvbmVudHMgaW4gdGhlIHBhdGggYXJlIHJlZHVjZWQgdG8gc2luZ2xlIGxldHRlcnMuICBMZWFkaW5nCgkJJ34nIGFuZCAnLicgY2hhcmFjdGVycyBhcmUga2VwdC4gIEV4YW1wbGU6ID4KCQkJOmVjaG8gcGF0aHNob3J0ZW4oJ34vLnZpbS9hdXRvbG9hZC9teWZpbGUudmltJykKPAkJCX4vLnYvYS9teWZpbGUudmltIH4KCQlJdCBkb2Vzbid0IG1hdHRlciBpZiB0aGUgcGF0aCBleGlzdHMgb3Igbm90LgoKcGVybGV2YWwoe2V4cHJ9KQkJCQkJKnBlcmxldmFsKCkqCgkJRXZhbHVhdGUgUGVybCBleHByZXNzaW9uIHtleHByfSBpbiBzY2FsYXIgY29udGV4dCBhbmQgcmV0dXJuCgkJaXRzIHJlc3VsdCBjb252ZXJ0ZWQgdG8gVmltIGRhdGEgc3RydWN0dXJlcy4gSWYgdmFsdWUgY2FuJ3QgYmUKCQljb252ZXJ0ZWQsIGl0IGlzIHJldHVybmVkIGFzIGEgc3RyaW5nIFBlcmwgcmVwcmVzZW50YXRpb24uCgkJTm90ZTogSWYgeW91IHdhbnQgYW4gYXJyYXkgb3IgaGFzaCwge2V4cHJ9IG11c3QgcmV0dXJuIGEKCQlyZWZlcmVuY2UgdG8gaXQuCgkJRXhhbXBsZTogPgoJCQk6ZWNobyBwZXJsZXZhbCgnWzEgLi4gNF0nKQo8CQkJWzEsIDIsIDMsIDRdCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtwZXJsfCBmZWF0dXJlfQoKcG93KHt4fSwge3l9KQkJCQkJCSpwb3coKSoKCQlSZXR1cm4gdGhlIHBvd2VyIG9mIHt4fSB0byB0aGUgZXhwb25lbnQge3l9IGFzIGEgfEZsb2F0fC4KCQl7eH0gYW5kIHt5fSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIHBvdygzLCAzKQo8CQkJMjcuMCA+CgkJCTplY2hvIHBvdygyLCAxNikKPAkJCTY1NTM2LjAgPgoJCQk6ZWNobyBwb3coMzIsIDAuMjApCjwJCQkyLjAKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoJCQpwcmV2bm9uYmxhbmsoe2xudW19KQkJCQkJKnByZXZub25ibGFuaygpKgoJCVJldHVybiB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGZpcnN0IGxpbmUgYXQgb3IgYWJvdmUge2xudW19CgkJdGhhdCBpcyBub3QgYmxhbmsuICBFeGFtcGxlOiA+CgkJCWxldCBpbmQgPSBpbmRlbnQocHJldm5vbmJsYW5rKHY6bG51bSAtIDEpKQo8CQlXaGVuIHtsbnVtfSBpcyBpbnZhbGlkIG9yIHRoZXJlIGlzIG5vIG5vbi1ibGFuayBsaW5lIGF0IG9yCgkJYWJvdmUgaXQsIHplcm8gaXMgcmV0dXJuZWQuCgkJQWxzbyBzZWUgfG5leHRub25ibGFuaygpfC4KCgpwcmludGYoe2ZtdH0sIHtleHByMX0gLi4uKQkJCQkqcHJpbnRmKCkqCgkJUmV0dXJuIGEgU3RyaW5nIHdpdGgge2ZtdH0sIHdoZXJlICIlIiBpdGVtcyBhcmUgcmVwbGFjZWQgYnkKCQl0aGUgZm9ybWF0dGVkIGZvcm0gb2YgdGhlaXIgcmVzcGVjdGl2ZSBhcmd1bWVudHMuICBFeGFtcGxlOiA+CgkJCXByaW50ZigiJTRkOiBFJWQgJS4zMHMiLCBsbnVtLCBlcnJubywgbXNnKQo8CQlNYXkgcmVzdWx0IGluOgoJCQkiICA5OTogRTQyIGFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhcyIgfgoKCQlPZnRlbiB1c2VkIGl0ZW1zIGFyZToKCQkgICVzCXN0cmluZwoJCSAgJTZTCXN0cmluZyByaWdodC1hbGlnbmVkIGluIDYgZGlzcGxheSBjZWxscwoJCSAgJTZzCXN0cmluZyByaWdodC1hbGlnbmVkIGluIDYgYnl0ZXMKCQkgICUuOXMJc3RyaW5nIHRydW5jYXRlZCB0byA5IGJ5dGVzCgkJICAlYwlzaW5nbGUgYnl0ZQoJCSAgJWQJZGVjaW1hbCBudW1iZXIKCQkgICU1ZAlkZWNpbWFsIG51bWJlciBwYWRkZWQgd2l0aCBzcGFjZXMgdG8gNSBjaGFyYWN0ZXJzCgkJICAleAloZXggbnVtYmVyCgkJICAlMDR4CWhleCBudW1iZXIgcGFkZGVkIHdpdGggemVyb3MgdG8gYXQgbGVhc3QgNCBjaGFyYWN0ZXJzCgkJICAlWAloZXggbnVtYmVyIHVzaW5nIHVwcGVyIGNhc2UgbGV0dGVycwoJCSAgJW8Jb2N0YWwgbnVtYmVyCgkJICAlZglmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gdGhlIGZvcm0gMTIzLjQ1NgoJCSAgJWUJZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGluIHRoZSBmb3JtIDEuMjM0ZTMKCQkgICVFCWZsb2F0aW5nIHBvaW50IG51bWJlciBpbiB0aGUgZm9ybSAxLjIzNEUzCgkJICAlZwlmbG9hdGluZyBwb2ludCBudW1iZXIsIGFzICVmIG9yICVlIGRlcGVuZGluZyBvbiB2YWx1ZQoJCSAgJUcJZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBhcyAlZiBvciAlRSBkZXBlbmRpbmcgb24gdmFsdWUKCQkgICUlCXRoZSAlIGNoYXJhY3RlciBpdHNlbGYKCgkJQ29udmVyc2lvbiBzcGVjaWZpY2F0aW9ucyBzdGFydCB3aXRoICclJyBhbmQgZW5kIHdpdGggdGhlCgkJY29udmVyc2lvbiB0eXBlLiAgQWxsIG90aGVyIGNoYXJhY3RlcnMgYXJlIGNvcGllZCB1bmNoYW5nZWQgdG8KCQl0aGUgcmVzdWx0LgoKCQlUaGUgIiUiIHN0YXJ0cyBhIGNvbnZlcnNpb24gc3BlY2lmaWNhdGlvbi4gIFRoZSBmb2xsb3dpbmcKCQlhcmd1bWVudHMgYXBwZWFyIGluIHNlcXVlbmNlOgoKCQkJJSAgW2ZsYWdzXSAgW2ZpZWxkLXdpZHRoXSAgWy5wcmVjaXNpb25dICB0eXBlCgoJCWZsYWdzCgkJCVplcm8gb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgoKCQkgICAgIwkgICAgICBUaGUgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiAiYWx0ZXJuYXRlCgkJCSAgICAgIGZvcm0iLiAgRm9yIGMsIGQsIGFuZCBzIGNvbnZlcnNpb25zLCB0aGlzIG9wdGlvbgoJCQkgICAgICBoYXMgbm8gZWZmZWN0LiAgRm9yIG8gY29udmVyc2lvbnMsIHRoZSBwcmVjaXNpb24KCQkJICAgICAgb2YgdGhlIG51bWJlciBpcyBpbmNyZWFzZWQgdG8gZm9yY2UgdGhlIGZpcnN0CgkJCSAgICAgIGNoYXJhY3RlciBvZiB0aGUgb3V0cHV0IHN0cmluZyB0byBhIHplcm8gKGV4Y2VwdAoJCQkgICAgICBpZiBhIHplcm8gdmFsdWUgaXMgcHJpbnRlZCB3aXRoIGFuIGV4cGxpY2l0CgkJCSAgICAgIHByZWNpc2lvbiBvZiB6ZXJvKS4KCQkJICAgICAgRm9yIHggYW5kIFggY29udmVyc2lvbnMsIGEgbm9uLXplcm8gcmVzdWx0IGhhcwoJCQkgICAgICB0aGUgc3RyaW5nICIweCIgKG9yICIwWCIgZm9yIFggY29udmVyc2lvbnMpCgkJCSAgICAgIHByZXBlbmRlZCB0byBpdC4KCgkJICAgIDAgKHplcm8pICBaZXJvIHBhZGRpbmcuICBGb3IgYWxsIGNvbnZlcnNpb25zIHRoZSBjb252ZXJ0ZWQKCQkJICAgICAgdmFsdWUgaXMgcGFkZGVkIG9uIHRoZSBsZWZ0IHdpdGggemVyb3MgcmF0aGVyCgkJCSAgICAgIHRoYW4gYmxhbmtzLiAgSWYgYSBwcmVjaXNpb24gaXMgZ2l2ZW4gd2l0aCBhCgkJCSAgICAgIG51bWVyaWMgY29udmVyc2lvbiAoZCwgbywgeCwgYW5kIFgpLCB0aGUgMCBmbGFnCgkJCSAgICAgIGlzIGlnbm9yZWQuCgoJCSAgICAtCSAgICAgIEEgbmVnYXRpdmUgZmllbGQgd2lkdGggZmxhZzsgdGhlIGNvbnZlcnRlZCB2YWx1ZQoJCQkgICAgICBpcyB0byBiZSBsZWZ0IGFkanVzdGVkIG9uIHRoZSBmaWVsZCBib3VuZGFyeS4KCQkJICAgICAgVGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBwYWRkZWQgb24gdGhlIHJpZ2h0IHdpdGgKCQkJICAgICAgYmxhbmtzLCByYXRoZXIgdGhhbiBvbiB0aGUgbGVmdCB3aXRoIGJsYW5rcyBvcgoJCQkgICAgICB6ZXJvcy4gIEEgLSBvdmVycmlkZXMgYSAwIGlmIGJvdGggYXJlIGdpdmVuLgoKCQkgICAgJyAnIChzcGFjZSkgIEEgYmxhbmsgc2hvdWxkIGJlIGxlZnQgYmVmb3JlIGEgcG9zaXRpdmUKCQkJICAgICAgbnVtYmVyIHByb2R1Y2VkIGJ5IGEgc2lnbmVkIGNvbnZlcnNpb24gKGQpLgoKCQkgICAgKwkgICAgICBBIHNpZ24gbXVzdCBhbHdheXMgYmUgcGxhY2VkIGJlZm9yZSBhIG51bWJlcgoJCQkgICAgICBwcm9kdWNlZCBieSBhIHNpZ25lZCBjb252ZXJzaW9uLglBICsgb3ZlcnJpZGVzCgkJCSAgICAgIGEgc3BhY2UgaWYgYm90aCBhcmUgdXNlZC4KCgkJZmllbGQtd2lkdGgKCQkJQW4gb3B0aW9uYWwgZGVjaW1hbCBkaWdpdCBzdHJpbmcgc3BlY2lmeWluZyBhIG1pbmltdW0KCQkJZmllbGQgd2lkdGguICBJZiB0aGUgY29udmVydGVkIHZhbHVlIGhhcyBmZXdlciBieXRlcwoJCQl0aGFuIHRoZSBmaWVsZCB3aWR0aCwgaXQgd2lsbCBiZSBwYWRkZWQgd2l0aCBzcGFjZXMgb24KCQkJdGhlIGxlZnQgKG9yIHJpZ2h0LCBpZiB0aGUgbGVmdC1hZGp1c3RtZW50IGZsYWcgaGFzCgkJCWJlZW4gZ2l2ZW4pIHRvIGZpbGwgb3V0IHRoZSBmaWVsZCB3aWR0aC4KCgkJLnByZWNpc2lvbgoJCQlBbiBvcHRpb25hbCBwcmVjaXNpb24sIGluIHRoZSBmb3JtIG9mIGEgcGVyaW9kICcuJwoJCQlmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBkaWdpdCBzdHJpbmcuICBJZiB0aGUgZGlnaXQKCQkJc3RyaW5nIGlzIG9taXR0ZWQsIHRoZSBwcmVjaXNpb24gaXMgdGFrZW4gYXMgemVyby4KCQkJVGhpcyBnaXZlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIHRvIGFwcGVhciBmb3IKCQkJZCwgbywgeCwgYW5kIFggY29udmVyc2lvbnMsIG9yIHRoZSBtYXhpbXVtIG51bWJlciBvZgoJCQlieXRlcyB0byBiZSBwcmludGVkIGZyb20gYSBzdHJpbmcgZm9yIHMgY29udmVyc2lvbnMuCgkJCUZvciBmbG9hdGluZyBwb2ludCBpdCBpcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlcgoJCQl0aGUgZGVjaW1hbCBwb2ludC4KCgkJdHlwZQoJCQlBIGNoYXJhY3RlciB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBjb252ZXJzaW9uIHRvCgkJCWJlIGFwcGxpZWQsIHNlZSBiZWxvdy4KCgkJQSBmaWVsZCB3aWR0aCBvciBwcmVjaXNpb24sIG9yIGJvdGgsIG1heSBiZSBpbmRpY2F0ZWQgYnkgYW4KCQlhc3RlcmlzayAnKicgaW5zdGVhZCBvZiBhIGRpZ2l0IHN0cmluZy4gIEluIHRoaXMgY2FzZSwgYQoJCU51bWJlciBhcmd1bWVudCBzdXBwbGllcyB0aGUgZmllbGQgd2lkdGggb3IgcHJlY2lzaW9uLglBCgkJbmVnYXRpdmUgZmllbGQgd2lkdGggaXMgdHJlYXRlZCBhcyBhIGxlZnQgYWRqdXN0bWVudCBmbGFnCgkJZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBmaWVsZCB3aWR0aDsgYSBuZWdhdGl2ZSBwcmVjaXNpb24gaXMKCQl0cmVhdGVkIGFzIHRob3VnaCBpdCB3ZXJlIG1pc3NpbmcuICBFeGFtcGxlOiA+CgkJCTplY2hvIHByaW50ZigiJWQ6ICUuKnMiLCBuciwgd2lkdGgsIGxpbmUpCjwJCVRoaXMgbGltaXRzIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdXNlZCBmcm9tICJsaW5lIiB0bwoJCSJ3aWR0aCIgYnl0ZXMuCgoJCVRoZSBjb252ZXJzaW9uIHNwZWNpZmllcnMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZToKCgkJCQkqcHJpbnRmLWQqICpwcmludGYtbyogKnByaW50Zi14KiAqcHJpbnRmLVgqCgkJZG94WAlUaGUgTnVtYmVyIGFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBzaWduZWQgZGVjaW1hbAoJCQkoZCksIHVuc2lnbmVkIG9jdGFsIChvKSwgb3IgdW5zaWduZWQgaGV4YWRlY2ltYWwgKHgKCQkJYW5kIFgpIG5vdGF0aW9uLiAgVGhlIGxldHRlcnMgImFiY2RlZiIgYXJlIHVzZWQgZm9yCgkJCXggY29udmVyc2lvbnM7IHRoZSBsZXR0ZXJzICJBQkNERUYiIGFyZSB1c2VkIGZvciBYCgkJCWNvbnZlcnNpb25zLgoJCQlUaGUgcHJlY2lzaW9uLCBpZiBhbnksIGdpdmVzIHRoZSBtaW5pbXVtIG51bWJlciBvZgoJCQlkaWdpdHMgdGhhdCBtdXN0IGFwcGVhcjsgaWYgdGhlIGNvbnZlcnRlZCB2YWx1ZQoJCQlyZXF1aXJlcyBmZXdlciBkaWdpdHMsIGl0IGlzIHBhZGRlZCBvbiB0aGUgbGVmdCB3aXRoCgkJCXplcm9zLgoJCQlJbiBubyBjYXNlIGRvZXMgYSBub24tZXhpc3RlbnQgb3Igc21hbGwgZmllbGQgd2lkdGgKCQkJY2F1c2UgdHJ1bmNhdGlvbiBvZiBhIG51bWVyaWMgZmllbGQ7IGlmIHRoZSByZXN1bHQgb2YKCQkJYSBjb252ZXJzaW9uIGlzIHdpZGVyIHRoYW4gdGhlIGZpZWxkIHdpZHRoLCB0aGUgZmllbGQKCQkJaXMgZXhwYW5kZWQgdG8gY29udGFpbiB0aGUgY29udmVyc2lvbiByZXN1bHQuCgoJCQkJCQkJKnByaW50Zi1jKgoJCWMJVGhlIE51bWJlciBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gYSBieXRlLCBhbmQgdGhlCgkJCXJlc3VsdGluZyBjaGFyYWN0ZXIgaXMgd3JpdHRlbi4KCgkJCQkJCQkqcHJpbnRmLXMqCgkJcwlUaGUgdGV4dCBvZiB0aGUgU3RyaW5nIGFyZ3VtZW50IGlzIHVzZWQuICBJZiBhCgkJCXByZWNpc2lvbiBpcyBzcGVjaWZpZWQsIG5vIG1vcmUgYnl0ZXMgdGhhbiB0aGUgbnVtYmVyCgkJCXNwZWNpZmllZCBhcmUgdXNlZC4KCQkJCQkJCSpwcmludGYtUyoKCQlTCVRoZSB0ZXh0IG9mIHRoZSBTdHJpbmcgYXJndW1lbnQgaXMgdXNlZC4gIElmIGEKCQkJcHJlY2lzaW9uIGlzIHNwZWNpZmllZCwgbm8gbW9yZSBkaXNwbGF5IGNlbGxzIHRoYW4gdGhlCgkJCW51bWJlciBzcGVjaWZpZWQgYXJlIHVzZWQuICBXaXRob3V0IHRoZSB8K211bHRpX2J5dGV8CgkJCWZlYXR1cmUgd29ya3MganVzdCBsaWtlICdzJy4KCgkJCQkJCQkqcHJpbnRmLWYqICpFODA3KgoJCWYJVGhlIEZsb2F0IGFyZ3VtZW50IGlzIGNvbnZlcnRlZCBpbnRvIGEgc3RyaW5nIG9mIHRoZSAKCQkJZm9ybSAxMjMuNDU2LiAgVGhlIHByZWNpc2lvbiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgoJCQlkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBXaGVuIHRoZSBwcmVjaXNpb24gaXMKCQkJemVybyB0aGUgZGVjaW1hbCBwb2ludCBpcyBvbWl0dGVkLiAgV2hlbiB0aGUgcHJlY2lzaW9uCgkJCWlzIG5vdCBzcGVjaWZpZWQgNiBpcyB1c2VkLiAgQSByZWFsbHkgYmlnIG51bWJlcgoJCQkob3V0IG9mIHJhbmdlIG9yIGRpdmlkaW5nIGJ5IHplcm8pIHJlc3VsdHMgaW4gImluZiIuCgkJCSIwLjAgLyAwLjAiIHJlc3VsdHMgaW4gIm5hbiIuCgkJCUV4YW1wbGU6ID4KCQkJCWVjaG8gcHJpbnRmKCIlLjJmIiwgMTIuMTE1KQo8CQkJCTEyLjEyCgkJCU5vdGUgdGhhdCByb3VuZG9mZiBkZXBlbmRzIG9uIHRoZSBzeXN0ZW0gbGlicmFyaWVzLgoJCQlVc2UgfHJvdW5kKCl8IHdoZW4gaW4gZG91YnQuCgoJCQkJCQkJKnByaW50Zi1lKiAqcHJpbnRmLUUqCgkJZSBFCVRoZSBGbG9hdCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgaW50byBhIHN0cmluZyBvZiB0aGUKCQkJZm9ybSAxLjIzNGUrMDMgb3IgMS4yMzRFKzAzIHdoZW4gdXNpbmcgJ0UnLiAgVGhlCgkJCXByZWNpc2lvbiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlCgkJCWRlY2ltYWwgcG9pbnQsIGxpa2Ugd2l0aCAnZicuCgoJCQkJCQkJKnByaW50Zi1nKiAqcHJpbnRmLUcqCgkJZyBHCVRoZSBGbG9hdCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgbGlrZSB3aXRoICdmJyBpZiB0aGUKCQkJdmFsdWUgaXMgYmV0d2VlbiAwLjAwMSAoaW5jbHVzaXZlKSBhbmQgMTAwMDAwMDAuMAoJCQkoZXhjbHVzaXZlKS4gIE90aGVyd2lzZSAnZScgaXMgdXNlZCBmb3IgJ2cnIGFuZCAnRScKCQkJZm9yICdHJy4gIFdoZW4gbm8gcHJlY2lzaW9uIGlzIHNwZWNpZmllZCBzdXBlcmZsdW91cwoJCQl6ZXJvZXMgYW5kICcrJyBzaWducyBhcmUgcmVtb3ZlZCwgZXhjZXB0IGZvciB0aGUgemVybwoJCQlpbW1lZGlhdGVseSBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gIFRodXMgMTAwMDAwMDAuMAoJCQlyZXN1bHRzIGluIDEuMGU3LgoKCQkJCQkJCSpwcmludGYtJSoKCQklCUEgJyUnIGlzIHdyaXR0ZW4uICBObyBhcmd1bWVudCBpcyBjb252ZXJ0ZWQuICBUaGUKCQkJY29tcGxldGUgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uIGlzICIlJSIuCgoJCVdoZW4gYSBOdW1iZXIgYXJndW1lbnQgaXMgZXhwZWN0ZWQgYSBTdHJpbmcgYXJndW1lbnQgaXMgYWxzbwoJCWFjY2VwdGVkIGFuZCBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZC4KCQlXaGVuIGEgRmxvYXQgb3IgU3RyaW5nIGFyZ3VtZW50IGlzIGV4cGVjdGVkIGEgTnVtYmVyIGFyZ3VtZW50CgkJaXMgYWxzbyBhY2NlcHRlZCBhbmQgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQuCgkJQW55IG90aGVyIGFyZ3VtZW50IHR5cGUgcmVzdWx0cyBpbiBhbiBlcnJvciBtZXNzYWdlLgoKCQkJCQkJCSpFNzY2KiAqRTc2NyoKCQlUaGUgbnVtYmVyIG9mIHtleHByTn0gYXJndW1lbnRzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUgbnVtYmVyCgkJb2YgIiUiIGl0ZW1zLiAgSWYgdGhlcmUgYXJlIG5vdCBzdWZmaWNpZW50IG9yIHRvbyBtYW55CgkJYXJndW1lbnRzIGFuIGVycm9yIGlzIGdpdmVuLiAgVXAgdG8gMTggYXJndW1lbnRzIGNhbiBiZSB1c2VkLgoKCnB1bXZpc2libGUoKQkJCQkJCSpwdW12aXNpYmxlKCkqCgkJUmV0dXJucyBub24temVybyB3aGVuIHRoZSBwb3B1cCBtZW51IGlzIHZpc2libGUsIHplcm8KCQlvdGhlcndpc2UuICBTZWUgfGlucy1jb21wbGV0aW9uLW1lbnV8LgoJCVRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgc29tZSB0aGluZ3MgdGhhdCB3b3VsZCByZW1vdmUgdGhlCgkJcG9wdXAgbWVudS4KCgkJCQkJCQkqRTg2MCoKcHkzZXZhbCh7ZXhwcn0pCQkJCQkJKnB5M2V2YWwoKSoKCQlFdmFsdWF0ZSBQeXRob24gZXhwcmVzc2lvbiB7ZXhwcn0gYW5kIHJldHVybiBpdHMgcmVzdWx0CgkJY29udmVydGVkIHRvIFZpbSBkYXRhIHN0cnVjdHVyZXMuCgkJTnVtYmVycyBhbmQgc3RyaW5ncyBhcmUgcmV0dXJuZWQgYXMgdGhleSBhcmUgKHN0cmluZ3MgYXJlIAoJCWNvcGllZCB0aG91Z2gsIFVuaWNvZGUgc3RyaW5ncyBhcmUgYWRkaXRpb25hbGx5IGNvbnZlcnRlZCB0byAKCQknZW5jb2RpbmcnKS4KCQlMaXN0cyBhcmUgcmVwcmVzZW50ZWQgYXMgVmltIHxMaXN0fCB0eXBlLgoJCURpY3Rpb25hcmllcyBhcmUgcmVwcmVzZW50ZWQgYXMgVmltIHxEaWN0aW9uYXJ5fCB0eXBlIHdpdGggCgkJa2V5cyBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4KCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K3B5dGhvbjN8IGZlYXR1cmV9CgoJCQkJCQkJKkU4NTgqICpFODU5KgpweWV2YWwoe2V4cHJ9KQkJCQkJCSpweWV2YWwoKSoKCQlFdmFsdWF0ZSBQeXRob24gZXhwcmVzc2lvbiB7ZXhwcn0gYW5kIHJldHVybiBpdHMgcmVzdWx0CgkJY29udmVydGVkIHRvIFZpbSBkYXRhIHN0cnVjdHVyZXMuCgkJTnVtYmVycyBhbmQgc3RyaW5ncyBhcmUgcmV0dXJuZWQgYXMgdGhleSBhcmUgKHN0cmluZ3MgYXJlIAoJCWNvcGllZCB0aG91Z2gpLgoJCUxpc3RzIGFyZSByZXByZXNlbnRlZCBhcyBWaW0gfExpc3R8IHR5cGUuCgkJRGljdGlvbmFyaWVzIGFyZSByZXByZXNlbnRlZCBhcyBWaW0gfERpY3Rpb25hcnl8IHR5cGUsIAoJCW5vbi1zdHJpbmcga2V5cyByZXN1bHQgaW4gZXJyb3IuCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtweXRob258IGZlYXR1cmV9CgoJCQkJCQkJKkU3MjYqICpFNzI3KgpyYW5nZSh7ZXhwcn0gWywge21heH0gWywge3N0cmlkZX1dXSkJCQkJKnJhbmdlKCkqCgkJUmV0dXJucyBhIHxMaXN0fCB3aXRoIE51bWJlcnM6CgkJLSBJZiBvbmx5IHtleHByfSBpcyBzcGVjaWZpZWQ6IFswLCAxLCAuLi4sIHtleHByfSAtIDFdCgkJLSBJZiB7bWF4fSBpcyBzcGVjaWZpZWQ6IFt7ZXhwcn0sIHtleHByfSArIDEsIC4uLiwge21heH1dCgkJLSBJZiB7c3RyaWRlfSBpcyBzcGVjaWZpZWQ6IFt7ZXhwcn0sIHtleHByfSArIHtzdHJpZGV9LCAuLi4sCgkJICB7bWF4fV0gKGluY3JlYXNpbmcge2V4cHJ9IHdpdGgge3N0cmlkZX0gZWFjaCB0aW1lLCBub3QKCQkgIHByb2R1Y2luZyBhIHZhbHVlIHBhc3Qge21heH0pLgoJCVdoZW4gdGhlIG1heGltdW0gaXMgb25lIGJlZm9yZSB0aGUgc3RhcnQgdGhlIHJlc3VsdCBpcyBhbgoJCWVtcHR5IGxpc3QuICBXaGVuIHRoZSBtYXhpbXVtIGlzIG1vcmUgdGhhbiBvbmUgYmVmb3JlIHRoZQoJCXN0YXJ0IHRoaXMgaXMgYW4gZXJyb3IuCgkJRXhhbXBsZXM6ID4KCQkJcmFuZ2UoNCkJCSIgWzAsIDEsIDIsIDNdCgkJCXJhbmdlKDIsIDQpCQkiIFsyLCAzLCA0XQoJCQlyYW5nZSgyLCA5LCAzKQkJIiBbMiwgNSwgOF0KCQkJcmFuZ2UoMiwgLTIsIC0xKQkiIFsyLCAxLCAwLCAtMSwgLTJdCgkJCXJhbmdlKDApCQkiIFtdCgkJCXJhbmdlKDIsIDApCQkiIGVycm9yIQo8CgkJCQkJCQkqcmVhZGZpbGUoKSoKcmVhZGZpbGUoe2ZuYW1lfSBbLCB7YmluYXJ5fSBbLCB7bWF4fV1dKQoJCVJlYWQgZmlsZSB7Zm5hbWV9IGFuZCByZXR1cm4gYSB8TGlzdHwsIGVhY2ggbGluZSBvZiB0aGUgZmlsZQoJCWFzIGFuIGl0ZW0uICBMaW5lcyBicm9rZW4gYXQgTkwgY2hhcmFjdGVycy4gIE1hY2ludG9zaCBmaWxlcwoJCXNlcGFyYXRlZCB3aXRoIENSIHdpbGwgcmVzdWx0IGluIGEgc2luZ2xlIGxvbmcgbGluZSAodW5sZXNzIGEKCQlOTCBhcHBlYXJzIHNvbWV3aGVyZSkuCgkJQWxsIE5VTCBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgTkwgY2hhcmFjdGVyLgoJCVdoZW4ge2JpbmFyeX0gY29udGFpbnMgImIiIGJpbmFyeSBtb2RlIGlzIHVzZWQ6CgkJLSBXaGVuIHRoZSBsYXN0IGxpbmUgZW5kcyBpbiBhIE5MIGFuIGV4dHJhIGVtcHR5IGxpc3QgaXRlbSBpcwoJCSAgYWRkZWQuCgkJLSBObyBDUiBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkLgoJCU90aGVyd2lzZToKCQktIENSIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgYmVmb3JlIGEgTkwgYXJlIHJlbW92ZWQuCgkJLSBXaGV0aGVyIHRoZSBsYXN0IGxpbmUgZW5kcyBpbiBhIE5MIG9yIG5vdCBkb2VzIG5vdCBtYXR0ZXIuCgkJLSBXaGVuICdlbmNvZGluZycgaXMgVW5pY29kZSBhbnkgVVRGLTggYnl0ZSBvcmRlciBtYXJrIGlzCgkJICByZW1vdmVkIGZyb20gdGhlIHRleHQuCgkJV2hlbiB7bWF4fSBpcyBnaXZlbiB0aGlzIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMKCQl0byBiZSByZWFkLiAgVXNlZnVsIGlmIHlvdSBvbmx5IHdhbnQgdG8gY2hlY2sgdGhlIGZpcnN0IHRlbgoJCWxpbmVzIG9mIGEgZmlsZTogPgoJCQk6Zm9yIGxpbmUgaW4gcmVhZGZpbGUoZm5hbWUsICcnLCAxMCkKCQkJOiAgaWYgbGluZSA9fiAnRGF0ZScgfCBlY2hvIGxpbmUgfCBlbmRpZgoJCQk6ZW5kZm9yCjwJCVdoZW4ge21heH0gaXMgbmVnYXRpdmUgLXttYXh9IGxpbmVzIGZyb20gdGhlIGVuZCBvZiB0aGUgZmlsZQoJCWFyZSByZXR1cm5lZCwgb3IgYXMgbWFueSBhcyB0aGVyZSBhcmUuCgkJV2hlbiB7bWF4fSBpcyB6ZXJvIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkgbGlzdC4KCQlOb3RlIHRoYXQgd2l0aG91dCB7bWF4fSB0aGUgd2hvbGUgZmlsZSBpcyByZWFkIGludG8gbWVtb3J5LgoJCUFsc28gbm90ZSB0aGF0IHRoZXJlIGlzIG5vIHJlY29nbml0aW9uIG9mIGVuY29kaW5nLiAgUmVhZCBhCgkJZmlsZSBpbnRvIGEgYnVmZmVyIGlmIHlvdSBuZWVkIHRvLgoJCVdoZW4gdGhlIGZpbGUgY2FuJ3QgYmUgb3BlbmVkIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2l2ZW4gYW5kCgkJdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBsaXN0LgoJCUFsc28gc2VlIHx3cml0ZWZpbGUoKXwuCgpyZWx0aW1lKFt7c3RhcnR9IFssIHtlbmR9XV0pCQkJCSpyZWx0aW1lKCkqCgkJUmV0dXJuIGFuIGl0ZW0gdGhhdCByZXByZXNlbnRzIGEgdGltZSB2YWx1ZS4gIFRoZSBmb3JtYXQgb2YKCQl0aGUgaXRlbSBkZXBlbmRzIG9uIHRoZSBzeXN0ZW0uICBJdCBjYW4gYmUgcGFzc2VkIHRvCgkJfHJlbHRpbWVzdHIoKXwgdG8gY29udmVydCBpdCB0byBhIHN0cmluZy4KCQlXaXRob3V0IGFuIGFyZ3VtZW50IGl0IHJldHVybnMgdGhlIGN1cnJlbnQgdGltZS4KCQlXaXRoIG9uZSBhcmd1bWVudCBpcyByZXR1cm5zIHRoZSB0aW1lIHBhc3NlZCBzaW5jZSB0aGUgdGltZQoJCXNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnQuCgkJV2l0aCB0d28gYXJndW1lbnRzIGl0IHJldHVybnMgdGhlIHRpbWUgcGFzc2VkIGJldHdlZW4ge3N0YXJ0fQoJCWFuZCB7ZW5kfS4KCQlUaGUge3N0YXJ0fSBhbmQge2VuZH0gYXJndW1lbnRzIG11c3QgYmUgdmFsdWVzIHJldHVybmVkIGJ5CgkJcmVsdGltZSgpLgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrcmVsdGltZXwgZmVhdHVyZX0KCnJlbHRpbWVzdHIoe3RpbWV9KQkJCQkqcmVsdGltZXN0cigpKgoJCVJldHVybiBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHRpbWUgdmFsdWUgb2Yge3RpbWV9LgoJCVRoaXMgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzLCBhIGRvdCBhbmQgdGhlIG51bWJlciBvZgoJCW1pY3Jvc2Vjb25kcy4gIEV4YW1wbGU6ID4KCQkJbGV0IHN0YXJ0ID0gcmVsdGltZSgpCgkJCWNhbGwgTXlGdW5jdGlvbigpCgkJCWVjaG8gcmVsdGltZXN0cihyZWx0aW1lKHN0YXJ0KSkKPAkJTm90ZSB0aGF0IG92ZXJoZWFkIGZvciB0aGUgY29tbWFuZHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGltZS4KCQlUaGUgYWNjdXJhY3kgZGVwZW5kcyBvbiB0aGUgc3lzdGVtLgoJCUxlYWRpbmcgc3BhY2VzIGFyZSB1c2VkIHRvIG1ha2UgdGhlIHN0cmluZyBhbGlnbiBuaWNlbHkuICBZb3UKCQljYW4gdXNlIHNwbGl0KCkgdG8gcmVtb3ZlIGl0LiA+CgkJCWVjaG8gc3BsaXQocmVsdGltZXN0cihyZWx0aW1lKHN0YXJ0KSkpWzBdCjwJCUFsc28gc2VlIHxwcm9maWxpbmd8LgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrcmVsdGltZXwgZmVhdHVyZX0KCgkJCQkJCQkqcmVtb3RlX2V4cHIoKSogKkU0NDkqCnJlbW90ZV9leHByKHtzZXJ2ZXJ9LCB7c3RyaW5nfSBbLCB7aWR2YXJ9XSkKCQlTZW5kIHRoZSB7c3RyaW5nfSB0byB7c2VydmVyfS4JVGhlIHN0cmluZyBpcyBzZW50IGFzIGFuCgkJZXhwcmVzc2lvbiBhbmQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhZnRlciBldmFsdWF0aW9uLgoJCVRoZSByZXN1bHQgbXVzdCBiZSBhIFN0cmluZyBvciBhIHxMaXN0fC4gIEEgfExpc3R8IGlzIHR1cm5lZAoJCWludG8gYSBTdHJpbmcgYnkgam9pbmluZyB0aGUgaXRlbXMgd2l0aCBhIGxpbmUgYnJlYWsgaW4KCQliZXR3ZWVuIChub3QgYXQgdGhlIGVuZCksIGxpa2Ugd2l0aCBqb2luKGV4cHIsICJcbiIpLgoJCUlmIHtpZHZhcn0gaXMgcHJlc2VudCwgaXQgaXMgdGFrZW4gYXMgdGhlIG5hbWUgb2YgYQoJCXZhcmlhYmxlIGFuZCBhIHtzZXJ2ZXJpZH0gZm9yIGxhdGVyIHVzZSB3aXRoCgkJcmVtb3RlX3JlYWQoKSBpcyBzdG9yZWQgdGhlcmUuCgkJU2VlIGFsc28gfGNsaWVudHNlcnZlcnwgfFJlbW90ZVJlcGx5fC4KCQlUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHxzYW5kYm94fC4KCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2NsaWVudHNlcnZlcnwgZmVhdHVyZX0KCQlOb3RlOiBBbnkgZXJyb3JzIHdpbGwgY2F1c2UgYSBsb2NhbCBlcnJvciBtZXNzYWdlIHRvIGJlIGlzc3VlZAoJCWFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIGVtcHR5IHN0cmluZy4KCQlFeGFtcGxlczogPgoJCQk6ZWNobyByZW1vdGVfZXhwcigiZ3ZpbSIsICIyKzIiKQoJCQk6ZWNobyByZW1vdGVfZXhwcigiZ3ZpbTEiLCAiYjpjdXJyZW50X3N5bnRheCIpCjwKCnJlbW90ZV9mb3JlZ3JvdW5kKHtzZXJ2ZXJ9KQkJCQkqcmVtb3RlX2ZvcmVncm91bmQoKSoKCQlNb3ZlIHRoZSBWaW0gc2VydmVyIHdpdGggdGhlIG5hbWUge3NlcnZlcn0gdG8gdGhlIGZvcmVncm91bmQuCgkJVGhpcyB3b3JrcyBsaWtlOiA+CgkJCXJlbW90ZV9leHByKHtzZXJ2ZXJ9LCAiZm9yZWdyb3VuZCgpIikKPAkJRXhjZXB0IHRoYXQgb24gV2luMzIgc3lzdGVtcyB0aGUgY2xpZW50IGRvZXMgdGhlIHdvcmssIHRvIHdvcmsKCQlhcm91bmQgdGhlIHByb2JsZW0gdGhhdCB0aGUgT1MgZG9lc24ndCBhbHdheXMgYWxsb3cgdGhlIHNlcnZlcgoJCXRvIGJyaW5nIGl0c2VsZiB0byB0aGUgZm9yZWdyb3VuZC4KCQlOb3RlOiBUaGlzIGRvZXMgbm90IHJlc3RvcmUgdGhlIHdpbmRvdyBpZiBpdCB3YXMgbWluaW1pemVkLAoJCWxpa2UgZm9yZWdyb3VuZCgpIGRvZXMuCgkJVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSB8c2FuZGJveHwuCgkJe29ubHkgaW4gdGhlIFdpbjMyLCBBdGhlbmEsIE1vdGlmIGFuZCBHVEsgR1VJIHZlcnNpb25zIGFuZCB0aGUKCQlXaW4zMiBjb25zb2xlIHZlcnNpb259CgoKcmVtb3RlX3BlZWsoe3NlcnZlcmlkfSBbLCB7cmV0dmFyfV0pCQkqcmVtb3RlX3BlZWsoKSoKCQlSZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIGlmIHRoZXJlIGFyZSBhdmFpbGFibGUgc3RyaW5ncwoJCWZyb20ge3NlcnZlcmlkfS4gIENvcGllcyBhbnkgcmVwbHkgc3RyaW5nIGludG8gdGhlIHZhcmlhYmxlCgkJe3JldHZhcn0gaWYgc3BlY2lmaWVkLgl7cmV0dmFyfSBtdXN0IGJlIGEgc3RyaW5nIHdpdGggdGhlCgkJbmFtZSBvZiBhIHZhcmlhYmxlLgoJCVJldHVybnMgemVybyBpZiBub25lIGFyZSBhdmFpbGFibGUuCgkJUmV0dXJucyAtMSBpZiBzb21ldGhpbmcgaXMgd3JvbmcuCgkJU2VlIGFsc28gfGNsaWVudHNlcnZlcnwuCgkJVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSB8c2FuZGJveHwuCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtjbGllbnRzZXJ2ZXJ8IGZlYXR1cmV9CgkJRXhhbXBsZXM6ID4KCQkJOmxldCByZXBsID0gIiIKCQkJOmVjaG8gIlBFRUs6ICIucmVtb3RlX3BlZWsoaWQsICJyZXBsIikuIjogIi5yZXBsCgpyZW1vdGVfcmVhZCh7c2VydmVyaWR9KQkJCQkqcmVtb3RlX3JlYWQoKSoKCQlSZXR1cm4gdGhlIG9sZGVzdCBhdmFpbGFibGUgcmVwbHkgZnJvbSB7c2VydmVyaWR9IGFuZCBjb25zdW1lCgkJaXQuICBJdCBibG9ja3MgdW50aWwgYSByZXBseSBpcyBhdmFpbGFibGUuCgkJU2VlIGFsc28gfGNsaWVudHNlcnZlcnwuCgkJVGhpcyBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSB8c2FuZGJveHwuCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtjbGllbnRzZXJ2ZXJ8IGZlYXR1cmV9CgkJRXhhbXBsZTogPgoJCQk6ZWNobyByZW1vdGVfcmVhZChpZCkKPAoJCQkJCQkJKnJlbW90ZV9zZW5kKCkqICpFMjQxKgpyZW1vdGVfc2VuZCh7c2VydmVyfSwge3N0cmluZ30gWywge2lkdmFyfV0pCgkJU2VuZCB0aGUge3N0cmluZ30gdG8ge3NlcnZlcn0uCVRoZSBzdHJpbmcgaXMgc2VudCBhcyBpbnB1dAoJCWtleXMgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LiAgQXQgdGhlIFZpbSBzZXJ2ZXIKCQl0aGUga2V5cyBhcmUgbm90IG1hcHBlZCB8Om1hcHwuCgkJSWYge2lkdmFyfSBpcyBwcmVzZW50LCBpdCBpcyB0YWtlbiBhcyB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlCgkJYW5kIGEge3NlcnZlcmlkfSBmb3IgbGF0ZXIgdXNlIHdpdGggcmVtb3RlX3JlYWQoKSBpcyBzdG9yZWQKCQl0aGVyZS4KCQlTZWUgYWxzbyB8Y2xpZW50c2VydmVyfCB8UmVtb3RlUmVwbHl8LgoJCVRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgfHNhbmRib3h8LgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrY2xpZW50c2VydmVyfCBmZWF0dXJlfQoJCU5vdGU6IEFueSBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgc2VydmVyIGFuZCBtYXkgbWVzcwoJCXVwIHRoZSBkaXNwbGF5LgoJCUV4YW1wbGVzOiA+CgkJOmVjaG8gcmVtb3RlX3NlbmQoImd2aW0iLCAiOkRyb3BBbmRSZXBseSAiLmZpbGUsICJzZXJ2ZXJpZCIpLgoJCSBcIHJlbW90ZV9yZWFkKHNlcnZlcmlkKQoKCQk6YXV0b2NtZCBOT05FIFJlbW90ZVJlcGx5ICoKCQkgXCBlY2hvIHJlbW90ZV9yZWFkKGV4cGFuZCgiPGFtYXRjaD4iKSkKCQk6ZWNobyByZW1vdGVfc2VuZCgiZ3ZpbSIsICI6c2xlZXAgMTAgfCBlY2hvICIuCgkJIFwgJ3NlcnZlcjJjbGllbnQoZXhwYW5kKCI8Y2xpZW50PiIpLCAiSEVMTE8iKTxDUj4nKQo8CnJlbW92ZSh7bGlzdH0sIHtpZHh9IFssIHtlbmR9XSkJCQkJKnJlbW92ZSgpKgoJCVdpdGhvdXQge2VuZH06IFJlbW92ZSB0aGUgaXRlbSBhdCB7aWR4fSBmcm9tIHxMaXN0fCB7bGlzdH0gYW5kCgkJcmV0dXJuIHRoZSBpdGVtLgoJCVdpdGgge2VuZH06IFJlbW92ZSBpdGVtcyBmcm9tIHtpZHh9IHRvIHtlbmR9IChpbmNsdXNpdmUpIGFuZAoJCXJldHVybiBhIExpc3Qgd2l0aCB0aGVzZSBpdGVtcy4gIFdoZW4ge2lkeH0gcG9pbnRzIHRvIHRoZSBzYW1lCgkJaXRlbSBhcyB7ZW5kfSBhIGxpc3Qgd2l0aCBvbmUgaXRlbSBpcyByZXR1cm5lZC4gIFdoZW4ge2VuZH0KCQlwb2ludHMgdG8gYW4gaXRlbSBiZWZvcmUge2lkeH0gdGhpcyBpcyBhbiBlcnJvci4KCQlTZWUgfGxpc3QtaW5kZXh8IGZvciBwb3NzaWJsZSB2YWx1ZXMgb2Yge2lkeH0gYW5kIHtlbmR9LgoJCUV4YW1wbGU6ID4KCQkJOmVjaG8gImxhc3QgaXRlbTogIiAuIHJlbW92ZShteWxpc3QsIC0xKQoJCQk6Y2FsbCByZW1vdmUobXlsaXN0LCAwLCA5KQpyZW1vdmUoe2RpY3R9LCB7a2V5fSkKCQlSZW1vdmUgdGhlIGVudHJ5IGZyb20ge2RpY3R9IHdpdGgga2V5IHtrZXl9LiAgRXhhbXBsZTogPgoJCQk6ZWNobyAicmVtb3ZlZCAiIC4gcmVtb3ZlKGRpY3QsICJvbmUiKQo8CQlJZiB0aGVyZSBpcyBubyB7a2V5fSBpbiB7ZGljdH0gdGhpcyBpcyBhbiBlcnJvci4KCgkJVXNlIHxkZWxldGUoKXwgdG8gcmVtb3ZlIGEgZmlsZS4KCnJlbmFtZSh7ZnJvbX0sIHt0b30pCQkJCQkqcmVuYW1lKCkqCgkJUmVuYW1lIHRoZSBmaWxlIGJ5IHRoZSBuYW1lIHtmcm9tfSB0byB0aGUgbmFtZSB7dG99LiAgVGhpcwoJCXNob3VsZCBhbHNvIHdvcmsgdG8gbW92ZSBmaWxlcyBhY3Jvc3MgZmlsZSBzeXN0ZW1zLiAgVGhlCgkJcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyAwIGlmIHRoZSBmaWxlIHdhcyByZW5hbWVkCgkJc3VjY2Vzc2Z1bGx5LCBhbmQgbm9uLXplcm8gd2hlbiB0aGUgcmVuYW1pbmcgZmFpbGVkLgoJCU5PVEU6IElmIHt0b30gZXhpc3RzIGl0IGlzIG92ZXJ3cml0dGVuIHdpdGhvdXQgd2FybmluZy4KCQlUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHxzYW5kYm94fC4KCnJlcGVhdCh7ZXhwcn0sIHtjb3VudH0pCQkJCQkqcmVwZWF0KCkqCgkJUmVwZWF0IHtleHByfSB7Y291bnR9IHRpbWVzIGFuZCByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZAoJCXJlc3VsdC4gIEV4YW1wbGU6ID4KCQkJOmxldCBzZXBhcmF0b3IgPSByZXBlYXQoJy0nLCA4MCkKPAkJV2hlbiB7Y291bnR9IGlzIHplcm8gb3IgbmVnYXRpdmUgdGhlIHJlc3VsdCBpcyBlbXB0eS4KCQlXaGVuIHtleHByfSBpcyBhIHxMaXN0fCB0aGUgcmVzdWx0IGlzIHtleHByfSBjb25jYXRlbmF0ZWQKCQl7Y291bnR9IHRpbWVzLglFeGFtcGxlOiA+CgkJCTpsZXQgbG9uZ2xpc3QgPSByZXBlYXQoWydhJywgJ2InXSwgMykKPAkJUmVzdWx0cyBpbiBbJ2EnLCAnYicsICdhJywgJ2InLCAnYScsICdiJ10uCgoKcmVzb2x2ZSh7ZmlsZW5hbWV9KQkJCQkJKnJlc29sdmUoKSogKkU2NTUqCgkJT24gTVMtV2luZG93cywgd2hlbiB7ZmlsZW5hbWV9IGlzIGEgc2hvcnRjdXQgKGEgLmxuayBmaWxlKSwKCQlyZXR1cm5zIHRoZSBwYXRoIHRoZSBzaG9ydGN1dCBwb2ludHMgdG8gaW4gYSBzaW1wbGlmaWVkIGZvcm0uCgkJT24gVW5peCwgcmVwZWF0IHJlc29sdmluZyBzeW1ib2xpYyBsaW5rcyBpbiBhbGwgcGF0aAoJCWNvbXBvbmVudHMgb2Yge2ZpbGVuYW1lfSBhbmQgcmV0dXJuIHRoZSBzaW1wbGlmaWVkIHJlc3VsdC4KCQlUbyBjb3BlIHdpdGggbGluayBjeWNsZXMsIHJlc29sdmluZyBvZiBzeW1ib2xpYyBsaW5rcyBpcwoJCXN0b3BwZWQgYWZ0ZXIgMTAwIGl0ZXJhdGlvbnMuCgkJT24gb3RoZXIgc3lzdGVtcywgcmV0dXJuIHRoZSBzaW1wbGlmaWVkIHtmaWxlbmFtZX0uCgkJVGhlIHNpbXBsaWZpY2F0aW9uIHN0ZXAgaXMgZG9uZSBhcyBieSB8c2ltcGxpZnkoKXwuCgkJcmVzb2x2ZSgpIGtlZXBzIGEgbGVhZGluZyBwYXRoIGNvbXBvbmVudCBzcGVjaWZ5aW5nIHRoZQoJCWN1cnJlbnQgZGlyZWN0b3J5IChwcm92aWRlZCB0aGUgcmVzdWx0IGlzIHN0aWxsIGEgcmVsYXRpdmUKCQlwYXRoIG5hbWUpIGFuZCBhbHNvIGtlZXBzIGEgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IuCgoJCQkJCQkJKnJldmVyc2UoKSoKcmV2ZXJzZSh7bGlzdH0pCVJldmVyc2UgdGhlIG9yZGVyIG9mIGl0ZW1zIGluIHtsaXN0fSBpbi1wbGFjZS4JUmV0dXJucwoJCXtsaXN0fS4KCQlJZiB5b3Ugd2FudCBhIGxpc3QgdG8gcmVtYWluIHVubW9kaWZpZWQgbWFrZSBhIGNvcHkgZmlyc3Q6ID4KCQkJOmxldCByZXZsaXN0ID0gcmV2ZXJzZShjb3B5KG15bGlzdCkpCgpyb3VuZCh7ZXhwcn0pCQkJCQkJCSpyb3VuZCgpKgoJCVJvdW5kIG9mZiB7ZXhwcn0gdG8gdGhlIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgYW5kIHJldHVybiBpdAoJCWFzIGEgfEZsb2F0fC4gIElmIHtleHByfSBsaWVzIGhhbGZ3YXkgYmV0d2VlbiB0d28gaW50ZWdyYWwKCQl2YWx1ZXMsIHRoZW4gdXNlIHRoZSBsYXJnZXIgb25lIChhd2F5IGZyb20gemVybykuCgkJe2V4cHJ9IG11c3QgZXZhbHVhdGUgdG8gYSB8RmxvYXR8IG9yIGEgfE51bWJlcnwuCgkJRXhhbXBsZXM6ID4KCQkJZWNobyByb3VuZCgwLjQ1NikKPAkJCTAuMCAgPgoJCQllY2hvIHJvdW5kKDQuNSkKPAkJCTUuMCA+CgkJCWVjaG8gcm91bmQoLTQuNSkKPAkJCS01LjAKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoKc2NyZWVuYXR0cihyb3csIGNvbCkJCQkJCQkqc2NyZWVuYXR0cigpKgoJCUxpa2Ugc2NyZWVuY2hhcigpLCBidXQgcmV0dXJuIHRoZSBhdHRyaWJ1dGUuICBUaGlzIGlzIGEgcmF0aGVyCgkJYXJiaXRyYXJ5IG51bWJlciB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgdG8gY29tcGFyZSB0byB0aGUKCQlhdHRyaWJ1dGUgYXQgb3RoZXIgcG9zaXRpb25zLgoKc2NyZWVuY2hhcihyb3csIGNvbCkJCQkJCQkqc2NyZWVuY2hhcigpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24KCQlbcm93LCBjb2xdIG9uIHRoZSBzY3JlZW4uICBUaGlzIHdvcmtzIGZvciBldmVyeSBwb3NzaWJsZQoJCXNjcmVlbiBwb3NpdGlvbiwgYWxzbyBzdGF0dXMgbGluZXMsIHdpbmRvdyBzZXBhcmF0b3JzIGFuZCB0aGUKCQljb21tYW5kIGxpbmUuICBUaGUgdG9wIGxlZnQgcG9zaXRpb24gaXMgcm93IG9uZSwgY29sdW1uIG9uZQoJCVRoZSBjaGFyYWN0ZXIgZXhjbHVkZXMgY29tcG9zaW5nIGNoYXJhY3RlcnMuICBGb3IgZG91YmxlLWJ5dGUKCQllbmNvZGluZ3MgaXQgbWF5IG9ubHkgYmUgdGhlIGZpcnN0IGJ5dGUuCgkJVGhpcyBpcyBtYWlubHkgdG8gYmUgdXNlZCBmb3IgdGVzdGluZy4KCQlSZXR1cm5zIC0xIHdoZW4gcm93IG9yIGNvbCBpcyBvdXQgb2YgcmFuZ2UuCgpzY3JlZW5jb2woKQkJCQkJCQkqc2NyZWVuY29sKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIGN1cnJlbnQgc2NyZWVuIGNvbHVtbiBvZgoJCXRoZSBjdXJzb3IuIFRoZSBsZWZ0bW9zdCBjb2x1bW4gaGFzIG51bWJlciAxLgoJCVRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWQgZm9yIHRlc3RpbmcuCgoJCU5vdGU6IEFsd2F5cyByZXR1cm5zIHRoZSBjdXJyZW50IHNjcmVlbiBjb2x1bW4sIHRodXMgaWYgdXNlZAoJCWluIGEgY29tbWFuZCAoZS5nLiAiOmVjaG8gc2NyZWVuY29sKCkiKSBpdCB3aWxsIHJldHVybiB0aGUKCQljb2x1bW4gaW5zaWRlIHRoZSBjb21tYW5kIGxpbmUsIHdoaWNoIGlzIDEgd2hlbiB0aGUgY29tbWFuZCBpcwoJCWV4ZWN1dGVkLiBUbyBnZXQgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgZmlsZSB1c2Ugb25lIG9mCgkJdGhlIGZvbGxvd2luZyBtYXBwaW5nczogPgoJCQlubm9yZW1hcCA8ZXhwcj4gR0cgIjplY2hvbSAiLnNjcmVlbmNvbCgpLiJcbiIKCQkJbm5vcmVtYXAgPHNpbGVudD4gR0cgOmVjaG9tIHNjcmVlbmNvbCgpPENSPgo8CnNjcmVlbnJvdygpCQkJCQkJCSpzY3JlZW5yb3coKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgY3VycmVudCBzY3JlZW4gcm93IG9mIHRoZQoJCWN1cnNvci4gIFRoZSB0b3AgbGluZSBoYXMgbnVtYmVyIG9uZS4KCQlUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIGZvciB0ZXN0aW5nLgoKCQlOb3RlOiBTYW1lIHJlc3RyaWN0aW9ucyBhcyB3aXRoIHxzY3JlZW5jb2woKXwuCgpzZWFyY2goe3BhdHRlcm59IFssIHtmbGFnc30gWywge3N0b3BsaW5lfSBbLCB7dGltZW91dH1dXV0pCSpzZWFyY2goKSoKCQlTZWFyY2ggZm9yIHJlZ2V4cCBwYXR0ZXJuIHtwYXR0ZXJufS4gIFRoZSBzZWFyY2ggc3RhcnRzIGF0IHRoZQoJCWN1cnNvciBwb3NpdGlvbiAoeW91IGNhbiB1c2UgfGN1cnNvcigpfCB0byBzZXQgaXQpLgoKCQlXaGVuIGEgbWF0Y2ggaGFzIGJlZW4gZm91bmQgaXRzIGxpbmUgbnVtYmVyIGlzIHJldHVybmVkLgoJCUlmIHRoZXJlIGlzIG5vIG1hdGNoIGEgMCBpcyByZXR1cm5lZCBhbmQgdGhlIGN1cnNvciBkb2Vzbid0CgkJbW92ZS4gIE5vIGVycm9yIG1lc3NhZ2UgaXMgZ2l2ZW4uCgoJCXtmbGFnc30gaXMgYSBTdHJpbmcsIHdoaWNoIGNhbiBjb250YWluIHRoZXNlIGNoYXJhY3RlciBmbGFnczoKCQknYicJc2VhcmNoIEJhY2t3YXJkIGluc3RlYWQgb2YgZm9yd2FyZAoJCSdjJwlhY2NlcHQgYSBtYXRjaCBhdCB0aGUgQ3Vyc29yIHBvc2l0aW9uCgkJJ2UnCW1vdmUgdG8gdGhlIEVuZCBvZiB0aGUgbWF0Y2gKCQknbicJZG8gTm90IG1vdmUgdGhlIGN1cnNvcgoJCSdwJwlyZXR1cm4gbnVtYmVyIG9mIG1hdGNoaW5nIHN1Yi1QYXR0ZXJuIChzZWUgYmVsb3cpCgkJJ3MnCVNldCB0aGUgJyBtYXJrIGF0IHRoZSBwcmV2aW91cyBsb2NhdGlvbiBvZiB0aGUgY3Vyc29yCgkJJ3cnCVdyYXAgYXJvdW5kIHRoZSBlbmQgb2YgdGhlIGZpbGUKCQknVycJZG9uJ3QgV3JhcCBhcm91bmQgdGhlIGVuZCBvZiB0aGUgZmlsZQoJCSd6JwlzdGFydCBzZWFyY2hpbmcgYXQgdGhlIGN1cnNvciBjb2x1bW4gaW5zdGVhZCBvZiB6ZXJvCgkJSWYgbmVpdGhlciAndycgb3IgJ1cnIGlzIGdpdmVuLCB0aGUgJ3dyYXBzY2FuJyBvcHRpb24gYXBwbGllcy4KCgkJSWYgdGhlICdzJyBmbGFnIGlzIHN1cHBsaWVkLCB0aGUgJyBtYXJrIGlzIHNldCwgb25seSBpZiB0aGUKCQljdXJzb3IgaXMgbW92ZWQuIFRoZSAncycgZmxhZyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB0aGUgJ24nCgkJZmxhZy4KCgkJJ2lnbm9yZWNhc2UnLCAnc21hcnRjYXNlJyBhbmQgJ21hZ2ljJyBhcmUgdXNlZC4KCQkKCQlXaGVuIHRoZSAneicgZmxhZyBpcyBub3QgZ2l2ZW4sIHNlYXJjaGluZyBhbHdheXMgc3RhcnRzIGluCgkJY29sdW1uIHplcm8gYW5kIHRoZW4gbWF0Y2hlcyBiZWZvcmUgdGhlIGN1cnNvciBhcmUgc2tpcHBlZC4KCQlXaGVuIHRoZSAnYycgZmxhZyBpcyBwcmVzZW50IGluICdjcG8nIHRoZSBuZXh0IHNlYXJjaCBzdGFydHMKCQlhZnRlciB0aGUgbWF0Y2guICBXaXRob3V0IHRoZSAnYycgZmxhZyB0aGUgbmV4dCBzZWFyY2ggc3RhcnRzCgkJb25lIGNvbHVtbiBmdXJ0aGVyLgoKCQlXaGVuIHRoZSB7c3RvcGxpbmV9IGFyZ3VtZW50IGlzIGdpdmVuIHRoZW4gdGhlIHNlYXJjaCBzdG9wcwoJCWFmdGVyIHNlYXJjaGluZyB0aGlzIGxpbmUuICBUaGlzIGlzIHVzZWZ1bCB0byByZXN0cmljdCB0aGUKCQlzZWFyY2ggdG8gYSByYW5nZSBvZiBsaW5lcy4gIEV4YW1wbGVzOiA+CgkJCWxldCBtYXRjaCA9IHNlYXJjaCgnKCcsICdiJywgbGluZSgidzAiKSkKCQkJbGV0IGVuZCA9IHNlYXJjaCgnRU5EJywgJycsIGxpbmUoInckIikpCjwJCVdoZW4ge3N0b3BsaW5lfSBpcyB1c2VkIGFuZCBpdCBpcyBub3QgemVybyB0aGlzIGFsc28gaW1wbGllcwoJCXRoYXQgdGhlIHNlYXJjaCBkb2VzIG5vdCB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBmaWxlLgoJCUEgemVybyB2YWx1ZSBpcyBlcXVhbCB0byBub3QgZ2l2aW5nIHRoZSBhcmd1bWVudC4KCgkJV2hlbiB0aGUge3RpbWVvdXR9IGFyZ3VtZW50IGlzIGdpdmVuIHRoZSBzZWFyY2ggc3RvcHMgd2hlbgoJCW1vcmUgdGhhbiB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzIGhhdmUgcGFzc2VkLglUaHVzIHdoZW4KCQl7dGltZW91dH0gaXMgNTAwIHRoZSBzZWFyY2ggc3RvcHMgYWZ0ZXIgaGFsZiBhIHNlY29uZC4KCQlUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmUuICBBIHplcm8gdmFsdWUgaXMgbGlrZSBub3QKCQlnaXZpbmcgdGhlIGFyZ3VtZW50LgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrcmVsdGltZXwgZmVhdHVyZX0KCgkJCQkJCQkqc2VhcmNoKCktc3ViLW1hdGNoKgoJCVdpdGggdGhlICdwJyBmbGFnIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvbmUgbW9yZSB0aGFuIHRoZQoJCWZpcnN0IHN1Yi1tYXRjaCBpbiBcKFwpLiAgT25lIGlmIG5vbmUgb2YgdGhlbSBtYXRjaGVkIGJ1dCB0aGUKCQl3aG9sZSBwYXR0ZXJuIGRpZCBtYXRjaC4KCQlUbyBnZXQgdGhlIGNvbHVtbiBudW1iZXIgdG9vIHVzZSB8c2VhcmNocG9zKCl8LgoKCQlUaGUgY3Vyc29yIHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgbWF0Y2gsIHVubGVzcyB0aGUgJ24nCgkJZmxhZyBpcyB1c2VkLgoKCQlFeGFtcGxlIChnb2VzIG92ZXIgYWxsIGZpbGVzIGluIHRoZSBhcmd1bWVudCBsaXN0KTogPgoJCSAgICA6bGV0IG4gPSAxCgkJICAgIDp3aGlsZSBuIDw9IGFyZ2MoKQkgICAgIiBsb29wIG92ZXIgYWxsIGZpbGVzIGluIGFyZ2xpc3QKCQkgICAgOiAgZXhlICJhcmd1bWVudCAiIC4gbgoJCSAgICA6ICAiIHN0YXJ0IGF0IHRoZSBsYXN0IGNoYXIgaW4gdGhlIGZpbGUgYW5kIHdyYXAgZm9yIHRoZQoJCSAgICA6ICAiIGZpcnN0IHNlYXJjaCB0byBmaW5kIG1hdGNoIGF0IHN0YXJ0IG9mIGZpbGUKCQkgICAgOiAgbm9ybWFsIEckCgkJICAgIDogIGxldCBmbGFncyA9ICJ3IgoJCSAgICA6ICB3aGlsZSBzZWFyY2goImZvbyIsIGZsYWdzKSA+IDAKCQkgICAgOgkgcy9mb28vYmFyL2cKCQkgICAgOgkgbGV0IGZsYWdzID0gIlciCgkJICAgIDogIGVuZHdoaWxlCgkJICAgIDogIHVwZGF0ZQkJICAgICIgd3JpdGUgdGhlIGZpbGUgaWYgbW9kaWZpZWQKCQkgICAgOiAgbGV0IG4gPSBuICsgMQoJCSAgICA6ZW5kd2hpbGUKPAoJCUV4YW1wbGUgZm9yIHVzaW5nIHNvbWUgZmxhZ3M6ID4KCQkgICAgOmVjaG8gc2VhcmNoKCdcPGlmXHxcKGVsc2VcKVx8XChlbmRpZlwpJywgJ25jcGUnKQo8CQlUaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUga2V5d29yZHMgImlmIiwgImVsc2UiLCBhbmQgImVuZGlmIgoJCXVuZGVyIG9yIGFmdGVyIHRoZSBjdXJzb3IuICBCZWNhdXNlIG9mIHRoZSAncCcgZmxhZywgaXQKCQlyZXR1cm5zIDEsIDIsIG9yIDMgZGVwZW5kaW5nIG9uIHdoaWNoIGtleXdvcmQgaXMgZm91bmQsIG9yIDAKCQlpZiB0aGUgc2VhcmNoIGZhaWxzLiAgV2l0aCB0aGUgY3Vyc29yIG9uIHRoZSBmaXJzdCB3b3JkIG9mIHRoZQoJCWxpbmU6CgkJICAgIGlmIChmb28gPT0gMCkgfCBsZXQgZm9vID0gZm9vICsgMSB8IGVuZGlmIH4KCQl0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAgV2l0aG91dCB0aGUgJ2MnIGZsYWcsIHRoZSBmdW5jdGlvbgoJCWZpbmRzIHRoZSAiZW5kaWYiIGFuZCByZXR1cm5zIDMuICBUaGUgc2FtZSB0aGluZyBoYXBwZW5zCgkJd2l0aG91dCB0aGUgJ2UnIGZsYWcgaWYgdGhlIGN1cnNvciBpcyBvbiB0aGUgImYiIG9mICJpZiIuCgkJVGhlICduJyBmbGFnIHRlbGxzIHRoZSBmdW5jdGlvbiBub3QgdG8gbW92ZSB0aGUgY3Vyc29yLgoKCnNlYXJjaGRlY2woe25hbWV9IFssIHtnbG9iYWx9IFssIHt0aGlzYmxvY2t9XV0pCQkJKnNlYXJjaGRlY2woKSoKCQlTZWFyY2ggZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiB7bmFtZX0uCgoJCVdpdGggYSBub24temVybyB7Z2xvYmFsfSBhcmd1bWVudCBpdCB3b3JrcyBsaWtlIHxnRHwsIGZpbmQKCQlmaXJzdCBtYXRjaCBpbiB0aGUgZmlsZS4gIE90aGVyd2lzZSBpdCB3b3JrcyBsaWtlIHxnZHwsIGZpbmQKCQlmaXJzdCBtYXRjaCBpbiB0aGUgZnVuY3Rpb24uCgoJCVdpdGggYSBub24temVybyB7dGhpc2Jsb2NrfSBhcmd1bWVudCBtYXRjaGVzIGluIGEge30gYmxvY2sKCQl0aGF0IGVuZHMgYmVmb3JlIHRoZSBjdXJzb3IgcG9zaXRpb24gYXJlIGlnbm9yZWQuICBBdm9pZHMKCQlmaW5kaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvbmx5IHZhbGlkIGluIGFub3RoZXIgc2NvcGUuCgoJCU1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGZvdW5kIG1hdGNoLgoJCVJldHVybnMgemVybyBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCgkJRXhhbXBsZTogPgoJCQlpZiBzZWFyY2hkZWNsKCdteXZhcicpID09IDAKCQkJICAgZWNobyBnZXRsaW5lKCcuJykKCQkJZW5kaWYKPAoJCQkJCQkJKnNlYXJjaHBhaXIoKSoKc2VhcmNocGFpcih7c3RhcnR9LCB7bWlkZGxlfSwge2VuZH0gWywge2ZsYWdzfSBbLCB7c2tpcH0KCQkJCVssIHtzdG9wbGluZX0gWywge3RpbWVvdXR9XV1dXSkKCQlTZWFyY2ggZm9yIHRoZSBtYXRjaCBvZiBhIG5lc3RlZCBzdGFydC1lbmQgcGFpci4gIFRoaXMgY2FuIGJlCgkJdXNlZCB0byBmaW5kIHRoZSAiZW5kaWYiIHRoYXQgbWF0Y2hlcyBhbiAiaWYiLCB3aGlsZSBvdGhlcgoJCWlmL2VuZGlmIHBhaXJzIGluIGJldHdlZW4gYXJlIGlnbm9yZWQuCgkJVGhlIHNlYXJjaCBzdGFydHMgYXQgdGhlIGN1cnNvci4gIFRoZSBkZWZhdWx0IGlzIHRvIHNlYXJjaAoJCWZvcndhcmQsIGluY2x1ZGUgJ2InIGluIHtmbGFnc30gdG8gc2VhcmNoIGJhY2t3YXJkLgoJCUlmIGEgbWF0Y2ggaXMgZm91bmQsIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBpdCBhbmQgdGhlCgkJbGluZSBudW1iZXIgaXMgcmV0dXJuZWQuICBJZiBubyBtYXRjaCBpcyBmb3VuZCAwIG9yIC0xIGlzCgkJcmV0dXJuZWQgYW5kIHRoZSBjdXJzb3IgZG9lc24ndCBtb3ZlLiAgTm8gZXJyb3IgbWVzc2FnZSBpcwoJCWdpdmVuLgoKCQl7c3RhcnR9LCB7bWlkZGxlfSBhbmQge2VuZH0gYXJlIHBhdHRlcm5zLCBzZWUgfHBhdHRlcm58LiAgVGhleQoJCW11c3Qgbm90IGNvbnRhaW4gXCggXCkgcGFpcnMuICBVc2Ugb2YgXCUoIFwpIGlzIGFsbG93ZWQuICBXaGVuCgkJe21pZGRsZX0gaXMgbm90IGVtcHR5LCBpdCBpcyBmb3VuZCB3aGVuIHNlYXJjaGluZyBmcm9tIGVpdGhlcgoJCWRpcmVjdGlvbiwgYnV0IG9ubHkgd2hlbiBub3QgaW4gYSBuZXN0ZWQgc3RhcnQtZW5kIHBhaXIuICBBCgkJdHlwaWNhbCB1c2UgaXM6ID4KCQkJc2VhcmNocGFpcignXDxpZlw+JywgJ1w8ZWxzZVw+JywgJ1w8ZW5kaWZcPicpCjwJCUJ5IGxlYXZpbmcge21pZGRsZX0gZW1wdHkgdGhlICJlbHNlIiBpcyBza2lwcGVkLgoKCQl7ZmxhZ3N9ICdiJywgJ2MnLCAnbicsICdzJywgJ3cnIGFuZCAnVycgYXJlIHVzZWQgbGlrZSB3aXRoCgkJfHNlYXJjaCgpfC4gIEFkZGl0aW9uYWxseToKCQkncicJUmVwZWF0IHVudGlsIG5vIG1vcmUgbWF0Y2hlcyBmb3VuZDsgd2lsbCBmaW5kIHRoZQoJCQlvdXRlciBwYWlyLiAgSW1wbGllcyB0aGUgJ1cnIGZsYWcuCgkJJ20nCVJldHVybiBudW1iZXIgb2YgbWF0Y2hlcyBpbnN0ZWFkIG9mIGxpbmUgbnVtYmVyIHdpdGgKCQkJdGhlIG1hdGNoOyB3aWxsIGJlID4gMSB3aGVuICdyJyBpcyB1c2VkLgoJCU5vdGU6IGl0J3MgbmVhcmx5IGFsd2F5cyBhIGdvb2QgaWRlYSB0byB1c2UgdGhlICdXJyBmbGFnLCB0bwoJCWF2b2lkIHdyYXBwaW5nIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBmaWxlLgoKCQlXaGVuIGEgbWF0Y2ggZm9yIHtzdGFydH0sIHttaWRkbGV9IG9yIHtlbmR9IGlzIGZvdW5kLCB0aGUKCQl7c2tpcH0gZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgd2l0aCB0aGUgY3Vyc29yIHBvc2l0aW9uZWQgb24KCQl0aGUgc3RhcnQgb2YgdGhlIG1hdGNoLiAgSXQgc2hvdWxkIHJldHVybiBub24temVybyBpZiB0aGlzCgkJbWF0Y2ggaXMgdG8gYmUgc2tpcHBlZC4gIEUuZy4sIGJlY2F1c2UgaXQgaXMgaW5zaWRlIGEgY29tbWVudAoJCW9yIGEgc3RyaW5nLgoJCVdoZW4ge3NraXB9IGlzIG9taXR0ZWQgb3IgZW1wdHksIGV2ZXJ5IG1hdGNoIGlzIGFjY2VwdGVkLgoJCVdoZW4gZXZhbHVhdGluZyB7c2tpcH0gY2F1c2VzIGFuIGVycm9yIHRoZSBzZWFyY2ggaXMgYWJvcnRlZAoJCWFuZCAtMSByZXR1cm5lZC4KCgkJRm9yIHtzdG9wbGluZX0gYW5kIHt0aW1lb3V0fSBzZWUgfHNlYXJjaCgpfC4KCgkJVGhlIHZhbHVlIG9mICdpZ25vcmVjYXNlJyBpcyB1c2VkLiAgJ21hZ2ljJyBpcyBpZ25vcmVkLCB0aGUKCQlwYXR0ZXJucyBhcmUgdXNlZCBsaWtlIGl0J3Mgb24uCgoJCVRoZSBzZWFyY2ggc3RhcnRzIGV4YWN0bHkgYXQgdGhlIGN1cnNvci4gIEEgbWF0Y2ggd2l0aAoJCXtzdGFydH0sIHttaWRkbGV9IG9yIHtlbmR9IGF0IHRoZSBuZXh0IGNoYXJhY3RlciwgaW4gdGhlCgkJZGlyZWN0aW9uIG9mIHNlYXJjaGluZywgaXMgdGhlIGZpcnN0IG9uZSBmb3VuZC4gIEV4YW1wbGU6ID4KCQkJaWYgMQoJCQkgIGlmIDIKCQkJICBlbmRpZiAyCgkJCWVuZGlmIDEKPAkJV2hlbiBzdGFydGluZyBhdCB0aGUgImlmIDIiLCB3aXRoIHRoZSBjdXJzb3Igb24gdGhlICJpIiwgYW5kCgkJc2VhcmNoaW5nIGZvcndhcmRzLCB0aGUgImVuZGlmIDIiIGlzIGZvdW5kLiAgV2hlbiBzdGFydGluZyBvbgoJCXRoZSBjaGFyYWN0ZXIganVzdCBiZWZvcmUgdGhlICJpZiAyIiwgdGhlICJlbmRpZiAxIiB3aWxsIGJlCgkJZm91bmQuCVRoYXQncyBiZWNhdXNlIHRoZSAiaWYgMiIgd2lsbCBiZSBmb3VuZCBmaXJzdCwgYW5kCgkJdGhlbiB0aGlzIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBuZXN0ZWQgaWYvZW5kaWYgZnJvbSAiaWYgMiIgdG8KCQkiZW5kaWYgMiIuCgkJV2hlbiBzZWFyY2hpbmcgYmFja3dhcmRzIGFuZCB7ZW5kfSBpcyBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciwKCQlpdCBtYXkgYmUgdXNlZnVsIHRvIHB1dCAiXHpzIiBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBzbwoJCXRoYXQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhIG1hdGNoIHdpdGggdGhlIGVuZCBpdCBmaW5kcwoJCXRoZSBtYXRjaGluZyBzdGFydC4KCgkJRXhhbXBsZSwgdG8gZmluZCB0aGUgImVuZGlmIiBjb21tYW5kIGluIGEgVmltIHNjcmlwdDogPgoKCTplY2hvIHNlYXJjaHBhaXIoJ1w8aWZcPicsICdcPGVsXCVbc2VpZl1cPicsICdcPGVuXCVbZGlmXVw+JywgJ1cnLAoJCQlcICdnZXRsaW5lKCIuIikgPX4gIl5cXHMqXCIiJykKCjwJCVRoZSBjdXJzb3IgbXVzdCBiZSBhdCBvciBhZnRlciB0aGUgImlmIiBmb3Igd2hpY2ggYSBtYXRjaCBpcwoJCXRvIGJlIGZvdW5kLiAgTm90ZSB0aGF0IHNpbmdsZS1xdW90ZSBzdHJpbmdzIGFyZSB1c2VkIHRvIGF2b2lkCgkJaGF2aW5nIHRvIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMuICBUaGUgc2tpcCBleHByZXNzaW9uIG9ubHkKCQljYXRjaGVzIGNvbW1lbnRzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUsIG5vdCBhZnRlciBhIGNvbW1hbmQuCgkJQWxzbywgYSB3b3JkICJlbiIgb3IgImlmIiBoYWxmd2F5IGEgbGluZSBpcyBjb25zaWRlcmVkIGEKCQltYXRjaC4KCQlBbm90aGVyIGV4YW1wbGUsIHRvIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nICJ7IiBvZiBhICJ9IjogPgoKCTplY2hvIHNlYXJjaHBhaXIoJ3snLCAnJywgJ30nLCAnYlcnKQoKPAkJVGhpcyB3b3JrcyB3aGVuIHRoZSBjdXJzb3IgaXMgYXQgb3IgYmVmb3JlIHRoZSAifSIgZm9yIHdoaWNoIGEKCQltYXRjaCBpcyB0byBiZSBmb3VuZC4gIFRvIHJlamVjdCBtYXRjaGVzIHRoYXQgc3ludGF4CgkJaGlnaGxpZ2h0aW5nIHJlY29nbml6ZWQgYXMgc3RyaW5nczogPgoKCTplY2hvIHNlYXJjaHBhaXIoJ3snLCAnJywgJ30nLCAnYlcnLAoJICAgICBcICdzeW5JRGF0dHIoc3luSUQobGluZSgiLiIpLCBjb2woIi4iKSwgMCksICJuYW1lIikgPX4/ICJzdHJpbmciJykKPAoJCQkJCQkJKnNlYXJjaHBhaXJwb3MoKSoKc2VhcmNocGFpcnBvcyh7c3RhcnR9LCB7bWlkZGxlfSwge2VuZH0gWywge2ZsYWdzfSBbLCB7c2tpcH0KCQkJCVssIHtzdG9wbGluZX0gWywge3RpbWVvdXR9XV1dXSkKCQlTYW1lIGFzIHxzZWFyY2hwYWlyKCl8LCBidXQgcmV0dXJucyBhIHxMaXN0fCB3aXRoIHRoZSBsaW5lIGFuZAoJCWNvbHVtbiBwb3NpdGlvbiBvZiB0aGUgbWF0Y2guIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB8TGlzdHwKCQlpcyB0aGUgbGluZSBudW1iZXIgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgYnl0ZSBpbmRleCBvZgoJCXRoZSBjb2x1bW4gcG9zaXRpb24gb2YgdGhlIG1hdGNoLiAgSWYgbm8gbWF0Y2ggaXMgZm91bmQsCgkJcmV0dXJucyBbMCwgMF0uID4KCgkJCTpsZXQgW2xudW0sY29sXSA9IHNlYXJjaHBhaXJwb3MoJ3snLCAnJywgJ30nLCAnbicpCjwKCQlTZWUgfG1hdGNoLXBhcmVuc3wgZm9yIGEgYmlnZ2VyIGFuZCBtb3JlIHVzZWZ1bCBleGFtcGxlLgoKc2VhcmNocG9zKHtwYXR0ZXJufSBbLCB7ZmxhZ3N9IFssIHtzdG9wbGluZX0gWywge3RpbWVvdXR9XV1dKQkqc2VhcmNocG9zKCkqCgkJU2FtZSBhcyB8c2VhcmNoKCl8LCBidXQgcmV0dXJucyBhIHxMaXN0fCB3aXRoIHRoZSBsaW5lIGFuZAoJCWNvbHVtbiBwb3NpdGlvbiBvZiB0aGUgbWF0Y2guIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB8TGlzdHwKCQlpcyB0aGUgbGluZSBudW1iZXIgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgYnl0ZSBpbmRleCBvZgoJCXRoZSBjb2x1bW4gcG9zaXRpb24gb2YgdGhlIG1hdGNoLiBJZiBubyBtYXRjaCBpcyBmb3VuZCwKCQlyZXR1cm5zIFswLCAwXS4KCQlFeGFtcGxlOiA+Cgk6bGV0IFtsbnVtLCBjb2xdID0gc2VhcmNocG9zKCdteXBhdHRlcm4nLCAnbicpCgo8CQlXaGVuIHRoZSAncCcgZmxhZyBpcyBnaXZlbiB0aGVuIHRoZXJlIGlzIGFuIGV4dHJhIGl0ZW0gd2l0aAoJCXRoZSBzdWItcGF0dGVybiBtYXRjaCBudW1iZXIgfHNlYXJjaCgpLXN1Yi1tYXRjaHwuICBFeGFtcGxlOiA+Cgk6bGV0IFtsbnVtLCBjb2wsIHN1Ym1hdGNoXSA9IHNlYXJjaHBvcygnXChcbFwpXHxcKFx1XCknLCAnbnAnKQo8CQlJbiB0aGlzIGV4YW1wbGUgInN1Ym1hdGNoIiBpcyAyIHdoZW4gYSBsb3dlcmNhc2UgbGV0dGVyIGlzCgkJZm91bmQgfC9cbHwsIDMgd2hlbiBhbiB1cHBlcmNhc2UgbGV0dGVyIGlzIGZvdW5kIHwvXHV8LgoKc2VydmVyMmNsaWVudCgge2NsaWVudGlkfSwge3N0cmluZ30pCQkJKnNlcnZlcjJjbGllbnQoKSoKCQlTZW5kIGEgcmVwbHkgc3RyaW5nIHRvIHtjbGllbnRpZH0uICBUaGUgbW9zdCByZWNlbnQge2NsaWVudGlkfQoJCXRoYXQgc2VudCBhIHN0cmluZyBjYW4gYmUgcmV0cmlldmVkIHdpdGggZXhwYW5kKCI8Y2xpZW50PiIpLgoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrY2xpZW50c2VydmVyfCBmZWF0dXJlfQoJCU5vdGU6CgkJVGhpcyBpZCBoYXMgdG8gYmUgc3RvcmVkIGJlZm9yZSB0aGUgbmV4dCBjb21tYW5kIGNhbiBiZQoJCXJlY2VpdmVkLiAgSS5lLiBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIHJlY2VpdmVkIGNvbW1hbmQgYW5kCgkJYmVmb3JlIGNhbGxpbmcgYW55IGNvbW1hbmRzIHRoYXQgd2FpdHMgZm9yIGlucHV0LgoJCVNlZSBhbHNvIHxjbGllbnRzZXJ2ZXJ8LgoJCUV4YW1wbGU6ID4KCQkJOmVjaG8gc2VydmVyMmNsaWVudChleHBhbmQoIjxjbGllbnQ+IiksICJIRUxMTyIpCjwKc2VydmVybGlzdCgpCQkJCQkqc2VydmVybGlzdCgpKgoJCVJldHVybiBhIGxpc3Qgb2YgYXZhaWxhYmxlIHNlcnZlciBuYW1lcywgb25lIHBlciBsaW5lLgoJCVdoZW4gdGhlcmUgYXJlIG5vIHNlcnZlcnMgb3IgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUKCQlhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuICBTZWUgYWxzbyB8Y2xpZW50c2VydmVyfC4KCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2NsaWVudHNlcnZlcnwgZmVhdHVyZX0KCQlFeGFtcGxlOiA+CgkJCTplY2hvIHNlcnZlcmxpc3QoKQo8CnNldGJ1ZnZhcih7ZXhwcn0sIHt2YXJuYW1lfSwge3ZhbH0pCQkJKnNldGJ1ZnZhcigpKgoJCVNldCBvcHRpb24gb3IgbG9jYWwgdmFyaWFibGUge3Zhcm5hbWV9IGluIGJ1ZmZlciB7ZXhwcn0gdG8KCQl7dmFsfS4KCQlUaGlzIGFsc28gd29ya3MgZm9yIGEgZ2xvYmFsIG9yIGxvY2FsIHdpbmRvdyBvcHRpb24sIGJ1dCBpdAoJCWRvZXNuJ3Qgd29yayBmb3IgYSBnbG9iYWwgb3IgbG9jYWwgd2luZG93IHZhcmlhYmxlLgoJCUZvciBhIGxvY2FsIHdpbmRvdyBvcHRpb24gdGhlIGdsb2JhbCB2YWx1ZSBpcyB1bmNoYW5nZWQuCgkJRm9yIHRoZSB1c2Ugb2Yge2V4cHJ9LCBzZWUgfGJ1Zm5hbWUoKXwgYWJvdmUuCgkJTm90ZSB0aGF0IHRoZSB2YXJpYWJsZSBuYW1lIHdpdGhvdXQgImI6IiBtdXN0IGJlIHVzZWQuCgkJRXhhbXBsZXM6ID4KCQkJOmNhbGwgc2V0YnVmdmFyKDEsICImbW9kIiwgMSkKCQkJOmNhbGwgc2V0YnVmdmFyKCJ0b2RvIiwgIm15dmFyIiwgImZvb2JhciIpCjwJCVRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgfHNhbmRib3h8LgoKc2V0Y2hhcnNlYXJjaCh7ZGljdH0pCQkJCQkqc2V0Y2hhcnNlYXJjaCgpKgoJCVNldCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgc2VhcmNoIGluZm9ybWF0aW9uIHRvIHtkaWN0fSwKCQl3aGljaCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGVudHJpZXM6CgoJCSAgICBjaGFyCWNoYXJhY3RlciB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGEgc3Vic2VxdWVudAoJCQkJfCx8IG9yIHw7fCBjb21tYW5kOyBhbiBlbXB0eSBzdHJpbmcgY2xlYXJzIHRoZQoJCQkJY2hhcmFjdGVyIHNlYXJjaAoJCSAgICBmb3J3YXJkCWRpcmVjdGlvbiBvZiBjaGFyYWN0ZXIgc2VhcmNoOyAxIGZvciBmb3J3YXJkLAoJCQkJMCBmb3IgYmFja3dhcmQKCQkgICAgdW50aWwJdHlwZSBvZiBjaGFyYWN0ZXIgc2VhcmNoOyAxIGZvciBhIHx0fCBvciB8VHwKCQkJCWNoYXJhY3RlciBzZWFyY2gsIDAgZm9yIGFuIHxmfCBvciB8RnwKCQkJCWNoYXJhY3RlciBzZWFyY2gKCgkJVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHNhdmUvcmVzdG9yZSBhIHVzZXIncyBjaGFyYWN0ZXIgc2VhcmNoCgkJZnJvbSBhIHNjcmlwdDogPgoJCQk6bGV0IHByZXZzZWFyY2ggPSBnZXRjaGFyc2VhcmNoKCkKCQkJOiIgUGVyZm9ybSBhIGNvbW1hbmQgd2hpY2ggY2xvYmJlcnMgdXNlcidzIHNlYXJjaAoJCQk6Y2FsbCBzZXRjaGFyc2VhcmNoKHByZXZzZWFyY2gpCjwJCUFsc28gc2VlIHxnZXRjaGFyc2VhcmNoKCl8LgoKc2V0Y21kcG9zKHtwb3N9KQkJCQkJKnNldGNtZHBvcygpKgoJCVNldCB0aGUgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBjb21tYW5kIGxpbmUgdG8gYnl0ZSBwb3NpdGlvbgoJCXtwb3N9LglUaGUgZmlyc3QgcG9zaXRpb24gaXMgMS4KCQlVc2UgfGdldGNtZHBvcygpfCB0byBvYnRhaW4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCgkJT25seSB3b3JrcyB3aGlsZSBlZGl0aW5nIHRoZSBjb21tYW5kIGxpbmUsIHRodXMgeW91IG11c3QgdXNlCgkJfGNfQ1RSTC1cX2V8LCB8Y19DVFJMLVJfPXwgb3IgfGNfQ1RSTC1SX0NUUkwtUnwgd2l0aCAnPScuICBGb3IKCQl8Y19DVFJMLVxfZXwgYW5kIHxjX0NUUkwtUl9DVFJMLVJ8IHdpdGggJz0nIHRoZSBwb3NpdGlvbiBpcwoJCXNldCBhZnRlciB0aGUgY29tbWFuZCBsaW5lIGlzIHNldCB0byB0aGUgZXhwcmVzc2lvbi4gIEZvcgoJCXxjX0NUUkwtUl89fCBpdCBpcyBzZXQgYWZ0ZXIgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiBidXQKCQliZWZvcmUgaW5zZXJ0aW5nIHRoZSByZXN1bHRpbmcgdGV4dC4KCQlXaGVuIHRoZSBudW1iZXIgaXMgdG9vIGJpZyB0aGUgY3Vyc29yIGlzIHB1dCBhdCB0aGUgZW5kIG9mIHRoZQoJCWxpbmUuICBBIG51bWJlciBzbWFsbGVyIHRoYW4gb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KCQlSZXR1cm5zIDAgd2hlbiBzdWNjZXNzZnVsLCAxIHdoZW4gbm90IGVkaXRpbmcgdGhlIGNvbW1hbmQKCQlsaW5lLgoKc2V0bGluZSh7bG51bX0sIHt0ZXh0fSkJCQkJCSpzZXRsaW5lKCkqCgkJU2V0IGxpbmUge2xudW19IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciB0byB7dGV4dH0uICBUbyBpbnNlcnQKCQlsaW5lcyB1c2UgfGFwcGVuZCgpfC4KCQl7bG51bX0gaXMgdXNlZCBsaWtlIHdpdGggfGdldGxpbmUoKXwuCgkJV2hlbiB7bG51bX0gaXMganVzdCBiZWxvdyB0aGUgbGFzdCBsaW5lIHRoZSB7dGV4dH0gd2lsbCBiZQoJCWFkZGVkIGFzIGEgbmV3IGxpbmUuCgkJSWYgdGhpcyBzdWNjZWVkcywgMCBpcyByZXR1cm5lZC4gIElmIHRoaXMgZmFpbHMgKG1vc3QgbGlrZWx5CgkJYmVjYXVzZSB7bG51bX0gaXMgaW52YWxpZCkgMSBpcyByZXR1cm5lZC4gIEV4YW1wbGU6ID4KCQkJOmNhbGwgc2V0bGluZSg1LCBzdHJmdGltZSgiJWMiKSkKPAkJV2hlbiB7dGV4dH0gaXMgYSB8TGlzdHwgdGhlbiBsaW5lIHtsbnVtfSBhbmQgZm9sbG93aW5nIGxpbmVzCgkJd2lsbCBiZSBzZXQgdG8gdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAgRXhhbXBsZTogPgoJCQk6Y2FsbCBzZXRsaW5lKDUsIFsnYWFhJywgJ2JiYicsICdjY2MnXSkKPAkJVGhpcyBpcyBlcXVpdmFsZW50IHRvOiA+CgkJCTpmb3IgW24sIGxdIGluIFtbNSwgJ2FhYSddLCBbNiwgJ2JiYiddLCBbNywgJ2NjYyddXQoJCQk6ICBjYWxsIHNldGxpbmUobiwgbCkKCQkJOmVuZGZvcgo8CQlOb3RlOiBUaGUgJ1sgYW5kICddIG1hcmtzIGFyZSBub3Qgc2V0LgoKc2V0bG9jbGlzdCh7bnJ9LCB7bGlzdH0gWywge2FjdGlvbn1dKQkJCSpzZXRsb2NsaXN0KCkqCgkJQ3JlYXRlIG9yIHJlcGxhY2Ugb3IgYWRkIHRvIHRoZSBsb2NhdGlvbiBsaXN0IGZvciB3aW5kb3cge25yfS4KCQlXaGVuIHtucn0gaXMgemVybyB0aGUgY3VycmVudCB3aW5kb3cgaXMgdXNlZC4gRm9yIGEgbG9jYXRpb24KCQlsaXN0IHdpbmRvdywgdGhlIGRpc3BsYXllZCBsb2NhdGlvbiBsaXN0IGlzIG1vZGlmaWVkLiAgRm9yIGFuCgkJaW52YWxpZCB3aW5kb3cgbnVtYmVyIHtucn0sIC0xIGlzIHJldHVybmVkLgoJCU90aGVyd2lzZSwgc2FtZSBhcyB8c2V0cWZsaXN0KCl8LgoJCUFsc28gc2VlIHxsb2NhdGlvbi1saXN0fC4KCnNldG1hdGNoZXMoe2xpc3R9KQkJCQkJKnNldG1hdGNoZXMoKSoKCQlSZXN0b3JlcyBhIGxpc3Qgb2YgbWF0Y2hlcyBzYXZlZCBieSB8Z2V0bWF0Y2hlcygpfC4gIFJldHVybnMgMAoJCWlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSAtMS4gIEFsbCBjdXJyZW50IG1hdGNoZXMgYXJlIGNsZWFyZWQKCQliZWZvcmUgdGhlIGxpc3QgaXMgcmVzdG9yZWQuICBTZWUgZXhhbXBsZSBmb3IgfGdldG1hdGNoZXMoKXwuCgoJCQkJCQkJKnNldHBvcygpKgpzZXRwb3Moe2V4cHJ9LCB7bGlzdH0pCgkJU2V0IHRoZSBwb3NpdGlvbiBmb3Ige2V4cHJ9LiAgUG9zc2libGUgdmFsdWVzOgoJCQkuCXRoZSBjdXJzb3IKCQkJJ3gJbWFyayB4CgoJCXtsaXN0fSBtdXN0IGJlIGEgfExpc3R8IHdpdGggZm91ciBvciBmaXZlIG51bWJlcnM6CgkJICAgIFtidWZudW0sIGxudW0sIGNvbCwgb2ZmXQoJCSAgICBbYnVmbnVtLCBsbnVtLCBjb2wsIG9mZiwgY3Vyc3dhbnRdCgoJCSJidWZudW0iIGlzIHRoZSBidWZmZXIgbnVtYmVyLglaZXJvIGNhbiBiZSB1c2VkIGZvciB0aGUKCQljdXJyZW50IGJ1ZmZlci4gIFNldHRpbmcgdGhlIGN1cnNvciBpcyBvbmx5IHBvc3NpYmxlIGZvcgoJCXRoZSBjdXJyZW50IGJ1ZmZlci4gIFRvIHNldCBhIG1hcmsgaW4gYW5vdGhlciBidWZmZXIgeW91IGNhbgoJCXVzZSB0aGUgfGJ1Zm5yKCl8IGZ1bmN0aW9uIHRvIHR1cm4gYSBmaWxlIG5hbWUgaW50byBhIGJ1ZmZlcgoJCW51bWJlci4KCQlEb2VzIG5vdCBjaGFuZ2UgdGhlIGp1bXBsaXN0LgoKCQkibG51bSIgYW5kICJjb2wiIGFyZSB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlci4gIFRoZSBmaXJzdAoJCWNvbHVtbiBpcyAxLiAgVXNlIGEgemVybyAibG51bSIgdG8gZGVsZXRlIGEgbWFyay4gIElmICJjb2wiIGlzCgkJc21hbGxlciB0aGFuIDEgdGhlbiAxIGlzIHVzZWQuCgoJCVRoZSAib2ZmIiBudW1iZXIgaXMgb25seSB1c2VkIHdoZW4gJ3ZpcnR1YWxlZGl0JyBpcyBzZXQuIFRoZW4KCQlpdCBpcyB0aGUgb2Zmc2V0IGluIHNjcmVlbiBjb2x1bW5zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQoJCWNoYXJhY3Rlci4gIEUuZy4sIGEgcG9zaXRpb24gd2l0aGluIGEgPFRhYj4gb3IgYWZ0ZXIgdGhlIGxhc3QKCQljaGFyYWN0ZXIuCgoJCVRoZSAiY3Vyc3dhbnQiIG51bWJlciBpcyBvbmx5IHVzZWQgd2hlbiBzZXR0aW5nIHRoZSBjdXJzb3IKCQlwb3NpdGlvbi4gIEl0IHNldHMgdGhlIHByZWZlcnJlZCBjb2x1bW4gZm9yIHdoZW4gbW92aW5nIHRoZQoJCWN1cnNvciB2ZXJ0aWNhbGx5LiAgV2hlbiB0aGUgImN1cnN3YW50IiBudW1iZXIgaXMgbWlzc2luZyB0aGUKCQlwcmVmZXJyZWQgY29sdW1uIGlzIG5vdCBzZXQuICBXaGVuIGl0IGlzIHByZXNlbnQgYW5kIHNldHRpbmcgYQoJCW1hcmsgcG9zaXRpb24gaXQgaXMgbm90IHVzZWQuCgoJCU5vdGUgdGhhdCBmb3IgJzwgYW5kICc+IGNoYW5naW5nIHRoZSBsaW5lIG51bWJlciBtYXkgcmVzdWx0IGluCgkJdGhlIG1hcmtzIHRvIGJlIGVmZmVjdGl2ZWx5IGJlIHN3YXBwZWQsIHNvIHRoYXQgJzwgaXMgYWx3YXlzCgkJYmVmb3JlICc+LgoKCQlSZXR1cm5zIDAgd2hlbiB0aGUgcG9zaXRpb24gY291bGQgYmUgc2V0LCAtMSBvdGhlcndpc2UuCgkJQW4gZXJyb3IgbWVzc2FnZSBpcyBnaXZlbiBpZiB7ZXhwcn0gaXMgaW52YWxpZC4KCgkJQWxzbyBzZWUgfGdldHBvcygpfCBhbmQgfGdldGN1cnBvcygpfC4KCgkJVGhpcyBkb2VzIG5vdCByZXN0b3JlIHRoZSBwcmVmZXJyZWQgY29sdW1uIGZvciBtb3ZpbmcKCQl2ZXJ0aWNhbGx5OyBpZiB5b3Ugc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gd2l0aCB0aGlzLCB8anwgYW5kCgkJfGt8IG1vdGlvbnMgd2lsbCBqdW1wIHRvIHByZXZpb3VzIGNvbHVtbnMhICBVc2UgfGN1cnNvcigpfCB0bwoJCWFsc28gc2V0IHRoZSBwcmVmZXJyZWQgY29sdW1uLiAgQWxzbyBzZWUgdGhlICJjdXJzd2FudCIga2V5IGluCgkJfHdpbnJlc3R2aWV3KCl8LgoKCnNldHFmbGlzdCh7bGlzdH0gWywge2FjdGlvbn1dKQkJCQkqc2V0cWZsaXN0KCkqCgkJQ3JlYXRlIG9yIHJlcGxhY2Ugb3IgYWRkIHRvIHRoZSBxdWlja2ZpeCBsaXN0IHVzaW5nIHRoZSBpdGVtcwoJCWluIHtsaXN0fS4gIEVhY2ggaXRlbSBpbiB7bGlzdH0gaXMgYSBkaWN0aW9uYXJ5LgoJCU5vbi1kaWN0aW9uYXJ5IGl0ZW1zIGluIHtsaXN0fSBhcmUgaWdub3JlZC4gIEVhY2ggZGljdGlvbmFyeQoJCWl0ZW0gY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBlbnRyaWVzOgoKCQkgICAgYnVmbnIJYnVmZmVyIG51bWJlcjsgbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGEgdmFsaWQKCQkJCWJ1ZmZlcgoJCSAgICBmaWxlbmFtZQluYW1lIG9mIGEgZmlsZTsgb25seSB1c2VkIHdoZW4gImJ1Zm5yIiBpcyBub3QKCQkJCXByZXNlbnQgb3IgaXQgaXMgaW52YWxpZC4KCQkgICAgbG51bQlsaW5lIG51bWJlciBpbiB0aGUgZmlsZQoJCSAgICBwYXR0ZXJuCXNlYXJjaCBwYXR0ZXJuIHVzZWQgdG8gbG9jYXRlIHRoZSBlcnJvcgoJCSAgICBjb2wJCWNvbHVtbiBudW1iZXIKCQkgICAgdmNvbAl3aGVuIG5vbi16ZXJvOiAiY29sIiBpcyB2aXN1YWwgY29sdW1uCgkJCQl3aGVuIHplcm86ICJjb2wiIGlzIGJ5dGUgaW5kZXgKCQkgICAgbnIJCWVycm9yIG51bWJlcgoJCSAgICB0ZXh0CWRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvcgoJCSAgICB0eXBlCXNpbmdsZS1jaGFyYWN0ZXIgZXJyb3IgdHlwZSwgJ0UnLCAnVycsIGV0Yy4KCgkJVGhlICJjb2wiLCAidmNvbCIsICJuciIsICJ0eXBlIiBhbmQgInRleHQiIGVudHJpZXMgYXJlCgkJb3B0aW9uYWwuICBFaXRoZXIgImxudW0iIG9yICJwYXR0ZXJuIiBlbnRyeSBjYW4gYmUgdXNlZCB0bwoJCWxvY2F0ZSBhIG1hdGNoaW5nIGVycm9yIGxpbmUuCgkJSWYgdGhlICJmaWxlbmFtZSIgYW5kICJidWZuciIgZW50cmllcyBhcmUgbm90IHByZXNlbnQgb3IKCQluZWl0aGVyIHRoZSAibG51bSIgb3IgInBhdHRlcm4iIGVudHJpZXMgYXJlIHByZXNlbnQsIHRoZW4gdGhlCgkJaXRlbSB3aWxsIG5vdCBiZSBoYW5kbGVkIGFzIGFuIGVycm9yIGxpbmUuCgkJSWYgYm90aCAicGF0dGVybiIgYW5kICJsbnVtIiBhcmUgcHJlc2VudCB0aGVuICJwYXR0ZXJuIiB3aWxsCgkJYmUgdXNlZC4KCQlJZiB5b3Ugc3VwcGx5IGFuIGVtcHR5IHtsaXN0fSwgdGhlIHF1aWNrZml4IGxpc3Qgd2lsbCBiZQoJCWNsZWFyZWQuCgkJTm90ZSB0aGF0IHRoZSBsaXN0IGlzIG5vdCBleGFjdGx5IHRoZSBzYW1lIGFzIHdoYXQKCQl8Z2V0cWZsaXN0KCl8IHJldHVybnMuCgoJCUlmIHthY3Rpb259IGlzIHNldCB0byAnYScsIHRoZW4gdGhlIGl0ZW1zIGZyb20ge2xpc3R9IGFyZQoJCWFkZGVkIHRvIHRoZSBleGlzdGluZyBxdWlja2ZpeCBsaXN0LiBJZiB0aGVyZSBpcyBubyBleGlzdGluZwoJCWxpc3QsIHRoZW4gYSBuZXcgbGlzdCBpcyBjcmVhdGVkLiBJZiB7YWN0aW9ufSBpcyBzZXQgdG8gJ3InLAoJCXRoZW4gdGhlIGl0ZW1zIGZyb20gdGhlIGN1cnJlbnQgcXVpY2tmaXggbGlzdCBhcmUgcmVwbGFjZWQKCQl3aXRoIHRoZSBpdGVtcyBmcm9tIHtsaXN0fS4gSWYge2FjdGlvbn0gaXMgbm90IHByZXNlbnQgb3IgaXMKCQlzZXQgdG8gJyAnLCB0aGVuIGEgbmV3IGxpc3QgaXMgY3JlYXRlZC4KCgkJUmV0dXJucyB6ZXJvIGZvciBzdWNjZXNzLCAtMSBmb3IgZmFpbHVyZS4KCgkJVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBxdWlja2ZpeCBsaXN0CgkJaW5kZXBlbmRlbnQgb2YgdGhlICdlcnJvcmZvcm1hdCcgc2V0dGluZy4gIFVzZSBhIGNvbW1hbmQgbGlrZQoJCSI6Y2MgMSIgdG8ganVtcCB0byB0aGUgZmlyc3QgcG9zaXRpb24uCgoKCQkJCQkJCSpzZXRyZWcoKSoKc2V0cmVnKHtyZWduYW1lfSwge3ZhbHVlfSBbLHtvcHRpb25zfV0pCgkJU2V0IHRoZSByZWdpc3RlciB7cmVnbmFtZX0gdG8ge3ZhbHVlfS4KCQl7dmFsdWV9IG1heSBiZSBhbnkgdmFsdWUgcmV0dXJuZWQgYnkgfGdldHJlZygpfCwgaW5jbHVkaW5nIAoJCWEgfExpc3R8LgoJCUlmIHtvcHRpb25zfSBjb250YWlucyAiYSIgb3Ige3JlZ25hbWV9IGlzIHVwcGVyIGNhc2UsCgkJdGhlbiB0aGUgdmFsdWUgaXMgYXBwZW5kZWQuCgkJe29wdGlvbnN9IGNhbiBhbHNvIGNvbnRhaW4gYSByZWdpc3RlciB0eXBlIHNwZWNpZmljYXRpb246CgkJICAgICJjIiBvciAidiIJICAgICAgfGNoYXJhY3Rlcndpc2V8IG1vZGUKCQkgICAgImwiIG9yICJWIgkgICAgICB8bGluZXdpc2V8IG1vZGUKCQkgICAgImIiIG9yICI8Q1RSTC1WPiIgfGJsb2Nrd2lzZS12aXN1YWx8IG1vZGUKCQlJZiBhIG51bWJlciBpbW1lZGlhdGVseSBmb2xsb3dzICJiIiBvciAiPENUUkwtVj4iIHRoZW4gdGhpcyBpcwoJCXVzZWQgYXMgdGhlIHdpZHRoIG9mIHRoZSBzZWxlY3Rpb24gLSBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCgkJdGhlbiB0aGUgd2lkdGggb2YgdGhlIGJsb2NrIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKCQlpbiB0aGUgbG9uZ2VzdCBsaW5lIChjb3VudGluZyBhIDxUYWI+IGFzIDEgY2hhcmFjdGVyKS4KCgkJSWYge29wdGlvbnN9IGNvbnRhaW5zIG5vIHJlZ2lzdGVyIHNldHRpbmdzLCB0aGVuIHRoZSBkZWZhdWx0CgkJaXMgdG8gdXNlIGNoYXJhY3RlciBtb2RlIHVubGVzcyB7dmFsdWV9IGVuZHMgaW4gYSA8Tkw+IGZvciAKCQlzdHJpbmcge3ZhbHVlfSBhbmQgbGluZXdpc2UgbW9kZSBmb3IgbGlzdCB7dmFsdWV9LiBCbG9ja3dpc2UgCgkJbW9kZSBpcyBuZXZlciBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5LgoJCVJldHVybnMgemVybyBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCgoJCQkJCQkJKkU4ODMqCgkJTm90ZTogeW91IG1heSBub3QgdXNlIHxMaXN0fCBjb250YWluaW5nIG1vcmUgdGhhbiBvbmUgaXRlbSB0byAKCQkgICAgICBzZXQgc2VhcmNoIGFuZCBleHByZXNzaW9uIHJlZ2lzdGVycy4gTGlzdHMgY29udGFpbmluZyBubyAKCQkgICAgICBpdGVtcyBhY3QgbGlrZSBlbXB0eSBzdHJpbmdzLgoKCQlFeGFtcGxlczogPgoJCQk6Y2FsbCBzZXRyZWcodjpyZWdpc3RlciwgQCopCgkJCTpjYWxsIHNldHJlZygnKicsIEAlLCAnYWMnKQoJCQk6Y2FsbCBzZXRyZWcoJ2EnLCAiMVxuMlxuMyIsICdiNScpCgo8CQlUaGlzIGV4YW1wbGUgc2hvd3MgdXNpbmcgdGhlIGZ1bmN0aW9ucyB0byBzYXZlIGFuZCByZXN0b3JlIGEKCQlyZWdpc3RlciAobm90ZTogeW91IG1heSBub3QgcmVsaWFibHkgcmVzdG9yZSByZWdpc3RlciB2YWx1ZSAKCQl3aXRob3V0IHVzaW5nIHRoZSB0aGlyZCBhcmd1bWVudCB0byB8Z2V0cmVnKCl8IGFzIHdpdGhvdXQgaXQgCgkJbmV3bGluZXMgYXJlIHJlcHJlc2VudGVkIGFzIG5ld2xpbmVzIEFORCBOdWwgYnl0ZXMgYXJlIAoJCXJlcHJlc2VudGVkIGFzIG5ld2xpbmVzIGFzIHdlbGwsIHNlZSB8TkwtdXNlZC1mb3ItTnVsfCkuID4KCQkJOmxldCB2YXJfYSA9IGdldHJlZygnYScsIDEsIDEpCgkJCTpsZXQgdmFyX2Ftb2RlID0gZ2V0cmVndHlwZSgnYScpCgkJCSAgICAuLi4uCgkJCTpjYWxsIHNldHJlZygnYScsIHZhcl9hLCB2YXJfYW1vZGUpCgo8CQlZb3UgY2FuIGFsc28gY2hhbmdlIHRoZSB0eXBlIG9mIGEgcmVnaXN0ZXIgYnkgYXBwZW5kaW5nCgkJbm90aGluZzogPgoJCQk6Y2FsbCBzZXRyZWcoJ2EnLCAnJywgJ2FsJykKCnNldHRhYnZhcih7dGFibnJ9LCB7dmFybmFtZX0sIHt2YWx9KQkJCSpzZXR0YWJ2YXIoKSoKCQlTZXQgdGFiLWxvY2FsIHZhcmlhYmxlIHt2YXJuYW1lfSB0byB7dmFsfSBpbiB0YWIgcGFnZSB7dGFibnJ9LgoJCXx0OnZhcnwKCQlOb3RlIHRoYXQgdGhlIHZhcmlhYmxlIG5hbWUgd2l0aG91dCAidDoiIG11c3QgYmUgdXNlZC4KCQlUYWJzIGFyZSBudW1iZXJlZCBzdGFydGluZyB3aXRoIG9uZS4KCQlUaGlzIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHxzYW5kYm94fC4KCnNldHRhYndpbnZhcih7dGFibnJ9LCB7d2lubnJ9LCB7dmFybmFtZX0sIHt2YWx9KQkqc2V0dGFid2ludmFyKCkqCgkJU2V0IG9wdGlvbiBvciBsb2NhbCB2YXJpYWJsZSB7dmFybmFtZX0gaW4gd2luZG93IHt3aW5ucn0gdG8KCQl7dmFsfS4KCQlUYWJzIGFyZSBudW1iZXJlZCBzdGFydGluZyB3aXRoIG9uZS4gIEZvciB0aGUgY3VycmVudCB0YWJwYWdlCgkJdXNlIHxzZXR3aW52YXIoKXwuCgkJV2hlbiB7d2lubnJ9IGlzIHplcm8gdGhlIGN1cnJlbnQgd2luZG93IGlzIHVzZWQuCgkJVGhpcyBhbHNvIHdvcmtzIGZvciBhIGdsb2JhbCBvciBsb2NhbCBidWZmZXIgb3B0aW9uLCBidXQgaXQKCQlkb2Vzbid0IHdvcmsgZm9yIGEgZ2xvYmFsIG9yIGxvY2FsIGJ1ZmZlciB2YXJpYWJsZS4KCQlGb3IgYSBsb2NhbCBidWZmZXIgb3B0aW9uIHRoZSBnbG9iYWwgdmFsdWUgaXMgdW5jaGFuZ2VkLgoJCU5vdGUgdGhhdCB0aGUgdmFyaWFibGUgbmFtZSB3aXRob3V0ICJ3OiIgbXVzdCBiZSB1c2VkLgoJCUV4YW1wbGVzOiA+CgkJCTpjYWxsIHNldHRhYndpbnZhcigxLCAxLCAiJmxpc3QiLCAwKQoJCQk6Y2FsbCBzZXR0YWJ3aW52YXIoMywgMiwgIm15dmFyIiwgImZvb2JhciIpCjwJCVRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgfHNhbmRib3h8LgoKc2V0d2ludmFyKHtucn0sIHt2YXJuYW1lfSwge3ZhbH0pCQkJKnNldHdpbnZhcigpKgoJCUxpa2UgfHNldHRhYndpbnZhcigpfCBmb3IgdGhlIGN1cnJlbnQgdGFiIHBhZ2UuCgkJRXhhbXBsZXM6ID4KCQkJOmNhbGwgc2V0d2ludmFyKDEsICImbGlzdCIsIDApCgkJCTpjYWxsIHNldHdpbnZhcigyLCAibXl2YXIiLCAiZm9vYmFyIikKCnNoYTI1Nih7c3RyaW5nfSkJCQkJCQkqc2hhMjU2KCkqCgkJUmV0dXJucyBhIFN0cmluZyB3aXRoIDY0IGhleCBjaGFyYWN0ZXJzLCB3aGljaCBpcyB0aGUgU0hBMjU2CgkJY2hlY2tzdW0gb2Yge3N0cmluZ30uCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtjcnlwdHZ8IGZlYXR1cmV9CgpzaGVsbGVzY2FwZSh7c3RyaW5nfSBbLCB7c3BlY2lhbH1dKQkJCSpzaGVsbGVzY2FwZSgpKgoJCUVzY2FwZSB7c3RyaW5nfSBmb3IgdXNlIGFzIGEgc2hlbGwgY29tbWFuZCBhcmd1bWVudC4KCQlPbiBNUy1XaW5kb3dzIGFuZCBNUy1ET1MsIHdoZW4gJ3NoZWxsc2xhc2gnIGlzIG5vdCBzZXQsIGl0CgkJd2lsbCBlbmNsb3NlIHtzdHJpbmd9IGluIGRvdWJsZSBxdW90ZXMgYW5kIGRvdWJsZSBhbGwgZG91YmxlCgkJcXVvdGVzIHdpdGhpbiB7c3RyaW5nfS4KCQlGb3Igb3RoZXIgc3lzdGVtcywgaXQgd2lsbCBlbmNsb3NlIHtzdHJpbmd9IGluIHNpbmdsZSBxdW90ZXMKCQlhbmQgcmVwbGFjZSBhbGwgIiciIHdpdGggIidcJyciLgoJCVdoZW4gdGhlIHtzcGVjaWFsfSBhcmd1bWVudCBpcyBwcmVzZW50IGFuZCBpdCdzIGEgbm9uLXplcm8KCQlOdW1iZXIgb3IgYSBub24tZW1wdHkgU3RyaW5nICh8bm9uLXplcm8tYXJnfCksIHRoZW4gc3BlY2lhbAoJCWl0ZW1zIHN1Y2ggYXMgIiEiLCAiJSIsICIjIiBhbmQgIjxjd29yZD4iIHdpbGwgYmUgcHJlY2VkZWQgYnkKCQlhIGJhY2tzbGFzaC4gIFRoaXMgYmFja3NsYXNoIHdpbGwgYmUgcmVtb3ZlZCBhZ2FpbiBieSB0aGUgfDohfAoJCWNvbW1hbmQuCgkJVGhlICIhIiBjaGFyYWN0ZXIgd2lsbCBiZSBlc2NhcGVkIChhZ2FpbiB3aXRoIGEgfG5vbi16ZXJvLWFyZ3wKCQl7c3BlY2lhbH0pIHdoZW4gJ3NoZWxsJyBjb250YWlucyAiY3NoIiBpbiB0aGUgdGFpbC4gIFRoYXQgaXMKCQliZWNhdXNlIGZvciBjc2ggYW5kIHRjc2ggIiEiIGlzIHVzZWQgZm9yIGhpc3RvcnkgcmVwbGFjZW1lbnQKCQlldmVuIHdoZW4gaW5zaWRlIHNpbmdsZSBxdW90ZXMuCgkJVGhlIDxOTD4gY2hhcmFjdGVyIGlzIGFsc28gZXNjYXBlZC4gIFdpdGggYSB8bm9uLXplcm8tYXJnfAoJCXtzcGVjaWFsfSBhbmQgJ3NoZWxsJyBjb250YWluaW5nICJjc2giIGluIHRoZSB0YWlsIGl0J3MKCQllc2NhcGVkIGEgc2Vjb25kIHRpbWUuCgkJRXhhbXBsZSBvZiB1c2Ugd2l0aCBhIHw6IXwgY29tbWFuZDogPgoJCSAgICA6ZXhlICchZGlyICcgLiBzaGVsbGVzY2FwZShleHBhbmQoJzxjZmlsZT4nKSwgMSkKPAkJVGhpcyByZXN1bHRzIGluIGEgZGlyZWN0b3J5IGxpc3RpbmcgZm9yIHRoZSBmaWxlIHVuZGVyIHRoZQoJCWN1cnNvci4gIEV4YW1wbGUgb2YgdXNlIHdpdGggfHN5c3RlbSgpfDogPgoJCSAgICA6Y2FsbCBzeXN0ZW0oImNobW9kICt3IC0tICIgLiBzaGVsbGVzY2FwZShleHBhbmQoIiUiKSkpCjwJCVNlZSBhbHNvIHw6OlN8LgoKCnNoaWZ0d2lkdGgoKQkJCQkJCSpzaGlmdHdpZHRoKCkqCgkJUmV0dXJucyB0aGUgZWZmZWN0aXZlIHZhbHVlIG9mICdzaGlmdHdpZHRoJy4gVGhpcyBpcyB0aGUKCQknc2hpZnR3aWR0aCcgdmFsdWUgdW5sZXNzIGl0IGlzIHplcm8sIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlCgkJJ3RhYnN0b3AnIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCB3aXRoIHBhdGNoCgkJNy4zLjY5NCBpbiAyMDEyLCBldmVyeWJvZHkgc2hvdWxkIGhhdmUgaXQgYnkgbm93LgoKCnNpbXBsaWZ5KHtmaWxlbmFtZX0pCQkJCQkqc2ltcGxpZnkoKSoKCQlTaW1wbGlmeSB0aGUgZmlsZSBuYW1lIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCBjaGFuZ2luZwoJCXRoZSBtZWFuaW5nLiAgU2hvcnRjdXRzIChvbiBNUy1XaW5kb3dzKSBvciBzeW1ib2xpYyBsaW5rcyAob24KCQlVbml4KSBhcmUgbm90IHJlc29sdmVkLiAgSWYgdGhlIGZpcnN0IHBhdGggY29tcG9uZW50IGluCgkJe2ZpbGVuYW1lfSBkZXNpZ25hdGVzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyB3aWxsIGJlCgkJdmFsaWQgZm9yIHRoZSByZXN1bHQgYXMgd2VsbC4gIEEgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgaXMKCQlub3QgcmVtb3ZlZCBlaXRoZXIuCgkJRXhhbXBsZTogPgoJCQlzaW1wbGlmeSgiLi9kaXIvLi4vLi8vZmlsZS8iKSA9PSAiLi9maWxlLyIKPAkJTm90ZTogVGhlIGNvbWJpbmF0aW9uICJkaXIvLi4iIGlzIG9ubHkgcmVtb3ZlZCBpZiAiZGlyIiBpcwoJCWEgc2VhcmNoYWJsZSBkaXJlY3Rvcnkgb3IgZG9lcyBub3QgZXhpc3QuICBPbiBVbml4LCBpdCBpcyBhbHNvCgkJcmVtb3ZlZCB3aGVuICJkaXIiIGlzIGEgc3ltYm9saWMgbGluayB3aXRoaW4gdGhlIHNhbWUKCQlkaXJlY3RvcnkuICBJbiBvcmRlciB0byByZXNvbHZlIGFsbCB0aGUgaW52b2x2ZWQgc3ltYm9saWMKCQlsaW5rcyBiZWZvcmUgc2ltcGxpZnlpbmcgdGhlIHBhdGggbmFtZSwgdXNlIHxyZXNvbHZlKCl8LgoKCnNpbih7ZXhwcn0pCQkJCQkJKnNpbigpKgoJCVJldHVybiB0aGUgc2luZSBvZiB7ZXhwcn0sIG1lYXN1cmVkIGluIHJhZGlhbnMsIGFzIGEgfEZsb2F0fC4KCQl7ZXhwcn0gbXVzdCBldmFsdWF0ZSB0byBhIHxGbG9hdHwgb3IgYSB8TnVtYmVyfC4KCQlFeGFtcGxlczogPgoJCQk6ZWNobyBzaW4oMTAwKQo8CQkJLTAuNTA2MzY2ID4KCQkJOmVjaG8gc2luKC00LjAxKQo8CQkJMC43NjMzMDEKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoJCQoKc2luaCh7ZXhwcn0pCQkJCQkJKnNpbmgoKSoKCQlSZXR1cm4gdGhlIGh5cGVyYm9saWMgc2luZSBvZiB7ZXhwcn0gYXMgYSB8RmxvYXR8IGluIHRoZSByYW5nZQoJCVstaW5mLCBpbmZdLgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIHNpbmgoMC41KQo8CQkJMC41MjEwOTUgPgoJCQk6ZWNobyBzaW5oKC0wLjkpCjwJCQktMS4wMjY1MTcKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoKCnNvcnQoe2xpc3R9IFssIHtmdW5jfSBbLCB7ZGljdH1dXSkJCQkqc29ydCgpKiAqRTcwMioKCQlTb3J0IHRoZSBpdGVtcyBpbiB7bGlzdH0gaW4tcGxhY2UuICBSZXR1cm5zIHtsaXN0fS4KCQkKCQlJZiB5b3Ugd2FudCBhIGxpc3QgdG8gcmVtYWluIHVubW9kaWZpZWQgbWFrZSBhIGNvcHkgZmlyc3Q6ID4KCQkJOmxldCBzb3J0ZWRsaXN0ID0gc29ydChjb3B5KG15bGlzdCkpCgo8CQlXaGVuIHtmdW5jfSBpcyBvbWl0dGVkLCBpcyBlbXB0eSBvciB6ZXJvLCB0aGVuIHNvcnQoKSB1c2VzIHRoZQoJCXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGl0ZW0gdG8gc29ydCBvbi4gIE51bWJlcnMgc29ydAoJCWFmdGVyIFN0cmluZ3MsIHxMaXN0c3wgYWZ0ZXIgTnVtYmVycy4gIEZvciBzb3J0aW5nIHRleHQgaW4gdGhlCgkJY3VycmVudCBidWZmZXIgdXNlIHw6c29ydHwuCgoJCVdoZW4ge2Z1bmN9IGlzIGdpdmVuIGFuZCBpdCBpcyAnMScgb3IgJ2knIHRoZW4gY2FzZSBpcwoJCWlnbm9yZWQuCgkJCgkJV2hlbiB7ZnVuY30gaXMgZ2l2ZW4gYW5kIGl0IGlzICduJyB0aGVuIGFsbCBpdGVtcyB3aWxsIGJlCgkJc29ydGVkIG51bWVyaWNhbCAoSW1wbGVtZW50YXRpb24gZGV0YWlsOiBUaGlzIHVzZXMgdGhlCgkJc3RydG9kKCkgZnVuY3Rpb24gdG8gcGFyc2UgbnVtYmVycywgU3RyaW5ncywgTGlzdHMsIERpY3RzIGFuZAoJCUZ1bmNyZWZzIHdpbGwgYmUgY29uc2lkZXJlZCBhcyBiZWluZyAwKS4KCgkJV2hlbiB7ZnVuY30gaXMgZ2l2ZW4gYW5kIGl0IGlzICdOJyB0aGVuIGFsbCBpdGVtcyB3aWxsIGJlCgkJc29ydGVkIG51bWVyaWNhbC4gVGhpcyBpcyBsaWtlICduJyBidXQgYSBzdHJpbmcgY29udGFpbmluZwoJCWRpZ2l0cyB3aWxsIGJlIHVzZWQgYXMgdGhlIG51bWJlciB0aGV5IHJlcHJlc2VudC4KCgkJV2hlbiB7ZnVuY30gaXMgZ2l2ZW4gYW5kIGl0IGlzICdmJyB0aGVuIGFsbCBpdGVtcyB3aWxsIGJlCgkJc29ydGVkIG51bWVyaWNhbC4gQWxsIHZhbHVlcyBtdXN0IGJlIGEgTnVtYmVyIG9yIGEgRmxvYXQuCgoJCVdoZW4ge2Z1bmN9IGlzIGEgfEZ1bmNyZWZ8IG9yIGEgZnVuY3Rpb24gbmFtZSwgdGhpcyBmdW5jdGlvbgoJCWlzIGNhbGxlZCB0byBjb21wYXJlIGl0ZW1zLiAgVGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0d28KCQlpdGVtcyBhcyBhcmd1bWVudCBhbmQgbXVzdCByZXR1cm4gemVybyBpZiB0aGV5IGFyZSBlcXVhbCwgMSBvcgoJCWJpZ2dlciBpZiB0aGUgZmlyc3Qgb25lIHNvcnRzIGFmdGVyIHRoZSBzZWNvbmQgb25lLCAtMSBvcgoJCXNtYWxsZXIgaWYgdGhlIGZpcnN0IG9uZSBzb3J0cyBiZWZvcmUgdGhlIHNlY29uZCBvbmUuCgoJCXtkaWN0fSBpcyBmb3IgZnVuY3Rpb25zIHdpdGggdGhlICJkaWN0IiBhdHRyaWJ1dGUuICBJdCB3aWxsIGJlCgkJdXNlZCB0byBzZXQgdGhlIGxvY2FsIHZhcmlhYmxlICJzZWxmIi4gfERpY3Rpb25hcnktZnVuY3Rpb258CgoJCVRoZSBzb3J0IGlzIHN0YWJsZSwgaXRlbXMgd2hpY2ggY29tcGFyZSBlcXVhbCAoYXMgbnVtYmVyIG9yIGFzCgkJc3RyaW5nKSB3aWxsIGtlZXAgdGhlaXIgcmVsYXRpdmUgcG9zaXRpb24uIEUuZy4sIHdoZW4gc29ydGluZwoJCW9uIG51bWJlcnMsIHRleHQgc3RyaW5ncyB3aWxsIHNvcnQgbmV4dCB0byBlYWNoIG90aGVyLCBpbiB0aGUKCQlzYW1lIG9yZGVyIGFzIHRoZXkgd2VyZSBvcmlnaW5hbGx5LgoKCQlBbHNvIHNlZSB8dW5pcSgpfC4KCgkJRXhhbXBsZTogPgoJCQlmdW5jIE15Q29tcGFyZShpMSwgaTIpCgkJCSAgIHJldHVybiBhOmkxID09IGE6aTIgPyAwIDogYTppMSA+IGE6aTIgPyAxIDogLTEKCQkJZW5kZnVuYwoJCQlsZXQgc29ydGVkbGlzdCA9IHNvcnQobXlsaXN0LCAiTXlDb21wYXJlIikKPAkJQSBzaG9ydGVyIGNvbXBhcmUgdmVyc2lvbiBmb3IgdGhpcyBzcGVjaWZpYyBzaW1wbGUgY2FzZSwgd2hpY2gKCQlpZ25vcmVzIG92ZXJmbG93OiA+CgkJCWZ1bmMgTXlDb21wYXJlKGkxLCBpMikKCQkJICAgcmV0dXJuIGE6aTEgLSBhOmkyCgkJCWVuZGZ1bmMKPAoJCQkJCQkJKnNvdW5kZm9sZCgpKgpzb3VuZGZvbGQoe3dvcmR9KQoJCVJldHVybiB0aGUgc291bmQtZm9sZGVkIGVxdWl2YWxlbnQgb2Yge3dvcmR9LiAgVXNlcyB0aGUgZmlyc3QKCQlsYW5ndWFnZSBpbiAnc3BlbGxsYW5nJyBmb3IgdGhlIGN1cnJlbnQgd2luZG93IHRoYXQgc3VwcG9ydHMKCQlzb3VuZGZvbGRpbmcuICAnc3BlbGwnIG11c3QgYmUgc2V0LiAgV2hlbiBubyBzb3VuZCBmb2xkaW5nIGlzCgkJcG9zc2libGUgdGhlIHt3b3JkfSBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLgoJCVRoaXMgY2FuIGJlIHVzZWQgZm9yIG1ha2luZyBzcGVsbGluZyBzdWdnZXN0aW9ucy4gIE5vdGUgdGhhdAoJCXRoZSBtZXRob2QgY2FuIGJlIHF1aXRlIHNsb3cuCgoJCQkJCQkJKnNwZWxsYmFkd29yZCgpKgpzcGVsbGJhZHdvcmQoW3tzZW50ZW5jZX1dKQoJCVdpdGhvdXQgYXJndW1lbnQ6IFRoZSByZXN1bHQgaXMgdGhlIGJhZGx5IHNwZWxsZWQgd29yZCB1bmRlcgoJCW9yIGFmdGVyIHRoZSBjdXJzb3IuICBUaGUgY3Vyc29yIGlzIG1vdmVkIHRvIHRoZSBzdGFydCBvZiB0aGUKCQliYWQgd29yZC4gIFdoZW4gbm8gYmFkIHdvcmQgaXMgZm91bmQgaW4gdGhlIGN1cnNvciBsaW5lIHRoZQoJCXJlc3VsdCBpcyBhbiBlbXB0eSBzdHJpbmcgYW5kIHRoZSBjdXJzb3IgZG9lc24ndCBtb3ZlLgoKCQlXaXRoIGFyZ3VtZW50OiBUaGUgcmVzdWx0IGlzIHRoZSBmaXJzdCB3b3JkIGluIHtzZW50ZW5jZX0gdGhhdAoJCWlzIGJhZGx5IHNwZWxsZWQuICBJZiB0aGVyZSBhcmUgbm8gc3BlbGxpbmcgbWlzdGFrZXMgdGhlCgkJcmVzdWx0IGlzIGFuIGVtcHR5IHN0cmluZy4KCgkJVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgd2l0aCB0d28gaXRlbXM6CgkJLSBUaGUgYmFkbHkgc3BlbGxlZCB3b3JkIG9yIGFuIGVtcHR5IHN0cmluZy4KCQktIFRoZSB0eXBlIG9mIHRoZSBzcGVsbGluZyBlcnJvcjoKCQkJImJhZCIJCXNwZWxsaW5nIG1pc3Rha2UKCQkJInJhcmUiCQlyYXJlIHdvcmQKCQkJImxvY2FsIgkJd29yZCBvbmx5IHZhbGlkIGluIGFub3RoZXIgcmVnaW9uCgkJCSJjYXBzIgkJd29yZCBzaG91bGQgc3RhcnQgd2l0aCBDYXBpdGFsCgkJRXhhbXBsZTogPgoJCQllY2hvIHNwZWxsYmFkd29yZCgidGhlIHF1aWsgYnJvd24gZm94IikKPAkJCVsncXVpaycsICdiYWQnXSB+CgoJCVRoZSBzcGVsbGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgd2luZG93IGlzIHVzZWQuICBUaGUKCQknc3BlbGwnIG9wdGlvbiBtdXN0IGJlIHNldCBhbmQgdGhlIHZhbHVlIG9mICdzcGVsbGxhbmcnIGlzCgkJdXNlZC4KCgkJCQkJCQkqc3BlbGxzdWdnZXN0KCkqCnNwZWxsc3VnZ2VzdCh7d29yZH0gWywge21heH0gWywge2NhcGl0YWx9XV0pCgkJUmV0dXJuIGEgfExpc3R8IHdpdGggc3BlbGxpbmcgc3VnZ2VzdGlvbnMgdG8gcmVwbGFjZSB7d29yZH0uCgkJV2hlbiB7bWF4fSBpcyBnaXZlbiB1cCB0byB0aGlzIG51bWJlciBvZiBzdWdnZXN0aW9ucyBhcmUKCQlyZXR1cm5lZC4gIE90aGVyd2lzZSB1cCB0byAyNSBzdWdnZXN0aW9ucyBhcmUgcmV0dXJuZWQuCgoJCVdoZW4gdGhlIHtjYXBpdGFsfSBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQncyBub24temVybyBvbmx5CgkJc3VnZ2VzdGlvbnMgd2l0aCBhIGxlYWRpbmcgY2FwaXRhbCB3aWxsIGJlIGdpdmVuLiAgVXNlIHRoaXMKCQlhZnRlciBhIG1hdGNoIHdpdGggJ3NwZWxsY2FwY2hlY2snLgoKCQl7d29yZH0gY2FuIGJlIGEgYmFkbHkgc3BlbGxlZCB3b3JkIGZvbGxvd2VkIGJ5IG90aGVyIHRleHQuCgkJVGhpcyBhbGxvd3MgZm9yIGpvaW5pbmcgdHdvIHdvcmRzIHRoYXQgd2VyZSBzcGxpdC4gIFRoZQoJCXN1Z2dlc3Rpb25zIGFsc28gaW5jbHVkZSB0aGUgZm9sbG93aW5nIHRleHQsIHRodXMgeW91IGNhbgoJCXJlcGxhY2UgYSBsaW5lLgoKCQl7d29yZH0gbWF5IGFsc28gYmUgYSBnb29kIHdvcmQuICBTaW1pbGFyIHdvcmRzIHdpbGwgdGhlbiBiZQoJCXJldHVybmVkLiAge3dvcmR9IGl0c2VsZiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHN1Z2dlc3Rpb25zLAoJCWFsdGhvdWdoIGl0IG1heSBhcHBlYXIgY2FwaXRhbGl6ZWQuCgoJCVRoZSBzcGVsbGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgd2luZG93IGlzIHVzZWQuICBUaGUKCQknc3BlbGwnIG9wdGlvbiBtdXN0IGJlIHNldCBhbmQgdGhlIHZhbHVlcyBvZiAnc3BlbGxsYW5nJyBhbmQKCQknc3BlbGxzdWdnZXN0JyBhcmUgdXNlZC4KCgpzcGxpdCh7ZXhwcn0gWywge3BhdHRlcm59IFssIHtrZWVwZW1wdHl9XV0pCQkJKnNwbGl0KCkqCgkJTWFrZSBhIHxMaXN0fCBvdXQgb2Yge2V4cHJ9LiAgV2hlbiB7cGF0dGVybn0gaXMgb21pdHRlZCBvcgoJCWVtcHR5IGVhY2ggd2hpdGUtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVjb21lcyBhbgoJCWl0ZW0uCgkJT3RoZXJ3aXNlIHRoZSBzdHJpbmcgaXMgc3BsaXQgd2hlcmUge3BhdHRlcm59IG1hdGNoZXMsCgkJcmVtb3ZpbmcgdGhlIG1hdGNoZWQgY2hhcmFjdGVycy4gJ2lnbm9yZWNhc2UnIGlzIG5vdCB1c2VkCgkJaGVyZSwgYWRkIFxjIHRvIGlnbm9yZSBjYXNlLiB8L1xjfAoJCVdoZW4gdGhlIGZpcnN0IG9yIGxhc3QgaXRlbSBpcyBlbXB0eSBpdCBpcyBvbWl0dGVkLCB1bmxlc3MgdGhlCgkJe2tlZXBlbXB0eX0gYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0J3Mgbm9uLXplcm8uCgkJT3RoZXIgZW1wdHkgaXRlbXMgYXJlIGtlcHQgd2hlbiB7cGF0dGVybn0gbWF0Y2hlcyBhdCBsZWFzdCBvbmUKCQljaGFyYWN0ZXIgb3Igd2hlbiB7a2VlcGVtcHR5fSBpcyBub24temVyby4KCQlFeGFtcGxlOiA+CgkJCTpsZXQgd29yZHMgPSBzcGxpdChnZXRsaW5lKCcuJyksICdcV1wrJykKPAkJVG8gc3BsaXQgYSBzdHJpbmcgaW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXJzOiA+CgkJCTpmb3IgYyBpbiBzcGxpdChteXN0cmluZywgJ1x6cycpCjwJCUlmIHlvdSB3YW50IHRvIGtlZXAgdGhlIHNlcGFyYXRvciB5b3UgY2FuIGFsc28gdXNlICdcenMnIGF0CgkJdGhlIGVuZCBvZiB0aGUgcGF0dGVybjogPgoJCQk6ZWNobyBzcGxpdCgnYWJjOmRlZjpnaGknLCAnOlx6cycpCjwJCQlbJ2FiYzonLCAnZGVmOicsICdnaGknXSB+CgkJU3BsaXR0aW5nIGEgdGFibGUgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgY2FuIGJlIGVtcHR5OiA+CgkJCTpsZXQgaXRlbXMgPSBzcGxpdChsaW5lLCAnOicsIDEpCjwJCVRoZSBvcHBvc2l0ZSBmdW5jdGlvbiBpcyB8am9pbigpfC4KCgpzcXJ0KHtleHByfSkJCQkJCQkqc3FydCgpKgoJCVJldHVybiB0aGUgbm9uLW5lZ2F0aXZlIHNxdWFyZSByb290IG9mIEZsb2F0IHtleHByfSBhcyBhCgkJfEZsb2F0fC4KCQl7ZXhwcn0gbXVzdCBldmFsdWF0ZSB0byBhIHxGbG9hdHwgb3IgYSB8TnVtYmVyfC4gIFdoZW4ge2V4cHJ9CgkJaXMgbmVnYXRpdmUgdGhlIHJlc3VsdCBpcyBOYU4gKE5vdCBhIE51bWJlcikuCgkJRXhhbXBsZXM6ID4KCQkJOmVjaG8gc3FydCgxMDApCjwJCQkxMC4wID4KCQkJOmVjaG8gc3FydCgtNC4wMSkKPAkJCW5hbgoJCSJuYW4iIG1heSBiZSBkaWZmZXJlbnQsIGl0IGRlcGVuZHMgb24gc3lzdGVtIGxpYnJhcmllcy4KCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoJCQoKc3RyMmZsb2F0KCB7ZXhwcn0pCQkJCQkqc3RyMmZsb2F0KCkqCgkJQ29udmVydCBTdHJpbmcge2V4cHJ9IHRvIGEgRmxvYXQuICBUaGlzIG1vc3RseSB3b3JrcyB0aGUgc2FtZQoJCWFzIHdoZW4gdXNpbmcgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gYW4gZXhwcmVzc2lvbiwgc2VlCgkJfGZsb2F0aW5nLXBvaW50LWZvcm1hdHwuICBCdXQgaXQncyBhIGJpdCBtb3JlIHBlcm1pc3NpdmUuCgkJRS5nLiwgIjFlNDAiIGlzIGFjY2VwdGVkLCB3aGlsZSBpbiBhbiBleHByZXNzaW9uIHlvdSBuZWVkIHRvCgkJd3JpdGUgIjEuMGU0MCIuCgkJVGV4dCBhZnRlciB0aGUgbnVtYmVyIGlzIHNpbGVudGx5IGlnbm9yZWQuCgkJVGhlIGRlY2ltYWwgcG9pbnQgaXMgYWx3YXlzICcuJywgbm8gbWF0dGVyIHdoYXQgdGhlIGxvY2FsZSBpcwoJCXNldCB0by4gIEEgY29tbWEgZW5kcyB0aGUgbnVtYmVyOiAiMTIsMzQ1LjY3IiBpcyBjb252ZXJ0ZWQgdG8KCQkxMi4wLiAgWW91IGNhbiBzdHJpcCBvdXQgdGhvdXNhbmRzIHNlcGFyYXRvcnMgd2l0aAoJCXxzdWJzdGl0dXRlKCl8OiA+CgkJCWxldCBmID0gc3RyMmZsb2F0KHN1YnN0aXR1dGUodGV4dCwgJywnLCAnJywgJ2cnKSkKPAkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgpzdHIybnIoIHtleHByfSBbLCB7YmFzZX1dKQkJCQkqc3RyMm5yKCkqCgkJQ29udmVydCBzdHJpbmcge2V4cHJ9IHRvIGEgbnVtYmVyLgoJCXtiYXNlfSBpcyB0aGUgY29udmVyc2lvbiBiYXNlLCBpdCBjYW4gYmUgMiwgOCwgMTAgb3IgMTYuCgkJV2hlbiB7YmFzZX0gaXMgb21pdHRlZCBiYXNlIDEwIGlzIHVzZWQuICBUaGlzIGFsc28gbWVhbnMgdGhhdAoJCWEgbGVhZGluZyB6ZXJvIGRvZXNuJ3QgY2F1c2Ugb2N0YWwgY29udmVyc2lvbiB0byBiZSB1c2VkLCBhcwoJCXdpdGggdGhlIGRlZmF1bHQgU3RyaW5nIHRvIE51bWJlciBjb252ZXJzaW9uLgoJCVdoZW4ge2Jhc2V9IGlzIDE2IGEgbGVhZGluZyAiMHgiIG9yICIwWCIgaXMgaWdub3JlZC4gIFdpdGggYQoJCWRpZmZlcmVudCBiYXNlIHRoZSByZXN1bHQgd2lsbCBiZSB6ZXJvLiAgU2ltaWxhcmx5LCB3aGVuCgkJe2Jhc2V9IGlzIDggYSBsZWFkaW5nICIwIiBpcyBpZ25vcmVkLCBhbmQgd2hlbiB7YmFzZX0gaXMgMiBhCgkJbGVhZGluZyAiMGIiIG9yICIwQiIgaXMgaWdub3JlZC4KCQlUZXh0IGFmdGVyIHRoZSBudW1iZXIgaXMgc2lsZW50bHkgaWdub3JlZC4KCgpzdHJjaGFycyh7ZXhwcn0gWywge3NraXBjY31dKQkJCQkJKnN0cmNoYXJzKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCgkJaW4gU3RyaW5nIHtleHByfS4KCQlXaGVuIHtza2lwY2N9IGlzIG9taXR0ZWQgb3IgemVybywgY29tcG9zaW5nIGNoYXJhY3RlcnMgYXJlCgkJY291bnRlZCBzZXBhcmF0ZWx5LgoJCVdoZW4ge3NraXBjY30gc2V0IHRvIDEsIENvbXBvc2luZyBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkLgoJCUFsc28gc2VlIHxzdHJsZW4oKXwsIHxzdHJkaXNwbGF5d2lkdGgoKXwgYW5kIHxzdHJ3aWR0aCgpfC4KCgkJCgkJe3NraXBjY30gaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgNy40Ljc1NS4gIEZvciBiYWNrd2FyZAoJCWNvbXBhdGliaWxpdHksIHlvdSBjYW4gZGVmaW5lIGEgd3JhcHBlciBmdW5jdGlvbjogPgoJCSAgICBpZiBoYXMoInBhdGNoLTcuNC43NTUiKQoJCSAgICAgIGZ1bmN0aW9uIHM6c3RyY2hhcnMoc3RyLCBza2lwY2MpCgkJCXJldHVybiBzdHJjaGFycyhhOnN0ciwgYTpza2lwY2MpCgkJICAgICAgZW5kZnVuY3Rpb24KCQkgICAgZWxzZQoJCSAgICAgIGZ1bmN0aW9uIHM6c3RyY2hhcnMoc3RyLCBza2lwY2MpCgkJCWlmIGE6c2tpcGNjCgkJCSAgcmV0dXJuIHN0cmxlbihzdWJzdGl0dXRlKGE6c3RyLCAiLiIsICJ4IiwgImciKSkKCQkJZWxzZQoJCQkgIHJldHVybiBzdHJjaGFycyhhOnN0cikKCQkJZW5kaWYKCQkgICAgICBlbmRmdW5jdGlvbgoJCSAgICBlbmRpZgo8CgpzdHJkaXNwbGF5d2lkdGgoe2V4cHJ9Wywge2NvbH1dKQkJCSpzdHJkaXNwbGF5d2lkdGgoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIGRpc3BsYXkgY2VsbHMKCQlTdHJpbmcge2V4cHJ9IG9jY3VwaWVzIG9uIHRoZSBzY3JlZW4gd2hlbiBpdCBzdGFydHMgYXQge2NvbH0uCgkJV2hlbiB7Y29sfSBpcyBvbWl0dGVkIHplcm8gaXMgdXNlZC4gIE90aGVyd2lzZSBpdCBpcyB0aGUKCQlzY3JlZW4gY29sdW1uIHdoZXJlIHRvIHN0YXJ0LiAgVGhpcyBtYXR0ZXJzIGZvciBUYWIKCQljaGFyYWN0ZXJzLgoJCVRoZSBvcHRpb24gc2V0dGluZ3Mgb2YgdGhlIGN1cnJlbnQgd2luZG93IGFyZSB1c2VkLiAgVGhpcwoJCW1hdHRlcnMgZm9yIGFueXRoaW5nIHRoYXQncyBkaXNwbGF5ZWQgZGlmZmVyZW50bHksIHN1Y2ggYXMKCQkndGFic3RvcCcgYW5kICdkaXNwbGF5Jy4KCQlXaGVuIHtleHByfSBjb250YWlucyBjaGFyYWN0ZXJzIHdpdGggRWFzdCBBc2lhbiBXaWR0aCBDbGFzcwoJCUFtYmlndW91cywgdGhpcyBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uICdhbWJpd2lkdGgnLgoJCUFsc28gc2VlIHxzdHJsZW4oKXwsIHxzdHJ3aWR0aCgpfCBhbmQgfHN0cmNoYXJzKCl8LgoKc3RyZnRpbWUoe2Zvcm1hdH0gWywge3RpbWV9XSkJCQkJKnN0cmZ0aW1lKCkqCgkJVGhlIHJlc3VsdCBpcyBhIFN0cmluZywgd2hpY2ggaXMgYSBmb3JtYXR0ZWQgZGF0ZSBhbmQgdGltZSwgYXMKCQlzcGVjaWZpZWQgYnkgdGhlIHtmb3JtYXR9IHN0cmluZy4gIFRoZSBnaXZlbiB7dGltZX0gaXMgdXNlZCwKCQlvciB0aGUgY3VycmVudCB0aW1lIGlmIG5vIHRpbWUgaXMgZ2l2ZW4uICBUaGUgYWNjZXB0ZWQKCQl7Zm9ybWF0fSBkZXBlbmRzIG9uIHlvdXIgc3lzdGVtLCB0aHVzIHRoaXMgaXMgbm90IHBvcnRhYmxlIQoJCVNlZSB0aGUgbWFudWFsIHBhZ2Ugb2YgdGhlIEMgZnVuY3Rpb24gc3RyZnRpbWUoKSBmb3IgdGhlCgkJZm9ybWF0LiAgVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSByZXN1bHQgaXMgODAgY2hhcmFjdGVycy4KCQlTZWUgYWxzbyB8bG9jYWx0aW1lKCl8IGFuZCB8Z2V0ZnRpbWUoKXwuCgkJVGhlIGxhbmd1YWdlIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlIHw6bGFuZ3VhZ2V8IGNvbW1hbmQuCgkJRXhhbXBsZXM6ID4KCQkgIDplY2hvIHN0cmZ0aW1lKCIlYyIpCQkgICBTdW4gQXByIDI3IDExOjQ5OjIzIDE5OTcKCQkgIDplY2hvIHN0cmZ0aW1lKCIlWSAlYiAlZCAlWCIpCSAgIDE5OTcgQXByIDI3IDExOjUzOjI1CgkJICA6ZWNobyBzdHJmdGltZSgiJXklbSVkICVUIikJICAgOTcwNDI3IDExOjUzOjU1CgkJICA6ZWNobyBzdHJmdGltZSgiJUg6JU0iKQkgICAxMTo1NQoJCSAgOmVjaG8gc3RyZnRpbWUoIiVjIiwgZ2V0ZnRpbWUoImZpbGUuYyIpKQoJCQkJCQkgICBTaG93IG1vZCB0aW1lIG9mIGZpbGUuYy4KPAkJTm90IGF2YWlsYWJsZSBvbiBhbGwgc3lzdGVtcy4gIFRvIGNoZWNrIHVzZTogPgoJCQk6aWYgZXhpc3RzKCIqc3RyZnRpbWUiKQoKc3RyaWR4KHtoYXlzdGFja30sIHtuZWVkbGV9IFssIHtzdGFydH1dKQkJKnN0cmlkeCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGdpdmVzIHRoZSBieXRlIGluZGV4IGluCgkJe2hheXN0YWNrfSBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgU3RyaW5nIHtuZWVkbGV9LgoJCUlmIHtzdGFydH0gaXMgc3BlY2lmaWVkLCB0aGUgc2VhcmNoIHN0YXJ0cyBhdCBpbmRleCB7c3RhcnR9LgoJCVRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZCBhIHNlY29uZCBtYXRjaDogPgoJCQk6bGV0IGNvbG9uMSA9IHN0cmlkeChsaW5lLCAiOiIpCgkJCTpsZXQgY29sb24yID0gc3RyaWR4KGxpbmUsICI6IiwgY29sb24xICsgMSkKPAkJVGhlIHNlYXJjaCBpcyBkb25lIGNhc2Utc2Vuc2l0aXZlLgoJCUZvciBwYXR0ZXJuIHNlYXJjaGVzIHVzZSB8bWF0Y2goKXwuCgkJLTEgaXMgcmV0dXJuZWQgaWYgdGhlIHtuZWVkbGV9IGRvZXMgbm90IG9jY3VyIGluIHtoYXlzdGFja30uCgkJU2VlIGFsc28gfHN0cnJpZHgoKXwuCgkJRXhhbXBsZXM6ID4KCQkgIDplY2hvIHN0cmlkeCgiQW4gRXhhbXBsZSIsICJFeGFtcGxlIikJICAgICAzCgkJICA6ZWNobyBzdHJpZHgoIlN0YXJ0aW5nIHBvaW50IiwgIlN0YXJ0IikgICAgMAoJCSAgOmVjaG8gc3RyaWR4KCJTdGFydGluZyBwb2ludCIsICJzdGFydCIpICAgLTEKPAkJCQkJCSpzdHJzdHIoKSogKnN0cmNocigpKgoJCXN0cmlkeCgpIHdvcmtzIHNpbWlsYXIgdG8gdGhlIEMgZnVuY3Rpb24gc3Ryc3RyKCkuICBXaGVuIHVzZWQKCQl3aXRoIGEgc2luZ2xlIGNoYXJhY3RlciBpdCB3b3JrcyBzaW1pbGFyIHRvIHN0cmNocigpLgoKCQkJCQkJCSpzdHJpbmcoKSoKc3RyaW5nKHtleHByfSkJUmV0dXJuIHtleHByfSBjb252ZXJ0ZWQgdG8gYSBTdHJpbmcuICBJZiB7ZXhwcn0gaXMgYSBOdW1iZXIsCgkJRmxvYXQsIFN0cmluZyBvciBhIGNvbXBvc2l0aW9uIG9mIHRoZW0sIHRoZW4gdGhlIHJlc3VsdCBjYW4gYmUKCQlwYXJzZWQgYmFjayB3aXRoIHxldmFsKCl8LgoJCQl7ZXhwcn0gdHlwZQlyZXN1bHQgfgoJCQlTdHJpbmcJCSdzdHJpbmcnCgkJCU51bWJlcgkJMTIzCgkJCUZsb2F0CQkxMjMuMTIzNDU2IG9yIDEuMTIzNDU2ZTgKCQkJRnVuY3JlZgkJZnVuY3Rpb24oJ25hbWUnKQoJCQlMaXN0CQlbaXRlbSwgaXRlbV0KCQkJRGljdGlvbmFyeQl7a2V5OiB2YWx1ZSwga2V5OiB2YWx1ZX0KCQlOb3RlIHRoYXQgaW4gU3RyaW5nIHZhbHVlcyB0aGUgJyBjaGFyYWN0ZXIgaXMgZG91YmxlZC4KCQlBbHNvIHNlZSB8c3RydHJhbnMoKXwuCgoJCQkJCQkJKnN0cmxlbigpKgpzdHJsZW4oe2V4cHJ9KQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBTdHJpbmcKCQl7ZXhwcn0gaW4gYnl0ZXMuCgkJSWYgdGhlIGFyZ3VtZW50IGlzIGEgTnVtYmVyIGl0IGlzIGZpcnN0IGNvbnZlcnRlZCB0byBhIFN0cmluZy4KCQlGb3Igb3RoZXIgdHlwZXMgYW4gZXJyb3IgaXMgZ2l2ZW4uCgkJSWYgeW91IHdhbnQgdG8gY291bnQgdGhlIG51bWJlciBvZiBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgdXNlCgkJfHN0cmNoYXJzKCl8LgoJCUFsc28gc2VlIHxsZW4oKXwsIHxzdHJkaXNwbGF5d2lkdGgoKXwgYW5kIHxzdHJ3aWR0aCgpfC4KCnN0cnBhcnQoe3NyY30sIHtzdGFydH1bLCB7bGVufV0pCQkJKnN0cnBhcnQoKSoKCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyBwYXJ0IG9mIHtzcmN9LCBzdGFydGluZyBmcm9tCgkJYnl0ZSB7c3RhcnR9LCB3aXRoIHRoZSBieXRlIGxlbmd0aCB7bGVufS4KCQlXaGVuIG5vbi1leGlzdGluZyBieXRlcyBhcmUgaW5jbHVkZWQsIHRoaXMgZG9lc24ndCByZXN1bHQgaW4KCQlhbiBlcnJvciwgdGhlIGJ5dGVzIGFyZSBzaW1wbHkgb21pdHRlZC4KCQlJZiB7bGVufSBpcyBtaXNzaW5nLCB0aGUgY29weSBjb250aW51ZXMgZnJvbSB7c3RhcnR9IHRpbGwgdGhlCgkJZW5kIG9mIHRoZSB7c3JjfS4gPgoJCQlzdHJwYXJ0KCJhYmNkZWZnIiwgMywgMikgICAgPT0gImRlIgoJCQlzdHJwYXJ0KCJhYmNkZWZnIiwgLTIsIDQpICAgPT0gImFiIgoJCQlzdHJwYXJ0KCJhYmNkZWZnIiwgNSwgNCkgICAgPT0gImZnIgoJCQlzdHJwYXJ0KCJhYmNkZWZnIiwgMykJICAgID09ICJkZWZnIgo8CQlOb3RlOiBUbyBnZXQgdGhlIGZpcnN0IGNoYXJhY3Rlciwge3N0YXJ0fSBtdXN0IGJlIDAuICBGb3IKCQlleGFtcGxlLCB0byBnZXQgdGhyZWUgYnl0ZXMgdW5kZXIgYW5kIGFmdGVyIHRoZSBjdXJzb3I6ID4KCQkJc3RycGFydChnZXRsaW5lKCIuIiksIGNvbCgiLiIpIC0gMSwgMykKPApzdHJyaWR4KHtoYXlzdGFja30sIHtuZWVkbGV9IFssIHtzdGFydH1dKQkJCSpzdHJyaWR4KCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggZ2l2ZXMgdGhlIGJ5dGUgaW5kZXggaW4KCQl7aGF5c3RhY2t9IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIFN0cmluZyB7bmVlZGxlfS4KCQlXaGVuIHtzdGFydH0gaXMgc3BlY2lmaWVkLCBtYXRjaGVzIGJleW9uZCB0aGlzIGluZGV4IGFyZQoJCWlnbm9yZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSBtYXRjaCBiZWZvcmUgYSBwcmV2aW91cwoJCW1hdGNoOiA+CgkJCTpsZXQgbGFzdGNvbW1hID0gc3RycmlkeChsaW5lLCAiLCIpCgkJCTpsZXQgY29tbWEyID0gc3RycmlkeChsaW5lLCAiLCIsIGxhc3Rjb21tYSAtIDEpCjwJCVRoZSBzZWFyY2ggaXMgZG9uZSBjYXNlLXNlbnNpdGl2ZS4KCQlGb3IgcGF0dGVybiBzZWFyY2hlcyB1c2UgfG1hdGNoKCl8LgoJCS0xIGlzIHJldHVybmVkIGlmIHRoZSB7bmVlZGxlfSBkb2VzIG5vdCBvY2N1ciBpbiB7aGF5c3RhY2t9LgoJCUlmIHRoZSB7bmVlZGxlfSBpcyBlbXB0eSB0aGUgbGVuZ3RoIG9mIHtoYXlzdGFja30gaXMgcmV0dXJuZWQuCgkJU2VlIGFsc28gfHN0cmlkeCgpfC4gIEV4YW1wbGVzOiA+CgkJICA6ZWNobyBzdHJyaWR4KCJhbiBhbmdyeSBhcm1hZGlsbG8iLCAiYW4iKQkgICAgIDMKPAkJCQkJCQkqc3RycmNocigpKgoJCVdoZW4gdXNlZCB3aXRoIGEgc2luZ2xlIGNoYXJhY3RlciBpdCB3b3JrcyBzaW1pbGFyIHRvIHRoZSBDCgkJZnVuY3Rpb24gc3RycmNocigpLgoKc3RydHJhbnMoe2V4cHJ9KQkJCQkJKnN0cnRyYW5zKCkqCgkJVGhlIHJlc3VsdCBpcyBhIFN0cmluZywgd2hpY2ggaXMge2V4cHJ9IHdpdGggYWxsIHVucHJpbnRhYmxlCgkJY2hhcmFjdGVycyB0cmFuc2xhdGVkIGludG8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgfCdpc3ByaW50J3wuCgkJTGlrZSB0aGV5IGFyZSBzaG93biBpbiBhIHdpbmRvdy4gIEV4YW1wbGU6ID4KCQkJZWNobyBzdHJ0cmFucyhAYSkKPAkJVGhpcyBkaXNwbGF5cyBhIG5ld2xpbmUgaW4gcmVnaXN0ZXIgYSBhcyAiXkAiIGluc3RlYWQgb2YKCQlzdGFydGluZyBhIG5ldyBsaW5lLgoKc3Ryd2lkdGgoe2V4cHJ9KQkJCQkJKnN0cndpZHRoKCkqCgkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBkaXNwbGF5IGNlbGxzCgkJU3RyaW5nIHtleHByfSBvY2N1cGllcy4gIEEgVGFiIGNoYXJhY3RlciBpcyBjb3VudGVkIGFzIG9uZQoJCWNlbGwsIGFsdGVybmF0aXZlbHkgdXNlIHxzdHJkaXNwbGF5d2lkdGgoKXwuCgkJV2hlbiB7ZXhwcn0gY29udGFpbnMgY2hhcmFjdGVycyB3aXRoIEVhc3QgQXNpYW4gV2lkdGggQ2xhc3MKCQlBbWJpZ3VvdXMsIHRoaXMgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgZGVwZW5kcyBvbiAnYW1iaXdpZHRoJy4KCQlBbHNvIHNlZSB8c3RybGVuKCl8LCB8c3RyZGlzcGxheXdpZHRoKCl8IGFuZCB8c3RyY2hhcnMoKXwuCgpzdWJtYXRjaCh7bnJ9Wywge2xpc3R9XSkJCQkJKnN1Ym1hdGNoKCkqCgkJT25seSBmb3IgYW4gZXhwcmVzc2lvbiBpbiBhIHw6c3Vic3RpdHV0ZXwgY29tbWFuZCBvcgoJCXN1YnN0aXR1dGUoKSBmdW5jdGlvbi4KCQlSZXR1cm5zIHRoZSB7bnJ9J3RoIHN1Ym1hdGNoIG9mIHRoZSBtYXRjaGVkIHRleHQuICBXaGVuIHtucn0KCQlpcyAwIHRoZSB3aG9sZSBtYXRjaGVkIHRleHQgaXMgcmV0dXJuZWQuCgkJTm90ZSB0aGF0IGEgTkwgaW4gdGhlIHN0cmluZyBjYW4gc3RhbmQgZm9yIGEgbGluZSBicmVhayBvZiBhCgkJbXVsdGktbGluZSBtYXRjaCBvciBhIE5VTCBjaGFyYWN0ZXIgaW4gdGhlIHRleHQuCgkJQWxzbyBzZWUgfHN1Yi1yZXBsYWNlLWV4cHJlc3Npb258LgoKCQlJZiB7bGlzdH0gaXMgcHJlc2VudCBhbmQgbm9uLXplcm8gdGhlbiBzdWJtYXRjaCgpIHJldHVybnMgCgkJYSBsaXN0IG9mIHN0cmluZ3MsIHNpbWlsYXIgdG8gfGdldGxpbmUoKXwgd2l0aCB0d28gYXJndW1lbnRzLiAKCQlOTCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXh0IHJlcHJlc2VudCBOVUwgY2hhcmFjdGVycyBpbiB0aGUKCQl0ZXh0LgoJCU9ubHkgcmV0dXJucyBtb3JlIHRoYW4gb25lIGl0ZW0gZm9yIHw6c3Vic3RpdHV0ZXwsIGluc2lkZQoJCXxzdWJzdGl0dXRlKCl8IHRoaXMgbGlzdCB3aWxsIGFsd2F5cyBjb250YWluIG9uZSBvciB6ZXJvCgkJaXRlbXMsIHNpbmNlIHRoZXJlIGFyZSBubyByZWFsIGxpbmUgYnJlYWtzLgoKCQlFeGFtcGxlOiA+CgkJCTpzL1xkXCsvXD1zdWJtYXRjaCgwKSArIDEvCjwJCVRoaXMgZmluZHMgdGhlIGZpcnN0IG51bWJlciBpbiB0aGUgbGluZSBhbmQgYWRkcyBvbmUgdG8gaXQuCgkJQSBsaW5lIGJyZWFrIGlzIGluY2x1ZGVkIGFzIGEgbmV3bGluZSBjaGFyYWN0ZXIuCgpzdWJzdGl0dXRlKHtleHByfSwge3BhdH0sIHtzdWJ9LCB7ZmxhZ3N9KQkJKnN1YnN0aXR1dGUoKSoKCQlUaGUgcmVzdWx0IGlzIGEgU3RyaW5nLCB3aGljaCBpcyBhIGNvcHkgb2Yge2V4cHJ9LCBpbiB3aGljaAoJCXRoZSBmaXJzdCBtYXRjaCBvZiB7cGF0fSBpcyByZXBsYWNlZCB3aXRoIHtzdWJ9LgoJCVdoZW4ge2ZsYWdzfSBpcyAiZyIsIGFsbCBtYXRjaGVzIG9mIHtwYXR9IGluIHtleHByfSBhcmUKCQlyZXBsYWNlZC4gIE90aGVyd2lzZSB7ZmxhZ3N9IHNob3VsZCBiZSAiIi4KCQkKCQlUaGlzIHdvcmtzIGxpa2UgdGhlICI6c3Vic3RpdHV0ZSIgY29tbWFuZCAod2l0aG91dCBhbnkgZmxhZ3MpLgoJCUJ1dCB0aGUgbWF0Y2hpbmcgd2l0aCB7cGF0fSBpcyBhbHdheXMgZG9uZSBsaWtlIHRoZSAnbWFnaWMnCgkJb3B0aW9uIGlzIHNldCBhbmQgJ2Nwb3B0aW9ucycgaXMgZW1wdHkgKHRvIG1ha2Ugc2NyaXB0cwoJCXBvcnRhYmxlKS4gICdpZ25vcmVjYXNlJyBpcyBzdGlsbCByZWxldmFudCwgdXNlIHwvXGN8IG9yIHwvXEN8CgkJaWYgeW91IHdhbnQgdG8gaWdub3JlIG9yIG1hdGNoIGNhc2UgYW5kIGlnbm9yZSAnaWdub3JlY2FzZScuCgkJJ3NtYXJ0Y2FzZScgaXMgbm90IHVzZWQuICBTZWUgfHN0cmluZy1tYXRjaHwgZm9yIGhvdyB7cGF0fSBpcwoJCXVzZWQuCgoJCUEgIn4iIGluIHtzdWJ9IGlzIG5vdCByZXBsYWNlZCB3aXRoIHRoZSBwcmV2aW91cyB7c3VifS4KCQlOb3RlIHRoYXQgc29tZSBjb2RlcyBpbiB7c3VifSBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nCgkJfHN1Yi1yZXBsYWNlLXNwZWNpYWx8LglGb3IgZXhhbXBsZSwgdG8gcmVwbGFjZSBzb21ldGhpbmcgd2l0aAoJCSJcbiIgKHR3byBjaGFyYWN0ZXJzKSwgdXNlICJcXFxcbiIgb3IgJ1xcbicuCgoJCVdoZW4ge3BhdH0gZG9lcyBub3QgbWF0Y2ggaW4ge2V4cHJ9LCB7ZXhwcn0gaXMgcmV0dXJuZWQKCQl1bm1vZGlmaWVkLgoKCQlFeGFtcGxlOiA+CgkJCTpsZXQgJnBhdGggPSBzdWJzdGl0dXRlKCZwYXRoLCAiLFxcPVteLF0qJCIsICIiLCAiIikKPAkJVGhpcyByZW1vdmVzIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgJ3BhdGgnIG9wdGlvbi4gPgoJCQk6ZWNobyBzdWJzdGl0dXRlKCJ0ZXN0aW5nIiwgIi4qIiwgIlxcVVxcMCIsICIiKQo8CQlyZXN1bHRzIGluICJURVNUSU5HIi4KCgkJV2hlbiB7c3VifSBzdGFydHMgd2l0aCAiXD0iLCB0aGUgcmVtYWluZGVyIGlzIGludGVycHJldGVkIGFzCgkJYW4gZXhwcmVzc2lvbi4gU2VlIHxzdWItcmVwbGFjZS1leHByZXNzaW9ufC4gIEV4YW1wbGU6ID4KCQkJOmVjaG8gc3Vic3RpdHV0ZShzLCAnJVwoXHhceFwpJywKCQkJICAgXCAnXD1ucjJjaGFyKCIweCIgLiBzdWJtYXRjaCgxKSknLCAnZycpCgpzeW5JRCh7bG51bX0sIHtjb2x9LCB7dHJhbnN9KQkJCQkqc3luSUQoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgc3ludGF4IElEIGF0IHRoZSBwb3NpdGlvbgoJCXtsbnVtfSBhbmQge2NvbH0gaW4gdGhlIGN1cnJlbnQgd2luZG93LgoJCVRoZSBzeW50YXggSUQgY2FuIGJlIHVzZWQgd2l0aCB8c3luSURhdHRyKCl8IGFuZAoJCXxzeW5JRHRyYW5zKCl8IHRvIG9idGFpbiBzeW50YXggaW5mb3JtYXRpb24gYWJvdXQgdGV4dC4KCgkJe2NvbH0gaXMgMSBmb3IgdGhlIGxlZnRtb3N0IGNvbHVtbiwge2xudW19IGlzIDEgZm9yIHRoZSBmaXJzdAoJCWxpbmUuICAnc3lubWF4Y29sJyBhcHBsaWVzLCBpbiBhIGxvbmdlciBsaW5lIHplcm8gaXMgcmV0dXJuZWQuCgkJTm90ZSB0aGF0IHdoZW4gdGhlIHBvc2l0aW9uIGlzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciwKCQl0aGF0J3Mgd2hlcmUgdGhlIGN1cnNvciBjYW4gYmUgaW4gSW5zZXJ0IG1vZGUsIHN5bklEKCkgcmV0dXJucwoJCXplcm8uCgoJCVdoZW4ge3RyYW5zfSBpcyBub24temVybywgdHJhbnNwYXJlbnQgaXRlbXMgYXJlIHJlZHVjZWQgdG8gdGhlCgkJaXRlbSB0aGF0IHRoZXkgcmV2ZWFsLglUaGlzIGlzIHVzZWZ1bCB3aGVuIHdhbnRpbmcgdG8ga25vdwoJCXRoZSBlZmZlY3RpdmUgY29sb3IuICBXaGVuIHt0cmFuc30gaXMgemVybywgdGhlIHRyYW5zcGFyZW50CgkJaXRlbSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gd2FudGluZyB0byBrbm93IHdoaWNoCgkJc3ludGF4IGl0ZW0gaXMgZWZmZWN0aXZlIChlLmcuIGluc2lkZSBwYXJlbnMpLgoJCVdhcm5pbmc6IFRoaXMgZnVuY3Rpb24gY2FuIGJlIHZlcnkgc2xvdy4gIEJlc3Qgc3BlZWQgaXMKCQlvYnRhaW5lZCBieSBnb2luZyB0aHJvdWdoIHRoZSBmaWxlIGluIGZvcndhcmQgZGlyZWN0aW9uLgoKCQlFeGFtcGxlIChlY2hvZXMgdGhlIG5hbWUgb2YgdGhlIHN5bnRheCBpdGVtIHVuZGVyIHRoZSBjdXJzb3IpOiA+CgkJCTplY2hvIHN5bklEYXR0cihzeW5JRChsaW5lKCIuIiksIGNvbCgiLiIpLCAxKSwgIm5hbWUiKQo8CgpzeW5JRGF0dHIoe3N5bklEfSwge3doYXR9IFssIHttb2RlfV0pCQkJKnN5bklEYXR0cigpKgoJCVRoZSByZXN1bHQgaXMgYSBTdHJpbmcsIHdoaWNoIGlzIHRoZSB7d2hhdH0gYXR0cmlidXRlIG9mCgkJc3ludGF4IElEIHtzeW5JRH0uICBUaGlzIGNhbiBiZSB1c2VkIHRvIG9idGFpbiBpbmZvcm1hdGlvbgoJCWFib3V0IGEgc3ludGF4IGl0ZW0uCgkJe21vZGV9IGNhbiBiZSAiZ3VpIiwgImN0ZXJtIiBvciAidGVybSIsIHRvIGdldCB0aGUgYXR0cmlidXRlcwoJCWZvciB0aGF0IG1vZGUuCVdoZW4ge21vZGV9IGlzIG9taXR0ZWQsIG9yIGFuIGludmFsaWQgdmFsdWUgaXMKCQl1c2VkLCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgaGlnaGxpZ2h0aW5nIGFyZQoJCXVzZWQgKEdVSSwgY3Rlcm0gb3IgdGVybSkuCgkJVXNlIHN5bklEdHJhbnMoKSB0byBmb2xsb3cgbGlua2VkIGhpZ2hsaWdodCBncm91cHMuCgkJe3doYXR9CQlyZXN1bHQKCQkibmFtZSIJCXRoZSBuYW1lIG9mIHRoZSBzeW50YXggaXRlbQoJCSJmZyIJCWZvcmVncm91bmQgY29sb3IgKEdVSTogY29sb3IgbmFtZSB1c2VkIHRvIHNldAoJCQkJdGhlIGNvbG9yLCBjdGVybTogY29sb3IgbnVtYmVyIGFzIGEgc3RyaW5nLAoJCQkJdGVybTogZW1wdHkgc3RyaW5nKQoJCSJiZyIJCWJhY2tncm91bmQgY29sb3IgKGFzIHdpdGggImZnIikKCQkiZm9udCIJCWZvbnQgbmFtZSAob25seSBhdmFpbGFibGUgaW4gdGhlIEdVSSkKCQkJCXxoaWdobGlnaHQtZm9udHwKCQkic3AiCQlzcGVjaWFsIGNvbG9yIChhcyB3aXRoICJmZyIpIHxoaWdobGlnaHQtZ3Vpc3B8CgkJImZnIyIJCWxpa2UgImZnIiwgYnV0IGZvciB0aGUgR1VJIGFuZCB0aGUgR1VJIGlzCgkJCQlydW5uaW5nIHRoZSBuYW1lIGluICIjUlJHR0JCIiBmb3JtCgkJImJnIyIJCWxpa2UgImZnIyIgZm9yICJiZyIKCQkic3AjIgkJbGlrZSAiZmcjIiBmb3IgInNwIgoJCSJib2xkIgkJIjEiIGlmIGJvbGQKCQkiaXRhbGljIgkiMSIgaWYgaXRhbGljCgkJInJldmVyc2UiCSIxIiBpZiByZXZlcnNlCgkJImludmVyc2UiCSIxIiBpZiBpbnZlcnNlICg9IHJldmVyc2UpCgkJInN0YW5kb3V0IgkiMSIgaWYgc3RhbmRvdXQKCQkidW5kZXJsaW5lIgkiMSIgaWYgdW5kZXJsaW5lZAoJCSJ1bmRlcmN1cmwiCSIxIiBpZiB1bmRlcmN1cmxlZAoKCQlFeGFtcGxlIChlY2hvZXMgdGhlIGNvbG9yIG9mIHRoZSBzeW50YXggaXRlbSB1bmRlciB0aGUKCQljdXJzb3IpOiA+Cgk6ZWNobyBzeW5JRGF0dHIoc3luSUR0cmFucyhzeW5JRChsaW5lKCIuIiksIGNvbCgiLiIpLCAxKSksICJmZyIpCjwKc3luSUR0cmFucyh7c3luSUR9KQkJCQkJKnN5bklEdHJhbnMoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgdHJhbnNsYXRlZCBzeW50YXggSUQgb2YKCQl7c3luSUR9LiAgVGhpcyBpcyB0aGUgc3ludGF4IGdyb3VwIElEIG9mIHdoYXQgaXMgYmVpbmcgdXNlZCB0bwoJCWhpZ2hsaWdodCB0aGUgY2hhcmFjdGVyLiAgSGlnaGxpZ2h0IGxpbmtzIGdpdmVuIHdpdGgKCQkiOmhpZ2hsaWdodCBsaW5rIiBhcmUgZm9sbG93ZWQuCgpzeW5jb25jZWFsZWQoe2xudW19LCB7Y29sfSkJCQkJKnN5bmNvbmNlYWxlZCgpKgoJCVRoZSByZXN1bHQgaXMgYSBMaXN0LiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyAwIGlmIHRoZQoJCWNoYXJhY3RlciBhdCB0aGUgcG9zaXRpb24ge2xudW19IGFuZCB7Y29sfSBpcyBub3QgcGFydCBvZiBhCgkJY29uY2VhbGFibGUgcmVnaW9uLCAxIGlmIGl0IGlzLiBUaGUgc2Vjb25kIGl0ZW0gaW4gdGhlIGxpc3QgaXMKCQlhIHN0cmluZy4gSWYgdGhlIGZpcnN0IGl0ZW0gaXMgMSwgdGhlIHNlY29uZCBpdGVtIGNvbnRhaW5zIHRoZQoJCXRleHQgd2hpY2ggd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcGxhY2Ugb2YgdGhlIGNvbmNlYWxlZCB0ZXh0LAoJCWRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzZXR0aW5nIG9mICdjb25jZWFsbGV2ZWwnLiBUaGUgdGhpcmQKCQlhbmQgZmluYWwgaXRlbSBpbiB0aGUgbGlzdCBpcyBhIHVuaXF1ZSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZQoJCXNwZWNpZmljIHN5bnRheCByZWdpb24gbWF0Y2hlZC4gVGhpcyBhbGxvd3MgZGV0ZWN0aW9uIG9mIHRoZQoJCWJlZ2lubmluZyBvZiBhIG5ldyBjb25jZWFsYWJsZSByZWdpb24gaWYgdGhlcmUgYXJlIHR3bwoJCWNvbnNlY3V0aXZlIHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuCgkJRm9yIGFuIGV4YW1wbGUgdXNlIHNlZSAkVklNUlVOVElNRS9zeW50YXgvMmh0bWwudmltIC4KCgpzeW5zdGFjayh7bG51bX0sIHtjb2x9KQkJCQkJKnN5bnN0YWNrKCkqCgkJUmV0dXJuIGEgfExpc3R8LCB3aGljaCBpcyB0aGUgc3RhY2sgb2Ygc3ludGF4IGl0ZW1zIGF0IHRoZQoJCXBvc2l0aW9uIHtsbnVtfSBhbmQge2NvbH0gaW4gdGhlIGN1cnJlbnQgd2luZG93LiAgRWFjaCBpdGVtIGluCgkJdGhlIExpc3QgaXMgYW4gSUQgbGlrZSB3aGF0IHxzeW5JRCgpfCByZXR1cm5zLgoJCVRoZSBmaXJzdCBpdGVtIGluIHRoZSBMaXN0IGlzIHRoZSBvdXRlciByZWdpb24sIGZvbGxvd2luZyBhcmUKCQlpdGVtcyBjb250YWluZWQgaW4gdGhhdCBvbmUuICBUaGUgbGFzdCBvbmUgaXMgd2hhdCB8c3luSUQoKXwKCQlyZXR1cm5zLCB1bmxlc3Mgbm90IHRoZSB3aG9sZSBpdGVtIGlzIGhpZ2hsaWdodGVkIG9yIGl0IGlzIGEKCQl0cmFuc3BhcmVudCBpdGVtLgoJCVRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYSBzeW50YXggZmlsZS4KCQlFeGFtcGxlIHRoYXQgc2hvd3MgdGhlIHN5bnRheCBzdGFjayB1bmRlciB0aGUgY3Vyc29yOiA+CgkJCWZvciBpZCBpbiBzeW5zdGFjayhsaW5lKCIuIiksIGNvbCgiLiIpKQoJCQkgICBlY2hvIHN5bklEYXR0cihpZCwgIm5hbWUiKQoJCQllbmRmb3IKPAkJV2hlbiB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIHdpdGgge2xudW19IGFuZCB7Y29sfSBpcyBpbnZhbGlkCgkJbm90aGluZyBpcyByZXR1cm5lZC4gIFRoZSBwb3NpdGlvbiBqdXN0IGFmdGVyIHRoZSBsYXN0CgkJY2hhcmFjdGVyIGluIGEgbGluZSBhbmQgdGhlIGZpcnN0IGNvbHVtbiBpbiBhbiBlbXB0eSBsaW5lIGFyZQoJCXZhbGlkIHBvc2l0aW9ucy4KCnN5c3RlbSh7ZXhwcn0gWywge2lucHV0fV0pCQkJCSpzeXN0ZW0oKSogKkU2NzcqCgkJR2V0IHRoZSBvdXRwdXQgb2YgdGhlIHNoZWxsIGNvbW1hbmQge2V4cHJ9IGFzIGEgc3RyaW5nLiAgU2VlCgkJfHN5c3RlbWxpc3QoKXwgdG8gZ2V0IHRoZSBvdXRwdXQgYXMgYSBMaXN0LgoKCQlXaGVuIHtpbnB1dH0gaXMgZ2l2ZW4gYW5kIGlzIGEgc3RyaW5nIHRoaXMgc3RyaW5nIGlzIHdyaXR0ZW4gCgkJdG8gYSBmaWxlIGFuZCBwYXNzZWQgYXMgc3RkaW4gdG8gdGhlIGNvbW1hbmQuICBUaGUgc3RyaW5nIGlzIAoJCXdyaXR0ZW4gYXMtaXMsIHlvdSBuZWVkIHRvIHRha2UgY2FyZSBvZiB1c2luZyB0aGUgY29ycmVjdCBsaW5lIAoJCXNlcGFyYXRvcnMgeW91cnNlbGYuCgkJSWYge2lucHV0fSBpcyBnaXZlbiBhbmQgaXMgYSB8TGlzdHwgaXQgaXMgd3JpdHRlbiB0byB0aGUgZmlsZQoJCWluIGEgd2F5IHx3cml0ZWZpbGUoKXwgZG9lcyB3aXRoIHtiaW5hcnl9IHNldCB0byAiYiIgKGkuZS4KCQl3aXRoIGEgbmV3bGluZSBiZXR3ZWVuIGVhY2ggbGlzdCBpdGVtIHdpdGggbmV3bGluZXMgaW5zaWRlCgkJbGlzdCBpdGVtcyBjb252ZXJ0ZWQgdG8gTlVMcykuICAKCQlQaXBlcyBhcmUgbm90IHVzZWQuCgoJCVdoZW4gcHJlcGVuZGVkIGJ5IHw6c2lsZW50fCB0aGUgc2hlbGwgd2lsbCBub3QgYmUgc2V0IHRvCgkJY29va2VkIG1vZGUuICBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGNvbW1hbmRzIHRoYXQgZG8KCQlub3QgbmVlZCB0aGUgdXNlciB0byB0eXBlLiAgSXQgYXZvaWRzIHN0cmF5IGNoYXJhY3RlcnMgc2hvd2luZwoJCXVwIG9uIHRoZSBzY3JlZW4gd2hpY2ggcmVxdWlyZSB8Q1RSTC1MfCB0byByZW1vdmUuID4KCQkJOnNpbGVudCBsZXQgZiA9IHN5c3RlbSgnbHMgKi52aW0nKQo8CgkJTm90ZTogVXNlIHxzaGVsbGVzY2FwZSgpfCBvciB8OjpTfCB3aXRoIHxleHBhbmQoKXwgb3IgCgkJfGZuYW1lbW9kaWZ5KCl8IHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gYSBjb21tYW5kIAoJCWFyZ3VtZW50LiAgTmV3bGluZXMgaW4ge2V4cHJ9IG1heSBjYXVzZSB0aGUgY29tbWFuZCB0byBmYWlsLiAgCgkJVGhlIGNoYXJhY3RlcnMgaW4gJ3NoZWxscXVvdGUnIGFuZCAnc2hlbGx4cXVvdGUnIG1heSBhbHNvIAoJCWNhdXNlIHRyb3VibGUuCgkJVGhpcyBpcyBub3QgdG8gYmUgdXNlZCBmb3IgaW50ZXJhY3RpdmUgY29tbWFuZHMuCgoJCVRoZSByZXN1bHQgaXMgYSBTdHJpbmcuICBFeGFtcGxlOiA+CgkJICAgIDpsZXQgZmlsZXMgPSBzeXN0ZW0oImxzICIgLiAgc2hlbGxlc2NhcGUoZXhwYW5kKCclOmgnKSkpCgkJICAgIDpsZXQgZmlsZXMgPSBzeXN0ZW0oJ2xzICcgLiBleHBhbmQoJyU6aDpTJykpCgo8CQlUbyBtYWtlIHRoZSByZXN1bHQgbW9yZSBzeXN0ZW0taW5kZXBlbmRlbnQsIHRoZSBzaGVsbCBvdXRwdXQKCQlpcyBmaWx0ZXJlZCB0byByZXBsYWNlIDxDUj4gd2l0aCA8Tkw+IGZvciBNYWNpbnRvc2gsIGFuZAoJCTxDUj48Tkw+IHdpdGggPE5MPiBmb3IgRE9TLWxpa2Ugc3lzdGVtcy4KCQlUbyBhdm9pZCB0aGUgc3RyaW5nIGJlaW5nIHRydW5jYXRlZCBhdCBhIE5VTCwgYWxsIE5VTAoJCWNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggU09IICgweDAxKS4KCgkJVGhlIGNvbW1hbmQgZXhlY3V0ZWQgaXMgY29uc3RydWN0ZWQgdXNpbmcgc2V2ZXJhbCBvcHRpb25zOgoJJ3NoZWxsJyAnc2hlbGxjbWRmbGFnJyAnc2hlbGx4cXVvdGUnIHtleHByfSAnc2hlbGxyZWRpcicge3RtcH0gJ3NoZWxseHF1b3RlJwoJCSh7dG1wfSBpcyBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlIG5hbWUpLgoJCUZvciBVbml4IGFuZCBPUy8yIGJyYWNlcyBhcmUgcHV0IGFyb3VuZCB7ZXhwcn0gdG8gYWxsb3cgZm9yCgkJY29uY2F0ZW5hdGVkIGNvbW1hbmRzLgoKCQlUaGUgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGluICJjb29rZWQiIG1vZGUsIHNvIHRoYXQgYQoJCUNUUkwtQyB3aWxsIGludGVycnVwdCB0aGUgY29tbWFuZCAob24gVW5peCBhdCBsZWFzdCkuCgoJCVRoZSByZXN1bHRpbmcgZXJyb3IgY29kZSBjYW4gYmUgZm91bmQgaW4gfHY6c2hlbGxfZXJyb3J8LgoJCVRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIGluIHxyZXN0cmljdGVkLW1vZGV8LgoKCQlOb3RlIHRoYXQgYW55IHdyb25nIHZhbHVlIGluIHRoZSBvcHRpb25zIG1lbnRpb25lZCBhYm92ZSBtYXkKCQltYWtlIHRoZSBmdW5jdGlvbiBmYWlsLiAgSXQgaGFzIGFsc28gYmVlbiByZXBvcnRlZCB0byBmYWlsCgkJd2hlbiB1c2luZyBhIHNlY3VyaXR5IGFnZW50IGFwcGxpY2F0aW9uLgoJCVVubGlrZSAiOiFjbWQiIHRoZXJlIGlzIG5vIGF1dG9tYXRpYyBjaGVjayBmb3IgY2hhbmdlZCBmaWxlcy4KCQlVc2UgfDpjaGVja3RpbWV8IHRvIGZvcmNlIGEgY2hlY2suCgoKc3lzdGVtbGlzdCh7ZXhwcn0gWywge2lucHV0fV0pCQkJCSpzeXN0ZW1saXN0KCkqCgkJU2FtZSBhcyB8c3lzdGVtKCl8LCBidXQgcmV0dXJucyBhIHxMaXN0fCB3aXRoIGxpbmVzIChwYXJ0cyBvZiAKCQlvdXRwdXQgc2VwYXJhdGVkIGJ5IE5MKSB3aXRoIE5VTHMgdHJhbnNmb3JtZWQgaW50byBOTHMuIE91dHB1dCAKCQlpcyB0aGUgc2FtZSBhcyB8cmVhZGZpbGUoKXwgd2lsbCBvdXRwdXQgd2l0aCB7YmluYXJ5fSBhcmd1bWVudCAKCQlzZXQgdG8gImIiLgoKCQlSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvbiBlcnJvciwgc28gYmUgY2FyZWZ1bCBub3QgdG8gcnVuIAoJCWludG8gfEU3MDZ8LgoKCnRhYnBhZ2VidWZsaXN0KFt7YXJnfV0pCQkJCQkqdGFicGFnZWJ1Zmxpc3QoKSoKCQlUaGUgcmVzdWx0IGlzIGEgfExpc3R8LCB3aGVyZSBlYWNoIGl0ZW0gaXMgdGhlIG51bWJlciBvZiB0aGUKCQlidWZmZXIgYXNzb2NpYXRlZCB3aXRoIGVhY2ggd2luZG93IGluIHRoZSBjdXJyZW50IHRhYiBwYWdlLgoJCXthcmd9IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRhYiBwYWdlIHRvIGJlIHVzZWQuICBXaGVuCgkJb21pdHRlZCB0aGUgY3VycmVudCB0YWIgcGFnZSBpcyB1c2VkLgoJCVdoZW4ge2FyZ30gaXMgaW52YWxpZCB0aGUgbnVtYmVyIHplcm8gaXMgcmV0dXJuZWQuCgkJVG8gZ2V0IGEgbGlzdCBvZiBhbGwgYnVmZmVycyBpbiBhbGwgdGFicyB1c2UgdGhpczogPgoJCQlsZXQgYnVmbGlzdCA9IFtdCgkJCWZvciBpIGluIHJhbmdlKHRhYnBhZ2VucignJCcpKQoJCQkgICBjYWxsIGV4dGVuZChidWZsaXN0LCB0YWJwYWdlYnVmbGlzdChpICsgMSkpCgkJCWVuZGZvcgo8CQlOb3RlIHRoYXQgYSBidWZmZXIgbWF5IGFwcGVhciBpbiBtb3JlIHRoYW4gb25lIHdpbmRvdy4KCgp0YWJwYWdlbnIoW3thcmd9XSkJCQkJCSp0YWJwYWdlbnIoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50CgkJdGFiIHBhZ2UuICBUaGUgZmlyc3QgdGFiIHBhZ2UgaGFzIG51bWJlciAxLgoJCVdoZW4gdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGlzICIkIiwgdGhlIG51bWJlciBvZiB0aGUgbGFzdCB0YWIKCQlwYWdlIGlzIHJldHVybmVkICh0aGUgdGFiIHBhZ2UgY291bnQpLgoJCVRoZSBudW1iZXIgY2FuIGJlIHVzZWQgd2l0aCB0aGUgfDp0YWJ8IGNvbW1hbmQuCgoKdGFicGFnZXdpbm5yKHt0YWJhcmd9IFssIHthcmd9XSkJCQkqdGFicGFnZXdpbm5yKCkqCgkJTGlrZSB8d2lubnIoKXwgYnV0IGZvciB0YWIgcGFnZSB7dGFiYXJnfS4KCQl7dGFiYXJnfSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0YWIgcGFnZSB0byBiZSB1c2VkLgoJCXthcmd9IGlzIHVzZWQgbGlrZSB3aXRoIHx3aW5ucigpfDoKCQktIFdoZW4gb21pdHRlZCB0aGUgY3VycmVudCB3aW5kb3cgbnVtYmVyIGlzIHJldHVybmVkLiAgVGhpcyBpcwoJCSAgdGhlIHdpbmRvdyB3aGljaCB3aWxsIGJlIHVzZWQgd2hlbiBnb2luZyB0byB0aGlzIHRhYiBwYWdlLgoJCS0gV2hlbiAiJCIgdGhlIG51bWJlciBvZiB3aW5kb3dzIGlzIHJldHVybmVkLgoJCS0gV2hlbiAiIyIgdGhlIHByZXZpb3VzIHdpbmRvdyBuciBpcyByZXR1cm5lZC4KCQlVc2VmdWwgZXhhbXBsZXM6ID4KCQkgICAgdGFicGFnZXdpbm5yKDEpCSAgICAiIGN1cnJlbnQgd2luZG93IG9mIHRhYiBwYWdlIDEKCQkgICAgdGFicGFnZXdpbm5yKDQsICckJykgICAgIiBudW1iZXIgb2Ygd2luZG93cyBpbiB0YWIgcGFnZSA0CjwJCVdoZW4ge3RhYmFyZ30gaXMgaW52YWxpZCB6ZXJvIGlzIHJldHVybmVkLgoKCQkJCQkJCSp0YWdmaWxlcygpKgp0YWdmaWxlcygpCVJldHVybnMgYSB8TGlzdHwgd2l0aCB0aGUgZmlsZSBuYW1lcyB1c2VkIHRvIHNlYXJjaCBmb3IgdGFncwoJCWZvciB0aGUgY3VycmVudCBidWZmZXIuICBUaGlzIGlzIHRoZSAndGFncycgb3B0aW9uIGV4cGFuZGVkLgoKCnRhZ2xpc3Qoe2V4cHJ9KQkJCQkJCQkqdGFnbGlzdCgpKgoJCVJldHVybnMgYSBsaXN0IG9mIHRhZ3MgbWF0Y2hpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB7ZXhwcn0uCgkJRWFjaCBsaXN0IGl0ZW0gaXMgYSBkaWN0aW9uYXJ5IHdpdGggYXQgbGVhc3QgdGhlIGZvbGxvd2luZwoJCWVudHJpZXM6CgkJCW5hbWUJCU5hbWUgb2YgdGhlIHRhZy4KCQkJZmlsZW5hbWUJTmFtZSBvZiB0aGUgZmlsZSB3aGVyZSB0aGUgdGFnIGlzCgkJCQkJZGVmaW5lZC4gIEl0IGlzIGVpdGhlciByZWxhdGl2ZSB0byB0aGUKCQkJCQljdXJyZW50IGRpcmVjdG9yeSBvciBhIGZ1bGwgcGF0aC4KCQkJY21kCQlFeCBjb21tYW5kIHVzZWQgdG8gbG9jYXRlIHRoZSB0YWcgaW4KCQkJCQl0aGUgZmlsZS4KCQkJa2luZAkJVHlwZSBvZiB0aGUgdGFnLiAgVGhlIHZhbHVlIGZvciB0aGlzCgkJCQkJZW50cnkgZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMKCQkJCQlraW5kIHZhbHVlcy4gIE9ubHkgYXZhaWxhYmxlIHdoZW4KCQkJCQl1c2luZyBhIHRhZ3MgZmlsZSBnZW5lcmF0ZWQgYnkKCQkJCQlFeHViZXJhbnQgY3RhZ3Mgb3IgaGRydGFnLgoJCQlzdGF0aWMJCUEgZmlsZSBzcGVjaWZpYyB0YWcuICBSZWZlciB0bwoJCQkJCXxzdGF0aWMtdGFnfCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCQlNb3JlIGVudHJpZXMgbWF5IGJlIHByZXNlbnQsIGRlcGVuZGluZyBvbiB0aGUgY29udGVudCBvZiB0aGUKCQl0YWdzIGZpbGU6IGFjY2VzcywgaW1wbGVtZW50YXRpb24sIGluaGVyaXRzIGFuZCBzaWduYXR1cmUuCgkJUmVmZXIgdG8gdGhlIGN0YWdzIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlCgkJZmllbGRzLiAgRm9yIEMgY29kZSB0aGUgZmllbGRzICJzdHJ1Y3QiLCAiY2xhc3MiIGFuZCAiZW51bSIKCQltYXkgYXBwZWFyLCB0aGV5IGdpdmUgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0aGUgdGFnIGlzCgkJY29udGFpbmVkIGluLgoKCQlUaGUgZXgtY29tbWFuZCAnY21kJyBjYW4gYmUgZWl0aGVyIGFuIGV4IHNlYXJjaCBwYXR0ZXJuLCBhCgkJbGluZSBudW1iZXIgb3IgYSBsaW5lIG51bWJlciBmb2xsb3dlZCBieSBhIGJ5dGUgbnVtYmVyLgoKCQlJZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgdGFncywgdGhlbiBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgoKCQlUbyBnZXQgYW4gZXhhY3QgdGFnIG1hdGNoLCB0aGUgYW5jaG9ycyAnXicgYW5kICckJyBzaG91bGQgYmUKCQl1c2VkIGluIHtleHByfS4gIFRoaXMgYWxzbyBtYWtlIHRoZSBmdW5jdGlvbiB3b3JrIGZhc3Rlci4KCQlSZWZlciB0byB8dGFnLXJlZ2V4cHwgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZwoJCXNlYXJjaCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KCgkJUmVmZXIgdG8gfCd0YWdzJ3wgZm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgdGFncyBmaWxlIGlzCgkJbG9jYXRlZCBieSBWaW0uIFJlZmVyIHRvIHx0YWdzLWZpbGUtZm9ybWF0fCBmb3IgdGhlIGZvcm1hdCBvZgoJCXRoZSB0YWdzIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBkaWZmZXJlbnQgY3RhZ3MgdG9vbHMuCgp0ZW1wbmFtZSgpCQkJCQkqdGVtcG5hbWUoKSogKnRlbXAtZmlsZS1uYW1lKgoJCVRoZSByZXN1bHQgaXMgYSBTdHJpbmcsIHdoaWNoIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0CgkJZG9lc24ndCBleGlzdC4JSXQgY2FuIGJlIHVzZWQgZm9yIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGUgbmFtZQoJCWlzIGRpZmZlcmVudCBmb3IgYXQgbGVhc3QgMjYgY29uc2VjdXRpdmUgY2FsbHMuICBFeGFtcGxlOiA+CgkJCTpsZXQgdG1wZmlsZSA9IHRlbXBuYW1lKCkKCQkJOmV4ZSAicmVkaXIgPiAiIC4gdG1wZmlsZQo8CQlGb3IgVW5peCwgdGhlIGZpbGUgd2lsbCBiZSBpbiBhIHByaXZhdGUgZGlyZWN0b3J5IHx0ZW1wZmlsZXwuCgkJRm9yIE1TLVdpbmRvd3MgZm9yd2FyZCBzbGFzaGVzIGFyZSB1c2VkIHdoZW4gdGhlICdzaGVsbHNsYXNoJwoJCW9wdGlvbiBpcyBzZXQgb3Igd2hlbiAnc2hlbGxjbWRmbGFnJyBzdGFydHMgd2l0aCAnLScuCgoKdGFuKHtleHByfSkJCQkJCQkqdGFuKCkqCgkJUmV0dXJuIHRoZSB0YW5nZW50IG9mIHtleHByfSwgbWVhc3VyZWQgaW4gcmFkaWFucywgYXMgYSB8RmxvYXR8CgkJaW4gdGhlIHJhbmdlIFstaW5mLCBpbmZdLgoJCXtleHByfSBtdXN0IGV2YWx1YXRlIHRvIGEgfEZsb2F0fCBvciBhIHxOdW1iZXJ8LgoJCUV4YW1wbGVzOiA+CgkJCTplY2hvIHRhbigxMCkKPAkJCTAuNjQ4MzYxID4KCQkJOmVjaG8gdGFuKC00LjAxKQo8CQkJLTEuMTgxNTAyCgkJe29ubHkgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aCB0aGUgfCtmbG9hdHwgZmVhdHVyZX0KCgp0YW5oKHtleHByfSkJCQkJCQkqdGFuaCgpKgoJCVJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHtleHByfSBhcyBhIHxGbG9hdHwgaW4gdGhlCgkJcmFuZ2UgWy0xLCAxXS4KCQl7ZXhwcn0gbXVzdCBldmFsdWF0ZSB0byBhIHxGbG9hdHwgb3IgYSB8TnVtYmVyfC4KCQlFeGFtcGxlczogPgoJCQk6ZWNobyB0YW5oKDAuNSkKPAkJCTAuNDYyMTE3ID4KCQkJOmVjaG8gdGFuaCgtMSkKPAkJCS0wLjc2MTU5NAoJCXtvbmx5IGF2YWlsYWJsZSB3aGVuIGNvbXBpbGVkIHdpdGggdGhlIHwrZmxvYXR8IGZlYXR1cmV9CgoKdG9sb3dlcih7ZXhwcn0pCQkJCQkJKnRvbG93ZXIoKSoKCQlUaGUgcmVzdWx0IGlzIGEgY29weSBvZiB0aGUgU3RyaW5nIGdpdmVuLCB3aXRoIGFsbCB1cHBlcmNhc2UKCQljaGFyYWN0ZXJzIHR1cm5lZCBpbnRvIGxvd2VyY2FzZSAoanVzdCBsaWtlIGFwcGx5aW5nIHxndXwgdG8KCQl0aGUgc3RyaW5nKS4KCnRvdXBwZXIoe2V4cHJ9KQkJCQkJCSp0b3VwcGVyKCkqCgkJVGhlIHJlc3VsdCBpcyBhIGNvcHkgb2YgdGhlIFN0cmluZyBnaXZlbiwgd2l0aCBhbGwgbG93ZXJjYXNlCgkJY2hhcmFjdGVycyB0dXJuZWQgaW50byB1cHBlcmNhc2UgKGp1c3QgbGlrZSBhcHBseWluZyB8Z1V8IHRvCgkJdGhlIHN0cmluZykuCgp0cih7c3JjfSwge2Zyb21zdHJ9LCB7dG9zdHJ9KQkJCQkqdHIoKSoKCQlUaGUgcmVzdWx0IGlzIGEgY29weSBvZiB0aGUge3NyY30gc3RyaW5nIHdpdGggYWxsIGNoYXJhY3RlcnMKCQl3aGljaCBhcHBlYXIgaW4ge2Zyb21zdHJ9IHJlcGxhY2VkIGJ5IHRoZSBjaGFyYWN0ZXIgaW4gdGhhdAoJCXBvc2l0aW9uIGluIHRoZSB7dG9zdHJ9IHN0cmluZy4gIFRodXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbgoJCXtmcm9tc3RyfSBpcyB0cmFuc2xhdGVkIGludG8gdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB7dG9zdHJ9CgkJYW5kIHNvIG9uLiAgRXhhY3RseSBsaWtlIHRoZSB1bml4ICJ0ciIgY29tbWFuZC4KCQlUaGlzIGNvZGUgYWxzbyBkZWFscyB3aXRoIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIHByb3Blcmx5LgoKCQlFeGFtcGxlczogPgoJCQllY2hvIHRyKCJoZWxsbyB0aGVyZSIsICJodCIsICJIVCIpCjwJCXJldHVybnMgIkhlbGxvIFRIZXJlIiA+CgkJCWVjaG8gdHIoIjxibG9iPiIsICI8PiIsICJ7fSIpCjwJCXJldHVybnMgIntibG9ifSIKCnRydW5jKHtleHByfSkJCQkJCQkJKnRydW5jKCkqCgkJUmV0dXJuIHRoZSBsYXJnZXN0IGludGVncmFsIHZhbHVlIHdpdGggbWFnbml0dWRlIGxlc3MgdGhhbiBvcgoJCWVxdWFsIHRvIHtleHByfSBhcyBhIHxGbG9hdHwgKHRydW5jYXRlIHRvd2FyZHMgemVybykuCgkJe2V4cHJ9IG11c3QgZXZhbHVhdGUgdG8gYSB8RmxvYXR8IG9yIGEgfE51bWJlcnwuCgkJRXhhbXBsZXM6ID4KCQkJZWNobyB0cnVuYygxLjQ1NikKPAkJCTEuMCAgPgoJCQllY2hvIHRydW5jKC01LjQ1NikKPAkJCS01LjAgID4KCQkJZWNobyB0cnVuYyg0LjApCjwJCQk0LjAKCQl7b25seSBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRoIHRoZSB8K2Zsb2F0fCBmZWF0dXJlfQoJCQoJCQkJCQkJKnR5cGUoKSoKdHlwZSh7ZXhwcn0pCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB7ZXhwcn06CgkJCU51bWJlcjoJICAgIDAKCQkJU3RyaW5nOgkgICAgMQoJCQlGdW5jcmVmOiAgICAyCgkJCUxpc3Q6CSAgICAzCgkJCURpY3Rpb25hcnk6IDQKCQkJRmxvYXQ6CSAgICA1CgkJCUJvb2xlYW46ICAgIDYgKHY6ZmFsc2UgYW5kIHY6dHJ1ZSkKCQkJTm9uZQkgICAgNyAodjpudWxsIGFuZCB2Om5vbmUpCgkJCUpvYgkgICAgOAoJCVRvIGF2b2lkIHRoZSBtYWdpYyBudW1iZXJzIGl0IHNob3VsZCBiZSB1c2VkIHRoaXMgd2F5OiA+CgkJCTppZiB0eXBlKG15dmFyKSA9PSB0eXBlKDApCgkJCTppZiB0eXBlKG15dmFyKSA9PSB0eXBlKCIiKQoJCQk6aWYgdHlwZShteXZhcikgPT0gdHlwZShmdW5jdGlvbigidHIiKSkKCQkJOmlmIHR5cGUobXl2YXIpID09IHR5cGUoW10pCgkJCTppZiB0eXBlKG15dmFyKSA9PSB0eXBlKHt9KQoJCQk6aWYgdHlwZShteXZhcikgPT0gdHlwZSgwLjApCgkJCTppZiB0eXBlKG15dmFyKSA9PSB0eXBlKHY6ZmFsc2UpCgkJCTppZiB0eXBlKG15dmFyKSA9PSB0eXBlKHY6bm9uZQoKdW5kb2ZpbGUoe25hbWV9KQkJCQkJKnVuZG9maWxlKCkqCgkJUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB1bmRvIGZpbGUgdGhhdCB3b3VsZCBiZSB1c2VkIGZvciBhIGZpbGUKCQl3aXRoIG5hbWUge25hbWV9IHdoZW4gd3JpdGluZy4gIFRoaXMgdXNlcyB0aGUgJ3VuZG9kaXInCgkJb3B0aW9uLCBmaW5kaW5nIGRpcmVjdG9yaWVzIHRoYXQgZXhpc3QuICBJdCBkb2VzIG5vdCBjaGVjayBpZgoJCXRoZSB1bmRvIGZpbGUgZXhpc3RzLgoJCXtuYW1lfSBpcyBhbHdheXMgZXhwYW5kZWQgdG8gdGhlIGZ1bGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGF0CgkJaXMgdXNlZCBpbnRlcm5hbGx5LgoJCUlmIHtuYW1lfSBpcyBlbXB0eSB1bmRvZmlsZSgpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLCBzaW5jZSBhCgkJYnVmZmVyIHdpdGhvdXQgYSBmaWxlIG5hbWUgd2lsbCBub3Qgd3JpdGUgYW4gdW5kbyBmaWxlLgoJCVVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHw6d3VuZG98IGFuZCB8OnJ1bmRvfC4KCQlXaGVuIGNvbXBpbGVkIHdpdGhvdXQgdGhlICtwZXJzaXN0ZW50X3VuZG8gb3B0aW9uIHRoaXMgYWx3YXlzCgkJcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCgp1bmRvdHJlZSgpCQkJCQkJKnVuZG90cmVlKCkqCgkJUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmRvIHRyZWUgaW4gYSBkaWN0aW9uYXJ5IHdpdGgKCQl0aGUgZm9sbG93aW5nIGl0ZW1zOgoJCSAgInNlcV9sYXN0IglUaGUgaGlnaGVzdCB1bmRvIHNlcXVlbmNlIG51bWJlciB1c2VkLgoJCSAgInNlcV9jdXIiCVRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4KCQkJCXRoZSB1bmRvIHRyZWUuICBUaGlzIGRpZmZlcnMgZnJvbSAic2VxX2xhc3QiCgkJCQl3aGVuIHNvbWUgY2hhbmdlcyB3ZXJlIHVuZG9uZS4KCQkgICJ0aW1lX2N1ciIJVGltZSBsYXN0IHVzZWQgZm9yIHw6ZWFybGllcnwgYW5kIHJlbGF0ZWQKCQkJCWNvbW1hbmRzLiAgVXNlIHxzdHJmdGltZSgpfCB0byBjb252ZXJ0IHRvCgkJCQlzb21ldGhpbmcgcmVhZGFibGUuCgkJICAic2F2ZV9sYXN0IglOdW1iZXIgb2YgdGhlIGxhc3QgZmlsZSB3cml0ZS4gIFplcm8gd2hlbiBubwoJCQkJd3JpdGUgeWV0LgoJCSAgInNhdmVfY3VyIglOdW1iZXIgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHVuZG8KCQkJCXRyZWUuICAKCQkgICJzeW5jZWQiCU5vbi16ZXJvIHdoZW4gdGhlIGxhc3QgdW5kbyBibG9jayB3YXMgc3luY2VkLgoJCQkJVGhpcyBoYXBwZW5zIHdoZW4gd2FpdGluZyBmcm9tIGlucHV0IGZyb20gdGhlCgkJCQl1c2VyLiAgU2VlIHx1bmRvLWJsb2Nrc3wuCgkJICAiZW50cmllcyIJQSBsaXN0IG9mIGRpY3Rpb25hcmllcyB3aXRoIGluZm9ybWF0aW9uIGFib3V0CgkJCQl1bmRvIGJsb2Nrcy4KCgkJVGhlIGZpcnN0IGl0ZW0gaW4gdGhlICJlbnRyaWVzIiBsaXN0IGlzIHRoZSBvbGRlc3QgdW5kbyBpdGVtLgoJCUVhY2ggTGlzdCBpdGVtIGlzIGEgRGljdGlvbmFyeSB3aXRoIHRoZXNlIGl0ZW1zOgoJCSAgInNlcSIJCVVuZG8gc2VxdWVuY2UgbnVtYmVyLiAgU2FtZSBhcyB3aGF0IGFwcGVhcnMgaW4KCQkJCXw6dW5kb2xpc3R8LgoJCSAgInRpbWUiCVRpbWVzdGFtcCB3aGVuIHRoZSBjaGFuZ2UgaGFwcGVuZWQuICBVc2UKCQkJCXxzdHJmdGltZSgpfCB0byBjb252ZXJ0IHRvIHNvbWV0aGluZyByZWFkYWJsZS4KCQkgICJuZXdoZWFkIglPbmx5IGFwcGVhcnMgaW4gdGhlIGl0ZW0gdGhhdCBpcyB0aGUgbGFzdCBvbmUKCQkJCXRoYXQgd2FzIGFkZGVkLiAgVGhpcyBtYXJrcyB0aGUgbGFzdCBjaGFuZ2UKCQkJCWFuZCB3aGVyZSBmdXJ0aGVyIGNoYW5nZXMgd2lsbCBiZSBhZGRlZC4KCQkgICJjdXJoZWFkIglPbmx5IGFwcGVhcnMgaW4gdGhlIGl0ZW0gdGhhdCBpcyB0aGUgbGFzdCBvbmUKCQkJCXRoYXQgd2FzIHVuZG9uZS4gIFRoaXMgbWFya3MgdGhlIGN1cnJlbnQKCQkJCXBvc2l0aW9uIGluIHRoZSB1bmRvIHRyZWUsIHRoZSBibG9jayB0aGF0IHdpbGwKCQkJCWJlIHVzZWQgYnkgYSByZWRvIGNvbW1hbmQuICBXaGVuIG5vdGhpbmcgd2FzCgkJCQl1bmRvbmUgYWZ0ZXIgdGhlIGxhc3QgY2hhbmdlIHRoaXMgaXRlbSB3aWxsCgkJCQlub3QgYXBwZWFyIGFueXdoZXJlLgoJCSAgInNhdmUiCU9ubHkgYXBwZWFycyBvbiB0aGUgbGFzdCBibG9jayBiZWZvcmUgYSBmaWxlCgkJCQl3cml0ZS4gIFRoZSBudW1iZXIgaXMgdGhlIHdyaXRlIGNvdW50LiAgVGhlCgkJCQlmaXJzdCB3cml0ZSBoYXMgbnVtYmVyIDEsIHRoZSBsYXN0IG9uZSB0aGUKCQkJCSJzYXZlX2xhc3QiIG1lbnRpb25lZCBhYm92ZS4KCQkgICJhbHQiCQlBbHRlcm5hdGUgZW50cnkuICBUaGlzIGlzIGFnYWluIGEgTGlzdCBvZiB1bmRvCgkJCQlibG9ja3MuICBFYWNoIGl0ZW0gbWF5IGFnYWluIGhhdmUgYW4gImFsdCIKCQkJCWl0ZW0uCgp1bmlxKHtsaXN0fSBbLCB7ZnVuY30gWywge2RpY3R9XV0pCQkJKnVuaXEoKSogKkU4ODIqCgkJUmVtb3ZlIHNlY29uZCBhbmQgc3VjY2VlZGluZyBjb3BpZXMgb2YgcmVwZWF0ZWQgYWRqYWNlbnQKCQl7bGlzdH0gaXRlbXMgaW4tcGxhY2UuICBSZXR1cm5zIHtsaXN0fS4gIElmIHlvdSB3YW50IGEgbGlzdAoJCXRvIHJlbWFpbiB1bm1vZGlmaWVkIG1ha2UgYSBjb3B5IGZpcnN0OiA+CgkJCTpsZXQgbmV3bGlzdCA9IHVuaXEoY29weShteWxpc3QpKQo8CQlUaGUgZGVmYXVsdCBjb21wYXJlIGZ1bmN0aW9uIHVzZXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZgoJCWVhY2ggaXRlbS4gIEZvciB0aGUgdXNlIG9mIHtmdW5jfSBhbmQge2RpY3R9IHNlZSB8c29ydCgpfC4KCnZhbHVlcyh7ZGljdH0pCQkJCQkJKnZhbHVlcygpKgoJCVJldHVybiBhIHxMaXN0fCB3aXRoIGFsbCB0aGUgdmFsdWVzIG9mIHtkaWN0fS4JVGhlIHxMaXN0fCBpcwoJCWluIGFyYml0cmFyeSBvcmRlci4KCgp2aXJ0Y29sKHtleHByfSkJCQkJCQkqdmlydGNvbCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBzY3JlZW4gY29sdW1uIG9mIHRoZSBmaWxlCgkJcG9zaXRpb24gZ2l2ZW4gd2l0aCB7ZXhwcn0uICBUaGF0IGlzLCB0aGUgbGFzdCBzY3JlZW4gcG9zaXRpb24KCQlvY2N1cGllZCBieSB0aGUgY2hhcmFjdGVyIGF0IHRoYXQgcG9zaXRpb24sIHdoZW4gdGhlIHNjcmVlbgoJCXdvdWxkIGJlIG9mIHVubGltaXRlZCB3aWR0aC4gIFdoZW4gdGhlcmUgaXMgYSA8VGFiPiBhdCB0aGUKCQlwb3NpdGlvbiwgdGhlIHJldHVybmVkIE51bWJlciB3aWxsIGJlIHRoZSBjb2x1bW4gYXQgdGhlIGVuZCBvZgoJCXRoZSA8VGFiPi4gIEZvciBleGFtcGxlLCBmb3IgYSA8VGFiPiBpbiBjb2x1bW4gMSwgd2l0aCAndHMnCgkJc2V0IHRvIDgsIGl0IHJldHVybnMgOC4gfGNvbmNlYWx8IGlzIGlnbm9yZWQuCgkJRm9yIHRoZSBieXRlIHBvc2l0aW9uIHVzZSB8Y29sKCl8LgoJCUZvciB0aGUgdXNlIG9mIHtleHByfSBzZWUgfGNvbCgpfC4KCQlXaGVuICd2aXJ0dWFsZWRpdCcgaXMgdXNlZCB7ZXhwcn0gY2FuIGJlIFtsbnVtLCBjb2wsIG9mZl0sIHdoZXJlCgkJIm9mZiIgaXMgdGhlIG9mZnNldCBpbiBzY3JlZW4gY29sdW1ucyBmcm9tIHRoZSBzdGFydCBvZiB0aGUKCQljaGFyYWN0ZXIuICBFLmcuLCBhIHBvc2l0aW9uIHdpdGhpbiBhIDxUYWI+IG9yIGFmdGVyIHRoZSBsYXN0CgkJY2hhcmFjdGVyLiAgV2hlbiAib2ZmIiBpcyBvbWl0dGVkIHplcm8gaXMgdXNlZC4KCQlXaGVuIFZpcnR1YWwgZWRpdGluZyBpcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgbW9kZSwgYSBwb3NpdGlvbgoJCWJleW9uZCB0aGUgZW5kIG9mIHRoZSBsaW5lIGNhbiBiZSByZXR1cm5lZC4gfCd2aXJ0dWFsZWRpdCd8CgkJVGhlIGFjY2VwdGVkIHBvc2l0aW9ucyBhcmU6CgkJICAgIC4JICAgIHRoZSBjdXJzb3IgcG9zaXRpb24KCQkgICAgJAkgICAgdGhlIGVuZCBvZiB0aGUgY3Vyc29yIGxpbmUgKHRoZSByZXN1bHQgaXMgdGhlCgkJCSAgICBudW1iZXIgb2YgZGlzcGxheWVkIGNoYXJhY3RlcnMgaW4gdGhlIGN1cnNvciBsaW5lCgkJCSAgICBwbHVzIG9uZSkKCQkgICAgJ3gJICAgIHBvc2l0aW9uIG9mIG1hcmsgeCAoaWYgdGhlIG1hcmsgaXMgbm90IHNldCwgMCBpcwoJCQkgICAgcmV0dXJuZWQpCgkJICAgIHYgICAgICAgSW4gVmlzdWFsIG1vZGU6IHRoZSBzdGFydCBvZiB0aGUgVmlzdWFsIGFyZWEgKHRoZQoJCQkgICAgY3Vyc29yIGlzIHRoZSBlbmQpLiAgV2hlbiBub3QgaW4gVmlzdWFsIG1vZGUKCQkJICAgIHJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbi4gIERpZmZlcnMgZnJvbSB8Jzx8IGluCgkJCSAgICB0aGF0IGl0J3MgdXBkYXRlZCByaWdodCBhd2F5LgoJCU5vdGUgdGhhdCBvbmx5IG1hcmtzIGluIHRoZSBjdXJyZW50IGZpbGUgY2FuIGJlIHVzZWQuCgkJRXhhbXBsZXM6ID4KICB2aXJ0Y29sKCIuIikJICAgd2l0aCB0ZXh0ICJmb29eTGJhciIsIHdpdGggY3Vyc29yIG9uIHRoZSAiXkwiLCByZXR1cm5zIDUKICB2aXJ0Y29sKCIkIikJICAgd2l0aCB0ZXh0ICJmb29eTGJhciIsIHJldHVybnMgOQogIHZpcnRjb2woIid0IikgICAgd2l0aCB0ZXh0ICIJICB0aGVyZSIsIHdpdGggJ3QgYXQgJ2gnLCByZXR1cm5zIDYKPAkJVGhlIGZpcnN0IGNvbHVtbiBpcyAxLgkwIGlzIHJldHVybmVkIGZvciBhbiBlcnJvci4KCQlBIG1vcmUgYWR2YW5jZWQgZXhhbXBsZSB0aGF0IGVjaG9lcyB0aGUgbWF4aW11bSBsZW5ndGggb2YKCQlhbGwgbGluZXM6ID4KCQkgICAgZWNobyBtYXgobWFwKHJhbmdlKDEsIGxpbmUoJyQnKSksICJ2aXJ0Y29sKFt2OnZhbCwgJyQnXSkiKSkKCgp2aXN1YWxtb2RlKFtleHByXSkJCQkJCQkqdmlzdWFsbW9kZSgpKgoJCVRoZSByZXN1bHQgaXMgYSBTdHJpbmcsIHdoaWNoIGRlc2NyaWJlcyB0aGUgbGFzdCBWaXN1YWwgbW9kZQoJCXVzZWQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAgSW5pdGlhbGx5IGl0IHJldHVybnMgYW4gZW1wdHkKCQlzdHJpbmcsIGJ1dCBvbmNlIFZpc3VhbCBtb2RlIGhhcyBiZWVuIHVzZWQsIGl0IHJldHVybnMgInYiLAoJCSJWIiwgb3IgIjxDVFJMLVY+IiAoYSBzaW5nbGUgQ1RSTC1WIGNoYXJhY3RlcikgZm9yCgkJY2hhcmFjdGVyLXdpc2UsIGxpbmUtd2lzZSwgb3IgYmxvY2std2lzZSBWaXN1YWwgbW9kZQoJCXJlc3BlY3RpdmVseS4KCQlFeGFtcGxlOiA+CgkJCTpleGUgIm5vcm1hbCAiIC4gdmlzdWFsbW9kZSgpCjwJCVRoaXMgZW50ZXJzIHRoZSBzYW1lIFZpc3VhbCBtb2RlIGFzIGJlZm9yZS4gIEl0IGlzIGFsc28gdXNlZnVsCgkJaW4gc2NyaXB0cyBpZiB5b3Ugd2lzaCB0byBhY3QgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZQoJCVZpc3VhbCBtb2RlIHRoYXQgd2FzIHVzZWQuCgkJSWYgVmlzdWFsIG1vZGUgaXMgYWN0aXZlLCB1c2UgfG1vZGUoKXwgdG8gZ2V0IHRoZSBWaXN1YWwgbW9kZQoJCShlLmcuLCBpbiBhIHw6dm1hcHwpLgoJCQkJCQkJKm5vbi16ZXJvLWFyZyoKCQlJZiBbZXhwcl0gaXMgc3VwcGxpZWQgYW5kIGl0IGV2YWx1YXRlcyB0byBhIG5vbi16ZXJvIE51bWJlciBvcgoJCWEgbm9uLWVtcHR5IFN0cmluZywgdGhlbiB0aGUgVmlzdWFsIG1vZGUgd2lsbCBiZSBjbGVhcmVkIGFuZAoJCXRoZSBvbGQgdmFsdWUgaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgIiAiIGFuZCAiMCIgYXJlIGFsc28KCQlub24tZW1wdHkgc3RyaW5ncywgdGh1cyBjYXVzZSB0aGUgbW9kZSB0byBiZSBjbGVhcmVkLiAgQSBMaXN0LAoJCURpY3Rpb25hcnkgb3IgRmxvYXQgaXMgbm90IGEgTnVtYmVyIG9yIFN0cmluZywgdGh1cyBkb2VzIG5vdAoJCWNhdXNlIHRoZSBtb2RlIHRvIGJlIGNsZWFyZWQuCgp3aWxkbWVudW1vZGUoKQkJCQkJKndpbGRtZW51bW9kZSgpKgoJCVJldHVybnMgbm9uLXplcm8gd2hlbiB0aGUgd2lsZG1lbnUgaXMgYWN0aXZlIGFuZCB6ZXJvCgkJb3RoZXJ3aXNlLiAgU2VlICd3aWxkbWVudScgYW5kICd3aWxkbW9kZScuCgkJVGhpcyBjYW4gYmUgdXNlZCBpbiBtYXBwaW5ncyB0byBoYW5kbGUgdGhlICd3aWxkY2hhcm0nIG9wdGlvbgoJCWdyYWNlZnVsbHkuIChNYWtlcyBvbmx5IHNlbnNlIHdpdGggfG1hcG1vZGUtY3wgbWFwcGluZ3MpLgoKCQlGb3IgZXhhbXBsZSB0byBtYWtlIDxjLWo+IHdvcmsgbGlrZSA8ZG93bj4gaW4gd2lsZG1vZGUsIHVzZTogPgogICAgOmNub3JlbWFwIDxleHByPiA8Qy1qPiB3aWxkbWVudW1vZGUoKSA/ICJcPERvd24+XDxUYWI+IiA6ICJcPGMtaj4iCjwKCQkoTm90ZSwgdGhpcyBuZWVkcyB0aGUgJ3dpbGRjaGFybScgb3B0aW9uIHNldCBhcHByb3ByaWF0ZWx5KS4KCgoJCQkJCQkJKndpbmJ1Zm5yKCkqCndpbmJ1Zm5yKHtucn0pCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhlIGJ1ZmZlcgoJCWFzc29jaWF0ZWQgd2l0aCB3aW5kb3cge25yfS4gIFdoZW4ge25yfSBpcyB6ZXJvLCB0aGUgbnVtYmVyIG9mCgkJdGhlIGJ1ZmZlciBpbiB0aGUgY3VycmVudCB3aW5kb3cgaXMgcmV0dXJuZWQuICBXaGVuIHdpbmRvdwoJCXtucn0gZG9lc24ndCBleGlzdCwgLTEgaXMgcmV0dXJuZWQuCgkJRXhhbXBsZTogPgogIDplY2hvICJUaGUgZmlsZSBpbiB0aGUgY3VycmVudCB3aW5kb3cgaXMgIiAuIGJ1Zm5hbWUod2luYnVmbnIoMCkpCjwKCQkJCQkJCSp3aW5jb2woKSoKd2luY29sKCkJVGhlIHJlc3VsdCBpcyBhIE51bWJlciwgd2hpY2ggaXMgdGhlIHZpcnR1YWwgY29sdW1uIG9mIHRoZQoJCWN1cnNvciBpbiB0aGUgd2luZG93LiAgVGhpcyBpcyBjb3VudGluZyBzY3JlZW4gY2VsbHMgZnJvbSB0aGUKCQlsZWZ0IHNpZGUgb2YgdGhlIHdpbmRvdy4gIFRoZSBsZWZ0bW9zdCBjb2x1bW4gaXMgb25lLgoKd2luaGVpZ2h0KHtucn0pCQkJCQkJKndpbmhlaWdodCgpKgoJCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBoZWlnaHQgb2Ygd2luZG93IHtucn0uCgkJV2hlbiB7bnJ9IGlzIHplcm8sIHRoZSBoZWlnaHQgb2YgdGhlIGN1cnJlbnQgd2luZG93IGlzCgkJcmV0dXJuZWQuICBXaGVuIHdpbmRvdyB7bnJ9IGRvZXNuJ3QgZXhpc3QsIC0xIGlzIHJldHVybmVkLgoJCUFuIGV4aXN0aW5nIHdpbmRvdyBhbHdheXMgaGFzIGEgaGVpZ2h0IG9mIHplcm8gb3IgbW9yZS4KCQlFeGFtcGxlczogPgogIDplY2hvICJUaGUgY3VycmVudCB3aW5kb3cgaGFzICIgLiB3aW5oZWlnaHQoMCkgLiAiIGxpbmVzLiIKPAoJCQkJCQkJKndpbmxpbmUoKSoKd2lubGluZSgpCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBzY3JlZW4gbGluZSBvZiB0aGUgY3Vyc29yCgkJaW4gdGhlIHdpbmRvdy4JVGhpcyBpcyBjb3VudGluZyBzY3JlZW4gbGluZXMgZnJvbSB0aGUgdG9wIG9mCgkJdGhlIHdpbmRvdy4gIFRoZSBmaXJzdCBsaW5lIGlzIG9uZS4KCQlJZiB0aGUgY3Vyc29yIHdhcyBtb3ZlZCB0aGUgdmlldyBvbiB0aGUgZmlsZSB3aWxsIGJlIHVwZGF0ZWQKCQlmaXJzdCwgdGhpcyBtYXkgY2F1c2UgYSBzY3JvbGwuCgoJCQkJCQkJKndpbm5yKCkqCndpbm5yKFt7YXJnfV0pCVRoZSByZXN1bHQgaXMgYSBOdW1iZXIsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQKCQl3aW5kb3cuICBUaGUgdG9wIHdpbmRvdyBoYXMgbnVtYmVyIDEuCgkJV2hlbiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaXMgIiQiLCB0aGUgbnVtYmVyIG9mIHRoZQoJCWxhc3Qgd2luZG93IGlzIHJldHVybmVkICh0aGUgd2luZG93IGNvdW50KS4gPgoJCQlsZXQgd2luZG93X2NvdW50ID0gd2lubnIoJyQnKQo8CQlXaGVuIHRoZSBvcHRpb25hbCBhcmd1bWVudCBpcyAiIyIsIHRoZSBudW1iZXIgb2YgdGhlIGxhc3QKCQlhY2Nlc3NlZCB3aW5kb3cgaXMgcmV0dXJuZWQgKHdoZXJlIHxDVFJMLVdfcHwgZ29lcyB0bykuCgkJSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgd2luZG93IG9yIGl0IGlzIGluIGFub3RoZXIgdGFiIHBhZ2UgMAoJCWlzIHJldHVybmVkLgoJCVRoZSBudW1iZXIgY2FuIGJlIHVzZWQgd2l0aCB8Q1RSTC1XX3d8IGFuZCAiOndpbmNtZCB3IgoJCXw6d2luY21kfC4KCQlBbHNvIHNlZSB8dGFicGFnZXdpbm5yKCl8LgoKCQkJCQkJCSp3aW5yZXN0Y21kKCkqCndpbnJlc3RjbWQoKQlSZXR1cm5zIGEgc2VxdWVuY2Ugb2YgfDpyZXNpemV8IGNvbW1hbmRzIHRoYXQgc2hvdWxkIHJlc3RvcmUKCQl0aGUgY3VycmVudCB3aW5kb3cgc2l6ZXMuICBPbmx5IHdvcmtzIHByb3Blcmx5IHdoZW4gbm8gd2luZG93cwoJCWFyZSBvcGVuZWQgb3IgY2xvc2VkIGFuZCB0aGUgY3VycmVudCB3aW5kb3cgYW5kIHRhYiBwYWdlIGlzCgkJdW5jaGFuZ2VkLgoJCUV4YW1wbGU6ID4KCQkJOmxldCBjbWQgPSB3aW5yZXN0Y21kKCkKCQkJOmNhbGwgTWVzc1dpdGhXaW5kb3dTaXplcygpCgkJCTpleGUgY21kCjwKCQkJCQkJCSp3aW5yZXN0dmlldygpKgp3aW5yZXN0dmlldyh7ZGljdH0pCgkJVXNlcyB0aGUgfERpY3Rpb25hcnl8IHJldHVybmVkIGJ5IHx3aW5zYXZldmlldygpfCB0byByZXN0b3JlCgkJdGhlIHZpZXcgb2YgdGhlIGN1cnJlbnQgd2luZG93LgoJCU5vdGU6IFRoZSB7ZGljdH0gZG9lcyBub3QgaGF2ZSB0byBjb250YWluIGFsbCB2YWx1ZXMsIHRoYXQgYXJlCgkJcmV0dXJuZWQgYnkgfHdpbnNhdmV2aWV3KCl8LiBJZiB2YWx1ZXMgYXJlIG1pc3NpbmcsIHRob3NlCgkJc2V0dGluZ3Mgd29uJ3QgYmUgcmVzdG9yZWQuIFNvIHlvdSBjYW4gdXNlOiA+CgkJICAgIDpjYWxsIHdpbnJlc3R2aWV3KHsnY3Vyc3dhbnQnOiA0fSkKPAoJCVRoaXMgd2lsbCBvbmx5IHNldCB0aGUgY3Vyc3dhbnQgdmFsdWUgKHRoZSBjb2x1bW4gdGhlIGN1cnNvcgoJCXdhbnRzIHRvIG1vdmUgb24gdmVydGljYWwgbW92ZW1lbnRzKSBvZiB0aGUgY3Vyc29yIHRvIGNvbHVtbiA1CgkJKHllcywgdGhhdCBpcyA1KSwgd2hpbGUgYWxsIG90aGVyIHNldHRpbmdzIHdpbGwgcmVtYWluIHRoZQoJCXNhbWUuIFRoaXMgaXMgdXNlZnVsLCBpZiB5b3Ugc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24gbWFudWFsbHkuCgoJCUlmIHlvdSBoYXZlIGNoYW5nZWQgdGhlIHZhbHVlcyB0aGUgcmVzdWx0IGlzIHVucHJlZGljdGFibGUuCgkJSWYgdGhlIHdpbmRvdyBzaXplIGNoYW5nZWQgdGhlIHJlc3VsdCB3b24ndCBiZSB0aGUgc2FtZS4KCgkJCQkJCQkqd2luc2F2ZXZpZXcoKSoKd2luc2F2ZXZpZXcoKQlSZXR1cm5zIGEgfERpY3Rpb25hcnl8IHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gdG8gcmVzdG9yZQoJCXRoZSB2aWV3IG9mIHRoZSBjdXJyZW50IHdpbmRvdy4gIFVzZSB8d2lucmVzdHZpZXcoKXwgdG8KCQlyZXN0b3JlIHRoZSB2aWV3LgoJCVRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgbWFwcGluZyB0aGF0IGp1bXBzIGFyb3VuZCBpbiB0aGUKCQlidWZmZXIgYW5kIHlvdSB3YW50IHRvIGdvIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZpZXcuCgkJVGhpcyBkb2VzIG5vdCBzYXZlIGZvbGQgaW5mb3JtYXRpb24uICBVc2UgdGhlICdmb2xkZW5hYmxlJwoJCW9wdGlvbiB0byB0ZW1wb3JhcmlseSBzd2l0Y2ggb2ZmIGZvbGRpbmcsIHNvIHRoYXQgZm9sZHMgYXJlCgkJbm90IG9wZW5lZCB3aGVuIG1vdmluZyBhcm91bmQuIFRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzLgoJCVRoZSByZXR1cm4gdmFsdWUgaW5jbHVkZXM6CgkJCWxudW0JCWN1cnNvciBsaW5lIG51bWJlcgoJCQljb2wJCWN1cnNvciBjb2x1bW4gKE5vdGU6IHRoZSBmaXJzdCBjb2x1bW4KCQkJCQl6ZXJvLCBhcyBvcHBvc2VkIHRvIHdoYXQgZ2V0cG9zKCkKCQkJCQlyZXR1cm5zKQoJCQljb2xhZGQJCWN1cnNvciBjb2x1bW4gb2Zmc2V0IGZvciAndmlydHVhbGVkaXQnCgkJCWN1cnN3YW50CWNvbHVtbiBmb3IgdmVydGljYWwgbW92ZW1lbnQKCQkJdG9wbGluZQkJZmlyc3QgbGluZSBpbiB0aGUgd2luZG93CgkJCXRvcGZpbGwJCWZpbGxlciBsaW5lcywgb25seSBpbiBkaWZmIG1vZGUKCQkJbGVmdGNvbAkJZmlyc3QgY29sdW1uIGRpc3BsYXllZAoJCQlza2lwY29sCQljb2x1bW5zIHNraXBwZWQKCQlOb3RlIHRoYXQgbm8gb3B0aW9uIHZhbHVlcyBhcmUgc2F2ZWQuCgoKd2lud2lkdGgoe25yfSkJCQkJCQkqd2lud2lkdGgoKSoKCQlUaGUgcmVzdWx0IGlzIGEgTnVtYmVyLCB3aGljaCBpcyB0aGUgd2lkdGggb2Ygd2luZG93IHtucn0uCgkJV2hlbiB7bnJ9IGlzIHplcm8sIHRoZSB3aWR0aCBvZiB0aGUgY3VycmVudCB3aW5kb3cgaXMKCQlyZXR1cm5lZC4gIFdoZW4gd2luZG93IHtucn0gZG9lc24ndCBleGlzdCwgLTEgaXMgcmV0dXJuZWQuCgkJQW4gZXhpc3Rpbmcgd2luZG93IGFsd2F5cyBoYXMgYSB3aWR0aCBvZiB6ZXJvIG9yIG1vcmUuCgkJRXhhbXBsZXM6ID4KICA6ZWNobyAiVGhlIGN1cnJlbnQgd2luZG93IGhhcyAiIC4gd2lud2lkdGgoMCkgLiAiIGNvbHVtbnMuIgogIDppZiB3aW53aWR0aCgwKSA8PSA1MAogIDogIGV4ZSAibm9ybWFsIDUwXDxDLVc+fCIKICA6ZW5kaWYKPAp3b3JkY291bnQoKQkJCQkJCSp3b3JkY291bnQoKSoKCQlUaGUgcmVzdWx0IGlzIGEgZGljdGlvbmFyeSBvZiBieXRlL2NoYXJzL3dvcmQgc3RhdGlzdGljcyBmb3IKCQl0aGUgY3VycmVudCBidWZmZXIuICBUaGlzIGlzIHRoZSBzYW1lIGluZm8gYXMgcHJvdmlkZWQgYnkKCQl8Z19DVFJMLUd8CgkJVGhlIHJldHVybiB2YWx1ZSBpbmNsdWRlczoKCQkJYnl0ZXMJCU51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCgkJCWNoYXJzCQlOdW1iZXIgb2YgY2hhcnMgaW4gdGhlIGJ1ZmZlcgoJCQl3b3JkcwkJTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBidWZmZXIKCQkJY3Vyc29yX2J5dGVzICAgIE51bWJlciBvZiBieXRlcyBiZWZvcmUgY3Vyc29yIHBvc2l0aW9uCgkJCQkJKG5vdCBpbiBWaXN1YWwgbW9kZSkKCQkJY3Vyc29yX2NoYXJzICAgIE51bWJlciBvZiBjaGFycyBiZWZvcmUgY3Vyc29yIHBvc2l0aW9uCgkJCQkJKG5vdCBpbiBWaXN1YWwgbW9kZSkKCQkJY3Vyc29yX3dvcmRzICAgIE51bWJlciBvZiB3b3JkcyBiZWZvcmUgY3Vyc29yIHBvc2l0aW9uCgkJCQkJKG5vdCBpbiBWaXN1YWwgbW9kZSkKCQkJdmlzdWFsX2J5dGVzICAgIE51bWJlciBvZiBieXRlcyB2aXN1YWxseSBzZWxlY3RlZAoJCQkgICAgICAgICAgICAgICAgKG9ubHkgaW4gVmlzdWFsIG1vZGUpCgkJCXZpc3VhbF9jaGFycyAgICBOdW1iZXIgb2YgY2hhcnMgdmlzdWFsbHkgc2VsZWN0ZWQKCQkJICAgICAgICAgICAgICAgIChvbmx5IGluIFZpc3VhbCBtb2RlKQoJCQl2aXN1YWxfd29yZHMgICAgTnVtYmVyIG9mIGNoYXJzIHZpc3VhbGx5IHNlbGVjdGVkCgkJCSAgICAgICAgICAgICAgICAob25seSBpbiBWaXN1YWwgbW9kZSkKCgoJCQkJCQkJKndyaXRlZmlsZSgpKgp3cml0ZWZpbGUoe2xpc3R9LCB7Zm5hbWV9IFssIHtmbGFnc31dKQoJCVdyaXRlIHxMaXN0fCB7bGlzdH0gdG8gZmlsZSB7Zm5hbWV9LiAgRWFjaCBsaXN0IGl0ZW0gaXMKCQlzZXBhcmF0ZWQgd2l0aCBhIE5MLiAgRWFjaCBsaXN0IGl0ZW0gbXVzdCBiZSBhIFN0cmluZyBvcgoJCU51bWJlci4KCQlXaGVuIHtmbGFnc30gY29udGFpbnMgImIiIHRoZW4gYmluYXJ5IG1vZGUgaXMgdXNlZDogVGhlcmUgd2lsbAoJCW5vdCBiZSBhIE5MIGFmdGVyIHRoZSBsYXN0IGxpc3QgaXRlbS4gIEFuIGVtcHR5IGl0ZW0gYXQgdGhlCgkJZW5kIGRvZXMgY2F1c2UgdGhlIGxhc3QgbGluZSBpbiB0aGUgZmlsZSB0byBlbmQgaW4gYSBOTC4KCgkJV2hlbiB7ZmxhZ3N9IGNvbnRhaW5zICJhIiB0aGVuIGFwcGVuZCBtb2RlIGlzIHVzZWQsIGxpbmVzIGFyZQoJCWFwcGVuZCB0byB0aGUgZmlsZTogPgoJCQk6Y2FsbCB3cml0ZWZpbGUoWyJmb28iXSwgImV2ZW50LmxvZyIsICJhIikKCQkJOmNhbGwgd3JpdGVmaWxlKFsiYmFyIl0sICJldmVudC5sb2ciLCAiYSIpCj4KPAkJQWxsIE5MIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBOVUwgY2hhcmFjdGVyLgoJCUluc2VydGluZyBDUiBjaGFyYWN0ZXJzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHBhc3Npbmcge2xpc3R9CgkJdG8gd3JpdGVmaWxlKCkuCgkJQW4gZXhpc3RpbmcgZmlsZSBpcyBvdmVyd3JpdHRlbiwgaWYgcG9zc2libGUuCgkJV2hlbiB0aGUgd3JpdGUgZmFpbHMgLTEgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSAwLiAgVGhlcmUgaXMgYW4KCQllcnJvciBtZXNzYWdlIGlmIHRoZSBmaWxlIGNhbid0IGJlIGNyZWF0ZWQgb3Igd2hlbiB3cml0aW5nCgkJZmFpbHMuCgkJQWxzbyBzZWUgfHJlYWRmaWxlKCl8LgoJCVRvIGNvcHkgYSBmaWxlIGJ5dGUgZm9yIGJ5dGU6ID4KCQkJOmxldCBmbCA9IHJlYWRmaWxlKCJmb28iLCAiYiIpCgkJCTpjYWxsIHdyaXRlZmlsZShmbCwgImZvb2NvcHkiLCAiYiIpCgoKeG9yKHtleHByfSwge2V4cHJ9KQkJCQkJKnhvcigpKgoJCUJpdHdpc2UgWE9SIG9uIHRoZSB0d28gYXJndW1lbnRzLiAgVGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkCgkJdG8gYSBudW1iZXIuICBBIExpc3QsIERpY3Qgb3IgRmxvYXQgYXJndW1lbnQgY2F1c2VzIGFuIGVycm9yLgoJCUV4YW1wbGU6ID4KCQkJOmxldCBiaXRzID0geG9yKGJpdHMsIDB4ODApCjwKCgoJCQkJCQkJKmZlYXR1cmUtbGlzdCoKVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgZmVhdHVyZXM6CjEuICBGZWF0dXJlcyB0aGF0IGFyZSBvbmx5IHN1cHBvcnRlZCB3aGVuIHRoZXkgaGF2ZSBiZWVuIGVuYWJsZWQgd2hlbiBWaW0KICAgIHdhcyBjb21waWxlZCB8K2ZlYXR1cmUtbGlzdHwuICBFeGFtcGxlOiA+Cgk6aWYgaGFzKCJjaW5kZW50IikKMi4gIEZlYXR1cmVzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGhhdmUgYmVlbiBtZXQuCiAgICBFeGFtcGxlOiA+Cgk6aWYgaGFzKCJndWlfcnVubmluZyIpCjwJCQkJCQkJKmhhcy1wYXRjaCoKMy4gIEluY2x1ZGVkIHBhdGNoZXMuICBUaGUgInBhdGNoMTIzIiBmZWF0dXJlIG1lYW5zIHRoYXQgcGF0Y2ggMTIzIGhhcyBiZWVuCiAgICBpbmNsdWRlZC4gIE5vdGUgdGhhdCB0aGlzIGZvcm0gZG9lcyBub3QgY2hlY2sgdGhlIHZlcnNpb24gb2YgVmltLCB5b3UgbmVlZAogICAgdG8gaW5zcGVjdCB8djp2ZXJzaW9ufCBmb3IgdGhhdC4KICAgIEV4YW1wbGUgKGNoZWNraW5nIHZlcnNpb24gNi4yLjE0OCBvciBsYXRlcik6ID4KCTppZiB2OnZlcnNpb24gPiA2MDIgfHwgdjp2ZXJzaW9uID09IDYwMiAmJiBoYXMoInBhdGNoMTQ4IikKPCAgICBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgcGF0Y2ggMTQ3IHRvIGJlIG9taXR0ZWQgZXZlbiB0aG91Z2ggMTQ4IGlzCiAgICBpbmNsdWRlZC4KCjQuICBCZXlvbmQgYSBjZXJ0YWluIHZlcnNpb24gb3IgYXQgYSBjZXJ0YWluIHZlcnNpb24gYW5kIGluY2x1ZGluZyBhIHNwZWNpZmljCiAgICBwYXRjaC4gIFRoZSAicGF0Y2gtNy40LjIzNyIgZmVhdHVyZSBtZWFucyB0aGF0IHRoZSBWaW0gdmVyc2lvbiBpcyA3LjUgb3IKICAgIGxhdGVyLCBvciBpdCBpcyB2ZXJzaW9uIDcuNCBhbmQgcGF0Y2ggMjM3IHdhcyBpbmNsdWRlZC4KICAgIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3MgZm9yIHBhdGNoIDcuNC4yMzcgYW5kIGxhdGVyLCBiZWZvcmUgdGhhdCB5b3UKICAgIG5lZWQgdG8gdXNlIHRoZSBleGFtcGxlIGFib3ZlIHRoYXQgY2hlY2tzIHY6dmVyc2lvbi4gIEV4YW1wbGU6ID4KCTppZiBoYXMoInBhdGNoLTcuNC4yNDgiKQo8ICAgIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBwYXRjaCAxNDcgdG8gYmUgb21pdHRlZCBldmVuIHRob3VnaCAxNDggaXMKICAgIGluY2x1ZGVkLgoKYWNsCQkJQ29tcGlsZWQgd2l0aCB8QUNMfCBzdXBwb3J0LgphbGxfYnVpbHRpbl90ZXJtcwlDb21waWxlZCB3aXRoIGFsbCBidWlsdGluIHRlcm1pbmFscyBlbmFibGVkLgphbWlnYQkJCUFtaWdhIHZlcnNpb24gb2YgVmltLgphcmFiaWMJCQlDb21waWxlZCB3aXRoIEFyYWJpYyBzdXBwb3J0IHxBcmFiaWN8LgphcnAJCQlDb21waWxlZCB3aXRoIEFSUCBzdXBwb3J0IChBbWlnYSkuCmF1dG9jbWQJCQlDb21waWxlZCB3aXRoIGF1dG9jb21tYW5kIHN1cHBvcnQuIHxhdXRvY29tbWFuZHwKYmFsbG9vbl9ldmFsCQlDb21waWxlZCB3aXRoIHxiYWxsb29uLWV2YWx8IHN1cHBvcnQuCmJhbGxvb25fbXVsdGlsaW5lCUdVSSBzdXBwb3J0cyBtdWx0aWxpbmUgYmFsbG9vbnMuCmJlb3MJCQlCZU9TIHZlcnNpb24gb2YgVmltLgpicm93c2UJCQlDb21waWxlZCB3aXRoIHw6YnJvd3NlfCBzdXBwb3J0LCBhbmQgYnJvd3NlKCkgd2lsbAoJCQl3b3JrLgpicm93c2VmaWx0ZXIJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgfGJyb3dzZWZpbHRlcnwuCmJ1aWx0aW5fdGVybXMJCUNvbXBpbGVkIHdpdGggc29tZSBidWlsdGluIHRlcm1pbmFscy4KYnl0ZV9vZmZzZXQJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgJ28nIGluICdzdGF0dXNsaW5lJwpjaW5kZW50CQkJQ29tcGlsZWQgd2l0aCAnY2luZGVudCcgc3VwcG9ydC4KY2xpZW50c2VydmVyCQlDb21waWxlZCB3aXRoIHJlbW90ZSBpbnZvY2F0aW9uIHN1cHBvcnQgfGNsaWVudHNlcnZlcnwuCmNsaXBib2FyZAkJQ29tcGlsZWQgd2l0aCAnY2xpcGJvYXJkJyBzdXBwb3J0LgpjbWRsaW5lX2NvbXBsCQlDb21waWxlZCB3aXRoIHxjbWRsaW5lLWNvbXBsZXRpb258IHN1cHBvcnQuCmNtZGxpbmVfaGlzdAkJQ29tcGlsZWQgd2l0aCB8Y21kbGluZS1oaXN0b3J5fCBzdXBwb3J0LgpjbWRsaW5lX2luZm8JCUNvbXBpbGVkIHdpdGggJ3Nob3djbWQnIGFuZCAncnVsZXInIHN1cHBvcnQuCmNvbW1lbnRzCQlDb21waWxlZCB3aXRoIHwnY29tbWVudHMnfCBzdXBwb3J0Lgpjb21wYXRpYmxlCQlDb21waWxlZCB0byBiZSB2ZXJ5IFZpIGNvbXBhdGlibGUuCmNyeXB0dgkJCUNvbXBpbGVkIHdpdGggZW5jcnlwdGlvbiBzdXBwb3J0IHxlbmNyeXB0aW9ufC4KY3Njb3BlCQkJQ29tcGlsZWQgd2l0aCB8Y3Njb3BlfCBzdXBwb3J0LgpkZWJ1ZwkJCUNvbXBpbGVkIHdpdGggIkRFQlVHIiBkZWZpbmVkLgpkaWFsb2dfY29uCQlDb21waWxlZCB3aXRoIGNvbnNvbGUgZGlhbG9nIHN1cHBvcnQuCmRpYWxvZ19ndWkJCUNvbXBpbGVkIHdpdGggR1VJIGRpYWxvZyBzdXBwb3J0LgpkaWZmCQkJQ29tcGlsZWQgd2l0aCB8dmltZGlmZnwgYW5kICdkaWZmJyBzdXBwb3J0LgpkaWdyYXBocwkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBkaWdyYXBocy4KZGlyZWN0eAkJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgRGlyZWN0LVggYW5kICdyZW5kZXJvcHRpb25zJy4KZG5kCQkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciB0aGUgIn4gcmVnaXN0ZXIgfHF1b3RlX358Lgpkb3MxNgkJCTE2IGJpdHMgRE9TIHZlcnNpb24gb2YgVmltLgpkb3MzMgkJCTMyIGJpdHMgRE9TIChESkdQUCkgdmVyc2lvbiBvZiBWaW0uCmViY2RpYwkJCUNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRoIGViY2RpYyBjaGFyYWN0ZXIgc2V0LgplbWFjc190YWdzCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIEVtYWNzIHRhZ3MuCmV2YWwJCQlDb21waWxlZCB3aXRoIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBzdXBwb3J0LiAgQWx3YXlzCgkJCXRydWUsIG9mIGNvdXJzZSEKZXhfZXh0cmEJCXwrZXhfZXh0cmF8LCBhbHdheXMgdHJ1ZSBub3cKZXh0cmFfc2VhcmNoCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHwnaW5jc2VhcmNoJ3wgYW5kCgkJCXwnaGxzZWFyY2gnfApmYXJzaQkJCUNvbXBpbGVkIHdpdGggRmFyc2kgc3VwcG9ydCB8ZmFyc2l8LgpmaWxlX2luX3BhdGgJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgfGdmfCBhbmQgfDxjZmlsZT58CmZpbHRlcnBpcGUJCVdoZW4gJ3NoZWxsdGVtcCcgaXMgb2ZmIHBpcGVzIGFyZSB1c2VkIGZvciBzaGVsbAoJCQlyZWFkL3dyaXRlL2ZpbHRlciBjb21tYW5kcwpmaW5kX2luX3BhdGgJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgaW5jbHVkZSBmaWxlIHNlYXJjaGVzCgkJCXwrZmluZF9pbl9wYXRofC4KZmxvYXQJCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHxGbG9hdHwuCmZuYW1lX2Nhc2UJCUNhc2UgaW4gZmlsZSBuYW1lcyBtYXR0ZXJzIChmb3IgQW1pZ2EsIE1TLURPUywgYW5kCgkJCVdpbmRvd3MgdGhpcyBpcyBub3QgcHJlc2VudCkuCmZvbGRpbmcJCQlDb21waWxlZCB3aXRoIHxmb2xkaW5nfCBzdXBwb3J0Lgpmb290ZXIJCQlDb21waWxlZCB3aXRoIEdVSSBmb290ZXIgc3VwcG9ydC4gfGd1aS1mb290ZXJ8CmZvcmsJCQlDb21waWxlZCB0byB1c2UgZm9yaygpL2V4ZWMoKSBpbnN0ZWFkIG9mIHN5c3RlbSgpLgpnZXR0ZXh0CQkJQ29tcGlsZWQgd2l0aCBtZXNzYWdlIHRyYW5zbGF0aW9uIHxtdWx0aS1sYW5nfApndWkJCQlDb21waWxlZCB3aXRoIEdVSSBlbmFibGVkLgpndWlfYXRoZW5hCQlDb21waWxlZCB3aXRoIEF0aGVuYSBHVUkuCmd1aV9nbm9tZQkJQ29tcGlsZWQgd2l0aCBHbm9tZSBzdXBwb3J0IChndWlfZ3RrIGlzIGFsc28gZGVmaW5lZCkuCmd1aV9ndGsJCQlDb21waWxlZCB3aXRoIEdUSysgR1VJIChhbnkgdmVyc2lvbikuCmd1aV9ndGsyCQlDb21waWxlZCB3aXRoIEdUSysgMiBHVUkgKGd1aV9ndGsgaXMgYWxzbyBkZWZpbmVkKS4KZ3VpX21hYwkJCUNvbXBpbGVkIHdpdGggTWFjaW50b3NoIEdVSS4KZ3VpX21vdGlmCQlDb21waWxlZCB3aXRoIE1vdGlmIEdVSS4KZ3VpX3Bob3RvbgkJQ29tcGlsZWQgd2l0aCBQaG90b24gR1VJLgpndWlfcnVubmluZwkJVmltIGlzIHJ1bm5pbmcgaW4gdGhlIEdVSSwgb3IgaXQgd2lsbCBzdGFydCBzb29uLgpndWlfd2luMzIJCUNvbXBpbGVkIHdpdGggTVMgV2luZG93cyBXaW4zMiBHVUkuCmd1aV93aW4zMnMJCWlkZW0sIGFuZCBXaW4zMnMgc3lzdGVtIGJlaW5nIHVzZWQgKFdpbmRvd3MgMy4xKQpoYW5ndWxfaW5wdXQJCUNvbXBpbGVkIHdpdGggSGFuZ3VsIGlucHV0IHN1cHBvcnQuIHxoYW5ndWx8Cmljb252CQkJQ2FuIHVzZSBpY29udigpIGZvciBjb252ZXJzaW9uLgppbnNlcnRfZXhwYW5kCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIENUUkwtWCBleHBhbnNpb24gY29tbWFuZHMgaW4KCQkJSW5zZXJ0IG1vZGUuCmp1bXBsaXN0CQlDb21waWxlZCB3aXRoIHxqdW1wbGlzdHwgc3VwcG9ydC4Ka2V5bWFwCQkJQ29tcGlsZWQgd2l0aCAna2V5bWFwJyBzdXBwb3J0LgpsYW5nbWFwCQkJQ29tcGlsZWQgd2l0aCAnbGFuZ21hcCcgc3VwcG9ydC4KbGliY2FsbAkJCUNvbXBpbGVkIHdpdGggfGxpYmNhbGwoKXwgc3VwcG9ydC4KbGluZWJyZWFrCQlDb21waWxlZCB3aXRoICdsaW5lYnJlYWsnLCAnYnJlYWthdCcsICdzaG93YnJlYWsnIGFuZAoJCQknYnJlYWtpbmRlbnQnIHN1cHBvcnQuCmxpc3BpbmRlbnQJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgbGlzcCBpbmRlbnRpbmcuCmxpc3RjbWRzCQlDb21waWxlZCB3aXRoIGNvbW1hbmRzIGZvciB0aGUgYnVmZmVyIGxpc3QgfDpmaWxlc3wKCQkJYW5kIHRoZSBhcmd1bWVudCBsaXN0IHxhcmdsaXN0fC4KbG9jYWxtYXAJCUNvbXBpbGVkIHdpdGggbG9jYWwgbWFwcGluZ3MgYW5kIGFiYnIuIHw6bWFwLWxvY2FsfApsdWEJCQlDb21waWxlZCB3aXRoIEx1YSBpbnRlcmZhY2UgfEx1YXwuCm1hYwkJCU1hY2ludG9zaCB2ZXJzaW9uIG9mIFZpbS4KbWFjdW5peAkJCU1hY2ludG9zaCB2ZXJzaW9uIG9mIFZpbSwgdXNpbmcgVW5peCBmaWxlcyAoT1MtWCkuCm1lbnUJCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHw6bWVudXwuCm1rc2Vzc2lvbgkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciB8Om1rc2Vzc2lvbnwuCm1vZGlmeV9mbmFtZQkJQ29tcGlsZWQgd2l0aCBmaWxlIG5hbWUgbW9kaWZpZXJzLiB8ZmlsZW5hbWUtbW9kaWZpZXJzfAptb3VzZQkJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBtb3VzZS4KbW91c2VfZGVjCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIERlYyB0ZXJtaW5hbCBtb3VzZS4KbW91c2VfZ3BtCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIGdwbSAoTGludXggY29uc29sZSBtb3VzZSkKbW91c2VfbmV0dGVybQkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBuZXR0ZXJtIG1vdXNlLgptb3VzZV9wdGVybQkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBxbnggcHRlcm0gbW91c2UuCm1vdXNlX3N5c21vdXNlCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHN5c21vdXNlICgqQlNEIGNvbnNvbGUgbW91c2UpCm1vdXNlX3NncgkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBzZ3IgbW91c2UuCm1vdXNlX3VyeHZ0CQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHVyeHZ0IG1vdXNlLgptb3VzZV94dGVybQkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciB4dGVybSBtb3VzZS4KbW91c2VzaGFwZQkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciAnbW91c2VzaGFwZScuCm11bHRpX2J5dGUJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgJ2VuY29kaW5nJwptdWx0aV9ieXRlX2VuY29kaW5nCSdlbmNvZGluZycgaXMgc2V0IHRvIGEgbXVsdGktYnl0ZSBlbmNvZGluZy4KbXVsdGlfYnl0ZV9pbWUJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgSU1FIGlucHV0IG1ldGhvZC4KbXVsdGlfbGFuZwkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBtdWx0aXBsZSBsYW5ndWFnZXMuCm16c2NoZW1lCQlDb21waWxlZCB3aXRoIE16U2NoZW1lIGludGVyZmFjZSB8bXpzY2hlbWV8LgpuZXRiZWFuc19lbmFibGVkCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgfG5ldGJlYW5zfCBhbmQgY29ubmVjdGVkLgpuZXRiZWFuc19pbnRnCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHxuZXRiZWFuc3wuCm9sZQkJCUNvbXBpbGVkIHdpdGggT0xFIGF1dG9tYXRpb24gc3VwcG9ydCBmb3IgV2luMzIuCm9zMgkJCU9TLzIgdmVyc2lvbiBvZiBWaW0uCnBhdGhfZXh0cmEJCUNvbXBpbGVkIHdpdGggdXAvZG93bndhcmRzIHNlYXJjaCBpbiAncGF0aCcgYW5kICd0YWdzJwpwZXJsCQkJQ29tcGlsZWQgd2l0aCBQZXJsIGludGVyZmFjZS4KcGVyc2lzdGVudF91bmRvCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHBlcnNpc3RlbnQgdW5kbyBoaXN0b3J5Lgpwb3N0c2NyaXB0CQlDb21waWxlZCB3aXRoIFBvc3RTY3JpcHQgZmlsZSBwcmludGluZy4KcHJpbnRlcgkJCUNvbXBpbGVkIHdpdGggfDpoYXJkY29weXwgc3VwcG9ydC4KcHJvZmlsZQkJCUNvbXBpbGVkIHdpdGggfDpwcm9maWxlfCBzdXBwb3J0LgpweXRob24JCQlDb21waWxlZCB3aXRoIFB5dGhvbiAyLnggaW50ZXJmYWNlLiB8aGFzLXB5dGhvbnwKcHl0aG9uMwkJCUNvbXBpbGVkIHdpdGggUHl0aG9uIDMueCBpbnRlcmZhY2UuIHxoYXMtcHl0aG9ufApxbngJCQlRTlggdmVyc2lvbiBvZiBWaW0uCnF1aWNrZml4CQlDb21waWxlZCB3aXRoIHxxdWlja2ZpeHwgc3VwcG9ydC4KcmVsdGltZQkJCUNvbXBpbGVkIHdpdGggfHJlbHRpbWUoKXwgc3VwcG9ydC4KcmlnaHRsZWZ0CQlDb21waWxlZCB3aXRoICdyaWdodGxlZnQnIHN1cHBvcnQuCnJ1YnkJCQlDb21waWxlZCB3aXRoIFJ1YnkgaW50ZXJmYWNlIHxydWJ5fC4Kc2Nyb2xsYmluZAkJQ29tcGlsZWQgd2l0aCAnc2Nyb2xsYmluZCcgc3VwcG9ydC4Kc2hvd2NtZAkJCUNvbXBpbGVkIHdpdGggJ3Nob3djbWQnIHN1cHBvcnQuCnNpZ25zCQkJQ29tcGlsZWQgd2l0aCB8OnNpZ258IHN1cHBvcnQuCnNtYXJ0aW5kZW50CQlDb21waWxlZCB3aXRoICdzbWFydGluZGVudCcgc3VwcG9ydC4Kc25pZmYJCQlDb21waWxlZCB3aXRoIFNOaUZGIGludGVyZmFjZSBzdXBwb3J0LgpzcGVsbAkJCUNvbXBpbGVkIHdpdGggc3BlbGwgY2hlY2tpbmcgc3VwcG9ydCB8c3BlbGx8LgpzdGFydHVwdGltZQkJQ29tcGlsZWQgd2l0aCB8LS1zdGFydHVwdGltZXwgc3VwcG9ydC4Kc3RhdHVzbGluZQkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciAnc3RhdHVzbGluZScsICdydWxlcmZvcm1hdCcKCQkJYW5kIHNwZWNpYWwgZm9ybWF0cyBvZiAndGl0bGVzdHJpbmcnIGFuZCAnaWNvbnN0cmluZycuCnN1bl93b3Jrc2hvcAkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBTdW4gfHdvcmtzaG9wfC4Kc3ludGF4CQkJQ29tcGlsZWQgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIHN1cHBvcnQgfHN5bnRheHwuCnN5bnRheF9pdGVtcwkJVGhlcmUgYXJlIGFjdGl2ZSBzeW50YXggaGlnaGxpZ2h0aW5nIGl0ZW1zIGZvciB0aGUKCQkJY3VycmVudCBidWZmZXIuCnN5c3RlbQkJCUNvbXBpbGVkIHRvIHVzZSBzeXN0ZW0oKSBpbnN0ZWFkIG9mIGZvcmsoKS9leGVjKCkuCnRhZ19iaW5hcnkJCUNvbXBpbGVkIHdpdGggYmluYXJ5IHNlYXJjaGluZyBpbiB0YWdzIGZpbGVzCgkJCXx0YWctYmluYXJ5LXNlYXJjaHwuCnRhZ19vbGRfc3RhdGljCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIG9sZCBzdGF0aWMgdGFncwoJCQl8dGFnLW9sZC1zdGF0aWN8Lgp0YWdfYW55X3doaXRlCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIGFueSB3aGl0ZSBjaGFyYWN0ZXJzIGluIHRhZ3MKCQkJZmlsZXMgfHRhZy1hbnktd2hpdGV8Lgp0Y2wJCQlDb21waWxlZCB3aXRoIFRjbCBpbnRlcmZhY2UuCnRlcm1pbmZvCQlDb21waWxlZCB3aXRoIHRlcm1pbmZvIGluc3RlYWQgb2YgdGVybWNhcC4KdGVybXJlc3BvbnNlCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHx0X1JWfCBhbmQgfHY6dGVybXJlc3BvbnNlfC4KdGV4dG9iamVjdHMJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3IgfHRleHQtb2JqZWN0c3wuCnRnZXRlbnQJCQlDb21waWxlZCB3aXRoIHRnZXRlbnQgc3VwcG9ydCwgYWJsZSB0byB1c2UgYSB0ZXJtY2FwCgkJCW9yIHRlcm1pbmZvIGZpbGUuCnRpdGxlCQkJQ29tcGlsZWQgd2l0aCB3aW5kb3cgdGl0bGUgc3VwcG9ydCB8J3RpdGxlJ3wuCnRvb2xiYXIJCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIHxndWktdG9vbGJhcnwuCnVuaXgJCQlVbml4IHZlcnNpb24gb2YgVmltLgp1c2VyX2NvbW1hbmRzCQlVc2VyLWRlZmluZWQgY29tbWFuZHMuCnZlcnRzcGxpdAkJQ29tcGlsZWQgd2l0aCB2ZXJ0aWNhbGx5IHNwbGl0IHdpbmRvd3MgfDp2c3BsaXR8Lgp2aW1fc3RhcnRpbmcJCVRydWUgd2hpbGUgaW5pdGlhbCBzb3VyY2UnaW5nIHRha2VzIHBsYWNlLiB8c3RhcnR1cHwKdmltaW5mbwkJCUNvbXBpbGVkIHdpdGggdmltaW5mbyBzdXBwb3J0Lgp2aXJ0dWFsZWRpdAkJQ29tcGlsZWQgd2l0aCAndmlydHVhbGVkaXQnIG9wdGlvbi4KdmlzdWFsCQkJQ29tcGlsZWQgd2l0aCBWaXN1YWwgbW9kZS4KdmlzdWFsZXh0cmEJCUNvbXBpbGVkIHdpdGggZXh0cmEgVmlzdWFsIG1vZGUgY29tbWFuZHMuCgkJCXxibG9ja3dpc2Utb3BlcmF0b3JzfC4Kdm1zCQkJVk1TIHZlcnNpb24gb2YgVmltLgp2cmVwbGFjZQkJQ29tcGlsZWQgd2l0aCB8Z1J8IGFuZCB8Z3J8IGNvbW1hbmRzLgp3aWxkaWdub3JlCQlDb21waWxlZCB3aXRoICd3aWxkaWdub3JlJyBvcHRpb24uCndpbGRtZW51CQlDb21waWxlZCB3aXRoICd3aWxkbWVudScgb3B0aW9uLgp3aW4xNgkJCVdpbjE2IHZlcnNpb24gb2YgVmltIChNUy1XaW5kb3dzIDMuMSkuCndpbjMyCQkJV2luMzIgdmVyc2lvbiBvZiBWaW0gKE1TLVdpbmRvd3MgOTUgYW5kIGxhdGVyLCAzMiBvcgoJCQk2NCBiaXRzKQp3aW4zMnVuaXgJCVdpbjMyIHZlcnNpb24gb2YgVmltLCB1c2luZyBVbml4IGZpbGVzIChDeWd3aW4pCndpbjY0CQkJV2luNjQgdmVyc2lvbiBvZiBWaW0gKE1TLVdpbmRvd3MgNjQgYml0KS4Kd2luOTUJCQlXaW4zMiB2ZXJzaW9uIGZvciBNUy1XaW5kb3dzIDk1Lzk4L01FLgp3aW5hbHRrZXlzCQlDb21waWxlZCB3aXRoICd3aW5hbHRrZXlzJyBvcHRpb24uCndpbmRvd3MJCQlDb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIG1vcmUgdGhhbiBvbmUgd2luZG93Lgp3cml0ZWJhY2t1cAkJQ29tcGlsZWQgd2l0aCAnd3JpdGViYWNrdXAnIGRlZmF1bHQgb24uCnhmb250c2V0CQlDb21waWxlZCB3aXRoIFggZm9udHNldCBzdXBwb3J0IHx4Zm9udHNldHwuCnhpbQkJCUNvbXBpbGVkIHdpdGggWCBpbnB1dCBtZXRob2Qgc3VwcG9ydCB8eGltfC4KeHBtCQkJQ29tcGlsZWQgd2l0aCBwaXhtYXAgc3VwcG9ydC4KeHBtX3czMgkJCUNvbXBpbGVkIHdpdGggcGl4bWFwIHN1cHBvcnQgZm9yIFdpbjMyLiAoT25seSBmb3IKCQkJYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlICJ4cG0iIGluc3RlYWQuKQp4c21wCQkJQ29tcGlsZWQgd2l0aCBYIHNlc3Npb24gbWFuYWdlbWVudCBzdXBwb3J0Lgp4c21wX2ludGVyYWN0CQlDb21waWxlZCB3aXRoIGludGVyYWN0aXZlIFggc2Vzc2lvbiBtYW5hZ2VtZW50IHN1cHBvcnQuCnh0ZXJtX2NsaXBib2FyZAkJQ29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciB4dGVybSBjbGlwYm9hcmQuCnh0ZXJtX3NhdmUJCUNvbXBpbGVkIHdpdGggc3VwcG9ydCBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlCgkJCXh0ZXJtIHNjcmVlbi4KeDExCQkJQ29tcGlsZWQgd2l0aCBYMTEgc3VwcG9ydC4KCgkJCQkJCQkqc3RyaW5nLW1hdGNoKgpNYXRjaGluZyBhIHBhdHRlcm4gaW4gYSBTdHJpbmcKCkEgcmVnZXhwIHBhdHRlcm4gYXMgZXhwbGFpbmVkIGF0IHxwYXR0ZXJufCBpcyBub3JtYWxseSB1c2VkIHRvIGZpbmQgYSBtYXRjaCBpbgp0aGUgYnVmZmVyIGxpbmVzLiAgV2hlbiBhIHBhdHRlcm4gaXMgdXNlZCB0byBmaW5kIGEgbWF0Y2ggaW4gYSBTdHJpbmcsIGFsbW9zdApldmVyeXRoaW5nIHdvcmtzIGluIHRoZSBzYW1lIHdheS4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgYSBTdHJpbmcgaXMgaGFuZGxlZApsaWtlIGl0IGlzIG9uZSBsaW5lLiAgV2hlbiBpdCBjb250YWlucyBhICJcbiIgY2hhcmFjdGVyLCB0aGlzIGlzIG5vdCBzZWVuIGFzIGEKbGluZSBicmVhayBmb3IgdGhlIHBhdHRlcm4uICBJdCBjYW4gYmUgbWF0Y2hlZCB3aXRoIGEgIlxuIiBpbiB0aGUgcGF0dGVybiwgb3IKd2l0aCAiLiIuICBFeGFtcGxlOiA+Cgk6bGV0IGEgPSAiYWFhYVxueHh4eCIKCTplY2hvIG1hdGNoc3RyKGEsICIuLlxuLi4iKQoJYWEKCXh4Cgk6ZWNobyBtYXRjaHN0cihhLCAiYS54IikKCWEKCXgKCkRvbid0IGZvcmdldCB0aGF0ICJeIiB3aWxsIG9ubHkgbWF0Y2ggYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgU3RyaW5nIGFuZAoiJCIgYXQgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcuICBUaGV5IGRvbid0IG1hdGNoIGFmdGVyIG9yIGJlZm9yZSBhCiJcbiIuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gRGVmaW5pbmcgZnVuY3Rpb25zCQkJCQkqdXNlci1mdW5jdGlvbnMqCgpOZXcgZnVuY3Rpb25zIGNhbiBiZSBkZWZpbmVkLiAgVGhlc2UgY2FuIGJlIGNhbGxlZCBqdXN0IGxpa2UgYnVpbHRpbgpmdW5jdGlvbnMuICBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgYSBzZXF1ZW5jZSBvZiBFeCBjb21tYW5kcy4gIE5vcm1hbCBtb2RlCmNvbW1hbmRzIGNhbiBiZSBleGVjdXRlZCB3aXRoIHRoZSB8Om5vcm1hbHwgY29tbWFuZC4KClRoZSBmdW5jdGlvbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCB0byBhdm9pZCBjb25mdXNpb24gd2l0aApidWlsdGluIGZ1bmN0aW9ucy4gIFRvIHByZXZlbnQgZnJvbSB1c2luZyB0aGUgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBzY3JpcHRzCmF2b2lkIG9idmlvdXMsIHNob3J0IG5hbWVzLiAgQSBnb29kIGhhYml0IGlzIHRvIHN0YXJ0IHRoZSBmdW5jdGlvbiBuYW1lIHdpdGgKdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCwgZS5nLiwgIkhUTUxjb2xvcigpIi4KCkl0J3MgYWxzbyBwb3NzaWJsZSB0byB1c2UgY3VybHkgYnJhY2VzLCBzZWUgfGN1cmx5LWJyYWNlcy1uYW1lc3wuICBBbmQgdGhlCnxhdXRvbG9hZHwgZmFjaWxpdHkgaXMgdXNlZnVsIHRvIGRlZmluZSBhIGZ1bmN0aW9uIG9ubHkgd2hlbiBpdCdzIGNhbGxlZC4KCgkJCQkJCQkqbG9jYWwtZnVuY3Rpb24qCkEgZnVuY3Rpb24gbG9jYWwgdG8gYSBzY3JpcHQgbXVzdCBzdGFydCB3aXRoICJzOiIuICBBIGxvY2FsIHNjcmlwdCBmdW5jdGlvbgpjYW4gb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIHNjcmlwdCBhbmQgZnJvbSBmdW5jdGlvbnMsIHVzZXIgY29tbWFuZHMKYW5kIGF1dG9jb21tYW5kcyBkZWZpbmVkIGluIHRoZSBzY3JpcHQuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNhbGwgdGhlCmZ1bmN0aW9uIGZyb20gYSBtYXBwaW5nIGRlZmluZWQgaW4gdGhlIHNjcmlwdCwgYnV0IHRoZW4gfDxTSUQ+fCBtdXN0IGJlIHVzZWQKaW5zdGVhZCBvZiAiczoiIHdoZW4gdGhlIG1hcHBpbmcgaXMgZXhwYW5kZWQgb3V0c2lkZSBvZiB0aGUgc2NyaXB0LgpUaGVyZSBhcmUgb25seSBzY3JpcHQtbG9jYWwgZnVuY3Rpb25zLCBubyBidWZmZXItbG9jYWwgb3Igd2luZG93LWxvY2FsCmZ1bmN0aW9ucy4KCgkJCQkJKjpmdSogKjpmdW5jdGlvbiogKkUxMjgqICpFMTI5KiAqRTEyMyoKOmZ1W25jdGlvbl0JCUxpc3QgYWxsIGZ1bmN0aW9ucyBhbmQgdGhlaXIgYXJndW1lbnRzLgoKOmZ1W25jdGlvbl0ge25hbWV9CUxpc3QgZnVuY3Rpb24ge25hbWV9LgoJCQl7bmFtZX0gY2FuIGFsc28gYmUgYSB8RGljdGlvbmFyeXwgZW50cnkgdGhhdCBpcyBhCgkJCXxGdW5jcmVmfDogPgoJCQkJOmZ1bmN0aW9uIGRpY3QuaW5pdAoKOmZ1W25jdGlvbl0gL3twYXR0ZXJufQlMaXN0IGZ1bmN0aW9ucyB3aXRoIGEgbmFtZSBtYXRjaGluZyB7cGF0dGVybn0uCgkJCUV4YW1wbGUgdGhhdCBsaXN0cyBhbGwgZnVuY3Rpb25zIGVuZGluZyB3aXRoICJGaWxlIjogPgoJCQkJOmZ1bmN0aW9uIC9GaWxlJAo8CgkJCQkJCQkqOmZ1bmN0aW9uLXZlcmJvc2UqCldoZW4gJ3ZlcmJvc2UnIGlzIG5vbi16ZXJvLCBsaXN0aW5nIGEgZnVuY3Rpb24gd2lsbCBhbHNvIGRpc3BsYXkgd2hlcmUgaXQgd2FzCmxhc3QgZGVmaW5lZC4gRXhhbXBsZTogPgoKICAgIDp2ZXJib3NlIGZ1bmN0aW9uIFNldEZpbGVUeXBlU0gKCWZ1bmN0aW9uIFNldEZpbGVUeXBlU0gobmFtZSkKCSAgICBMYXN0IHNldCBmcm9tIC91c3Ivc2hhcmUvdmltL3ZpbS03LjAvZmlsZXR5cGUudmltCjwKU2VlIHw6dmVyYm9zZS1jbWR8IGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCQkJCQkJKkUxMjQqICpFMTI1KiAqRTg1MyogKkU4ODQqCjpmdVtuY3Rpb25dWyFdIHtuYW1lfShbYXJndW1lbnRzXSkgW3JhbmdlXSBbYWJvcnRdIFtkaWN0XQoJCQlEZWZpbmUgYSBuZXcgZnVuY3Rpb24gYnkgdGhlIG5hbWUge25hbWV9LiAgVGhlIG5hbWUKCQkJbXVzdCBiZSBtYWRlIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCAnXycsIGFuZAoJCQltdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsIG9yICJzOiIgKHNlZSBhYm92ZSkuICBOb3RlCgkJCXRoYXQgdXNpbmcgImI6IiBvciAiZzoiIGlzIG5vdCBhbGxvd2VkLiAoc2luY2UgcGF0Y2gKCQkJNy40LjI2MCBFODg0IGlzIGdpdmVuIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBhIGNvbG9uCgkJCWluIHRoZSBuYW1lLCBlLmcuIGZvciAiZm9vOmJhcigpIi4gIEJlZm9yZSB0aGF0IHBhdGNoCgkJCW5vIGVycm9yIHdhcyBnaXZlbikuCgoJCQl7bmFtZX0gY2FuIGFsc28gYmUgYSB8RGljdGlvbmFyeXwgZW50cnkgdGhhdCBpcyBhCgkJCXxGdW5jcmVmfDogPgoJCQkJOmZ1bmN0aW9uIGRpY3QuaW5pdChhcmcpCjwJCQkiZGljdCIgbXVzdCBiZSBhbiBleGlzdGluZyBkaWN0aW9uYXJ5LglUaGUgZW50cnkKCQkJImluaXQiIGlzIGFkZGVkIGlmIGl0IGRpZG4ndCBleGlzdCB5ZXQuICBPdGhlcndpc2UgWyFdCgkJCWlzIHJlcXVpcmVkIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmdW5jdGlvbi4JVGhlCgkJCXJlc3VsdCBpcyBhIHxGdW5jcmVmfCB0byBhIG51bWJlcmVkIGZ1bmN0aW9uLiAgVGhlCgkJCWZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIHxGdW5jcmVmfCBhbmQgd2lsbCBiZQoJCQlkZWxldGVkIGlmIHRoZXJlIGFyZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gaXQuCgkJCQkJCQkJKkUxMjcqICpFMTIyKgoJCQlXaGVuIGEgZnVuY3Rpb24gYnkgdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIGFuZCBbIV0gaXMKCQkJbm90IHVzZWQgYW4gZXJyb3IgbWVzc2FnZSBpcyBnaXZlbi4gIFdoZW4gWyFdIGlzIHVzZWQsCgkJCWFuIGV4aXN0aW5nIGZ1bmN0aW9uIGlzIHNpbGVudGx5IHJlcGxhY2VkLiAgVW5sZXNzIGl0CgkJCWlzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZCwgdGhhdCBpcyBhbiBlcnJvci4KCgkJCUZvciB0aGUge2FyZ3VtZW50c30gc2VlIHxmdW5jdGlvbi1hcmd1bWVudHwuCgoJCQkJCSo6ZnVuYy1yYW5nZSogKmE6Zmlyc3RsaW5lKiAqYTpsYXN0bGluZSoKCQkJV2hlbiB0aGUgW3JhbmdlXSBhcmd1bWVudCBpcyBhZGRlZCwgdGhlIGZ1bmN0aW9uIGlzCgkJCWV4cGVjdGVkIHRvIHRha2UgY2FyZSBvZiBhIHJhbmdlIGl0c2VsZi4gIFRoZSByYW5nZSBpcwoJCQlwYXNzZWQgYXMgImE6Zmlyc3RsaW5lIiBhbmQgImE6bGFzdGxpbmUiLiAgSWYgW3JhbmdlXQoJCQlpcyBleGNsdWRlZCwgIjp7cmFuZ2V9Y2FsbCIgd2lsbCBjYWxsIHRoZSBmdW5jdGlvbiBmb3IKCQkJZWFjaCBsaW5lIGluIHRoZSByYW5nZSwgd2l0aCB0aGUgY3Vyc29yIG9uIHRoZSBzdGFydAoJCQlvZiBlYWNoIGxpbmUuICBTZWUgfGZ1bmN0aW9uLXJhbmdlLWV4YW1wbGV8LgoJCQlUaGUgY3Vyc29yIGlzIHN0aWxsIG1vdmVkIHRvIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQoJCQlyYW5nZSwgYXMgaXMgdGhlIGNhc2Ugd2l0aCBhbGwgRXggY29tbWFuZHMuCgkJCQkJCQkJKjpmdW5jLWFib3J0KgoJCQlXaGVuIHRoZSBbYWJvcnRdIGFyZ3VtZW50IGlzIGFkZGVkLCB0aGUgZnVuY3Rpb24gd2lsbAoJCQlhYm9ydCBhcyBzb29uIGFzIGFuIGVycm9yIGlzIGRldGVjdGVkLgoJCQkJCQkJCSo6ZnVuYy1kaWN0KgoJCQlXaGVuIHRoZSBbZGljdF0gYXJndW1lbnQgaXMgYWRkZWQsIHRoZSBmdW5jdGlvbiBtdXN0CgkJCWJlIGludm9rZWQgdGhyb3VnaCBhbiBlbnRyeSBpbiBhIHxEaWN0aW9uYXJ5fC4JVGhlCgkJCWxvY2FsIHZhcmlhYmxlICJzZWxmIiB3aWxsIHRoZW4gYmUgc2V0IHRvIHRoZQoJCQlkaWN0aW9uYXJ5LiAgU2VlIHxEaWN0aW9uYXJ5LWZ1bmN0aW9ufC4KCgkJCQkJCSpmdW5jdGlvbi1zZWFyY2gtdW5kbyoKCQkJVGhlIGxhc3QgdXNlZCBzZWFyY2ggcGF0dGVybiBhbmQgdGhlIHJlZG8gY29tbWFuZCAiLiIKCQkJd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgZnVuY3Rpb24uICBUaGlzIGFsc28KCQkJaW1wbGllcyB0aGF0IHRoZSBlZmZlY3Qgb2YgfDpub2hsc2VhcmNofCBpcyB1bmRvbmUKCQkJd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucy4KCgkJCQkJKjplbmRmKiAqOmVuZGZ1bmN0aW9uKiAqRTEyNiogKkUxOTMqCjplbmRmW3VuY3Rpb25dCQlUaGUgZW5kIG9mIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIE11c3QgYmUgb24gYSBsaW5lCgkJCWJ5IGl0cyBvd24sIHdpdGhvdXQgb3RoZXIgY29tbWFuZHMuCgoJCQkJCSo6ZGVsZiogKjpkZWxmdW5jdGlvbiogKkUxMzAqICpFMTMxKgo6ZGVsZlt1bmN0aW9uXSB7bmFtZX0JRGVsZXRlIGZ1bmN0aW9uIHtuYW1lfS4KCQkJe25hbWV9IGNhbiBhbHNvIGJlIGEgfERpY3Rpb25hcnl8IGVudHJ5IHRoYXQgaXMgYQoJCQl8RnVuY3JlZnw6ID4KCQkJCTpkZWxmdW5jIGRpY3QuaW5pdAo8CQkJVGhpcyB3aWxsIHJlbW92ZSB0aGUgImluaXQiIGVudHJ5IGZyb20gImRpY3QiLglUaGUKCQkJZnVuY3Rpb24gaXMgZGVsZXRlZCBpZiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVuY2VzIHRvCgkJCWl0LgoJCQkJCQkJKjpyZXR1KiAqOnJldHVybiogKkUxMzMqCjpyZXR1W3JuXSBbZXhwcl0JUmV0dXJuIGZyb20gYSBmdW5jdGlvbi4gIFdoZW4gIltleHByXSIgaXMgZ2l2ZW4sIGl0IGlzCgkJCWV2YWx1YXRlZCBhbmQgcmV0dXJuZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uCgkJCUlmICJbZXhwcl0iIGlzIG5vdCBnaXZlbiwgdGhlIG51bWJlciAwIGlzIHJldHVybmVkLgoJCQlXaGVuIGEgZnVuY3Rpb24gZW5kcyB3aXRob3V0IGFuIGV4cGxpY2l0ICI6cmV0dXJuIiwKCQkJdGhlIG51bWJlciAwIGlzIHJldHVybmVkLgoJCQlOb3RlIHRoYXQgdGhlcmUgaXMgbm8gY2hlY2sgZm9yIHVucmVhY2hhYmxlIGxpbmVzLAoJCQl0aHVzIHRoZXJlIGlzIG5vIHdhcm5pbmcgaWYgY29tbWFuZHMgZm9sbG93ICI6cmV0dXJuIi4KCgkJCUlmIHRoZSAiOnJldHVybiIgaXMgdXNlZCBhZnRlciBhIHw6dHJ5fCBidXQgYmVmb3JlIHRoZQoJCQltYXRjaGluZyB8OmZpbmFsbHl8IChpZiBwcmVzZW50KSwgdGhlIGNvbW1hbmRzCgkJCWZvbGxvd2luZyB0aGUgIjpmaW5hbGx5IiB1cCB0byB0aGUgbWF0Y2hpbmcgfDplbmR0cnl8CgkJCWFyZSBleGVjdXRlZCBmaXJzdC4gIFRoaXMgcHJvY2VzcyBhcHBsaWVzIHRvIGFsbAoJCQluZXN0ZWQgIjp0cnkicyBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAgVGhlIGZ1bmN0aW9uCgkJCXJldHVybnMgYXQgdGhlIG91dGVybW9zdCAiOmVuZHRyeSIuCgoJCQkJCQkqZnVuY3Rpb24tYXJndW1lbnQqICphOnZhcioKQW4gYXJndW1lbnQgY2FuIGJlIGRlZmluZWQgYnkgZ2l2aW5nIGl0cyBuYW1lLglJbiB0aGUgZnVuY3Rpb24gdGhpcyBjYW4gdGhlbgpiZSB1c2VkIGFzICJhOm5hbWUiICgiYToiIGZvciBhcmd1bWVudCkuCgkJCQkJKmE6MCogKmE6MSogKmE6MDAwKiAqRTc0MCogKi4uLioKVXAgdG8gMjAgYXJndW1lbnRzIGNhbiBiZSBnaXZlbiwgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEFmdGVyIHRoZSBuYW1lZAphcmd1bWVudHMgYW4gYXJndW1lbnQgIi4uLiIgY2FuIGJlIHNwZWNpZmllZCwgd2hpY2ggbWVhbnMgdGhhdCBtb3JlIGFyZ3VtZW50cwptYXkgb3B0aW9uYWxseSBiZSBmb2xsb3dpbmcuICBJbiB0aGUgZnVuY3Rpb24gdGhlIGV4dHJhIGFyZ3VtZW50cyBjYW4gYmUgdXNlZAphcyAiYToxIiwgImE6MiIsIGV0Yy4gICJhOjAiIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGV4dHJhIGFyZ3VtZW50cyAod2hpY2gKY2FuIGJlIDApLiAgImE6MDAwIiBpcyBzZXQgdG8gYSB8TGlzdHwgdGhhdCBjb250YWlucyB0aGVzZSBhcmd1bWVudHMuICBOb3RlCnRoYXQgImE6MSIgaXMgdGhlIHNhbWUgYXMgImE6MDAwWzBdIi4KCQkJCQkJCQkqRTc0MioKVGhlIGE6IHNjb3BlIGFuZCB0aGUgdmFyaWFibGVzIGluIGl0IGNhbm5vdCBiZSBjaGFuZ2VkLCB0aGV5IGFyZSBmaXhlZC4KSG93ZXZlciwgaWYgYSB8TGlzdHwgb3IgfERpY3Rpb25hcnl8IGlzIHVzZWQsIHlvdSBjYW4gY2hhbmdlIHRoZWlyIGNvbnRlbnRzLgpUaHVzIHlvdSBjYW4gcGFzcyBhIHxMaXN0fCB0byBhIGZ1bmN0aW9uIGFuZCBoYXZlIHRoZSBmdW5jdGlvbiBhZGQgYW4gaXRlbSB0bwppdC4gIElmIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gY2Fubm90IGNoYW5nZSBhIHxMaXN0fCBvcgp8RGljdGlvbmFyeXwgdXNlIHw6bG9ja3ZhcnwuCgpXaGVuIG5vdCB1c2luZyAiLi4uIiwgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIG11c3QgYmUgZXF1YWwKdG8gdGhlIG51bWJlciBvZiBuYW1lZCBhcmd1bWVudHMuICBXaGVuIHVzaW5nICIuLi4iLCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cwptYXkgYmUgbGFyZ2VyLgoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkZWZpbmUgYSBmdW5jdGlvbiB3aXRob3V0IGFueSBhcmd1bWVudHMuICBZb3UgbXVzdApzdGlsbCBzdXBwbHkgdGhlICgpIHRoZW4uICBUaGUgYm9keSBvZiB0aGUgZnVuY3Rpb24gZm9sbG93cyBpbiB0aGUgbmV4dCBsaW5lcywKdW50aWwgdGhlIG1hdGNoaW5nIHw6ZW5kZnVuY3Rpb258LiAgSXQgaXMgYWxsb3dlZCB0byBkZWZpbmUgYW5vdGhlciBmdW5jdGlvbgppbnNpZGUgYSBmdW5jdGlvbiBib2R5LgoKCQkJCQkJCSpsb2NhbC12YXJpYWJsZXMqCkluc2lkZSBhIGZ1bmN0aW9uIHZhcmlhYmxlcyBjYW4gYmUgdXNlZC4gIFRoZXNlIGFyZSBsb2NhbCB2YXJpYWJsZXMsIHdoaWNoCndpbGwgZGlzYXBwZWFyIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuICBHbG9iYWwgdmFyaWFibGVzIG5lZWQgdG8gYmUKYWNjZXNzZWQgd2l0aCAiZzoiLgoKRXhhbXBsZTogPgogIDpmdW5jdGlvbiBUYWJsZSh0aXRsZSwgLi4uKQogIDogIGVjaG9obCBUaXRsZQogIDogIGVjaG8gYTp0aXRsZQogIDogIGVjaG9obCBOb25lCiAgOiAgZWNobyBhOjAgLiAiIGl0ZW1zOiIKICA6ICBmb3IgcyBpbiBhOjAwMAogIDogICAgZWNob24gJyAnIC4gcwogIDogIGVuZGZvcgogIDplbmRmdW5jdGlvbgoKVGhpcyBmdW5jdGlvbiBjYW4gdGhlbiBiZSBjYWxsZWQgd2l0aDogPgogIGNhbGwgVGFibGUoIlRhYmxlIiwgImxpbmUxIiwgImxpbmUyIikKICBjYWxsIFRhYmxlKCJFbXB0eSBUYWJsZSIpCgpUbyByZXR1cm4gbW9yZSB0aGFuIG9uZSB2YWx1ZSwgcmV0dXJuIGEgfExpc3R8OiA+CiAgOmZ1bmN0aW9uIENvbXB1dGUobjEsIG4yKQogIDogIGlmIGE6bjIgPT0gMAogIDogICAgcmV0dXJuIFsiZmFpbCIsIDBdCiAgOiAgZW5kaWYKICA6ICByZXR1cm4gWyJvayIsIGE6bjEgLyBhOm4yXQogIDplbmRmdW5jdGlvbgoKVGhpcyBmdW5jdGlvbiBjYW4gdGhlbiBiZSBjYWxsZWQgd2l0aDogPgogIDpsZXQgW3N1Y2Nlc3MsIGRpdl0gPSBDb21wdXRlKDEwMiwgNikKICA6aWYgc3VjY2VzcyA9PSAib2siCiAgOiAgZWNobyBkaXYKICA6ZW5kaWYKPAoJCQkJCQkqOmNhbCogKjpjYWxsKiAqRTEwNyogKkUxMTcqCjpbcmFuZ2VdY2FsW2xdIHtuYW1lfShbYXJndW1lbnRzXSkKCQlDYWxsIGEgZnVuY3Rpb24uICBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYW5kIGl0cyBhcmd1bWVudHMKCQlhcmUgYXMgc3BlY2lmaWVkIHdpdGggfDpmdW5jdGlvbnwuICBVcCB0byAyMCBhcmd1bWVudHMgY2FuIGJlCgkJdXNlZC4gIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBkaXNjYXJkZWQuCgkJV2l0aG91dCBhIHJhbmdlIGFuZCBmb3IgZnVuY3Rpb25zIHRoYXQgYWNjZXB0IGEgcmFuZ2UsIHRoZQoJCWZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLiAgV2hlbiBhIHJhbmdlIGlzIGdpdmVuIHRoZSBjdXJzb3IgaXMKCQlwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgbGluZSBiZWZvcmUgZXhlY3V0aW5nIHRoZQoJCWZ1bmN0aW9uLgoJCVdoZW4gYSByYW5nZSBpcyBnaXZlbiBhbmQgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgaGFuZGxlIGl0CgkJaXRzZWxmLCB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZm9yIGVhY2ggbGluZSBpbiB0aGUgcmFuZ2UsCgkJd2l0aCB0aGUgY3Vyc29yIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhhdCBsaW5lLiAgVGhlIGN1cnNvcgoJCWlzIGxlZnQgYXQgdGhlIGxhc3QgbGluZSAocG9zc2libHkgbW92ZWQgYnkgdGhlIGxhc3QgZnVuY3Rpb24KCQljYWxsKS4JVGhlIGFyZ3VtZW50cyBhcmUgcmUtZXZhbHVhdGVkIGZvciBlYWNoIGxpbmUuICBUaHVzCgkJdGhpcyB3b3JrczoKCQkJCQkJKmZ1bmN0aW9uLXJhbmdlLWV4YW1wbGUqICA+Cgk6ZnVuY3Rpb24gTXludW1iZXIoYXJnKQoJOiAgZWNobyBsaW5lKCIuIikgLiAiICIgLiBhOmFyZwoJOmVuZGZ1bmN0aW9uCgk6MSw1Y2FsbCBNeW51bWJlcihnZXRsaW5lKCIuIikpCjwKCQlUaGUgImE6Zmlyc3RsaW5lIiBhbmQgImE6bGFzdGxpbmUiIGFyZSBkZWZpbmVkIGFueXdheSwgdGhleQoJCWNhbiBiZSB1c2VkIHRvIGRvIHNvbWV0aGluZyBkaWZmZXJlbnQgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZgoJCXRoZSByYW5nZS4KCgkJRXhhbXBsZSBvZiBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgcmFuZ2UgaXRzZWxmOiA+CgoJOmZ1bmN0aW9uIENvbnQoKSByYW5nZQoJOiAgZXhlY3V0ZSAoYTpmaXJzdGxpbmUgKyAxKSAuICIsIiAuIGE6bGFzdGxpbmUgLiAncy9eL1x0XFwgJwoJOmVuZGZ1bmN0aW9uCgk6NCw4Y2FsbCBDb250KCkKPAoJCVRoaXMgZnVuY3Rpb24gaW5zZXJ0cyB0aGUgY29udGludWF0aW9uIGNoYXJhY3RlciAiXCIgaW4gZnJvbnQKCQlvZiBhbGwgdGhlIGxpbmVzIGluIHRoZSByYW5nZSwgZXhjZXB0IHRoZSBmaXJzdCBvbmUuCgoJCVdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBjb21wb3NpdGUgdmFsdWUgaXQgY2FuIGJlIGZ1cnRoZXIKCQlkZXJlZmVyZW5jZWQsIGJ1dCB0aGUgcmFuZ2Ugd2lsbCBub3QgYmUgdXNlZCB0aGVuLiAgRXhhbXBsZTogPgoJOjQsOGNhbGwgR2V0RGljdCgpLm1ldGhvZCgpCjwJCUhlcmUgR2V0RGljdCgpIGdldHMgdGhlIHJhbmdlIGJ1dCBtZXRob2QoKSBkb2VzIG5vdC4KCgkJCQkJCQkJKkUxMzIqClRoZSByZWN1cnNpdmVuZXNzIG9mIHVzZXIgZnVuY3Rpb25zIGlzIHJlc3RyaWN0ZWQgd2l0aCB0aGUgfCdtYXhmdW5jZGVwdGgnfApvcHRpb24uCgoKQVVUT01BVElDQUxMWSBMT0FESU5HIEZVTkNUSU9OUyB+CgkJCQkJCQkqYXV0b2xvYWQtZnVuY3Rpb25zKgpXaGVuIHVzaW5nIG1hbnkgb3IgbGFyZ2UgZnVuY3Rpb25zLCBpdCdzIHBvc3NpYmxlIHRvIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZW0Kb25seSB3aGVuIHRoZXkgYXJlIHVzZWQuICBUaGVyZSBhcmUgdHdvIG1ldGhvZHM6IHdpdGggYW4gYXV0b2NvbW1hbmQgYW5kIHdpdGgKdGhlICJhdXRvbG9hZCIgZGlyZWN0b3J5IGluICdydW50aW1lcGF0aCcuCgoKVXNpbmcgYW4gYXV0b2NvbW1hbmQgfgoKVGhpcyBpcyBpbnRyb2R1Y2VkIGluIHRoZSB1c2VyIG1hbnVhbCwgc2VjdGlvbiB8NDEuMTR8LgoKVGhlIGF1dG9jb21tYW5kIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHBsdWdpbiB0aGF0IGlzIGEgbG9uZyBWaW0gc2NyaXB0IGZpbGUuCllvdSBjYW4gZGVmaW5lIHRoZSBhdXRvY29tbWFuZCBhbmQgcXVpY2tseSBxdWl0IHRoZSBzY3JpcHQgd2l0aCB8OmZpbmlzaHwuClRoYXQgbWFrZXMgVmltIHN0YXJ0dXAgZmFzdGVyLglUaGUgYXV0b2NvbW1hbmQgc2hvdWxkIHRoZW4gbG9hZCB0aGUgc2FtZSBmaWxlCmFnYWluLCBzZXR0aW5nIGEgdmFyaWFibGUgdG8gc2tpcCB0aGUgfDpmaW5pc2h8IGNvbW1hbmQuCgpVc2UgdGhlIEZ1bmNVbmRlZmluZWQgYXV0b2NvbW1hbmQgZXZlbnQgd2l0aCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZQpmdW5jdGlvbihzKSB0byBiZSBkZWZpbmVkLiAgRXhhbXBsZTogPgoKCTphdSBGdW5jVW5kZWZpbmVkIEJ1Zk5ldCogc291cmNlIH4vdmltL2J1Zm5ldGZ1bmNzLnZpbQoKVGhlIGZpbGUgIn4vdmltL2J1Zm5ldGZ1bmNzLnZpbSIgc2hvdWxkIHRoZW4gZGVmaW5lIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0IHdpdGgKIkJ1Zk5ldCIuICBBbHNvIHNlZSB8RnVuY1VuZGVmaW5lZHwuCgoKVXNpbmcgYW4gYXV0b2xvYWQgc2NyaXB0IH4KCQkJCQkJCSphdXRvbG9hZCogKkU3NDYqClRoaXMgaXMgaW50cm9kdWNlZCBpbiB0aGUgdXNlciBtYW51YWwsIHNlY3Rpb24gfDQxLjE1fC4KClVzaW5nIGEgc2NyaXB0IGluIHRoZSAiYXV0b2xvYWQiIGRpcmVjdG9yeSBpcyBzaW1wbGVyLCBidXQgcmVxdWlyZXMgdXNpbmcKZXhhY3RseSB0aGUgcmlnaHQgZmlsZSBuYW1lLiAgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhdXRvbG9hZGVkIGhhcyBhIG5hbWUKbGlrZSB0aGlzOiA+CgoJOmNhbGwgZmlsZW5hbWUjZnVuY25hbWUoKQoKV2hlbiBzdWNoIGEgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgaXQgaXMgbm90IGRlZmluZWQgeWV0LCBWaW0gd2lsbCBzZWFyY2ggdGhlCiJhdXRvbG9hZCIgZGlyZWN0b3JpZXMgaW4gJ3J1bnRpbWVwYXRoJyBmb3IgYSBzY3JpcHQgZmlsZSBjYWxsZWQKImZpbGVuYW1lLnZpbSIuICBGb3IgZXhhbXBsZSAifi8udmltL2F1dG9sb2FkL2ZpbGVuYW1lLnZpbSIuICBUaGF0IGZpbGUgc2hvdWxkCnRoZW4gZGVmaW5lIHRoZSBmdW5jdGlvbiBsaWtlIHRoaXM6ID4KCglmdW5jdGlvbiBmaWxlbmFtZSNmdW5jbmFtZSgpCgkgICBlY2hvICJEb25lISIKCWVuZGZ1bmN0aW9uCgpUaGUgZmlsZSBuYW1lIGFuZCB0aGUgbmFtZSB1c2VkIGJlZm9yZSB0aGUgIyBpbiB0aGUgZnVuY3Rpb24gbXVzdCBtYXRjaApleGFjdGx5LCBhbmQgdGhlIGRlZmluZWQgZnVuY3Rpb24gbXVzdCBoYXZlIHRoZSBuYW1lIGV4YWN0bHkgYXMgaXQgd2lsbCBiZQpjYWxsZWQuCgpJdCBpcyBwb3NzaWJsZSB0byB1c2Ugc3ViZGlyZWN0b3JpZXMuICBFdmVyeSAjIGluIHRoZSBmdW5jdGlvbiBuYW1lIHdvcmtzIGxpa2UKYSBwYXRoIHNlcGFyYXRvci4gIFRodXMgd2hlbiBjYWxsaW5nIGEgZnVuY3Rpb246ID4KCgk6Y2FsbCBmb28jYmFyI2Z1bmMoKQoKVmltIHdpbGwgbG9vayBmb3IgdGhlIGZpbGUgImF1dG9sb2FkL2Zvby9iYXIudmltIiBpbiAncnVudGltZXBhdGgnLgoKVGhpcyBhbHNvIHdvcmtzIHdoZW4gcmVhZGluZyBhIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIHNldCB5ZXQ6ID4KCgk6bGV0IGwgPSBmb28jYmFyI2x2YXIKCkhvd2V2ZXIsIHdoZW4gdGhlIGF1dG9sb2FkIHNjcmlwdCB3YXMgYWxyZWFkeSBsb2FkZWQgaXQgd29uJ3QgYmUgbG9hZGVkIGFnYWluCmZvciBhbiB1bmtub3duIHZhcmlhYmxlLgoKV2hlbiBhc3NpZ25pbmcgYSB2YWx1ZSB0byBzdWNoIGEgdmFyaWFibGUgbm90aGluZyBzcGVjaWFsIGhhcHBlbnMuICBUaGlzIGNhbgpiZSB1c2VkIHRvIHBhc3Mgc2V0dGluZ3MgdG8gdGhlIGF1dG9sb2FkIHNjcmlwdCBiZWZvcmUgaXQncyBsb2FkZWQ6ID4KCgk6bGV0IGZvbyNiYXIjdG9nZ2xlID0gMQoJOmNhbGwgZm9vI2JhciNmdW5jKCkKCk5vdGUgdGhhdCB3aGVuIHlvdSBtYWtlIGEgbWlzdGFrZSBhbmQgY2FsbCBhIGZ1bmN0aW9uIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUKZGVmaW5lZCBpbiBhbiBhdXRvbG9hZCBzY3JpcHQsIGJ1dCB0aGUgc2NyaXB0IGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHRoZQpmdW5jdGlvbiwgdGhlIHNjcmlwdCB3aWxsIGJlIHNvdXJjZWQgZXZlcnkgdGltZSB5b3UgdHJ5IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLgpBbmQgeW91IHdpbGwgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgZXZlcnkgdGltZS4KCkFsc28gbm90ZSB0aGF0IGlmIHlvdSBoYXZlIHR3byBzY3JpcHQgZmlsZXMsIGFuZCBvbmUgY2FsbHMgYSBmdW5jdGlvbiBpbiB0aGUKb3RoZXIgYW5kIHZpY2UgdmVyc2EsIGJlZm9yZSB0aGUgdXNlZCBmdW5jdGlvbiBpcyBkZWZpbmVkLCBpdCB3b24ndCB3b3JrLgpBdm9pZCB1c2luZyB0aGUgYXV0b2xvYWQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgdG9wbGV2ZWwuCgpIaW50OiBJZiB5b3UgZGlzdHJpYnV0ZSBhIGJ1bmNoIG9mIHNjcmlwdHMgeW91IGNhbiBwYWNrIHRoZW0gdG9nZXRoZXIgd2l0aCB0aGUKfHZpbWJhbGx8IHV0aWxpdHkuICBBbHNvIHJlYWQgdGhlIHVzZXIgbWFudWFsIHxkaXN0cmlidXRlLXNjcmlwdHwuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNi4gQ3VybHkgYnJhY2VzIG5hbWVzCQkJCQkqY3VybHktYnJhY2VzLW5hbWVzKgoKSW4gbW9zdCBwbGFjZXMgd2hlcmUgeW91IGNhbiB1c2UgYSB2YXJpYWJsZSwgeW91IGNhbiB1c2UgYSAiY3VybHkgYnJhY2VzIG5hbWUiCnZhcmlhYmxlLiAgVGhpcyBpcyBhIHJlZ3VsYXIgdmFyaWFibGUgbmFtZSB3aXRoIG9uZSBvciBtb3JlIGV4cHJlc3Npb25zCndyYXBwZWQgaW4gYnJhY2VzIHt9IGxpa2UgdGhpczogPgoJbXlfe2FkamVjdGl2ZX1fdmFyaWFibGUKCldoZW4gVmltIGVuY291bnRlcnMgdGhpcywgaXQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGluc2lkZSB0aGUgYnJhY2VzLCBwdXRzCnRoYXQgaW4gcGxhY2Ugb2YgdGhlIGV4cHJlc3Npb24sIGFuZCByZS1pbnRlcnByZXRzIHRoZSB3aG9sZSBhcyBhIHZhcmlhYmxlCm5hbWUuICBTbyBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgaWYgdGhlIHZhcmlhYmxlICJhZGplY3RpdmUiIHdhcyBzZXQgdG8KIm5vaXN5IiwgdGhlbiB0aGUgcmVmZXJlbmNlIHdvdWxkIGJlIHRvICJteV9ub2lzeV92YXJpYWJsZSIsIHdoZXJlYXMgaWYKImFkamVjdGl2ZSIgd2FzIHNldCB0byAicXVpZXQiLCB0aGVuIGl0IHdvdWxkIGJlIHRvICJteV9xdWlldF92YXJpYWJsZSIuCgpPbmUgYXBwbGljYXRpb24gZm9yIHRoaXMgaXMgdG8gY3JlYXRlIGEgc2V0IG9mIHZhcmlhYmxlcyBnb3Zlcm5lZCBieSBhbiBvcHRpb24KdmFsdWUuCUZvciBleGFtcGxlLCB0aGUgc3RhdGVtZW50ID4KCWVjaG8gbXlfeyZiYWNrZ3JvdW5kfV9tZXNzYWdlCgp3b3VsZCBvdXRwdXQgdGhlIGNvbnRlbnRzIG9mICJteV9kYXJrX21lc3NhZ2UiIG9yICJteV9saWdodF9tZXNzYWdlIiBkZXBlbmRpbmcKb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgJ2JhY2tncm91bmQnLgoKWW91IGNhbiB1c2UgbXVsdGlwbGUgYnJhY2UgcGFpcnM6ID4KCWVjaG8gbXlfe2FkdmVyYn1fe2FkamVjdGl2ZX1fbWVzc2FnZQouLm9yIGV2ZW4gbmVzdCB0aGVtOiA+CgllY2hvIG15X3thZHtlbmRfb2Zfd29yZH19X21lc3NhZ2UKd2hlcmUgImVuZF9vZl93b3JkIiBpcyBlaXRoZXIgInZlcmIiIG9yICJqZWN0aXZlIi4KCkhvd2V2ZXIsIHRoZSBleHByZXNzaW9uIGluc2lkZSB0aGUgYnJhY2VzIG11c3QgZXZhbHVhdGUgdG8gYSB2YWxpZCBzaW5nbGUKdmFyaWFibGUgbmFtZSwgZS5nLiB0aGlzIGlzIGludmFsaWQ6ID4KCTpsZXQgZm9vPSdhICsgYicKCTplY2hvIGN7Zm9vfWQKLi4gc2luY2UgdGhlIHJlc3VsdCBvZiBleHBhbnNpb24gaXMgImNhICsgYmQiLCB3aGljaCBpcyBub3QgYSB2YXJpYWJsZSBuYW1lLgoKCQkJCQkJKmN1cmx5LWJyYWNlcy1mdW5jdGlvbi1uYW1lcyoKWW91IGNhbiBjYWxsIGFuZCBkZWZpbmUgZnVuY3Rpb25zIGJ5IGFuIGV2YWx1YXRlZCBuYW1lIGluIGEgc2ltaWxhciB3YXkuCkV4YW1wbGU6ID4KCTpsZXQgZnVuY19lbmQ9J3doaXp6JwoJOmNhbGwgbXlfZnVuY197ZnVuY19lbmR9KHBhcmFtZXRlcikKClRoaXMgd291bGQgY2FsbCB0aGUgZnVuY3Rpb24gIm15X2Z1bmNfd2hpenoocGFyYW1ldGVyKSIuCgpUaGlzIGRvZXMgTk9UIHdvcms6ID4KICA6bGV0IGkgPSAzCiAgOmxldCBAe2l9ID0gJycgICIgZXJyb3IKICA6ZWNobyBAe2l9ICAgICAgIiBlcnJvcgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjcuIENvbW1hbmRzCQkJCQkJKmV4cHJlc3Npb24tY29tbWFuZHMqCgo6bGV0IHt2YXItbmFtZX0gPSB7ZXhwcjF9CQkJCSo6bGV0KiAqRTE4KgoJCQlTZXQgaW50ZXJuYWwgdmFyaWFibGUge3Zhci1uYW1lfSB0byB0aGUgcmVzdWx0IG9mIHRoZQoJCQlleHByZXNzaW9uIHtleHByMX0uICBUaGUgdmFyaWFibGUgd2lsbCBnZXQgdGhlIHR5cGUKCQkJZnJvbSB0aGUge2V4cHJ9LiAgSWYge3Zhci1uYW1lfSBkaWRuJ3QgZXhpc3QgeWV0LCBpdAoJCQlpcyBjcmVhdGVkLgoKOmxldCB7dmFyLW5hbWV9W3tpZHh9XSA9IHtleHByMX0JCQkqRTY4OSoKCQkJU2V0IGEgbGlzdCBpdGVtIHRvIHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24KCQkJe2V4cHIxfS4gIHt2YXItbmFtZX0gbXVzdCByZWZlciB0byBhIGxpc3QgYW5kIHtpZHh9CgkJCW11c3QgYmUgYSB2YWxpZCBpbmRleCBpbiB0aGF0IGxpc3QuICBGb3IgbmVzdGVkIGxpc3QKCQkJdGhlIGluZGV4IGNhbiBiZSByZXBlYXRlZC4KCQkJVGhpcyBjYW5ub3QgYmUgdXNlZCB0byBhZGQgYW4gaXRlbSB0byBhIHxMaXN0fC4KCQkJVGhpcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgYSBieXRlIGluIGEgU3RyaW5nLglZb3UKCQkJY2FuIGRvIHRoYXQgbGlrZSB0aGlzOiA+CgkJCQk6bGV0IHZhciA9IHZhclswOjJdIC4gJ1gnIC4gdmFyWzQ6XQo8CgkJCQkJCQkqRTcxMSogKkU3MTkqCjpsZXQge3Zhci1uYW1lfVt7aWR4MX06e2lkeDJ9XSA9IHtleHByMX0JCSpFNzA4KiAqRTcwOSogKkU3MTAqCgkJCVNldCBhIHNlcXVlbmNlIG9mIGl0ZW1zIGluIGEgfExpc3R8IHRvIHRoZSByZXN1bHQgb2YKCQkJdGhlIGV4cHJlc3Npb24ge2V4cHIxfSwgd2hpY2ggbXVzdCBiZSBhIGxpc3Qgd2l0aCB0aGUKCQkJY29ycmVjdCBudW1iZXIgb2YgaXRlbXMuCgkJCXtpZHgxfSBjYW4gYmUgb21pdHRlZCwgemVybyBpcyB1c2VkIGluc3RlYWQuCgkJCXtpZHgyfSBjYW4gYmUgb21pdHRlZCwgbWVhbmluZyB0aGUgZW5kIG9mIHRoZSBsaXN0LgoJCQlXaGVuIHRoZSBzZWxlY3RlZCByYW5nZSBvZiBpdGVtcyBpcyBwYXJ0bHkgcGFzdCB0aGUKCQkJZW5kIG9mIHRoZSBsaXN0LCBpdGVtcyB3aWxsIGJlIGFkZGVkLgoKCQkJCQkqOmxldCs9KiAqOmxldC09KiAqOmxldC49KiAqRTczNCoKOmxldCB7dmFyfSArPSB7ZXhwcjF9CUxpa2UgIjpsZXQge3Zhcn0gPSB7dmFyfSArIHtleHByMX0iLgo6bGV0IHt2YXJ9IC09IHtleHByMX0JTGlrZSAiOmxldCB7dmFyfSA9IHt2YXJ9IC0ge2V4cHIxfSIuCjpsZXQge3Zhcn0gLj0ge2V4cHIxfQlMaWtlICI6bGV0IHt2YXJ9ID0ge3Zhcn0gLiB7ZXhwcjF9Ii4KCQkJVGhlc2UgZmFpbCBpZiB7dmFyfSB3YXMgbm90IHNldCB5ZXQgYW5kIHdoZW4gdGhlIHR5cGUKCQkJb2Yge3Zhcn0gYW5kIHtleHByMX0gZG9uJ3QgZml0IHRoZSBvcGVyYXRvci4KCgo6bGV0ICR7ZW52LW5hbWV9ID0ge2V4cHIxfQkJCSo6bGV0LWVudmlyb25tZW50KiAqOmxldC0kKgoJCQlTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUge2Vudi1uYW1lfSB0byB0aGUgcmVzdWx0IG9mCgkJCXRoZSBleHByZXNzaW9uIHtleHByMX0uICBUaGUgdHlwZSBpcyBhbHdheXMgU3RyaW5nLgo6bGV0ICR7ZW52LW5hbWV9IC49IHtleHByMX0KCQkJQXBwZW5kIHtleHByMX0gdG8gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHtlbnYtbmFtZX0uCgkJCUlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkaWRuJ3QgZXhpc3QgeWV0IHRoaXMKCQkJd29ya3MgbGlrZSAiPSIuCgo6bGV0IEB7cmVnLW5hbWV9ID0ge2V4cHIxfQkJCSo6bGV0LXJlZ2lzdGVyKiAqOmxldC1AKgoJCQlXcml0ZSB0aGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIHtleHByMX0gaW4gcmVnaXN0ZXIKCQkJe3JlZy1uYW1lfS4gIHtyZWctbmFtZX0gbXVzdCBiZSBhIHNpbmdsZSBsZXR0ZXIsIGFuZAoJCQltdXN0IGJlIHRoZSBuYW1lIG9mIGEgd3JpdGFibGUgcmVnaXN0ZXIgKHNlZQoJCQl8cmVnaXN0ZXJzfCkuICAiQEAiIGNhbiBiZSB1c2VkIGZvciB0aGUgdW5uYW1lZAoJCQlyZWdpc3RlciwgIkAvIiBmb3IgdGhlIHNlYXJjaCBwYXR0ZXJuLgoJCQlJZiB0aGUgcmVzdWx0IG9mIHtleHByMX0gZW5kcyBpbiBhIDxDUj4gb3IgPE5MPiwgdGhlCgkJCXJlZ2lzdGVyIHdpbGwgYmUgbGluZXdpc2UsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHNldCB0bwoJCQljaGFyYWN0ZXJ3aXNlLgoJCQlUaGlzIGNhbiBiZSB1c2VkIHRvIGNsZWFyIHRoZSBsYXN0IHNlYXJjaCBwYXR0ZXJuOiA+CgkJCQk6bGV0IEAvID0gIiIKPAkJCVRoaXMgaXMgZGlmZmVyZW50IGZyb20gc2VhcmNoaW5nIGZvciBhbiBlbXB0eSBzdHJpbmcsCgkJCXRoYXQgd291bGQgbWF0Y2ggZXZlcnl3aGVyZS4KCjpsZXQgQHtyZWctbmFtZX0gLj0ge2V4cHIxfQoJCQlBcHBlbmQge2V4cHIxfSB0byByZWdpc3RlciB7cmVnLW5hbWV9LglJZiB0aGUKCQkJcmVnaXN0ZXIgd2FzIGVtcHR5IGl0J3MgbGlrZSBzZXR0aW5nIGl0IHRvIHtleHByMX0uCgo6bGV0ICZ7b3B0aW9uLW5hbWV9ID0ge2V4cHIxfQkJCSo6bGV0LW9wdGlvbiogKjpsZXQtJioKCQkJU2V0IG9wdGlvbiB7b3B0aW9uLW5hbWV9IHRvIHRoZSByZXN1bHQgb2YgdGhlCgkJCWV4cHJlc3Npb24ge2V4cHIxfS4gIEEgU3RyaW5nIG9yIE51bWJlciB2YWx1ZSBpcwoJCQlhbHdheXMgY29udmVydGVkIHRvIHRoZSB0eXBlIG9mIHRoZSBvcHRpb24uCgkJCUZvciBhbiBvcHRpb24gbG9jYWwgdG8gYSB3aW5kb3cgb3IgYnVmZmVyIHRoZSBlZmZlY3QKCQkJaXMganVzdCBsaWtlIHVzaW5nIHRoZSB8OnNldHwgY29tbWFuZDogYm90aCB0aGUgbG9jYWwKCQkJdmFsdWUgYW5kIHRoZSBnbG9iYWwgdmFsdWUgYXJlIGNoYW5nZWQuCgkJCUV4YW1wbGU6ID4KCQkJCTpsZXQgJnBhdGggPSAmcGF0aCAuICcsL3Vzci9sb2NhbC9pbmNsdWRlJwoKOmxldCAme29wdGlvbi1uYW1lfSAuPSB7ZXhwcjF9CgkJCUZvciBhIHN0cmluZyBvcHRpb246IEFwcGVuZCB7ZXhwcjF9IHRvIHRoZSB2YWx1ZS4KCQkJRG9lcyBub3QgaW5zZXJ0IGEgY29tbWEgbGlrZSB8OnNldCs9fC4KCjpsZXQgJntvcHRpb24tbmFtZX0gKz0ge2V4cHIxfQo6bGV0ICZ7b3B0aW9uLW5hbWV9IC09IHtleHByMX0KCQkJRm9yIGEgbnVtYmVyIG9yIGJvb2xlYW4gb3B0aW9uOiBBZGQgb3Igc3VidHJhY3QKCQkJe2V4cHIxfS4KCjpsZXQgJmw6e29wdGlvbi1uYW1lfSA9IHtleHByMX0KOmxldCAmbDp7b3B0aW9uLW5hbWV9IC49IHtleHByMX0KOmxldCAmbDp7b3B0aW9uLW5hbWV9ICs9IHtleHByMX0KOmxldCAmbDp7b3B0aW9uLW5hbWV9IC09IHtleHByMX0KCQkJTGlrZSBhYm92ZSwgYnV0IG9ubHkgc2V0IHRoZSBsb2NhbCB2YWx1ZSBvZiBhbiBvcHRpb24KCQkJKGlmIHRoZXJlIGlzIG9uZSkuICBXb3JrcyBsaWtlIHw6c2V0bG9jYWx8LgoKOmxldCAmZzp7b3B0aW9uLW5hbWV9ID0ge2V4cHIxfQo6bGV0ICZnOntvcHRpb24tbmFtZX0gLj0ge2V4cHIxfQo6bGV0ICZnOntvcHRpb24tbmFtZX0gKz0ge2V4cHIxfQo6bGV0ICZnOntvcHRpb24tbmFtZX0gLT0ge2V4cHIxfQoJCQlMaWtlIGFib3ZlLCBidXQgb25seSBzZXQgdGhlIGdsb2JhbCB2YWx1ZSBvZiBhbiBvcHRpb24KCQkJKGlmIHRoZXJlIGlzIG9uZSkuICBXb3JrcyBsaWtlIHw6c2V0Z2xvYmFsfC4KCjpsZXQgW3tuYW1lMX0sIHtuYW1lMn0sIC4uLl0gPSB7ZXhwcjF9CQkqOmxldC11bnBhY2sqICpFNjg3KiAqRTY4OCoKCQkJe2V4cHIxfSBtdXN0IGV2YWx1YXRlIHRvIGEgfExpc3R8LiAgVGhlIGZpcnN0IGl0ZW0gaW4KCQkJdGhlIGxpc3QgaXMgYXNzaWduZWQgdG8ge25hbWUxfSwgdGhlIHNlY29uZCBpdGVtIHRvCgkJCXtuYW1lMn0sIGV0Yy4KCQkJVGhlIG51bWJlciBvZiBuYW1lcyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4KCQkJdGhlIHxMaXN0fC4KCQkJRWFjaCBuYW1lIGNhbiBiZSBvbmUgb2YgdGhlIGl0ZW1zIG9mIHRoZSAiOmxldCIKCQkJY29tbWFuZCBhcyBtZW50aW9uZWQgYWJvdmUuCgkJCUV4YW1wbGU6ID4KCQkJCTpsZXQgW3MsIGl0ZW1dID0gR2V0SXRlbShzKQo8CQkJRGV0YWlsOiB7ZXhwcjF9IGlzIGV2YWx1YXRlZCBmaXJzdCwgdGhlbiB0aGUKCQkJYXNzaWdubWVudHMgYXJlIGRvbmUgaW4gc2VxdWVuY2UuICBUaGlzIG1hdHRlcnMgaWYKCQkJe25hbWUyfSBkZXBlbmRzIG9uIHtuYW1lMX0uICBFeGFtcGxlOiA+CgkJCQk6bGV0IHggPSBbMCwgMV0KCQkJCTpsZXQgaSA9IDAKCQkJCTpsZXQgW2ksIHhbaV1dID0gWzEsIDJdCgkJCQk6ZWNobyB4CjwJCQlUaGUgcmVzdWx0IGlzIFswLCAyXS4KCjpsZXQgW3tuYW1lMX0sIHtuYW1lMn0sIC4uLl0gLj0ge2V4cHIxfQo6bGV0IFt7bmFtZTF9LCB7bmFtZTJ9LCAuLi5dICs9IHtleHByMX0KOmxldCBbe25hbWUxfSwge25hbWUyfSwgLi4uXSAtPSB7ZXhwcjF9CgkJCUxpa2UgYWJvdmUsIGJ1dCBhcHBlbmQvYWRkL3N1YnRyYWN0IHRoZSB2YWx1ZSBmb3IgZWFjaAoJCQl8TGlzdHwgaXRlbS4KCjpsZXQgW3tuYW1lfSwgLi4uLCA7IHtsYXN0bmFtZX1dID0ge2V4cHIxfQoJCQlMaWtlIHw6bGV0LXVucGFja3wgYWJvdmUsIGJ1dCB0aGUgfExpc3R8IG1heSBoYXZlIG1vcmUKCQkJaXRlbXMgdGhhbiB0aGVyZSBhcmUgbmFtZXMuICBBIGxpc3Qgb2YgdGhlIHJlbWFpbmluZwoJCQlpdGVtcyBpcyBhc3NpZ25lZCB0byB7bGFzdG5hbWV9LiAgSWYgdGhlcmUgYXJlIG5vCgkJCXJlbWFpbmluZyBpdGVtcyB7bGFzdG5hbWV9IGlzIHNldCB0byBhbiBlbXB0eSBsaXN0LgoJCQlFeGFtcGxlOiA+CgkJCQk6bGV0IFthLCBiOyByZXN0XSA9IFsiYXZhbCIsICJidmFsIiwgMywgNF0KPAo6bGV0IFt7bmFtZX0sIC4uLiwgOyB7bGFzdG5hbWV9XSAuPSB7ZXhwcjF9CjpsZXQgW3tuYW1lfSwgLi4uLCA7IHtsYXN0bmFtZX1dICs9IHtleHByMX0KOmxldCBbe25hbWV9LCAuLi4sIDsge2xhc3RuYW1lfV0gLT0ge2V4cHIxfQoJCQlMaWtlIGFib3ZlLCBidXQgYXBwZW5kL2FkZC9zdWJ0cmFjdCB0aGUgdmFsdWUgZm9yIGVhY2gKCQkJfExpc3R8IGl0ZW0uCgoJCQkJCQkJCSpFMTIxKgo6bGV0IHt2YXItbmFtZX0JLi4JTGlzdCB0aGUgdmFsdWUgb2YgdmFyaWFibGUge3Zhci1uYW1lfS4JTXVsdGlwbGUKCQkJdmFyaWFibGUgbmFtZXMgbWF5IGJlIGdpdmVuLiAgU3BlY2lhbCBuYW1lcyByZWNvZ25pemVkCgkJCWhlcmU6CQkJCSpFNzM4KgoJCQkgIGc6CWdsb2JhbCB2YXJpYWJsZXMKCQkJICBiOglsb2NhbCBidWZmZXIgdmFyaWFibGVzCgkJCSAgdzoJbG9jYWwgd2luZG93IHZhcmlhYmxlcwoJCQkgIHQ6CWxvY2FsIHRhYiBwYWdlIHZhcmlhYmxlcwoJCQkgIHM6CXNjcmlwdC1sb2NhbCB2YXJpYWJsZXMKCQkJICBsOglsb2NhbCBmdW5jdGlvbiB2YXJpYWJsZXMKCQkJICB2OglWaW0gdmFyaWFibGVzLgoKOmxldAkJCUxpc3QgdGhlIHZhbHVlcyBvZiBhbGwgdmFyaWFibGVzLiAgVGhlIHR5cGUgb2YgdGhlCgkJCXZhcmlhYmxlIGlzIGluZGljYXRlZCBiZWZvcmUgdGhlIHZhbHVlOgoJCQkgICAgPG5vdGhpbmc+CVN0cmluZwoJCQkJIwlOdW1iZXIKCQkJCSoJRnVuY3JlZgoKCjp1bmxbZXRdWyFdIHtuYW1lfSAuLi4JCQkJKjp1bmxldCogKjp1bmwqICpFMTA4KiAqRTc5NSoKCQkJUmVtb3ZlIHRoZSBpbnRlcm5hbCB2YXJpYWJsZSB7bmFtZX0uICBTZXZlcmFsIHZhcmlhYmxlCgkJCW5hbWVzIGNhbiBiZSBnaXZlbiwgdGhleSBhcmUgYWxsIHJlbW92ZWQuICBUaGUgbmFtZQoJCQltYXkgYWxzbyBiZSBhIHxMaXN0fCBvciB8RGljdGlvbmFyeXwgaXRlbS4KCQkJV2l0aCBbIV0gbm8gZXJyb3IgbWVzc2FnZSBpcyBnaXZlbiBmb3Igbm9uLWV4aXN0aW5nCgkJCXZhcmlhYmxlcy4KCQkJT25lIG9yIG1vcmUgaXRlbXMgZnJvbSBhIHxMaXN0fCBjYW4gYmUgcmVtb3ZlZDogPgoJCQkJOnVubGV0IGxpc3RbM10JICAiIHJlbW92ZSBmb3VydGggaXRlbQoJCQkJOnVubGV0IGxpc3RbMzpdICAgIiByZW1vdmUgZm91cnRoIGl0ZW0gdG8gbGFzdAo8CQkJT25lIGl0ZW0gZnJvbSBhIHxEaWN0aW9uYXJ5fCBjYW4gYmUgcmVtb3ZlZCBhdCBhIHRpbWU6ID4KCQkJCTp1bmxldCBkaWN0Wyd0d28nXQoJCQkJOnVubGV0IGRpY3QudHdvCjwJCQlUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHRvIGNsZWFuIHVwIHVzZWQgZ2xvYmFsCgkJCXZhcmlhYmxlcyBhbmQgc2NyaXB0LWxvY2FsIHZhcmlhYmxlcyAodGhlc2UgYXJlIG5vdAoJCQlkZWxldGVkIHdoZW4gdGhlIHNjcmlwdCBlbmRzKS4gIEZ1bmN0aW9uLWxvY2FsCgkJCXZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBkZWxldGVkIHdoZW4gdGhlIGZ1bmN0aW9uCgkJCWVuZHMuCgo6bG9ja3ZbYXJdWyFdIFtkZXB0aF0ge25hbWV9IC4uLgkJCSo6bG9ja3ZhciogKjpsb2NrdioKCQkJTG9jayB0aGUgaW50ZXJuYWwgdmFyaWFibGUge25hbWV9LiAgTG9ja2luZyBtZWFucyB0aGF0CgkJCWl0IGNhbiBubyBsb25nZXIgYmUgY2hhbmdlZCAodW50aWwgaXQgaXMgdW5sb2NrZWQpLgoJCQlBIGxvY2tlZCB2YXJpYWJsZSBjYW4gYmUgZGVsZXRlZDogPgoJCQkJOmxvY2t2YXIgdgoJCQkJOmxldCB2ID0gJ2FzZGYnCQkiIGZhaWxzIQoJCQkJOnVubGV0IHYKPAkJCQkJCQkqRTc0MSoKCQkJSWYgeW91IHRyeSB0byBjaGFuZ2UgYSBsb2NrZWQgdmFyaWFibGUgeW91IGdldCBhbgoJCQllcnJvciBtZXNzYWdlOiAiRTc0MTogVmFsdWUgaXMgbG9ja2VkOiB7bmFtZX0iCgoJCQlbZGVwdGhdIGlzIHJlbGV2YW50IHdoZW4gbG9ja2luZyBhIHxMaXN0fCBvcgoJCQl8RGljdGlvbmFyeXwuICBJdCBzcGVjaWZpZXMgaG93IGRlZXAgdGhlIGxvY2tpbmcgZ29lczoKCQkJCTEJTG9jayB0aGUgfExpc3R8IG9yIHxEaWN0aW9uYXJ5fCBpdHNlbGYsCgkJCQkJY2Fubm90IGFkZCBvciByZW1vdmUgaXRlbXMsIGJ1dCBjYW4KCQkJCQlzdGlsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzLgoJCQkJMglBbHNvIGxvY2sgdGhlIHZhbHVlcywgY2Fubm90IGNoYW5nZQoJCQkJCXRoZSBpdGVtcy4gIElmIGFuIGl0ZW0gaXMgYSB8TGlzdHwgb3IKCQkJCQl8RGljdGlvbmFyeXwsIGNhbm5vdCBhZGQgb3IgcmVtb3ZlCgkJCQkJaXRlbXMsIGJ1dCBjYW4gc3RpbGwgY2hhbmdlIHRoZQoJCQkJCXZhbHVlcy4KCQkJCTMJTGlrZSAyIGJ1dCBmb3IgdGhlIHxMaXN0fCAvCgkJCQkJfERpY3Rpb25hcnl8IGluIHRoZSB8TGlzdHwgLwoJCQkJCXxEaWN0aW9uYXJ5fCwgb25lIGxldmVsIGRlZXBlci4KCQkJVGhlIGRlZmF1bHQgW2RlcHRoXSBpcyAyLCB0aHVzIHdoZW4ge25hbWV9IGlzIGEgfExpc3R8CgkJCW9yIHxEaWN0aW9uYXJ5fCB0aGUgdmFsdWVzIGNhbm5vdCBiZSBjaGFuZ2VkLgoJCQkJCQkJCSpFNzQzKgoJCQlGb3IgdW5saW1pdGVkIGRlcHRoIHVzZSBbIV0gYW5kIG9taXQgW2RlcHRoXS4KCQkJSG93ZXZlciwgdGhlcmUgaXMgYSBtYXhpbXVtIGRlcHRoIG9mIDEwMCB0byBjYXRjaAoJCQlsb29wcy4KCgkJCU5vdGUgdGhhdCB3aGVuIHR3byB2YXJpYWJsZXMgcmVmZXIgdG8gdGhlIHNhbWUgfExpc3R8CgkJCWFuZCB5b3UgbG9jayBvbmUgb2YgdGhlbSwgdGhlIHxMaXN0fCB3aWxsIGFsc28gYmUKCQkJbG9ja2VkIHdoZW4gdXNlZCB0aHJvdWdoIHRoZSBvdGhlciB2YXJpYWJsZS4KCQkJRXhhbXBsZTogPgoJCQkJOmxldCBsID0gWzAsIDEsIDIsIDNdCgkJCQk6bGV0IGNsID0gbAoJCQkJOmxvY2t2YXIgbAoJCQkJOmxldCBjbFsxXSA9IDk5CQkiIHdvbid0IHdvcmshCjwJCQlZb3UgbWF5IHdhbnQgdG8gbWFrZSBhIGNvcHkgb2YgYSBsaXN0IHRvIGF2b2lkIHRoaXMuCgkJCVNlZSB8ZGVlcGNvcHkoKXwuCgoKOnVubG9bY2t2YXJdWyFdIFtkZXB0aF0ge25hbWV9IC4uLgkJCSo6dW5sb2NrdmFyKiAqOnVubG8qCgkJCVVubG9jayB0aGUgaW50ZXJuYWwgdmFyaWFibGUge25hbWV9LiAgRG9lcyB0aGUKCQkJb3Bwb3NpdGUgb2YgfDpsb2NrdmFyfC4KCgo6aWYge2V4cHIxfQkJCSo6aWYqICo6ZW5kaWYqICo6ZW4qICpFMTcxKiAqRTU3OSogKkU1ODAqCjplbltkaWZdCQlFeGVjdXRlIHRoZSBjb21tYW5kcyB1bnRpbCB0aGUgbmV4dCBtYXRjaGluZyAiOmVsc2UiCgkJCW9yICI6ZW5kaWYiIGlmIHtleHByMX0gZXZhbHVhdGVzIHRvIG5vbi16ZXJvLgoKCQkJRnJvbSBWaW0gdmVyc2lvbiA0LjUgdW50aWwgNS4wLCBldmVyeSBFeCBjb21tYW5kIGluCgkJCWJldHdlZW4gdGhlICI6aWYiIGFuZCAiOmVuZGlmIiBpcyBpZ25vcmVkLiAgVGhlc2UgdHdvCgkJCWNvbW1hbmRzIHdlcmUganVzdCB0byBhbGxvdyBmb3IgZnV0dXJlIGV4cGFuc2lvbnMgaW4gYQoJCQliYWNrd2FyZCBjb21wYXRpYmxlIHdheS4gIE5lc3Rpbmcgd2FzIGFsbG93ZWQuICBOb3RlCgkJCXRoYXQgYW55ICI6ZWxzZSIgb3IgIjplbHNlaWYiIHdhcyBpZ25vcmVkLCB0aGUgImVsc2UiCgkJCXBhcnQgd2FzIG5vdCBleGVjdXRlZCBlaXRoZXIuCgoJCQlZb3UgY2FuIHVzZSB0aGlzIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggb2xkZXIKCQkJdmVyc2lvbnM6ID4KCQkJCTppZiB2ZXJzaW9uID49IDUwMAoJCQkJOiAgdmVyc2lvbi01LXNwZWNpZmljLWNvbW1hbmRzCgkJCQk6ZW5kaWYKPAkJCVRoZSBjb21tYW5kcyBzdGlsbCBuZWVkIHRvIGJlIHBhcnNlZCB0byBmaW5kIHRoZQoJCQkiZW5kaWYiLiAgU29tZXRpbWVzIGFuIG9sZGVyIFZpbSBoYXMgYSBwcm9ibGVtIHdpdGggYQoJCQluZXcgY29tbWFuZC4gIEZvciBleGFtcGxlLCAiOnNpbGVudCIgaXMgcmVjb2duaXplZCBhcwoJCQlhICI6c3Vic3RpdHV0ZSIgY29tbWFuZC4gIEluIHRoYXQgY2FzZSAiOmV4ZWN1dGUiIGNhbgoJCQlhdm9pZCBwcm9ibGVtczogPgoJCQkJOmlmIHZlcnNpb24gPj0gNjAwCgkJCQk6ICBleGVjdXRlICJzaWxlbnQgMSwkZGVsZXRlIgoJCQkJOmVuZGlmCjwKCQkJTk9URTogVGhlICI6YXBwZW5kIiBhbmQgIjppbnNlcnQiIGNvbW1hbmRzIGRvbid0IHdvcmsKCQkJcHJvcGVybHkgaW4gYmV0d2VlbiAiOmlmIiBhbmQgIjplbmRpZiIuCgoJCQkJCQkqOmVsc2UqICo6ZWwqICpFNTgxKiAqRTU4MyoKOmVsW3NlXQkJCUV4ZWN1dGUgdGhlIGNvbW1hbmRzIHVudGlsIHRoZSBuZXh0IG1hdGNoaW5nICI6ZWxzZSIKCQkJb3IgIjplbmRpZiIgaWYgdGhleSBwcmV2aW91c2x5IHdlcmUgbm90IGJlaW5nCgkJCWV4ZWN1dGVkLgoKCQkJCQkqOmVsc2VpZiogKjplbHNlaSogKkU1ODIqICpFNTg0Kgo6ZWxzZWlbZl0ge2V4cHIxfQlTaG9ydCBmb3IgIjplbHNlIiAiOmlmIiwgd2l0aCB0aGUgYWRkaXRpb24gdGhhdCB0aGVyZQoJCQlpcyBubyBleHRyYSAiOmVuZGlmIi4KCjp3aFtpbGVdIHtleHByMX0JCQkqOndoaWxlKiAqOmVuZHdoaWxlKiAqOndoKiAqOmVuZHcqCgkJCQkJCSpFMTcwKiAqRTU4NSogKkU1ODgqICpFNzMzKgo6ZW5kd1toaWxlXQkJUmVwZWF0IHRoZSBjb21tYW5kcyBiZXR3ZWVuICI6d2hpbGUiIGFuZCAiOmVuZHdoaWxlIiwKCQkJYXMgbG9uZyBhcyB7ZXhwcjF9IGV2YWx1YXRlcyB0byBub24temVyby4KCQkJV2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZCBmcm9tIGEgY29tbWFuZCBpbnNpZGUgdGhlCgkJCWxvb3AsIGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlICJlbmR3aGlsZSIuCgkJCUV4YW1wbGU6ID4KCQkJCTpsZXQgbG51bSA9IDEKCQkJCTp3aGlsZSBsbnVtIDw9IGxpbmUoIiQiKQoJCQkJICAgOmNhbGwgRml4TGluZShsbnVtKQoJCQkJICAgOmxldCBsbnVtID0gbG51bSArIDEKCQkJCTplbmR3aGlsZQo8CgkJCU5PVEU6IFRoZSAiOmFwcGVuZCIgYW5kICI6aW5zZXJ0IiBjb21tYW5kcyBkb24ndCB3b3JrCgkJCXByb3Blcmx5IGluc2lkZSBhICI6d2hpbGUiIGFuZCAiOmZvciIgbG9vcC4KCjpmb3Ige3Zhcn0gaW4ge2xpc3R9CQkJCQkqOmZvciogKkU2OTAqICpFNzMyKgo6ZW5kZm9bcl0JCQkJCQkqOmVuZGZvKiAqOmVuZGZvcioKCQkJUmVwZWF0IHRoZSBjb21tYW5kcyBiZXR3ZWVuICI6Zm9yIiBhbmQgIjplbmRmb3IiIGZvcgoJCQllYWNoIGl0ZW0gaW4ge2xpc3R9LiAgVmFyaWFibGUge3Zhcn0gaXMgc2V0IHRvIHRoZQoJCQl2YWx1ZSBvZiBlYWNoIGl0ZW0uCgkJCVdoZW4gYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgZm9yIGEgY29tbWFuZCBpbnNpZGUgdGhlCgkJCWxvb3AsIGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlICJlbmRmb3IiLgoJCQlDaGFuZ2luZyB7bGlzdH0gaW5zaWRlIHRoZSBsb29wIGFmZmVjdHMgd2hhdCBpdGVtcyBhcmUKCQkJdXNlZC4gIE1ha2UgYSBjb3B5IGlmIHRoaXMgaXMgdW53YW50ZWQ6ID4KCQkJCTpmb3IgaXRlbSBpbiBjb3B5KG15bGlzdCkKPAkJCVdoZW4gbm90IG1ha2luZyBhIGNvcHksIFZpbSBzdG9yZXMgYSByZWZlcmVuY2UgdG8gdGhlCgkJCW5leHQgaXRlbSBpbiB0aGUgbGlzdCwgYmVmb3JlIGV4ZWN1dGluZyB0aGUgY29tbWFuZHMKCQkJd2l0aCB0aGUgY3VycmVudCBpdGVtLglUaHVzIHRoZSBjdXJyZW50IGl0ZW0gY2FuIGJlCgkJCXJlbW92ZWQgd2l0aG91dCBlZmZlY3QuICBSZW1vdmluZyBhbnkgbGF0ZXIgaXRlbSBtZWFucwoJCQlpdCB3aWxsIG5vdCBiZSBmb3VuZC4gIFRodXMgdGhlIGZvbGxvd2luZyBleGFtcGxlCgkJCXdvcmtzIChhbiBpbmVmZmljaWVudCB3YXkgdG8gbWFrZSBhIGxpc3QgZW1wdHkpOiA+CgkJCQlmb3IgaXRlbSBpbiBteWxpc3QKCQkJCSAgIGNhbGwgcmVtb3ZlKG15bGlzdCwgMCkKCQkJCWVuZGZvcgo8CQkJTm90ZSB0aGF0IHJlb3JkZXJpbmcgdGhlIGxpc3QgKGUuZy4sIHdpdGggc29ydCgpIG9yCgkJCXJldmVyc2UoKSkgbWF5IGhhdmUgdW5leHBlY3RlZCBlZmZlY3RzLgoJCQlOb3RlIHRoYXQgdGhlIHR5cGUgb2YgZWFjaCBsaXN0IGl0ZW0gc2hvdWxkIGJlCgkJCWlkZW50aWNhbCB0byBhdm9pZCBlcnJvcnMgZm9yIHRoZSB0eXBlIG9mIHt2YXJ9CgkJCWNoYW5naW5nLiAgVW5sZXQgdGhlIHZhcmlhYmxlIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AKCQkJdG8gYWxsb3cgbXVsdGlwbGUgaXRlbSB0eXBlczogPgoJCQkJZm9yIGl0ZW0gaW4gWyJmb28iLCBbImJhciJdXQoJCQkJICAgZWNobyBpdGVtCgkJCQkgICB1bmxldCBpdGVtICAiIEU3MDYgd2l0aG91dCB0aGlzCgkJCQllbmRmb3IKCjpmb3IgW3t2YXIxfSwge3ZhcjJ9LCAuLi5dIGluIHtsaXN0bGlzdH0KOmVuZGZvW3JdCgkJCUxpa2UgIjpmb3IiIGFib3ZlLCBidXQgZWFjaCBpdGVtIGluIHtsaXN0bGlzdH0gbXVzdCBiZQoJCQlhIGxpc3QsIG9mIHdoaWNoIGVhY2ggaXRlbSBpcyBhc3NpZ25lZCB0byB7dmFyMX0sCgkJCXt2YXIyfSwgZXRjLiAgRXhhbXBsZTogPgoJCQkJOmZvciBbbG51bSwgY29sXSBpbiBbWzEsIDNdLCBbMiwgNV0sIFszLCA4XV0KCQkJCSAgIDplY2hvIGdldGxpbmUobG51bSlbY29sXQoJCQkJOmVuZGZvcgo8CgkJCQkJCSo6Y29udGludWUqICo6Y29uKiAqRTU4NioKOmNvblt0aW51ZV0JCVdoZW4gdXNlZCBpbnNpZGUgYSAiOndoaWxlIiBvciAiOmZvciIgbG9vcCwganVtcHMgYmFjawoJCQl0byB0aGUgc3RhcnQgb2YgdGhlIGxvb3AuCgkJCUlmIGl0IGlzIHVzZWQgYWZ0ZXIgYSB8OnRyeXwgaW5zaWRlIHRoZSBsb29wIGJ1dAoJCQliZWZvcmUgdGhlIG1hdGNoaW5nIHw6ZmluYWxseXwgKGlmIHByZXNlbnQpLCB0aGUKCQkJY29tbWFuZHMgZm9sbG93aW5nIHRoZSAiOmZpbmFsbHkiIHVwIHRvIHRoZSBtYXRjaGluZwoJCQl8OmVuZHRyeXwgYXJlIGV4ZWN1dGVkIGZpcnN0LiAgVGhpcyBwcm9jZXNzIGFwcGxpZXMgdG8KCQkJYWxsIG5lc3RlZCAiOnRyeSJzIGluc2lkZSB0aGUgbG9vcC4gIFRoZSBvdXRlcm1vc3QKCQkJIjplbmR0cnkiIHRoZW4ganVtcHMgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxvb3AuCgoJCQkJCQkqOmJyZWFrKiAqOmJyZWEqICpFNTg3Kgo6YnJlYVtrXQkJV2hlbiB1c2VkIGluc2lkZSBhICI6d2hpbGUiIG9yICI6Zm9yIiBsb29wLCBza2lwcyB0bwoJCQl0aGUgY29tbWFuZCBhZnRlciB0aGUgbWF0Y2hpbmcgIjplbmR3aGlsZSIgb3IKCQkJIjplbmRmb3IiLgoJCQlJZiBpdCBpcyB1c2VkIGFmdGVyIGEgfDp0cnl8IGluc2lkZSB0aGUgbG9vcCBidXQKCQkJYmVmb3JlIHRoZSBtYXRjaGluZyB8OmZpbmFsbHl8IChpZiBwcmVzZW50KSwgdGhlCgkJCWNvbW1hbmRzIGZvbGxvd2luZyB0aGUgIjpmaW5hbGx5IiB1cCB0byB0aGUgbWF0Y2hpbmcKCQkJfDplbmR0cnl8IGFyZSBleGVjdXRlZCBmaXJzdC4gIFRoaXMgcHJvY2VzcyBhcHBsaWVzIHRvCgkJCWFsbCBuZXN0ZWQgIjp0cnkicyBpbnNpZGUgdGhlIGxvb3AuICBUaGUgb3V0ZXJtb3N0CgkJCSI6ZW5kdHJ5IiB0aGVuIGp1bXBzIHRvIHRoZSBjb21tYW5kIGFmdGVyIHRoZSBsb29wLgoKOnRyeQkJCQkqOnRyeSogKjplbmR0KiAqOmVuZHRyeSogKkU2MDAqICpFNjAxKiAqRTYwMioKOmVuZHRbcnldCQlDaGFuZ2UgdGhlIGVycm9yIGhhbmRsaW5nIGZvciB0aGUgY29tbWFuZHMgYmV0d2VlbgoJCQkiOnRyeSIgYW5kICI6ZW5kdHJ5IiBpbmNsdWRpbmcgZXZlcnl0aGluZyBiZWluZwoJCQlleGVjdXRlZCBhY3Jvc3MgIjpzb3VyY2UiIGNvbW1hbmRzLCBmdW5jdGlvbiBjYWxscywKCQkJb3IgYXV0b2NvbW1hbmQgaW52b2NhdGlvbnMuCgoJCQlXaGVuIGFuIGVycm9yIG9yIGludGVycnVwdCBpcyBkZXRlY3RlZCBhbmQgdGhlcmUgaXMKCQkJYSB8OmZpbmFsbHl8IGNvbW1hbmQgZm9sbG93aW5nLCBleGVjdXRpb24gY29udGludWVzCgkJCWFmdGVyIHRoZSAiOmZpbmFsbHkiLiAgT3RoZXJ3aXNlLCBvciB3aGVuIHRoZQoJCQkiOmVuZHRyeSIgaXMgcmVhY2hlZCB0aGVyZWFmdGVyLCB0aGUgbmV4dAoJCQkoZHluYW1pY2FsbHkpIHN1cnJvdW5kaW5nICI6dHJ5IiBpcyBjaGVja2VkIGZvcgoJCQlhIGNvcnJlc3BvbmRpbmcgIjpmaW5hbGx5IiBldGMuICBUaGVuIHRoZSBzY3JpcHQKCQkJcHJvY2Vzc2luZyBpcyB0ZXJtaW5hdGVkLiAgKFdoZXRoZXIgYSBmdW5jdGlvbgoJCQlkZWZpbml0aW9uIGhhcyBhbiAiYWJvcnQiIGFyZ3VtZW50IGRvZXMgbm90IG1hdHRlci4pCgkJCUV4YW1wbGU6ID4KCQk6dHJ5IHwgZWRpdCB0b28gbXVjaCB8IGZpbmFsbHkgfCBlY2hvICJjbGVhbnVwIiB8IGVuZHRyeQoJCTplY2hvICJpbXBvc3NpYmxlIgkiIG5vdCByZWFjaGVkLCBzY3JpcHQgdGVybWluYXRlZCBhYm92ZQo8CgkJCU1vcmVvdmVyLCBhbiBlcnJvciBvciBpbnRlcnJ1cHQgKGR5bmFtaWNhbGx5KSBpbnNpZGUKCQkJIjp0cnkiIGFuZCAiOmVuZHRyeSIgaXMgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvbi4gIEl0CgkJCWNhbiBiZSBjYXVnaHQgYXMgaWYgaXQgd2VyZSB0aHJvd24gYnkgYSB8OnRocm93fAoJCQljb21tYW5kIChzZWUgfDpjYXRjaHwpLiAgSW4gdGhpcyBjYXNlLCB0aGUgc2NyaXB0CgkJCXByb2Nlc3NpbmcgaXMgbm90IHRlcm1pbmF0ZWQuCgoJCQlUaGUgdmFsdWUgIlZpbTpJbnRlcnJ1cHQiIGlzIHVzZWQgZm9yIGFuIGludGVycnVwdAoJCQlleGNlcHRpb24uICBBbiBlcnJvciBpbiBhIFZpbSBjb21tYW5kIGlzIGNvbnZlcnRlZAoJCQl0byBhIHZhbHVlIG9mIHRoZSBmb3JtICJWaW0oe2NvbW1hbmR9KTp7ZXJybXNnfSIsCgkJCW90aGVyIGVycm9ycyBhcmUgY29udmVydGVkIHRvIGEgdmFsdWUgb2YgdGhlIGZvcm0KCQkJIlZpbTp7ZXJybXNnfSIuICB7Y29tbWFuZH0gaXMgdGhlIGZ1bGwgY29tbWFuZCBuYW1lLAoJCQlhbmQge2Vycm1zZ30gaXMgdGhlIG1lc3NhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgaWYgdGhlCgkJCWVycm9yIGV4Y2VwdGlvbiBpcyBub3QgY2F1Z2h0LCBhbHdheXMgYmVnaW5uaW5nIHdpdGgKCQkJdGhlIGVycm9yIG51bWJlci4KCQkJRXhhbXBsZXM6ID4KCQk6dHJ5IHwgc2xlZXAgMTAwIHwgY2F0Y2ggL15WaW06SW50ZXJydXB0JC8gfCBlbmR0cnkKCQk6dHJ5IHwgZWRpdCB8IGNhdGNoIC9eVmltKGVkaXQpOkVcZFwrLyB8IGVjaG8gImVycm9yIiB8IGVuZHRyeQo8CgkJCQkJKjpjYXQqICo6Y2F0Y2gqICpFNjAzKiAqRTYwNCogKkU2MDUqCjpjYXRbY2hdIC97cGF0dGVybn0vCVRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdW50aWwgdGhlIG5leHQgfDpjYXRjaHwsCgkJCXw6ZmluYWxseXwsIG9yIHw6ZW5kdHJ5fCB0aGF0IGJlbG9uZ3MgdG8gdGhlIHNhbWUKCQkJfDp0cnl8IGFzIHRoZSAiOmNhdGNoIiBhcmUgZXhlY3V0ZWQgd2hlbiBhbiBleGNlcHRpb24KCQkJbWF0Y2hpbmcge3BhdHRlcm59IGlzIGJlaW5nIHRocm93biBhbmQgaGFzIG5vdCB5ZXQKCQkJYmVlbiBjYXVnaHQgYnkgYSBwcmV2aW91cyAiOmNhdGNoIi4gIE90aGVyd2lzZSwgdGhlc2UKCQkJY29tbWFuZHMgYXJlIHNraXBwZWQuCgkJCVdoZW4ge3BhdHRlcm59IGlzIG9taXR0ZWQgYWxsIGVycm9ycyBhcmUgY2F1Z2h0LgoJCQlFeGFtcGxlczogPgoJCTpjYXRjaCAvXlZpbTpJbnRlcnJ1cHQkLwkiIGNhdGNoIGludGVycnVwdHMgKENUUkwtQykKCQk6Y2F0Y2ggL15WaW1cJSgoXGFcKylcKVw9OkUvCSIgY2F0Y2ggYWxsIFZpbSBlcnJvcnMKCQk6Y2F0Y2ggL15WaW1cJSgoXGFcKylcKVw9Oi8JIiBjYXRjaCBlcnJvcnMgYW5kIGludGVycnVwdHMKCQk6Y2F0Y2ggL15WaW0od3JpdGUpOi8JCSIgY2F0Y2ggYWxsIGVycm9ycyBpbiA6d3JpdGUKCQk6Y2F0Y2ggL15WaW1cJSgoXGFcKylcKVw9OkUxMjMvCSIgY2F0Y2ggZXJyb3IgRTEyMwoJCTpjYXRjaCAvbXktZXhjZXB0aW9uLwkJIiBjYXRjaCB1c2VyIGV4Y2VwdGlvbgoJCTpjYXRjaCAvLiovCQkJIiBjYXRjaCBldmVyeXRoaW5nCgkJOmNhdGNoCQkJCSIgc2FtZSBhcyAvLiovCjwKCQkJQW5vdGhlciBjaGFyYWN0ZXIgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiAvIGFyb3VuZCB0aGUKCQkJe3BhdHRlcm59LCBzbyBsb25nIGFzIGl0IGRvZXMgbm90IGhhdmUgYSBzcGVjaWFsCgkJCW1lYW5pbmcgKGUuZy4sICd8JyBvciAnIicpIGFuZCBkb2Vzbid0IG9jY3VyIGluc2lkZQoJCQl7cGF0dGVybn0uCgkJCUluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24gaXMgYXZhaWxhYmxlIGluCgkJCXx2OmV4Y2VwdGlvbnwuICBBbHNvIHNlZSB8dGhyb3ctdmFyaWFibGVzfC4KCQkJTk9URTogSXQgaXMgbm90IHJlbGlhYmxlIHRvICI6Y2F0Y2giIHRoZSBURVhUIG9mCgkJCWFuIGVycm9yIG1lc3NhZ2UgYmVjYXVzZSBpdCBtYXkgdmFyeSBpbiBkaWZmZXJlbnQKCQkJbG9jYWxlcy4KCgkJCQkJKjpmaW5hKiAqOmZpbmFsbHkqICpFNjA2KiAqRTYwNyoKOmZpbmFbbGx5XQkJVGhlIGZvbGxvd2luZyBjb21tYW5kcyB1bnRpbCB0aGUgbWF0Y2hpbmcgfDplbmR0cnl8CgkJCWFyZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgcGFydCBiZXR3ZWVuIHRoZSBtYXRjaGluZwoJCQl8OnRyeXwgYW5kIHRoZSAiOmZpbmFsbHkiIGlzIGxlZnQ6ICBlaXRoZXIgYnkgZmFsbGluZwoJCQl0aHJvdWdoIHRvIHRoZSAiOmZpbmFsbHkiIG9yIGJ5IGEgfDpjb250aW51ZXwsCgkJCXw6YnJlYWt8LCB8OmZpbmlzaHwsIG9yIHw6cmV0dXJufCwgb3IgYnkgYW4gZXJyb3Igb3IKCQkJaW50ZXJydXB0IG9yIGV4Y2VwdGlvbiAoc2VlIHw6dGhyb3d8KS4KCgkJCQkJCQkqOnRoKiAqOnRocm93KiAqRTYwOCoKOnRoW3Jvd10ge2V4cHIxfQlUaGUge2V4cHIxfSBpcyBldmFsdWF0ZWQgYW5kIHRocm93biBhcyBhbiBleGNlcHRpb24uCgkJCUlmIHRoZSAiOnRocm93IiBpcyB1c2VkIGFmdGVyIGEgfDp0cnl8IGJ1dCBiZWZvcmUgdGhlCgkJCWZpcnN0IGNvcnJlc3BvbmRpbmcgfDpjYXRjaHwsIGNvbW1hbmRzIGFyZSBza2lwcGVkCgkJCXVudGlsIHRoZSBmaXJzdCAiOmNhdGNoIiBtYXRjaGluZyB7ZXhwcjF9IGlzIHJlYWNoZWQuCgkJCUlmIHRoZXJlIGlzIG5vIHN1Y2ggIjpjYXRjaCIgb3IgaWYgdGhlICI6dGhyb3ciIGlzCgkJCXVzZWQgYWZ0ZXIgYSAiOmNhdGNoIiBidXQgYmVmb3JlIHRoZSB8OmZpbmFsbHl8LCB0aGUKCQkJY29tbWFuZHMgZm9sbG93aW5nIHRoZSAiOmZpbmFsbHkiIChpZiBwcmVzZW50KSB1cCB0bwoJCQl0aGUgbWF0Y2hpbmcgfDplbmR0cnl8IGFyZSBleGVjdXRlZC4gIElmIHRoZSAiOnRocm93IgoJCQlpcyBhZnRlciB0aGUgIjpmaW5hbGx5IiwgY29tbWFuZHMgdXAgdG8gdGhlICI6ZW5kdHJ5IgoJCQlhcmUgc2tpcHBlZC4gIEF0IHRoZSAiOmVuZHRyeSIsIHRoaXMgcHJvY2VzcyBhcHBsaWVzCgkJCWFnYWluIGZvciB0aGUgbmV4dCBkeW5hbWljYWxseSBzdXJyb3VuZGluZyAiOnRyeSIKCQkJKHdoaWNoIG1heSBiZSBmb3VuZCBpbiBhIGNhbGxpbmcgZnVuY3Rpb24gb3Igc291cmNpbmcKCQkJc2NyaXB0KSwgdW50aWwgYSBtYXRjaGluZyAiOmNhdGNoIiBoYXMgYmVlbiBmb3VuZC4KCQkJSWYgdGhlIGV4Y2VwdGlvbiBpcyBub3QgY2F1Z2h0LCB0aGUgY29tbWFuZCBwcm9jZXNzaW5nCgkJCWlzIHRlcm1pbmF0ZWQuCgkJCUV4YW1wbGU6ID4KCQk6dHJ5IHwgdGhyb3cgIm9vcHMiIHwgY2F0Y2ggL15vby8gfCBlY2hvICJjYXVnaHQiIHwgZW5kdHJ5CjwJCQlOb3RlIHRoYXQgImNhdGNoIiBtYXkgbmVlZCB0byBiZSBvbiBhIHNlcGFyYXRlIGxpbmUKCQkJZm9yIHdoZW4gYW4gZXJyb3IgY2F1c2VzIHRoZSBwYXJzaW5nIHRvIHNraXAgdGhlIHdob2xlCgkJCWxpbmUgYW5kIG5vdCBzZWUgdGhlICJ8IiB0aGF0IHNlcGFyYXRlcyB0aGUgY29tbWFuZHMuCgoJCQkJCQkJKjplYyogKjplY2hvKgo6ZWNbaG9dIHtleHByMX0gLi4JRWNob2VzIGVhY2gge2V4cHIxfSwgd2l0aCBhIHNwYWNlIGluIGJldHdlZW4uICBUaGUKCQkJZmlyc3Qge2V4cHIxfSBzdGFydHMgb24gYSBuZXcgbGluZS4KCQkJQWxzbyBzZWUgfDpjb21tZW50fC4KCQkJVXNlICJcbiIgdG8gc3RhcnQgYSBuZXcgbGluZS4gIFVzZSAiXHIiIHRvIG1vdmUgdGhlCgkJCWN1cnNvciB0byB0aGUgZmlyc3QgY29sdW1uLgoJCQlVc2VzIHRoZSBoaWdobGlnaHRpbmcgc2V0IGJ5IHRoZSB8OmVjaG9obHwgY29tbWFuZC4KCQkJQ2Fubm90IGJlIGZvbGxvd2VkIGJ5IGEgY29tbWVudC4KCQkJRXhhbXBsZTogPgoJCTplY2hvICJ0aGUgdmFsdWUgb2YgJ3NoZWxsJyBpcyIgJnNoZWxsCjwJCQkJCQkJKjplY2hvLXJlZHJhdyoKCQkJQSBsYXRlciByZWRyYXcgbWF5IG1ha2UgdGhlIG1lc3NhZ2UgZGlzYXBwZWFyIGFnYWluLgoJCQlBbmQgc2luY2UgVmltIG1vc3RseSBwb3N0cG9uZXMgcmVkcmF3aW5nIHVudGlsIGl0J3MKCQkJZmluaXNoZWQgd2l0aCBhIHNlcXVlbmNlIG9mIGNvbW1hbmRzIHRoaXMgaGFwcGVucwoJCQlxdWl0ZSBvZnRlbi4gIFRvIGF2b2lkIHRoYXQgYSBjb21tYW5kIGZyb20gYmVmb3JlIHRoZQoJCQkiOmVjaG8iIGNhdXNlcyBhIHJlZHJhdyBhZnRlcndhcmRzIChyZWRyYXdzIGFyZSBvZnRlbgoJCQlwb3N0cG9uZWQgdW50aWwgeW91IHR5cGUgc29tZXRoaW5nKSwgZm9yY2UgYSByZWRyYXcKCQkJd2l0aCB0aGUgfDpyZWRyYXd8IGNvbW1hbmQuICBFeGFtcGxlOiA+CgkJOm5ldyB8IHJlZHJhdyB8IGVjaG8gInRoZXJlIGlzIGEgbmV3IHdpbmRvdyIKPAoJCQkJCQkJKjplY2hvbioKOmVjaG9uIHtleHByMX0gLi4JRWNob2VzIGVhY2gge2V4cHIxfSwgd2l0aG91dCBhbnl0aGluZyBhZGRlZC4gIEFsc28gc2VlCgkJCXw6Y29tbWVudHwuCgkJCVVzZXMgdGhlIGhpZ2hsaWdodGluZyBzZXQgYnkgdGhlIHw6ZWNob2hsfCBjb21tYW5kLgoJCQlDYW5ub3QgYmUgZm9sbG93ZWQgYnkgYSBjb21tZW50LgoJCQlFeGFtcGxlOiA+CgkJCQk6ZWNob24gInRoZSB2YWx1ZSBvZiAnc2hlbGwnIGlzICIgJnNoZWxsCjwKCQkJTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nICI6ZWNobyIsIHdoaWNoIGlzIGEKCQkJVmltIGNvbW1hbmQsIGFuZCAiOiFlY2hvIiwgd2hpY2ggaXMgYW4gZXh0ZXJuYWwgc2hlbGwKCQkJY29tbWFuZDogPgoJCTohZWNobyAlCQktLT4gZmlsZW5hbWUKPAkJCVRoZSBhcmd1bWVudHMgb2YgIjohIiBhcmUgZXhwYW5kZWQsIHNlZSB8Ol8lfC4gPgoJCTohZWNobyAiJSIJCS0tPiBmaWxlbmFtZSBvciAiZmlsZW5hbWUiCjwJCQlMaWtlIHRoZSBwcmV2aW91cyBleGFtcGxlLiAgV2hldGhlciB5b3Ugc2VlIHRoZSBkb3VibGUKCQkJcXVvdGVzIG9yIG5vdCBkZXBlbmRzIG9uIHlvdXIgJ3NoZWxsJy4gPgoJCTplY2hvICUJCQktLT4gbm90aGluZwo8CQkJVGhlICclJyBpcyBhbiBpbGxlZ2FsIGNoYXJhY3RlciBpbiBhbiBleHByZXNzaW9uLiA+CgkJOmVjaG8gIiUiCQktLT4gJQo8CQkJVGhpcyBqdXN0IGVjaG9lcyB0aGUgJyUnIGNoYXJhY3Rlci4gPgoJCTplY2hvIGV4cGFuZCgiJSIpCS0tPiBmaWxlbmFtZQo8CQkJVGhpcyBjYWxscyB0aGUgZXhwYW5kKCkgZnVuY3Rpb24gdG8gZXhwYW5kIHRoZSAnJScuCgoJCQkJCQkJKjplY2hvaCogKjplY2hvaGwqCjplY2hvaFtsXSB7bmFtZX0JVXNlIHRoZSBoaWdobGlnaHQgZ3JvdXAge25hbWV9IGZvciB0aGUgZm9sbG93aW5nCgkJCXw6ZWNob3wsIHw6ZWNob258IGFuZCB8OmVjaG9tc2d8IGNvbW1hbmRzLiAgQWxzbyB1c2VkCgkJCWZvciB0aGUgfGlucHV0KCl8IHByb21wdC4gIEV4YW1wbGU6ID4KCQk6ZWNob2hsIFdhcm5pbmdNc2cgfCBlY2hvICJEb24ndCBwYW5pYyEiIHwgZWNob2hsIE5vbmUKPAkJCURvbid0IGZvcmdldCB0byBzZXQgdGhlIGdyb3VwIGJhY2sgdG8gIk5vbmUiLAoJCQlvdGhlcndpc2UgYWxsIGZvbGxvd2luZyBlY2hvJ3Mgd2lsbCBiZSBoaWdobGlnaHRlZC4KCgkJCQkJCQkqOmVjaG9tKiAqOmVjaG9tc2cqCjplY2hvbVtzZ10ge2V4cHIxfSAuLglFY2hvIHRoZSBleHByZXNzaW9uKHMpIGFzIGEgdHJ1ZSBtZXNzYWdlLCBzYXZpbmcgdGhlCgkJCW1lc3NhZ2UgaW4gdGhlIHxtZXNzYWdlLWhpc3Rvcnl8LgoJCQlTcGFjZXMgYXJlIHBsYWNlZCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMgYXMgd2l0aCB0aGUKCQkJfDplY2hvfCBjb21tYW5kLiAgQnV0IHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlCgkJCWRpc3BsYXllZCwgbm90IGludGVycHJldGVkLgoJCQlUaGUgcGFyc2luZyB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB8OmVjaG98LAoJCQltb3JlIGxpa2UgfDpleGVjdXRlfC4gIEFsbCB0aGUgZXhwcmVzc2lvbnMgYXJlIGZpcnN0CgkJCWV2YWx1YXRlZCBhbmQgY29uY2F0ZW5hdGVkIGJlZm9yZSBlY2hvaW5nIGFueXRoaW5nLgoJCQlUaGUgZXhwcmVzc2lvbnMgbXVzdCBldmFsdWF0ZSB0byBhIE51bWJlciBvciBTdHJpbmcsIGEKCQkJRGljdGlvbmFyeSBvciBMaXN0IGNhdXNlcyBhbiBlcnJvci4KCQkJVXNlcyB0aGUgaGlnaGxpZ2h0aW5nIHNldCBieSB0aGUgfDplY2hvaGx8IGNvbW1hbmQuCgkJCUV4YW1wbGU6ID4KCQk6ZWNob21zZyAiSXQncyBhIFppenplciBaYXp6ZXIgWnV6eiwgYXMgeW91IGNhbiBwbGFpbmx5IHNlZS4iCjwJCQlTZWUgfDplY2hvLXJlZHJhd3wgdG8gYXZvaWQgdGhlIG1lc3NhZ2UgZGlzYXBwZWFyaW5nCgkJCXdoZW4gdGhlIHNjcmVlbiBpcyByZWRyYXduLgoJCQkJCQkJKjplY2hvZSogKjplY2hvZXJyKgo6ZWNob2VbcnJdIHtleHByMX0gLi4JRWNobyB0aGUgZXhwcmVzc2lvbihzKSBhcyBhbiBlcnJvciBtZXNzYWdlLCBzYXZpbmcgdGhlCgkJCW1lc3NhZ2UgaW4gdGhlIHxtZXNzYWdlLWhpc3Rvcnl8LiAgV2hlbiB1c2VkIGluIGEKCQkJc2NyaXB0IG9yIGZ1bmN0aW9uIHRoZSBsaW5lIG51bWJlciB3aWxsIGJlIGFkZGVkLgoJCQlTcGFjZXMgYXJlIHBsYWNlZCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMgYXMgd2l0aCB0aGUKCQkJOmVjaG8gY29tbWFuZC4JV2hlbiB1c2VkIGluc2lkZSBhIHRyeSBjb25kaXRpb25hbCwKCQkJdGhlIG1lc3NhZ2UgaXMgcmFpc2VkIGFzIGFuIGVycm9yIGV4Y2VwdGlvbiBpbnN0ZWFkCgkJCShzZWUgfHRyeS1lY2hvZXJyfCkuCgkJCUV4YW1wbGU6ID4KCQk6ZWNob2VyciAiVGhpcyBzY3JpcHQganVzdCBmYWlsZWQhIgo8CQkJSWYgeW91IGp1c3Qgd2FudCBhIGhpZ2hsaWdodGVkIG1lc3NhZ2UgdXNlIHw6ZWNob2hsfC4KCQkJQW5kIHRvIGdldCBhIGJlZXA6ID4KCQk6ZXhlICJub3JtYWwgXDxFc2M+Igo8CgkJCQkJCQkqOmV4ZSogKjpleGVjdXRlKgo6ZXhlW2N1dGVdIHtleHByMX0gLi4JRXhlY3V0ZXMgdGhlIHN0cmluZyB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgZXZhbHVhdGlvbgoJCQlvZiB7ZXhwcjF9IGFzIGFuIEV4IGNvbW1hbmQuCgkJCU11bHRpcGxlIGFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkLCB3aXRoIGEgc3BhY2UgaW4KCQkJYmV0d2Vlbi4gIFRvIGF2b2lkIHRoZSBleHRyYSBzcGFjZSB1c2UgdGhlICIuIgoJCQlvcGVyYXRvciB0byBjb25jYXRlbmF0ZSBzdHJpbmdzIGludG8gb25lIGFyZ3VtZW50LgoJCQl7ZXhwcjF9IGlzIHVzZWQgYXMgdGhlIHByb2Nlc3NlZCBjb21tYW5kLCBjb21tYW5kIGxpbmUKCQkJZWRpdGluZyBrZXlzIGFyZSBub3QgcmVjb2duaXplZC4KCQkJQ2Fubm90IGJlIGZvbGxvd2VkIGJ5IGEgY29tbWVudC4KCQkJRXhhbXBsZXM6ID4KCQk6ZXhlY3V0ZSAiYnVmZmVyIiBuZXh0YnVmCgkJOmV4ZWN1dGUgIm5vcm1hbCIgY291bnQgLiAidyIKPAoJCQkiOmV4ZWN1dGUiIGNhbiBiZSB1c2VkIHRvIGFwcGVuZCBhIGNvbW1hbmQgdG8gY29tbWFuZHMKCQkJdGhhdCBkb24ndCBhY2NlcHQgYSAnfCcuICBFeGFtcGxlOiA+CgkJOmV4ZWN1dGUgJyFscycgfCBlY2hvICJ0aGVlbmQiCgo8CQkJIjpleGVjdXRlIiBpcyBhbHNvIGEgbmljZSB3YXkgdG8gYXZvaWQgaGF2aW5nIHRvIHR5cGUKCQkJY29udHJvbCBjaGFyYWN0ZXJzIGluIGEgVmltIHNjcmlwdCBmb3IgYSAiOm5vcm1hbCIKCQkJY29tbWFuZDogPgoJCTpleGVjdXRlICJub3JtYWwgaXh4eFw8RXNjPiIKPAkJCVRoaXMgaGFzIGFuIDxFc2M+IGNoYXJhY3Rlciwgc2VlIHxleHByLXN0cmluZ3wuCgoJCQlCZSBjYXJlZnVsIHRvIGNvcnJlY3RseSBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluCgkJCWZpbGUgbmFtZXMuICBUaGUgfGZuYW1lZXNjYXBlKCl8IGZ1bmN0aW9uIGNhbiBiZSB1c2VkCgkJCWZvciBWaW0gY29tbWFuZHMsIHxzaGVsbGVzY2FwZSgpfCBmb3IgfDohfCBjb21tYW5kcy4KCQkJRXhhbXBsZXM6ID4KCQk6ZXhlY3V0ZSAiZSAiIC4gZm5hbWVlc2NhcGUoZmlsZW5hbWUpCgkJOmV4ZWN1dGUgIiFscyAiIC4gc2hlbGxlc2NhcGUoZmlsZW5hbWUsIDEpCjwKCQkJTm90ZTogVGhlIGV4ZWN1dGVkIHN0cmluZyBtYXkgYmUgYW55IGNvbW1hbmQtbGluZSwgYnV0CgkJCXN0YXJ0aW5nIG9yIGVuZGluZyAiaWYiLCAid2hpbGUiIGFuZCAiZm9yIiBkb2VzIG5vdAoJCQlhbHdheXMgd29yaywgYmVjYXVzZSB3aGVuIGNvbW1hbmRzIGFyZSBza2lwcGVkIHRoZQoJCQkiOmV4ZWN1dGUiIGlzIG5vdCBldmFsdWF0ZWQgYW5kIFZpbSBsb3NlcyB0cmFjayBvZgoJCQl3aGVyZSBibG9ja3Mgc3RhcnQgYW5kIGVuZC4gIEFsc28gImJyZWFrIiBhbmQKCQkJImNvbnRpbnVlIiBzaG91bGQgbm90IGJlIGluc2lkZSAiOmV4ZWN1dGUiLgoJCQlUaGlzIGV4YW1wbGUgZG9lcyBub3Qgd29yaywgYmVjYXVzZSB0aGUgIjpleGVjdXRlIiBpcwoJCQlub3QgZXZhbHVhdGVkIGFuZCBWaW0gZG9lcyBub3Qgc2VlIHRoZSAid2hpbGUiLCBhbmQKCQkJZ2l2ZXMgYW4gZXJyb3IgZm9yIGZpbmRpbmcgYW4gIjplbmR3aGlsZSI6ID4KCQk6aWYgMAoJCTogZXhlY3V0ZSAnd2hpbGUgaSA+IDUnCgkJOiAgZWNobyAidGVzdCIKCQk6IGVuZHdoaWxlCgkJOmVuZGlmCjwKCQkJSXQgaXMgYWxsb3dlZCB0byBoYXZlIGEgIndoaWxlIiBvciAiaWYiIGNvbW1hbmQKCQkJY29tcGxldGVseSBpbiB0aGUgZXhlY3V0ZWQgc3RyaW5nOiA+CgkJOmV4ZWN1dGUgJ3doaWxlIGkgPCA1IHwgZWNobyBpIHwgbGV0IGkgPSBpICsgMSB8IGVuZHdoaWxlJwo8CgoJCQkJCQkJKjpleGUtY29tbWVudCoKCQkJIjpleGVjdXRlIiwgIjplY2hvIiBhbmQgIjplY2hvbiIgY2Fubm90IGJlIGZvbGxvd2VkIGJ5CgkJCWEgY29tbWVudCBkaXJlY3RseSwgYmVjYXVzZSB0aGV5IHNlZSB0aGUgJyInIGFzIHRoZQoJCQlzdGFydCBvZiBhIHN0cmluZy4gIEJ1dCwgeW91IGNhbiB1c2UgJ3wnIGZvbGxvd2VkIGJ5IGEKCQkJY29tbWVudC4gIEV4YW1wbGU6ID4KCQk6ZWNobyAiZm9vIiB8ICJ0aGlzIGlzIGEgY29tbWVudAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjguIEV4Y2VwdGlvbiBoYW5kbGluZwkJCQkJKmV4Y2VwdGlvbi1oYW5kbGluZyoKClRoZSBWaW0gc2NyaXB0IGxhbmd1YWdlIGNvbXByaXNlcyBhbiBleGNlcHRpb24gaGFuZGxpbmcgZmVhdHVyZS4gIFRoaXMgc2VjdGlvbgpleHBsYWlucyBob3cgaXQgY2FuIGJlIHVzZWQgaW4gYSBWaW0gc2NyaXB0LgoKRXhjZXB0aW9ucyBtYXkgYmUgcmFpc2VkIGJ5IFZpbSBvbiBhbiBlcnJvciBvciBvbiBpbnRlcnJ1cHQsIHNlZQp8Y2F0Y2gtZXJyb3JzfCBhbmQgfGNhdGNoLWludGVycnVwdHwuICBZb3UgY2FuIGFsc28gZXhwbGljaXRseSB0aHJvdyBhbgpleGNlcHRpb24gYnkgdXNpbmcgdGhlICI6dGhyb3ciIGNvbW1hbmQsIHNlZSB8dGhyb3ctY2F0Y2h8LgoKClRSWSBDT05ESVRJT05BTFMJCQkJCSp0cnktY29uZGl0aW9uYWxzKgoKRXhjZXB0aW9ucyBjYW4gYmUgY2F1Z2h0IG9yIGNhbiBjYXVzZSBjbGVhbnVwIGNvZGUgdG8gYmUgZXhlY3V0ZWQuICBZb3UgY2FuCnVzZSBhIHRyeSBjb25kaXRpb25hbCB0byBzcGVjaWZ5IGNhdGNoIGNsYXVzZXMgKHRoYXQgY2F0Y2ggZXhjZXB0aW9ucykgYW5kL29yCmEgZmluYWxseSBjbGF1c2UgKHRvIGJlIGV4ZWN1dGVkIGZvciBjbGVhbnVwKS4KICAgQSB0cnkgY29uZGl0aW9uYWwgYmVnaW5zIHdpdGggYSB8OnRyeXwgY29tbWFuZCBhbmQgZW5kcyBhdCB0aGUgbWF0Y2hpbmcKfDplbmR0cnl8IGNvbW1hbmQuICBJbiBiZXR3ZWVuLCB5b3UgY2FuIHVzZSBhIHw6Y2F0Y2h8IGNvbW1hbmQgdG8gc3RhcnQKYSBjYXRjaCBjbGF1c2UsIG9yIGEgfDpmaW5hbGx5fCBjb21tYW5kIHRvIHN0YXJ0IGEgZmluYWxseSBjbGF1c2UuICBUaGVyZSBtYXkKYmUgbm9uZSBvciBtdWx0aXBsZSBjYXRjaCBjbGF1c2VzLCBidXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgZmluYWxseSBjbGF1c2UsCndoaWNoIG11c3Qgbm90IGJlIGZvbGxvd2VkIGJ5IGFueSBjYXRjaCBjbGF1c2VzLiAgVGhlIGxpbmVzIGJlZm9yZSB0aGUgY2F0Y2gKY2xhdXNlcyBhbmQgdGhlIGZpbmFsbHkgY2xhdXNlIGlzIGNhbGxlZCBhIHRyeSBibG9jay4gPgoKICAgICA6dHJ5CiAgICAgOgkuLi4KICAgICA6CS4uLgkJCQlUUlkgQkxPQ0sKICAgICA6CS4uLgogICAgIDpjYXRjaCAve3BhdHRlcm59LwogICAgIDoJLi4uCiAgICAgOgkuLi4JCQkJQ0FUQ0ggQ0xBVVNFCiAgICAgOgkuLi4KICAgICA6Y2F0Y2ggL3twYXR0ZXJufS8KICAgICA6CS4uLgogICAgIDoJLi4uCQkJCUNBVENIIENMQVVTRQogICAgIDoJLi4uCiAgICAgOmZpbmFsbHkKICAgICA6CS4uLgogICAgIDoJLi4uCQkJCUZJTkFMTFkgQ0xBVVNFCiAgICAgOgkuLi4KICAgICA6ZW5kdHJ5CgpUaGUgdHJ5IGNvbmRpdGlvbmFsIGFsbG93cyB0byB3YXRjaCBjb2RlIGZvciBleGNlcHRpb25zIGFuZCB0byB0YWtlIHRoZQphcHByb3ByaWF0ZSBhY3Rpb25zLiAgRXhjZXB0aW9ucyBmcm9tIHRoZSB0cnkgYmxvY2sgbWF5IGJlIGNhdWdodC4gIEV4Y2VwdGlvbnMKZnJvbSB0aGUgdHJ5IGJsb2NrIGFuZCBhbHNvIHRoZSBjYXRjaCBjbGF1c2VzIG1heSBjYXVzZSBjbGVhbnVwIGFjdGlvbnMuCiAgIFdoZW4gbm8gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSB0cnkgYmxvY2ssIHRoZSBjb250cm9sCmlzIHRyYW5zZmVycmVkIHRvIHRoZSBmaW5hbGx5IGNsYXVzZSwgaWYgcHJlc2VudC4gIEFmdGVyIGl0cyBleGVjdXRpb24sIHRoZQpzY3JpcHQgY29udGludWVzIHdpdGggdGhlIGxpbmUgZm9sbG93aW5nIHRoZSAiOmVuZHRyeSIuCiAgIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSB0cnkgYmxvY2ssIHRoZSByZW1haW5pbmcKbGluZXMgaW4gdGhlIHRyeSBibG9jayBhcmUgc2tpcHBlZC4gIFRoZSBleGNlcHRpb24gaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZQpwYXR0ZXJucyBzcGVjaWZpZWQgYXMgYXJndW1lbnRzIHRvIHRoZSAiOmNhdGNoIiBjb21tYW5kcy4gIFRoZSBjYXRjaCBjbGF1c2UKYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoaW5nICI6Y2F0Y2giIGlzIHRha2VuLCBvdGhlciBjYXRjaCBjbGF1c2VzIGFyZSBub3QKZXhlY3V0ZWQuICBUaGUgY2F0Y2ggY2xhdXNlIGVuZHMgd2hlbiB0aGUgbmV4dCAiOmNhdGNoIiwgIjpmaW5hbGx5Iiwgb3IKIjplbmR0cnkiIGNvbW1hbmQgaXMgcmVhY2hlZCAtIHdoYXRldmVyIGlzIGZpcnN0LiAgVGhlbiwgdGhlIGZpbmFsbHkgY2xhdXNlCihpZiBwcmVzZW50KSBpcyBleGVjdXRlZC4gIFdoZW4gdGhlICI6ZW5kdHJ5IiBpcyByZWFjaGVkLCB0aGUgc2NyaXB0IGV4ZWN1dGlvbgpjb250aW51ZXMgaW4gdGhlIGZvbGxvd2luZyBsaW5lIGFzIHVzdWFsLgogICBXaGVuIGFuIGV4Y2VwdGlvbiB0aGF0IGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIGJ5IHRoZQoiOmNhdGNoIiBjb21tYW5kcyBpcyB0aHJvd24gaW4gdGhlIHRyeSBibG9jaywgdGhlIGV4Y2VwdGlvbiBpcyBub3QgY2F1Z2h0IGJ5CnRoYXQgdHJ5IGNvbmRpdGlvbmFsIGFuZCBub25lIG9mIHRoZSBjYXRjaCBjbGF1c2VzIGlzIGV4ZWN1dGVkLiAgT25seSB0aGUKZmluYWxseSBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIHRha2VuLiAgVGhlIGV4Y2VwdGlvbiBwZW5kcyBkdXJpbmcgZXhlY3V0aW9uIG9mCnRoZSBmaW5hbGx5IGNsYXVzZS4gIEl0IGlzIHJlc3VtZWQgYXQgdGhlICI6ZW5kdHJ5Iiwgc28gdGhhdCBjb21tYW5kcyBhZnRlcgp0aGUgIjplbmR0cnkiIGFyZSBub3QgZXhlY3V0ZWQgYW5kIHRoZSBleGNlcHRpb24gbWlnaHQgYmUgY2F1Z2h0IGVsc2V3aGVyZSwKc2VlIHx0cnktbmVzdGluZ3wuCiAgIFdoZW4gZHVyaW5nIGV4ZWN1dGlvbiBvZiBhIGNhdGNoIGNsYXVzZSBhbm90aGVyIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZQpyZW1haW5pbmcgbGluZXMgaW4gdGhhdCBjYXRjaCBjbGF1c2UgYXJlIG5vdCBleGVjdXRlZC4JVGhlIG5ldyBleGNlcHRpb24gaXMKbm90IG1hdGNoZWQgYWdhaW5zdCB0aGUgcGF0dGVybnMgaW4gYW55IG9mIHRoZSAiOmNhdGNoIiBjb21tYW5kcyBvZiB0aGUgc2FtZQp0cnkgY29uZGl0aW9uYWwgYW5kIG5vbmUgb2YgaXRzIGNhdGNoIGNsYXVzZXMgaXMgdGFrZW4uICBJZiB0aGVyZSBpcywgaG93ZXZlciwKYSBmaW5hbGx5IGNsYXVzZSwgaXQgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgZXhjZXB0aW9uIHBlbmRzIGR1cmluZyBpdHMKZXhlY3V0aW9uLiAgVGhlIGNvbW1hbmRzIGZvbGxvd2luZyB0aGUgIjplbmR0cnkiIGFyZSBub3QgZXhlY3V0ZWQuICBUaGUgbmV3CmV4Y2VwdGlvbiBtaWdodCwgaG93ZXZlciwgYmUgY2F1Z2h0IGVsc2V3aGVyZSwgc2VlIHx0cnktbmVzdGluZ3wuCiAgIFdoZW4gZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgZmluYWxseSBjbGF1c2UgKGlmIHByZXNlbnQpIGFuIGV4Y2VwdGlvbiBpcwp0aHJvd24sIHRoZSByZW1haW5pbmcgbGluZXMgaW4gdGhlIGZpbmFsbHkgY2xhdXNlIGFyZSBza2lwcGVkLglJZiB0aGUgZmluYWxseQpjbGF1c2UgaGFzIGJlZW4gdGFrZW4gYmVjYXVzZSBvZiBhbiBleGNlcHRpb24gZnJvbSB0aGUgdHJ5IGJsb2NrIG9yIG9uZSBvZiB0aGUKY2F0Y2ggY2xhdXNlcywgdGhlIG9yaWdpbmFsIChwZW5kaW5nKSBleGNlcHRpb24gaXMgZGlzY2FyZGVkLiAgVGhlIGNvbW1hbmRzCmZvbGxvd2luZyB0aGUgIjplbmR0cnkiIGFyZSBub3QgZXhlY3V0ZWQsIGFuZCB0aGUgZXhjZXB0aW9uIGZyb20gdGhlIGZpbmFsbHkKY2xhdXNlIGlzIHByb3BhZ2F0ZWQgYW5kIGNhbiBiZSBjYXVnaHQgZWxzZXdoZXJlLCBzZWUgfHRyeS1uZXN0aW5nfC4KClRoZSBmaW5hbGx5IGNsYXVzZSBpcyBhbHNvIGV4ZWN1dGVkLCB3aGVuIGEgIjpicmVhayIgb3IgIjpjb250aW51ZSIgZm9yCmEgIjp3aGlsZSIgbG9vcCBlbmNsb3NpbmcgdGhlIGNvbXBsZXRlIHRyeSBjb25kaXRpb25hbCBpcyBleGVjdXRlZCBmcm9tIHRoZQp0cnkgYmxvY2sgb3IgYSBjYXRjaCBjbGF1c2UuICBPciB3aGVuIGEgIjpyZXR1cm4iIG9yICI6ZmluaXNoIiBpcyBleGVjdXRlZApmcm9tIHRoZSB0cnkgYmxvY2sgb3IgYSBjYXRjaCBjbGF1c2Ugb2YgYSB0cnkgY29uZGl0aW9uYWwgaW4gYSBmdW5jdGlvbiBvcgpzb3VyY2VkIHNjcmlwdCwgcmVzcGVjdGl2ZWx5LiAgVGhlICI6YnJlYWsiLCAiOmNvbnRpbnVlIiwgIjpyZXR1cm4iLCBvcgoiOmZpbmlzaCIgcGVuZHMgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgZmluYWxseSBjbGF1c2UgYW5kIGlzIHJlc3VtZWQgd2hlbiB0aGUKIjplbmR0cnkiIGlzIHJlYWNoZWQuICBJdCBpcywgaG93ZXZlciwgZGlzY2FyZGVkIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93bgpmcm9tIHRoZSBmaW5hbGx5IGNsYXVzZS4KICAgV2hlbiBhICI6YnJlYWsiIG9yICI6Y29udGludWUiIGZvciBhICI6d2hpbGUiIGxvb3AgZW5jbG9zaW5nIHRoZSBjb21wbGV0ZQp0cnkgY29uZGl0aW9uYWwgb3Igd2hlbiBhICI6cmV0dXJuIiBvciAiOmZpbmlzaCIgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGZpbmFsbHkKY2xhdXNlLCB0aGUgcmVzdCBvZiB0aGUgZmluYWxseSBjbGF1c2UgaXMgc2tpcHBlZCwgYW5kIHRoZSAiOmJyZWFrIiwKIjpjb250aW51ZSIsICI6cmV0dXJuIiBvciAiOmZpbmlzaCIgaXMgZXhlY3V0ZWQgYXMgdXN1YWwuICBJZiB0aGUgZmluYWxseQpjbGF1c2UgaGFzIGJlZW4gdGFrZW4gYmVjYXVzZSBvZiBhbiBleGNlcHRpb24gb3IgYW4gZWFybGllciAiOmJyZWFrIiwKIjpjb250aW51ZSIsICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giIGZyb20gdGhlIHRyeSBibG9jayBvciBhIGNhdGNoIGNsYXVzZSwKdGhpcyBwZW5kaW5nIGV4Y2VwdGlvbiBvciBjb21tYW5kIGlzIGRpc2NhcmRlZC4KCkZvciBleGFtcGxlcyBzZWUgfHRocm93LWNhdGNofCBhbmQgfHRyeS1maW5hbGx5fC4KCgpORVNUSU5HCU9GIFRSWSBDT05ESVRJT05BTFMJCQkJKnRyeS1uZXN0aW5nKgoKVHJ5IGNvbmRpdGlvbmFscyBjYW4gYmUgbmVzdGVkIGFyYml0cmFyaWx5LiAgVGhhdCBpcywgYSBjb21wbGV0ZSB0cnkKY29uZGl0aW9uYWwgY2FuIGJlIHB1dCBpbnRvIHRoZSB0cnkgYmxvY2ssIGEgY2F0Y2ggY2xhdXNlLCBvciB0aGUgZmluYWxseQpjbGF1c2Ugb2YgYW5vdGhlciB0cnkgY29uZGl0aW9uYWwuICBJZiB0aGUgaW5uZXIgdHJ5IGNvbmRpdGlvbmFsIGRvZXMgbm90CmNhdGNoIGFuIGV4Y2VwdGlvbiB0aHJvd24gaW4gaXRzIHRyeSBibG9jayBvciB0aHJvd3MgYSBuZXcgZXhjZXB0aW9uIGZyb20gb25lCm9mIGl0cyBjYXRjaCBjbGF1c2VzIG9yIGl0cyBmaW5hbGx5IGNsYXVzZSwgdGhlIG91dGVyIHRyeSBjb25kaXRpb25hbCBpcwpjaGVja2VkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgYWJvdmUuICBJZiB0aGUgaW5uZXIgdHJ5IGNvbmRpdGlvbmFsIGlzIGluIHRoZQp0cnkgYmxvY2sgb2YgdGhlIG91dGVyIHRyeSBjb25kaXRpb25hbCwgaXRzIGNhdGNoIGNsYXVzZXMgYXJlIGNoZWNrZWQsIGJ1dApvdGhlcndpc2Ugb25seSB0aGUgZmluYWxseSBjbGF1c2UgaXMgZXhlY3V0ZWQuCUl0IGRvZXMgbm90IG1hdHRlciBmb3IKbmVzdGluZywgd2hldGhlciB0aGUgaW5uZXIgdHJ5IGNvbmRpdGlvbmFsIGlzIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiB0aGUgb3V0ZXIKb25lLCBvciB3aGV0aGVyIHRoZSBvdXRlciBvbmUgc291cmNlcyBhIHNjcmlwdCBvciBjYWxscyBhIGZ1bmN0aW9uIGNvbnRhaW5pbmcKdGhlIGlubmVyIHRyeSBjb25kaXRpb25hbC4KCldoZW4gbm9uZSBvZiB0aGUgYWN0aXZlIHRyeSBjb25kaXRpb25hbHMgY2F0Y2hlcyBhbiBleGNlcHRpb24sIGp1c3QgdGhlaXIKZmluYWxseSBjbGF1c2VzIGFyZSBleGVjdXRlZC4gIFRoZXJlYWZ0ZXIsIHRoZSBzY3JpcHQgcHJvY2Vzc2luZyB0ZXJtaW5hdGVzLgpBbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiBjYXNlIG9mIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBleHBsaWNpdGx5CnRocm93biBieSBhICI6dGhyb3ciIGNvbW1hbmQuICBGb3IgdW5jYXVnaHQgZXJyb3IgYW5kIGludGVycnVwdCBleGNlcHRpb25zCmltcGxpY2l0bHkgcmFpc2VkIGJ5IFZpbSwgdGhlIGVycm9yIG1lc3NhZ2Uocykgb3IgaW50ZXJydXB0IG1lc3NhZ2UgYXJlIHNob3duCmFzIHVzdWFsLgoKRm9yIGV4YW1wbGVzIHNlZSB8dGhyb3ctY2F0Y2h8LgoKCkVYQU1JTklORyBFWENFUFRJT04gSEFORExJTkcgQ09ERQkJCSpleGNlcHQtZXhhbWluZSoKCkV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGNhbiBnZXQgdHJpY2t5LiAgSWYgeW91IGFyZSBpbiBkb3VidCB3aGF0IGhhcHBlbnMsIHNldAondmVyYm9zZScgdG8gMTMgb3IgdXNlIHRoZSAiOjEzdmVyYm9zZSIgY29tbWFuZCBtb2RpZmllciB3aGVuIHNvdXJjaW5nIHlvdXIKc2NyaXB0IGZpbGUuICBUaGVuIHlvdSBzZWUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLCBkaXNjYXJkZWQsIGNhdWdodCwgb3IKZmluaXNoZWQuICBXaGVuIHVzaW5nIGEgdmVyYm9zaXR5IGxldmVsIG9mIGF0IGxlYXN0IDE0LCB0aGluZ3MgcGVuZGluZyBpbgphIGZpbmFsbHkgY2xhdXNlIGFyZSBhbHNvIHNob3duLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGdpdmVuIGluIGRlYnVnIG1vZGUKKHNlZSB8ZGVidWctc2NyaXB0c3wpLgoKClRIUk9XSU5HIEFORCBDQVRDSElORyBFWENFUFRJT05TCQkJKnRocm93LWNhdGNoKgoKWW91IGNhbiB0aHJvdyBhbnkgbnVtYmVyIG9yIHN0cmluZyBhcyBhbiBleGNlcHRpb24uICBVc2UgdGhlIHw6dGhyb3d8IGNvbW1hbmQKYW5kIHBhc3MgdGhlIHZhbHVlIHRvIGJlIHRocm93biBhcyBhcmd1bWVudDogPgoJOnRocm93IDQ3MTEKCTp0aHJvdyAic3RyaW5nIgo8CQkJCQkJCSp0aHJvdy1leHByZXNzaW9uKgpZb3UgY2FuIGFsc28gc3BlY2lmeSBhbiBleHByZXNzaW9uIGFyZ3VtZW50LiAgVGhlIGV4cHJlc3Npb24gaXMgdGhlbiBldmFsdWF0ZWQKZmlyc3QsIGFuZCB0aGUgcmVzdWx0IGlzIHRocm93bjogPgoJOnRocm93IDQ3MDUgKyBzdHJsZW4oInN0cmluZyIpCgk6dGhyb3cgc3RycGFydCgic3RyaW5ncyIsIDAsIDYpCgpBbiBleGNlcHRpb24gbWlnaHQgYmUgdGhyb3duIGR1cmluZyBldmFsdWF0aW9uIG9mIHRoZSBhcmd1bWVudCBvZiB0aGUgIjp0aHJvdyIKY29tbWFuZC4gIFVubGVzcyBpdCBpcyBjYXVnaHQgdGhlcmUsIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgYWJhbmRvbmVkLgpUaGUgIjp0aHJvdyIgY29tbWFuZCB0aGVuIGRvZXMgbm90IHRocm93IGEgbmV3IGV4Y2VwdGlvbi4KICAgRXhhbXBsZTogPgoKCTpmdW5jdGlvbiEgRm9vKGFyZykKCTogIHRyeQoJOiAgICB0aHJvdyBhOmFyZwoJOiAgY2F0Y2ggL2Zvby8KCTogIGVuZHRyeQoJOiAgcmV0dXJuIDEKCTplbmRmdW5jdGlvbgoJOgoJOmZ1bmN0aW9uISBCYXIoKQoJOiAgZWNobyAiaW4gQmFyIgoJOiAgcmV0dXJuIDQ3MTAKCTplbmRmdW5jdGlvbgoJOgoJOnRocm93IEZvbygiYXJyZ2giKSArIEJhcigpCgpUaGlzIHRocm93cyAiYXJyZ2giLCBhbmQgImluIEJhciIgaXMgbm90IGRpc3BsYXllZCBzaW5jZSBCYXIoKSBpcyBub3QKZXhlY3V0ZWQuID4KCTp0aHJvdyBGb28oImZvbyIpICsgQmFyKCkKaG93ZXZlciBkaXNwbGF5cyAiaW4gQmFyIiBhbmQgdGhyb3dzIDQ3MTEuCgpBbnkgb3RoZXIgY29tbWFuZCB0aGF0IHRha2VzIGFuIGV4cHJlc3Npb24gYXMgYXJndW1lbnQgbWlnaHQgYWxzbyBiZQphYmFuZG9uZWQgYnkgYW4gKHVuY2F1Z2h0KSBleGNlcHRpb24gZHVyaW5nIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24uCVRoZQpleGNlcHRpb24gaXMgdGhlbiBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgb2YgdGhlIGNvbW1hbmQuCiAgIEV4YW1wbGU6ID4KCgk6aWYgRm9vKCJhcnJnaCIpCgk6ICBlY2hvICJ0aGVuIgoJOmVsc2UKCTogIGVjaG8gImVsc2UiCgk6ZW5kaWYKCkhlcmUgbmVpdGhlciBvZiAidGhlbiIgb3IgImVsc2UiIGlzIGRpc3BsYXllZC4KCgkJCQkJCQkqY2F0Y2gtb3JkZXIqCkV4Y2VwdGlvbnMgY2FuIGJlIGNhdWdodCBieSBhIHRyeSBjb25kaXRpb25hbCB3aXRoIG9uZSBvciBtb3JlIHw6Y2F0Y2h8CmNvbW1hbmRzLCBzZWUgfHRyeS1jb25kaXRpb25hbHN8LiAgIFRoZSB2YWx1ZXMgdG8gYmUgY2F1Z2h0IGJ5IGVhY2ggIjpjYXRjaCIKY29tbWFuZCBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgcGF0dGVybiBhcmd1bWVudC4gIFRoZSBzdWJzZXF1ZW50IGNhdGNoIGNsYXVzZQpnZXRzIGV4ZWN1dGVkIHdoZW4gYSBtYXRjaGluZyBleGNlcHRpb24gaXMgY2F1Z2h0LgogICBFeGFtcGxlOiA+CgoJOmZ1bmN0aW9uISBGb28odmFsdWUpCgk6ICB0cnkKCTogICAgdGhyb3cgYTp2YWx1ZQoJOiAgY2F0Y2ggL15cZFwrJC8KCTogICAgZWNobyAiTnVtYmVyIHRocm93biIKCTogIGNhdGNoIC8uKi8KCTogICAgZWNobyAiU3RyaW5nIHRocm93biIKCTogIGVuZHRyeQoJOmVuZGZ1bmN0aW9uCgk6Cgk6Y2FsbCBGb28oMHgxMjY3KQoJOmNhbGwgRm9vKCdzdHJpbmcnKQoKVGhlIGZpcnN0IGNhbGwgdG8gRm9vKCkgZGlzcGxheXMgIk51bWJlciB0aHJvd24iLCB0aGUgc2Vjb25kICJTdHJpbmcgdGhyb3duIi4KQW4gZXhjZXB0aW9uIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgIjpjYXRjaCIgY29tbWFuZHMgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCnNwZWNpZmllZC4gIE9ubHkgdGhlIGZpcnN0IG1hdGNoIGNvdW50cy4gIFNvIHlvdSBzaG91bGQgcGxhY2UgdGhlIG1vcmUKc3BlY2lmaWMgIjpjYXRjaCIgZmlyc3QuICBUaGUgZm9sbG93aW5nIG9yZGVyIGRvZXMgbm90IG1ha2Ugc2Vuc2U6ID4KCgk6ICBjYXRjaCAvLiovCgk6ICAgIGVjaG8gIlN0cmluZyB0aHJvd24iCgk6ICBjYXRjaCAvXlxkXCskLwoJOiAgICBlY2hvICJOdW1iZXIgdGhyb3duIgoKVGhlIGZpcnN0ICI6Y2F0Y2giIGhlcmUgbWF0Y2hlcyBhbHdheXMsIHNvIHRoYXQgdGhlIHNlY29uZCBjYXRjaCBjbGF1c2UgaXMKbmV2ZXIgdGFrZW4uCgoJCQkJCQkJKnRocm93LXZhcmlhYmxlcyoKSWYgeW91IGNhdGNoIGFuIGV4Y2VwdGlvbiBieSBhIGdlbmVyYWwgcGF0dGVybiwgeW91IG1heSBhY2Nlc3MgdGhlIGV4YWN0IHZhbHVlCmluIHRoZSB2YXJpYWJsZSB8djpleGNlcHRpb258OiA+CgoJOiAgY2F0Y2ggL15cZFwrJC8KCTogICAgZWNobyAiTnVtYmVyIHRocm93bi4gIFZhbHVlIGlzIiB2OmV4Y2VwdGlvbgoKWW91IG1heSBhbHNvIGJlIGludGVyZXN0ZWQgd2hlcmUgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uICBUaGlzIGlzIHN0b3JlZCBpbgp8djp0aHJvd3BvaW50fC4gIE5vdGUgdGhhdCAidjpleGNlcHRpb24iIGFuZCAidjp0aHJvd3BvaW50IiBhcmUgdmFsaWQgZm9yIHRoZQpleGNlcHRpb24gbW9zdCByZWNlbnRseSBjYXVnaHQgYXMgbG9uZyBpdCBpcyBub3QgZmluaXNoZWQuCiAgIEV4YW1wbGU6ID4KCgk6ZnVuY3Rpb24hIENhdWdodCgpCgk6ICBpZiB2OmV4Y2VwdGlvbiAhPSAiIgoJOiAgICBlY2hvICdDYXVnaHQgIicgLiB2OmV4Y2VwdGlvbiAuICciIGluICcgLiB2OnRocm93cG9pbnQKCTogIGVsc2UKCTogICAgZWNobyAnTm90aGluZyBjYXVnaHQnCgk6ICBlbmRpZgoJOmVuZGZ1bmN0aW9uCgk6Cgk6ZnVuY3Rpb24hIEZvbygpCgk6ICB0cnkKCTogICAgdHJ5Cgk6ICAgICAgdHJ5Cgk6CSB0aHJvdyA0NzExCgk6ICAgICAgZmluYWxseQoJOgkgY2FsbCBDYXVnaHQoKQoJOiAgICAgIGVuZHRyeQoJOiAgICBjYXRjaCAvLiovCgk6ICAgICAgY2FsbCBDYXVnaHQoKQoJOiAgICAgIHRocm93ICJvb3BzIgoJOiAgICBlbmR0cnkKCTogIGNhdGNoIC8uKi8KCTogICAgY2FsbCBDYXVnaHQoKQoJOiAgZmluYWxseQoJOiAgICBjYWxsIENhdWdodCgpCgk6ICBlbmR0cnkKCTplbmRmdW5jdGlvbgoJOgoJOmNhbGwgRm9vKCkKClRoaXMgZGlzcGxheXMgPgoKCU5vdGhpbmcgY2F1Z2h0CglDYXVnaHQgIjQ3MTEiIGluIGZ1bmN0aW9uIEZvbywgbGluZSA0CglDYXVnaHQgIm9vcHMiIGluIGZ1bmN0aW9uIEZvbywgbGluZSAxMAoJTm90aGluZyBjYXVnaHQKCkEgcHJhY3RpY2FsIGV4YW1wbGU6ICBUaGUgZm9sbG93aW5nIGNvbW1hbmQgIjpMaW5lTnVtYmVyIiBkaXNwbGF5cyB0aGUgbGluZQpudW1iZXIgaW4gdGhlIHNjcmlwdCBvciBmdW5jdGlvbiB3aGVyZSBpdCBoYXMgYmVlbiB1c2VkOiA+CgoJOmZ1bmN0aW9uISBMaW5lTnVtYmVyKCkKCTogICAgcmV0dXJuIHN1YnN0aXR1dGUodjp0aHJvd3BvaW50LCAnLipcRFwoXGRcK1wpLionLCAnXDEnLCAiIikKCTplbmRmdW5jdGlvbgoJOmNvbW1hbmQhIExpbmVOdW1iZXIgdHJ5IHwgdGhyb3cgIiIgfCBjYXRjaCB8IGVjaG8gTGluZU51bWJlcigpIHwgZW5kdHJ5CjwKCQkJCQkJCSp0cnktbmVzdGVkKgpBbiBleGNlcHRpb24gdGhhdCBpcyBub3QgY2F1Z2h0IGJ5IGEgdHJ5IGNvbmRpdGlvbmFsIGNhbiBiZSBjYXVnaHQgYnkKYSBzdXJyb3VuZGluZyB0cnkgY29uZGl0aW9uYWw6ID4KCgk6dHJ5Cgk6ICB0cnkKCTogICAgdGhyb3cgImZvbyIKCTogIGNhdGNoIC9mb29iYXIvCgk6ICAgIGVjaG8gImZvb2JhciIKCTogIGZpbmFsbHkKCTogICAgZWNobyAiaW5uZXIgZmluYWxseSIKCTogIGVuZHRyeQoJOmNhdGNoIC9mb28vCgk6ICBlY2hvICJmb28iCgk6ZW5kdHJ5CgpUaGUgaW5uZXIgdHJ5IGNvbmRpdGlvbmFsIGRvZXMgbm90IGNhdGNoIHRoZSBleGNlcHRpb24sIGp1c3QgaXRzIGZpbmFsbHkKY2xhdXNlIGlzIGV4ZWN1dGVkLiAgVGhlIGV4Y2VwdGlvbiBpcyB0aGVuIGNhdWdodCBieSB0aGUgb3V0ZXIgdHJ5CmNvbmRpdGlvbmFsLiAgVGhlIGV4YW1wbGUgZGlzcGxheXMgImlubmVyIGZpbmFsbHkiIGFuZCB0aGVuICJmb28iLgoKCQkJCQkJCSp0aHJvdy1mcm9tLWNhdGNoKgpZb3UgY2FuIGNhdGNoIGFuIGV4Y2VwdGlvbiBhbmQgdGhyb3cgYSBuZXcgb25lIHRvIGJlIGNhdWdodCBlbHNld2hlcmUgZnJvbSB0aGUKY2F0Y2ggY2xhdXNlOiA+CgoJOmZ1bmN0aW9uISBGb28oKQoJOiAgdGhyb3cgImZvbyIKCTplbmRmdW5jdGlvbgoJOgoJOmZ1bmN0aW9uISBCYXIoKQoJOiAgdHJ5Cgk6ICAgIGNhbGwgRm9vKCkKCTogIGNhdGNoIC9mb28vCgk6ICAgIGVjaG8gIkNhdWdodCBmb28sIHRocm93IGJhciIKCTogICAgdGhyb3cgImJhciIKCTogIGVuZHRyeQoJOmVuZGZ1bmN0aW9uCgk6Cgk6dHJ5Cgk6ICBjYWxsIEJhcigpCgk6Y2F0Y2ggLy4qLwoJOiAgZWNobyAiQ2F1Z2h0IiB2OmV4Y2VwdGlvbgoJOmVuZHRyeQoKVGhpcyBkaXNwbGF5cyAiQ2F1Z2h0IGZvbywgdGhyb3cgYmFyIiBhbmQgdGhlbiAiQ2F1Z2h0IGJhciIuCgoJCQkJCQkJKnJldGhyb3cqClRoZXJlIGlzIG5vIHJlYWwgcmV0aHJvdyBpbiB0aGUgVmltIHNjcmlwdCBsYW5ndWFnZSwgYnV0IHlvdSBtYXkgdGhyb3cKInY6ZXhjZXB0aW9uIiBpbnN0ZWFkOiA+CgoJOmZ1bmN0aW9uISBCYXIoKQoJOiAgdHJ5Cgk6ICAgIGNhbGwgRm9vKCkKCTogIGNhdGNoIC8uKi8KCTogICAgZWNobyAiUmV0aHJvdyIgdjpleGNlcHRpb24KCTogICAgdGhyb3cgdjpleGNlcHRpb24KCTogIGVuZHRyeQoJOmVuZGZ1bmN0aW9uCjwJCQkJCQkJKnRyeS1lY2hvZXJyKgpOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gInJldGhyb3ciIFZpbSBlcnJvciBvciBpbnRlcnJ1cHQKZXhjZXB0aW9ucywgYmVjYXVzZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZmFrZSBWaW0gaW50ZXJuYWwgZXhjZXB0aW9ucy4KVHJ5aW5nIHNvIGNhdXNlcyBhbiBlcnJvciBleGNlcHRpb24uICBZb3Ugc2hvdWxkIHRocm93IHlvdXIgb3duIGV4Y2VwdGlvbgpkZW5vdGluZyB0aGUgc2l0dWF0aW9uLiAgSWYgeW91IHdhbnQgdG8gY2F1c2UgYSBWaW0gZXJyb3IgZXhjZXB0aW9uIGNvbnRhaW5pbmcKdGhlIG9yaWdpbmFsIGVycm9yIGV4Y2VwdGlvbiB2YWx1ZSwgeW91IGNhbiB1c2UgdGhlIHw6ZWNob2VycnwgY29tbWFuZDogPgoKCTp0cnkKCTogIHRyeQoJOiAgICBhc2RmCgk6ICBjYXRjaCAvLiovCgk6ICAgIGVjaG9lcnIgdjpleGNlcHRpb24KCTogIGVuZHRyeQoJOmNhdGNoIC8uKi8KCTogIGVjaG8gdjpleGNlcHRpb24KCTplbmR0cnkKClRoaXMgY29kZSBkaXNwbGF5cwoKCVZpbShlY2hvZXJyKTpWaW06RTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kOglhc2RmIH4KCgpDTEVBTlVQIENPREUJCQkJCQkqdHJ5LWZpbmFsbHkqCgpTY3JpcHRzIG9mdGVuIGNoYW5nZSBnbG9iYWwgc2V0dGluZ3MgYW5kIHJlc3RvcmUgdGhlbSBhdCB0aGVpciBlbmQuICBJZiB0aGUKdXNlciBob3dldmVyIGludGVycnVwdHMgdGhlIHNjcmlwdCBieSBwcmVzc2luZyBDVFJMLUMsIHRoZSBzZXR0aW5ncyByZW1haW4gaW4KYW4gaW5jb25zaXN0ZW50IHN0YXRlLglUaGUgc2FtZSBtYXkgaGFwcGVuIHRvIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgcGhhc2Ugb2YKYSBzY3JpcHQgd2hlbiBhbiBlcnJvciBvY2N1cnMgb3IgeW91IGV4cGxpY2l0bHkgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGhvdXQKY2F0Y2hpbmcgaXQuICBZb3UgY2FuIHNvbHZlIHRoZXNlIHByb2JsZW1zIGJ5IHVzaW5nIGEgdHJ5IGNvbmRpdGlvbmFsIHdpdGgKYSBmaW5hbGx5IGNsYXVzZSBmb3IgcmVzdG9yaW5nIHRoZSBzZXR0aW5ncy4gIEl0cyBleGVjdXRpb24gaXMgZ3VhcmFudGVlZCBvbgpub3JtYWwgY29udHJvbCBmbG93LCBvbiBlcnJvciwgb24gYW4gZXhwbGljaXQgIjp0aHJvdyIsIGFuZCBvbiBpbnRlcnJ1cHQuCihOb3RlIHRoYXQgZXJyb3JzIGFuZCBpbnRlcnJ1cHRzIGZyb20gaW5zaWRlIHRoZSB0cnkgY29uZGl0aW9uYWwgYXJlIGNvbnZlcnRlZAp0byBleGNlcHRpb25zLglXaGVuIG5vdCBjYXVnaHQsIHRoZXkgdGVybWluYXRlIHRoZSBzY3JpcHQgYWZ0ZXIgdGhlIGZpbmFsbHkKY2xhdXNlIGhhcyBiZWVuIGV4ZWN1dGVkLikKRXhhbXBsZTogPgoKCTp0cnkKCTogIGxldCBzOnNhdmVkX3RzID0gJnRzCgk6ICBzZXQgdHM9MTcKCToKCTogICIgRG8gdGhlIGhhcmQgd29yayBoZXJlLgoJOgoJOmZpbmFsbHkKCTogIGxldCAmdHMgPSBzOnNhdmVkX3RzCgk6ICB1bmxldCBzOnNhdmVkX3RzCgk6ZW5kdHJ5CgpUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBsb2NhbGx5IHdoZW5ldmVyIGEgZnVuY3Rpb24gb3IgcGFydCBvZiBhIHNjcmlwdApjaGFuZ2VzIGdsb2JhbCBzZXR0aW5ncyB3aGljaCBuZWVkIHRvIGJlIHJlc3RvcmVkIG9uIGZhaWx1cmUgb3Igbm9ybWFsIGV4aXQgb2YKdGhhdCBmdW5jdGlvbiBvciBzY3JpcHQgcGFydC4KCgkJCQkJCQkqYnJlYWstZmluYWxseSoKQ2xlYW51cCBjb2RlIHdvcmtzIGFsc28gd2hlbiB0aGUgdHJ5IGJsb2NrIG9yIGEgY2F0Y2ggY2xhdXNlIGlzIGxlZnQgYnkKYSAiOmNvbnRpbnVlIiwgIjpicmVhayIsICI6cmV0dXJuIiwgb3IgIjpmaW5pc2giLgogICBFeGFtcGxlOiA+CgoJOmxldCBmaXJzdCA9IDEKCTp3aGlsZSAxCgk6ICB0cnkKCTogICAgaWYgZmlyc3QKCTogICAgICBlY2hvICJmaXJzdCIKCTogICAgICBsZXQgZmlyc3QgPSAwCgk6ICAgICAgY29udGludWUKCTogICAgZWxzZQoJOiAgICAgIHRocm93ICJzZWNvbmQiCgk6ICAgIGVuZGlmCgk6ICBjYXRjaCAvLiovCgk6ICAgIGVjaG8gdjpleGNlcHRpb24KCTogICAgYnJlYWsKCTogIGZpbmFsbHkKCTogICAgZWNobyAiY2xlYW51cCIKCTogIGVuZHRyeQoJOiAgZWNobyAic3RpbGwgaW4gd2hpbGUiCgk6ZW5kd2hpbGUKCTplY2hvICJlbmQiCgpUaGlzIGRpc3BsYXlzICJmaXJzdCIsICJjbGVhbnVwIiwgInNlY29uZCIsICJjbGVhbnVwIiwgYW5kICJlbmQiLiA+CgoJOmZ1bmN0aW9uISBGb28oKQoJOiAgdHJ5Cgk6ICAgIHJldHVybiA0NzExCgk6ICBmaW5hbGx5Cgk6ICAgIGVjaG8gImNsZWFudXBcbiIKCTogIGVuZHRyeQoJOiAgZWNobyAiRm9vIHN0aWxsIGFjdGl2ZSIKCTplbmRmdW5jdGlvbgoJOgoJOmVjaG8gRm9vKCkgInJldHVybmVkIGJ5IEZvbyIKClRoaXMgZGlzcGxheXMgImNsZWFudXAiIGFuZCAiNDcxMSByZXR1cm5lZCBieSBGb28iLiAgWW91IGRvbid0IG5lZWQgdG8gYWRkIGFuCmV4dHJhICI6cmV0dXJuIiBpbiB0aGUgZmluYWxseSBjbGF1c2UuCShBYm92ZSBhbGwsIHRoaXMgd291bGQgb3ZlcnJpZGUgdGhlCnJldHVybiB2YWx1ZS4pCgoJCQkJCQkJKmV4Y2VwdC1mcm9tLWZpbmFsbHkqClVzaW5nIGVpdGhlciBvZiAiOmNvbnRpbnVlIiwgIjpicmVhayIsICI6cmV0dXJuIiwgIjpmaW5pc2giLCBvciAiOnRocm93IiBpbgphIGZpbmFsbHkgY2xhdXNlIGlzIHBvc3NpYmxlLCBidXQgbm90IHJlY29tbWVuZGVkIHNpbmNlIGl0IGFiYW5kb25zIHRoZQpjbGVhbnVwIGFjdGlvbnMgZm9yIHRoZSB0cnkgY29uZGl0aW9uYWwuICBCdXQsIG9mIGNvdXJzZSwgaW50ZXJydXB0IGFuZCBlcnJvcgpleGNlcHRpb25zIG1pZ2h0IGdldCByYWlzZWQgZnJvbSBhIGZpbmFsbHkgY2xhdXNlLgogICBFeGFtcGxlIHdoZXJlIGFuIGVycm9yIGluIHRoZSBmaW5hbGx5IGNsYXVzZSBzdG9wcyBhbiBpbnRlcnJ1cHQgZnJvbQp3b3JraW5nIGNvcnJlY3RseTogPgoKCTp0cnkKCTogIHRyeQoJOiAgICBlY2hvICJQcmVzcyBDVFJMLUMgZm9yIGludGVycnVwdCIKCTogICAgd2hpbGUgMQoJOiAgICBlbmR3aGlsZQoJOiAgZmluYWxseQoJOiAgICB1bmxldCBub3ZhcgoJOiAgZW5kdHJ5Cgk6Y2F0Y2ggL25vdmFyLwoJOmVuZHRyeQoJOmVjaG8gIlNjcmlwdCBzdGlsbCBydW5uaW5nIgoJOnNsZWVwIDEKCklmIHlvdSBuZWVkIHRvIHB1dCBjb21tYW5kcyB0aGF0IGNvdWxkIGZhaWwgaW50byBhIGZpbmFsbHkgY2xhdXNlLCB5b3Ugc2hvdWxkCnRoaW5rIGFib3V0IGNhdGNoaW5nIG9yIGlnbm9yaW5nIHRoZSBlcnJvcnMgaW4gdGhlc2UgY29tbWFuZHMsIHNlZQp8Y2F0Y2gtZXJyb3JzfCBhbmQgfGlnbm9yZS1lcnJvcnN8LgoKCkNBVENISU5HIEVSUk9SUwkJCQkJCSpjYXRjaC1lcnJvcnMqCgpJZiB5b3Ugd2FudCB0byBjYXRjaCBzcGVjaWZpYyBlcnJvcnMsIHlvdSBqdXN0IGhhdmUgdG8gcHV0IHRoZSBjb2RlIHRvIGJlCndhdGNoZWQgaW4gYSB0cnkgYmxvY2sgYW5kIGFkZCBhIGNhdGNoIGNsYXVzZSBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUKcHJlc2VuY2Ugb2YgdGhlIHRyeSBjb25kaXRpb25hbCBjYXVzZXMgYWxsIGVycm9ycyB0byBiZSBjb252ZXJ0ZWQgdG8gYW4KZXhjZXB0aW9uLiAgTm8gbWVzc2FnZSBpcyBkaXNwbGF5ZWQgYW5kIHx2OmVycm1zZ3wgaXMgbm90IHNldCB0aGVuLiAgVG8gZmluZAp0aGUgcmlnaHQgcGF0dGVybiBmb3IgdGhlICI6Y2F0Y2giIGNvbW1hbmQsIHlvdSBoYXZlIHRvIGtub3cgaG93IHRoZSBmb3JtYXQgb2YKdGhlIGVycm9yIGV4Y2VwdGlvbiBpcy4KICAgRXJyb3IgZXhjZXB0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiA+CgoJVmltKHtjbWRuYW1lfSk6e2Vycm1zZ30Kb3IgPgoJVmltOntlcnJtc2d9Cgp7Y21kbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdGhhdCBmYWlsZWQ7IHRoZSBzZWNvbmQgZm9ybSBpcyB1c2VkIHdoZW4KdGhlIGNvbW1hbmQgbmFtZSBpcyBub3Qga25vd24uCXtlcnJtc2d9IGlzIHRoZSBlcnJvciBtZXNzYWdlIHVzdWFsbHkgcHJvZHVjZWQKd2hlbiB0aGUgZXJyb3Igb2NjdXJzIG91dHNpZGUgdHJ5IGNvbmRpdGlvbmFscy4gIEl0IGFsd2F5cyBiZWdpbnMgd2l0aAphIGNhcGl0YWwgIkUiLCBmb2xsb3dlZCBieSBhIHR3byBvciB0aHJlZS1kaWdpdCBlcnJvciBudW1iZXIsIGEgY29sb24sIGFuZAphIHNwYWNlLgoKRXhhbXBsZXM6CgpUaGUgY29tbWFuZCA+Cgk6dW5sZXQgbm92YXIKbm9ybWFsbHkgcHJvZHVjZXMgdGhlIGVycm9yIG1lc3NhZ2UgPgoJRTEwODogTm8gc3VjaCB2YXJpYWJsZTogIm5vdmFyIgp3aGljaCBpcyBjb252ZXJ0ZWQgaW5zaWRlIHRyeSBjb25kaXRpb25hbHMgdG8gYW4gZXhjZXB0aW9uID4KCVZpbSh1bmxldCk6RTEwODogTm8gc3VjaCB2YXJpYWJsZTogIm5vdmFyIgoKVGhlIGNvbW1hbmQgPgoJOmR3aW0Kbm9ybWFsbHkgcHJvZHVjZXMgdGhlIGVycm9yIG1lc3NhZ2UgPgoJRTQ5MjogTm90IGFuIGVkaXRvciBjb21tYW5kOiBkd2ltCndoaWNoIGlzIGNvbnZlcnRlZCBpbnNpZGUgdHJ5IGNvbmRpdGlvbmFscyB0byBhbiBleGNlcHRpb24gPgoJVmltOkU0OTI6IE5vdCBhbiBlZGl0b3IgY29tbWFuZDogZHdpbQoKWW91IGNhbiBjYXRjaCBhbGwgIjp1bmxldCIgZXJyb3JzIGJ5IGEgPgoJOmNhdGNoIC9eVmltKHVubGV0KTovCm9yIGFsbCBlcnJvcnMgZm9yIG1pc3NwZWxsZWQgY29tbWFuZCBuYW1lcyBieSBhID4KCTpjYXRjaCAvXlZpbTpFNDkyOi8KClNvbWUgZXJyb3IgbWVzc2FnZXMgbWF5IGJlIHByb2R1Y2VkIGJ5IGRpZmZlcmVudCBjb21tYW5kczogPgoJOmZ1bmN0aW9uIG5vZnVuYwphbmQgPgoJOmRlbGZ1bmN0aW9uIG5vZnVuYwpib3RoIHByb2R1Y2UgdGhlIGVycm9yIG1lc3NhZ2UgPgoJRTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiBub2Z1bmMKd2hpY2ggaXMgY29udmVydGVkIGluc2lkZSB0cnkgY29uZGl0aW9uYWxzIHRvIGFuIGV4Y2VwdGlvbiA+CglWaW0oZnVuY3Rpb24pOkUxMjg6IEZ1bmN0aW9uIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgY2FwaXRhbDogbm9mdW5jCm9yID4KCVZpbShkZWxmdW5jdGlvbik6RTEyODogRnVuY3Rpb24gbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBjYXBpdGFsOiBub2Z1bmMKcmVzcGVjdGl2ZWx5LiAgWW91IGNhbiBjYXRjaCB0aGUgZXJyb3IgYnkgaXRzIG51bWJlciBpbmRlcGVuZGVudGx5IG9uIHRoZQpjb21tYW5kIHRoYXQgY2F1c2VkIGl0IGlmIHlvdSB1c2UgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOiA+Cgk6Y2F0Y2ggL15WaW0oXGFcKyk6RTEyODovCgpTb21lIGNvbW1hbmRzIGxpa2UgPgoJOmxldCB4ID0gbm92YXIKcHJvZHVjZSBtdWx0aXBsZSBlcnJvciBtZXNzYWdlcywgaGVyZTogPgoJRTEyMTogVW5kZWZpbmVkIHZhcmlhYmxlOiBub3ZhcgoJRTE1OiBJbnZhbGlkIGV4cHJlc3Npb246ICBub3ZhcgpPbmx5IHRoZSBmaXJzdCBpcyB1c2VkIGZvciB0aGUgZXhjZXB0aW9uIHZhbHVlLCBzaW5jZSBpdCBpcyB0aGUgbW9zdCBzcGVjaWZpYwpvbmUgKHNlZSB8ZXhjZXB0LXNldmVyYWwtZXJyb3JzfCkuICBTbyB5b3UgY2FuIGNhdGNoIGl0IGJ5ID4KCTpjYXRjaCAvXlZpbShcYVwrKTpFMTIxOi8KCllvdSBjYW4gY2F0Y2ggYWxsIGVycm9ycyByZWxhdGVkIHRvIHRoZSBuYW1lICJub2Z1bmMiIGJ5ID4KCTpjYXRjaCAvXDxub2Z1bmNcPi8KCllvdSBjYW4gY2F0Y2ggYWxsIFZpbSBlcnJvcnMgaW4gdGhlICI6d3JpdGUiIGFuZCAiOnJlYWQiIGNvbW1hbmRzIGJ5ID4KCTpjYXRjaCAvXlZpbShcKHdyaXRlXHxyZWFkXCkpOkVcZFwrOi8KCllvdSBjYW4gY2F0Y2ggYWxsIFZpbSBlcnJvcnMgYnkgdGhlIHBhdHRlcm4gPgoJOmNhdGNoIC9eVmltXCgoXGFcKylcKVw9OkVcZFwrOi8KPAoJCQkJCQkJKmNhdGNoLXRleHQqCk5PVEU6IFlvdSBzaG91bGQgbmV2ZXIgY2F0Y2ggdGhlIGVycm9yIG1lc3NhZ2UgdGV4dCBpdHNlbGY6ID4KCTpjYXRjaCAvTm8gc3VjaCB2YXJpYWJsZS8Kb25seSB3b3JrcyBpbiB0aGUgRW5nbGlzaCBsb2NhbGUsIGJ1dCBub3Qgd2hlbiB0aGUgdXNlciBoYXMgc2VsZWN0ZWQKYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYnkgdGhlIHw6bGFuZ3VhZ2V8IGNvbW1hbmQuICBJdCBpcyBob3dldmVyIGhlbHBmdWwgdG8KY2l0ZSB0aGUgbWVzc2FnZSB0ZXh0IGluIGEgY29tbWVudDogPgoJOmNhdGNoIC9eVmltKFxhXCspOkUxMDg6LyAgICIgTm8gc3VjaCB2YXJpYWJsZQoKCklHTk9SSU5HIEVSUk9SUwkJCQkJCSppZ25vcmUtZXJyb3JzKgoKWW91IGNhbiBpZ25vcmUgZXJyb3JzIGluIGEgc3BlY2lmaWMgVmltIGNvbW1hbmQgYnkgY2F0Y2hpbmcgdGhlbSBsb2NhbGx5OiA+CgoJOnRyeQoJOiAgd3JpdGUKCTpjYXRjaAoJOmVuZHRyeQoKQnV0IHlvdSBhcmUgc3Ryb25nbHkgcmVjb21tZW5kZWQgTk9UIHRvIHVzZSB0aGlzIHNpbXBsZSBmb3JtLCBzaW5jZSBpdCBjb3VsZApjYXRjaCBtb3JlIHRoYW4geW91IHdhbnQuICBXaXRoIHRoZSAiOndyaXRlIiBjb21tYW5kLCBzb21lIGF1dG9jb21tYW5kcyBjb3VsZApiZSBleGVjdXRlZCBhbmQgY2F1c2UgZXJyb3JzIG5vdCByZWxhdGVkIHRvIHdyaXRpbmcsIGZvciBpbnN0YW5jZTogPgoKCTphdSBCdWZXcml0ZVByZSAqIHVubGV0IG5vdmFyCgpUaGVyZSBjb3VsZCBldmVuIGJlIHN1Y2ggZXJyb3JzIHlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBhcyBhIHNjcmlwdAp3cml0ZXI6IGEgdXNlciBvZiB5b3VyIHNjcmlwdCBtaWdodCBoYXZlIGRlZmluZWQgc3VjaCBhdXRvY29tbWFuZHMuICBZb3Ugd291bGQKdGhlbiBoaWRlIHRoZSBlcnJvciBmcm9tIHRoZSB1c2VyLgogICBJdCBpcyBtdWNoIGJldHRlciB0byB1c2UgPgoKCTp0cnkKCTogIHdyaXRlCgk6Y2F0Y2ggL15WaW0od3JpdGUpOi8KCTplbmR0cnkKCndoaWNoIG9ubHkgY2F0Y2hlcyByZWFsIHdyaXRlIGVycm9ycy4gIFNvIGNhdGNoIG9ubHkgd2hhdCB5b3UnZCBsaWtlIHRvIGlnbm9yZQppbnRlbnRpb25hbGx5LgoKRm9yIGEgc2luZ2xlIGNvbW1hbmQgdGhhdCBkb2VzIG5vdCBjYXVzZSBleGVjdXRpb24gb2YgYXV0b2NvbW1hbmRzLCB5b3UgY291bGQKZXZlbiBzdXBwcmVzcyB0aGUgY29udmVyc2lvbiBvZiBlcnJvcnMgdG8gZXhjZXB0aW9ucyBieSB0aGUgIjpzaWxlbnQhIgpjb21tYW5kOiA+Cgk6c2lsZW50ISBudW5tYXAgawpUaGlzIHdvcmtzIGFsc28gd2hlbiBhIHRyeSBjb25kaXRpb25hbCBpcyBhY3RpdmUuCgoKQ0FUQ0hJTkcgSU5URVJSVVBUUwkJCQkJKmNhdGNoLWludGVycnVwdCoKCldoZW4gdGhlcmUgYXJlIGFjdGl2ZSB0cnkgY29uZGl0aW9uYWxzLCBhbiBpbnRlcnJ1cHQgKENUUkwtQykgaXMgY29udmVydGVkIHRvCnRoZSBleGNlcHRpb24gIlZpbTpJbnRlcnJ1cHQiLglZb3UgY2FuIGNhdGNoIGl0IGxpa2UgZXZlcnkgZXhjZXB0aW9uLglUaGUKc2NyaXB0IGlzIG5vdCB0ZXJtaW5hdGVkLCB0aGVuLgogICBFeGFtcGxlOiA+CgoJOmZ1bmN0aW9uISBUQVNLMSgpCgk6ICBzbGVlcCAxMAoJOmVuZGZ1bmN0aW9uCgoJOmZ1bmN0aW9uISBUQVNLMigpCgk6ICBzbGVlcCAyMAoJOmVuZGZ1bmN0aW9uCgoJOndoaWxlIDEKCTogIGxldCBjb21tYW5kID0gaW5wdXQoIlR5cGUgYSBjb21tYW5kOiAiKQoJOiAgdHJ5Cgk6ICAgIGlmIGNvbW1hbmQgPT0gIiIKCTogICAgICBjb250aW51ZQoJOiAgICBlbHNlaWYgY29tbWFuZCA9PSAiRU5EIgoJOiAgICAgIGJyZWFrCgk6ICAgIGVsc2VpZiBjb21tYW5kID09ICJUQVNLMSIKCTogICAgICBjYWxsIFRBU0sxKCkKCTogICAgZWxzZWlmIGNvbW1hbmQgPT0gIlRBU0syIgoJOiAgICAgIGNhbGwgVEFTSzIoKQoJOiAgICBlbHNlCgk6ICAgICAgZWNobyAiXG5JbGxlZ2FsIGNvbW1hbmQ6IiBjb21tYW5kCgk6ICAgICAgY29udGludWUKCTogICAgZW5kaWYKCTogIGNhdGNoIC9eVmltOkludGVycnVwdCQvCgk6ICAgIGVjaG8gIlxuQ29tbWFuZCBpbnRlcnJ1cHRlZCIKCTogICAgIiBDYXVnaHQgdGhlIGludGVycnVwdC4gIENvbnRpbnVlIHdpdGggbmV4dCBwcm9tcHQuCgk6ICBlbmR0cnkKCTplbmR3aGlsZQoKWW91IGNhbiBpbnRlcnJ1cHQgYSB0YXNrIGhlcmUgYnkgcHJlc3NpbmcgQ1RSTC1DOyB0aGUgc2NyaXB0IHRoZW4gYXNrcyBmb3IKYSBuZXcgY29tbWFuZC4JSWYgeW91IHByZXNzIENUUkwtQyBhdCB0aGUgcHJvbXB0LCB0aGUgc2NyaXB0IGlzIHRlcm1pbmF0ZWQuCgpGb3IgdGVzdGluZyB3aGF0IGhhcHBlbnMgd2hlbiBDVFJMLUMgd291bGQgYmUgcHJlc3NlZCBvbiBhIHNwZWNpZmljIGxpbmUgaW4KeW91ciBzY3JpcHQsIHVzZSB0aGUgZGVidWcgbW9kZSBhbmQgZXhlY3V0ZSB0aGUgfD5xdWl0fCBvciB8PmludGVycnVwdHwKY29tbWFuZCBvbiB0aGF0IGxpbmUuICBTZWUgfGRlYnVnLXNjcmlwdHN8LgoKCkNBVENISU5HIEFMTAkJCQkJCSpjYXRjaC1hbGwqCgpUaGUgY29tbWFuZHMgPgoKCTpjYXRjaCAvLiovCgk6Y2F0Y2ggLy8KCTpjYXRjaAoKY2F0Y2ggZXZlcnl0aGluZywgZXJyb3IgZXhjZXB0aW9ucywgaW50ZXJydXB0IGV4Y2VwdGlvbnMgYW5kIGV4Y2VwdGlvbnMKZXhwbGljaXRseSB0aHJvd24gYnkgdGhlIHw6dGhyb3d8IGNvbW1hbmQuICBUaGlzIGlzIHVzZWZ1bCBhdCB0aGUgdG9wIGxldmVsIG9mCmEgc2NyaXB0IGluIG9yZGVyIHRvIGNhdGNoIHVuZXhwZWN0ZWQgdGhpbmdzLgogICBFeGFtcGxlOiA+CgoJOnRyeQoJOgoJOiAgIiBkbyB0aGUgaGFyZCB3b3JrIGhlcmUKCToKCTpjYXRjaCAvTXlFeGNlcHRpb24vCgk6Cgk6ICAiIGhhbmRsZSBrbm93biBwcm9ibGVtCgk6Cgk6Y2F0Y2ggL15WaW06SW50ZXJydXB0JC8KCTogICAgZWNobyAiU2NyaXB0IGludGVycnVwdGVkIgoJOmNhdGNoIC8uKi8KCTogIGVjaG8gIkludGVybmFsIGVycm9yICgiIC4gdjpleGNlcHRpb24gLiAiKSIKCTogIGVjaG8gIiAtIG9jY3VycmVkIGF0ICIgLiB2OnRocm93cG9pbnQKCTplbmR0cnkKCToiIGVuZCBvZiBzY3JpcHQKCk5vdGU6IENhdGNoaW5nIGFsbCBtaWdodCBjYXRjaCBtb3JlIHRoaW5ncyB0aGFuIHlvdSB3YW50LiAgVGh1cywgeW91IGFyZQpzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIGNhdGNoIG9ubHkgZm9yIHByb2JsZW1zIHRoYXQgeW91IGNhbiByZWFsbHkgaGFuZGxlIGJ5CnNwZWNpZnlpbmcgYSBwYXR0ZXJuIGFyZ3VtZW50IHRvIHRoZSAiOmNhdGNoIi4KICAgRXhhbXBsZTogQ2F0Y2hpbmcgYWxsIGNvdWxkIG1ha2UgaXQgbmVhcmx5IGltcG9zc2libGUgdG8gaW50ZXJydXB0IGEgc2NyaXB0CmJ5IHByZXNzaW5nIENUUkwtQzogPgoKCTp3aGlsZSAxCgk6ICB0cnkKCTogICAgc2xlZXAgMQoJOiAgY2F0Y2gKCTogIGVuZHRyeQoJOmVuZHdoaWxlCgoKRVhDRVBUSU9OUyBBTkQgQVVUT0NPTU1BTkRTCQkJCSpleGNlcHQtYXV0b2NtZCoKCkV4Y2VwdGlvbnMgbWF5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBhdXRvY29tbWFuZHMuICBFeGFtcGxlOiA+CgoJOmF1dG9jbWQgVXNlciB4IHRyeQoJOmF1dG9jbWQgVXNlciB4ICAgdGhyb3cgIk9vcHMhIgoJOmF1dG9jbWQgVXNlciB4IGNhdGNoCgk6YXV0b2NtZCBVc2VyIHggICBlY2hvIHY6ZXhjZXB0aW9uCgk6YXV0b2NtZCBVc2VyIHggZW5kdHJ5Cgk6YXV0b2NtZCBVc2VyIHggdGhyb3cgIkFycmdoISIKCTphdXRvY21kIFVzZXIgeCBlY2hvICJTaG91bGQgbm90IGJlIGRpc3BsYXllZCIKCToKCTp0cnkKCTogIGRvYXV0b2NtZCBVc2VyIHgKCTpjYXRjaAoJOiAgZWNobyB2OmV4Y2VwdGlvbgoJOmVuZHRyeQoKVGhpcyBkaXNwbGF5cyAiT29wcyEiIGFuZCAiQXJyZ2ghIi4KCgkJCQkJCQkqZXhjZXB0LWF1dG9jbWQtUHJlKgpGb3Igc29tZSBjb21tYW5kcywgYXV0b2NvbW1hbmRzIGdldCBleGVjdXRlZCBiZWZvcmUgdGhlIG1haW4gYWN0aW9uIG9mIHRoZQpjb21tYW5kIHRha2VzIHBsYWNlLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBhbmQgbm90IGNhdWdodCBpbiB0aGUgc2VxdWVuY2UKb2YgYXV0b2NvbW1hbmRzLCB0aGUgc2VxdWVuY2UgYW5kIHRoZSBjb21tYW5kIHRoYXQgY2F1c2VkIGl0cyBleGVjdXRpb24gYXJlCmFiYW5kb25lZCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgb2YgdGhlIGNvbW1hbmQuCiAgIEV4YW1wbGU6ID4KCgk6YXV0b2NtZCBCdWZXcml0ZVByZSAqIHRocm93ICJGQUlMIgoJOmF1dG9jbWQgQnVmV3JpdGVQcmUgKiBlY2hvICJTaG91bGQgbm90IGJlIGRpc3BsYXllZCIKCToKCTp0cnkKCTogIHdyaXRlCgk6Y2F0Y2gKCTogIGVjaG8gIkNhdWdodDoiIHY6ZXhjZXB0aW9uICJmcm9tIiB2OnRocm93cG9pbnQKCTplbmR0cnkKCkhlcmUsIHRoZSAiOndyaXRlIiBjb21tYW5kIGRvZXMgbm90IHdyaXRlIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQgKGFzCnlvdSBjYW4gc2VlIGJ5IGNoZWNraW5nICdtb2RpZmllZCcpLCBzaW5jZSB0aGUgZXhjZXB0aW9uIGZyb20gdGhlIEJ1ZldyaXRlUHJlCmF1dG9jb21tYW5kIGFiYW5kb25zIHRoZSAiOndyaXRlIi4gIFRoZSBleGNlcHRpb24gaXMgdGhlbiBjYXVnaHQgYW5kIHRoZQpzY3JpcHQgZGlzcGxheXM6ID4KCglDYXVnaHQ6IEZBSUwgZnJvbSBCdWZXcml0ZSBBdXRvIGNvbW1hbmRzIGZvciAiKiIKPAoJCQkJCQkJKmV4Y2VwdC1hdXRvY21kLVBvc3QqCkZvciBzb21lIGNvbW1hbmRzLCBhdXRvY29tbWFuZHMgZ2V0IGV4ZWN1dGVkIGFmdGVyIHRoZSBtYWluIGFjdGlvbiBvZiB0aGUKY29tbWFuZCBoYXMgdGFrZW4gcGxhY2UuICBJZiB0aGlzIG1haW4gYWN0aW9uIGZhaWxzIGFuZCB0aGUgY29tbWFuZCBpcyBpbnNpZGUKYW4gYWN0aXZlIHRyeSBjb25kaXRpb25hbCwgdGhlIGF1dG9jb21tYW5kcyBhcmUgc2tpcHBlZCBhbmQgYW4gZXJyb3IgZXhjZXB0aW9uCmlzIHRocm93biB0aGF0IGNhbiBiZSBjYXVnaHQgYnkgdGhlIGNhbGxlciBvZiB0aGUgY29tbWFuZC4KICAgRXhhbXBsZTogPgoKCTphdXRvY21kIEJ1ZldyaXRlUG9zdCAqIGVjaG8gIkZpbGUgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4hIgoJOgoJOnRyeQoJOiAgd3JpdGUgL2kvbS9wL28vcy9zL2kvYi9sL2UKCTpjYXRjaAoJOiAgZWNobyB2OmV4Y2VwdGlvbgoJOmVuZHRyeQoKVGhpcyBqdXN0IGRpc3BsYXlzOiA+CgoJVmltKHdyaXRlKTpFMjEyOiBDYW4ndCBvcGVuIGZpbGUgZm9yIHdyaXRpbmcgKC9pL20vcC9vL3Mvcy9pL2IvbC9lKQoKSWYgeW91IHJlYWxseSBuZWVkIHRvIGV4ZWN1dGUgdGhlIGF1dG9jb21tYW5kcyBldmVuIHdoZW4gdGhlIG1haW4gYWN0aW9uCmZhaWxzLCB0cmlnZ2VyIHRoZSBldmVudCBmcm9tIHRoZSBjYXRjaCBjbGF1c2UuCiAgIEV4YW1wbGU6ID4KCgk6YXV0b2NtZCBCdWZXcml0ZVByZSAgKiBzZXQgbm9yZWFkb25seQoJOmF1dG9jbWQgQnVmV3JpdGVQb3N0ICogc2V0IHJlYWRvbmx5Cgk6Cgk6dHJ5Cgk6ICB3cml0ZSAvaS9tL3Avby9zL3MvaS9iL2wvZQoJOmNhdGNoCgk6ICBkb2F1dG9jbWQgQnVmV3JpdGVQb3N0IC9pL20vcC9vL3Mvcy9pL2IvbC9lCgk6ZW5kdHJ5CjwKWW91IGNhbiBhbHNvIHVzZSAiOnNpbGVudCEiOiA+CgoJOmxldCB4ID0gIm9rIgoJOmxldCB2OmVycm1zZyA9ICIiCgk6YXV0b2NtZCBCdWZXcml0ZVBvc3QgKiBpZiB2OmVycm1zZyAhPSAiIgoJOmF1dG9jbWQgQnVmV3JpdGVQb3N0ICogICBsZXQgeCA9ICJhZnRlciBmYWlsIgoJOmF1dG9jbWQgQnVmV3JpdGVQb3N0ICogZW5kaWYKCTp0cnkKCTogIHNpbGVudCEgd3JpdGUgL2kvbS9wL28vcy9zL2kvYi9sL2UKCTpjYXRjaAoJOmVuZHRyeQoJOmVjaG8geAoKVGhpcyBkaXNwbGF5cyAiYWZ0ZXIgZmFpbCIuCgpJZiB0aGUgbWFpbiBhY3Rpb24gb2YgdGhlIGNvbW1hbmQgZG9lcyBub3QgZmFpbCwgZXhjZXB0aW9ucyBmcm9tIHRoZQphdXRvY29tbWFuZHMgd2lsbCBiZSBjYXRjaGFibGUgYnkgdGhlIGNhbGxlciBvZiB0aGUgY29tbWFuZDogID4KCgk6YXV0b2NtZCBCdWZXcml0ZVBvc3QgKiB0aHJvdyAiOi0oIgoJOmF1dG9jbWQgQnVmV3JpdGVQb3N0ICogZWNobyAiU2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQiCgk6Cgk6dHJ5Cgk6ICB3cml0ZQoJOmNhdGNoCgk6ICBlY2hvIHY6ZXhjZXB0aW9uCgk6ZW5kdHJ5CjwKCQkJCQkJCSpleGNlcHQtYXV0b2NtZC1DbWQqCkZvciBzb21lIGNvbW1hbmRzLCB0aGUgbm9ybWFsIGFjdGlvbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzZXF1ZW5jZSBvZgphdXRvY29tbWFuZHMuICBFeGNlcHRpb25zIGZyb20gdGhhdCBzZXF1ZW5jZSB3aWxsIGJlIGNhdGNoYWJsZSBieSB0aGUgY2FsbGVyCm9mIHRoZSBjb21tYW5kLgogICBFeGFtcGxlOiAgRm9yIHRoZSAiOndyaXRlIiBjb21tYW5kLCB0aGUgY2FsbGVyIGNhbm5vdCBrbm93IHdoZXRoZXIgdGhlIGZpbGUKaGFkIGFjdHVhbGx5IGJlZW4gd3JpdHRlbiB3aGVuIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuCVlvdSBuZWVkIHRvIHRlbGwgaXQgaW4Kc29tZSB3YXkuID4KCgk6aWYgIWV4aXN0cygiY250IikKCTogIGxldCBjbnQgPSAwCgk6Cgk6ICBhdXRvY21kIEJ1ZldyaXRlQ21kICogaWYgJm1vZGlmaWVkCgk6ICBhdXRvY21kIEJ1ZldyaXRlQ21kICogICBsZXQgY250ID0gY250ICsgMQoJOiAgYXV0b2NtZCBCdWZXcml0ZUNtZCAqICAgaWYgY250ICUgMyA9PSAyCgk6ICBhdXRvY21kIEJ1ZldyaXRlQ21kICogICAgIHRocm93ICJCdWZXcml0ZUNtZEVycm9yIgoJOiAgYXV0b2NtZCBCdWZXcml0ZUNtZCAqICAgZW5kaWYKCTogIGF1dG9jbWQgQnVmV3JpdGVDbWQgKiAgIHdyaXRlIHwgc2V0IG5vbW9kaWZpZWQKCTogIGF1dG9jbWQgQnVmV3JpdGVDbWQgKiAgIGlmIGNudCAlIDMgPT0gMAoJOiAgYXV0b2NtZCBCdWZXcml0ZUNtZCAqICAgICB0aHJvdyAiQnVmV3JpdGVDbWRFcnJvciIKCTogIGF1dG9jbWQgQnVmV3JpdGVDbWQgKiAgIGVuZGlmCgk6ICBhdXRvY21kIEJ1ZldyaXRlQ21kICogICBlY2hvICJGaWxlIHN1Y2Nlc3NmdWxseSB3cml0dGVuISIKCTogIGF1dG9jbWQgQnVmV3JpdGVDbWQgKiBlbmRpZgoJOmVuZGlmCgk6Cgk6dHJ5Cgk6CXdyaXRlCgk6Y2F0Y2ggL15CdWZXcml0ZUNtZEVycm9yJC8KCTogIGlmICZtb2RpZmllZAoJOiAgICBlY2hvICJFcnJvciBvbiB3cml0aW5nIChmaWxlIGNvbnRlbnRzIG5vdCBjaGFuZ2VkKSIKCTogIGVsc2UKCTogICAgZWNobyAiRXJyb3IgYWZ0ZXIgd3JpdGluZyIKCTogIGVuZGlmCgk6Y2F0Y2ggL15WaW0od3JpdGUpOi8KCTogICAgZWNobyAiRXJyb3Igb24gd3JpdGluZyIKCTplbmR0cnkKCldoZW4gdGhpcyBzY3JpcHQgaXMgc291cmNlZCBzZXZlcmFsIHRpbWVzIGFmdGVyIG1ha2luZyBjaGFuZ2VzLCBpdCBkaXNwbGF5cwpmaXJzdCA+CglGaWxlIHN1Y2Nlc3NmdWxseSB3cml0dGVuIQp0aGVuID4KCUVycm9yIG9uIHdyaXRpbmcgKGZpbGUgY29udGVudHMgbm90IGNoYW5nZWQpCnRoZW4gPgoJRXJyb3IgYWZ0ZXIgd3JpdGluZwpldGMuCgoJCQkJCQkJKmV4Y2VwdC1hdXRvY21kLWlsbCoKWW91IGNhbm5vdCBzcHJlYWQgYSB0cnkgY29uZGl0aW9uYWwgb3ZlciBhdXRvY29tbWFuZHMgZm9yIGRpZmZlcmVudCBldmVudHMuClRoZSBmb2xsb3dpbmcgY29kZSBpcyBpbGwtZm9ybWVkOiA+CgoJOmF1dG9jbWQgQnVmV3JpdGVQcmUgICogdHJ5Cgk6Cgk6YXV0b2NtZCBCdWZXcml0ZVBvc3QgKiBjYXRjaAoJOmF1dG9jbWQgQnVmV3JpdGVQb3N0ICogICBlY2hvIHY6ZXhjZXB0aW9uCgk6YXV0b2NtZCBCdWZXcml0ZVBvc3QgKiBlbmR0cnkKCToKCTp3cml0ZQoKCkVYQ0VQVElPTiBISUVSQVJDSElFUyBBTkQgUEFSQU1FVEVSSVpFRCBFWENFUFRJT05TCSpleGNlcHQtaGllci1wYXJhbSoKClNvbWUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFsbG93IHRvIHVzZSBoaWVyYXJjaGllcyBvZiBleGNlcHRpb24gY2xhc3NlcyBvciB0bwpwYXNzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2l0aCB0aGUgb2JqZWN0IG9mIGFuIGV4Y2VwdGlvbiBjbGFzcy4gIFlvdSBjYW4gZG8Kc2ltaWxhciB0aGluZ3MgaW4gVmltLgogICBJbiBvcmRlciB0byB0aHJvdyBhbiBleGNlcHRpb24gZnJvbSBhIGhpZXJhcmNoeSwganVzdCB0aHJvdyB0aGUgY29tcGxldGUKY2xhc3MgbmFtZSB3aXRoIHRoZSBjb21wb25lbnRzIHNlcGFyYXRlZCBieSBhIGNvbG9uLCBmb3IgaW5zdGFuY2UgdGhyb3cgdGhlCnN0cmluZyAiRVhDRVBUOk1BVEhFUlI6T1ZFUkZMT1ciIGZvciBhbiBvdmVyZmxvdyBpbiBhIG1hdGhlbWF0aWNhbCBsaWJyYXJ5LgogICBXaGVuIHlvdSB3YW50IHRvIHBhc3MgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aXRoIHlvdXIgZXhjZXB0aW9uIGNsYXNzLCBhZGQKaXQgaW4gcGFyZW50aGVzZXMsIGZvciBpbnN0YW5jZSB0aHJvdyB0aGUgc3RyaW5nICJFWENFUFQ6SU86V1JJVEVFUlIobXlmaWxlKSIKZm9yIGFuIGVycm9yIHdoZW4gd3JpdGluZyAibXlmaWxlIi4KICAgV2l0aCB0aGUgYXBwcm9wcmlhdGUgcGF0dGVybnMgaW4gdGhlICI6Y2F0Y2giIGNvbW1hbmQsIHlvdSBjYW4gY2F0Y2ggZm9yCmJhc2UgY2xhc3NlcyBvciBkZXJpdmVkIGNsYXNzZXMgb2YgeW91ciBoaWVyYXJjaHkuICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluCnBhcmVudGhlc2VzIGNhbiBiZSBjdXQgb3V0IGZyb20gfHY6ZXhjZXB0aW9ufCB3aXRoIHRoZSAiOnN1YnN0aXR1dGUiIGNvbW1hbmQuCiAgIEV4YW1wbGU6ID4KCgk6ZnVuY3Rpb24hIENoZWNrUmFuZ2UoYSwgZnVuYykKCTogIGlmIGE6YSA8IDAKCTogICAgdGhyb3cgIkVYQ0VQVDpNQVRIRVJSOlJBTkdFKCIgLiBhOmZ1bmMgLiAiKSIKCTogIGVuZGlmCgk6ZW5kZnVuY3Rpb24KCToKCTpmdW5jdGlvbiEgQWRkKGEsIGIpCgk6ICBjYWxsIENoZWNrUmFuZ2UoYTphLCAiQWRkIikKCTogIGNhbGwgQ2hlY2tSYW5nZShhOmIsICJBZGQiKQoJOiAgbGV0IGMgPSBhOmEgKyBhOmIKCTogIGlmIGMgPCAwCgk6ICAgIHRocm93ICJFWENFUFQ6TUFUSEVSUjpPVkVSRkxPVyIKCTogIGVuZGlmCgk6ICByZXR1cm4gYwoJOmVuZGZ1bmN0aW9uCgk6Cgk6ZnVuY3Rpb24hIERpdihhLCBiKQoJOiAgY2FsbCBDaGVja1JhbmdlKGE6YSwgIkRpdiIpCgk6ICBjYWxsIENoZWNrUmFuZ2UoYTpiLCAiRGl2IikKCTogIGlmIChhOmIgPT0gMCkKCTogICAgdGhyb3cgIkVYQ0VQVDpNQVRIRVJSOlpFUk9ESVYiCgk6ICBlbmRpZgoJOiAgcmV0dXJuIGE6YSAvIGE6YgoJOmVuZGZ1bmN0aW9uCgk6Cgk6ZnVuY3Rpb24hIFdyaXRlKGZpbGUpCgk6ICB0cnkKCTogICAgZXhlY3V0ZSAid3JpdGUiIGZuYW1lZXNjYXBlKGE6ZmlsZSkKCTogIGNhdGNoIC9eVmltKHdyaXRlKTovCgk6ICAgIHRocm93ICJFWENFUFQ6SU8oIiAuIGdldGN3ZCgpIC4gIiwgIiAuIGE6ZmlsZSAuICIpOldSSVRFRVJSIgoJOiAgZW5kdHJ5Cgk6ZW5kZnVuY3Rpb24KCToKCTp0cnkKCToKCTogICIgc29tZXRoaW5nIHdpdGggYXJpdGhtZXRpY3MgYW5kIEkvTwoJOgoJOmNhdGNoIC9eRVhDRVBUOk1BVEhFUlI6UkFOR0UvCgk6ICBsZXQgZnVuY3Rpb24gPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnLiooXChcYVwrXCkpLionLCAnXDEnLCAiIikKCTogIGVjaG8gIlJhbmdlIGVycm9yIGluIiBmdW5jdGlvbgoJOgoJOmNhdGNoIC9eRVhDRVBUOk1BVEhFUlIvCSIgY2F0Y2hlcyBPVkVSRkxPVyBhbmQgWkVST0RJVgoJOiAgZWNobyAiTWF0aCBlcnJvciIKCToKCTpjYXRjaCAvXkVYQ0VQVDpJTy8KCTogIGxldCBkaXIgPSBzdWJzdGl0dXRlKHY6ZXhjZXB0aW9uLCAnLiooXCguXCtcKSxccyouXCspLionLCAnXDEnLCAiIikKCTogIGxldCBmaWxlID0gc3Vic3RpdHV0ZSh2OmV4Y2VwdGlvbiwgJy4qKC5cKyxccypcKC5cK1wpKS4qJywgJ1wxJywgIiIpCgk6ICBpZiBmaWxlICF+ICdeLycKCTogICAgbGV0IGZpbGUgPSBkaXIgLiAiLyIgLiBmaWxlCgk6ICBlbmRpZgoJOiAgZWNobyAnSS9PIGVycm9yIGZvciAiJyAuIGZpbGUgLiAnIicKCToKCTpjYXRjaCAvXkVYQ0VQVC8KCTogIGVjaG8gIlVuc3BlY2lmaWVkIGVycm9yIgoJOgoJOmVuZHRyeQoKVGhlIGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IFZpbSBpdHNlbGYgKG9uIGVycm9yIG9yIHdoZW4gcHJlc3NpbmcgQ1RSTC1DKSB1c2UKYSBmbGF0IGhpZXJhcmNoeTogIHRoZXkgYXJlIGFsbCBpbiB0aGUgIlZpbSIgY2xhc3MuICBZb3UgY2Fubm90IHRocm93IHlvdXJzZWxmCmV4Y2VwdGlvbnMgd2l0aCB0aGUgIlZpbSIgcHJlZml4OyB0aGV5IGFyZSByZXNlcnZlZCBmb3IgVmltLgogICBWaW0gZXJyb3IgZXhjZXB0aW9ucyBhcmUgcGFyYW1ldGVyaXplZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRoYXQKZmFpbGVkLCBpZiBrbm93bi4gIFNlZSB8Y2F0Y2gtZXJyb3JzfC4KCgpQRUNVTElBUklUSUVTCgkJCQkJCQkqZXhjZXB0LWNvbXBhdCoKVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb25jZXB0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbW1hbmQgc2VxdWVuY2UgY2F1c2luZyB0aGUKZXhjZXB0aW9uIGlzIGFib3J0ZWQgaW1tZWRpYXRlbHkgYW5kIGNvbnRyb2wgaXMgdHJhbnNmZXJyZWQgdG8gZmluYWxseSBjbGF1c2VzCmFuZC9vciBhIGNhdGNoIGNsYXVzZS4KCkluIHRoZSBWaW0gc2NyaXB0IGxhbmd1YWdlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBzY3JpcHRzIGFuZCBmdW5jdGlvbnMKY29udGludWUgYWZ0ZXIgYW4gZXJyb3I6IGluIGZ1bmN0aW9ucyB3aXRob3V0IHRoZSAiYWJvcnQiIGZsYWcgb3IgaW4gYSBjb21tYW5kCmFmdGVyICI6c2lsZW50ISIsIGNvbnRyb2wgZmxvdyBnb2VzIHRvIHRoZSBmb2xsb3dpbmcgbGluZSwgYW5kIG91dHNpZGUKZnVuY3Rpb25zLCBjb250cm9sIGZsb3cgZ29lcyB0byB0aGUgbGluZSBmb2xsb3dpbmcgdGhlIG91dGVybW9zdCAiOmVuZHdoaWxlIgpvciAiOmVuZGlmIi4gIE9uIHRoZSBvdGhlciBoYW5kLCBlcnJvcnMgc2hvdWxkIGJlIGNhdGNoYWJsZSBhcyBleGNlcHRpb25zCih0aHVzLCByZXF1aXJpbmcgdGhlIGltbWVkaWF0ZSBhYm9ydGlvbikuCgpUaGlzIHByb2JsZW0gaGFzIGJlZW4gc29sdmVkIGJ5IGNvbnZlcnRpbmcgZXJyb3JzIHRvIGV4Y2VwdGlvbnMgYW5kIHVzaW5nCmltbWVkaWF0ZSBhYm9ydGlvbiAoaWYgbm90IHN1cHByZXNzZWQgYnkgIjpzaWxlbnQhIikgb25seSB3aGVuIGEgdHJ5CmNvbmRpdGlvbmFsIGlzIGFjdGl2ZS4JVGhpcyBpcyBubyByZXN0cmljdGlvbiBzaW5jZSBhbiAoZXJyb3IpIGV4Y2VwdGlvbiBjYW4KYmUgY2F1Z2h0IG9ubHkgZnJvbSBhbiBhY3RpdmUgdHJ5IGNvbmRpdGlvbmFsLglJZiB5b3Ugd2FudCBhbiBpbW1lZGlhdGUKdGVybWluYXRpb24gd2l0aG91dCBjYXRjaGluZyB0aGUgZXJyb3IsIGp1c3QgdXNlIGEgdHJ5IGNvbmRpdGlvbmFsIHdpdGhvdXQKY2F0Y2ggY2xhdXNlLiAgKFlvdSBjYW4gY2F1c2UgY2xlYW51cCBjb2RlIGJlaW5nIGV4ZWN1dGVkIGJlZm9yZSB0ZXJtaW5hdGlvbgpieSBzcGVjaWZ5aW5nIGEgZmluYWxseSBjbGF1c2UuKQoKV2hlbiBubyB0cnkgY29uZGl0aW9uYWwgaXMgYWN0aXZlLCB0aGUgdXN1YWwgYWJvcnRpb24gYW5kIGNvbnRpbnVhdGlvbgpiZWhhdmlvciBpcyB1c2VkIGluc3RlYWQgb2YgaW1tZWRpYXRlIGFib3J0aW9uLiAgVGhpcyBlbnN1cmVzIGNvbXBhdGliaWxpdHkgb2YKc2NyaXB0cyB3cml0dGVuIGZvciBWaW0gNi4xIGFuZCBlYXJsaWVyLgoKSG93ZXZlciwgd2hlbiBzb3VyY2luZyBhbiBleGlzdGluZyBzY3JpcHQgdGhhdCBkb2VzIG5vdCB1c2UgZXhjZXB0aW9uIGhhbmRsaW5nCmNvbW1hbmRzIChvciB3aGVuIGNhbGxpbmcgb25lIG9mIGl0cyBmdW5jdGlvbnMpIGZyb20gaW5zaWRlIGFuIGFjdGl2ZSB0cnkKY29uZGl0aW9uYWwgb2YgYSBuZXcgc2NyaXB0LCB5b3UgbWlnaHQgY2hhbmdlIHRoZSBjb250cm9sIGZsb3cgb2YgdGhlIGV4aXN0aW5nCnNjcmlwdCBvbiBlcnJvci4gIFlvdSBnZXQgdGhlIGltbWVkaWF0ZSBhYm9ydGlvbiBvbiBlcnJvciBhbmQgY2FuIGNhdGNoIHRoZQplcnJvciBpbiB0aGUgbmV3IHNjcmlwdC4gIElmIGhvd2V2ZXIgdGhlIHNvdXJjZWQgc2NyaXB0IHN1cHByZXNzZXMgZXJyb3IKbWVzc2FnZXMgYnkgdXNpbmcgdGhlICI6c2lsZW50ISIgY29tbWFuZCAoY2hlY2tpbmcgZm9yIGVycm9ycyBieSB0ZXN0aW5nCnx2OmVycm1zZ3wgaWYgYXBwcm9wcmlhdGUpLCBpdHMgZXhlY3V0aW9uIHBhdGggaXMgbm90IGNoYW5nZWQuCVRoZSBlcnJvciBpcwpub3QgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvbi4JKFNlZSB8OnNpbGVudHwuKSAgU28gdGhlIG9ubHkgcmVtYWluaW5nIGNhdXNlCndoZXJlIHRoaXMgaGFwcGVucyBpcyBmb3Igc2NyaXB0cyB0aGF0IGRvbid0IGNhcmUgYWJvdXQgZXJyb3JzIGFuZCBwcm9kdWNlCmVycm9yIG1lc3NhZ2VzLiAgWW91IHByb2JhYmx5IHdvbid0IHdhbnQgdG8gdXNlIHN1Y2ggY29kZSBmcm9tIHlvdXIgbmV3CnNjcmlwdHMuCgoJCQkJCQkJKmV4Y2VwdC1zeW50YXgtZXJyKgpTeW50YXggZXJyb3JzIGluIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29tbWFuZHMgYXJlIG5ldmVyIGNhdWdodCBieSBhbnkgb2YKdGhlICI6Y2F0Y2giIGNvbW1hbmRzIG9mIHRoZSB0cnkgY29uZGl0aW9uYWwgdGhleSBiZWxvbmcgdG8uICBJdHMgZmluYWxseQpjbGF1c2VzLCBob3dldmVyLCBpcyBleGVjdXRlZC4KICAgRXhhbXBsZTogPgoKCTp0cnkKCTogIHRyeQoJOiAgICB0aHJvdyA0NzExCgk6ICBjYXRjaCAvXCgvCgk6ICAgIGVjaG8gImluIGNhdGNoIHdpdGggc3ludGF4IGVycm9yIgoJOiAgY2F0Y2gKCTogICAgZWNobyAiaW5uZXIgY2F0Y2gtYWxsIgoJOiAgZmluYWxseQoJOiAgICBlY2hvICJpbm5lciBmaW5hbGx5IgoJOiAgZW5kdHJ5Cgk6Y2F0Y2gKCTogIGVjaG8gJ291dGVyIGNhdGNoLWFsbCBjYXVnaHQgIicgLiB2OmV4Y2VwdGlvbiAuICciJwoJOiAgZmluYWxseQoJOiAgICBlY2hvICJvdXRlciBmaW5hbGx5IgoJOmVuZHRyeQoKVGhpcyBkaXNwbGF5czogPgogICAgaW5uZXIgZmluYWxseQogICAgb3V0ZXIgY2F0Y2gtYWxsIGNhdWdodCAiVmltKGNhdGNoKTpFNTQ6IFVubWF0Y2hlZCBcKCIKICAgIG91dGVyIGZpbmFsbHkKVGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQgYW5kIGFuIGVycm9yIGV4Y2VwdGlvbiBpcyByYWlzZWQsIGluc3RlYWQuCgoJCQkJCQkJKmV4Y2VwdC1zaW5nbGUtbGluZSoKVGhlICI6dHJ5IiwgIjpjYXRjaCIsICI6ZmluYWxseSIsIGFuZCAiOmVuZHRyeSIgY29tbWFuZHMgY2FuIGJlIHB1dCBvbgphIHNpbmdsZSBsaW5lLCBidXQgdGhlbiBzeW50YXggZXJyb3JzIG1heSBtYWtlIGl0IGRpZmZpY3VsdCB0byByZWNvZ25pemUgdGhlCiJjYXRjaCIgbGluZSwgdGh1cyB5b3UgYmV0dGVyIGF2b2lkIHRoaXMuCiAgIEV4YW1wbGU6ID4KCTp0cnkgfCB1bmxldCEgZm9vICMgfCBjYXRjaCB8IGVuZHRyeQpyYWlzZXMgYW4gZXJyb3IgZXhjZXB0aW9uIGZvciB0aGUgdHJhaWxpbmcgY2hhcmFjdGVycyBhZnRlciB0aGUgIjp1bmxldCEiCmFyZ3VtZW50LCBidXQgZG9lcyBub3Qgc2VlIHRoZSAiOmNhdGNoIiBhbmQgIjplbmR0cnkiIGNvbW1hbmRzLCBzbyB0aGF0IHRoZQplcnJvciBleGNlcHRpb24gaXMgZGlzY2FyZGVkIGFuZCB0aGUgIkU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMiIG1lc3NhZ2UgZ2V0cwpkaXNwbGF5ZWQuCgoJCQkJCQkJKmV4Y2VwdC1zZXZlcmFsLWVycm9ycyoKV2hlbiBzZXZlcmFsIGVycm9ycyBhcHBlYXIgaW4gYSBzaW5nbGUgY29tbWFuZCwgdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2UgaXMKdXN1YWxseSB0aGUgbW9zdCBzcGVjaWZpYyBvbmUgYW5kIHRoZXJlZm9yIGNvbnZlcnRlZCB0byB0aGUgZXJyb3IgZXhjZXB0aW9uLgogICBFeGFtcGxlOiA+CgllY2hvIG5vdmFyCmNhdXNlcyA+CglFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6IG5vdmFyCglFMTU6IEludmFsaWQgZXhwcmVzc2lvbjogbm92YXIKVGhlIHZhbHVlIG9mIHRoZSBlcnJvciBleGNlcHRpb24gaW5zaWRlIHRyeSBjb25kaXRpb25hbHMgaXM6ID4KCVZpbShlY2hvKTpFMTIxOiBVbmRlZmluZWQgdmFyaWFibGU6IG5vdmFyCjwJCQkJCQkJKmV4Y2VwdC1zeW50YXgtZXJyb3IqCkJ1dCB3aGVuIGEgc3ludGF4IGVycm9yIGlzIGRldGVjdGVkIGFmdGVyIGEgbm9ybWFsIGVycm9yIGluIHRoZSBzYW1lIGNvbW1hbmQsCnRoZSBzeW50YXggZXJyb3IgaXMgdXNlZCBmb3IgdGhlIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24uCiAgIEV4YW1wbGU6ID4KCXVubGV0IG5vdmFyICMKY2F1c2VzID4KCUUxMDg6IE5vIHN1Y2ggdmFyaWFibGU6ICJub3ZhciIKCUU0ODg6IFRyYWlsaW5nIGNoYXJhY3RlcnMKVGhlIHZhbHVlIG9mIHRoZSBlcnJvciBleGNlcHRpb24gaW5zaWRlIHRyeSBjb25kaXRpb25hbHMgaXM6ID4KCVZpbSh1bmxldCk6RTQ4ODogVHJhaWxpbmcgY2hhcmFjdGVycwpUaGlzIGlzIGRvbmUgYmVjYXVzZSB0aGUgc3ludGF4IGVycm9yIG1pZ2h0IGNoYW5nZSB0aGUgZXhlY3V0aW9uIHBhdGggaW4gYSB3YXkKbm90IGludGVuZGVkIGJ5IHRoZSB1c2VyLiAgRXhhbXBsZTogPgoJdHJ5CgkgICAgdHJ5IHwgdW5sZXQgbm92YXIgIyB8IGNhdGNoIHwgZWNobyB2OmV4Y2VwdGlvbiB8IGVuZHRyeQoJY2F0Y2ggLy4qLwoJICAgIGVjaG8gIm91dGVyIGNhdGNoOiIgdjpleGNlcHRpb24KCWVuZHRyeQpUaGlzIGRpc3BsYXlzICJvdXRlciBjYXRjaDogVmltKHVubGV0KTpFNDg4OiBUcmFpbGluZyBjaGFyYWN0ZXJzIiwgYW5kIHRoZW4KYSAiRTYwMDogTWlzc2luZyA6ZW5kdHJ5IiBlcnJvciBtZXNzYWdlIGlzIGdpdmVuLCBzZWUgfGV4Y2VwdC1zaW5nbGUtbGluZXwuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOS4gRXhhbXBsZXMJCQkJCQkqZXZhbC1leGFtcGxlcyoKClByaW50aW5nIGluIEJpbmFyeSB+Cj4KICA6IiBUaGUgZnVuY3Rpb24gTnIyQmluKCkgcmV0dXJucyB0aGUgYmluYXJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG51bWJlci4KICA6ZnVuYyBOcjJCaW4obnIpCiAgOiAgbGV0IG4gPSBhOm5yCiAgOiAgbGV0IHIgPSAiIgogIDogIHdoaWxlIG4KICA6ICAgIGxldCByID0gJzAxJ1tuICUgMl0gLiByCiAgOiAgICBsZXQgbiA9IG4gLyAyCiAgOiAgZW5kd2hpbGUKICA6ICByZXR1cm4gcgogIDplbmRmdW5jCgogIDoiIFRoZSBmdW5jdGlvbiBTdHJpbmcyQmluKCkgY29udmVydHMgZWFjaCBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcgdG8gYQogIDoiIGJpbmFyeSBzdHJpbmcsIHNlcGFyYXRlZCB3aXRoIGRhc2hlcy4KICA6ZnVuYyBTdHJpbmcyQmluKHN0cikKICA6ICBsZXQgb3V0ID0gJycKICA6ICBmb3IgaXggaW4gcmFuZ2Uoc3RybGVuKGE6c3RyKSkKICA6ICAgIGxldCBvdXQgPSBvdXQgLiAnLScgLiBOcjJCaW4oY2hhcjJucihhOnN0cltpeF0pKQogIDogIGVuZGZvcgogIDogIHJldHVybiBvdXRbMTpdCiAgOmVuZGZ1bmMKCkV4YW1wbGUgb2YgaXRzIHVzZTogPgogIDplY2hvIE5yMkJpbigzMikKcmVzdWx0OiAiMTAwMDAwIiA+CiAgOmVjaG8gU3RyaW5nMkJpbigiMzIiKQpyZXN1bHQ6ICIxMTAwMTEtMTEwMDEwIgoKClNvcnRpbmcgbGluZXMgfgoKVGhpcyBleGFtcGxlIHNvcnRzIGxpbmVzIHdpdGggYSBzcGVjaWZpYyBjb21wYXJlIGZ1bmN0aW9uLiA+CgogIDpmdW5jIFNvcnRCdWZmZXIoKQogIDogIGxldCBsaW5lcyA9IGdldGxpbmUoMSwgJyQnKQogIDogIGNhbGwgc29ydChsaW5lcywgZnVuY3Rpb24oIlN0cmNtcCIpKQogIDogIGNhbGwgc2V0bGluZSgxLCBsaW5lcykKICA6ZW5kZnVuY3Rpb24KCkFzIGEgb25lLWxpbmVyOiA+CiAgOmNhbGwgc2V0bGluZSgxLCBzb3J0KGdldGxpbmUoMSwgJyQnKSwgZnVuY3Rpb24oIlN0cmNtcCIpKSkKCgpzY2FuZigpIHJlcGxhY2VtZW50IH4KCQkJCQkJCSpzc2NhbmYqClRoZXJlIGlzIG5vIHNzY2FuZigpIGZ1bmN0aW9uIGluIFZpbS4gIElmIHlvdSBuZWVkIHRvIGV4dHJhY3QgcGFydHMgZnJvbSBhCmxpbmUsIHlvdSBjYW4gdXNlIG1hdGNoc3RyKCkgYW5kIHN1YnN0aXR1dGUoKSB0byBkbyBpdC4gIFRoaXMgZXhhbXBsZSBzaG93cwpob3cgdG8gZ2V0IHRoZSBmaWxlIG5hbWUsIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4gbnVtYmVyIG91dCBvZiBhIGxpbmUgbGlrZQoiZm9vYmFyLnR4dCwgMTIzLCA0NSIuID4KICAgOiIgU2V0IHVwIHRoZSBtYXRjaCBiaXQKICAgOmxldCBteD0nXChcZlwrXCksXHMqXChcZFwrXCksXHMqXChcZFwrXCknCiAgIDoiZ2V0IHRoZSBwYXJ0IG1hdGNoaW5nIHRoZSB3aG9sZSBleHByZXNzaW9uCiAgIDpsZXQgbCA9IG1hdGNoc3RyKGxpbmUsIG14KQogICA6ImdldCBlYWNoIGl0ZW0gb3V0IG9mIHRoZSBtYXRjaAogICA6bGV0IGZpbGUgPSBzdWJzdGl0dXRlKGwsIG14LCAnXDEnLCAnJykKICAgOmxldCBsbnVtID0gc3Vic3RpdHV0ZShsLCBteCwgJ1wyJywgJycpCiAgIDpsZXQgY29sID0gc3Vic3RpdHV0ZShsLCBteCwgJ1wzJywgJycpCgpUaGUgaW5wdXQgaXMgaW4gdGhlIHZhcmlhYmxlICJsaW5lIiwgdGhlIHJlc3VsdHMgaW4gdGhlIHZhcmlhYmxlcyAiZmlsZSIsCiJsbnVtIiBhbmQgImNvbCIuIChpZGVhIGZyb20gTWljaGFlbCBHZWRkZXMpCgoKZ2V0dGluZyB0aGUgc2NyaXB0bmFtZXMgaW4gYSBEaWN0aW9uYXJ5IH4KCQkJCQkJKnNjcmlwdG5hbWVzLWRpY3Rpb25hcnkqClRoZSB8OnNjcmlwdG5hbWVzfCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdldCBhIGxpc3Qgb2YgYWxsIHNjcmlwdCBmaWxlcyB0aGF0CmhhdmUgYmVlbiBzb3VyY2VkLiAgVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBmdW5jdGlvbiBvciB2YXJpYWJsZSBmb3IgdGhpcwooYmVjYXVzZSBpdCdzIHJhcmVseSBuZWVkZWQpLiAgSW4gY2FzZSB5b3UgbmVlZCB0byBtYW5pcHVsYXRlIHRoZSBsaXN0IHRoaXMKY29kZSBjYW4gYmUgdXNlZDogPgogICAgIiBHZXQgdGhlIG91dHB1dCBvZiAiOnNjcmlwdG5hbWVzIiBpbiB0aGUgc2NyaXB0bmFtZXNfb3V0cHV0IHZhcmlhYmxlLgogICAgbGV0IHNjcmlwdG5hbWVzX291dHB1dCA9ICcnCiAgICByZWRpciA9PiBzY3JpcHRuYW1lc19vdXRwdXQKICAgIHNpbGVudCBzY3JpcHRuYW1lcwogICAgcmVkaXIgRU5ECiAgICAKICAgICIgU3BsaXQgdGhlIG91dHB1dCBpbnRvIGxpbmVzIGFuZCBwYXJzZSBlYWNoIGxpbmUuCUFkZCBhbiBlbnRyeSB0byB0aGUKICAgICIgInNjcmlwdHMiIGRpY3Rpb25hcnkuCiAgICBsZXQgc2NyaXB0cyA9IHt9CiAgICBmb3IgbGluZSBpbiBzcGxpdChzY3JpcHRuYW1lc19vdXRwdXQsICJcbiIpCiAgICAgICIgT25seSBkbyBub24tYmxhbmsgbGluZXMuCiAgICAgIGlmIGxpbmUgPX4gJ1xTJwoJIiBHZXQgdGhlIGZpcnN0IG51bWJlciBpbiB0aGUgbGluZS4KCWxldCBuciA9IG1hdGNoc3RyKGxpbmUsICdcZFwrJykKCSIgR2V0IHRoZSBmaWxlIG5hbWUsIHJlbW92ZSB0aGUgc2NyaXB0IG51bWJlciAiIDEyMzogIi4KCWxldCBuYW1lID0gc3Vic3RpdHV0ZShsaW5lLCAnLlwrOlxzKicsICcnLCAnJykKCSIgQWRkIGFuIGl0ZW0gdG8gdGhlIERpY3Rpb25hcnkKCWxldCBzY3JpcHRzW25yXSA9IG5hbWUKICAgICAgZW5kaWYKICAgIGVuZGZvcgogICAgdW5sZXQgc2NyaXB0bmFtZXNfb3V0cHV0Cgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMTAuIE5vICtldmFsIGZlYXR1cmUJCQkJKm5vLWV2YWwtZmVhdHVyZSoKCldoZW4gdGhlIHwrZXZhbHwgZmVhdHVyZSB3YXMgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLCBub25lIG9mIHRoZSBleHByZXNzaW9uCmV2YWx1YXRpb24gY29tbWFuZHMgYXJlIGF2YWlsYWJsZS4gIFRvIHByZXZlbnQgdGhpcyBmcm9tIGNhdXNpbmcgVmltIHNjcmlwdHMKdG8gZ2VuZXJhdGUgYWxsIGtpbmRzIG9mIGVycm9ycywgdGhlICI6aWYiIGFuZCAiOmVuZGlmIiBjb21tYW5kcyBhcmUgc3RpbGwKcmVjb2duaXplZCwgdGhvdWdoIHRoZSBhcmd1bWVudCBvZiB0aGUgIjppZiIgYW5kIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgIjppZiIKYW5kIHRoZSBtYXRjaGluZyAiOmVuZGlmIiBpcyBpZ25vcmVkLiAgTmVzdGluZyBvZiAiOmlmIiBibG9ja3MgaXMgYWxsb3dlZCwgYnV0Cm9ubHkgaWYgdGhlIGNvbW1hbmRzIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuICBUaGUgIjplbHNlIiBjb21tYW5kIGlzIG5vdApyZWNvZ25pemVkLgoKRXhhbXBsZSBvZiBob3cgdG8gYXZvaWQgZXhlY3V0aW5nIGNvbW1hbmRzIHdoZW4gdGhlIHwrZXZhbHwgZmVhdHVyZSBpcwptaXNzaW5nOiA+CgoJOmlmIDEKCTogIGVjaG8gIkV4cHJlc3Npb24gZXZhbHVhdGlvbiBpcyBjb21waWxlZCBpbiIKCTplbHNlCgk6ICBlY2hvICJZb3Ugd2lsbCBfbmV2ZXJfIHNlZSB0aGlzIG1lc3NhZ2UiCgk6ZW5kaWYKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxMS4gVGhlIHNhbmRib3gJCQkJCSpldmFsLXNhbmRib3gqICpzYW5kYm94KiAqRTQ4KgoKVGhlICdmb2xkZXhwcicsICdmb3JtYXRleHByJywgJ2luY2x1ZGVleHByJywgJ2luZGVudGV4cHInLCAnc3RhdHVzbGluZScgYW5kCidmb2xkdGV4dCcgb3B0aW9ucyBtYXkgYmUgZXZhbHVhdGVkIGluIGEgc2FuZGJveC4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgYXJlCnByb3RlY3RlZCBmcm9tIHRoZXNlIGV4cHJlc3Npb25zIGhhdmluZyBuYXN0eSBzaWRlIGVmZmVjdHMuICBUaGlzIGdpdmVzIHNvbWUKc2FmZXR5IGZvciB3aGVuIHRoZXNlIG9wdGlvbnMgYXJlIHNldCBmcm9tIGEgbW9kZWxpbmUuICBJdCBpcyBhbHNvIHVzZWQgd2hlbgp0aGUgY29tbWFuZCBmcm9tIGEgdGFncyBmaWxlIGlzIGV4ZWN1dGVkIGFuZCBmb3IgQ1RSTC1SID0gaW4gdGhlIGNvbW1hbmQgbGluZS4KVGhlIHNhbmRib3ggaXMgYWxzbyB1c2VkIGZvciB0aGUgfDpzYW5kYm94fCBjb21tYW5kLgoKVGhlc2UgaXRlbXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBzYW5kYm94OgoJLSBjaGFuZ2luZyB0aGUgYnVmZmVyIHRleHQKCS0gZGVmaW5pbmcgb3IgY2hhbmdpbmcgbWFwcGluZywgYXV0b2NvbW1hbmRzLCBmdW5jdGlvbnMsIHVzZXIgY29tbWFuZHMKCS0gc2V0dGluZyBjZXJ0YWluIG9wdGlvbnMgKHNlZSB8b3B0aW9uLXN1bW1hcnl8KQoJLSBzZXR0aW5nIGNlcnRhaW4gdjogdmFyaWFibGVzIChzZWUgfHY6dmFyfCkgICpFNzk0KgoJLSBleGVjdXRpbmcgYSBzaGVsbCBjb21tYW5kCgktIHJlYWRpbmcgb3Igd3JpdGluZyBhIGZpbGUKCS0ganVtcGluZyB0byBhbm90aGVyIGJ1ZmZlciBvciBlZGl0aW5nIGEgZmlsZQoJLSBleGVjdXRpbmcgUHl0aG9uLCBQZXJsLCBldGMuIGNvbW1hbmRzClRoaXMgaXMgbm90IGd1YXJhbnRlZWQgMTAwJSBzZWN1cmUsIGJ1dCBpdCBzaG91bGQgYmxvY2sgbW9zdCBhdHRhY2tzLgoKCQkJCQkJCSo6c2FuKiAqOnNhbmRib3gqCjpzYW5bZGJveF0ge2NtZH0JRXhlY3V0ZSB7Y21kfSBpbiB0aGUgc2FuZGJveC4gIFVzZWZ1bCB0byBldmFsdWF0ZSBhbgoJCQlvcHRpb24gdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBmcm9tIGEgbW9kZWxpbmUsIGUuZy4KCQkJJ2ZvbGRleHByJy4KCgkJCQkJCQkqc2FuZGJveC1vcHRpb24qCkEgZmV3IG9wdGlvbnMgY29udGFpbiBhbiBleHByZXNzaW9uLiAgV2hlbiB0aGlzIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGl0IG1heQpoYXZlIHRvIGJlIGRvbmUgaW4gdGhlIHNhbmRib3ggdG8gYXZvaWQgYSBzZWN1cml0eSByaXNrLiAgQnV0IHRoZSBzYW5kYm94IGlzCnJlc3RyaWN0aXZlLCB0aHVzIHRoaXMgb25seSBoYXBwZW5zIHdoZW4gdGhlIG9wdGlvbiB3YXMgc2V0IGZyb20gYW4gaW5zZWN1cmUKbG9jYXRpb24uICBJbnNlY3VyZSBpbiB0aGlzIGNvbnRleHQgYXJlOgotIHNvdXJjaW5nIGEgLnZpbXJjIG9yIC5leHJjIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQotIHdoaWxlIGV4ZWN1dGluZyBpbiB0aGUgc2FuZGJveAotIHZhbHVlIGNvbWluZyBmcm9tIGEgbW9kZWxpbmUKCk5vdGUgdGhhdCB3aGVuIGluIHRoZSBzYW5kYm94IGFuZCBzYXZpbmcgYW4gb3B0aW9uIHZhbHVlIGFuZCByZXN0b3JpbmcgaXQsIHRoZQpvcHRpb24gd2lsbCBzdGlsbCBiZSBtYXJrZWQgYXMgaXQgd2FzIHNldCBpbiB0aGUgc2FuZGJveC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxMi4gVGV4dGxvY2sJCQkJCQkJKnRleHRsb2NrKgoKSW4gYSBmZXcgc2l0dWF0aW9ucyBpdCBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIHRleHQgaW4gdGhlIGJ1ZmZlciwganVtcAp0byBhbm90aGVyIHdpbmRvdyBhbmQgc29tZSBvdGhlciB0aGluZ3MgdGhhdCBtaWdodCBjb25mdXNlIG9yIGJyZWFrIHdoYXQgVmltCmlzIGN1cnJlbnRseSBkb2luZy4gIFRoaXMgbW9zdGx5IGFwcGxpZXMgdG8gdGhpbmdzIHRoYXQgaGFwcGVuIHdoZW4gVmltIGlzCmFjdHVhbGx5IGRvaW5nIHNvbWV0aGluZyBlbHNlLglGb3IgZXhhbXBsZSwgZXZhbHVhdGluZyB0aGUgJ2JhbGxvb25leHByJyBtYXkKaGFwcGVuIGFueSBtb21lbnQgdGhlIG1vdXNlIGN1cnNvciBpcyByZXN0aW5nIGF0IHNvbWUgcG9zaXRpb24uCgpUaGlzIGlzIG5vdCBhbGxvd2VkIHdoZW4gdGhlIHRleHRsb2NrIGlzIGFjdGl2ZToKCS0gY2hhbmdpbmcgdGhlIGJ1ZmZlciB0ZXh0CgktIGp1bXBpbmcgdG8gYW5vdGhlciBidWZmZXIgb3Igd2luZG93CgktIGVkaXRpbmcgYW5vdGhlciBmaWxlCgktIGNsb3NpbmcgYSB3aW5kb3cgb3IgcXVpdHRpbmcgVmltCgktIGV0Yy4KCgogdmltOnR3PTc4OnRzPTg6ZnQ9aGVscDpub3JsOgo=